Kisah satu kasus uji "rusak", atau berhati-hatilah dengan versi OpenSSL ...

Penolakan. Saya bukan "tukang las sungguhan", tetapi karena saya mencari pekerjaan menarik di bidang keamanan informasi, baru-baru ini saya secara teratur menyelesaikan berbagai CTF dan mesin di HackTheBox. Oleh karena itu, ketika saya dikirimi link ke salah satu item tes bergaya KKP, saya tidak dapat lewat ...







Arti item tes cukup sederhana. Dump lalu lintas diberikan, yang berisi kunci enkripsi, beberapa sampah, dan bendera terenkripsi. Kita perlu mengekstraknya dan menguraikan benderanya. Juga ditampilkan perintah OpenSSL yang dienkripsi bendera ini. Lalu lintasnya cukup menarik, tetapi setelah 10 baris kode python, saya memiliki kunci enkripsi, sampah, dan bendera terenkripsi di depan saya. Tampaknya, apa yang salah?



Tugas tersebut mengatakan bahwa bendera itu dienkripsi dengan kira-kira perintah berikut (saya menghilangkan beberapa parameter yang tidak signifikan dan mengubah algoritma enkripsi).



echo "FLAG_xxxx…xxxxxx" | openssl enc -e -base64 -aes-256-cbc -nosalt -k $password 
      
      





Saya memasukkan parameter yang diperoleh dari lalu lintas ke dalam perintah, memulainya dan ... mendapat sampah! Saya mencoba lagi. Buang lagi. Saya mencoba membangun kembali lalu lintas dengan berbagai cara. Tidak, tampaknya, lalu lintas hanya dapat dikumpulkan dengan jelas. Tapi keluaran enkripsi adalah sampah lagi !!! Pada saat yang sama, OpenSSL dengan jujur ​​memperingatkan bahwa mendapatkan kunci dari kata sandi dalam 1 lintasan adalah ide yang buruk ...



echo "ENCRYPTED_FLAG" | openssl enc -d -base64 -aes-256-cbc -nosalt -k $key 
*** WARNING : deprecated key derivation used.
Using -iter or -pbkdf2 would be better.
      
      





Hari berikutnya dihabiskan untuk mencoba memecahkan kegilaan ini. Saya cukup beralasan bahwa ternyata saya telah salah mengisolasi "sampah" yang ditentukan dalam kondisi dan menulis beberapa opsi untuk membagi string yang dihasilkan menjadi "kata sandi" dan "bendera terenkripsi" untuk "kekerasan" berikutnya. Itu tidak membantu ... Saya mulai sangat memahami setiap parameter.



Seperti yang kita ketahui, AES membutuhkan kunci enkripsi dan IV (vektor inisialisasi) agar dapat berfungsi. Opsi -k memungkinkan kita untuk menggunakan frase teks, dari mana OpenSSL sendiri mendapatkan kunci dan IV yang diperlukan. Anda dapat melihatnya menggunakan parameter -p.



echo "FLAG_123" | openssl enc -e -base64 -aes-256-cbc -nosalt -p -k "password"
*** WARNING : deprecated key derivation used.
Using -iter or -pbkdf2 would be better.
key=5E884898DA28047151D0E56F8DC6292773603D0D6AABBDD62A11EF721D1542D8
iv =3B02902846FFD32E92FF168B3F5D16B0
C11kA+GcqkU4ocOvZAVr3g==
      
      





Pengetahuan ini juga tidak memberi saya apa-apa. Namun kemudian saya memutuskan untuk kembali ke ide paling gila yang terpikir oleh saya. Yaitu: masalahnya bukan pada saya, tetapi ada sesuatu yang berubah di OpenSSL ... Lalu

lintasnya bertanggal 2016, jadi saya mengambil Ubuntu 14.04 dan, tanpa banyak harapan untuk berhasil, hanya memasukkan data awal ke dalamnya. Dan tiba-tiba, alih-alih sampah, saya mendapat BENDERA! Malam itu berhenti menjadi lesu ... Selain itu, perintah yang sama dengan kata sandi yang sama dan parameter -p menghasilkan kunci enkripsi dan IV yang sama sekali berbeda!



SISTEM BARU (openssl 1.1.1h)



echo "FLAG_123" | openssl enc -e -base64 -aes-256-cbc -nosalt -p -k "password"
*** WARNING : deprecated key derivation used.
Using -iter or -pbkdf2 would be better.
key=5E884898DA28047151D0E56F8DC6292773603D0D6AABBDD62A11EF721D1542D8
iv =3B02902846FFD32E92FF168B3F5D16B0
C11kA+GcqkU4ocOvZAVr3g==

      
      





SISTEM LAMA (openssl 1.0.1f)



echo "FLAG_123" | openssl enc -e -base64 -aes-256-cbc -nosalt -p -k "password"
key=5F4DCC3B5AA765D61D8327DEB882CF992B95990A9151374ABD8FF8C5A7A0FE08
iv =B7B4372CDFBCB3D16A2631B59B509E94
R3N+5v3zOz9QcNt08cwqcA==
      
      





Jelaslah bahwa ketakutan itu terbukti. Algoritme untuk menghasilkan Key dan IV dari frasa sandi telah berubah, yang benar-benar merusak kemampuan untuk menyelesaikan CTF secara langsung pada versi modern OpenSSL. Dalam proses mencari nuansa implementasi, saya menemukan sebuah karya yang sangat menarik " Analisis Enkripsi OpenSSL berbasis Sandi dari Key Derivation Protocol " dan semuanya jatuh ke tempatnya. Singkatnya, versi 1.1.0 menambahkan protokol baru untuk menghasilkan kunci dari sandi PBKDF2, tetapi yang lebih penting, algoritme PBKDF1 yang lama mengubah algoritme hashing default dari MD5 ke SHA-256! Jadi, password yang sama menghasilkan Key dan IV yang berbeda. Untuk mendekripsi yang sebelumnya dienkripsi, di versi yang lebih baru Anda perlu menggunakan parameter -md md5 .



“-Md messagedigest: tentukan intisari pesan yang digunakan untuk derivasi kunci dari md2, md5, sha, atau sha1



Setelah menambahkan parameter ini, menjadi mungkin untuk mendapatkan bendera pada OpenSSL baru. Saya tidak tahu apakah "nuansa" seperti itu benar-benar diperhitungkan oleh pengembang tugas pengujian atau mereka tidak mengujinya pada sistem modern, tetapi kenyataannya tetap bahwa saya harus mendalami beberapa seluk-beluk OpenSSL.



PS Melalui kenalan saya, saya telah memberi tahu pengembang tes tes tentang masalah yang saya temukan, jika tidak, mereka tiba-tiba sangat terkejut bahwa orang-orang ini tidak pergi kepada mereka ...



All Articles