利用 Flash 遠程檢測客戶端安裝的殺軟
本文將提供一種檢測用戶已安裝的殺軟的可能的方法。如果我們想對用戶發(fā)起攻擊,那么獲取該用戶已安裝的殺軟信息是非常有用的。
本文所提供的方法主要基于以下兩點:
1.現(xiàn)在的主流AV在檢測惡意軟件時會進行網(wǎng)絡流量的分析。
通常情況下,http 和 smtp/pop3/imap 這類協(xié)議已經(jīng)被分析了。然而,隨著 TLS 加密傳輸越來越被廣泛的使用,因此,殺軟要分析被加密的網(wǎng)絡傳輸信息,就需要針對用戶的應用程序和遠程服務器執(zhí)行類似中間人攻擊(MITM)的行為。為了繞過證書鏈的檢測,殺軟需要安裝它自己的根證書到用戶電腦上。之后,對加密的網(wǎng)絡傳輸信息進行攔截,解密和分析。
如下圖所示:
2. Flash 支持原始的TCP套接字。
事實上,內(nèi)嵌在瀏覽器網(wǎng)頁中的swf文件即Flash 可以接受或發(fā)送任意TCP數(shù)據(jù)包到一個遠程服務器的任何一個端口。但是為了安全起見,F(xiàn)lash socket 也支持跨域策略。如果一個Flash想要通過 socket 連接到一臺服務器時,它會連接遠程服務器的 843 端口并且發(fā)送一個請求,這個請求的目的是獲取 跨域策略對應的xml文件,即crossdomain.xml也就是我們所說的“主策略文件”。這個xml文件包含了安全策略的具體信息,比如:哪些域名才能連接該服務器的哪些端口等等。
Flash socket crossdomain.xml文件示例:
- <?xml version="1.0"?>
- <!DOCTYPE cross-domain-policy SYSTEM "/xml/dtds/cross-domain-policy.dtd">
- <cross-domain-policy>
- <site-control permitted-cross-domain-policies="master-only"/>
- <allow-access-from domain="*" to-ports="443,995,465,587" />
- </cross-domain-policy>
利用以上兩點,就可以產(chǎn)生奇妙的結(jié)果。當我們利用一個Flash文件發(fā)起TLS連接,連接請求到遠程服務器的指定端口(如:443,587等等),之后殺軟將會攔截該請求。因此,F(xiàn)lash就會接受到一個由殺軟生成的TLS證書,那么,通過根證書的名稱就可以判斷出用戶安裝了何種殺軟。
整個攻擊流程如下:
0) 用戶訪問我們的網(wǎng)站,用戶的瀏覽器加載了網(wǎng)站中的惡意swf文件。
1)Flash通過socket連接我們的服務器的843端口請求crossdomain.xml文件的內(nèi)容并獲取請求權(quán)限。
2)Flash連接到我們的服務器的一個端口(如443,465等等)并且發(fā)送了一個“Client Hello”的TLS數(shù)據(jù)包。
3)服務器發(fā)送“Server Hello”的TLS響應數(shù)據(jù)包,該數(shù)據(jù)包攜帶有服務器的證書信息。
4)殺軟攔截了此次傳輸,生成了新的證書并且利用殺軟自己的根證書進行了簽名。
5)Flash接收到了上一步中(已經(jīng)被殺軟處理過)的TLS數(shù)據(jù)包,之后再發(fā)送給我們的服務器。
6)通過解析TLS數(shù)據(jù)包獲取根證書的名稱,名稱中包含了殺軟的名稱。
我創(chuàng)建了一個POC (https://github.com/GrrrDog/FlashAV)可能離實際的攻擊效果相差很遠,POC包含了一個特定的Flash和一個Python編寫的 Socket Server。swf 發(fā)送原始的TLS請求(SSLv3),并且發(fā)送被殺軟處理過的響應數(shù)據(jù)包到Python Socket Server。Python Socket Server 被用于解析數(shù)據(jù)包的證書名稱以及構(gòu)建crossdomain.xml文件內(nèi)容。
我最初利用 Avast 殺軟進行了測試,IE 和 Chrome 可以測試成功,但是Firefox卻不行,在火狐瀏覽器中 Avast 并未對Flash連接443端口的請求做攔截。但是,在火狐瀏覽器中的Flash連接遠程服務器的465或者587,993等端口時殺軟則會攔截并且也能成功獲取到用戶安裝的殺軟名稱。
之后我測試了卡巴斯基,但是并沒有成功,卡巴斯基雖然會對瀏覽器的請求做攔截,但是并未攔截Flash的連接請求。