Kami mendapatkan kata sandi utama dari pengelola kata sandi yang terkunci 1 Kata sandi 4

Alat baru, metode lama. Kami merekayasa balik dan menemukan kesalahan fatal 1Password.

Semua orang menyukai pengelola kata sandi. Mereka hebat karena banyak alasan. Secara pribadi, saya memiliki lebih dari 200 entri di manajer. Dengan begitu banyak data rahasia di satu tempat, penting untuk memahami sejauh mana kerusakan jika catatan Anda dikompromikan, baik itu malware, eksploitasi atau hanya komputer yang tidak dijaga selama beberapa menit. Washington Post baru-baru ini menerbitkan sebuah artikel berdasarkan penelitian kami. Artikel ini membantu membuat orang sadar bahwa tidak semua pengelola kata sandi sama.

Saya sangat yakin bahwa pengelola kata sandi yang terkunci dilindungi dengan baik. Jika seseorang mendapatkan akses ke komputer saya, maka maksimum dapat mengandalkan banyak byte acak, karena informasi tersebut dapat dipercaya dihapus dari memori.

Ini berlaku untuk 1Password 4 (Perhatikan bahwa versi terbaru adalah yang ketujuh hari ini). Sebelum beralih ke beberapa tahun yang lalu, saya memeriksa bahwa benar-benar tidak ada kata sandi yang jelas ketika manajer dalam keadaan terkunci. Jadi dalam kasus kompromi, penyerang harus berurusan dengan penyimpanan terenkripsi.


Lemari besi terkunci!

Dalam kondisi ini, tidak ada entri kata sandi atau kata sandi master. Sangat masuk akal dan benar, dan 1Password 4 lulus tes ini. Atau tidak?

Untuk menghilangkan detail yang membosankan, saya akan katakan segera: kami dapat memulihkan kata sandi utama dari instance yang terkunci di 1Password 4, seperti yang ditunjukkan di bawah ini.


Buka kunci 1Password 4 dan pulihkan kata sandi utama Anda

Animasi menunjukkan bahwa 1Password 4 pertama kali dibuka dengan cara normal, dan kemudian dikunci. Setelah itu, kami menjalankan utilitas multipass kami, yang berhasil memulihkan kata sandi. Utilitas mengeksploitasi pemrosesan yang salah dari bidang input kata sandi di 1Password 4 untuk mengembalikan buffer kata sandi master yang dikaburkan, menghapusnya, secara otomatis membuka kunci 1Password 4, dan akhirnya menampilkan kata sandi master di konsol.

Detail yang membosankan


Langkah pertama dalam mengevaluasi manajer kata sandi adalah memeriksa kata sandi master yang jelas dalam memori. Ini dimungkinkan di hex editor apa pun yang dapat berinteraksi dengan ruang memori proses. Misalnya, editor HxD gratis. Gunakan untuk membuka ruang memori 1Password 4.



Kami segera jatuh ke area pertama yang dapat dibaca dari ruang memori 1Password 4.


Contoh representasi memori HxD

Belum ada yang istimewa. Tetapi Anda dapat melakukan pencarian. Misalnya, seperti apa situasinya jika Anda mengetikkan kata sandi di jendela buka 1Password 4, tetapi jangan klik tombol "Buka Kunci":


Brankas terkunci 1 Kata sandi 4 dengan kata sandi master yang dimasukkan di bidang

Tentunya kata sandi ada di suatu tempat di memori?

Kami membuka HxD, tetapi mencari baris dengan kata sandi master kami ("Z3Superpass #") tidak membuahkan hasil.



Tampaknya 1Password entah bagaimana mengenkripsi atau mengaburkan formulir saat dimasukkan. Jika prosedur ini bekerja dengan benar, maka semuanya baik-baik saja.

Menyelam lebih dalam


Untuk mengetahui mengapa kata sandi utama tidak dapat ditemukan dalam memori ketika kata sandi itu jelas ada di kotak dialog buka kunci, Anda harus menemukan kode yang berinteraksi dengannya. Ada beberapa cara. Anda dapat melacak pemrosesan acara keyboard dan mouse dengan melokalisasi 'GetMessage', 'PeekMessage', 'GetWindowText', atau Windows API lain yang biasanya menangani input pengguna. Jadi kami menemukan buffer tempat penekanan tombol direkam, dan melaluinya kami pergi ke rutin enkripsi / kebingungan. Tetapi ini adalah proses yang panjang dan rawan kesalahan, terutama dengan kerangka kerja besar yang terkadang mengelola memori dengan sangat aneh, jadi Anda harus membuat banyak salinan dan konversi untuk melacak buffer.

Sebagai gantinya, kami menggunakan alat Imager Thread kami sendiri, yang dirancang untuk merekayasa balik protokol kepemilikan "aneh" di tingkat aplikasi. Ini akan membantu Anda menentukan di mana di memori 1Password 4 berinteraksi dengan kata sandi utama kami. Alat "secara otomatis" mengidentifikasi area kode dalam 1Password 4 yang berinteraksi dengan kata sandi yang dikaburkan (itu hanya menyoroti instruksi yang berinteraksi dengan data yang menarik untuk analisis lebih lanjut). Hasilnya terlihat seperti ini:


Imager Thread menemukan kode 1Password 4 yang berinteraksi dengan kata sandi master yang tidak fokus

Karena kata sandi utama disimpan dalam memori dalam bentuk yang dikaburkan, alat harus terlebih dahulu menunjukkan di mana kebingungan terjadi.

Sebuah fragmen dari hasil pertama menunjukkan bahwa penampilan pertama dari kata sandi utama disertai dengan transisi kode dari alamat 0x7707A75D ke 0x701CFA10.


Entri terperinci di Thread Imager menyoroti transisi kode dari 0x7707A75D ke 0x701CFA10, sementara register EAX dan ECX merujuk ke buffer dengan kata sandi master

Meneliti tempat ini 0x7707A75D di debugger (x64dbg) mengkonfirmasi teori kami. Memang, untuk pertama kalinya, string 'Z3superpass #' terjadi ketika fungsi decoding 'RtlRunDecodeUnicodeString' dari pustaka ntdll.dll berakhir.



Setelah sedikit analisis, jelas bahwa kedua fungsi ini digunakan untuk mengaburkan kata sandi: 'RtlRunEncodeUnicodeString' dan 'RtlRunDecodeUnicodeString'. Jadi kata sandi utama disembunyikan dari penyalinan primitif dari memori, itulah sebabnya kami sebelumnya tidak dapat menemukannya di hex editor.

Jika Anda mempelajari buffer yang disandikan di akhir fungsi RtlRunEncodeUnicodeString, maka baris terenkripsi dengan kata sandi master terlihat seperti ini:


Kata Sandi Utama Terenkripsi

Setelah RtlRunDecodeUnicodeString 'itu diterjemahkan:


Kata Sandi Utama Terdekripsi

Menariknya, area ini disimpan di alamat yang sama 0x00DFA790 dan kami benar-benar dapat mengamati perubahannya ketika memasukkan kata sandi di jendela buka kunci 1Password 4:



Kerentanan


'RtlRunEncodeUnicodeString' dan 'RtlRunDecodeUnicodeString' adalah fungsi sederhana yang memodifikasi string dengan operasi XOR sederhana. Ini tidak terlalu buruk: tampaknya merupakan metode standar untuk menutupi semua kontrol pengeditan Windows asli dengan set flag 'ES_PASSWORD'.

Masalahnya adalah bahwa setelah membuka kunci 1Password 4, kata sandi utama yang dienkripsi tidak dihapus dari memori.

Lebih buruk lagi, itu tetap ada dalam memori bahkan setelah 1Password 4. Terkunci, yaitu kita memiliki penyimpanan kata sandi yang terkunci, tetapi dengan kata sandi utama yang dienkripsi dalam memori.

Dan lebih buruk lagi, karena kita berinteraksi dengan kotak dialog input kata sandi master, area memori yang sama digunakan kembali dengan nilai XOR yang sama, yang memberi kita akses mudah ke buffer yang disandikan untuk membuat exploit.

Tantangan


Untuk membuat exploit yang andal untuk 1Password 4, Anda perlu mendapatkan gambaran yang lebih jelas tentang bagaimana kata sandi master diproses oleh alur kerja program. Dengan menggunakan alat-alat yang disebutkan di atas, kami membangun diagram data keluaran (lihat gambar di bawah).



Diagram ini memudahkan untuk memahami di mana dan perpustakaan mana yang terlibat untuk mengidentifikasi area dalam memori di mana Anda dapat mengambil kata sandi master dengan andal.

Eksploitasi


Apa yang kita miliki saat ini? Kami memiliki penyimpanan yang terkunci, dan di suatu tempat di memori tersimpan kata sandi yang tidak jelas, karena program tidak membersihkan memori dengan benar.



Untuk mengambilnya, Anda harus memanggil prosedur di 1 Kata Kunci 4, yang menginisiasi 'RtlRunEncodeUnicodeString' dan 'RtlRunDecodeUnicodeString'. Dengan demikian, ini akan menunjukkan lokasi buffer memori dengan kata sandi utama yang disandikan.


Area memori dengan kata sandi utama yang dikaburkan

Tanpa buffer ini, orang harus terjun ke jurang prosedur internal dan kontrol Windows dan mekanisme manajemen memori terkait. Mungkin analisis ini membuatnya mudah untuk menemukan penyangga, tetapi kami tidak melakukannya.

Tampaknya satu-satunya cara untuk memanggil 'RtlRunEncodeUnicodeString' dan 'RtlRunDecodeUnicodeString' adalah dengan memasukkan kata sandi utama dalam karakter di kotak dialog. Jadi kita mendapatkan buffer yang diinginkan. Tapi kita tidak tahu panjang kata sandinya.

Kami memecahkan masalah ini dengan mencegat kode yang mengakses karakter pertama buffer kami, memblokir upaya untuk berubah. Rutin ini ada di loop pesan kontrol di comctl32, yang menangani kontrol buffer elemen yang sesuai. Memanggil 'memmove' dengan offset 0x70191731 menimpa buffer dengan karakter yang dimasukkan:


(Efek samping: garis yang disorot (kuning) memperbarui seluruh kata sandi)

Sekarang kami akhirnya mendapatkan semua yang kami butuhkan untuk membuat exploit. Langkah-langkah berikut akan memungkinkan kami untuk mengekstrak kata sandi utama:

  1. Kaitkan 'memmove' untuk mencegah menimpa byte pertama dari kata sandi utama.
  2. Kaitkan 'RtlRunEncodeUnicodeString' untuk mendapatkan lokasi buffer kata sandi utama yang dikaburkan.
  3. Kaitkan 'RtlRunDecodeUnicodeString' untuk mengakses buffer yang dikaburkan yang diperoleh pada langkah sebelumnya.
  4. Memasukkan karakter di bidang entri kata sandi dan menolak langkah 1 (menyimpan seluruh kata sandi master), mengarahkan ulang langkah 2 ke langkah 3 untuk memecahkan kode sandi utama yang dikaburkan.

Untuk melakukan semua tindakan ini, buat DLL dengan kode penangan untuk semua kait ini. Pustaka tertanam dalam proses 1Password 4, mengirimkan satu karakter ke kotak dialog kata sandi utama, dengan meluncurkan memmove, langkah-langkah RtlRunEncodeUnicodeString dan RtlRunDecodeUnicodeString yang dapat kita intersep - dan melakukan sihir kita untuk memulihkan kata sandi master yang dikaburkan. Sebagian besar keajaiban terjadi di DetourRtlRunEncodeUnicodeString, ini adalah kait untuk fungsi 'RtlRunEncodeUnicodeString', ditunjukkan di bawah ini:



Yang membawa kita ke hasil akhir: membuka kunci repositori 1Password 4 yang terkunci dari versi apa pun menggunakan prosedur buggy yang digunakan oleh Windows API:



Ringkasan


Ketika kami pertama kali menyelidiki bagian dalam 1Password 4, kami berharap untuk memenuhi beberapa jenis sistem keamanan yang kompleks dan berharap bahwa semua informasi sensitif akan dihapus dari memori, seperti yang terjadi dalam prosedur PBKDF2 dan area lain di mana kata sandi master digunakan. Entri yang sesuai juga dihapus. Namun, karena pengawasan, bidang input kata sandi dianggap sebagai kontrol Windows API standar dengan kata sandi tersembunyi, yang merusak keamanan 1Password 4.

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


All Articles