Kami memeriksa kerentanan tertutup dan mendapatkan empat CVE baru

Saya diminta untuk melanjutkan serangkaian artikel tentang penutupan kerentanan dan tentang bagaimana mereka ditutup (artikel pertama kami dapat dibaca di sini ). Terakhir kali kami mengetahui bahwa meskipun pabrikan melaporkan penutupan kerentanan, maka pada kenyataannya semuanya mungkin tidak demikian.



Kriteria pemilihan:


Kriteria pemilihan untuk kerentanan yang dipertimbangkan kali ini adalah sama (dengan pengecualian bahwa kali ini saya ingin melihat jenis kerentanan lainnya):

  • harus ada eksploitasi - kami ingin melihat bahwa sebelum pembaruan semuanya dieksploitasi dengan baik, dan setelah itu menjadi baik;
  • kerentanan harus kritis (idealnya RCE) dan dengan skor tinggi;
  • produk harus open source;
  • produk tidak boleh ditinggalkan dan digunakan secara aktif;
  • kerentanan harus relatif baru;
  • seperti biasa, hal utama adalah bahwa kita sendiri akan tertarik.

Apa dan bagaimana saya memilih:


Saya pergi ke vulners.com dan meminta untuk menunjukkan semua exploit dengan exploit-db.com dalam beberapa minggu terakhir. Kali ini dalam kategori web, hampir semua eksploitasi ditulis oleh Ihsan Sencan, tetapi karena fakta bahwa mereka paling sering berhubungan dengan injeksi sql dalam aplikasi dan plugin lama yang tidak didukung, saya menghapusnya. Dari produk yang tersisa, hanya ProjeQtOr Project Management Tool 7.2.5 dengan kerentanan CVE-2018-18924 masuk dalam kategori “tidak ditinggalkan dan secara aktif berkembang”.
Kerentanan ini memenuhi semua kriteria pemilihan:

  • ada eksploitasi ;
  • Kerentanan RCE (meskipun mengharuskan pengguna untuk diotorisasi);
  • produknya cukup open source;
  • produk tidak ditinggalkan, pada tahun 2018 ada 28 rilis dan hanya sourceforge.net ada 702 unduhan (dan sebagian besar unduhan pembaruan menyelesaikan masalah CVE, yang kemungkinan besar menunjukkan bahwa orang melihat CVE dan mulai memperbarui);
  • CVE 4 November, eksploitasi 25 Oktober, ini memenuhi persyaratan kebaruan;
  • Saya melihat masalah dan solusinya, saya menjadi tertarik (lebih lanjut tentang itu nanti).

Memahami Alat Manajemen Proyek ProjeQtOr


Kami membaca deskripsi exploit dan deskripsi CVE di nist.gov , kami memahami bahwa versi 7.2.5 hanya rentan untuk pengguna yang diotorisasi. Dan juga Anda dapat mengunggah file .shtml sebagai gambar, meskipun meskipun pesan kesalahan "File ini bukan gambar yang valid" ditampilkan, file tersebut akan tetap disimpan ke gambar di server dan dapat diakses melalui tautan langsung di host / file / images / image_name .



Akses melalui tautan langsung baik, tetapi di sini Anda masih harus menebak nama file yang akan diunduh. Kami beruntung, dan ini tidak acak, tetapi dihasilkan dari waktu saat ini dalam format: tahun, bulan, hari, jam, menit, detik. Hasilnya adalah angka seperti 20181114140320. Selanjutnya, ID pengguna dan kemudian nama file asli melalui garis bawah. Ada beberapa yang tidak diketahui:

  • Zona waktu di server
  • jika jam di server turun;
  • ID pengguna

Dan sekali lagi kami beruntung: jika Anda mengunggah gambar yang valid, maka semua parameter ini akan dilaporkan kepada kami. Tidak sulit untuk membahas beberapa opsi tautan (beberapa, karena ada beberapa detik, tetapi sulit untuk langsung masuk ke dalamnya).



Secara umum, mendapatkan nama file tidak menjadi masalah. Kami melanjutkan. Dan kami pikir, mengapa tidak hanya mengunggah skrip php? Kami mencoba mengunduhnya, jendela yang sama muncul, tetapi file tersebut tidak muncul di direktori. Saatnya melihat kode!

Script uploadImage.php bertanggung jawab untuk mengunggah gambar ke server dalam versi 7.2.5. Kami tertarik pada baris 100 hingga 117.

if (substr($ext,0,3)=='php' or substr($ext,0,4)=='phtm') { if(@!getimagesize($uploadedFile['tmp_name'])) { $error=i18n('errorNotAnImage'); } else { traceHack("Try to upload php file as image in CKEditor"); } } else { if ( ! move_uploaded_file($uploadedFile['tmp_name'], $uploadfile)) { $error = htmlGetErrorMessage(i18n('errorUploadFile','hacking ?')); errorLog(i18n('errorUploadFile','hacking ?')); } } } if (!$error) { if(@!getimagesize($uploadfile)) { $error=i18n('errorNotAnImage'); } } 

Baris 100 bertanggung jawab untuk memeriksa ekstensi file: jika itu adalah php atau phtm, maka file tersebut dibuang dan tidak disimpan. Oleh karena itu file php tidak muncul di direktori "file / gambar /". Baris 115 menciptakan kesalahan yang kita lihat, tetapi tidak melakukan apa pun dengan file tersebut.

Yah, jangan tinggalkan eksploitasi dan unggah file dengan ekstensi .shtml. Di sini perlu dilakukan penyimpangan kecil dan memberi tahu apa .shtml itu dan apa yang dimakannya.

SHTML dan SSI


Definisi Wikipedia:

SSI (Sisi Server Termasuk - inklusi di sisi server) - bahasa sederhana untuk "perakitan" dinamis halaman web di server dari komponen individual dan pengiriman dokumen HTML yang diterima ke klien. Diimplementasikan di server web Apache menggunakan modul mod_include. Fitur yang termasuk dalam pengaturan default server web memungkinkan Anda untuk memasukkan file HTML, oleh karena itu, untuk menggunakan instruksi, file tersebut harus diakhiri dengan ekstensi .shtml, .stm atau .shtm.

Dengan kata-kata Anda sendiri:

SHTML adalah HTML yang dapat mengeksekusi set instruksi sisi server. Dari yang berguna ada fungsi exec yang mengeksekusi perintah sewenang-wenang di server (ya, kita dapat mengunduh file menggunakan kode HTML dan menjalankannya).

Berikut ini contoh kode untuk menjalankan kode arbitrer:

 <!--#exec cmd=”ls” --> 

Kabar baiknya adalah bahwa fungsi ini tidak diaktifkan secara default di server Apache2, dan untuk mengaktifkannya Anda harus menari dengan rebana. Dalam beberapa jam memilih konfigurasi, saya bisa membuat kembalinya variabel lingkungan berfungsi, tetapi bukan perintahnya. Ini kode SSI saya:

 <html> <head> <title>thegeekstuff.com</title> </head> <body> <p> Today is <!--#echo var="DATE_LOCAL" --> <!--#exec cmd="ls" --> </p> </body> </html>  : Today is Wednesday, 14-Nov-2018 17:29:14 MSK [an error occurred while processing this directive] 

Jika seseorang memberi tahu Anda apa yang harus ditulis dalam konfigurasi agar berfungsi dengan benar, saya ingin membacanya.

Mengeksploitasi kerentanan


Jika bintang-bintang bertemu, Anda dapat mengunduh file shtml dan menjalankan perintah sewenang-wenang (atau, seperti saya, lihat waktu di server).

Menonton tambalan


Versi berikutnya adalah 7.2.6, tetapi tidak ada perubahan terkait kerentanan yang kami minati (nist.gov lagi-lagi tertipu).

Kami melihat versi 7.2.7 dan tampaknya semuanya sudah diperbaiki (pengembang sendiri mengatakan bahwa semuanya sudah diperbaiki hanya dalam versi ini). Ada dua perubahan utama:

1. Di antara ekstensi terlarang, "shtm" telah ditambahkan (jika 4 karakter pertama seperti itu, shtml juga termasuk di sini):

 if (substr($ext,0,3)=='php' or substr($ext,0,4)=='phtm' or substr($ext,0,4)=='shtm') { 


2. File yang bukan gambar sekarang dihapus:

  if(@!getimagesize($uploadfile)) { $error=i18n('errorNotAnImage'); kill($uploadfile); } 

Tampaknya Anda dapat menyimpang, karena non-gambar dihapus, dan shtml bahkan tidak berusaha untuk bertahan. Tapi saya selalu tidak suka jika mereka mencoba menyelesaikan masalah dengan daftar hitam. Misalnya, di beberapa negara, perusahaan melarang jejaring sosial. Ini mengarah pada fakta bahwa pengguna mulai menggunakan "mirror" dari jejaring sosial, di mana nama pengguna dan kata sandi mereka dicuri. Kata sandi mereka bertepatan dengan kata sandi perusahaan, tetapi kemudian mungkin ada masalah yang jauh lebih besar daripada karyawan yang membalik-balik instagram sambil minum kopi.

Dalam pemrograman web dan keamanannya, daftar hitam juga jahat.

Bypass daftar hitam dari ProjeQtOr


Yah, semuanya sederhana. Pertama, mari kita lihat file apa yang dapat ditafsirkan oleh Apache2 + PHP pada pengaturan default (semuanya diinstal pada ubuntu 16.04 dengan repositori yang diperbarui). Arahan “FilesMatch” bertanggung jawab atas kemampuan untuk menafsirkan file. Kami melakukan pencarian dengan perintah "grep -r" <FilesMatch "/ etc / apache2" dan berikut ini hasilnya:

 /etc/apache2/mods-available/php7.0.conf:<FilesMatch ".+\.ph(p[3457]?|t|tml)$"> /etc/apache2/mods-available/php7.0.conf:<FilesMatch ".+\.phps$"> /etc/apache2/mods-available/php7.0.conf:<FilesMatch "^\.ph(p[3457]?|t|tml|ps)$"> /etc/apache2/sites-available/default-ssl.conf: <FilesMatch "\.(cgi|shtml|phtml|php)$"> /etc/apache2/apache2.conf:<FilesMatch "^\.ht"> 

Dalam konfigurasi default-ssl.conf, semua ekstensi hanya terdaftar secara keseluruhan, ini adalah: cgi, shtml, phtml, php. Sayangnya, semuanya kecuali cgi disaring di ProjeQtOr.

Konfigurasi php7.0.conf jauh lebih menarik, di dalamnya ekstensi diatur oleh ekspresi reguler. Kami mendapatkan:
EkstensiApa yang difilter
phpsubstr ($ ext, 0.3) == 'php'
php3substr ($ ext, 0.3) == 'php'
php4substr ($ ext, 0.3) == 'php'
php5substr ($ ext, 0.3) == 'php'
php7substr ($ ext, 0.3) == 'php'
phtTIDAK ADA
phtml3substr ($ ext, 0.4) == 'phtm'

Hebat, ekstensi file yang tidak difilter ditemukan. Kami memverifikasi bahwa itu benar-benar ditafsirkan.

Buat file test.pht dengan konten berikut:

 <?php phpinfo(); 

Kami membuka file ini di browser dan melihat informasi tentang php yang diinstal. Hebatnya, daftar hitam dilewati, sementara untuk pengaturan non-default, untuk beberapa alasan, ekstensi lain untuk interpretasi dapat diizinkan.

Kami memuat file pengujian kami di Alat Manajemen Proyek ProjeQtOr. Tentu saja, kami mendapatkan kesalahan, karena ini bukan gambar (dalam versi sebelum 7.2.7, kami sudah memiliki eksekusi kode di server, karena mengubah phpinfo ke menjalankan perintah tidak sulit). Dalam versi 7.2.7, file dihapus, dan kode tidak dieksekusi.

Tapi kami tidak kesal dan memintas pemeriksaan pada gambar.

Gambar PHP


Memeriksa apakah file yang diunduh adalah gambar di ProjeQtOr Project Management Tool dilakukan oleh fungsi getimagesize, yang hanya melihat pada header file yang ditransfer.

Mengambil keuntungan dari kenyataan bahwa mungkin ada sampah di file php, dan interpretasi kode php dimulai hanya dengan karakter "<? Php", kita menulis kode kecil yang pertama menulis gambar, dan kemudian kode php yang kita butuhkan. Sebagai gambar, kami akan mengirim tangkapan layar dari jendela kesalahan. 3 baris kode python dan Anda selesai:

 data = open ('test.png','rb').read() data += open ('test.pht','rb').read() open ('new_pht_png.pht','wb').write(data) 

Mungkin, Anda bisa saja menulis header gambar yang valid di awal file, tetapi lebih mudah, dan terlebih lagi, gambar ditampilkan di setiap pemirsa.

Kami mengunggah kreasi ini ke server dan, lihat, itu dimuat (dan ditampilkan di pemirsa sebagai gambar), dan kami juga senang ditunjukkan nama lengkap tempat file ini diunggah.



Kami pergi ke file yang diunduh localhost / files / images / 2018111417173030__new_pht_png.pht dan melihat gambar yang diunduh sebagai teks, dan output phpinfo di bawahnya. Jelas bahwa mengganti phpinfo dengan shell web sederhana tidak sulit. Misalnya, ini: <? Sistem php ($ _ GET ['cmd']);



Setelah Anda mulai memilih unduhan file, Anda harus menyelesaikan pekerjaan dan melihat di mana lagi ada unduhan file dengan atau tanpa daftar hitam.

Unggah file lain


Kami akan menonton dalam versi terbaru yang tersedia. Dengan asumsi bahwa Anda menggunakan fungsi yang sama untuk mengunggah file seperti sebelumnya, mis. move_uploaded_file, kami mencarinya di direktori proyek "grep -r" move_uploaded_file "./". Kami mendapatkan 5 file berikut:

./tool/uploadImage.php
./tool/saveDocumentVersion.php
./tool/uploadPlugin.php
./tool/import.php
./tool/saveAttachment.php

File uploadImage.php - sudah tampak.
File saveDocumentVersion.php - unduh versi dokumen (sesuai namanya). Kami mencoba mengunduh dokumen dan melihatnya (sebagai permulaan kami akan selalu memuat gambar). Setelah mengunduh, kita melihat bahwa ekstensi .1 ditambahkan ke file. Kami melihat dalam kode bagaimana nama itu diperoleh (ini dilakukan pada baris 229):

 $uploadfile = $dv->getUploadFileName(); 

Fungsi getUploadFileName dideklarasikan dalam file DocumentVersionMain.php. Di sana, pada baris 227, kita melihat bahwa "." Ditambahkan ke nama yang dikembalikan. dan dokumen ID. Kami tidak dapat menyiasati titik tambahan:

 return $uploaddir . $paramPathSeparator . $fileName . '.' . $this->id; 

File uploadPlugin.php hanya dapat diakses oleh administrator dan fakta bahwa plugin mungkin memiliki kode yang buruk sangat logis dan sulit untuk dihilangkan tanpa harus memasukkan validasi plugin (seperti yang dilakukan CMS populer). Tentu saja, ketika Anda mencoba mengunduh sesuatu di sana, itu berhasil dimuat, dan kemudian dieksekusi.

File import.php juga hanya tersedia untuk administrator. Saat mengunduh file, kita diberitahu bahwa itu harus berupa file csv atau file xlsx. Tentu saja, kami mencoba memuat file php dan melihat kesalahan:

GALAT - Jenis file yang diberikan dan format file yang dipilih tidak cocok


Impor dibatalkan

Masalahnya adalah, seperti pada bug asli dari CVE, file tersebut tidak dihapus, tetapi tetap tersedia di localhost / file / attach / import / test.php .

File saveAttachment digunakan saat memuat lampiran apa pun (misalnya, saat memuat gambar Anda sendiri). Script PHP tidak merangkak di sana, karena ada perlindungan formulir:

 if (substr($ext,0,3)=='php' or substr($ext,0,4)=='phtm' or substr($ext,0,4)=='shtm') { $attachment→fileName.=".projeqtor"; 

ternyata file ekstensi php *, phtm *, shtm * ekstensi ".projeqtor" ditambahkan, yaitu, jelas file pht kami akan merayapi di sana (bahkan tanpa merangkak gambar). Kami mencoba, dan kami mendapatkan semuanya di alamat localhost / files / attach / attachment_1 / test.pht .

Total garis bawah dari lima lokasi pengunduhan file yang ditemukan dengan cepat:

  • berhasil memuat skrip php atau pht 4 kali;
  • validasi daftar hitam ada dua;
  • validasi daftar putih tidak ada di mana pun;
  • sekali gagal mengunduh file (gagal mengunduh, tetapi gagal dieksekusi), karena ekspansi berubah

Kesimpulan tentang Alat Manajemen Proyek ProjeQtOr dan CVE-2018-18924



  • kerentanan yang dilaporkan telah dihilangkan;
  • ada kerentanan lain dalam kode (dilaporkan ke pengembang, dan mereka bahkan menjanjikan daftar putih ekstensi);
  • konfigurasi yang tepat dari server Apache2 dapat menyelamatkan kita dari segalanya (membatasi format yang dapat dieksekusi hanya diperlukan, melarang eksekusi skrip di folder pengguna);
  • nist.gov tidak mengandung versi rentan terbaru.

Catatan nyonya


  • menolak daftar hitam sedapat mungkin (saya tidak tahu di mana ini tidak mungkin);
  • hati-hati dan penuh perhatian saat memproses file yang diunduh (lebih baik berada di satu tempat, dan tidak menyebar 5);
  • server web yang dikonfigurasi dengan benar menyelamatkan dari banyak masalah dalam kode proyek (penting untuk menulis kode dan mengkonfigurasi server dengan baik).

Jawaban terperinci dari pengembang


Jawaban pertama dari pengembang adalah sesuatu seperti "kami memperbaiki semuanya, jadi lihat kode yang diperbaiki". Saya harus melukis dengan sangat rinci di mana beberapa masalah berada dan bagaimana mereka dapat dieksploitasi.

Kemudian dia menerima jawaban terperinci: “ya ada masalah, dan mereka akan diperbaiki dalam versi 7.3.0. Daftar putih juga akan ditambahkan untuk gambar untuk xlslx dan csv. " Mereka juga menulis bahwa mereka memiliki rekomendasi untuk menambahkan direktori "lampiran" dan "dokumen" di luar akses web dalam instruksi instalasi.

Pengembang mengizinkan saya untuk mendaftar CVE dan menulis artikel setelah pembaruan (yang keluar dan tersedia untuk diunduh ).

Kesimpulan


Seperti yang saya tulis di awal, beberapa orang telah mengunduh pembaruan yang memutuskan CVE (lebih dari 500 unduhan), dan itu keren bahwa orang memperbarui perangkat lunak mereka yang rentan, tetapi menyedihkan bahwa perangkat lunak itu tetap rentan.

Akibatnya, empat CVE ditugaskan kepada saya dan perusahaan kami: CVE-2018-19307, CVE-2018-19308, CVE-2018-19309, CVE-2018-19310.

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


All Articles