最近开始了新一轮的护网(HW)行动(互联网上对于该行动相关信息居然很少),作为蓝方的各企事业单位的网络相关部门都被搞得有点人心惶惶的。正好前两天在逛GitHub的时候,发现了一个挺有意思的项目,今天就来试一试它的威力如何。

注意:


本文会使用到一些方法绕过GFW,请在使用互联网时遵守当地的相关法律法规。
本文涉及到渗透和网络攻击行为,请注意在实践过程中的法律问题。
根据《中华人民共和国刑法》第286条:
违反国家规定,对计算机信息系统功能进行删除、修改、增加、干扰,造成计算机信息系统不能正常运行,后果严重的,处5年以下有期徒刑或者拘役;后果特别严重的,处5年以上有期徒刑。
违反国家规定,对计算机信息系统中存储、处理或者传输的数据和应用程序进行删除、修改、增加的操作,后果严重的,依照前款的规定处罚。
故意制作、传播计算机病毒等破坏性程序,影响计算机系统正常运行,后果严重的,依照第1款的规定处罚。

本文仅用作学习用途,请勿在非授权网络环境下实行任何攻击行为。
本文中任何代码仅用于研究学习,严禁用于任何非法用途,作者将不承担任何使用本文代码造成的任何后果。

Metasploitable

Metasploitable是一个操作系统,准确地来讲,是一个经过定制化的、基于Windows或linux(及其各发行版)的系统,该系统安装了许多具有已知漏洞的服务,一般作为靶机以提供网络攻击和渗透测试的环境。

本文使用到的是Metasploitable 2,实际上Metasploitable已经出到3了,但相较于2来说,3放弃了直接提供虚拟机镜像的方式,而使用了Packer、Vagrant等工具,以动态方式创建镜像,该方式的好处在于:动态构建可以灵活地对操作系统进行调整和维护,方便了开源社区的贡献和管理,不过对于使用者来说,就需要多一些步骤来配置VM的构建环境了,我尝试折腾了一下3,卡在了构建中的某一步,构建的过程中需要下载某个服务文件,但是下载的目标地址被墙了,而且下载在虚拟机中通过部署脚本自动进行,无法设置代理,除非直接在路由器中部署代理工具。这一步浪费了挺多时间的,最后也没搞成,所以就还是用2了。

具体的系统下载和虚拟机安装方法不是本文的重点,所以也不在详细描述了,有需要的可以通过上方的超链接,去官方的文档中查看,其写得已经比较清楚了。

Metasploitable 2基于Linux系统的Ubuntu发行版构建。

网络环境

先来介绍一下本次测试的环境。

因为提供的系统文件是VMware虚拟机文件,所以目标机的所有配置都是预置的,其网络使用NAT网络。内网环境IP地址为192.168.152.0/24,攻击机为Windows 10 Workstation系统;目标机为Linux Ubuntu发行版(处于vSphere虚拟环境下),IP地址为192.168.152.130,与攻击机处于同一内网环境下(毕竟是内网渗透嘛:) );攻击机安装了一个基于wsl2的kali子系统,不过由于wsl2的网络模式为NAT,并且处于172.31.105.0/20网段下,所以实际上kali子系统无法直接与目标机通信,虽然也不是没办法(转发、桥接、VPN...),但是懒得折腾了...

信息收集

所谓知己知彼,百战不殆。在准备攻击阶段,信息收集是非常重要的一个步骤,通过收集信息,可以让我们明确目标系统的服务结构,弱点和潜在的渗透点,以此来制定攻击计划,提高渗透的成功率。

首先我们需要确定的是目标的系统服务信息,目前我们只知道目标操作系统IP地址,使用nmap工具对此IP进行扫描,其中nmap工具在之前的文章中已经介绍过了,扫描的命令如下:

1
nmap -p- -sS -sV -n -v --reason -oX report.xml 192.168.152.130

上述参数大部分在之前文章中已经介绍过,这里说几个之前没有提到过的(也有可能提到过但是我忘了:) ):-p-指的是全端口扫面,如果不指定该参数,则nmap只会扫描部分常用端口,--reason是输出状态异常的端口,-n表示不使用DNS解析。

结果如下:

上面展示了目标机开放的所有服务端口,同时还生成了一份xml格式的报告(如果你使用metasploit工具进行漏洞利用,那么可以直接将这个报告导入到工具中,但是我的metasploit在kali子系统中,Windows环境下没有...):

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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE nmaprun>
<?xml-stylesheet href="file:///C:/Penetration/ScanTools/Nmap/nmap.xsl" type="text/xsl"?>
<!-- Nmap 7.94 scan initiated Sat Aug  3 21:42:33 2024 as: C:\\Penetration\\ScanTools\\Nmap\\nmap.exe -p- -sS -sV -n -v -&#45;reason -oX report.xml 192.168.152.130 -->
<nmaprun scanner="nmap" args="C:\\Penetration\\ScanTools\\Nmap\\nmap.exe -p- -sS -sV -n -v -&#45;reason -oX report.xml 192.168.152.130" start="1722692553" startstr="Sat Aug  3 21:42:33 2024" version="7.94" xmloutputversion="1.05">
<scaninfo type="syn" protocol="tcp" numservices="65535" services="1-65535"/>
<verbose level="1"/>
<debugging level="0"/>
<taskbegin task="ARP Ping Scan" time="1722692556"/>
<hosthint><status state="up" reason="arp-response" reason_ttl="0"/>
<address addr="192.168.152.130" addrtype="ipv4"/>
<address addr="00:0C:29:FA:DD:2A" addrtype="mac" vendor="VMware"/>
<hostnames>
</hostnames>
</hosthint>
<taskend task="ARP Ping Scan" time="1722692556" extrainfo="1 total hosts"/>
<taskbegin task="SYN Stealth Scan" time="1722692556"/>
<taskend task="SYN Stealth Scan" time="1722692570" extrainfo="65535 total ports"/>
<taskbegin task="Service scan" time="1722692570"/>
<taskend task="Service scan" time="1722692696" extrainfo="30 services on 1 host"/>
<taskbegin task="NSE" time="1722692696"/>
<taskend task="NSE" time="1722692696"/>
<taskbegin task="NSE" time="1722692696"/>
<taskend task="NSE" time="1722692696"/>
<host starttime="1722692556" endtime="1722692696"><status state="up" reason="arp-response" reason_ttl="0"/>
<address addr="192.168.152.130" addrtype="ipv4"/>
<address addr="00:0C:29:FA:DD:2A" addrtype="mac" vendor="VMware"/>
<hostnames>
</hostnames>
<ports><extraports state="closed" count="65505">
<extrareasons reason="reset" count="65505" proto="tcp" ports="1-20,24,26-52,54-79,81-110,112-138,140-444,446-511,515-1098,1100-1523,1525-2048,2050-2120,2122-3305,3307-3631,3633-5431,5433-5899,5901-5999,6001-6666,6668-6696,6698-8008,8010-8179,8181-8786,8788-35306,35308-41765,41767-44636,44638-51218,51220-65535"/>
</extraports>
<port protocol="tcp" portid="21"><state state="open" reason="syn-ack" reason_ttl="64"/><service name="ftp" product="vsftpd" version="2.3.4" ostype="Unix" method="probed" conf="10"><cpe>cpe:/a:vsftpd:vsftpd:2.3.4</cpe></service></port>
<port protocol="tcp" portid="22"><state state="open" reason="syn-ack" reason_ttl="64"/><service name="ssh" product="OpenSSH" version="4.7p1 Debian 8ubuntu1" extrainfo="protocol 2.0" ostype="Linux" method="probed" conf="10"><cpe>cpe:/a:openbsd:openssh:4.7p1</cpe><cpe>cpe:/o:linux:linux_kernel</cpe></service></port>
<port protocol="tcp" portid="23"><state state="open" reason="syn-ack" reason_ttl="64"/><service name="telnet" product="Linux telnetd" ostype="Linux" method="probed" conf="10"><cpe>cpe:/o:linux:linux_kernel</cpe></service></port>
<port protocol="tcp" portid="25"><state state="open" reason="syn-ack" reason_ttl="64"/><service name="smtp" product="Postfix smtpd" hostname=" metasploitable.localdomain" method="probed" conf="10"><cpe>cpe:/a:postfix:postfix</cpe></service></port>
<port protocol="tcp" portid="53"><state state="open" reason="syn-ack" reason_ttl="64"/><service name="domain" product="ISC BIND" version="9.4.2" method="probed" conf="10"><cpe>cpe:/a:isc:bind:9.4.2</cpe></service></port>
<port protocol="tcp" portid="80"><state state="open" reason="syn-ack" reason_ttl="64"/><service name="http" product="Apache httpd" version="2.2.8" extrainfo="(Ubuntu) DAV/2" method="probed" conf="10"><cpe>cpe:/a:apache:http_server:2.2.8</cpe></service></port>
<port protocol="tcp" portid="111"><state state="open" reason="syn-ack" reason_ttl="64"/><service name="rpcbind" version="2" extrainfo="RPC #100000" method="probed" conf="10"/></port>
<port protocol="tcp" portid="139"><state state="open" reason="syn-ack" reason_ttl="64"/><service name="netbios-ssn" product="Samba smbd" version="3.X - 4.X" extrainfo="workgroup: WORKGROUP" method="probed" conf="10"><cpe>cpe:/a:samba:samba</cpe></service></port>
<port protocol="tcp" portid="445"><state state="open" reason="syn-ack" reason_ttl="64"/><service name="netbios-ssn" product="Samba smbd" version="3.X - 4.X" extrainfo="workgroup: WORKGROUP" method="probed" conf="10"><cpe>cpe:/a:samba:samba</cpe></service></port>
<port protocol="tcp" portid="512"><state state="open" reason="syn-ack" reason_ttl="64"/><service name="exec" product="netkit-rsh rexecd" ostype="Linux" method="probed" conf="10"><cpe>cpe:/a:netkit:netkit</cpe><cpe>cpe:/o:linux:linux_kernel</cpe></service></port>
<port protocol="tcp" portid="513"><state state="open" reason="syn-ack" reason_ttl="64"/><service name="login" method="table" conf="3"/></port>
<port protocol="tcp" portid="514"><state state="open" reason="syn-ack" reason_ttl="64"/><service name="tcpwrapped" method="probed" conf="8"/></port>
<port protocol="tcp" portid="1099"><state state="open" reason="syn-ack" reason_ttl="64"/><service name="java-rmi" product="GNU Classpath grmiregistry" method="probed" conf="10"/></port>
<port protocol="tcp" portid="1524"><state state="open" reason="syn-ack" reason_ttl="64"/><service name="bindshell" product="Metasploitable root shell" method="probed" conf="10"/></port>
<port protocol="tcp" portid="2049"><state state="open" reason="syn-ack" reason_ttl="64"/><service name="nfs" version="2-4" extrainfo="RPC #100003" method="probed" conf="10"/></port>
<port protocol="tcp" portid="2121"><state state="open" reason="syn-ack" reason_ttl="64"/><service name="ftp" product="ProFTPD" version="1.3.1" ostype="Unix" method="probed" conf="10"><cpe>cpe:/a:proftpd:proftpd:1.3.1</cpe></service></port>
<port protocol="tcp" portid="3306"><state state="open" reason="syn-ack" reason_ttl="64"/><service name="mysql" product="MySQL" version="5.0.51a-3ubuntu5" method="probed" conf="10"><cpe>cpe:/a:mysql:mysql:5.0.51a-3ubuntu5</cpe></service></port>
<port protocol="tcp" portid="3632"><state state="open" reason="syn-ack" reason_ttl="64"/><service name="distccd" product="distccd" version="v1" extrainfo="(GNU) 4.2.4 (Ubuntu 4.2.4-1ubuntu4)" method="probed" conf="10"/></port>
<port protocol="tcp" portid="5432"><state state="open" reason="syn-ack" reason_ttl="64"/><service name="postgresql" product="PostgreSQL DB" version="8.3.0 - 8.3.7" method="probed" conf="10"><cpe>cpe:/a:postgresql:postgresql:8.3</cpe></service></port>
<port protocol="tcp" portid="5900"><state state="open" reason="syn-ack" reason_ttl="64"/><service name="vnc" product="VNC" extrainfo="protocol 3.3" method="probed" conf="10"/></port>
<port protocol="tcp" portid="6000"><state state="open" reason="syn-ack" reason_ttl="64"/><service name="X11" extrainfo="access denied" method="probed" conf="10"/></port>
<port protocol="tcp" portid="6667"><state state="open" reason="syn-ack" reason_ttl="64"/><service name="irc" product="UnrealIRCd" hostname="irc.Metasploitable.LAN" method="probed" conf="10"><cpe>cpe:/a:unrealircd:unrealircd</cpe></service></port>
<port protocol="tcp" portid="6697"><state state="open" reason="syn-ack" reason_ttl="64"/><service name="irc" product="UnrealIRCd" hostname="irc.Metasploitable.LAN" method="probed" conf="10"><cpe>cpe:/a:unrealircd:unrealircd</cpe></service></port>
<port protocol="tcp" portid="8009"><state state="open" reason="syn-ack" reason_ttl="64"/><service name="ajp13" product="Apache Jserv" extrainfo="Protocol v1.3" method="probed" conf="10"/></port>
<port protocol="tcp" portid="8180"><state state="open" reason="syn-ack" reason_ttl="64"/><service name="http" product="Apache Tomcat/Coyote JSP engine" version="1.1" method="probed" conf="10"><cpe>cpe:/a:apache:coyote_http_connector:1.1</cpe></service></port>
<port protocol="tcp" portid="8787"><state state="open" reason="syn-ack" reason_ttl="64"/><service name="drb" product="Ruby DRb RMI" extrainfo="Ruby 1.8; path /usr/lib/ruby/1.8/drb" method="probed" conf="10"><cpe>cpe:/a:ruby-lang:ruby:1.8</cpe></service></port>
<port protocol="tcp" portid="35307"><state state="open" reason="syn-ack" reason_ttl="64"/><service name="mountd" version="1-3" extrainfo="RPC #100005" method="probed" conf="10"/></port>
<port protocol="tcp" portid="41766"><state state="open" reason="syn-ack" reason_ttl="64"/><service name="nlockmgr" version="1-4" extrainfo="RPC #100021" method="probed" conf="10"/></port>
<port protocol="tcp" portid="44637"><state state="open" reason="syn-ack" reason_ttl="64"/><service name="java-rmi" product="GNU Classpath grmiregistry" method="probed" conf="10"/></port>
<port protocol="tcp" portid="51219"><state state="open" reason="syn-ack" reason_ttl="64"/><service name="status" version="1" extrainfo="RPC #100024" method="probed" conf="10"/></port>
</ports>
<times srtt="2629" rttvar="662" to="100000"/>
</host>
<runstats><finished time="1722692696" timestr="Sat Aug  3 21:44:56 2024" summary="Nmap done at Sat Aug  3 21:44:56 2024; 1 IP address (1 host up) scanned in 143.24 seconds" elapsed="143.24" exit="success"/><hosts up="1" down="0" total="1"/>
</runstats>
</nmaprun>

然后再使用 nmap -p- -A --script=vuln -oX report_vul.xml 192.168.152.130 进行一次漏洞扫描,由于漏洞扫描需要运行各种脚本,所以耗时比较长,结果如下(由于wordpress格式限制,所以只能上传doc文档,实际上是xml格式):

通过上面的结果可以看到,扫出来一大堆漏洞(因为本身就是由漏洞组成的系统:) ),下面就挑几个来试试。

CVE-2011-2523

漏洞说明

21端口运行了FTP服务器,服务版本为2.3.4,该版本的vsftpd(Very Secure FTP Daemon)存在一个后门漏洞,漏洞编号:CVE-2011-2523

造成此漏洞的原因并非代码逻辑问题或其他安全原因,而是因为主站点2.3.4版本的vsftpd被故意引入一个后门程序,该后门允许攻击者在连接到 FTP 服务器时,通过特定方式触发。当攻击者在用户名字段输入 :) 时,后门会被激活。激活后门后,FTP 服务会在端口6200上打开一个shell,这使得攻击者可以直接在服务器上执行命令,获得root权限。

由于激活口令是一个笑脸颜文字,所以该漏洞又被称为笑脸漏洞。

漏洞利用

在理解了漏洞原理后,尝试对该漏洞进行利用。

在上面的nmap扫描结果中显示,6200端口当前为关闭状态。

通过netcat连接到目标机21端口,并通过任意以:)结尾的用户名,以及任意密码进行登录: