Kami terus menganalisis kerentanan sakelar industri: kami mengeksekusi kode arbitrer tanpa kata sandi



Dalam Penelitian Positif 2019, kami meninjau Protokol Manajemen Sakelar Industri Moxa. Kali ini, kami akan melanjutkan topik ini dan menganalisis secara terperinci kerentanan CVE-2018-10731 pada sakelar Kontak Phoenix dari FL SWITCH 3xxx, FL SWITCH 4xxx, dan model garis FL SWITCH 48xx yang diidentifikasi oleh para ahli kami. Kerentanan ini, terdeteksi di antarmuka web perangkat, memungkinkan kode arbitrer dijalankan tanpa sepengetahuan kredensial perangkat dan diberi peringkat 9 dari 10 pada skala versi 3 CVSS.

Pandangan pertama


Perangkat yang disebutkan di atas menjalankan Linux, dan Anda dapat menggunakan antarmuka web untuk mengonfigurasinya. Seperti banyak perangkat IoT lainnya, domestik dan industri, antarmuka web terdiri dari banyak aplikasi CGI yang memproses permintaan HTTP pengguna. Dalam kasus kami, aplikasi CGI secara aktif menggunakan pustaka cgic, yang memfasilitasi kerja dengan permintaan HTTP, dan fungsi pustaka ini dibangun ke pustaka bersama yang libipinfusionweb.soterletak di sistem file perangkat.

Saat memproses permintaan HTTP, server web meneruskan data permintaan pengguna ke aplikasi CGI sebagai satu set variabel lingkungan. Pemrosesan awal mereka dilakukan oleh fungsi mainperpustakaan libipinfusionweb. Selanjutnya, fungsi mainmemanggil fungsi cgiMainaplikasi CGI, di mana pemrosesan lebih lanjut dari permintaan berlangsung.



Gambar 1. Memproses permintaan HTTP

Dalam pekerjaannya, fungsi utama perpustakaan libipinfusionwebmemanggil fungsi get_login_useryang, berdasarkan nilai Cookie yang dilewati, menentukan apakah pengguna telah melewati otentikasi dalam sistem.



Gambar 2. Fragmen pseudo-kode

fungsi utama Fungsi get_login_usermenerima nilai parameter Cookie c_sessionmenggunakan fungsi cookies_get_valuedan menyimpannya dalam variabel local_e0. Variabel itu sendiri local_e0adalah array karakter byte tunggal dengan panjang 0x80 dan terletak pada jarak 0xE0 dari awal stack.



Gambar 3. Fragmen kode pseudo dari fungsi get_login_user

Namun, dalam kode fungsi cookies_get_valuedapat dilihat bahwa cgiCookieStringnilai parameter Cookie yang diterima oleh fungsi memiliki panjang maksimum 0x400 byte.



Gambar 4. Sebuah fragmen kode pseudo dari fungsi cookie_get_value

Jadi, ketika melewati parameter Cookie lebih panjang dari 0xE0 (224) karakter, fungsi tersebut akan get_login_usermenyimpan nilai parameter ini ke stack-nya, sehingga semua informasi pada stack yang ada di belakang variabel local_e0akan ditimpa, termasuk alamat fungsi kembali.

Catatan: Saat satu fungsi memanggil fungsi lainnya, alamat pengirim disimpan di tumpukan. Kontrol ditransfer ke alamat ini ketika fungsi yang dipanggil menyelesaikan tugasnya. Dengan demikian, jika Anda menulis ulang alamat ini, Anda dapat memperoleh kendali atas proses eksekusi program. Misalnya, penyerang dapat mengganti alamat ini dengan alamat shellcode berbahaya yang terletak di ruang alamat program.

Perhatikan bahwa penulisan ulang alamat pengirim terjadi sebelum otentikasi diverifikasi, yang memungkinkan untuk mengeksploitasi kerentanan ini kepada penyerang yang tidak mengetahui kredensial perangkat.

Eksploitasi


Kami memeriksa beberapa opsi untuk menunjukkan kemungkinan mengeksploitasi kerentanan ini. Yang paling sederhana adalah menuliskan kode payload ke stack (0x400 - 0xE0 = 800 bytes tetap untuk itu, cukup untuk kode) dan menulis ulang alamat pengirim dengan alamat kode. Secara teoritis, opsi ini dimungkinkan, karena prosesor sakelar rentan tidak mendukung fungsi NX-bit (yaitu, ia memungkinkan eksekusi kode yang berlokasi di mana saja, termasuk di stack), tetapi dalam praktiknya ada batasan serius.

Prosesor sakelar yang rentan memiliki arsitektur MIPS; banyak instruksi prosesor dalam arsitektur ini dikodekan dalam urutan byte yang mengandung nol byte. Isi buffer ditulis ke nol byte pertama (karena penggunaan fungsistrcpy), oleh karena itu, hanya perlu menggunakan operan yang tidak mengandung byte nol, yang tidak mungkin, karena muatan apa pun akan menggunakan setidaknya beberapa byte ini.

Saat membuat rantai ROP, sekali lagi, kita harus menghadapi batasan byte nol: alamat gadget ROP tidak boleh mengandung nol, yang sangat mempersulit pencarian mereka. Pada umumnya, kita hanya bisa menggunakan satu nol, disalin oleh fungsi strcpy. Ini memberlakukan batasan pada pembuatan rantai ROP lengkap, dan selain itu, gadget yang kami butuhkan sangat sedikit. Namun, selama pencarian di perpustakaan libipinfusionweb, fragmen kode berikut ditemukan:



Gambar 5. Sebuah fragmen dari kode executable perpustakaan libipinfusionweb

Asalkan isi register $ s0 dikontrol, fragmen kode ini memungkinkan Anda untuk mengeksekusi perintah OS menggunakan fungsi mysystem(awalnya fungsi ini tidak memiliki nama, tetapi kami menamainya, karena sangat mirip dengan fungsi sistem di Linux).

Karena kita menulis ulang alamat pengirim dari fungsi get_login_user, fungsi ini akan dieksekusi sampai akhir. Dalam epilog fungsi get_login_user, Anda dapat melihat bahwa nilai register $ s0 dipulihkan dari nilai yang disimpan sebelumnya pada stack (pada offset 0xD8 dari atas stack). Namun, pada titik ini, area tumpukan ini sudah di bawah kendali kami, yaitu, pada kenyataannya, kami dapat mencapai kontrol atas isi register $ s0 dan dengan demikian menjalankan perintah OS sewenang-wenang menggunakan fungsi mysystem.



Gambar 6. Cuplikan dari kode yang dapat dieksekusi fungsi get_login_user

Jadi, agar berhasil menunjukkan eksploitasi kerentanan ini, kita perlu mengirim sebagai parameter Cookie c_sessiongaris panjang yang berisi:

  • Perintah string OS, yang selanjutnya akan diteruskan ke fungsi sistem saya;
  • alamat perintah ini di stack;
  • alamat pengirim baru (alamat fragmen kode yang ditunjukkan pada Gambar. 5).

Payload terakhir akan terlihat seperti ini:



Gambar 7. Payload

Pada titik ini, kami sudah memiliki shell pada perangkat yang diperoleh menggunakan kerentanan yang membutuhkan hak administrator untuk beroperasi. Karena itu, kami dapat memperoleh informasi tambahan yang membantu kami beroperasi:

  • ASLR pada perangkat yang diteliti dinonaktifkan - oleh karena itu, alamat gadget yang digunakan dan perintah OS akan selalu sama.



Gambar 8. Status ASLR pada perangkat yang sedang diselidiki

  • Kisaran alamat memori tempat tumpukan dapat diletakkan. Untuk menghitung alamat yang tepat, kami memeriksa semua alamat dalam rentang ini.

Sebagai payload, kami menerapkan pemuatan shell web, aplikasi CGI dengan konten berikut:

#!/bin/sh
eval $HTTP_CMD 2>&1

Karena, menurut protokol CGI, isi header HTTP dikirim ke aplikasi CGI dalam bentuk variabel lingkungan dengan nama HTTP_ <Header Name>, shell ini evalakan menggunakan perintah untuk mengeksekusi isi header HTTP CMD. Gambar di bawah ini menunjukkan hasil operasi yang sukses dan pelaksanaan perintah ls menggunakan shell yang dimuat.



Gambar 9. Hasil operasi dan eksekusi perintah ls yang berhasil

Kesimpulan


Kami telah menunjukkan kemampuan untuk mengeksploitasi kerentanan ini. Seperti yang telah kami sebutkan, operasinya tidak memerlukan pengetahuan tentang kata sandi, dan karena itu bahkan dapat dilakukan oleh penyerang yang tidak terauthentikasi.

Meretas saklar jaringan industri dapat membahayakan seluruh produksi. Pelanggaran interaksi jaringan dapat mempengaruhi proses sampai berhenti sepenuhnya.

Informasi tentang kerentanan dan PoC ditransmisikan ke vendor, yang merilis firmware yang diperbarui versi 1.34, dan pengenal CVE-2018-10731 ditugaskan untuk kerentanan itu sendiri.

Mencari seseorang


Jika Anda memiliki keinginan untuk melakukan hal-hal seperti itu, kami hanya mencari spesialis di tim kami. Kami terlibat dalam analisis keamanan sistem kontrol proses (fasilitas industri / energi / transportasi yang besar, dll.). Pada setiap proyek, kami mencari cara untuk menghentikan atau mengganggu pengoperasian objek-objek ini. Setiap kali kami menemukan banyak cara untuk memengaruhi proses pembuatan, mengeksplorasi perangkat keras dan perangkat lunak industri, menganalisis protokol jaringan milik. Kami menemukan dan melaporkan banyak tyrodeyev, menulis laporan (tidak sesuai dengan GOST) dan melakukan lebih banyak lagi. Ketika ada waktu, kami berbicara di IB dan tidak hanya konferensi. Tautan ke lowongan: hh.ru/vacancy/36371389

Diposting oleh Vyacheslav Moskvin, Positive Technologies

All Articles