2016年10月21日,美國東海岸地區遭受大面積網絡癱瘓,其原因為美國域名解析服務提供商Dyn公司當天受到強力的DDoS攻擊所致。Dyn公司稱此次DDoS攻擊涉及千萬級別的IP地址(攻擊中UDP/DNS攻擊源IP幾乎皆為偽造IP,因此此數量不代表僵尸數量),其中部分重要的攻擊來源于IOT設備,攻擊活動從上午7:00(美國東部時間)開始,直到下午1:00才得以緩解,黑客發動了三次大規模攻擊,但是第三次攻擊被緩解未對網絡訪問造成明顯影響。
此次攻擊是一次跨越多個攻擊向量以及互聯網位置的復雜攻擊,Flashpoint與Akamai的分析確認攻擊流量的來源之一是感染了Mirai僵尸的設備,因為部分離散攻擊IP地址來自Mirai僵尸網絡。
Mirai僵尸在黑客Anna-senpai公布源碼后,被黑客利用并快速的形成了大量的僵尸網絡,其中部分黑客參與了此次攻擊,目前不排除黑客Anna-senpai也參與了本次攻擊,其擁有大概30萬-40萬的Mirai僵尸肉雞。
啟明星辰ADLab分析發現,Mirai僵尸借鑒了QBOT的部分技術,并在掃描技術、感染技術等方面做了優化,大大提升了感染速度。
Mirai僵尸重要事件回溯
此次針對Dyn域名服務器的攻擊讓古老的DDoS技術再一次震撼了互聯網,其中最引人注目是物聯網僵尸網絡的參與,物聯網概念流行了近7年,大量的智能設備正不斷地接入了互聯網,其安全脆弱性、封閉性等特點成為黑客爭相奪取的資源。目前已經存在大量針對物聯網的僵尸網絡,如QBOT、Luabot、Bashlight、Zollard、Remaiten、KTN-RM等等,并且越來越多的傳統僵尸也開始加入到這個物聯網行列中。
通過啟明星辰ADLab的調查分析,Mirai僵尸網絡有兩次攻擊史,其中一次是針對安全新聞工作者Brian Krebs的網站,攻擊流量達到665Gbps。
另一次是針對法國網站主機OVH的攻擊,其攻擊流量達到1.1Tbps,打破了DDoS攻擊流量歷史記錄。
2016年9月30日,黑客Anna-senpai公開發布Mirai僵尸源碼。其公布源碼的目的一則是發現有關機構正在清理其掌控的僵尸設備;二則是為了讓更多的黑客使用該僵尸進行擴散,掩人耳目,隱藏自己的蹤跡。
Mirai僵尸重要事件回顧
1.2016年8月31日,逆向分析人員在malwaremustdie博客上公布mirai僵尸程序詳細逆向分析報告,此舉公布的C&C而惹怒黑客Anna-senpai。
2.2016年9月20日,著名的安全新聞工作者Brian Krebs的網站KrebsOnSecurity.com受到大規模的DDOS攻擊,其攻擊峰值達到665Gbps,Brian Krebs推測此次攻擊由Mirai僵尸發動。
3.2016年9月20日,Mirai針對法國網站主機OVH的攻擊突破DDoS攻擊記錄,其攻擊量達到1.1Tpbs,最大達到1.5Tpbs4.2016年9月30日,Anna-senpai在hackforums論壇公布mirai源碼,并且嘲笑之前逆向分析人員的錯誤分析。
5.2016年10月21日,美國域名服務商Dyn遭受大規模DDoS攻擊,其中重要的攻擊源確認來自于Mirai僵尸。
在2016年10月初,Imperva Incapsula的研究人員通過調查到的49,657個感染設備源分析發現,其中主要感染設備有CCTV攝像頭、DVRs以及路由器。根據這些調查的設備IP地址發現其感染范圍跨越了164個國家或地區,其中感染量最多的是越南、巴西、美國、中國大陸和墨西哥。
直到2016年10月26日,我們通過Mirai特征搜索shodan發現,當前全球感染Mirai的設備已經超過100萬臺,其中美國感染設備有418,592臺,中國大陸有145,778臺,澳大利亞94,912臺,日本和中國香港分別為47,198和44,386臺。
在該地圖中顏色越深,代表感染的設備越多,可以看出感染Mirai最多的幾個國家有美國、中國和澳大利亞。
Mirai源碼分析Mirai源碼是2016年9月30日由黑客Anna-senpai在論壇上公布,其公布在github上的源碼被star了2538次,被fork了1371次。
Mirai通過掃描網絡中的Telnet等服務來進行傳播,實際感染到設備bot并不充當感染角色,其感染通過黑客配置服務來實施,這個服務被稱為Load。黑客的另外一個服務器C&C服務主要用于下發控制指令,對目標進行實施攻擊。
通過我們對僵尸源碼的分析發現,該僵尸具備如下特點:
(1)黑客服務端實施感染,而非僵尸自己實施感染。
(2)采用高級SYN掃描,掃描速度提升30倍以上,提高了感染速度。
(3)強制清除其他主流的IOT僵尸程序,干掉競爭對手,獨占資源。比如清除QBOT、Zollard、Remaiten Bot、anime Bot以及其他僵尸。
(4)一旦通過Telnet服務進入,便強制關閉Telnet服務,以及其他入口如:SSH和web入口,并且占用服務端口防止這些服務復活。
(5)過濾掉通用電氣公司、惠普公司、美國國家郵政局、國防部等公司和機構的IP,防止無效感染。
(6)獨特的GRE協議洪水攻擊,加大了攻擊力度。
Mirai感染示意圖:
上圖簡單顯示了Mirai僵尸的感染過程,與普通僵尸感染不同的是,其感染端是通過黑客服務端實施的,而不是靠bot來實施感染。
感染到設備端的 bot程序通過隨機策略掃描互聯網上的設備,并會將成功猜解的設備用戶名、密碼、IP地址,端口信息以一定格式上傳給sanListen,sanLiten解析這些信息后交由Load模塊來處理,Load通過這些信息來登錄相關設備對設備實施感染,感染方式有echo方式、wget方式和tftp方式。這三種方式都會向目標設備推送一個具有下載功能的微型模塊,這個模塊被傳給目標設備后,命名為dvrHelper。最后,dvrHelper遠程下載bot執行,bot再次實施Telnet掃描并進行密猜解,由此周而復始的在網絡中擴散。這種感染方式是極為有效的,Anna-senpai曾經每秒會得到500個成功爆破的結果。
一、bot分析
bot是mirai僵尸的攻擊模塊,其主要實現對網絡服務設備(掃描過程不只針對IOT設備,只要開啟Telnet服務的網絡設備均不會放過)的Telnet服務的掃描并嘗試進行暴力破解,其會將成功破解的設備ip地址、端口、用戶名、密碼等信息發送給黑客配置的服務器。并且同時接收C&C服務器的控制命令對目標發動攻擊。
1、IOT設備防重啟
由于Mirai的攻擊目標主要設計來針對IOT設備,因此其無法將自身寫入到設備固件中,只能存在于內存中。所以一旦設備重啟,Mirai的bot程序就會消失。為了防止設備重啟,Mirai向看門狗發送控制碼0x80045704來禁用看門狗功能。
通常在嵌入式設備中,固件會實現一種叫看門狗(watchdog)的功能,有一個進程會不斷的向看門狗進程發送一個字節數據,這個過程叫喂狗。如果喂狗過程結束,那么設備就會重啟,因此為了防止設備重啟,Mirai關閉了看門狗功能。這種技術常常被廣泛應用于嵌入式設備的攻擊中,比如曾經的海康威視漏洞(CVE-2014-4880)攻擊代碼中就采用過這種防重啟技術。
這里有個小插曲,2016年8月31日,一位逆向分析人員將此代碼判定錯誤,認為這是為了做延時而用,黑客Anna-senpai在Hackforums論壇公布源碼時嘲笑并斥責了該逆向分析人員的錯誤。
2、進程名隱藏
Mirai為了防止進程名被暴露,在一定程度上做了隱藏,雖然這種隱藏并不能起到很好的作用。Mirai的具體做法是將字符串進行了隨機化。
3、防止多實例運行
Mirai同大多數惡意代碼一樣,需要一種互斥機制防止同一個設備多個實例運行。但Mirai采用的手段有所不同,其通過開啟48101端口來防止多個實例運行,具體做法是通過綁定和監聽此端口,如果失敗,便會關閉已經開啟此端口的進程確保只有一個實例運行。這個特點是檢測網絡設備中是否存在Mirai的最高效的檢測方法。
4、重綁定技術防止外來者搶占資源
Mirai有一個特點就是具有排他性,設備一旦感染,其會通過端口來關閉Telnet(23)、SSH(22,編譯時可選刪除項)、HTTP(80,編譯時可選刪除項)服務并且會阻止這些服務進行重啟,其主要實現方法是通過kill強制關閉這三個服務進程,并強行占用這些服務開啟時所需要的端口。此舉Mirai既可以防止設備被其他惡意軟件感染,也可以防止安全人員從外部訪問該設備,提高Mirai的取證難度。此功能實現在killer.c文件中。
Telnet服務的重綁定實現如下圖,SSH和HTTP服務采用類似的方式實現。
SSH服務的重綁定實現:
HTTP服務的重綁定實現:
通過對實際樣本的分析我們發現,大部分黑客并沒有對SSH和HTTP進行重綁定操作,絕大部分都只針對于Telnet服務進行了重綁定。
5、干掉競爭對手,獨占資源
Mirai會通過一種 memory scraping的技術干掉設備中的其他惡意軟件,其具體做法是搜索內存中是否存在QBOT特征、UPX特征、Zollard蠕蟲特征、Remaiten bot特征來干掉對手,以達到獨占資源的目的。
此外,Mirai如果發現anime惡意軟件,同樣也會強行干掉它。
6、可感染設備探測
Mirai僵尸隨機掃描網絡中IOT設備的Telnet服務并通過預植的用戶名密碼進行暴力破解,然后將掃描得到的設備IP地址、端口、設備處理器架構等信息回傳給Load服務器。這里要注意的是,Mirai的隨機掃描是有一個過濾條件的,其中比較有意思就是他會過濾掉通用電氣公司、惠普公司、美國國家郵政局、國防部等公司和機構的IP地址。
Mirai僵尸中內置有60余個用戶名和密碼,其中內置的用戶名和密碼是加密處理過的,加密算法是通過簡單的單字節多次異或實現,其密鑰為0xDEADBEEF, 解密密鑰為0xEFBEADDE。
Mirai使用高級SYN掃描技術對網絡中的設備進行掃描破解,其速度僵尸程序QBOT所采用的掃描技術快80倍,資源消耗減少至少達20倍。因此具備強大的掃描感染能力,黑客在收集肉雞過程中,曾經每秒可新增500個IOT設備。
Telnet服務掃描實現如下:
當Mirai掃描到Telnet服務時,會連接Telnet并進行暴力登錄嘗試。Mirai首先會使用內置的用戶名和密碼嘗試登錄,之后通過發送一系列命令來判定登錄成功與否。如果成功則試圖進行一些操作,比如開啟shell等操作,其發送的命令被初始化在一個Table中,如下表所示:
命令操作類型 | Index | 有效? | 功能描述 |
TABLE_SCAN_CB_DOMAIN | 18 | yes | domain to connect to |
TABLE_SCAN_CB_PORT | 19 | yes | Port to connect to |
TABLE_SCAN_SHELL | 20 | yes | ‘shell’ to enable shell access |
TABLE_SCAN_ENABLE | 21 | yes | ‘enable’ to enable shell access |
TABLE_SCAN_SYSTEM | 22 | yes | ‘system’ to enable shell access |
TABLE_SCAN_SH | 23 | yes | ‘sh’ to enable shell access |
TABLE_SCAN_QUERY | 24 | yes | echo hex string to verify login |
TABLE_SCAN_RESP | 25 | yes | utf8 version of query string |
TABLE_SCAN_NCORRECT | 26 | yes | ‘ncorrect’ to fast-check for invalid password |
TABLE_SCAN_PS | 27 | no | “/bin/busybox ps” |
TABLE_SCAN_KILL_9 | 28 | no | “/bin/busybox kill -9 “ |
以上表格中只有TABLE_SCAN_PS和TABLE_SCAN_KILL_9進行了初始化而未對目標設備進行預執行操作。從20到26的操作均是在發送用戶名和密碼后的登錄驗證操作。其中TABLE_SCAN_CB_DOMAIN和TABLE_SCAN_CB_PORT為黑客配置的Load服務器,該服務器用于獲取有效的Telnet掃描結果,掃描結果中包含IP地址、端口、Telnet用戶名和密碼等信息。發送信息的格式如下:
zero(1個字節) | IP地址(4bytes) | 端口(2bytes) | 用戶名長度(4bytes) | 用戶名(muti-bytes) | 密碼長度(4bytes) | 密碼(muti-bytes) |
7、連接C&C,等候發動攻擊
Mirai的攻擊類型包含UDP攻擊、TCP攻擊、HTTP攻擊以及新型的GRE攻擊。其中,GRE攻擊就是著名安全新聞工作者Brian Krebs的網站KrebsOnSecurity.com遭受的主力攻擊形式,攻擊的初始化代碼如下:
C&C會被初始化在一張表中,當Mirai回連C&C時,會從表中取出C&C進行連接。
連接C&C成功后,Mirai會進行上線,其上線過程非常簡單,自身簡單向C&C發送4個字節的0。
接下來會等候C&C的控制命令,司機對目標發動攻擊。對于接受控制命令處做了一些處理,比如首先會進行試讀來做預處理(控制指令長度判定等等),最后才會接受完整的控制命令。
當接受到控制命令后,Mirai對控制命令做解析并且執行。控制命令格式如下:
type Attackstruct {
Duration???uint32
Type???????uint8
Targets????map[uint32]uint8??? //Prefix/netmask
Flags??????map[uint8]string??? // key=value
}
其中,前4個字節為攻擊時長,接下來的4個字節為攻擊類型(攻擊ID),然后是攻擊目標,攻擊目標格式如下:
目標數(4個字節) | IP地址(4個字節) | MASK(一個字節) | IP地址(4個字節) | MASK(一個字節) | IP地址….MASK… |
最后是Flags,Flag是一系列的鍵值對數據,結構類似于攻擊目標的格式。下面列出Mirai僵尸網絡攻擊功能列表。
攻擊類型(32位) | 類型值 | 攻擊函數 |
ATK_VEC_UDP | 0 | attack_udp_generic |
ATK_VEC_VSE | 1 | attack_udp_vse |
ATK_VEC_DNS | 2 | attack_udp_dns |
ATK_VEC_UDP_PLAIN | 9 | attack_udp_plain |
ATK_VEC_SYN | 3 | attack_tcp_syn |
ATK_VEC_ACK | 4 | attack_tcp_ack |
ATK_VEC_STOMP | 5 | attack_tcp_stomp |
ATK_VEC_GREIP | 6 | attack_gre_ip |
ATK_VEC_GREETH | 7 | attack_gre_eth |
ATK_VEC_PROXY | 8 | attack_app_proxy(已經被取消) |
ATK_VEC_HTTP | 10 | attack_app_http |
這其中的GRE攻擊也就是2016年。
二、scanListen分析
ScanListen主要用于處理Bot掃描得到的設備信息(ip、端口、用戶名、密碼),并將其轉化為如下格式后將其輸入給Load處理。
三、Load分析
Load模塊的主要功能是處理scanListen的輸入并將其解析后針對每個設備實施感染。其感染實現方法如下:
(1)首先通過Telnet登陸目標設備。
(2)登陸成功后,嘗試運行命令/bin/busybox ps來確認是否可以執行busybox命令。
(3)遠程執行/bin/busybox cat /proc/mounts;用于發現可讀寫的目錄。
(4)如果發現可用于讀寫的文件目錄,進入該目錄并將/bin/echo拷貝到該目錄,文件更名為dvrHelpler,并開啟所有用戶的讀寫執行權限。
(5)接下來通過執行命令”/bin/busybox cat /bin/echo\r\n”來獲取當前設備架構信息。
(6)如果獲取架構信息成功,樣本試圖通過三種方式對設備進行感染,這三種方式分別為echo方式、wget方式、tftp方式。
(7)接下來通過Telnet遠程執行下放的程序。
(8)最后遠程刪除bot程序。
總 結
僵尸網絡已成為全球面臨的共同問題,其攻擊不同于其他以竊密、遠控控制為主的惡意代碼,其通過掌握著的巨型僵尸網絡可以在任何時候對任何目標發動DDoS攻擊。僵尸的感染對象已經從服務器、PC、智能手機,擴展向攝像頭、路由器、家居安防系統、智能電視、智能穿戴設備,甚至是嬰兒監視器,任何互聯網連接的設備都可能成為一個潛在的目標。而一般用戶是很難注意到被感染的狀況的。Mirai僵尸由于源碼的開放可能正在迅速的擴散,其攻擊的流量特征也可能快速變化而難以監測。由于受感染目標多以IOT設備為主,所有的密碼均固化在固件中,因此即便重啟后Mirai從內存中消失也無法杜絕二次感染,并且隱藏在這種嵌入式設備中是極難判定其是否受到惡意感染。
緩解措施:
(1)如果感染Mirai,請重啟設備,并且請求設備廠商更新固件剔除Telnet服務。
(2)不必要聯網的設備盡量不要接入到互聯網中。
(3)通過端口掃描工具探測自己的設備是否開啟了SSH (22), Telnet (23)、 HTTP/HTTPS (80/443)服務,如果開啟,請通知技術人員禁用這些服務。
來源:啟明星辰ADlabs