Halo semuanya, saya Nikita Kurtin, kurator TI dan keamanan sekolah menengah Israel
HackerU .
Dan saya terus berbicara tentang pengujian cyber dari perusahaan Israel terkemuka di bidang Pemeriksaan keamanan informasi. Dalam
posting sebelumnya saya menggambarkan bagaimana saya menjalani empat tes, dan dalam hal ini saya ingin berbicara tentang tiga tes berikutnya yang berhasil saya lewati.
Bagi mereka yang melewatkan pos pertama, saya akan memberi tahu Anda musim panas ini.
Checkpoint telah menerbitkan serangkaian uji coba dunia maya.
Tantangan resmi berakhir pada akhir September 2018.
Tugas dibagi menjadi enam kategori:
• Logika
• Web
• Pemrograman
• Jaringan
• Membalik
• Kejutan
Dua tugas untuk setiap arah. Seperti yang sudah saya
tulis , Checkpoint sudah berhasil mendapatkan rasa hormat dan minat pada bagian saya, jadi saya memutuskan untuk menerima tantangan ini. Namun, karena pekerjaan, saya mampu mengambil hanya 8 dari 12 tugas (dari empat kategori berbeda). Dan saya berhasil memecahkan 7 dari mereka.
Jadi:
Tantangan: Puzzle
Deskripsi:
Akhirnya kami menemukanmu!
Kita perlu menyusun puzzle ini, dan seperti yang dikatakan ramalan - hanya Anda yang mampu melakukannya.
Teka-teki ini sangat aneh. Ini terdiri dari papan dengan 10 kolom dan 10 baris. Total - 100 bagian. Dan masing-masing membawa misteri! Bagian-bagian terdiri dari empat bagian: atas, bawah, kanan dan kiri. Setiap ketukan adalah angka. Sebagai contoh:
Top - 12, kanan - 3, bawah - 4 dan kiri - 5.
Agar puzzle berkembang, semua detail harus ditempatkan di papan agar setiap bagian saling menempel dengan nilai yang sama.
Selain itu, sebagian kecil yang tidak berdampingan dengan apa pun tetapi merupakan bagian dari batas papan harus ditetapkan ke 0. Fraksi yang tersisa tidak dapat memiliki nilai nol. Berikut ini adalah contoh yang valid dari 4 bagian:

Di bagian atas papan, semua lobus yang membentuk perbatasan adalah nol.
Pertimbangkan bagian kiri atas. Lobus kanannya adalah 9, dan lobus yang berdekatan (lobus kiri bagian kanan atas) juga 9.
Sayangnya, semua detail kami dikocok. Mereka diberikan dalam format berikut:
Id kubus [fraksi]; kubus id, [bagikan]; ... kubus id, [bagikan]
Di mana id kubus adalah angka dari 0 hingga 99, dan fraksi terdiri dari angka yang disusun dalam urutan: atas, kanan, bawah, kiri.
Sebagai contoh, lihat papan shuffled berikut:

Inilah garis yang menggambarkan papan ini:

Kami membutuhkan Anda untuk menyusun puzzle!
Tuliskan kami baris yang persis seperti ini:
Id kubus, berapa kali perlu diputar searah jarum jam; id kubus, berapa kali perlu diputar searah jarum jam; ... id kubus, berapa kali perlu diputar searah jarum jam
Garis dengan solusi untuk papan ini akan terlihat seperti ini:

Baris di atas sesuai dengan puzzle (terpecahkan) berikut:

Pertimbangkan bagian kiri atas. Sejalan, itu sesuai dengan penunjukan "2.2". Bagaimana kami mengambil nomor kubus 2 dari input:

Tapi kami memutarnya searah jarum jam dua kali dan mendapatkan [0,19,5,0].
Sekarang perhatikan bagian tengah atas. Sejalan, itu sesuai dengan penunjukan "1.0". Oleh karena itu, kami mengambil nomor kubus 1 dari input:

Dan jangan putar sama sekali (ya, putar 0 kali) - itu berarti sudah dalam posisi yang benar.
Mengerti?
Sekarang bantu kami menyusun puzzle!
Ini terlihat seperti ini:

Semoga beruntung
Secara teoritis, masalah ini dapat diselesaikan dengan berbagai cara. Temukan milik Anda dan bagikan. Saya merenungkan beberapa opsi dan akhirnya sampai pada kesimpulan berikut:
Yang pertama. Pada waktu tertentu, saya hanya perlu mendefinisikan satu kubus. Untuk setiap kubus, saya akan selalu tahu pasti dua sisi: atas dan kiri. Pada awalnya adalah 0 dan 0. Kubus berikutnya di atas juga akan memiliki 0, dan di sebelah kiri akan ada angka yang sesuai dengan jumlah lobus kanan kubus sebelumnya.
Yang kedua. Karena banyaknya variasi yang berbeda di antara kubus, saya harus mencoba membuat langkah sesedikit mungkin dan menyingkirkan cek yang tidak berarti pada hasil negatif pertama.
Yang ketiga. Untuk bekerja dengan kubus yang berbeda, saya selalu perlu mengingat posisi awal mereka (id), jumlah belokan dari titik awal dan, tampaknya, jumlah sisi (atas, kanan, bawah, kiri).
Keempat. Input awal adalah string. Dan outputnya juga berupa string (dan bukan posisi saat ini).
Berdasarkan semua ini, saya mengembangkan strategi berikut untuk diri saya sendiri:
Pindahkan secara linear - dari kiri ke kanan hingga Anda menekan sudut kanan. Selanjutnya, turun garis dan mulai di sebelah kiri dengan jumlah kubus yang lebih rendah, yang terletak di atas.
Kesesuaian harus diperiksa setelah setiap rotasi. Jadi, jika Anda telah menyelesaikan 4 putaran dan masih belum ada pertandingan tunggal untuk kubus ini, saya akan mengambil yang berikutnya. Setiap kubus yang diperiksa berpotensi diperiksa dengan semua perincian lainnya, karena ini saya dapat mengulangi inisialisasi masing-masing dengan satu set lengkap semua kubus lainnya.
Untuk melacak semua manipulasi dengan sumber data, saya memilih metode pemrograman berorientasi objek di mana kubus adalah objek yang memiliki id, jumlah rotasi dan empat sisi: atas, kanan, bawah dan kiri.
Alih-alih menyalin kondisi awal dan menghindari penghitungan salah setelah beberapa putaran, saya selalu menambah hitungan satu. Tetapi ketika saya memeriksa jumlah rotasi terakhir, saya menggunakan modulo (sisa pembagian) sebanyak 4.
Misalnya, jika satu rotasi diperlukan (dari [1,2,3,4] menjadi [4,1,2,3]), tetapi tiga rotasi pertama dibuat secara keliru (saat ini [2,3,4,1] ), waktu berikutnya dibutuhkan 2 (dari saat ini [2,3,4,1] ke yang diperlukan [4,1,2,3]). 3 plus 2 adalah 5. Dan 5% 4 = 1, dan inilah yang Anda butuhkan.
Saya selalu perlu melacak kubus yang digunakan dan mencegah pengecekan ulang. Untuk ini, saya menggunakan tabel kubus id. Dan jika kubus dibandingkan dengan yang cocok, saya menghapusnya dari daftar.
Saya memilih struktur data berikut:
HashMap - untuk mengikat id (posisi awal) dan kubus yang dibangun dari string input.
Stack - untuk memeriksa kubus id terkait.
Array - untuk pengujian sementara hasilnya.
Kubus kode objek:

Fungsi Manipulasi String:

Logika solusi untuk menemukan kubus yang cocok:

Hasil:
Tantangan: Ping Pong
Deskripsi:
Saya yakin Anda tidak cukup cepat untuk mengalahkan saya.
Di sinilah saya berada:
nc 35.157.111.68 10158Dengan menjalankan perintah ini, Anda mendapatkan:

Pada pandangan pertama, sepertinya ini adalah tugas untuk bekerja dengan stream.
Namun, setelah menerima data pertama, tampaknya itu jatuh ke dalam Timeout, dan kemudian sepenuhnya - itu akan dibahas.
Ketika data berakhir, pemisah baris baru muncul.
Saya menciptakan ulang aliran menggunakan kode Python.
Tampaknya berfungsi, jadi saya menambahkan kode berulang yang mengulang algoritma ping-pong, dan saya akan menunggu sampai bendera muncul.

Setelah sejumlah besar reshuffle ping-pong seperti itu (mungkin lebih dari seribu) antara klien dan server, akhirnya saya menyelesaikan pekerjaan.
Tantangan: "Protokol"
Deskripsi:
Hai, disana!
Kami perlu mengekstrak data rahasia dari server khusus. Kami tidak tahu banyak tentang dia, tetapi kami berhasil mencegat lalu lintas yang mendukung komunikasi dengan server ini.
Kita juga tahu bahwa path ke file rahasia ini adalah: /usr/PRivAtE.txt
Anda dapat menemukan file sniff di sini (tautan ke file).
Tolong beri tahu kami apa rahasianya!
Semoga beruntungSaya mengunduh file dan membukanya menggunakan Wireshark

Dan memeriksa negosiasi yang terdaftar

Itu memungkinkan saya untuk mencari tahu apa yang sedang terjadi.

Saya perhatikan bahwa ada negosiasi antara IP 35.157.111.68 melalui port 20120 dan SSH port 22. Saya harus memeriksa port ini 20120, saya memutuskan, dan kemudian beralih ke SSH (kemudian saya menyadari bahwa ini tidak perlu).
Saya menggunakan perintah nc untuk memeriksa IP dan port ini, dan menerima respons: "0 8 Selamat Datang"

Saya tidak yakin input apa yang dia harapkan, jadi saya kembali ke Wireshark untuk melihat apakah ada petunjuk yang tersisa.
Saya memfilter semua paket data untuk 35.157.111.68 pada port 20120 dan menemukan percakapan yang mudah dibaca:





Saya membuat ulang semua ini menggunakan baris perintah nc:

Saya perhatikan bahwa jawaban untuk permintaan "2 3 XOR" saya berbeda dari yang ada di file.
Saya mengulangi seluruh prosedur berulang kali untuk melihat apakah jawabannya berubah setiap saat.


Seperti yang saya pikirkan, 4 nilai yang diperoleh berbeda setiap kali, seperti halnya data akhir.
Keempat nilai yang diperoleh tampaknya menjadi kunci untuk menguraikan data akhir.
Saya juga memperhatikan bahwa angka-angka sebelum setiap paket data tidak acak.
Ini terlihat sebagai berikut.
Angka pertama berarti urutan: 0 -> pertama, 1 -> kedua, 2 -> ketiga, dll ...
Angka kedua berarti durasi frasa 8 -> "Selamat Datang", 5 -> "Halo" ->, dll.
Saya pikir jika ini bukan kunci dekripsi. Karena data akhir adalah deretan blok terus-menerus dari 4 nilai HEX dan kunci XOR juga 4 nilai HEX. Mungkin saya bisa mengulanginya masing-masing dan membaginya menjadi byte yang terpisah, dan kemudian menggigitnya dengan byte dari kunci.
Dan saya mencoba mendekripsi:

Semuanya ternyata, tetapi tidak ada bendera di data yang diterima.

Saya membaca ulang aturan dan ingat bahwa path ke file rahasia ini adalah sebagai berikut: /usr/PRivAtE.txt
Saya mengulangi prosedur itu lagi, tetapi kali ini meminta path "/usr/PRivAtE.txt"

Saya mencoba lagi mendekripsi data akhir:

Dan bendera ada di tangan saya:

Apakah kamu berhasil? Tulis ide dan pilihan Anda, dengan senang hati saya akan berkomentar.