Pandangan tentang mengeksploitasi kerentanan

Karena saya berharap untuk terus membahas topik ini, izinkan saya memberi tahu Anda sedikit sejarah, teori, dan praktik tentang kerentanan. Kita semua sudah mendengar sekarang bahwa kelemahan keamanan dapat menghabiskan banyak biaya, kita semua tahu kita perlu selalu memperbarui perangkat lunak kita, kita semua tahu bahwa banyak pembaruan disebabkan oleh bug keamanan. Tetapi hari ini saya akan memberi tahu Anda sedikit tentang bagaimana kesalahan ini ditemukan dan dieksploitasi 🙂 Tetapi sebelum ini kami akan mengklarifikasi beberapa detail agar memiliki gambaran yang lebih baik.

Sebelum Anda mulai

Pertama, saya ingin memberi tahu Anda bahwa kita akan fokus pada kerentanan pertama yang saya pelajari untuk dieksploitasi, yaitu yang diketahui Buffer Overflows, dalam kerentanan ini kami memanfaatkan kurangnya verifikasi memori untuk melakukan hal-hal menyenangkan 🙂 Tapi mari kita klarifikasi lebih lanjut.

Ini tidak akan menjadi skenario dunia nyata

Saya tidak mampu mengajari mereka untuk merusak program apa pun yang mereka lihat 🙂 pertama karena berbahaya bagi komputer mereka, kedua karena itu akan memakan waktu lebih dari kuota kata saya yang biasa.

Kami melakukan perjalanan ke tahun 80-an

Apa yang akan saya tunjukkan dapat saya lakukan di laptop saya, tetapi itu tidak berarti bahwa hal itu dapat dilakukan hari ini dengan cara yang sederhana 🙂 banyak dari konsep ini telah dieksploitasi berkali-kali sehingga metode perlindungan baru dan metode baru untuk menghindarinya telah muncul 😛 tapi itu mengembalikan kita ke tempat yang sama, tidak ada ruang untuk bisa menceritakan semua itu 🙂

Ini mungkin tidak berfungsi pada prosesor Anda

Meskipun saya akan menggunakan contoh yang sangat sederhana, saya ingin menjelaskan dari awal bahwa detailnya begitu banyak dan bervariasi sehingga sama seperti saya, jika Anda ingin mencobanya, efek yang diinginkan mungkin juga tidak tercapai 🙂 Tetapi Anda dapat membayangkan bahwa saya tidak dapat menjelaskannya di ruang ini, terutama karena dengan pengantar ini saya telah mengambil lebih dari 300 kata, jadi kita langsung ke poin kita.

Apa itu Penyangga Melimpah

Untuk menjawab ini, pertama-tama kita harus memahami paruh pertama dari kombinasi ini.

Buffer

Karena semuanya tentang memori di komputer, logis bahwa harus ada beberapa jenis wadah informasi. Saat kita membicarakannya input output, kami datang langsung ke konsep buffer. Singkatnya, a penyangga Ini adalah ruang memori dengan ukuran yang ditentukan di mana kita akan menyimpan sejumlah informasi, sederhana 🙂

Overflows terjadi, seperti namanya, ketika buffer mengisi dengan lebih banyak informasi daripada yang dapat ditampungnya. Tapi kenapa ini penting?

Tumpukan

Juga dikenal sebagai tumpukan, mereka adalah tipe data abstrak yang kami bisa tumpukan informasi, karakteristik utama mereka adalah mereka memiliki pemesanan LIFO (Terakhir Masuk Pertama Keluar). Coba pikirkan sejenak tentang tumpukan piring, kita taruh di atasnya satu per satu, lalu kita keluarkan satu per satu dari atas, ini membuat piring terakhir yang sudah kita taruh (yang ada di atas) adalah piring pertama. yang akan kami keluarkan, tentu saja jika kami hanya dapat mengambil satu piring pada satu waktu dan kami memutuskan untuk melakukannya dalam urutan itu: Hal.

Sekarang setelah Anda mengetahui kedua konsep ini, kita harus mengaturnya. Tumpukan penting karena setiap program yang kita jalankan memiliki programnya sendiri tumpukan eksekusi. Tapi tumpukan ini memiliki karakteristik tertentutumbuh ke bawah. Satu-satunya hal yang perlu Anda ketahui tentang ini adalah bahwa saat program sedang berjalan, ketika sebuah fungsi dipanggil, tumpukan berpindah dari angka X dalam memori ke angka (Xn). Tetapi untuk melanjutkan kita harus memahami satu konsep lagi.

Pointer

Ini adalah konsep yang membuat banyak programmer menjadi gila ketika mereka memulai di dunia C, sebenarnya kekuatan besar dari pemrograman C sebagian disebabkan oleh penggunaan pointer. Untuk membuatnya tetap sederhana, sebuah pointer menunjuk ke alamat memori. Ini terdengar rumit, tetapi tidak terlalu rumit, kita semua memiliki RAM di mesin kita, bukan? Nah, ini dapat didefinisikan sebagai file susunan blok yang berurutan, lokasi ini biasanya dinyatakan dalam bilangan heksadesimal (dari 0 hingga 9 lalu dari A ke F, seperti 0x0, 0x1, 0x6, 0xA, 0xF, 0x10). Di sini sebagai catatan aneh, 0x10 TIDAK sama dengan 10 😛 jika kita mengubahnya menjadi urutan desimal, itu akan sama dengan mengatakan 15. Ini adalah sesuatu yang juga membingungkan lebih dari satu pada awalnya, tapi mari kita mulai.

Rekaman

Prosesor bekerja dengan sejumlah arsip, yang berfungsi untuk mentransmisikan lokasi dari physical memory ke processor, untuk arsitektur yang menggunakan 64-bit, jumlah registernya besar dan sulit untuk dijelaskan disini, namun untuk mendapatkan gambarannya, register tersebut seperti pointer, yang mereka tunjukkan antara lain hal, ruang memori (lokasi).

Sekarang latihan

Saya tahu bahwa sudah banyak informasi yang harus diproses sejauh ini, tetapi pada kenyataannya itu adalah masalah yang agak kompleks yang saya coba jelaskan dengan cara yang sangat sederhana, kita akan melihat program kecil yang menggunakan buffer dan kami akan memecahkannya untuk memahami ini tentang overflow, jelas yang ini bukan Ini adalah program nyata, dan kami akan "menghindari" banyak tindakan pencegahan yang digunakan saat ini, hanya untuk menunjukkan bagaimana hal-hal telah dilakukan sebelumnya 🙂 dan karena beberapa prinsip ini diperlukan untuk dapat mempelajari hal-hal yang lebih kompleks 😉

GDB

Program hebat yang tidak diragukan lagi adalah salah satu yang paling banyak digunakan oleh programmer C. Di antara banyak kelebihannya, kita memiliki fakta bahwa program ini memungkinkan kita untuk melihat semua yang telah kita bicarakan sejauh ini, register, stack, buffer, dll. 🙂 Mari kita lihat program yang akan kita gunakan untuk contoh kita.

input ulang.c

Sendiri. Christopher Diaz Riveros

Ini adalah program yang cukup sederhana, kami akan menggunakan perpustakaan stdio.h untuk dapat memperoleh informasi dan menampilkannya di terminal. Kita bisa melihat sebuah fungsi bernama return_input yang menghasilkan file penyangga bernama susunan, yang memiliki panjang 30 byte (tipe data char panjangnya 1 byte).

Fungsi itu gets(array); meminta informasi dengan konsol dan fungsi printf() mengembalikan konten array dan menampilkannya di layar.

Setiap program yang ditulis dalam C dimulai dengan fungsinya main(), ini hanya akan bertugas memanggil return_input, sekarang kita akan mengkompilasi programnya.

Sendiri. Christopher Diaz Riveros

Mari kita lihat apa yang baru saja saya lakukan. Pilihan -ggdb memberitahu gcc bahwa ia harus mengkompilasi program dengan informasi agar gdb dapat melakukan debug dengan benar. -fno-stack-protector Ini adalah opsi yang jelas tidak boleh kita gunakan, tetapi akan kita gunakan karena jika tidak, akan memungkinkan untuk menghasilkan buffer overflow di stack. Pada akhirnya saya sudah menguji hasilnya. ./a.out ia hanya menjalankan apa yang baru saja saya susun, ia meminta saya untuk memberikan informasi dan mengembalikannya. Menjalankan 🙂

Peringatan

Catatan lain di sini. Bisakah Anda melihat peringatannya? jelas itu adalah sesuatu yang harus dipertimbangkan ketika kita bekerja dengan kode atau kompilasi, ini agak jelas dan ada beberapa program yang saat ini memiliki fungsi gets() Di dalam kode. Satu keuntungan dari Gentoo adalah dengan mengkompilasi setiap program, saya dapat melihat apa yang salah, program "ideal" seharusnya tidak memilikinya, tetapi Anda akan terkejut betapa banyak program besar yang memiliki peringatan ini karena mereka SANGAT besar dan sulit untuk melacaknya. fungsi berbahaya bila ada banyak peringatan pada saat yang bersamaan. Sekarang jika kita lanjutkan

Debugging program

Sendiri. Christopher Diaz Riveros

Sekarang bagian ini bisa sedikit membingungkan, tetapi karena saya sudah cukup banyak menulis, saya tidak mampu menjelaskan semuanya, jadi maaf jika Anda melihat bahwa saya terlalu cepat 🙂

Melucuti kode

Mari kita mulai dengan melihat program bahasa mesin yang kami kompilasi.

Sendiri. Christopher Diaz Riveros

Ini adalah kode fungsi utama kami di Majelis, inilah yang dipahami prosesor kami, baris di sebelah kiri adalah alamat fisik dalam memori, <+ n> diketahui sebagai mengimbangi, pada dasarnya jarak dari awal fungsi (main) ke pernyataan itu (dikenal sebagai opcode). Kemudian kita melihat jenis instruksi (push / mov / callq…) dan satu atau lebih register. Ringkasnya kita dapat mengatakan bahwa itu adalah indikasi yang diikuti oleh sumber / asal dan tujuan. <return_input> mengacu pada fungsi kedua kita, mari kita lihat.

Kembalikan_masukan

Sendiri. Christopher Diaz Riveros

Ini sedikit lebih rumit, tetapi saya hanya ingin Anda memeriksa beberapa hal, ada tag bernama <gets@plt> dan satu opcode terakhir dipanggil retq menunjukkan akhir dari fungsi tersebut. Kami akan menempatkan beberapa breakpoint, satu di fungsi gets dan lainnya di retq.

Sendiri. Christopher Diaz Riveros

Run

Sekarang kita akan menjalankan program untuk melihat bagaimana aksinya dimulai.

Sendiri. Christopher Diaz Riveros

Kita dapat melihat bahwa panah kecil muncul yang menunjukkan opcode di mana kita berada, saya ingin mereka memperhitungkan arahnya 0x000055555555469b, ini adalah alamat setelah panggilan ke return_input dalam fungsi main , ini penting karena di sinilah program harus kembali setelah Anda selesai menerima memasukkan, mari masuk ke fungsinya. Sekarang kita akan memeriksa memori sebelum masuk ke fungsi gets.

Sendiri. Christopher Diaz Riveros

Saya telah meletakkan kembali fungsi utama untuk Anda, dan menyorot kode yang saya maksud, seperti yang Anda lihat, karena kesungguhan telah dipisahkan menjadi dua segmen, saya ingin mereka memperhitungkan arahnya 0x7fffffffdbf0 (yang pertama dari kiri setelah komando x/20x $rsp) karena ini adalah lokasi yang harus kita gunakan untuk memeriksa hasil yang didapat, mari lanjutkan:

Memecah program

Sendiri. Christopher Diaz Riveros

Saya telah menyoroti itu 0x44444444karena mereka adalah representasi dari Ds 🙂 kita sekarang kita sudah mulai menambahkan memasukkan ke program, dan seperti yang Anda lihat, kami hanya berjarak dua baris dari alamat yang diinginkan, kami akan mengisinya hingga tepat sebelum alamat yang kami soroti pada langkah sebelumnya.

Mengubah jalur kembali

Sekarang kita telah berhasil memasukkan bagian kode ini di mana itu menunjukkan kembalinya fungsi, mari kita lihat apa yang terjadi jika kita mengubah alamat 🙂 daripada pergi ke lokasi opcode yang mengikuti yang kita miliki beberapa saat yang lalu, bagaimana menurut Anda jika kita kembali ke return_input? Tapi untuk ini, perlu menulis alamat yang kita inginkan dalam biner, kita akan melakukannya dengan fungsinya printf dari bash 🙂

Sendiri. Christopher Diaz Riveros

Sekarang kami telah menerima informasinya dua kali 😀 pasti programnya tidak dibuat untuk itu, tetapi kami telah berhasil memecahkan kodenya dan membuatnya mengulangi sesuatu yang tidak seharusnya dilakukan.

Refleksi

Perubahan sederhana ini dapat dianggap a mengeksploitasi sangat mendasar 🙂 dia telah berhasil menghentikan program dan melakukan sesuatu yang kami ingin dia lakukan.

Ini hanyalah langkah pertama dalam daftar hal-hal yang hampir tak terbatas untuk dilihat dan ditambahkan, ada cara untuk menambahkan lebih banyak hal daripada sekadar mengulangi pesanan, tetapi kali ini saya telah menulis banyak dan semua yang berhubungan dengan pengkodean shell itu adalah subjek untuk menulis lebih dari artikel, buku lengkap yang akan saya katakan. Maaf jika saya belum dapat mempelajari lebih banyak tentang topik yang saya sukai, tapi pasti akan ada kesempatan 🙂 Salam dan terima kasih sudah sampai di sini.


tinggalkan Komentar Anda

Alamat email Anda tidak akan dipublikasikan. Bidang yang harus diisi ditandai dengan *

*

*

  1. Penanggung jawab data: Miguel Ángel Gatón
  2. Tujuan data: Mengontrol SPAM, manajemen komentar.
  3. Legitimasi: Persetujuan Anda
  4. Komunikasi data: Data tidak akan dikomunikasikan kepada pihak ketiga kecuali dengan kewajiban hukum.
  5. Penyimpanan data: Basis data dihosting oleh Occentus Networks (UE)
  6. Hak: Anda dapat membatasi, memulihkan, dan menghapus informasi Anda kapan saja.

  1.   2p2 dijo

    Bersikaplah lebih langsung. Kurangi menulis dan fokuslah pada hal yang penting

    1.    ChrisADR dijo

      Hai, terima kasih atas komentarnya.

      Sejujurnya saya telah memotong sebagian besar ide, tetapi meskipun demikian menurut saya ide tersebut masih sedikit sehingga seseorang yang tidak memiliki pengetahuan pemrograman bisa mendapatkan ide.

      salam

      1.    anonim dijo

        Masalahnya adalah mereka yang tidak memiliki pengetahuan pemrograman tidak akan mengetahui tentang apapun karena terlalu rumit untuk memulai, tetapi mereka yang tahu bagaimana memprogram menghargai karena lebih langsung.

        Saya kira Anda tidak dapat menjangkau semua orang, Anda harus memilih, dan dalam hal ini Anda telah berdosa sehingga ingin menutupi banyak hal.

        Omong-omong, saya memberi tahu Anda sebagai kritik yang membangun, saya suka topik-topik ini dan saya ingin Anda terus menulis artikel, selamat!

    2.    anonim dijo

      Aku merasakan hal yang sama.

      1.    ChrisADR dijo

        Terima kasih banyak untuk keduanya !! Tentunya sulit untuk memahami bagaimana menjangkau khalayak sasaran ketika kenyataannya jumlah orang dengan pemrograman tingkat lanjut yang membaca artikel ini sedikit (setidaknya itu dapat disimpulkan berdasarkan komentar)

        Saya sudah pasti berdosa karena ingin menyederhanakan sesuatu yang membutuhkan dasar pengetahuan yang luas untuk dipahami. Saya harap Anda memahami bahwa karena saya baru memulai blogging, saya belum menemukan titik yang tepat di mana pembaca saya mengetahui dan memahami apa yang saya katakan. Itu akan membuatnya lebih mudah untuk mengatakan yang sebenarnya 🙂

        Saya akan mencoba membuatnya lebih pendek jika bermanfaat tanpa mengurangi bentuknya, karena memisahkan cara penulisan dari konten sedikit lebih rumit daripada yang dibayangkan, setidaknya saya membuatnya cukup ditautkan, tetapi saya kira pada akhirnya saya akan dapat menambahkan baris ke dalam alih-alih memotong konten.

        salam

  2.   Mario dijo

    Di mana Anda dapat mengetahui lebih banyak tentang subjek tersebut? Ada buku yang direkomendasikan?

    1.    ChrisADR dijo

      Contoh diambil dari The Shellcoder's Handbook oleh Chris Anley, John Heasman, Felix Linder dan Gerardo Richarte, tetapi untuk melakukan terjemahan 64-bit saya harus belajar tentang arsitektur saya, manual pengembang intel, volume 2 dan 3 adalah sumber yang cukup andal untuk itu. Juga bagus untuk membaca dokumentasi GDB, yang dilengkapi dengan perintah 'info gdb', Untuk mempelajari Assembly dan C ada banyak buku yang sangat bagus, kecuali bahwa buku Assembly sudah agak tua sehingga ada celah untuk diisi dengan jenis lain dokumentasi.

      Shellcode itu sendiri tidak lagi seefektif sekarang karena berbagai alasan, tetapi masih menarik untuk mempelajari teknik-teknik baru.

      Semoga membantu sedikit 🙂 Salam

  3.   Franz dijo

    Artikel bagus, blog lama desdelinux telah terlahir kembali =)
    Ketika Anda mengatakan shell jarak jauh tidak efektif, yang Anda maksud adalah tindakan balasan yang dirancang untuk mengurangi serangan, mereka menyebutnya keamanan ofensif.
    Salam dan pertahankan

    1.    ChrisADR dijo

      Terima kasih banyak Franz 🙂 kata-kata yang sangat baik, sebenarnya yang saya maksud adalah Shellcoding hari ini jauh lebih kompleks daripada yang kita lihat di sini. Kami memiliki ASLR (generator lokasi memori acak) pelindung tumpukan, berbagai tindakan dan tindakan pencegahan yang membatasi jumlah opcode yang dapat disuntikkan ke dalam program, dan itu hanya permulaan.

      Salam,

  4.   perangkat lunak bebas dijo

    Halo, maukah Anda melakukan bagian lain untuk memperluas topik? Ini menarik

    1.    ChrisADR dijo

      Halo, topik tersebut tentunya cukup menarik, namun tingkat kerumitan yang akan kita ambil akan menjadi sangat tinggi, kemungkinan melibatkan jumlah postingan yang banyak untuk menjelaskan berbagai prasyarat untuk saling memahami. Saya mungkin akan menulis tentang itu, tetapi itu bukan posting berikut, saya ingin menulis beberapa topik sebelum melanjutkan dengan yang ini.

      Salam, dan terima kasih telah berbagi

  5.   kaktus dijo

    Che yang sangat bagus! Anda menyumbangkan postingan yang bagus! Satu pertanyaan, saya memulai Keamanan TI ini dengan membaca buku berjudul "Menjamin keamanan dengan pengujian pena". Apakah buku ini direkomendasikan? Bagaimana saran Anda agar saya mulai bertanya tentang masalah ini?

    1.    ChrisADR dijo

      Halo kaktus, ini adalah seluruh alam semesta tentang kerentanan, dan lainnya, sejujurnya itu sangat tergantung pada apa yang menarik perhatian Anda, dan kebutuhan yang Anda miliki, seorang manajer TI tidak perlu tahu sama seperti penguji pena, Atau seorang peneliti kerentanan, atau analis forensik, tim pemulihan bencana memiliki keahlian yang sangat berbeda. Tentunya masing-masing membutuhkan tingkat pengetahuan teknis yang berbeda, saya sarankan Anda mulai menemukan apa yang Anda suka, dan mulai melahap buku, artikel, dan lainnya, dan yang paling penting, praktikkan semua yang Anda baca, bahkan jika sudah ketinggalan zaman , yang pada akhirnya akan membuat perbedaan.
      Salam,

  6.   Eizen dijo

    Hola.
    Terima kasih banyak telah menjelaskan topik ini, selain memberikan komentar bahwa untuk informasi tambahan kami memiliki "Buku Pegangan Shellcoder's". Saya sudah memiliki bacaan yang menunggu keputusan 😉