Kelompok OceanLotus (alias APT32 dan APT-C-00) dikenal karena serangannya di Asia Timur. Tahun lalu, sejumlah studi tentang pekerjaan grup diterbitkan, termasuk dokumen
CyberReason , ulasan
FireEye , dan deskripsi serangan lubang berair
Volexity . Seperti yang dapat kita lihat, grup memperbarui vektor backdoor, infrastruktur dan infeksi.
OceanLotus terus menargetkan perusahaan dan lembaga pemerintah di Asia Timur. Menurut telemetri ESET, tujuan prioritas OceanLotus adalah di Vietnam, Laos, Kamboja dan Filipina.
Beberapa bulan yang lalu, kami menemukan dan menganalisis salah satu ruang belakang terbaru mereka. Ini mengimplementasikan beberapa alat yang membuatnya sulit untuk dianalisis dan menghindari deteksi - kami akan membahasnya dalam sebuah pos.

Distribusi
Penyerang menggunakan metode yang berbeda untuk meyakinkan korban untuk meluncurkan dropper berbahaya.
Ekstensi ganda dan ikon aplikasi palsu (Word, PDF, dll.)
Dropper cenderung menyebar melalui lampiran email. Kami mengamati nama file berikut:
-
Mi17 Technical issues - Phonesack Grp.exe
(Mi-17 - model helikopter Rusia)
-
Chi tiet don khieu nai gui saigontel.exe
(diterjemahkan dari bahasa Vietnam - “perincian klaim yang dikirim ke Saigontel”, Saigontel - perusahaan telekomunikasi Vietnam)
-
Updated AF MOD contract - Jan 2018.exe
-
remove_pw_Reschedule of CISD Regular Meeting.exe
-
Sorchornor_with_PM_-_Sep_2017.exe
-
20170905-Evaluation Table.xls.exe
-
CV_LeHoangThing.doc.exe
(resume palsu juga ditemukan di Kanada)
Semua file ini memiliki kesamaan - meluncurkan dokumen umpan yang dilindungi kata sandi. Tidak jelas apakah kata sandi tersebut terkandung di suatu tempat dalam data surat yang dikirimkan, atau apakah dokumen tidak boleh dibuka.
Pemasang palsu
Beberapa installer palsu yang menyamar sebagai installer atau pembaruan perangkat lunak telah terlihat dalam kampanye lubang air. Salah satu contoh adalah penginstal ulang Firefox yang dijelaskan oleh 360 Labs on
Freebuf (dalam bahasa Cina).
Sampel lain yang kami lihat disebut
RobototFontUpdate.exe
. Mungkin menyebar melalui situs yang disusupi, tetapi kami tidak memiliki bukti yang cukup tentang ini.
Semua file yang dijelaskan, apakah didistribusikan melalui pos atau diunduh ketika mengunjungi situs yang disusupi, mengirimkan komponen backdoor yang sama. Dalam sebuah posting, kami akan menganalisis sampel
RobototFontUpdate.exe
dan menunjukkan bagaimana mengelola untuk menjalankan muatan berbahaya pada sistem.
Analisis teknis
Proses instalasi dan eksekusi tergantung pada kebingungan multi-layer, yaitu enkripsi komponen, rekonstruksi file PE, pemuatan shellcode dan teknik pemuatan samping. Yang terakhir ini dijelaskan dalam
studi Korplug ESET
sebelumnya .
Ulasan Kemajuan
Serangan itu terdiri dari dua bagian: sebuah dropper dan sebuah kendaraan peluncuran. Setiap langkah dari setiap bagian dari proses akan dijelaskan secara rinci di bagian yang sesuai. Dua diagram di bawah ini memberikan gambaran singkat tentang perkembangan malware secara keseluruhan.
Gambar 1. Kemajuan pipet
Gambar 2. Progres backdoorHampir semua komponen ini dikaburkan. Kebingungan didasarkan pada perintah transisi pasangan kondisional pelengkap. Untuk masing-masing bentuk: JZ / JNZ, JP / JNP, JO / JNO dan seterusnya, masing-masing pasangan melakukan transisi ke tujuan yang sama. Urutan diselingi dengan kode sampah yang menggunakan penunjuk tumpukan tetapi tidak mengubah nilai bendera bersyarat. Ternyata transisi terjadi dalam cabang yang sama. Hal ini menyebabkan masalah selama proses dekompilasi karena penggunaan nilai-nilai penunjuk tumpukan positif.
Gambar 3. Transisi bersyarat pelengkapSelain itu, beberapa elemen dasar program menambahkan satu alamat ke stack, setelah itu mereka berakhir di JMP / CALL, sementara elemen dasar lainnya menambahkan dua alamat dan diakhiri dengan perintah RET. Penambahan item kedua adalah fungsi yang dipanggil, dan yang pertama adalah alamat elemen program dasar berikutnya di mana transisi akan dilakukan. Dengan demikian, elemen dasar dari program ini dibuat tanpa objek induk.
Gambar 4. Teknik PUSH / JMPSebagai hasil dari kombinasi dua teknik kebingungan, grafik "indah" diperoleh:
Gambar 5. Mengaburkan urutan runMemperhatikan kode sampah cukup sederhana. Itu dapat diabaikan dalam analisis sampel, jika Anda tahu skema aplikasi.
Pipet
Langkah 1. Umpan Dokumen
Dalam beberapa bulan terakhir, OceanLotus telah menggunakan beberapa umpan. Salah satunya adalah perangkat lunak palsu untuk memperbarui
Roboto Slab regular
TrueType
Roboto Slab regular
. Memilih font agak aneh, karena tidak mendukung banyak bahasa Asia Timur.
Gambar 6. Ikon pembaruan font RobototFontUpdateKetika dieksekusi, file biner mendekripsi sumber dayanya (XOR, 128 byte, kunci hard-coded) dan mengembalikan data yang didekripsi (LZMA). File RobotoSlab-Regular.ttf yang sah
(SHA1:
912895e6bb9e05af3a1e58a1da417e992a71a324
) ditulis ke folder
%temp%
dan diluncurkan menggunakan fungsi Win32 API
ShellExecute
.
Kode shell yang didekripsi dari sumber dieksekusi. Setelah eksekusi, pembaruan font palsu mengimplementasikan aplikasi lain yang tujuan utamanya adalah untuk menghapus dropper. Aplikasi yang dihapus ini
%temp%\[0-9].tmp.exe
sebagai
%temp%\[0-9].tmp.exe
.
Tahap 2. Kode shell
Pada setiap tahap, shellcode yang sama digunakan.
Shellcode adalah pemuat PE khusus. Ini mengembalikan file yang dapat dieksekusi dalam memori - mendekripsi semua bagian dan menghitung gerakan yang diperlukan dan indentasi lainnya.
RtlMoveMemory
menggunakan tiga fungsi Windows API:
VirtualAlloc
,
RtlMoveMemory
dan
RtlZeroMemory
.
Fungsi
RtlZeroMemory
digunakan untuk
RtlZeroMemory
bidang dalam header PE. Mengandalkan dump memori otomatis akan gagal, karena header MZ / PE rusak.
Kode shell memanggil fungsi login PE yang didekripsi, dan kemudian
DLLEntry
ekspor
DLLEntry
.
Tahap 3. Penetes sungguhan
{103004A5-829C-418E-ACE9-A7615D30E125}.dll
Sumber dekripsi yang dapat dieksekusi ini menggunakan algoritma AES dalam mode CBC melalui Windows API. Kunci kode keras berukuran 256 bit. Setelah dekripsi, data terkompresi didekompresi (algoritma LZMA).
Jika proses dimulai dengan hak administrator, malware menyediakan kegigihan dengan menciptakan layanan. Jika tidak, kunci registri Run klasik digunakan (
HKCU\SOFTWARE\Microsoft\ Windows\CurrentVersion\Run;DeviceAssociationService;rastlsc.exe
).
Jika kode dropper dijalankan dengan hak administrator, ia mencoba menulis file yang tercantum di bawah ini ke folder
C:\Program Files\Symantec\Symantec Endpoint Protection\12.1.671.4971.104a\DeviceAssociationService\
, jika tidak, tuliskan ke folder
%APPDATA%\Symantec\Symantec Endpoint Protection\12.1.671.4971.104a\DeviceAssociationService\
:
-
rastlsc.exe
(SHA1:
2616da1697f7c764ee7fb558887a6a3279861fac
, salinan aplikasi yang sah Symantec Network Access Control,
dot1xtra.exe
)
-
SyLog.bin
(SHA1:
5689448b4b6260ec9c35f129df8b8f2622c66a45
, terenkripsi backdoor)
-
rastls.dll
(SHA1:
82e579bd49d69845133c9aa8585f8bd26736437b
, DLL jahat yang
rastlsc.exe
oleh
rastlsc.exe
)
Path bervariasi dari sampel ke sampel, tetapi tata letaknya sama. Bergantung pada haknya, malware membuang file di
%ProgramFiles%
atau
%appdata%
. Kami juga mengamati:
-
\Symantec\CNG Key Isolation\
-
\Symantec\Connected User Experiences and Telemetry\
-
\Symantec\DevQuery Background Discovery Broker Tasks\
Jalur ini digunakan oleh berbagai produk Symantec.
Setelah mencapai kegigihan dan mengimplementasikan file yang dapat dieksekusi, file yang sah,
rastlsc.exe
, dijalankan menggunakan
CreateProcessW
.
Kami juga mengamati versi (
{BB7BDEC9-B59D-492E-A4AF-4C7B1C9E646B}.dll
) yang mengeksekusi
rastlsc.exe
dengan parameter
krv
. Kami akan membahas lebih detail di bawah ini.
Komponen pintu belakang: isi rastlsc.exe
Tim OceanLotus menggunakan teknik lama dan terkenal di salah satu executable produk Symantec. Intinya adalah menggunakan proses memuat perpustakaan file .exe yang sah dan ditandatangani dengan menulis perpustakaan jahat ke folder yang sama. Ini akan membuat perilaku jahat terlihat sah saat tindakan ini dilakukan saat eksekusi tepercaya sedang berjalan.
Seperti disebutkan di atas, file
rastlsc.exe
sah
rastlsc.exe
ulang dan dieksekusi.
Itu mengimpor file
rastls.dll
, yang dalam hal ini memiliki konten berbahaya.
Gambar 7. Rastlsc.exe yang ditandatangani secara digital dari SymantecKami juga melihat isi menggunakan executable yang sah dan ditandatangani lainnya, termasuk
mcoemcpy.exe
dari McAfee, yang memuat
McUtil.dll
. Teknik ini sebelumnya digunakan oleh PlugX, yang menarik perhatian
Vietnam CERT (dalam bahasa Vietnam).
Tahap 1. Mengisi perpustakaan, rastls.dll
Nama internal file dll adalah
{7032F494-0562-4422-9C39-14230E095C52}.dll
, tetapi kami telah melihat versi lain, misalnya,
{5248F13C-85F0-42DF-860D-1723EEAA4F90}.dll
. Semua fungsi yang diekspor mengarah ke pelaksanaan fungsi yang sama.
Gambar 8. Semua ekspor rasltls.dll mengarah ke satu fungsiEkspor mencoba membaca file
SyLog.bin
terletak di folder yang sama. Versi lain telah mencoba untuk membuka file
OUTLFLTR.DAT
. Jika file ada, itu akan didekripsi menggunakan algoritma AES dalam mode CBC dengan kunci 256-bit yang dikodekan, dan kemudian data terkompresi yang diterima akan didekompresi (kompresi LZMA).
Varian
McUtil.dll
menggunakan teknik yang berbeda. Pada pandangan pertama, fungsi utama tidak melakukan apa pun yang berbahaya, tetapi sebenarnya ia menggantikan bagian
mcoemcpy.exe
file
mcoemcpy.exe
sah, file biner. Ini menghasilkan shellcode yang tugasnya memanggil fungsi untuk membaca shellcode terenkripsi dari tahap kedua dari file
mcscentr.adf
.
Kode pseudo berikut digunakan untuk membuat kode shell:
x = False i = 0
buff = genRandom()
opc1 = [0x58,0x59,0x5a,0x5b]
opc2 = [0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57]
opc3 = [0x90,0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,
0x49,0x4a,0x4b]
while i < len(buff):
currentChar = buff[i] if currentChar < 0xc8:
buff[i] = opc1[currentChar % len(opc1)]
else:
if x:
buff[i] = opc2[currentChar % len(opc2)]
else:
buff[i] = opc3[currentChar % len(opc3)] x = x == False
i+=1
Di bawah ini pada gambar Anda dapat melihat daftar hasil assembler:
Gambar 9. Shellcode yang dihasilkanLangkah 2–4. Shellcode, launcher dan shellcode lagi
{E1E4CBED-5690-4749-819D-24FB660DF55F}.dll
mendekripsi dan mengunduh
{E1E4CBED-5690-4749-819D-24FB660DF55F}.dll
. Perpustakaan memuat sumber daya dan mencoba memulai layanan DeviceAssociationService. Informasi yang didekripsi juga mengandung shellcode. Yang terakhir mendekripsi tahap terakhir: pintu belakang.
Varian
{92BA1818-0119-4F79-874E-E3BF79C355B8}.dll
memeriksa apakah
rastlsc.exe
dijalankan dengan
krv
sebagai parameter pertama. Jika demikian, tugas dibuat, dan
rastlsc.exe
dieksekusi lagi, tetapi tanpa parameter ini.
Tahap 5. Backdoor
{A96B020F-0000-466F-A96D-A91BBF8EAC96}.dll
Pertama, malware mencoba mengunduh sumber dayanya dan mendekripsi menggunakan algoritma RC4. Sumber daya yang dihasilkan berisi data yang digunakan untuk mengonfigurasi backdoor. Format konfigurasi tidak sulit ditemukan. Menggunakan kaitai struct dan damper strukturnya, kami mendapatkan yang berikut:
Gambar 10. Struktur konfigurasiCatatan : dengan pengecualian garis domain_encoding_str dan pustaka httpprov, data berubah dari sampel ke sampel. Kunci registri hampir sama, tetapi mereka memiliki skema serupa:
\HKCU\SOFTWARE\Classes\AppX[a-f0-9]{32}
, tidak ada yang luar biasa.
Program jahat menerima 10 byte pertama dari nama pengguna (UTF-16), mengkodekannya dengan string tiga huruf
mutex_encoding_str
di UTF-16 dan mengkodekannya dalam heksadesimal. Hasilnya digunakan sebagai nama mutex. Misalnya, untuk pengguna yang namanya dimulai dengan
abc
dan kunci dalam bentuk
vwx
, mutex akan menjadi
\Sessions\1\BaseNamedObjects\170015001b
.
Backdoor mencakup pemuat PE yang memuat pustaka
HTTPProv.dll
ke dalam memori, memanggil titik masuk, dan kemudian memanggil fungsi ekspor
CreateInstance
.
Komunikasi
Backdoor menggunakan protokol komunikasi TCP standar melalui port
25123
. Untuk mendapatkan alamat IP server, backdoor terlebih dahulu membuat kueri DNS tertentu.
Program jahat memilih salah satu dari tiga domain dari konfigurasi dan menambahkan subdomain khusus yang dihasilkan menggunakan dua nilai. Nilai pertama adalah nama komputer dalam panjang 16 byte. Yang kedua adalah ID versi empat byte. Kode Python 2 di bawah ini adalah algoritma pengkodean:
letters=domain_encoding_str # “ghijklmnop” hex_pc_name=pc_name.encode(“UTF-16LE”).encode(“hex”) s=''
for c in hex_pc_name:
if 0x2f < ord(c) < 0x3a:
s+=letters[ord(c) - 0x30]
else:
s+=c
Misalnya, jika nama komputer adalah
random-pc
, dan ID versi adalah 0x0a841523, maka domain berikut ini dihasilkan:
niggmhggmeggmkggmfggmdggidggngggmjgg.ijhlokga.dwarduong[.]com
Ekspresi reguler berikut dapat digunakan untuk memberi label server C&C dari backdoor ini:
[ghijklmnopabcdef]{4-60}\.[ghijklmnopabcdef]{8}\.[az]+\.[az]+
Jika alamat IP milik domain tertentu, malware mencoba membuat koneksi TCP melalui port
25123
. Setiap sampel memiliki tiga nama domain berbeda yang digunakan untuk menemukan server C&C.
Proses komunikasi dienkripsi melalui RC4 dan dikompresi menggunakan LZMA. Dimungkinkan untuk mendekripsi lalu lintas, karena kunci ditambahkan ke awal paket. Formatnya adalah sebagai berikut:
[ RC4 (4 )][ ]
Setiap byte kunci dihasilkan oleh fungsi
rand
. Setelah mendekripsi dan membongkar paket, data memiliki format berikut:
[dw:][dw:][dw: ][dw: ][dw:] [dw:]
Pertama kali klien terhubung ke server, UUID ditransmisikan, yang digunakan sebagai pengidentifikasi sesi. Yang terakhir disimpan dalam kunci registri sebagai data biner:
HKCU\SOFTWARE\Classes\ AppXc52346ec40fb4061ad96be0e6cb7d16a\DefaultIcon
Seperti yang kami katakan sebelumnya, pintu belakang juga berisi perpustakaan yang disebut
HTTPprov
. Ini digunakan sebagai cara alternatif untuk berkomunikasi dengan server. File DLL mengirimkan permintaan POST melalui HTTP. Ini juga mendukung HTTPS dan proksi menggunakan SOCKS5, SOCKS4a dan SOCKS4. Perpustakaan dihubungkan secara statis dengan
libcurl
.
Setelah inisialisasi, entri registri akan dibuat - perintah untuk pintu belakang untuk lebih lanjut menggunakan HTTP untuk berkomunikasi dengan server perintah:
HKCU\SOFTWARE\Classes\ CLSID{E3517E26-8E93-458D-A6DF-8030BC80528B}
.
Aplikasi klien standar digunakan:
Mozilla/4.0 ( ; MSIE 8.0; Windows NT 6.0; Trident/4.0)
.
Karakteristik utama perpustakaan ini adalah algoritma enkripsi khusus untuk pengidentifikasi sumber daya universal. Bagian sumber daya dari URI dibuat menggunakan pseudocode berikut:
buffEnd = ((DWORD)genRand(4) % 20) + 10 + buff; while (buff < buffEnd){
b=genRand(16);
if (b[0] - 0x50 > 0x50)
t=0;
else
*buf++= UPPER(vowels[b[1] % 5]);
v=consonants[b[1]%21]); if (!t)
v=UPPER(v);
*buff++= v;
if (v!='h' && b[2] - 0x50 < 0x50)
*buff++= 'h';
*buff++= vowels[b[4] % 5];
if (b[5] < 0x60)
*buff++= vowels[b[6] % 5];
*buff++= consonants[b[7] % 21];
if (b[8] < 0x50)
*buff++= vowels[b[9] % 5];
*buff++= '-';
};
*buff='\0';
Catatan : untuk kejelasan, bagian yang bertanggung jawab untuk memeriksa panjang string telah dihapus dari kode.
Untuk mendapatkan pengenal dari string yang dihasilkan, dua angka ditambahkan menggunakan algoritma verifikasi jumlah khusus:
checksum=crc32(buff)
num2=(checksum >> 16) + (checksum & 0xffff) * 2
num1=(num2 ^ 1) & 0xf
URL=GENERATED_DOMAIN+ “/” + num1 + “/” + num2 + “-” + buff
Menambahkan generator URI perpustakaan
HTTPprov
, kami mendapatkan URL berikut:
hXXp://niggmhggmeggmkggmfggmdggidggngggmjgg.ijhlokga.aisicoin[.]com/ 13/139756-Ses-Ufali-L
Tim
Setelah menerima pengidentifikasi sesi SESSIONID, pintu belakang membuat sidik jari sistem. Paket ini dibangun sebagai berikut (inden dalam paket - deskripsi):
0x000 - byte: nilai berubah di setiap versi
0x001 - 0x01: byte kode-keras
0x002 - bool: hak istimewa tinggi
0x003 - dword: ID versi
0x007 - string (UTF-16), nama komputer (maks. 0x20)
0x027 - string (UTF-16), nama pengguna
0x079 - hasil dari kueri registri di
HKLM\SOFTWARE\Microsoft\Windows NT\ CurrentVersion
Nilai
HKLM\SOFTWARE\Microsoft\Windows NT\ CurrentVersion
:
ProductName
,
CSDVersion
,
CurrentVersion
,
ReleaseId
,
CurrentBuildNumber
dan hasil dari panggilan
IsWow64Process (x86|x64)
0x179 - format selanjutnya dari string% s (% s); digantikan oleh (
GetVolumeInformationW:VolumeNameBuffer
),
VolumePathNames
0x279 - Disk fisik, kontrol I / O pada perangkat PhysicalDriveIOControl 0x2D1400 (IOCTL_STORAGE_QUERY_ PROPERTY) (VolSerialNumber)
0x379 -
wmi SELECT SerialNumber FROM Win32_BaseBoard
0x3f9 - Dapatkan tanggal dan waktu saat ini GetSystemTimeAsFileTime
0x400 - bool: tidak diketahui
0x401 - dword: diterima setelah mendekripsi sumber
Berikut adalah contoh sidik jari sistem:
Gambar 11. Sidik jari sistemIni adalah backdoor lengkap yang menyediakan operator dengan sejumlah fitur: memanipulasi file, registri dan proses, mengunduh komponen tambahan, memperoleh sidik jari digital dari sistem. Di bawah ini adalah angka dan deskripsi dari perintah yang didukung:
0 - sidik jari digital
1 - mengatur ID sesi
2 - membuat proses dan mendapatkan hasil (menggunakan saluran program)
3 - mengatur penghitung upaya koneksi
4 - menunda waktu pemungutan suara
5 - membaca file atau kunci registri dan mempertimbangkan MD5
6 - membuat proses
7 - membuat file, entri registri, atau streaming dalam memori
8 - menulis ke registri
9 - polling registri
10 - mencari file dalam sistem
11 - mentransfer file ke direktori lain
12 - menghapus file dari disk
13 - mendapatkan daftar disk yang ditandai dalam sistem menggunakan fungsi
GetLogicalDriveStringW
14 - membuat direktori
15 - menghapus direktori
16 - membaca file dari offset
17 - memanggil loader PE (beralih ke komunikasi melalui
HTTPprov
)
18 - [tidak diketahui]
19 - 0: polling nilai dalam registri; 1: implementasi dan implementasi program
20 - mengatur variabel lingkungan
21 - meluncurkan shellcode di utas baru
22 - mengembalikan variabel lingkungan
23 dalam versi baru - restart sendiri jika variabel lingkungan APPL tidak ada
Kesimpulan
OceanLotus tetap sangat aktif dan terus memperbarui toolkit.
Kelompok ini berupaya menyembunyikan kegiatannya, untuk ini para penyerang dengan hati-hati memilih para korban, membatasi penyebaran malware, menggunakan beberapa server agar tidak menarik perhatian ke domain atau alamat IP yang sama. Dekripsi komponen yang diimplementasikan dan teknik pemuatan samping, meskipun popularitasnya luas, memungkinkan untuk menghindari deteksi, karena pekerjaan penyerang dalam kasus ini disamarkan sebagai aplikasi yang sah.
Indikator Kompromi (IoC)
Sampel
Tabel 1: pipet

Tabel 2: Perpustakaan

Jaringan
Alamat IP
46.183.220.81
46.183.220.82
46.183.222.82
46.183.222.83
46.183.222.84
46.183.223.106
46.183.223.107
74.121.190.130
74.121.190.150
79.143.87.230