Belajar dengan berlatih: Melanjutkan Analisis Malware Dinamis – DoomJuice

  • Whatsapp
Belajar dengan berlatih: Melanjutkan Analisis Malware Dinamis - DoomJuice
Belajar dengan berlatih Melanjutkan Analisis Malware Dinamis DoomJuice

News.nextcloud.asia

Sementara sebagian besar analisis statis tidak ditampilkan dalam posting ini, itu dilakukan. Namun, apa yang saya pikir harus saya tambahkan dari analisis statis adalah informasi yang berkaitan dengan impor.

Saat saya melihat impor untuk 3 DLL pertama, saya bisa melihat fungsi yang sedang diimpor.

Sementara di atas terlihat ok, melihat WS2_32.dll yang terkait dengan Windows Sockets, saya melihat nilai ordinal sebagai gantinya.

Di atas menunjukkan proses ini adalah melakukan tugas-tugas yang berhubungan dengan jaringan. Namun, saya tidak dapat memastikan apa fungsi terkait karena saya tidak mengetahui apa yang dipetakan oleh nilai ordinal tersebut. Saatnya beralih ke Ghidra.

Setelah menyiapkan Proyek Ghidra dan membiarkan Ghidra Menganalisa file kami memiliki wawasan yang lebih baik tentang apa yang dimaksud dengan ordinal itu dengan melihat Pohon Simbol.

Sekarang setelah kita menyelesaikannya, kita dapat melihat lebih dekat ke fungsi terkait.

Mari kita mulai dengan stopkontak fungsi. Pertama di kode perakitan. Jika kita meninjau fungsi ini dari situs web Microsoft, kita melihat dibutuhkan 3 parameter yang semuanya bilangan bulat. Parameter ini adalah dari, jenis dan protokol.

Mari kita lihat apa yang disediakan untuk fungsi soket melalui kode perakitan.

1
2
3
4
5
                             LAB_0040aa42                                    XREF[2]:     0040aa71(j), 0040aa97(j)  
        0040aa42 6a 06                PUSH       0x6                                              ; int protocol for socket
        0040aa44 6a 01                PUSH       0x1                                              ; int type for socket
        0040aa46 6a 02                PUSH       0x2                                              ; int af for socket
        0040aa48 ff 15 a4 10 40 00    CALL       dword ptr [->WS2_32.DLL::socket]

Seperti yang kita lihat di atas, tiga argumen diteruskan ke WS2_32.dll::soket fungsi. Ini adalah 2 (af), 1 (tipe) dan 6 (protokol). Menggali lebih dalam dokumentasi Microsoft. Mari kita uraikan ini lebih lanjut.

2 (af) – Ini mewakili AF_INET – Keluarga protokol IPv4

1 (tipe) – SOCK_STREAM – Menyediakan komunikasi yang andal dan menggunakan TCP

6 (protokol) – IPPROTO_TCP – ini mengatakan untuk menggunakan TCP.

Pada titik ini kita tahu bagaimana stopkontak fungsi dibangun dan kita tahu malware ini menggunakan komunikasi TCP. Bisakah kita menemukan IP. Kita harus melihat lebih dalam.

Masih bertahan dengan Ghidra dan beberapa fungsi lain yang menurut saya menarik saat ini, mari kita lihat panggilan ke BuatMutexA di alamat

           Nik Comment: Function named changed by Nik
                             Create_Mutex_0040a741                           XREF[1]:     entry:0040ac13(c)  
        0040a741 55                   PUSH       EBP
        0040a742 8b ec                MOV        EBP,ESP
        0040a744 83 ec 40             SUB        ESP,0x40
        0040a747 80 65 ce 00          AND        byte ptr [EBP + local_36],0x0
        0040a74b 8d 45 c0             LEA        EAX=>local_44,[EBP + -0x40]
        0040a74e 50                   PUSH       EAX                                              ; LPCSTR lpName for CreateMutexA
        0040a74f 6a 01                PUSH       0x1                                              ; BOOL bInitialOwner for CreateM
                             Nik Comment: 1 byte values being moved into EBP. 
                             0x73 hex = ASCII 's'
                             0x79 hex = ASCII 'y'
                             0x6e hex = ASCII 'n'
                             0x63 hex = ASCII 'c'
                             0x2d hex = ASCII '-'
                             0x5a hex = ASCII 'z'
                             0x2d hex = ASCII '-'
                             0x6d hex = ASCII 'm'
                             0x74 hex = ASCII 't'
                             0x78 hex = ASCII 'x'
                             0x5f hex = ASCII '_'
                             0x31 hex = ASCII '1'
                             0x33 hex = ASCII '3'
                             0x33 hex = ASCII '3'
                             Note I could have instead "Set Equate" to represent the byte 
        0040a751 6a 00                PUSH       0x0                                              ; LPSECURITY_ATTRIBUTES lpMutexA
        0040a753 c6 45 c0 73          MOV        byte ptr [EBP + local_44],0x73
        0040a757 c6 45 c1 79          MOV        byte ptr [EBP + local_43],0x79
        0040a75b c6 45 c2 6e          MOV        byte ptr [EBP + local_42],0x6e
        0040a75f c6 45 c3 63          MOV        byte ptr [EBP + local_41],0x63
        0040a763 c6 45 c4 2d          MOV        byte ptr [EBP + local_40],0x2d
        0040a767 c6 45 c5 5a          MOV        byte ptr [EBP + local_3f],0x5a
        0040a76b c6 45 c6 2d          MOV        byte ptr [EBP + local_3e],0x2d
        0040a76f c6 45 c7 6d          MOV        byte ptr [EBP + local_3d],0x6d
        0040a773 c6 45 c8 74          MOV        byte ptr [EBP + local_3c],0x74
        0040a777 c6 45 c9 78          MOV        byte ptr [EBP + local_3b],0x78
        0040a77b c6 45 ca 5f          MOV        byte ptr [EBP + local_3a],0x5f
        0040a77f c6 45 cb 31          MOV        byte ptr [EBP + local_39],0x31
        0040a783 c6 45 cc 33          MOV        byte ptr [EBP + local_38],0x33
        0040a787 c6 45 cd 33          MOV        byte ptr [EBP + local_37],0x33
        0040a78b ff 15 2c 10 40 00    CALL       dword ptr [->KERNEL32.DLL::CreateMutexA]
        0040a791 ff 15 30 10 40 00    CALL       dword ptr [->KERNEL32.DLL::GetLastError]
        0040a797 2d b7 00 00 00       SUB        EAX,0xb7
        0040a79c f7 d8                NEG        EAX
        0040a79e 1b c0                SBB        EAX,EAX
        0040a7a0 40                   INC        EAX
        0040a7a1 c9                   LEAVE
        0040a7a2 c3                   RET

Dari atas, kita melihat sepertinya mutex yang dibuat adalah sinkronisasi-Z-mtx_133.

Melihat panggilan pertama ke DapatkanDirektoriSistemA, kita melihat pointer ke buffer yang akan menyimpan informasi yang disimpan dalam register EAX dan ukuran buffernya adalah 0x118 atau 280 byte desimal.

                             LAB_0040a812                                    XREF[1]:     0040a8ef(j)  
        0040a812 39 5d fc             CMP        dword ptr [EBP + local_8],EBX
        0040a815 8d 85 d0 fe ff ff    LEA        EAX=>local_134,[EBP + 0xfffffed0]
        0040a81b 75 0e                JNZ        LAB_0040a82b
        0040a81d 68 18 01 00 00       PUSH       0x118                                            ; UINT uSize for GetSystemDirect
        0040a822 50                   PUSH       EAX                                              ; LPSTR lpBuffer for GetSystemDi
        0040a823 ff 15 40 10 40 00    CALL       dword ptr [->KERNEL32.DLL::GetSystemDirectoryA]

Panggilan untuk wsprintfA pada 0040a940 juga merupakan panggilan fungsi yang menarik dalam konteks ini. Melihat ke wsprintfA panggilan.

        0040a915 68 a8 a0 40 00       PUSH       DAT_0040a0a8                                     ; = 6Eh    n
        0040a91a 68 a4 a0 40 00       PUSH       DAT_0040a0a4                                     ; = 72h    r
        0040a91f 68 9c a0 40 00       PUSH       DAT_0040a09c                                     ; = 72h    r
        0040a924 68 98 a0 40 00       PUSH       DAT_0040a098                                     ; = 5Ch    
        0040a929 68 94 a0 40 00       PUSH       DAT_0040a094                                     ; = 6Fh    o
        0040a92e 68 90 a0 40 00       PUSH       DAT_0040a090                                     ; = 74h    t
        0040a933 68 88 a0 40 00       PUSH       DAT_0040a088                                     ; = 72h    r
        0040a938 68 80 a0 40 00       PUSH       s_wareM_0040a080                                ; = "ware\M"
        0040a93d 8d 45 d0             LEA        EAX=>local_a8,[EBP + -0x30]
        0040a940 68 5c a0 40 00       PUSH       s_Soft%sic%sf%sind%ss%sr%sVe%so%su_0040a05c      ; LPCSTR param_2 for wsprintfA
                                                                                                   ; = "Soft%sic%sf%sind%ss%sr%sVe%

Melihat di atas, Anda mungkin bertanya-tanya apa itu s_Soft% sic% sf% sind% ss% sr% sVe% jadi% su_0040a05c. Mari kita pecahkan ini untuk kesederhanaan.

1- s_Lembut% s

2- ic%s

3- f%s

4 – sayadan%ss%sr%s

5 – Dan%

6 – jadi%s

7- u_0040a05c.

Melihat dari dekat Anda dapat melihat %S penentu format yang konsisten dengan string format. Kita sekarang dapat memecah ini lebih jauh. Mengambil string pertama yang didorong ke tumpukan yang ada di 0040a080 (s_wareM_0040a080).

                             s_wareM_0040a080                               XREF[1]:     FUN_0040a908:0040a938(*)  
        0040a080 77 61 72 65 5c       ds         "ware\M"
        0040a087 00                   ??         00h

Pada titik ini kita memiliki Perangkat Lunak+M yang memberi kita Perangkat Lunak\M

Melihat entri berikutnya didorong DAT_0040a088 ke tumpukan. Mencari string di 0040a088 kita mendapatkan:

                             s_roso_0040a088                                 XREF[1]:     FUN_0040a908:0040a933(*)  
        0040a088 72 6f 73 6f 00       ds         "roso"
        0040a08d 00                   ??         00h
        0040a08e 00                   ??         00h
        0040a08f 00                   ??         00h

Dari atas kami memiliki Perangkat Lunak\M menambahkan ic+roso kita mendapatkan Perangkat Lunak\Microso

Melanjutkan entri ke-3 DAT_0040a090 didorong ke tumpukan yang kita lihat.

                             s_tW_0040a090                                  XREF[1]:     FUN_0040a908:0040a92e(*)  
        0040a090 74 5c 57 00          ds         "t\W"

Pada titik ini kita sekarang memiliki Perangkat Lunak\Microso + f + t\W. Menyatukannya, kita mendapatkan Software\MicrosoftW. Kita bisa terus menyusuri jalan ini. Namun, untuk kepentingan waktu, inilah tampilan string terakhir: SoftwareMicrosoftWindowsCurrentVersionRun.

Melihat lebih jauh untuk melihat apa yang sedang dilakukan dengan kunci registri ini, kita lihat di bawah:

                             LAB_0040a995                                    XREF[1]:     0040a97d(j)  
        0040a995 ff 75 7c             PUSH       dword ptr [EBP + param_1]                        ; LPCSTR lpString for lstrlenA
        0040a998 ff 15 4c 10 40 00    CALL       dword ptr [->KERNEL32.DLL::lstrlenA]
        0040a99e 40                   INC        EAX
        0040a99f 50                   PUSH       EAX                                              ; DWORD cbData for RegSetValueExA
        0040a9a0 ff 75 7c             PUSH       dword ptr [EBP + param_1]                        ; BYTE * lpData for RegSetValueExA
        0040a9a3 8d 45 50             LEA        EAX=>local_28,[EBP + 0x50]
        0040a9a6 6a 01                PUSH       0x1                                              ; DWORD dwType for RegSetValueExA
        0040a9a8 6a 00                PUSH       0x0                                              ; DWORD Reserved for RegSetValue
        0040a9aa 50                   PUSH       EAX                                              ; LPCSTR lpValueName for RegSetV
        0040a9ab ff 75 70             PUSH       dword ptr [EBP + local_8]                        ; HKEY hKey for RegSetValueExA
        0040a9ae ff 15 08 10 40 00    CALL       dword ptr [->ADVAPI32.DLL::RegSetValueExA]

Yang paling penting bagi saya di atas adalah nilai yang akan ditetapkan. Sedikit curang, saya melihat pembongkaran dan memperhatikan panggilan ke lsstrcpyA dan tali Gremlin.

Inilah yang terlihat seperti dalam pembongkaran.

        0040a94f 68 54 a0 40 00       PUSH       s_Gremlin_0040a054                               ; LPCSTR lpString2 for lstrcpyA
                                                                                                   ; = "Gremlin"
        0040a954 8d 45 50             LEA        EAX=>local_28,[EBP + 0x50]
        0040a957 50                   PUSH       EAX                                              ; LPSTR lpString1 for lstrcpyA
        0040a958 ff 15 14 10 40 00    CALL       dword ptr [->KERNEL32.DLL::lstrcpyA]

Melihat alamat memori 0040a054 kami melihat

                             **************************************************************
                             * lpString2 parameter of lstrcpyA                            *
                             *                                                            *
                             **************************************************************
                             s_Gremlin_0040a054                              XREF[1]:     FUN_0040a908:0040a94f(*)  
        0040a054 47 72 65 6d 6c       ds         "Gremlin"

Sebelum saya beralih ke x64dbg, saya pikir saya harus melihat keluaran ProcDot, untuk melihat apakah saya dapat mencocokkan apa yang telah dilakukan..

Di atas kita melihat file tidak hanya ditulis ke sistem lokal saya di lokasi yang berbeda tetapi juga untuk dibagikan yang dapat diakses. Kami juga melihatnya membuat dan menghapus file bernama C:UsersSecurityNikAppDataLocalTempintrenat[.]exe.

Namun, setelah verifikasi ini, kami melihat file tersebut sebenarnya ada di sistem file. Mungkin filenya terhapus dan saya tidak memperhatikan entri itu di ProcDOT.

C:UsersSecurityNikDesktopMalwareday1>dir C:UsersSecurityNikAppDataLocalTempintrenat.exe
 Volume in drive C has no label.
 Volume Serial Number is 6C10-15EA

 Directory of C:UsersSecurityNikAppDataLocalTemp

02/09/2004  01:16 PM            43,008 intrenat.exe
               1 File(s)         43,008 bytes
               0 Dir(s)  35,435,905,024 bytes free

Melihat lebih dekat pada file, sepertinya itu adalah file yang sama yang ditulis ke beberapa lokasi seperti yang terlihat dari nilai hash di bawah ini.

PS C:tmp> Get-FileHash C:usersSecurityNiksync-src-1.00.tbz ; get-filehash c:userssecuritynikappdatalocalvirtualstorewindowssync-src-1.00.tbz ; get-f
ilehash C:UsersSecurityNikAppDataLocalTempsync-src-1.00.tbz

Algorithm       Hash                                                                   Path
---------       ----                                                                   ----
SHA256          6CD0666EE68849E57E054C6A009366868494C4EC73723F607473375518591496       C:usersSecurityNiksync-src-1.00.tbz
SHA256          6CD0666EE68849E57E054C6A009366868494C4EC73723F607473375518591496       C:userssecuritynikappdatalocalvirtualstorewindowssync-src-1.0...
SHA256          6CD0666EE68849E57E054C6A009366868494C4EC73723F607473375518591496       C:UsersSecurityNikAppDataLocalTempsync-src-1.00.tbz

Melihat lebih dalam ke salah satu file dari perspektif Hex, kita lihat.

Pada titik ini, saya tidak tahu apa yang harus dibuat dari file ini. Mungkin saya akan mempelajarinya lebih lanjut ketika file sedang diakses melalui x64dbg.

Untuk akhirnya memulai dengan x64dbg, berikut adalah breakpoint yang saya tetapkan.

SetBPX Kernel32.CopyFileA
SetBPX Kernel32.DeleteFileA
SetBPX Kernel32.CreateMutexA
SetBPX Kernel32.CopyFileA
SetBPX Kernel32.GetDriveTypeA
SetBPX Kernel32.GetSystemDirectoryA
SetBPX Kernel32.GetTempPathA
SetBPX Kernel32.ReadFile
SetBPX Kernel32.CreateFileA
SetBPX Kernel32.WriteFile

SetBPX Advapi32.RegOpenKeyExA
SetBPX Advapi32.RegCloseKey
SetBPX Advapi32.RegSetValueExA

SetBPX user32.wsprintfA

SetBPX ws2_32.send

Berikut adalah apa yang terlihat seperti

Setelah memukul lari, breakpoint pertama yang terkena adalah BuatMutexA. Melihat Pegangan dalam x64dbg, kami melihat Mutex dibuat dengan nama sinkronisasi-Z-mtx_133. Ingat ini adalah nama yang sama yang kami temukan selama analisis kode statis dengan Ghidra.

Melanjutkan menjalankan program, breakpoint berikutnya adalah DapatkanDirektoriSistemA, yang kembali: C:\Windows\system32

Melanjutkan lari kita selanjutnya mencapai breakpoint BuatFileA yang menunjukkan pembuatan file bernama dalam hati[.]exe di folder c:windowssystem32. Ingat ini dikembalikan dari DapatkanDirektoriSistemA di atas.

Menjalankan program lagi, breakpoint berikutnya yang terkena adalah SalinFileA.

Di atas kita melihat file aslinya jus[.]exe disalin ke c:windowssystem32intrenat[.]exe mengajukan. Perhatikan juga parameter ketiga 0x00000000 berarti jika file itu ada, itu hanya akan ditimpa. Menariknya, pada titik ini saya tidak melihat file di folder c:windowssystem32 saya. Mungkin saya melewatkan sesuatu atau saya akan melihatnya nanti.

Selanjutnya, kita memukul wsprintfA fungsi yang menulis data yang diformat ke buffer yang ditentukan. Inilah yang terlihat seperti ini.

Entri registri di atas mengonfirmasi apa yang kami temukan selama analisis statis wsprintfA di atas.

Terus berlari, kita memukul selanjutnya RegOpenKeyExA titik putus. Saya melewatkan ini saat kita fokus pada RegSetValueExA di bawah.

Di atas menunjukkan nilai registri Gremlin sedang ditulis dalam Lari kunci. Kami juga melihat 0x21 (33 desimal) byte sedang ditulis dan data berisi intranat.exe file dan path yang kita lihat sebelumnya.

Baik. Saya sudah melakukan cukup untuk posting ini. Saya percaya saya telah belajar apa yang saya inginkan untuk posting ini.

Referensi:

Pos terkait

Tinggalkan Balasan

Alamat email Anda tidak akan dipublikasikan.