压在透明的玻璃上c-国产精品国产一级A片精品免费-国产精品视频网-成人黄网站18秘 免费看|www.tcsft.com

利用PNG像素隱藏PE代碼:分析PNG Dropper新樣本

前言

在這篇文章中,我們將跟大家介紹Turla組織研發和使用的PNG Dropper惡意軟件。在2017年8月份,沉寂已久的PNG Dropper重返人們的視野,而且當時它主要用來傳播Snake,但近期研究人員又檢測到了攜帶新型Payload的PNG Dropper樣本,NCC Group的研究人員也將這個樣本命名為了RegRunnerSvc。

PNG Dropper

Carbon Black的研究團隊此前已經對PNG Dropper組件進行了非常詳細的分析【分析報告】,但我們還是簡單回顧一下它的工作機制吧!

1.png

Dropper的目的是為了加載和運行一個隱藏在多個PNG文件中的PE文件。上圖顯示的是Dropper的資源數據,我們可以看到有多個代碼數據資源入口標記有“PNG”的字樣。其中每一個資源都是一個有效的PNG文件,不過打開之后你看到的只是部分彩色像素:

2.png

PNG使用了微軟的GDI+庫進行加載,下圖中我們可以看到,代碼會調用LockBits來從PNG文件中讀取像素數據。像素數據的每一個字節都代表了每一個像素的RGB值。對每一個RGB值進行編碼之后我們就能得到PE文件的字節數據了。

3.png

每一個PNG資源都會被枚舉,像素數據也都會被提取出來,最終會進行拼接,而最后生成的完整PE文件會存儲在內存中。接下來,Dropper需要手動加載PE文,然后執行PE文件的入口函數:

4.png

RegRunnerSvc

PNG Dropper會利用其PNG資源解碼并運行RegRunnerSvc,而RegRunnerSvc的目的就是從注冊表中提取加密Payload,并將其加載進內存,然后運行。下圖顯示的是RegRunnerSvc的入口點,這里我們可以看到,代碼調用了StartServiceCtrlDispatcher,目標服務名稱為WerFaultSvc(還負責實現惡意軟件的持久感染),很明顯攻擊者是想讓惡意服務偽裝成合法的Windows錯誤報告服務。

5.png

服務設置函數執行后,就需要找出注冊表中的目標數據了。一般來說,注冊表路徑會保存在代碼里的一個字符串中,但是PNG Dropper卻不是,因為它會使用RegEnumKeyExA和RegEnumValueA函數來枚舉注冊表鍵-值。

6.png

注冊表中的數據包含加密Payload以及解密所需的數據。雖然其中不包含解密密鑰,但是它包含了用于生成解密密鑰所需的信息,而其中的部分數據使用了微軟的CNG庫函數(NCrypt*)來進行加密。第一階段的Dropper將生成解密密鑰并存儲在系統默認密鑰存儲器中,這里使用的是“MicrosoftSoftware Key Storage Provider”。如果第一階段的Dropper運行不成功,那么密鑰將無法生成和存儲,因此解密函數將會退出。下面給出的是解密數據的二進制數據結構:

7.png

Header解密成功后,我們就可以進行第二階段的解密操作了。主Payload使用了AES算法進行加密。首先,代碼會將一段注冊表數據傳遞給BCryptGenerateSymmetricKey函數,此時AES解密密鑰便創建成功了。密鑰生成之后,解密屬性便設置成功,Payload即可解密成功。接下來,代碼會對解密后的Payload進行檢測,以確保PE文件的有效性。如果檢測通過,文件將會被加載,入口點將會被調用。

8.png

總結

在這篇文章中,我們對Turla組織所使用的新型PNG Dropper進行了分析。該組織目前也在配合RegRunnerSvc這個新組件來實施攻擊,RegRunnerSvc可以從注冊表中提取和加密PE文件,并對其進行解密和運行。目測,該組織是從無文件型惡意軟件那里得到的靈感,比如說Poweliks和Kovter,而他們的目標就是為了在代碼文件內盡可能地不留下攻擊證據。

除此之外,我們還開發出了一款專門從PNG Dropper中提取Payload的工具,并且將其開源,感興趣的同學可以下載學習:【下載地址】

Yara規則

rule turla_png_dropper {

meta:

author = “Ben Humphrey”

description = “Detects the PNGDropper used by the Turla group”

sha256 =

“6ed939f59476fd31dc4d99e96136e928fbd88aec0d9c59846092c0e93a3c0e27″

strings:

$api0 = “GdiplusStartup”

$api1 = “GdipAlloc”

$api2 =“GdipCreateBitmapFromStreamICM”

$api3 = “GdipBitmapLockBits”

$api4 = “GdipGetImageWidth”

$api5 = “GdipGetImageHeight”

$api6 = “GdiplusShutdown”

$code32 = {

8B 46 3C?????????????? // mov???? eax, [esi+3Ch]

??????????? B9 0B 01 00 00???????? // mov???? ecx, 10Bh

?????????? ?66 39 4C 30 18???????? // cmp???? [eax+esi+18h], cx

??????????? 8B 44 30 28??????????? // mov???? eax, [eax+esi+28h]

??????????? 6A 00????????????????? // push??? 0

??????????? B9 AF BE AD DE???????? // mov???? ecx, 0DEADBEAFh

??????????? 51????????????? ???????// push??? ecx

??????????? 51???????????????????? // push??? ecx

??????????? 03 C6????????????????? // add???? eax, esi

??????????? 56???????????????????? // push??? esi

??????????? FF D0????????????????? // call eax

??????? }

?

??????? $code64 = {

???????????48 63 43 3C??????????? // movsxdrax, dword ptr [rbx+3Ch]

??????????? B9 0B 01 00 00???????? // mov ecx, 10Bh

??????????? BA AF BE AD DE???????? // mov edx, 0DEADBEAFh

??????????? 66 39 4C 18 18???????? // cmp [rax+rbx+18h], cx

??????????? 8B 44 18 28??????????? // mov eax, [rax+rbx+28h]

??????????? 45 33 C9?????????????? // xor r9d, r9d

??????????? 44 8B C2?????????????? // mov r8d, edx

??????????? 48 8B CB?????????????? // mov rcx, rbx

??????????? 48 03 C3?????????????? // add rax, rbx

??????? ????FF D0????????????????? // call rax

??????? }

?

??? condition:

??????? (uint16(0) == 0x5A4D anduint16(uint32(0x3c)) == 0x4550) and

??????? all of ($api*) and

??????? 1 of ($code*)

}

rule turla_png_reg_enum_payload {

meta:

author = “BenHumphrey”

description = “Payloadthat has most recently been dropped by the

TurlaPNG Dropper”

shas256 =

“fea27eb2e939e930c8617dcf64366d1649988f30555f6ee9cd09fe54e4bc22b3″

strings:

$crypt00 = “Microsoft SoftwareKey Storage Provider” wide

$crypt01 =“ChainingModeCBC” wide

$crypt02 = “AES” wide

condition:

(uint16(0) == 0x5A4D anduint16(uint32(0x3c)) == 0x4550) and

pe.imports(“advapi32.dll”,“StartServiceCtrlDispatcherA”) and

pe.imports(“advapi32.dll”,“RegEnumValueA”) and

pe.imports(“advapi32.dll”,“RegEnumKeyExA”) and

pe.imports(“ncrypt.dll”,“NCryptOpenStorageProvider”) and

pe.imports(“ncrypt.dll”,“NCryptEnumKeys”) and

pe.imports(“ncrypt.dll”,“NCryptOpenKey”) and

pe.imports(“ncrypt.dll”,“NCryptDecrypt”) and

pe.imports(“ncrypt.dll”,“BCryptGenerateSymmetricKey”) and

pe.imports(“ncrypt.dll”,“BCryptGetProperty”) and

pe.imports(“ncrypt.dll”,“BCryptDecrypt”) and

pe.imports(“ncrypt.dll”,“BCryptEncrypt”) and

all of them

}

入侵威脅指標

樣本分析:

1、6ed939f59476fd31dc4d99e96136e928fbd88aec0d9c59846092c0e93a3c0e27(PNG Dropper)

2、fea27eb2e939e930c8617dcf64366d1649988f30555f6ee9cd09fe54e4bc22b3(從PNG dropper中獲取到的Payload)

服務:

1、WerFaultSvc

參考資料

https://www.carbonblack.com/2017/08/18/threat-analysis-carbon-black-threat-research-dissects-png-dropper/

上一篇:如何濫用SMB掛載點繞過客戶端符號鏈接保護策略

下一篇:“安全+”沙龍第十四期在上海成功舉辦/1月4日