Di seri sebelumnya
Belum lama ini
saya menerbitkan deskripsi kerentanan untuk Steam. Saya mendapat banyak umpan balik dari pembaca. Valve tidak mengatakan sepatah kata pun, dan HackerOne mengirim surat besar dan, pada dasarnya, diam. Akibatnya, Valve melarang saya pada H1 - Saya tidak dapat berpartisipasi dalam program mereka untuk menolak kerentanan (sisa H1 tersedia untuk saya).

Anda dapat mempelajari lebih lanjut tentang kisah ini di publikasi sebelumnya, di sini saya akan mengatakan beberapa kata tentang status saat ini.
Tapi itu sederhana dan menyedihkan - Valve masih gagal. Pembaruan terbaru, yang dirancang untuk memperbaiki masalah,
mudah dilewati dan kerentanan masih relevan. Ya, saya memeriksanya - ini bekerja dengan baik.
Tetapi artikel ini bukan tentang fakta bahwa kerentanan lama masih ada, tetapi tentang yang baru. Karena Valve sekali lagi menyatakan keinginan untuk membaca laporan publik, bukannya laporan pribadi, kami tidak akan menghilangkan kesenangan ini dari mereka.
Deskripsi Singkat Kerentanan
Gambaran umum tentang eksploitasi kerentanan cukup sederhana dan terdiri dari tiga langkah:
- Kami menyiapkan lingkungan untuk operasi (sebanyak dua cara untuk memilih, menggunakan kelemahan keamanan yang berbeda).
- Dapatkan Steam untuk menyalin dan menjalankan dll.
- Dll harus memenuhi persyaratan kecil.
Semua tindakan ini dapat dilakukan oleh pengguna OS mana pun, atau lebih tepatnya, program apa pun di komputer. Akibatnya, Anda dapat
menjalankan kode apa pun dengan hak istimewa maksimum , kelas kerentanan ini disebut eskalasi hak istimewa (eop) atau eskalasi hak istimewa lokal (lpe). Terlepas dari kenyataan bahwa aplikasi apa pun itu sendiri dapat membahayakan, memperoleh hak maksimum akan menimbulkan konsekuensi yang jauh lebih signifikan. Mematikan antivirus dan firewall, memasang rootkit, menyembunyikan proses penambang, mencuri data pribadi semua pengguna PC hanyalah sebagian kecil dari apa yang dapat Anda pikirkan.
Minimum teoritis
Sangat lucu melihat komentar pada artikel sebelumnya, di mana orang menulis "Pengguna tidak dapat menulis kunci registri di HKLM" atau "Hak administrator diperlukan untuk membuat symlink". Menariknya, memeriksa dugaan ini tidak akan memakan waktu lebih lama daripada menulis komentar seperti itu. Dan, ya, untuk jaga-jaga: kedua pernyataan itu salah. Oleh karena itu, dalam artikel ini saya memutuskan untuk membuat bagian kecil di mana saya menggambarkan sejumlah momen sulit dari operasi.
“Anda tidak dapat menulis ke kunci registri HKLM”
Tidak ada aturan umum seperti itu. Ada aturan keamanan khusus untuk kunci registri tertentu. Valve menetapkan hak akses penuh untuk semua pengguna ke cabang
HKLM \ SOFTWARE \ Wow6432Node \ Valve , dan karenanya, setiap pengguna dapat melakukan apa pun yang ia inginkan di cabang ini.
“Anda tidak dapat memulai atau menghentikan layanan tanpa hak administrator”
Tidak ada aturan umum seperti itu. Ada aturan keamanan khusus untuk layanan tertentu. Valve mengatur haknya agar Layanan Klien Steam dapat dimulai dan dihentikan oleh pengguna mana pun.
“Untuk membuat symlink, Anda memerlukan hak administrator”
Ini adalah pertanyaan yang lucu, mengingat bahwa dari 5 jenis tautan utama di Windows, hanya satu setengah yang membutuhkan hak-hak ini. Jadi, ketemu: file simbolik tautan, tautan simbolik direktori objek, tautan keras, titik reparasi NTFS, dan reg_link. Hak administrator hanya diperlukan untuk membuat tautan simbolis file dan untuk tautan simbolis direktori objek permanen (sementara hanya tinggal selama sesi di mana ia dibuat, dalam arti umum, sebelum me-reboot, dan tidak memerlukan hak-hak khusus).
Simlink dari folder ke folder
Ini disebut titik reparasi NTFS atau titik mount NTFS. Namanya tidak terlalu penting, faktanya adalah hal ini memungkinkan Anda untuk menggunakan satu folder sebagai penunjuk ke yang lain. Itu dapat dibuat oleh pengguna biasa dari folder kosong jika ia memiliki hak tulis untuk itu. Untuk pembuatan, kami akan menggunakan utilitas CreateMountPoint.exe dari
serangkaian utilitas untuk menguji bekerja dengan tautan .
Meninggalkan Kunci
Pemblokiran keluar (
OpLock atau Opportunistic Lock ) adalah mekanisme khusus di mana satu aplikasi dapat secara sementara memblokir semua orang dari mengakses sumber daya file tertentu. Di sini Anda dapat menulis banyak jenis detail, fitur bekerja dengan folder dan akses berbeda. Intinya adalah: program dapat "menangkap" kejadian mengakses file tertentu dan menahannya untuk sementara waktu. Anda dapat menginstal oplock menggunakan utilitas SetOpLock.exe dari
test suite yang sama
untuk bekerja dengan tautan . Menjalankan utilitas menginstal membuka kunci yang diperlukan; ketika akses terjadi, utilitas menulis pesan; menekan enter menghapus kunci pembuka.
Baitandndswitch
Ini adalah nama tekniknya, yang menggabungkan pembuatan tautan dan pemasangan oplos untuk memenangkan TOCTOU (waktu pemeriksaan \ waktu penggunaan). Esensinya lebih mudah dijelaskan dengan sebuah contoh.
Bayangkan ada beberapa program yang melakukan hal seperti ini berturut-turut:
ReadContentFromFile(“C:\test\myfile.txt”); ReadContentFromFile(“C:\test\myfile.txt”);
Itu hanya membaca file yang sama dua kali berturut-turut. Akankah hal yang sama selalu dibaca? Tidak, belum tentu.
Pertama, buat dua folder dengan file C: \ test1 \ myfile.txt dan C: \ test2 \ myfile.txt. Dan secara umum kita akan menghapus folder C: \ test dan membuat titik reparasi pada C: \ test1. Kami meletakkan membuka kunci pada file dari direktori pertama dan menjalankan program. Segera setelah dia membuka file, buka kunci akan berfungsi. Kami akan mengubah titik reparse dan C: \ test akan menunjuk ke C: \ test2. Sekarang, setelah membuka kunci dihapus, program akan membaca file untuk kedua kalinya dari file lain.
Mengapa ini dibutuhkan? Sangat sederhana - situasi yang cukup khas di mana file pertama kali diperiksa (baca pertama) dan kemudian diluncurkan (baca kedua). Ini adalah cara kami mengirim satu file untuk verifikasi, dan yang lain untuk eksekusi.
Sekarang semuanya siap untuk operasi.
Operasi 1. Mempersiapkan lingkungan
Diperlukan sedikit persiapan lingkungan kerja. Untuk memulainya, Anda perlu mengambil file executable CreateMountPoint.exe dan SetOpLock.exe.
Sekarang kita perlu membuat perubahan kecil pada struktur file Steam. Tugas kita adalah untuk mendapatkan folder dengan dua file Steam.exe dan steamclient.dll dan tidak adanya folder bin. Ada dua cara untuk melakukan ini.
Metode 1
Ganti nama \ hapus folder bin dari folder Steam utama. Itu saja, Anda hebat (Steam selama instalasi memberikan hak apa pun kepada pengguna di foldernya kepada pengguna mana pun).
Metode 2
Di kunci registri HKLM \ SOFTWARE \ Wow6432Node \ Valve \ steam ubah parameter InstallPath ke beberapa folder kami. Di folder ini, jatuhkan Steam.exe dan steamclient.dll dari folder utama Steam.
Misalkan dengan salah satu metode kita telah menyiapkan folder C: \ Steam (path bisa berupa apa saja, tetapi dalam contoh saya akan menggunakan ini). Sekarang buat folder lain b1, b2, b3 dan b4 di dalamnya. Di tiga yang pertama, kami akan mengunggah file steamservice.dll (dari Steam kit, aslinya ada di folder bin), dan di folder b4 kami akan menjatuhkan pustaka yang dibentuk khusus dengan nama yang sama - steamservice.dll. Rincian tentang persiapan perpustakaan akan di paragraf 3.
Kami membuka dua jendela konsol. Ini melengkapi persiapan lingkungan.
Pengoperasian 2. Mengganti file
Saya pikir dari persiapan sudah menjadi jelas bahwa akan ada sesuatu seperti BaitAndSwitch yang dijelaskan di atas.
Tangkapan layar dari ProcMon:

Ini adalah bagian dari peluncuran khas Layanan Klien Steam. Perhatikan bagian di mana dll pertama kali disalin ke C: \ Program Files (x86) \ Common Files \ Steam, dan kemudian dimuat. Kami akan memastikan bahwa perpustakaan kami disalin dari C: \ Steam \ b4. Sayangnya, cek pertama kali dilakukan, termasuk tanda tangan perpustakaan, sehingga tidak dapat diganti (oh, ironi).
Jadi, saya akan masuk langkah-langkah. Langkah-langkah digabungkan ke dalam kelompok tindakan yang sama. Untuk setiap langkah, itu akan ditunjukkan di mana harus memulai dan apa yang terjadi (saya memanggil cmd1 jendela konsol yang berbeda dan cmd2).
- Buat folder C: \ Steam \ bin dan dalam cmd1 jalankan:
CreateMountPoint.exe C: \ Steam \ bin C: \ Steam \ b1 - Dalam cmd1 kita meletakkan oplock:
SetOpLock.exe C: \ Steam \ b1 \ steamservice.dll - Kami memulai Layanan Klien Steam, kami melihat di cmd1 bahwa kami menangkap akses ke file.
*** - Hapus C: \ Steam \ bin, buat folder C: \ Steam \ bin di tempatnya dan di cmd2 jalankan:
CreateMountPoint.exe C: \ Steam \ bin C: \ Steam \ b2 - Dalam cmd2 kita meletakkan oplock:
SetOpLock.exe C: \ Steam \ b2 \ steamservice.dll - Di cmd1 kami merilis membuka kunci, kami melihat bahwa cmd2 telah menangkap akses ke file.
*** - Hapus C: \ Steam \ bin, buat folder C: \ Steam \ bin di tempatnya dan jalankan cmd1:
CreateMountPoint.exe C: \ Steam \ bin C: \ Steam \ b3 - Dalam cmd1 kita meletakkan oplock:
SetOpLock.exe C: \ Steam \ b3 \ steamservice.dll - Di cmd2 kami melepaskan membuka kunci, kami melihat bahwa cmd1 telah menangkap akses ke file.
*** - Hapus C: \ Steam \ bin, buat folder C: \ Steam \ bin di tempatnya dan jalankan cmd2:
CreateMountPoint.exe C: \ Steam \ bin C: \ Steam \ b2 - Dalam cmd2 kita meletakkan oplock:
SetOpLock.exe C: \ Steam \ b2 \ steamservice.dll - Di cmd1 kami merilis membuka kunci, kami melihat bahwa cmd2 telah menangkap akses ke file.
*** - Hapus C: \ Steam \ bin, buat folder C: \ Steam \ bin di tempatnya dan jalankan cmd1:
CreateMountPoint.exe C: \ Steam \ bin C: \ Steam \ b3 - Dalam cmd1 kita meletakkan oplock:
SetOpLock.exe C: \ Steam \ b3 \ steamservice.dll - Di cmd2 kami melepaskan membuka kunci, kami melihat bahwa cmd1 telah menangkap akses ke file.
*** - Hapus C: \ Steam \ bin, buat folder C: \ Steam \ bin di tempatnya dan jalankan cmd2:
CreateMountPoint.exe C: \ Steam \ bin C: \ Steam \ b4 - Dalam cmd1 kami merilis membuka kunci
Meskipun terlihat rumit, sebenarnya idenya sederhana: dari 6 akses ke file C: \ Steam \ bin \ steamservice.dll, 5 kali pertama file asli dari folder yang berbeda diberikan (dalam urutan akses: b1, b2, b3, b2, b3), dan untuk keenam kalinya file dengan muatan diberikan untuk disalin.
Secara skematis, saya menggambarkannya seperti ini:

Di sebelah kiri adalah perilaku normal, di sebelah kanan adalah perilaku eksploit.
Operasi 3. Perpustakaan yang Diimplementasikan
Untuk payload, saya pertama kali menggunakan dll paling khas saya, yang di DllEntry membuat konsol interaktif. Karena kode dari dll akan dieksekusi dalam konteks Layanan Klien Steam, maka akan dieksekusi dengan hak yang sama dengan layanan itu sendiri - NT AUTHORITY \ SYSTEM. Tetapi sebagai hasil dari operasi, konsol tidak muncul.
Setelah pengunduhan, layanan Steam masih memahami bahwa mereka menyelipkan linden ke sana dan selesai bekerja, sehingga muatan dari dll saya tidak berhasil dieksekusi.
Saya harus berbalik sedikit, dan ternyata layanan setelah memuat dll memeriksa keberadaan fungsi
int WINAPI SteamService_RunMainLoop() void WINAPI SteamService_Stop()
di perpustakaan. Selain itu, layanan memanggil fungsi pertama, di mana saya memutuskan untuk meletakkan payload (meluncurkan konsol interaktif dengan hak layanan - NT AUTHORITY \ SYSTEM). Nah, itu saja - kami ulangi semua langkah dan dapatkan konsol dengan izin maksimum.
Kesimpulan
Anda dapat membungkus semua ini dalam file exe, tetapi, jujur ​​saja, saya tidak ingin repot. Saya pikir video dengan demonstrasi akan cukup (
opsi dengan registri ,
opsi dengan sistem file ).
Saya tidak akan menyalin di sini bagian "Spekulasi" dari artikel sebelumnya. Hanya fakta: kerentanan lama adalah terkini, Anda baru saja membaca tentang yang baru, Valve masih tidak mau mendengar tentang masalahnya.
Pembaruan (22/08/2019)
Saat ini, ada dua berita:
- Klien beta menerima perbaikan tambalan . Saya akan menonton ketika pembaruan mencapai klien utama.
- Valve telah mengubah kebijakan LPE . Dan ini adalah berita bagus!
Pembaruan (27/08/2019)
Kabar baik
- Klien utama menerima pembaruan tambalan .
- Saya dilarang untuk H1 dan dibayar hadiah
Artikel ini dalam bahasa Inggris.