Halo semuanya, saya
Nikita Kurtin , kurator Sekolah Tinggi IT Israel dan
Peretas Keamanan
Checkpoint , perusahaan keamanan informasi Israel terkemuka, menerbitkan serangkaian tes dunia maya musim panas ini.
Tugas dibagi menjadi enam kategori:
• Logika
• Web
• Pemrograman
• Jaringan
• Membalik
• Kejutan
Dua tugas untuk setiap arah. Dalam posting ini saya akan memberi tahu Anda bagaimana saya hanya melalui empat tes, dalam tiga tes berikutnya:
Pos pemeriksaan telah 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.
Tantangan resmi berakhir pada akhir September 2018.

Jadi sekarang, dengan hati nurani yang jernih, saya dapat memberi tahu Anda selangkah demi selangkah tentang bagaimana saya memecahkan masalah-masalah berikut:
• Tantangan logis "PNG ++"
• Tantangan Web "Robot kembali"
• Tantangan Web "Galeri Diego"
• Tugas pemrograman "Langkah hati-hati"
• Tugas pemrograman "Puzzle"
• Tantangan Jaringan "Ping Pong"
• Tantangan Jaringan "Protokol"
Tantangan: PNG ++
Deskripsi:
Gambar (tautan ke file PNG terenkripsi)
ini disandikan menggunakan cipher khusus.
Kami berhasil membaca sebagian besar kode ini di sini (tautan ke kode python).
Sayangnya, seseorang dengan lambat menumpahkan kopi di seluruh key_transformator.py.
Bisakah Anda membantu kami mendekripsi gambar ini?Kode python:

Logika enkripsi adalah sebagai berikut:
1. Atur panjang kunci (ukuran tombol) ke 4 byte
2. Baca byte dari file "flag.png" dalam variabel "img"
3. Tambahkan padding ke file, ke kelipatan terdekat pertama dari empat. Padding sama dengan jumlah byte yang hilang. Misalnya, jika panjang file adalah 29 byte (3 hilang), tambahkan tiga byte dengan nilai desimal 3 (ASCII 0x03). Atau, dengan kata lain, padding byte tidak boleh kosong (ASCII 0x00), karena nilai desimalnya adalah nol, padding yang tidak menyiratkan.
4. Atur kunci awal dengan empat huruf besar acak ([AZ]).
5. Lakukan hal yang sama dengan semua byte dalam file, mengenkripsi rantai empat byte sekaligus
a. Setiap byte dalam file tersebut bertengkar dengan byte dari kunci
b. Kunci terus dikonversi ke kunci lain, key_transformator.transform (kunci) bertanggung jawab untuk ini
c. Byte terenkripsi ditambahkan ke enc_data
6. Masukkan enc_data (byte terenkripsi) di encrypted.png
Untuk memulai, saya memeriksa header format PNG dan menemukan bahwa delapan byte pertama adalah sebagai berikut:
[137, 80, 78, 71, 13, 10, 26, 10]
Saya mengambil delapan byte pertama dari file terenkripsi dan memutarnya dengan delapan byte ini:

Kunci dari blok pertama ternyata seperti ini:
[85, 80, 82, 81]
Dan blok kedua - seperti ini:
[86, 81, 83, 82]
Karena setiap kunci selanjutnya dihasilkan secara dinamis menggunakan kunci sebelumnya (key = key_transformator.transform (key), saya memahami algoritme: tambahkan satu ke setiap byte pada kunci sebelumnya:
85 -> 86
80 -> 81
82 -> 83
81 -> 82
Dan kemudian saya menyadari bahwa nama tantangan itu menyembunyikan petunjuk yang sakit-sakitan.
Saya menulis dua "fungsi pembantu":
• "nextKey", yang mengembalikan kunci berikutnya berdasarkan yang terakhir
• "nextChar", yang mengembalikan huruf berikutnya, dan dalam kebanyakan kasus hanya bertambah satu jika jatuh dalam batas byte (255)

Saya mengkonversi 4 byte asli [85, 80 82, 81] menjadi huruf: "UPRQ" dan menjalankan algoritma kembali

Bendera ditentukan dalam file yang didekripsi:
Tantangan: Kembalinya Robot
Deskripsi:
Robot itu keren, tapi percayalah: akses mereka harus dibatasi! Lihat itu (tautan)
Setelah mengikuti tautan, Anda melihat halaman tertentu yang dikhususkan untuk robot. Pada dasarnya, semuanya menunjukkan bahwa Anda harus memeriksa keberadaan file "robots.txt".

Dengan menambahkan ./robots.txt ke url kita mendapatkan yang berikut:

Saya memeriksa ./secret_login.html dan menemukan halaman pendaftaran

Selanjutnya, saya memeriksa kode sumber formulir untuk menemukan konfirmasi kata sandi dan melihat Javascript ini:

Tampaknya ketika nilai dikonfirmasi, dikirim ke fungsi otorisasi, yang menerjemahkan nilai yang diteruskan menggunakan fungsi btoa (fungsi decoding base64 dalam Javascript) dan kemudian membandingkannya dengan string: "SzMzcFQjM1IwYjB0JDB1dA ==".
Saya menerjemahkan kode ini

Saya memasukkan nilai yang dihasilkan ke string kata sandi. Bingo!
Tantangan: Diego Gallery
Deskripsi:
Baru-baru ini saya mulai mengembangkan platform untuk mengelola foto-foto kucing saya dan mengamankan flag.txt saya. Silakan periksa sistem saya (tautan ke formulir pendaftaran).
Untuk menghindari jambs dalam sistem keamanan, seperti kemampuan untuk menanamkan kode SQL, saya membuat skema sendiri.
Deskripsi singkatnya tersedia di sini (tautan ke diagram)Formulir Pendaftaran:

Sirkuit yang telah ditetapkan:

Setelah saya menetapkan nama pengguna dan kata sandi percobaan, saya mendapat akses ke galeri umum kucing "Diego".
Karena saya terdaftar sebagai pengguna biasa, saya pikir mungkin saya perlu menemukan cara untuk meningkatkan hak istimewa PE (Privilege Escalation). Melihat melalui skema untuk pengguna terdaftar, saya melihat bahwa perbedaan antara pengguna biasa dan administrator ada di bagian ketiga skema, dipisahkan oleh tiga garis.
Setelah memperkirakan bahwa jika nilai pertama (nama pengguna) merujuk ke bagian pertama, dan yang kedua (kata sandi) merujuk ke bagian kedua, maka peran tersebut ditetapkan oleh sistem segera setelah pengguna dengan hak yang sekarang masuk.
Sebagai contoh:
MULAI ||| Nilai pertama ||| Nilai kedua ||| pengguna (Ditambahkan oleh layanan web) ||| END
Payload saya adalah sebagai berikut:
• Nilai pertama: “niki ||| niki ||| admin ||| END \ nSTART ||| lainnya“
• Nilai kedua: "lainnya"
Ini mungkin menghasilkan baris log berikut:
MULAI ||| niki ||| niki ||| admin ||| END
MULAI ||| lainnya ||| lainnya ||| pengguna ||| END
Setelah itu, saya bisa masuk sebagai administrator dan mendapatkan hak penuh:

Menekan tombol hanya mengaktifkan peringatan bahwa bendera aman.
Namun, di dalam URL Anda dapat membaca:
35.194.63.219/csa_2018/diegos_gallery/_nwryqcttstvs/admin-panel/index.php ? view = log.txt
Yang secara eksplisit menyinggung
LFI (Inklusi File Lokal) melalui URLSaya mencoba:
35.194.63.219/csa_2018/diegos_gallery/_nwryqcttstvs/admin-panel/index.php?view=flag.txtDan bendera itu milik saya.
Tantangan: Langkah-Langkah Hati-Hati
Deskripsi:
Ini (tautan file) adalah sekelompok arsip yang kami temukan. Kami yakin bendera rahasia disembunyikan di suatu tempat di dalamnya.
Kami benar-benar yakin bahwa data yang kami cari tersembunyi di bagian komentar dari setiap file.
Bisakah Anda dengan hati-hati pergi di antara file dan menemukan bendera?
Semoga beruntungSetelah mengekstraksi file, Anda mendapatkan direktori bernama "arsip" dengan dua ribu file di dalamnya, berjudul "unzipme. [Nomor]".

Saya menggunakan program binwalk untuk memeriksa file pertama. Dan inilah yang diberikan program kepada saya:

Ya, jadi di bagian komentar kami memiliki huruf dan angka. Petunjuk lagi?
Pada awalnya saya berpikir tentang apakah saya harus menghubungkan surat-surat dengan indeks yang diberikan dari file zip ini, dan periksa file berikutnya sudah dengan indeks 245.
Tapi di sini muncul kejutan: file kedua tidak dalam zip, tetapi dalam format rar.

Oleh karena itu, saya harus "membuat" itu untuk mendapatkan komentar:

Logika saya adalah menjalankan file melalui binwalk, dan jika saya menemukan RAR, buka paketnya untuk mendapatkan komentar. Jika tidak, langsung lihat bagian komentar untuk memahami tindakan lebih lanjut.
Tebakan pertama saya: jumlahnya adalah indeks file (masing-masing diberi nomor dari 0 hingga 1999). Namun, saya menemukan bahwa beberapa angka negatif, yang berarti mereka tidak bisa menjadi indeks.
Tebakan kedua: jumlahnya adalah lompatan, yang mungkin negatif. Untuk setiap nomor, saya perlu lompatan ke file berikutnya. Saya tahu bahwa jika kode saya terus-menerus melompat ke file terhitung berikutnya, ini dapat membuat jebakan kecil dalam bentuk siklus dan kode saya akan terjebak dalam loop tanpa akhir. Jadi saya menulis kode python dengan batas akun. Dan setelah beberapa tes, saya menemukan bahwa angka 120 akan cukup:

Dan bendera itu milik saya:

Tiga lainnya saya jelaskan di posting berikutnya, baca, coba, saya akan senang dengan komentar Anda