ESET telah menyiapkan spyware InvisiMole sejak 2013

Melacak korban peringkat tinggi dengan tetap berada di tempat teduh. Ini adalah prinsip pengoperasian dua komponen berbahaya InvisiMole. Mereka mengubah komputer yang terinfeksi menjadi kamera video penyerang, yang memungkinkan Anda untuk melihat dan mendengar segala sesuatu yang terjadi di kantor atau di tempat lain di mana perangkat berada. Operator InvisiMole mudah terhubung ke sistem, memantau tindakan korban dan mencuri rahasianya.


Menurut telemetri ESET, para penyerang di balik spyware ini telah aktif sejak setidaknya 2013. Namun, alat spionase maya ini tidak hanya tidak dipelajari, tetapi tidak terdeteksi hingga terdeteksi oleh produk ESET pada komputer yang terinfeksi di Rusia dan Ukraina.

Kampanye ini sangat bertarget, yang menjelaskan tingkat infeksi yang rendah - hanya beberapa komputer.

InvisiMole memiliki arsitektur modular, memulai perjalanannya dengan pembungkus DLL (wrapper DLL), kemudian ada dua modul yang dibangun menjadi sumber dayanya. Kedua modul adalah backdoor multifungsi, yang memungkinkan Malvari untuk mengumpulkan informasi maksimum tentang target.

Untuk mengalihkan perhatian pengguna dari mesin yang terinfeksi, langkah-langkah tambahan diterapkan. Ini memungkinkan program jahat tetap berada di sistem untuk waktu yang lama. Kami belum menetapkan vektor infeksi - saat ini semua opsi dimungkinkan, termasuk instalasi manual dengan akses fisik ke mesin.

Instalasi dan Kegigihan


Bagian pertama dari malvari yang sedang diselidiki adalah pembungkus DLL yang dikompilasi menggunakan Free Pascal Compiler. Menurut data telemetri kami, DLL ditempatkan di folder Windows dan menyamar sebagai mpr.dll pustaka mpr.dll sah dengan informasi versi palsu.


Gambar 1. Pembungkus DLL yang disamarkan sebagai file pustaka mpr.dll yang sah, menyalin informasi nama dan versi

Kami tidak melihat sampel dengan nama pembungkus lain, meskipun ada indikasi dalam kode DLL bahwa file tersebut juga dapat disebut fxsst.dll atau winmm.dll .

Cara pertama untuk meluncurkan malvari adalah teknik mengganti DLL (pembajakan DLL). Pembungkus DLL ditempatkan di folder yang sama dengan explorer.exe dan dimuat pada startup Windows bersama dengan proses Windows Explorer bukannya perpustakaan yang sah yang terletak di %windir%\system32 .

Kami menemukan Malvari versi 32 dan 64-bit, yang memberikan ketekunan dalam kedua arsitektur.

Sebagai alternatif untuk menipu DLL, pemuatan dan metode kegigihan lainnya dimungkinkan. DLL wrapper mengekspor fungsi GetDataLength . Saat memanggil fungsi ini, DLL memeriksa untuk melihat apakah itu dimuat oleh proses rundll32.exe menggunakan explorer.exe atau svchost.exe sebagai proses induk, dan hanya kemudian meluncurkan payload. Ini menyarankan metode lain yang mungkin untuk memastikan ketekunan - menambahkan tugas ke penjadwal (proses induk adalah svchost.exe ) atau menulis ke kunci autorun di registri (proses induknya adalah explorer.exe ).

Terlepas dari bagaimana kegigihan dipertahankan, perilaku malware dan payload itu sendiri sama dalam semua kasus. RC2FM DLL memuat modul yang disimpan dalam sumber daya dengan nama RC2FM dan RC2CL , dan (jika substitusi DLL digunakan) pustaka yang sah ke dalam proses explorer.exe agar tidak mengganggu operasi normal aplikasi dan tidak diperhatikan.


Gambar 2. Fungsi wrapper yang diekspor

Analisis teknis


Tanggal pasti kompilasi malware tidak diketahui - sampel pembungkus DLL terbaru diubah oleh penulis, stempel waktu PE diatur ulang ke nol secara manual. Namun, dalam perjalanan penelitian, kami menemukan versi sebelumnya bertanggal 13 Oktober 2013, sehingga versi-versi baru tersebut dikompilasi dengan jelas nanti.


Gambar 3. Dalam semua sampel kemudian, cap waktu diatur ke nol

Enkripsi dan dekripsi


Untuk menyamarkan diri mereka dari analis virus dan administrator sistem, penulis program jahat menggunakan enkripsi string, file internal, data konfigurasi, dan komunikasi jaringan. Sementara modul RC2FM menggunakan cipher kustom, pembungkus DLL dan modul RC2CL menggunakan satu prosedur khusus untuk semua tujuan, termasuk mendekripsi modul berbahaya lainnya yang dibangun ke dalam pembungkus DLL.

Skrip yang dengannya Anda dapat mengekstrak RC2CL dan RC2CL built-in dari pembungkus DLL tersedia di repositori ESET di GitHub .


Gambar 4. Prosedur dekripsi dalam berbagai sampel (didekompilasi dan dibongkar)

Modul RC2FM


Modul RC2FM pertama yang lebih kecil berisi backdoor yang mendukung 15 perintah. Mereka dieksekusi di komputer yang terinfeksi seperti yang diarahkan oleh penyerang. Modul ini dapat membuat berbagai perubahan pada sistem, dan juga termasuk alat untuk spionase cyber.

File-file tersebut memiliki opsi logging, tetapi nama log sistem tidak ditentukan dalam sampel. Ini menunjukkan bahwa fungsi tersebut hanya digunakan pada tahap pengembangan.

Komunikasi jaringan


Modul ini berkomunikasi dengan server C&C, yang dimasukkan ke dalam hardcode dalam sampel atau ditambahkan oleh penyerang.

Selain itu, modul ini dapat mengakses server C&C bahkan dengan proxy yang dikonfigurasi pada mesin yang terinfeksi. Jika koneksi langsung tidak dapat dibangun, modul mencoba untuk terhubung ke server C&C-nya menggunakan proxy yang dikonfigurasi secara lokal atau proxy yang dikonfigurasi untuk browser yang berbeda (Firefox, Pale Moon dan Opera).
RC2FM bahkan dapat memeriksa daftar aplikasi yang baru saja digunakan dan mencoba menemukan executable browser portabel:

FirefoxPortable.exe
OperaPortable.exe
Jalankan waterfox.exe
OperaAC.exe
Palemoon-Portable.exe

Jika korban menggunakan salah satu browser portabel ini dengan server proxy yang dikonfigurasikan , malware dapat mendeteksinya dalam pengaturan pengguna dan menggunakannya untuk berkomunikasi dengan server C&C-nya.

Komunikasi dengan server C&C adalah serangkaian permintaan GET dan POST HTTP, seperti yang ditunjukkan pada Gambar 5. Permintaan terenkripsi berisi ID PC dan cap waktu, serta beberapa informasi lain (opsional). Penting untuk dicatat bahwa modul RC2FM menggunakan beberapa metode enkripsi (varian enkripsi XOR sederhana), tidak seperti komponen InvisiMole lainnya.


Gambar 5. Contoh permintaan yang dikirim ke server C&C oleh modul RC2FM

Setelah pendaftaran sukses korban di server C&C, informasi tambahan dimuat ke dalam sistem, yang akan ditafsirkan oleh perintah backdoor.

Fungsionalitas


RC2FM mendukung perintah untuk mendaftar informasi sistem dasar dan membuat perubahan sederhana pada sistem, serta beberapa fitur spyware. Atas permintaan penyerang, modul tersebut dapat menyalakan mikrofon dari jarak jauh pada komputer yang rusak dan merekam audio. Catatan ini dikodekan dalam format MP3 menggunakan lame.dll library yang sah, yang diunduh dan digunakan oleh malware.

Alat lain untuk mencuri data adalah tangkapan layar. Salah satu perintah backdoor dirancang untuk mengambil tangkapan layar.

Program jahat memonitor semua disk internal dan eksternal yang ditampilkan pada sistem lokal. Ketika drive baru terhubung, itu membuat daftar dengan semua file dan menyimpannya dalam bentuk terenkripsi.

Informasi yang dikumpulkan akan dikirim ke penyerang setelah mengirim perintah yang sesuai.

Tim pintu belakang


Berikut ini adalah ID dan deskripsi dari perintah yang didukung. Visualisasi fungsi backdoor pada juru bahasa ditunjukkan pada Gambar 6.

0 - Buat daftar disk yang ditampilkan, file dalam folder, jaringan berbagi
2 - Membuat, memindahkan, mengganti nama, mengeksekusi atau menghapus file, menghapus direktori menggunakan jalur yang ditentukan
4 - Buka file, atur pointer ke awal file
5 - Tutup file yang sebelumnya dibuka
6 - Tulis data ke file yang sebelumnya dibuka
7 - Mengubah atribut file waktu / menghapus file
8 - Buka file, atur pointer ke akhir file
10 - Mengubah atribut file waktu / menghapus file
12 - Temukan file dengan mask file yang ditentukan di direktori yang ditentukan
13 - Ambil tangkapan layar
14 - Unggah atau modifikasi file menggunakan data internal
15 - Rekam suara menggunakan perangkat audio yang terhubung, buat daftar perangkat yang tersedia, kirim rekaman, ubah konfigurasi
16 - Periksa file yang terbuka di modul
17 - Perbarui daftar server C & C
19 - Membuat, menginstal, menyalin, mendaftar, atau menghapus kunci atau nilai registri yang ditentukan


Gambar 6. Fungsi backdoor di interpreter (asli dan setelah analisis kami, dimodifikasi menggunakan fungsi Group Nodes di IDA Pro untuk keterbacaan)

Modul RC2CL


Modul RC2CL juga merupakan pintu belakang dengan berbagai alat spionase. Ini diluncurkan oleh pembungkus DLL pada saat yang sama dengan modul RC2FM . Ini adalah modul yang lebih kompleks, fungsinya lebih cenderung ditujukan pada pengumpulan informasi maksimum daripada membuat perubahan pada sistem.

Menariknya, modul RC2CL memiliki opsi untuk mematikan fungsi backdoor dan bekerja sebagai proxy. Dalam hal ini, malware mematikan firewall Windows dan membuat server yang mendukung komunikasi antara klien dan server C&C atau dua klien.

Komunikasi jaringan


Malware berkomunikasi dengan server C&C melalui soket TCP. Pesan yang dikirim oleh klien ditutupi di bawah protokol HTTP, tetapi Anda harus memperhatikan metode HTTP yang tidak valid "HIDE" pada contoh pada Gambar 7.

Permintaan tersebut berisi pengidentifikasi perangkat lunak yang dikompromikan, jenis permintaan, dan informasi terenkripsi yang harus dikirim oleh penyerang, yaitu, hasil dari mengeksekusi perintah backdoor atau permintaan untuk instruksi baru.


Gambar 7. Contoh permintaan yang dikirim ke server perintah oleh modul RC2CL

Fungsionalitas


Tergantung pada perintah yang diterima, backdoor dapat melakukan berbagai operasi pada sistem yang terinfeksi. Backdoors biasa melakukan manipulasi dengan sistem file dan kunci registri, mendukung eksekusi file, dan aktivasi shell jarak jauh. Spivar ini mendukung semua tim ini dan bahkan lebih - 84 tim memungkinkan penyerang mengumpulkan informasi komprehensif tentang korban.

Program jahat memindai komputer yang terinfeksi dan mentransfer berbagai data ke penyerang: informasi sistem (daftar proses aktif, menjalankan layanan, driver yang dimuat atau disk yang tersedia), informasi jaringan (tabel alamat IP, kecepatan koneksi Internet).

InvisiMole dapat memindai jaringan nirkabel yang tersedia pada sistem yang dikompromikan. Spivar mencatat informasi seperti alamat SSID dan MAC dari titik akses Wi-Fi yang terdeteksi. Data ini kemudian dapat diverifikasi dengan database publik, yang memungkinkan penyerang untuk melacak geolokasi korban.

Perintah lain memberikan informasi tentang pengguna mesin yang dikompromikan, akun mereka dan sesi sebelumnya.

Yang menarik adalah perangkat lunak yang diinstal pada mesin yang dikompromikan. Program apa yang diinstal di sistem? Manakah dari mereka yang secara otomatis mulai pada startup sistem atau login pengguna? Program apa yang digunakan pengguna tertentu? Jika penyerang tertarik pada sesuatu, cukup masukkan satu perintah untuk mendapatkan data yang diperlukan.

Malware dapat memperoleh perintah untuk mencari dokumen yang baru dibuka dan file menarik lainnya. Itu dapat melihat direktori tertentu dan perangkat eksternal, melaporkan perubahan dan mengekstrak file yang dipilih oleh penyerang.

Malware dapat menghidupkan atau mematikan sistem manajemen akun (UAC), atau memotongnya dan bekerja dengan file dalam direktori yang dilindungi tanpa hak administrator (lebih lanjut tentang tautan ). Jika malware tersebut berjalan di bawah proses explorer.exe , yang secara otomatis mendapatkan hak yang ditinggikan, ia dapat membuat objek COM dan menggunakannya untuk menghapus dan memindahkan file di area yang memerlukan hak administrator.

Selain itu, InvisiMole dapat menyalakan webcam dan mikrofon korban dari jarak jauh, memata-matai dengan mengambil gambar atau merekam suara. Penyerang dapat memantau aktivitas pada perangkat dengan mengambil tangkapan layar. Yang sangat menarik, InvisiMole memungkinkan Anda mengambil tangkapan layar tidak hanya seluruh layar, tetapi juga setiap jendela yang terbuka. Ini memungkinkan penyerang untuk mengumpulkan informasi bahkan ketika windows saling menutup.

Salah satu perintah backdoor memungkinkan Anda untuk mengganti konten driver dengan nama-nama berikut:

blbdrive.sys
compbatt.sys
secdrv.sys


Kami tidak mengamati penggunaan perintah ini oleh penyerang, tetapi kami dapat mengasumsikan bahwa perintah ini digunakan untuk memberikan ketekunan tambahan pada sistem 32-bit.

Backdoor dapat mengganggu sistem (misalnya, masuk sebagai pengguna, menyelesaikan proses atau mematikan sistem), tetapi terutama menyediakan operasi pasif. Program mencoba menyembunyikan aktivitasnya jika memungkinkan.

Jadi, spivar menjelajahi tempat-tempat menarik dalam sistem, mempelajari dokumen yang baru dibuka atau mengubah beberapa file. Tindakan ini meninggalkan jejak dan dapat menyebabkan kecurigaan terhadap korban, karena setelah setiap operasi tersebut waktu modifikasi terakhir dari file dan / atau akses ke sana berubah. Untuk mencegah deteksi, malware memulihkan tanggal perubahan atau pembukaan file sebelumnya untuk menyembunyikan manipulasinya dari pengguna.

Contoh lain tentang bagaimana penulis spayvari mencoba menghindari deteksi bekerja dengan jejak yang tertinggal di disk. Program jahat mengumpulkan sejumlah besar data rahasia yang disimpan dalam file selama beberapa waktu dan dihapus setelah berhasil mengunggah ke server C&C. Masalahnya adalah administrator sistem yang berpengalaman dapat memulihkan file yang dihapus, yang akan membantu dalam menyelidiki serangan setelah korban mengetahui tentang kompromi. Ini dimungkinkan karena beberapa informasi tetap ada di disk bahkan setelah menghapus file. Untuk mencegah hal ini, InvisiMole memiliki opsi untuk menghapus semua file dengan aman. Ini berarti bahwa data yang pertama ditimpa dengan nol atau byte acak, dan hanya setelah itu file dihapus.

Memori internal


Konfigurasi backdoor dan data yang dikumpulkan disimpan di dua alamat - ini adalah direktori kerja dan kunci registri. Sebagian besar perintah backdoor dirancang untuk memanipulasi lokasi penyimpanan data ini dan kontennya.

Lokasi direktori kerja ditentukan menggunakan perintah dari server jauh. Direktori ini digunakan sebagai penyimpanan sementara file yang berisi informasi yang dikumpulkan dari komputer yang dikompromikan. File-file ini memiliki metode penamaan yang umum, algoritma dan struktur enkripsi. Mereka dienkripsi dengan versi sederhana dari cipher XOR, yang digunakan dalam komponen malvari. Jenis file dapat diperoleh dari urutan kontrol 4-byte yang terletak di awal file.

Selain menyimpan data yang dikumpulkan, direktori ini digunakan sebagai direktori home untuk salinan aplikasi WinRAR.exe yang sah. Malvar menyalinnya dan menggunakannya untuk mengarsipkan data yang dicuri.

Registri menyimpan data konfigurasi, serta daftar file di direktori kerja. Data dikemas menggunakan prosedur Zlib yang diimplementasikan dalam malvari file biner, dan dienkripsi menggunakan cipher yang sama dengan file internal.



Tim pintu belakang


Lebih dari delapan puluh perintah backdoor menggunakan direktori kerja dan kunci registri untuk menyimpan hasil antara dan data konfigurasi. Grafik dengan pintu belakang dalam juru bahasa ditunjukkan pada Gambar 8.

Sekitar sepertiga dari semua perintah terkait dengan membaca dan memperbarui data konfigurasi yang disimpan dalam registri. ID dan deskripsi perintah yang tersisa tercantum di bawah ini.

4 - Buat daftar informasi file di direktori
6 - Unduh file
20 - Daftar proses aktif
22 - Akhiri proses dengan ID
24 - Jalankan file
26 - Hapus file
28 - Dapatkan Tabel Penerusan IP
30 - Menulis data ke file
31 - Tidak ada tindakan
38 - Buat daftar akun
40 - Buat daftar layanan dalam sistem
42 - Buat daftar driver yang dimuat
43 - Kumpulkan informasi sistem dasar (nama komputer, versi OS, status memori, waktu setempat, informasi disk, informasi tentang proxy yang dikonfigurasi, kebijakan pencegahan eksekusi data saat ini untuk sistem dan proses, dll.)
44 - Buat daftar perangkat lunak yang diinstal
46 - Daftar pengguna lokal dan informasi sesi
48 - Buat daftar aplikasi yang digunakan oleh pengguna
52 - Buat struktur direktori
78 - Buat Remote Shell
81 - Jalankan perintah melalui shell jarak jauh
91 - Mengaktifkan / Menonaktifkan Kontrol Akun Pengguna
93 - Sesi pengguna akhir / shut down / restart sistem
101 - Lacak dan rekam perubahan ke direktori yang ditentukan
103 - Hapus direktori
109 - Nyalakan / matikan monitor / aktifkan siaga
120 - Ambil tangkapan layar tampilan / jendela aktif
126 - Ambil tangkapan layar tampilan / jendela aktif dan perbarui data konfigurasi
130 - Daftar informasi sumber daya pada disk yang tidak terisi
132 - Ubah nama / pindahkan file, ubah waktu pembuatan / pembukaan / penulisan file ke yang ditentukan
134 - Daftar file yang baru dibuka
152 - Putuskan sambungan (sebelumnya terhubung) drive yang dapat dilepas
155 - Membuat / menghapus kunci registri, mengatur / menghapus nilai kunci registri, atau mendaftar nilai / kunci / data registri
159, 161 - Matikan routing / firewall, buat server proxy pada port tertentu
172 - Ulangi kotak dialog yang meminta untuk me-restart komputer
175 - Lewati kontrol akun pengguna untuk manipulasi file
177 - Membuat dan menulis file, mengatur data pada saat pembuatan / pembukaan / perubahan
181 - Hapus semua titik pengembalian sistem
183 - Reset komponen (sah) dari aplikasi WinRAR
185 - Tambahkan file ke arsip yang dilindungi kata sandi (password = "12KsNh92Dwd")
187 - Dekripsi, unzip dan muat DLL, muat file exe dari RC2CL, sumber daya RC2FM
189 - Buat titik pemulihan sistem
191 - Ekstrak arsip yang dilindungi kata sandi (12KsNh92Dwd)
193 - Ubah file terenkripsi
195 - Restart setelah selesainya proses utama
197 - Kirim 198 byte data hard-kode dalam suatu pola
199 - Ganti nama / pindahkan file
206 - Dekripsi, unzip dan unduh DLL, muat file exe dari RC2CL, sumber daya RC2FM
211 - Unduh informasi yang dikumpulkan (tangkapan layar, rekaman audio, dll.)
213 - Buat daftar windows yang aktif
218 - API untuk merekam audio dari perangkat input
220 - API untuk mengambil foto dari webcam
224 - Buat daftar file yang dijalankan pada setiap startup sistem
226 - Buat daftar jaringan nirkabel yang diaktifkan (alamat MAC, SSID, interval pensinyalan)
228 - Reset paket Zlib terkompresi


Gambar 8. Fungsi backdoor di interpreter (asli dan dimodifikasi menggunakan fungsi Group Nodes di IDA Pro untuk keterbacaan)

Kesimpulan


InvisiMole adalah perangkat lunak spyware berfitur lengkap yang menawarkan fitur luas yang dapat bersaing dengan alat spionase maya terkenal lainnya.

Kita hanya bisa menebak mengapa penulis menggunakan dua modul dengan fungsi duplikat.Dapat diasumsikan bahwa modul yang lebih kecil ,, RC2FMdigunakan pada tahap pertama pengintaian, dan yang lebih besar, RC2CLberjalan hanya pada mesin yang menarik minat operator. Namun tidak demikian - dua modul diluncurkan secara bersamaan. Penjelasan kedua yang mungkin: modul-modul tersebut dirakit oleh penulis yang berbeda dan kemudian dikombinasikan untuk memberikan alat yang maksimal kepada operator.

InvisiMole hanya menggunakan beberapa teknik untuk menghindari deteksi dan analisis. Namun, karena spyware digunakan dalam serangan terhadap sejumlah kecil target berpangkat tinggi, dia berhasil menghindari deteksi setidaknya selama lima tahun.

Indikator Kompromi (IoC)


Deteksi ESET


Win32/InvisiMole.A trojan
Win32/InvisiMole.B trojan
Win32/InvisiMole.C trojan
Win32/InvisiMole.D trojan
Win64/InvisiMole.B trojan
Win64/InvisiMole.C trojan
Win64/InvisiMole.D trojan


Hash SHA-1


5EE6E0410052029EAFA10D1669AE3AA04B508BF9
2FCC87AB226F4A1CC713B13A12421468C82CD586
B6BA65A48FFEB800C29822265190B8EAEA3935B1
C8C4B6BCB4B583BA69663EC3AED8E1E01F310F9F
A5A20BC333F22FD89C34A532680173CBCD287FF8


Nama Domain C & C Server


activationstate.sytes[.]net
advstatecheck.sytes[.]net
akamai.sytes[.]net
statbfnl.sytes[.]net
updchecking.sytes[.]net


Alamat IP server C&C dan periode aktivitas


2013-2014 - 46.165.231.85
2013-2014 - 213.239.220.41
2014-2017 - 46.165.241.129
2014-2016 - 46.165.241.153
2014-2018 - 78.46.35.74
2016-2016 - 95.215.111.109
2016-2018 - 185.118.66.163
2017-2017 - 185.118.67.233
2017-2018 - 185.156.173.92
2018-2018 - 46.165.230.241
2018-2018 - 194.187.249.157



RC2FM


[HKEY_CURRENT_USER\Software\Microsoft\IE\Cache]
"Index"


RC2CL


[HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Console]
or [HKEY_CURRENT_USER\Software\Microsoft\Direct3D]
"Settings"
"Type"
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\OLE]
or [HKEY_CURRENT_USER\Software\Microsoft\Direct3D]
"Common"
"Current"
"ENC"
"FFLT"
"Flag1"
"FlagLF"
"FlagLF2"
"IfData"
"INFO"
"InstallA"
"InstallB"
"LegacyImpersonationNumber"
"LM"
"MachineAccessStateData"
"MachineState 0"
"RPT"
"SP2"
"SP3"
"SettingsMC"
"SettingsSR1"
"SettingsSR2"



RC2FM


%APPDATA%\Microsoft\Internet Explorer\Cache\AMB6HER8\
%volumeSerialNumber%.dat
content.dat
cache.dat
index.dat
%APPDATA%\Microsoft\Internet Explorer\Cache\MX0ROSB1\
content.dat
index.dat
%random%.%ext%
%APPDATA%\Microsoft\Internet Explorer\Cache\index0.dat


RC2CL


Winrar\
comment.txt
descript.ion
Default.SFX
WinRAR.exe
main.ico
fl_%timestamp%\strcn%num%\
fdata.dat
index.dat
~mrc_%random%.tmp
~src_%random%.tmp
~wbc_%random%.tmp
sc\~sc%random%.tmp
~zlp\zdf_%random%.data
~lcf\tfl_%random%

Source: https://habr.com/ru/post/id414419/


All Articles