Artikel kedua berdasarkan hasil kinerja tim kami di OFFZONE-2018. Kali ini, pertimbangkan pembicaraan dengan MainTrack “Windows DPAPI“ Sekretiki ”atau DPAPI untuk pentester”.
Perhatian! Banyak beech!
Saat melakukan kampanye RedTeam, saya ingin memberikan lebih sedikit alasan untuk reaksi BlueTeam, tetapi bisa ada banyak. Misalnya, menjalankan mimikatz untuk mendapatkan kata sandi atau sertifikat pengguna. Bahkan jika kami dapat "otmazyvat" dari Kaspersky, BlueTeam memiliki kemampuan untuk melacak menggunakan alat khusus seperti Sysmon, Microsoft ATA, dll. Pada saat yang sama, saya ingin mendapatkan informasi maksimum dari mesin pengguna yang dikompromikan. Dalam perjalanan kampanye yang dilakukan berulang kali oleh RedTeam untuk melawan tim BlueTeam yang sebenarnya, kami sampai pada kesimpulan bahwa perlu untuk menghindari tindakan yang dapat berfungsi sebagai indikator kompromi sistem. Untuk mencapai tujuan ini dimungkinkan melalui penggunaan mekanisme dan tindakan hukum yang disediakan oleh sistem operasi untuk pengguna.
Salah satu alat hukum tersebut adalah mekanisme DPAPI (Windows Data Protection API), yang digunakan oleh sistem operasi dan berbagai aplikasi untuk mengenkripsi data pengguna yang sensitif (terutama kata sandi, kunci kriptografi, dll.) Untuk pengguna akhir dan aplikasinya, DPAPI terlihat sangat sederhana : Hanya ada 2 fungsi - "mengenkripsi data" dan "mendekripsi data". Dalam artikel ini saya ingin mempertimbangkan bagaimana mekanisme seperti itu berguna untuk pentester selama kampanye RedTeam.
Apa itu DPAPI? Hanya sebentar dan dalam bahasa Rusia
Sejak tahun 2000, semua OS Windows telah mulai menggunakan mesin DPAPI untuk menjaga data pengguna tetap aman.
Jika kita melewatkan semua kriptografi yang kami periksa dalam laporan, untuk mendekripsi data yang dienkripsi melalui DPAPI, kita perlu: kunci master, SID pengguna, hash kata sandi pengguna, dan gumpalan DPAPI itu sendiri (data DPAPI terenkripsi).
Secara umum, prosesnya terlihat seperti ini:

Di dalam "topi kriptografi" kami, ada banyak mekanisme kripto berbeda yang tidak akan kami pertimbangkan dalam artikel ini, agar tidak membebani pembaca. Kami hanya mencatat bahwa bagian utama DPAPI adalah yang disebut Masterkey (master key). Secara sederhana, kunci master adalah 64 byte data acak yang dienkripsi menggunakan prekey, yang dihasilkan dari kata sandi pengguna dan SID-nya.

Parameter tambahan juga mengambil bagian dalam generasi prekey: jumlah iterasi (IterN), garam dan HMAC, yang dapat bervariasi dari kasus ke kasus. Nilai-nilai parameter ini disimpan bersama dengan kunci utama dalam satu file.
Dengan demikian, mengetahui kata sandi pengguna, SID-nya dan membaca parameter pembuatan dari file kunci utama (HMAC, Salt, InterN), kita dapat menghasilkan prekey dan mendekripsi kunci utama, yaitu. dapatkan 64 byte yang sangat acak yang akan kita gunakan untuk mendekripsi gumpalan DPAPI.
Bagaimana jika saya mengubah kata sandi saya?
Biasanya, kata sandi pengguna berubah secara berkala. Apa yang terjadi jika pengguna mengubah kata sandi? Kemana perginya yang sebelumnya? Memang, untuk mendekripsi kunci master, Anda perlu mengetahui kata sandi pengguna, dan memasukkan kembali semua kunci master pengguna setiap kali terlalu mahal. Dalam hal ini, semuanya dipikirkan di Windows.
Ada file khusus (CREDHIST), tugasnya adalah menyimpan semua kata sandi pengguna sebelumnya. Itu juga dienkripsi dengan kata sandi pengguna saat ini dan disimpan di tumpukan. Jika sistem tiba-tiba gagal mendekripsi kunci master, maka ia melanjutkan sebagai berikut: menggunakan kata sandi saat ini, ia mendekripsi catatan pertama dalam CREDHIST. Kata sandi mencoba mendekripsi kunci master lagi, dan seterusnya hingga kata sandi dalam rantai habis atau kunci master didekripsi.
Sedikit tentang kunci pribadi pengontrol domain
Seperti yang mungkin sudah Anda duga, DPAPI diterapkan untuk semua pengguna, termasuk pengguna domain. Agar dapat mengatur ulang kata sandi kepada pengguna yang berhasil melupakannya setelah pesta Jumat malam, Anda memerlukan kunci cadangan yang akan disimpan di tempat yang aman. Menurut Microsoft, tempat yang dapat diandalkan adalah pengontrol domain.
Inti dari mekanisme untuk mendekripsi kunci master setelah mengatur ulang kata sandi pengguna adalah sebagai berikut: sepasang kunci RSA - pribadi dan publik - dibuat pada pengontrol domain. Kunci pribadi disimpan pada pengontrol domain di basis data NTDS dan disebut BCKUPKEY_xxxx (lihat gambar di bawah), dan kunci publik didistribusikan ke semua sistem domain dan digunakan untuk membuat duplikat kunci master saat dihasilkan.
Setelah membuat kunci utama pada mesin domain, duplikatnya juga dibuat (atau lebih tepatnya, materi kunci utama adalah 64 byte), yang disimpan bersama dengan kunci master utama dalam satu file dan disebut Domain Key. Jika Anda kehilangan kunci master utama, mis. ketika mengatur ulang kata sandi pengguna, sistem mengirimkan duplikatnya ke pengontrol domain dan meminta untuk mendekripsi. Kontroler, setelah mengotorisasi pengguna, mendekripsi duplikat dan mengembalikannya ke sistem, setelah itu materi kunci utama sudah dienkripsi ulang dengan kata sandi baru.

Memiliki hak istimewa yang sesuai dalam domain (paling sering admin), Anda bisa mendapatkan kunci RSA pribadi ini dari pengontrol domain melalui mekanisme replikasi dan menggunakannya untuk dekripsi lebih lanjut dari kunci master yang dibuat pada mesin domain. Ini dapat dilakukan dengan menggunakan mimikatz atau DSInternals. Anda dapat membaca lebih lanjut tentang ini di mimikatz wiki atau blog
DSInternals .
Di mana kunci master disimpan dan apa itu?
Kunci master dapat berupa pengguna dan sistem, tergantung pada rahasia siapa yang dienkripsi. Kunci master pengguna disimpan dalam profil pengguna dengan cara berikut:
Users\%USER%\AppData\Roaming\Microsoft\Protect\%SID%\
Untuk berjaga-jaga, sistem menyimpan semua kunci utama yang pernah digunakan oleh pengguna. Lagipula, dia tidak tahu sebelumnya master mana yang perlu mendekripsi sesuatu dengan kunci. GUID dari kunci saat ini yang digunakan disimpan dalam file yang dipilih.

Kunci master sistem disimpan dengan cara berikut:
windows\system32\Microsoft\Protect\S-1-5-18\
Demikian pula dengan pengguna - satu kunci master digunakan, nama yang dapat ditemukan dalam file yang dipilih, di mana semua kunci yang pernah digunakan disimpan.

Nah, apa yang bisa diberikan DPAPI ini pada Pentester?
Karena DPAPI adalah mekanisme yang legal dan sederhana, berbagai aplikasi mencoba menggunakannya. Karena nyaman dan aman. Untuk saat ini, tentu saja.
Misalnya, DPAPI digunakan untuk mengenkripsi kunci pribadi dari klien dan sertifikat sistem, kunci WIFI, Chrome (cookie, kata sandi), DropBox, Skype, RSA SecurID (aplikasi perangkat lunak yang menghasilkan kunci satu kali). Dan ini bukan daftar lengkap.
Tugas pentester adalah mendekripsi gumpalan yang diperlukan dan mendapatkan kata sandi, cookie, dll.
Ada beberapa cara untuk melakukan ini. Dengan satu atau lain cara, semuanya bermuara pada dua transkrip - online dan offline. Dekripsi online adalah ketika pada mesin pengguna, kami cukup memanggil fungsi sistem untuk mendekripsi data dan meneruskan gumpalan DPAPI ke input, dan sistem melakukan semuanya dengan sendirinya - ia mencari kunci master yang digunakan untuk mengacak gumpalan, mendekripsi menggunakan SID pengguna dan hash kata sandi yang disimpan dalam memori LSASS.
Gambar di bawah ini menunjukkan contoh memanggil fungsi DPAPI untuk enkripsi dan dekripsi pada PowerShell.

Pertama, kami mengenkripsi rahasia kami (dalam hal ini, kata "Kata Sandi") dengan memanggil fungsi [Security.Cryptography.ProtectedData] :: Protect (). Dan kami melakukan ini dua kali - dalam kasus pertama menggunakan kunci master pengguna (parameter CurrentUser), dan yang kedua - kunci sistem master (parameter LocalMachine). Kemudian kita dapat mendekripsi gumpalan yang dihasilkan dengan memanggil fungsi invers - [Security.Cryptography.ProtectedData] :: UnProtect ().
Selain itu, dalam hal ini, nilai parameter CurrentUser atau LocalMachine tidak masalah, karena sistem itu sendiri menemukan kunci utama yang cocok untuk decoding gumpalan, dan melakukan semua yang diperlukan. Dalam kedua kasus, kami mendapatkan rahasia awal kami - kata "Kata Sandi" (representasi byte-by-bitnya).
Saat mendekripsi online, penting untuk memahami dalam konteks apa Anda memanggil fungsi UnProtect (). Agar dekripsi berhasil, Anda harus berada di sesi pengguna atau masuk di bawah sesi baru. Masalahnya adalah hash kata sandi, yang disimpan dalam memori LSASS. Jika Anda melakukan panggilan di luar sesi pengguna (misalnya, Anda masuk ke sistem melalui jaringan melalui psexec atau meterpreter), maka Anda karenanya tidak memiliki hash kata sandi yang diperlukan untuk mendekripsi kunci utama. Dia, tentu saja, ada di sesi berikutnya, tetapi LSASS tidak akan memberikannya kepada Anda, karena ini adalah sesi lain, meskipun itu dibuat di bawah pengguna yang sama. Agar dekripsi online berhasil, Anda harus bermigrasi ke proses apa pun yang diluncurkan oleh pengguna yang masuk melalui GUI, atau sepenuhnya masuk ke sistem, misalnya, melalui RDP.
Sebuah alternatif untuk powershell untuk dekripsi online gumpalan DPAPI dapat menjadi panggilan ke mimiktaz :: blob dengan parameter / unsotect. Pada input, dia diberikan file biner dengan gumpalan DPAPI, dan pada output kita mendapatkan data yang didekripsi. Lebih banyak kasus menggunakan mimikatz dijelaskan
di blog HarmJ0y.
Bola isyarat jatuh. Apa yang harus dilakukan dengan peternakan saya dengan vidyuhi?
Karena fakta bahwa kunci utama DPAPI dienkripsi pada kata sandi pengguna, Anda dapat mencoba proses sebaliknya - paksa paksa kata sandi pengguna dengan kunci masternya. Misalnya, kami menerima koneksi terbalik dari makro atau DDE kami dari file docx yang dikirim. Kami dapat mengambil kunci utama pengguna dan mengembalikan kata sandi pengguna tanpa ada peningkatan hak istimewa dan peluncuran mimikatz.
Bisakah saya menggunakan Hashcat atau JohnTheRipper untuk kata sandi bruteforce? Tetapi sebelum itu, Anda perlu mendapatkan parameter brute force dari komposisi John dengan skrip yang sesuai:
./DPAPImk2john.py –S <sid> -mk <masterkey> -c <domain|local>
Kemudian kita sudah dapat mengirim hasil skrip ke peternakan kami dengan kartu video dan berharap bahwa pengguna memiliki kata sandi yang lemah, karena kecepatan brute force master key kira-kira sebanding dengan kecepatan enumerasi WPA2, mis. cukup lambat.
Perlu dicatat di sini bahwa dalam kasus ketika kunci master dihasilkan pada domain Windows 10, 10.000 putaran algoritma PBKDF2 ditambahkan ke generasi prekey. Tetapi lebih buruk lagi, baik Hashcat maupun JohnTheRipper tidak tahu tentang ini (setidaknya pada saat penulisan ini), yang berarti bahwa mereka tidak akan dapat menghapus kata sandi dari kunci master semacam itu.
"Untuk mengambil semua yang buruk, dan kemudian mencari tahu ..."
Seperti yang kami sebutkan sebelumnya, eksekusi tindakan mencurigakan pada mesin pengguna dapat memancing minat tambahan dari tim Blueteam, dan ini, karenanya, penuh dengan fakta bahwa semua RedTeam akan berakhir di sana. Contohnya adalah peluncuran PowerShell di komputer seorang akuntan atau sekretaris, diikuti oleh investigasi insiden tersebut. Agar tidak menimbulkan kecurigaan yang tidak perlu, lebih baik menggunakan metode offline untuk mendekode gumpalan DPAPI. Untuk melakukan ini, Anda harus terlebih dahulu mengambil semua yang Anda butuhkan dari mesin, yaitu:
- Kunci master pengguna
- Kunci utama sistem
- File CREDHIST (jika bukan mesin domain);
- Kata sandi pengguna (atau hash sha1 / ntlmnya);
- SID pengguna;
- Gumpalan DPAPI yang ingin kita dekripsi.
Untuk dekripsi dalam mode offline, kita tidak dapat melakukannya tanpa alat khusus. Alat tersebut mungkin:
- Mimikatz;
- Impacket (dimulai dengan versi ke-18, ia memiliki fungsi DPAPI);
- Kerangka dpapick.
Ini tentang kerangka kerja dpapick yang akan kita bicarakan secara lebih rinci.
Kerangka kerja python dpapick sendiri dibuat oleh peneliti Jean-Michel Pikode pada tahun 2014 dan merupakan implementasi dari mekanisme DPAPI di perpustakaan Python crypto. Penggunaan python, serta struktur kerangka kerja, memungkinkannya untuk dengan mudah disesuaikan dengan berbagai mekanisme DPAPI. Dalam versi aslinya, dpapick tidak dapat menggunakan kunci cadangan domain untuk mendekripsi kunci master, dan tidak memiliki mekanisme untuk mendekripsi kunci utama yang dibuat pada Windows 10 dalam mode mesin domain.
Setelah memperbaiki kekurangan ini dan memperluas fungsionalitas untuk mendekripsi gumpalan DPAPI, dpapick berubah menjadi alat yang cukup bagus untuk decoding offline DPAPI. Di bawah, sebagai contoh, kami akan menunjukkan opsi untuk menggunakan kerangka kerja ini untuk mendekripsi data pengguna yang dienkripsi melalui DPAPI.
Chrome - ambil dan dekripsi cookie dan kata sandi
%localappdata%\Google\Chrome\User Data\Default\Cookies
Chrome disimpan dalam file
%localappdata%\Google\Chrome\User Data\Default\Cookies
Data masuk ada dalam file
%localappdata%\Google\Chrome\User Data\Default\Login Data
Kedua file adalah database sqlite3 di mana data sensitif disimpan sebagai gumpalan DPAPI. Sebagai bagian dari dpapick ada dissector yang sudah jadi (parser) dari data ini (contoh / chrome.py). Agar berhasil mendekripsi, ia perlu menentukan direktori dengan kunci utama, sisi pengguna, kata sandi atau lokasi kunci pribadi pengendali domain, serta file sqlite3 dari Chrome (cookie atau data masuk).
Dekripsi cookie Chrome secara offline dengan kata sandi pengguna
./chrome.py --cookie <cookiefile> --sid <SID> --password <..> --masterkey <masterkeydir>
Dekripsi offline cookie Chrome menggunakan hash dari kata sandi pengguna
./chrome.py --cookie <cookiefile> --sid <SID> --hash <..> --masterkey <masterkeydir>
Dekripsi offline kata sandi Chrome menggunakan kunci pribadi dari pengontrol domain
./chrome.py --chrome <login file> --pkey <rsa-priv.pem> --masterkey <masterkeydir>
DPAPI untuk sertifikat klien
Sertifikat klien banyak digunakan di mana - untuk menghasilkan OTP, EFS atau otentikasi dalam VPN, aplikasi Web, dll.
Sertifikat kunci publik sendiri disimpan di profil pengguna:
%APPDATA%\Microsoft\SystemCertificates\My\Certificates\
Dan kunci pribadi, dengan bantuan yang mana tanda tangan benar-benar dilakukan atau operasi kriptografi lainnya dienkripsi melalui DPAPI dan juga terletak di profil pengguna di sepanjang jalur:
%APPDATA%\Roaming\Microsoft\Crypto\RSA\<SID>\
Agar berhasil mendekripsi kunci sertifikat pribadi dan kemudian membuat kembali file PFX, selain file di atas, kita juga memerlukan kunci master pengguna, serta SID dan kata sandi (atau kunci RSA pribadi dari controller).
Menggunakan Dpapick dan kata sandi pengguna, kami mendekripsi ini:
./efs.py --certificates <cert dir> --rsakyes <RSA dir> --sid <..> --password <..> --masterkey <masterkeydir>

Parameter rsaout opsional dalam tangkapan layar memungkinkan Anda untuk mengekspor kunci RSA yang didekripsi tambahan dalam format PEM. Hasil skrip adalah file PFX yang dibuat ulang tanpa kata sandi, yang sudah dapat diimpor ke diri Anda dan digunakan untuk tujuan yang dimaksud. Jika dalam direktori di atas ada beberapa sertifikat dan kunci pribadi, maka dpapick akan mencoba mendekripsi masing-masing dan membuat beberapa file pfx.
Tindakan yang sama dapat dilakukan menggunakan kunci pribadi domain untuk mendekripsi kunci utama dengan menetapkan parameter yang sesuai:
./efs.py --certificates <cert dir> --rsakyes <RSA dir> --masterkey <masterkeydir> --pkey <domain bkp key>
Sedikit lagi tentang "keping" domain
Berbicara tentang domain Active Directory, ada baiknya menyebutkan fitur luar biasa seperti Kredensial Roaming - fungsi domain ketika kunci master, kata sandi terenkripsi, dan sertifikat "perjalanan" untuk pengguna di seluruh domain Active Directory. Mereka tidak terikat pada mesin tertentu dan akan "tiba" ke komputer tempat pengguna domain itu masuk.
Ketika "fitur" ini dihidupkan, semua sertifikat yang diimpor pengguna, serta semua kunci dan kata sandi pribadinya, terbang ke AD dan disimpan dalam atribut akun yang sesuai: msPKIAccountCrdentailas dan msPKIDPAPIMasterKeys.
Anda dapat melihat tampilannya di dalam AD, misalnya, melalui ldapsearch:
ldapsearch -x -h dc1.lab.local -D “user1@lab.local" -s sub "samAccountname=user1" ldapsearch -x -h dc1.lab.local -D "admin@lab.local" -s sub "samAccountname=anyuser"

Secara default, pengguna hanya dapat menerima atribut DPAPI untuk akunnya. Tetapi dengan hak istimewa yang ditingkatkan, ini dapat dilakukan untuk akun apa pun, termasuk akun komputer.
Roaming Credential adalah teknologi yang sangat nyaman tidak hanya untuk admin, tetapi juga untuk pentester. Setelah mengakses pengontrol domain melalui ldap, Anda dapat menggabungkan semua sertifikat pengguna, kunci master dan kata sandi yang dienkripsi melalui DPAPI (misalnya, kata sandi untuk menghubungkan ke drive jaringan).
Dan mengapa tidak menambahkan fungsionalitas seperti itu ke dpapick, kami pikir - dan mengajarinya cara mengekstrak sertifikat secara otomatis dari pengontrol domain melalui ldap, mendekripsi mereka dan menghasilkan file pfx.
./efs.py –ldap-server <..> --ldap-connect admin:Passw0rd@lab.local --ldap-user user1 --password Password1 ./efs.py –ldap-server <..> --ldap-connect admin:Passw0rd@lab.local --ldap-user user1 --pkey <rsa-priv.pem>

Untuk menjalankan skrip, perlu untuk menentukan pengontrol domain sebagai server ldap, perincian koneksi ke sana, nama akun tempat kami menerima sertifikat dan kata sandi untuk mendekripsi kunci master (atau kunci cadangan pribadi pengendali).
Dropbox Hilang dalam 60 Detik ...
Dropbox adalah contoh lain dari menggunakan DPAPI untuk menyimpan rahasia pengguna. Token otorisasi untuk dropbox disimpan dalam file:
c:\users\<username>\Appdata\Local\Dropbox\instance1\config.dbx c:\users\<username>\Appdata\Local\Dropbox\instance_db\instanse.dbx
Ini adalah database sqlite3 terenkripsi yang berisi data untuk koneksi. Untuk enkripsi, kunci simetris digunakan, yang pada gilirannya dienkripsi melalui DPAPI dan disimpan dalam registri:
HKCU\SOFTWARE\Dropbox\ks
HKCU\SOFTWARE\Dropbox\ks1
Dengan demikian, urutan umum pembajakan dropbox adalah sebagai berikut:
- kami mengambil dua file database dari komputer;
- kami mendapatkan kunci dari registri dan mendekripsi menggunakan dpapick;
- menggunakan DPAPI, kami mengenkripsi kunci yang diterima pada mesin kami dan memasukkannya ke dalam registri;
- di mesin kami, kami mengganti file database dan menjalankan Dropbox.
Anda harus menyadari bahwa izin khusus ditetapkan untuk cabang registri di atas. Mereka hanya bisa dibaca oleh pengguna. Baik administrator maupun sistem tidak dapat membacanya. Dengan demikian, jika Anda mengakses registri atas nama pengguna lain (bahkan seorang administrator), Anda harus terlebih dahulu mengatur izin yang sesuai pada cabang registri yang ditentukan. Misalnya, jadi (PowerShell):
$Sid="S-1-5-21-3463664321-2923530833-3546627382-1000"; $key=[Microsoft.Win32.Registry]::USERS.OpenSubKey("$sid\SOFTWARE\Dropbox\ks",[Microsoft.Win32.RegistryKeyPermissionCheck]::ReadWriteSubTree,[System.Security.AccessControl.RegistryRights]::ChangePermissions); $acl = $key.GetAccessControl(); $rule = New-Object System.Security.AccessControl.RegistryAccessRule ("administrator","FullControl","Allow"); $acl.SetAccessRule($rule); $key.SetAccessControl($acl); $key_path = "REGISTRY::HKEY_USERS\$Sid\SOFTWARE\Dropbox\ks"; (Get-ItemProperty -Path $key_path -Name Client).Client;
Kunci ks dan ks1 berisi header (8 byte) dari versi dbx sebelum gumpalan DPAPI dan gumpalan md5 HMAC DPAPI (16 byte terakhir). Gumpalan DPAPI sendiri dimulai dengan byte 9 0x01000000D0 ... Bytes ini harus disalin dalam format base64 ke file, yang kemudian didekripsi melalui dpapick:
./filegeneric.py --sid <..> --password <..> --masterkey <..> --base64file <..>
Kemudian, pada mesin Anda, Anda perlu mengenkripsi kunci yang diterima pada tahap terakhir dengan kunci master kami dan memasukkan hasilnya ke cabang registri yang sesuai.
Untuk enkripsi, paling mudah menggunakan PowerShell:
$hdata="4efebbdf394d4003317fc5c357beac4b"; [Byte[]] $dv0_entropy = 0xd1,0x14,0xa5,0x52,0x12,0x65,0x5f,0x74,0xbd,0x77,0x2e,0x37,0xe6,0x4a,0xee,0x9b; $data = ($hdata -split "(?<=\G\w{2})(?=\w{2})" | %{ [Convert]::ToByte( $_, 16 ) }); Add-Type -AssemblyName System.Security; $dk1 = [system.security.cryptography.protecteddata]::Protect($data,$dv0_entropy,[System.Security.Cryptography.DataProtectionScope]::CurrentUser); $pr=([System.BitConverter]::ToString($dk1));$pr $OBJ_hmac = New-Object System.Security.Cryptography.HMACMD5 $hmac = $OBJ_hmac.ComputeHash($dk1) $pr=([System.BitConverter]::ToString($hmac));$pr
Dalam kasus ini, hdata adalah kunci yang diterima pada tahap dekripsi. dv0_entropy adalah konstanta entropi yang digunakan oleh DBOX di DPAPI. Untuk gumpalan yang dihasilkan, perlu untuk menetapkan di depan header 8 byte 0x00000000F6000000, dan di belakang - HMACMD5 + 0x00
Setelah itu, Anda dapat menulis data ke kunci registri yang sesuai.
DPAPI dan RSA SecurID
RSA SecurID adalah program klien yang digunakan untuk menghasilkan kata sandi satu kali, yang dikembangkan oleh RSA.
Ini adalah hal yang cukup populer untuk perusahaan besar dan juga menggunakan DPAPI, hanya sedikit lebih rumit. Dalam hal ini, insinyur RSA memutuskan untuk menjadi bingung dan menerapkan skema DPAPI yang lebih kompleks.
Data token disimpan dalam file
%LOCALAPPDATA%\RSA\SecurIDStorage
, yang merupakan basis data sqlite3. Setiap token terenkripsi berisi EnTokenSid terenkripsi (parameter untuk inisialisasi awal dari algoritma pembuatan kode). EnTokenSid dibuat berdasarkan DBKey, SID token dan SID pengguna, dan DBKey sudah dibentuk oleh dekripsi DPAPI DBKeyEnc dengan urutan sebagai berikut:
DBKeyEnc = DPAPI(CurrenUser, DPAPI(LocalSystem(DBKey))
Yaitu Pertama, Kunci DB dienkripsi dengan kunci master sistem, dan kemudian gumpalan DPAPI yang dihasilkan dienkripsi lagi dengan kunci master pengguna.
Juga di database ada CryptoCheckSum dari CheckSum:
CryptoCheckSum = Gumpalan DPAPI (CurrenUser)
Dengan demikian, agar SecurIDStorage yang digabungkan dapat bekerja pada mesin Anda, Anda harus:
- Karena fakta bahwa SID pengguna terlibat dalam pembentukan EncTokenSid, maka perlu menetapkan SID pengguna saat ini di mesin virtual dengan nilai yang sama dengan SID pengguna yang diambil dari basis SecurIDStorage. Utilitas NewSid dari SysInternals akan membantu kami dalam hal ini;
- Dekripsi DBKeyEnc menggunakan kunci utama pengguna dan kata sandi atau kunci pribadi domain (jika mesin adalah domain);
- Dekripsi hasil dekripsi sebelumnya menggunakan kunci master sistem dan nilai parameter DPAPI_SYSTEM;
- Dekripsi CryptoCheckSum menggunakan kunci utama pengguna
- Enkripsi nilai-nilai DBKey dan CheckSum yang diterima dalam urutan terbalik yang sudah ada di mesin virtual Anda;
- Di beberapa versi SecurID, Anda juga perlu mengatur ukuran HDD mesin virtual ke ukuran yang sama dengan ukuran HDD mesin sumber, seperti program memeriksanya saat startup.
Seperti disebutkan di atas, untuk mendekripsi DBKeyEnc, selain kunci master pengguna, kita juga akan memerlukan kunci master sistem, serta nilai DPAPI_SYSTEM, yang dengannya kunci-kunci sistem master didekripsi. DAPPI_SYSTEM sebenarnya prekey sudah terbentuk, berpartisipasi dalam pembentukan kunci master sistem. Anda bisa mendapatkannya dari memori LSASS (melalui mimikatz atau dengan menganalisis proses dump) atau dari cabang registri yang sesuai (HKLM \ SYSTEM, HKLM \ SECURITY), membuangnya dan menganalisis Impacket yang sama.
Kemudian kita dapat menggunakan DPAPI_SYSTEM yang diperoleh untuk mendekripsi gumpalan yang diperlukan menggunakan dpapick (parser adalah contoh / filegeneric.py), seperti yang ditunjukkan pada tangkapan layar berikut:
1) Mendapatkan DPAPI_SYSTEM via mimikatz offline

2) Mendapatkan DPAPI_SYSTEM melalui Impacket offline

3) Dekripsi DPAPIck dengan kunci master pengguna dan sistem

Lembar curang
Agar Anda tidak lupa tempat data tertentu - kami akan menempatkannya di bagian terpisah:
Kunci master khusus %APPDATA%\Microsoft\Protect\<SID>\*
Kunci Master Sistem Windows\System32\Microsoft\Protect\*
DPAPI_SYSTEM LSASecrets – online SYSTEM, SECURITY (reg save …, system\backup, etc)
Sertifikat pengguna %APPDATA%\Microsoft\SystemCertificates\My\Certificates\ %APPDATA%\Microsoft\Crypto\RSA\<SID>\
Sertifikat sistem HKLM:\SOFTWARE\Microsoft\SystemCertificates\MY\Certificates\* C:\Programdata\Microsoft\Crypto\RSA\MachineKeys\
Chrome %localappdata%\Google\Chrome\User Data\Default\Cookies %localappdata%\Google\Chrome\User Data\Default\Login Data
Dropbox HKCU\SOFTWARE\Dropbox\ks HKCU\SOFTWARE\Dropbox\ks1 %APPDATA%\Local\Dropbox\instance1\config.dbx %APPDATA%\Local\Dropbox\instance_db\instanse.dbx
Rsa securid %LOCALAPPDATA%\RSA\SecurIDStorage
Kesimpulan kecil
DPAPI adalah hal yang luar biasa - hal utama adalah untuk memahami bagaimana hal itu dapat digunakan ketika melakukan studi pentest dan RedTeam.
Pada artikel ini, kami melihat beberapa contoh di mana dekripsi DPAPI dapat diterapkan. Padahal, ruang lingkupnya jauh lebih luas. Misalnya, kami tidak mempertimbangkan RDP (* .rdg), Icloud (file pList), Skype (*. Xml), kunci untuk menghubungkan ke Wi-Fi. Di mana-mana DPAPI diterapkan dan parser terkait diimplementasikan sebagai bagian dari kerangka kerja dpapick.
Versi dpapick yang dimodifikasi tersedia di
GitHub kami. Kami mendesak Anda untuk menggunakan alat ini untuk mendekripsi DPAPI dan kami akan berterima kasih atas pengembangan dpapick lebih lanjut.
Dan beberapa informasi menarik dapat ditemukan di saluran kami di
telegram . Kami menceritakan tentang IB melalui mata RedTeam.
PS Terima kasih kepada penyelenggara OFFZONE-2018 untuk konferensi yang keren!
PPS Bagian kedua artikel
di sini