Topik keamanan pembelajaran mesin akhir-akhir ini cukup ramai dan saya ingin menyentuh sisi praktisnya. Dan kemudian alasan kerennya adalah
PHDays , di mana berbagai pakar dari dunia keamanan informasi berkumpul dan ada kesempatan untuk menarik perhatian pada topik ini.
Secara umum, kami melakukan CTF berbasis tugas, dengan tugas yang memengaruhi sebagian risiko keamanan menggunakan teknik pembelajaran mesin.

Apa itu CTF ???Capture The Flag (CTF) adalah kompetisi keamanan komputer yang sangat populer (dalam popularitas sebagai kompetisi yang menakjubkan untuk pusat data). Ada dua format: tugas (jeorpady) dan layanan (serangan-pertahanan). Kami melakukan tugas.
Kompetisi Tugas Klasik menyerupai format "Game Anda". Ketika ada satu set tugas kategori yang berbeda yang memiliki biaya yang berbeda.
Kategori tradisional dalam CTF adalah: kerentanan web-web, rekayasa terbalik-mundur, kripto-kriptografi, stegano-steganografi, eksploitasi biner-biner.
Tim (dari 1 hingga n orang) menyelesaikan tugas dan siapa pun yang menyelesaikan tugas untuk jumlah poin yang lebih besar adalah rekan yang baik.
Kompetisi kami berlangsung sedikit lebih dari sehari. Dipahami bahwa itu adalah individu - tim satu orang. Saya ingin orang-orang mengambil bagian dalam konferensi untuk mengenal satu sama lain secara pribadi. Oleh karena itu, tugas harus diselesaikan dalam beberapa jam, tidak memerlukan banyak sumber daya komputasi, namun, tugas yang sulit juga harus - tidak semua harus menang: D
Akibatnya, kami memiliki 6 tugas (yang ketujuh hanya menyenangkan), tampaknya untuk satu orang sehari sudah cukup. Sayangnya, tugas itu sendiri tidak tersedia lagi. Tapi mungkin setelah membaca analisisnya, Anda ingin berpartisipasi lain kali?

Saya ingin mengucapkan terima kasih yang mendalam kepada orang-orang yang tanpanya KKP ini tidak akan terjadi:
@groke dan
@mostobriv . Ide-ide paling keren, solusi teknis dan pesta penempatan pada malam sebelum dimulainya - apa yang bisa lebih indah ketika berada di perusahaan yang hebat ?! :)
Stegano: Aww - 100
tiny.cc/6fj06yDan dataset dari 3.391 gambar kucing dan anjing.

Pencarian itu ditandai sebagai "Stegano". Pekerjaan berlapis melibatkan menyembunyikan beberapa informasi. Tampaknya mudah untuk menebak bahwa kucing dan anjing adalah sesuatu yang biner. Setelah sedikit berpikir, kita dapat mengasumsikan bahwa urutan kucing dan anjing ini dapat menjadi semacam pesan biner. Misalkan anjing laut akan menjadi 1, dan anjing-anjing - 0. Jika tiba-tiba itu tidak berhasil, Anda cukup menukar mereka. Selanjutnya, kami menemukan model terlatih yang mengklasifikasikan kucing dan anjing. Ada banyak contoh pelajaran tentang klasifikasi kucing dan anjing, serta model terlatih setelah mereka - Anda dapat menemukan model terlatih di github. Kami mengambil model yang terlatih, dalam kasus ekstrim, kami melatih diri kami sendiri. Kami memperkirakan setiap gambar sebagai 0 atau 1. Dan urutan "byte" ini diterjemahkan ke dalam string.
Anda dapat melihat solusi penulis di sini | import time |
| import sys |
| import os |
| |
| import numpy as np |
| |
| from keras.models import load_model |
| from keras.preprocessing import image |
| |
| data_path = "../data/" |
| picture_path = data_path + "{}.jpg" |
| |
| CLASSES = [1, 0] |
| |
| def run(model_path): |
| pictures_names = os.listdir(data_path) |
| pic_num = len(pictures_names) |
| |
| model = load_model(model_path) |
| |
| res = [] |
| for pic in range(pic_num): |
| img = image.load_img(picture_path.format(pic), target_size=(224,224)) |
| x = image.img_to_array(img) |
| x = np.expand_dims(x, axis=0) |
| preds = model.predict(x) |
| |
| y_classes = preds.argmax(axis=-1) |
| res.append(CLASSES[y_classes[0]]) |
| |
| res = ''.join(map(str, res)) |
| |
| n = int("0b" + res, 2) |
| text = n.to_bytes((n.bit_length() + 7) // 8, 'big').decode() |
| |
| print(text) |
| |
| |
| if __name__ == '__main__': |
| if len(sys.argv) < 2: |
| print("path to the model expected") |
| exit(1) |
| |
| run(sys.argv[1]) |
Kami mendapatkan teks yang berisi flag `AICTF {533m5_y0u_und3r574nd_4n1m4l5}`.
Namun, untuk beberapa alasan, beberapa peserta pada waktu yang berbeda mencoba untuk mengibarkan bendera aneh dengan kata "Diadopsi". Kami tidak tahu dari mana mereka mendapatkannya, jika tiba-tiba peserta menjelaskan, itu akan keren: D
Catatan

Layanan itu semacam "blog", di mana setiap pengguna dapat meninggalkan entri publik dan pribadi. Karena fungsinya kecil - tidak sulit untuk menebak bahwa Anda perlu mendapatkan catatan pribadi.
Sebenarnya hanya ada satu bidang input - id rekaman.
Apa yang harus dilakukan
Hal pertama yang terlintas dalam pikiran penjaga keamanan adalah mencoba injeksi sql. Namun, konon layanan ini dilindungi oleh AI. Dan saya tidak bisa mengirim injeksi sql sederhana. Layanan menanggapi serangan seperti itu dengan "Upaya peretasan!" Banyak yang mencoba melewatinya seperti bendera, tetapi benar-benar berpikir bahwa semuanya begitu sederhana?
Di bawah kap tes adalah jaringan LSTM yang menganalisis id untuk injeksi sql. Namun, input ke LSTM harus panjang tetap. Untuk kesederhanaan, kami membatasi hingga 20 karakter. Yaitu, logikanya adalah ini: kita menerima permintaan, jika lebih dari 20 karakter - kita memotongnya dan memeriksa sisanya, jika kurang, lalu tambahkan 0.
Sebenarnya, oleh karena itu, injeksi sql sederhana tidak segera berfungsi.
Namun, ada peluang untuk menemukan vektor yang tidak akan dilihat dan diambil oleh jaringan untuk permintaan yang baik.
Pembaca QR Edge baru

Itu perlu untuk mengenali kode QR:

File untuk tugas tersedia
di siniBeberapa file terenkripsi diberikan. Di antara mereka adalah file pyc, dengan membalik yang jelas bahwa ada fungsi dengan kode yang memungkinkan untuk memahami bahwa semua file yang diperlukan adalah AES dienkripsi pada kunci, yang diterima dari bytecode fungsi ini dan yang lain di dalamnya.
Ada dua solusi yang mungkin: parsing file-pyc dan dapatkan implementasi fungsi, atau buat modul proxy hashlib Anda sendiri, yang akan menampilkan argumen dan menjalankannya, Anda bisa mendapatkan kunci, lalu mendekripsi file dan menjalankan QR-Reader, yang mengenali gambar yang diusulkan sebagai bendera.
Keputusan terperinci dari peserta yang mengambil tempat ke-3 dapat ditemukan di sini:
Tantangan prediksi

Layanan itu semacam kompetisi seperti pada kaggle. Dimungkinkan untuk mendaftar, mengunduh data dan mengunggah model, mereka diuji pada data pribadi dan hasilnya dicatat di papan skor.
Dan tujuannya tampak jelas - mendapatkan akurasi 1.0.
Apakah itu sulit? Tidak mungkin: D
Data dihasilkan secara acak dan, tentu saja, tersirat bahwa keakuratan tersebut harus diperoleh dengan cara lain. Layanan menerima model dalam format .pickle. Dan tampaknya semua orang sudah tahu, tetapi ternyata tidak semua orang bisa mendapatkan
RCE melalui acar, tetapi apa yang bisa lebih buruk?
Keputusan Nikita (konodyuk)
Sebenarnya, ini harus dilakukan! Setelah memperoleh akses jarak jauh ke server, dimungkinkan untuk mengunduh data yang menguji solusinya, melatih ulang model dan mendapatkan akurasi 1.0 dan disertai flag.
Fotogram

Seperti namanya, layanan melakukan sesuatu dengan gambar.
Antarmuka aplikasi yang menakjubkan menyarankan untuk mengunggah foto.

Sebagai tanggapan, gambar dengan gaya yang berubah dan logo kompetisi dikirimkan kepada Anda.

Di mana bendera di sini?
Tampaknya cukup umum untuk menemukan kerentanan biasa pada CTF - kali ini adalah
Image Tragick . Namun, sedikit yang menduga atau tidak semua orang yang mencobanya dieksploitasi.
Antivirus zaman baru
Tugas ini ternyata menjadi ceri pada kue dan masalah yang belum terpecahkan. Meskipun setelah berbicara dengan para peserta, ternyata mereka sangat dekat dengan jawabannya.

File untuk tugas dapat dilihat
di siniSistem menerima bytecode python dan dijalankan di rumah. Tapi, tentu saja, dia tidak akan melakukannya begitu saja, karena ada "AI". Dia memeriksa versi python dan tidak mengizinkan yang "salah". Jika kode tersebut lulus tes, itu diluncurkan di server - yang berarti Anda bisa mendapatkan banyak informasi.
Bytecode yang diberikan interpreter dapat diencerkan dalam bit, dan jaringan saraf yang diperiksa akan hilang (itu juga LSTM), atau Anda bisa menambahkan banyak sampah di akhir.
Lebih lanjut, ketika Anda tahu cara mengeksekusi kode Python, dimungkinkan untuk mendeteksi binar `flag_reader` di server, yang diluncurkan dari root. Binar memiliki kerentanan format string yang melaluinya bendera dapat dibaca.
Solusi Nikita (konodyuk) juga dapat ditemukan di sini.Ringkasan
Pada akhir kompetisi, 130 terdaftar, 14 melewati setidaknya satu bendera, dan 5 dari 6 tugas diselesaikan - itu berarti kami berhasil menyeimbangkan tugas yang kompleks dan mudah.
Menimbang bahwa kami tidak menyebarkan informasi terlalu banyak, seperti yang kami lakukan untuk pertama kalinya dan tidak akan siap untuk beban yang berat, kami masih mempertimbangkan kompetisi super sukses.
Hadiah yang dimenangkan:- 1 tempat - diam
- Posisi Kedua - kurmur
- Posisi Ketiga - konodyuk
Para pemenang diberikan pada akhir hari kedua PHDays dengan penghargaan dan hadiah keren: AWS DeepLens, Coral Dev Board dan tas ransel dengan logo konferensi.
Orang-orang yang biasanya bermain CTF klasik dan sekarang menyukai pembelajaran mesin telah menilai kontes kami, jadi kami berharap lain kali akan bergabung dengan para ilmuwan data yang tertarik pada keamanan.