HackTheBox Visual Writeup
Visual是HackTheBox上的一个Medium难度的靶机,它提供了一个通过恶意Visual Studio项目控制主机的场景,同时也是学习Windows提权的不错选择。
靶场信息
信息收集
端口扫描
kali@kali ~/D/H/M/Visual> nmap -p- -n --min-rate 3000 -T4 10.10.11.234 |
TCP和UDP的扫描结果都显示只有80端口开放。
漏洞点识别
打开web界面,提示支持上传Git项目链接(支持
.NET 6.0
和
C#
项目,必须包含
.sln
文件),靶机会自动进行编译。
这个场景很明显可以联想到恶意的VS项目钓鱼,原来在推特上看到过相关帖子。
初始权限
本地Git服务
使用Gitea进行本地Git服务的搭建,参照 Gitea手册中Installation with Docker章节 可以很简单创建Gitea服务。
新建一个
docker-compose.yml
文件,内容如下:
version: "3" |
官方手册里默认是3000端口,我这里修改成了80端口。
使用docker-compose启动服务,命令为
sudo docker-compose up
。
运行后,Gitea文件目录的结构如下:
[4.0K] . |
访问本地的80端口,即可进入Gitea的初始化安装界面。
完成安装后,默认新注册的第一个用户是系统管理员,新建一个Git Repository,注意不能将该项目设置成私有项目。
将新建的Repo链接提交给靶机环境进行编译,可以在Gitea后台日志中看到靶机服务器的请求,但编译的结果提示
[-] The repository doesn't contain a .sln file or the URL submitted is invalid.
。
证明靶机服务器确实会抓取本地Git项目,而且会检验git仓库是否包含
.sln
文件。
恶意的Visual Studio项目
一开始,我并没有想着在本地Visual Studio中创建项目,而是认为在Github中应该会有成熟的Poc。╮( ̄▽ ̄”)╭
一番搜索之后确实发现了一些信息:
第二个链接很明显是为了HTB做题而创建的项目,想到这里,我又想自己实践下、觉得直接用现成的payload没啥意思。
本地创建C#项目
设置Pre-Build命令:
设置命令之后的项目文件
ConsoleApp1.csproj
内容如下:
<Project Sdk="Microsoft.NET.Sdk"> |
本地点击编译按钮时确实能成功调出记事本程序。
提交靶机编译
git init -b main |
再次提交给靶机服务器编译,提示超时:
编译超时的可能原因有很多,可能是记事本程序影响了编译过程。
注释掉在
/ConsoleApp1.csproj
中
PreBuild
相关配置后,再次提交编译,反馈编译报错:
查看报错信息,报错点是找不到
C:\Program Files (x86)\Microsoft Visual Studio\Shared\NuGetPackages
目录。
"C:\Windows\Temp\539b15f0d47a81a0aa27dc0d608809\ConsoleApp1.sln" (default target) (1) -> |
删除
/obj/project.assets.json
中
NuGet
相关配置,再次提交编译,编译成功:
调整payload
取消在
/ConsoleApp1.csproj
中
PreBuild
相关配置的注释,再次提交编译,又提示超时了。。。╮( ̄▽ ̄”)╭/
将payload改成msfvenom的后门程序,可以直接得到shell。。。
用户权限
metasploit拿到的权限对应
enox
用户,可以拿到用户flag。
提权过程中进行了很多无头无脑的尝试,或者说对于windows提权,我本来就是一头雾水。
进行了如下尝试:
local_exploit_suggester
local_exploit_suggester失败尝试记录
local_exploit_suggester结果
msf6 post(multi/recon/local_exploit_suggester) > run |
msf6 exploit(windows/local/cve_2020_1337_printerdemon) > run |
winpeas给出的可能漏洞
[?] Windows vulns search powered by Watson(https://github.com/rasta-mouse/Watson) |
[?] Windows vulns search powered by Watson(https://github.com/rasta-mouse/Watson) |
思考
C:\Windows\Temp\9b7ed8d62ccca237f8c62c20c52f1b>whoami /priv |
根据搜索,我判断这里面重要的是
SeCreateGlobalPrivilege
这个权限。
互联网上搜索,大多是都有
SeImpersonatePrivilege
这个权限,而这里并没有。
接着找到了这篇文章 Give Me Back My Privileges! Please? ,文章里面的场景和我这里很像。
我直接拿里面的Powershell脚本去创建计划任务,但始终没成功运行:
$TaskAction = New-ScheduledTaskAction -Execute "C:\xampp\htdocs\a4445.exe";Register-ScheduledTask -Action $TaskAction -TaskName "SomeTask4";Start-ScheduledTask -TaskName "SomeTask4";Get-ScheduledTaskInfo -TaskName "SomeTask4" |
到这里我已经花了很长时间了,我给自己定了一个dealine,到某个时刻如果还没搞出来,就看Writeup了。
root权限
我看了这篇 https://maddevs.io/writeups/hackthebox-visual/ 。
前面思路都一样,提权那里题解提到很关键的一个点,通过webshell得到
local service
的权限。
我复现时拿到webshell权限之后确实可以成功创建计划任务,进而恢复
SeImpersonatePrivilege
权限、拿到
System
权限。
local service
在
Reverse Shell Generator
使用
PHP Ivan Sincek
生成webshell,上传至
C:/xampp/htdocs
目录,在本地环境访问,即可得到shell。
PHP pentestmonkey
生成的使用会报错。
恢复 SeImpersonatePrivilege 权限
这里主要参照
Give Me Back My Privileges! Please?
进行,值得注意的是,原始payload申请的权限很多(
$Privs
的值),导致创建计划任务失败,我限定为需要的权限之后可成功创建。
# 分行脚本 |
如果运行失败了,需要修改
$NName
值,不然会提示计划任务名称重复。
提权到SYSTEM
从
SeImpersonatePrivilege
提权到
SYSTEM
方式很多,我没有尝试其他的,直接使用了题解里给出的
GodPotato
。
GodPotato-NET4.exe -cmd "cmd /c type C:\Users\Administrator\Desktop\root.txt" |