Eksploit, buffer overflow dan shellcode adalah tiga saudara kandung. Semua berawal dari keteledoran sang programmer sehingga programnya mengandung vulnerability yang dapat dieksploit untuk membuat program tersebut menjalankan code apapun yang diinginkan hacker (arbitrary code execution), code ini disebut dengan shellcode. Shellcode adalah kunci keberhasilan eksploitasi buffer overflow (hole/lubang keamanan yang paling rentan) dan lubang keamanan lainnya yang berorientasi memori.
Dihubungkan dengan pembahasan di bab pendahuluan, shellcode merupakan program yang akan mengambil alih suatu sistem sesaat setelah eksploit memanfaatkan buffer overflow lalu membuat sistem tersebut 'crash'. Shellcode dapat diibaratkan seperti telur yang di bungkus oleh eksploit, saat eksploit berhasil meng-buffer-overflow-kan suatu sistem maka telur yang ada didalamnya akan segera mengambil alih sistem tersebut.
Penerapan dalam prinsip dasar cara kerja komputer, prosesor hanya akan melakukan satu buah instruksi dalam satu waktu. Yang memberikan instruksi tersebut adalah program (contoh program: winamp, notepad, dan sebagainya). Saat program akan dieksekusi (misal : kita klik icon winamp), maka program winamp yang semula ada di hardisk akan diload ke suatu lokasi di memori komputer, dan kemudian prosesor akan mengeksekusi kode-kode program winamp tersebut. Ini artinya saat eksploit berhasil merusak program winamp tersebut, eksploit akan menempatkan shellcode di lokasi memori pada mesin target, selanjutnya eksploit akan membuat prosesor menuju lokasi memori tempat shellcode telah ditanam dan kemudian akan mengeksekusinya yaitu mengacaukan program winamp sesuai yang diinginkanya. Kesimpulannya, mekanisme ini berhubungan langsung dengan prosesor dan memori, itu sebabnya shellcode dibuat agar dapat langsung ditanam pada memori sehingga bentuknya cukup aneh.
Campur Aduk
Jumat, 31 Desember 2010
KONSEP SHELLCODE
Dalam keamanan komputer, shellcode dalam arti yang paling harfiah, berarti menulis code yang akan mengembalikan remote shell ketika dieksekusi. Kenapa disebut shellcode? Bila hacker dapat membuat program mengeksekusi code apapun yang dia mau, maka code apakah yang dipilihnya? Pilihan terbaik adalah code yang memberikan dia shell sehingga dia dapat memberi perintah lain yang dia mau dengan leluasa. Oleh karena itu code itu disebut shell-code.
Walaupun umumnya shellcode memberikan shell, shellcode tidak selalu memberikan shell. Attacker bebas menentukan code apa yang akan dieksekusi di komputer korban. Shellcode dimasukkan ke dalam kode eksploit dengan tujuan membypass fungsi suatu software, sehingga software tersebut tidak berjalan secara semestinya, melainkan menjalankan fungsi pada shellcode. Oleh karenanya arti dari shellcode pun telah berkembang, sekarang merupakan code byte yang digunakan dengan payload untuk mengeksploitasi komputer target sesuai yang diinginkan. Biasanya shellcode dibuat untuk dapat mengontrol komputer, ataupun mendapatkan hak akses komputer target, atau yang lainnya seperti mulai dari menghapus file, memformat hardisk, mengirimkan data, menginstall program baru dan sebagainya terserah keinginan attacker.
Code dalam shellcode adalah dalam bentuk bahasa mesin atau opcode. Opcode ini bersifat independen yang tidak memiliki instruksi yang terdiri dari byte NULL atau mengandung operan byte NULL, hal ini disebabkan situasi yang unik ketika pemanfaatan buffer overflow, attacker cenderung mengirimkan instruksi pointer dengan pointer ke shellcode sewenang-wenang. Dengan demikian, pengendalian eksekusi mengalir melalui shellcode/opcode independen tersebut. Biasanya opcode ini tidak dituliskan dalam nilai binary karena akan menjadi sangat panjang, melainkan memakai nilai hexa yang lebih kompak seperti contoh sebagai berikut :
char shellcode[] = "\x31\xc0\x31\xdb\x31\xc9\x31\xd2\xeb\x0f\x59\xb3"
"\x01\xb2\x0d\xb0\x04\xcd\x80\xfe\xcb\xb0\x01\xcd"
"\x80\xe8\xec\xff\xff\xff\x48\x65\x6c\x6c\x6f\x2c"
"\x20\x77\x6f\x72\x6c\x64\x21";
Karakter-karakter di atas merupakan bentuk shellcode yang dapat langsung ditempakan pada memori komputer, dan dapat segera dieksekusi oleh prosesor. Apabila dieksekusi, shellcode di atas akan menginstruksikan prosesor untuk menampilkan tulisan "Hello, World!" pada monitor (STDOUT).
Walaupun umumnya shellcode memberikan shell, shellcode tidak selalu memberikan shell. Attacker bebas menentukan code apa yang akan dieksekusi di komputer korban. Shellcode dimasukkan ke dalam kode eksploit dengan tujuan membypass fungsi suatu software, sehingga software tersebut tidak berjalan secara semestinya, melainkan menjalankan fungsi pada shellcode. Oleh karenanya arti dari shellcode pun telah berkembang, sekarang merupakan code byte yang digunakan dengan payload untuk mengeksploitasi komputer target sesuai yang diinginkan. Biasanya shellcode dibuat untuk dapat mengontrol komputer, ataupun mendapatkan hak akses komputer target, atau yang lainnya seperti mulai dari menghapus file, memformat hardisk, mengirimkan data, menginstall program baru dan sebagainya terserah keinginan attacker.
Code dalam shellcode adalah dalam bentuk bahasa mesin atau opcode. Opcode ini bersifat independen yang tidak memiliki instruksi yang terdiri dari byte NULL atau mengandung operan byte NULL, hal ini disebabkan situasi yang unik ketika pemanfaatan buffer overflow, attacker cenderung mengirimkan instruksi pointer dengan pointer ke shellcode sewenang-wenang. Dengan demikian, pengendalian eksekusi mengalir melalui shellcode/opcode independen tersebut. Biasanya opcode ini tidak dituliskan dalam nilai binary karena akan menjadi sangat panjang, melainkan memakai nilai hexa yang lebih kompak seperti contoh sebagai berikut :
char shellcode[] = "\x31\xc0\x31\xdb\x31\xc9\x31\xd2\xeb\x0f\x59\xb3"
"\x01\xb2\x0d\xb0\x04\xcd\x80\xfe\xcb\xb0\x01\xcd"
"\x80\xe8\xec\xff\xff\xff\x48\x65\x6c\x6c\x6f\x2c"
"\x20\x77\x6f\x72\x6c\x64\x21";
Karakter-karakter di atas merupakan bentuk shellcode yang dapat langsung ditempakan pada memori komputer, dan dapat segera dieksekusi oleh prosesor. Apabila dieksekusi, shellcode di atas akan menginstruksikan prosesor untuk menampilkan tulisan "Hello, World!" pada monitor (STDOUT).
KONSEP BUFFER OVERFLOW
Jika kita mengakses suatu situs web kemudian saat kita memberikan input yang tidak semestinya pada field browser ataupun pada field userId dan password, maka web yang memiliki vulnerability akan terjadi buffer overflow. Apakah yang dimaksud dengan buffer overflow? buffer adalah tempat penampungan, overflow artinya kelebihan muatan. Jadi buffer overflow adalah suatu kondisi dimana element-element yang ada tidak dapat lagi menempati tempat penampungan yang ada.
Contohnya : char rumah[25]; // rumah yang dapat berisi 25 orang saja, char kamar[10]; // kamar yang dapat berisi 10 orang saja. Jika semua yang ada di rumah (25 orang) masuk ke dalam kamar (yang hanya dapat berisi 10 orang saja), kamar itu tidak akan dapat menampung 15 orang lainnya. Hal inilah yang dapat kita katakan buffer overflow, dimana kamar itu adalah buffer dan karena kapasitas kamar lebih kecil dari kapasitas yang akan masuk maka dapat dikatakan overflow. Dengan kata lain mengenai pemahaman buffer overflow sendiri adalah keadaan dimana buffer (variabel yang di gunakan suatu aplikasi untuk menyimpan datanya di memori) terisi dengan data yang ukurannya melebihi kapasitasnya sendiri dan akibatnya kelebihan data itu akan mengisi alamat memori lain yang bukan milik variabel tersebut atau dalam hal ini disebut dengan overwrite.
Menurut NeoTekno Buffer overflow adalah salah satu metode yang digunakan oleh hacker untuk mengeksploitasi sebuah sistem komputer yang memiliki kelemahan pada salah satu aplikasi yang digunakan oleh sistem tersebut. Eksploitasi ini dikenal dengan input validation attack yang dapat mengakibatkan suatu sistem crash (buffer overflow) yaitu variabel yang tersedia pada aplikasi tidak dapat menampung input yang sengaja dibuat berlebihan. Teknik ini banyak digunakan pada man in the middle attack maupun untuk mendapatkan shell console. Sebuah aplikasi dapat di-buffer-overflow karena memang aplikasi tersebut tidak memiliki kontrol data yang baik dan biasanya ini tidak disadari oleh si pembuat program tersebut. Lalu bagaimana seorang hacker dapat memperoleh hak akses terhadap sistem hanya dengan memanfaatkan kelemahan dari suatu aplikasi yang ada di sistem komputer target? Tentu hal ini berkaitan erat dengan otoritas (baca: akses) yang di miliki oleh aplikasi tersebut.
Agar dapat memahami dan melihat secara nyata dampak dan akibat dari buffer overflow ini, di bab selanjutnya akan dibahas implementasi metode buffer overflow ini dalam bahasa C/C++ yang hingga saat ini masih menjadi bahasa yang paling banyak digunakan dalam pembuatan aplikasi untuk Linux dan Unix. Kemudian untuk sistem operasinya menggunakan Linux RedHat 7.2 Enigma.
Contohnya : char rumah[25]; // rumah yang dapat berisi 25 orang saja, char kamar[10]; // kamar yang dapat berisi 10 orang saja. Jika semua yang ada di rumah (25 orang) masuk ke dalam kamar (yang hanya dapat berisi 10 orang saja), kamar itu tidak akan dapat menampung 15 orang lainnya. Hal inilah yang dapat kita katakan buffer overflow, dimana kamar itu adalah buffer dan karena kapasitas kamar lebih kecil dari kapasitas yang akan masuk maka dapat dikatakan overflow. Dengan kata lain mengenai pemahaman buffer overflow sendiri adalah keadaan dimana buffer (variabel yang di gunakan suatu aplikasi untuk menyimpan datanya di memori) terisi dengan data yang ukurannya melebihi kapasitasnya sendiri dan akibatnya kelebihan data itu akan mengisi alamat memori lain yang bukan milik variabel tersebut atau dalam hal ini disebut dengan overwrite.
Menurut NeoTekno Buffer overflow adalah salah satu metode yang digunakan oleh hacker untuk mengeksploitasi sebuah sistem komputer yang memiliki kelemahan pada salah satu aplikasi yang digunakan oleh sistem tersebut. Eksploitasi ini dikenal dengan input validation attack yang dapat mengakibatkan suatu sistem crash (buffer overflow) yaitu variabel yang tersedia pada aplikasi tidak dapat menampung input yang sengaja dibuat berlebihan. Teknik ini banyak digunakan pada man in the middle attack maupun untuk mendapatkan shell console. Sebuah aplikasi dapat di-buffer-overflow karena memang aplikasi tersebut tidak memiliki kontrol data yang baik dan biasanya ini tidak disadari oleh si pembuat program tersebut. Lalu bagaimana seorang hacker dapat memperoleh hak akses terhadap sistem hanya dengan memanfaatkan kelemahan dari suatu aplikasi yang ada di sistem komputer target? Tentu hal ini berkaitan erat dengan otoritas (baca: akses) yang di miliki oleh aplikasi tersebut.
Agar dapat memahami dan melihat secara nyata dampak dan akibat dari buffer overflow ini, di bab selanjutnya akan dibahas implementasi metode buffer overflow ini dalam bahasa C/C++ yang hingga saat ini masih menjadi bahasa yang paling banyak digunakan dalam pembuatan aplikasi untuk Linux dan Unix. Kemudian untuk sistem operasinya menggunakan Linux RedHat 7.2 Enigma.
KONSEP EKSPLOIT
Eksploit dalam konteks harfiah yaitu pemanfaatan. Tentunya eksploit-eksploit 'hacking' lebih spesifik lagi, yang kurang lebih dapat diartikan sebagai pemanfaatan kelemahan dari sebuah sistem untuk tujuan-tujuan yang di luar dari penggunaan normal. Kelemahan-kelemahan (vulnerability) ini dapat berupa kesalahan pemrograman, sesuatu yang tidak direncanakan oleh pemrogram asli dan lain-lain.
Umumnya, yang jelas paling menarik perhatian kita, adalah eksploit yang akan memberikan kita akses tidak terbatas ke seluruh aspek dari sebuah sistem. Dalam Linux, sering kita dengar istilah mengeksploit program tertentu untuk mendapat privilese root. Tentu saja mendapatkan 'root' bukanlah satu-satunya tujuan pengeksploitan sistem. Seperti yang mungkin sering dialami, kadang sebuah cacat dalam program seperti maild atau ftpd dapat dimanfaatkan untuk tujuan seperti header forging, ip spoofing, denial of service attack, dan mail bombing.
Eksploit secara besar sering dibagi menjadi dua, yaitu eksploit lokal dan eksploit remote. Eksploit lokal adalah jenis eksploit yang hanya dapat dijalankan jika kita sudah punya akses ke dalam suatu sistem (baik itu melalui login telnet, ftp, dll). Eksploit jenis ini jumlahnya banyak, sebab kita sudah punya akses ke ribuan program yang berpotensi untuk dieksploit. Contoh-contoh dari eksploit jenis ini adalah buffer overflow (i.e. mh di RedHat 5, SuperProbe, dan lain-lain), race conditions (dimana dua proses saling berlomba untuk menyelesaikan tugas masing-masing, biasanya proses A disuruh untuk menjalankan suatu utilitas yang membutuhkan privilese root temporer sementara proses B dirancang untuk mencegat proses A sebelum proses A kembali statusnya ke privilese user biasa, mengakibatkan dispawnnya shell beridentitas root sering terjadi di mesin-mesin IRIX dan SunOS). Bagaimana caranya agar kita dapat mendapatkan eksploit seperti ini? Tentu saja kita dapat menghabiskan waktu berjam-jam untuk mengutak-utik sebuah program sampai berhasil kita tembus/jebol. Biasanya eksploit diprogram dengan bahasa C, perl, atau sh.
Eksploit jenis satunya lagi adalah eksploit remote, dimana kita dapat mengeksploit sistem tanpa mengetahui otorisasi user/password. Tentu saja eksploit-eksploit jenis ini jauh lebih sedikit jumlahnya, dan terkadang dampaknya juga tidak separah eksploit lokal. Lubang cgi phf adalah salah satu contoh dari pemanfaatan eksploit remote untuk mendapatkan file/etc/passwd. Mungkin belum terlihat fatal, namun sekalinya sang 'cracker' berhasil masuk ke dalam sistem memanfaatkan login dan password dari salah seorang user, maka dia dapat menjalankan eksploit-eksploit lokal untuk mendapatkan akses tak terbatas milik root.
Umumnya, yang jelas paling menarik perhatian kita, adalah eksploit yang akan memberikan kita akses tidak terbatas ke seluruh aspek dari sebuah sistem. Dalam Linux, sering kita dengar istilah mengeksploit program tertentu untuk mendapat privilese root. Tentu saja mendapatkan 'root' bukanlah satu-satunya tujuan pengeksploitan sistem. Seperti yang mungkin sering dialami, kadang sebuah cacat dalam program seperti maild atau ftpd dapat dimanfaatkan untuk tujuan seperti header forging, ip spoofing, denial of service attack, dan mail bombing.
Eksploit secara besar sering dibagi menjadi dua, yaitu eksploit lokal dan eksploit remote. Eksploit lokal adalah jenis eksploit yang hanya dapat dijalankan jika kita sudah punya akses ke dalam suatu sistem (baik itu melalui login telnet, ftp, dll). Eksploit jenis ini jumlahnya banyak, sebab kita sudah punya akses ke ribuan program yang berpotensi untuk dieksploit. Contoh-contoh dari eksploit jenis ini adalah buffer overflow (i.e. mh di RedHat 5, SuperProbe, dan lain-lain), race conditions (dimana dua proses saling berlomba untuk menyelesaikan tugas masing-masing, biasanya proses A disuruh untuk menjalankan suatu utilitas yang membutuhkan privilese root temporer sementara proses B dirancang untuk mencegat proses A sebelum proses A kembali statusnya ke privilese user biasa, mengakibatkan dispawnnya shell beridentitas root sering terjadi di mesin-mesin IRIX dan SunOS). Bagaimana caranya agar kita dapat mendapatkan eksploit seperti ini? Tentu saja kita dapat menghabiskan waktu berjam-jam untuk mengutak-utik sebuah program sampai berhasil kita tembus/jebol. Biasanya eksploit diprogram dengan bahasa C, perl, atau sh.
Eksploit jenis satunya lagi adalah eksploit remote, dimana kita dapat mengeksploit sistem tanpa mengetahui otorisasi user/password. Tentu saja eksploit-eksploit jenis ini jauh lebih sedikit jumlahnya, dan terkadang dampaknya juga tidak separah eksploit lokal. Lubang cgi phf adalah salah satu contoh dari pemanfaatan eksploit remote untuk mendapatkan file/etc/passwd. Mungkin belum terlihat fatal, namun sekalinya sang 'cracker' berhasil masuk ke dalam sistem memanfaatkan login dan password dari salah seorang user, maka dia dapat menjalankan eksploit-eksploit lokal untuk mendapatkan akses tak terbatas milik root.
Minggu, 05 Desember 2010
Program Enkripsi XOR
1. Enkripsi
Plainteks = Ini tugas program enkripsi XOR
Merujuk tabel ASCII menjadi bilangan biner :
I = 01001001
n = 01101110
i = 01101001
spasi = 00100000
t = 01110100
u = 01110101
g = 01100111
a = 01100001
s = 01110011
p = 01110000
r = 01110010
o = 01101111
m = 01101101
e = 01100101
k = 01101011
X = 01011000
O = 01001111
R = 01010010
Representasi 8 bit plainteks menjadi bilangan biner:
01001001 01101110 01101001 00100000
01110100 01110101 01100111 01100001
01110011 00100000 01110000 01110010
01101111 01100111 01110010 01100001
01101101 00100000 01101110 01101110
01101011 01101001 01101001 01110000
01101001 01101001 00100000 01011000
01001111 01010010
Kunci = 23209321
Merujuk tabel ASCII menjadi bilangan biner :
2 = 00110010
3 = 00110011
0 = 00110000
9 = 00111001
1 = 00110001
Representasi 8 bit kunci menjadi bilangan biner :
110010 110011 110010 110000
111001 110011 110010 110001
Ket :
- Bit per bit plainteks dan kunci dioperasi binerkan dengan operasi XOR.
- Untuk kunci yang lebih pendek dari plainteks, kunci ditulis berulang-ulang.
- Setiap karakter pada kunci akan berpadanan dengan satu karakter pada plainteks. Walaupun nantinya bentuk 8bit, setiap satu karakter plainteks yang terdiri dari 8 bit akan berpadanan dengan satu karakter kunci yang terdiri dari 8 bit.
- Operasi yang dilakukan bukan untuk satu blok karakter 8 bit, namun per satu bit, sehingga karakter pengganti yang akan dihasilkan dari suatu plainteks akan sangat sulit untuk dicari frekuensinya. Karena kemungkinan menghasilkan pasangan karakter yang sama sangat sulit terjadi.
Sehingga operasi biner XOR plainteks dan kunci dalam bentuk bit dan karakter menurut tabel ASCII :
01001001 01101110 01101001 00100000
00110010 00110011 00110010 00110000
--------------------------------------XOR
01111011 01011101 01011011 00010000
{ ] [ DLE
01110100 01110101 01100111 01100001
00111001 00110011 00110010 00110001
--------------------------------------XOR
01001101 01000110 01010101 01010000
M F U P
01110011 00100000 01110000 01110010
00110010 00110011 00110010 00110000
--------------------------------------XOR
01000001 00010011 01000010 01000010
A DC3 B B
01101111 01100111 01110010 01100001
00111001 00110011 00110010 00110001
--------------------------------------XOR
01010110 01001100 01000000 01010000
V L @ P
01101101 00100000 01101110 01101110
00110010 00110011 00110010 00110000
--------------------------------------XOR
01011111 00010011 01011100 01011110
_ DC3 \ ^
01101011 01101001 01101001 01110000
00111001 00110011 00110010 00110001
--------------------------------------XOR
01010010 01011010 01010100 01000001
R Z T A
01101001 01101001 00100000 01011000
00110010 00110011 00110010 00110000
--------------------------------------XOR
01000111 01011010 00010010 01101000
G Z DC2 h
01001111 01010010
00111001 00110011
------------------XOR
01110110 01100001
v a
Hasil representasi karakter dari hasil operasi biner XOR 8 bit :
{][DLEMFUPADC3BBVL@P_DC3\^RZTAGZDC2hva
Menyusun rangkaian karakter tersebut dengan pola spiral. Algoritmanya sebagai berikut :
a. Karakter pertama akan menjadi pusat spiral.
b. Karakter berikutnya mulai menyusun ke kiri,setelah itu ke bawah, ke kanan dan begitu seterusnya mengikuti pola putaran jarum jam.
Hasil representasi karakter dari hasil operasi biner XOR 8 bit setelah disusun secara spiral, hasilnya adalah :
TABEL :
http://tinypic.com/view.php?pic=2q2e33c&s=7
Sebagai tahap akhir hasil enkripsi dengan pola spiral ini dituliskan lagi dengan pembacaan secara biasa,mulai dari baris pertama kolom sebelah kanan. Sehingga hasil pembacaan cipherteks diatas adalah :
RZTAGZ^UPADC3DC2\F{]BhDC3MDLE[Bv_P@LVa
2. Deskripsi
Untuk proses dekripsi sebagai kebalikan, untuk
memperoleh plainteks dari cipherteks tersebut. Tentu
saja harus mengubah susunan karakter yang ada pada
cipherteks dari struktur spiral yang ditulis ulang
menjadi struktur linear biasa.
Setelah diperoleh kembali dalam pola biasa, barulah
diubah karakter tersebut dalam bentuk 8 bit. Demikian
juga dengan kunci yang diberikan, juga diubah dalam
bentuk 8 bit.
Salah satu keistimewaan operasi biner XOR, adalah
jika A XOR B = C, maka C XOR B = A. Karena itu,
untuk mengubah cipherteks tadi, cukup dengan
mengoperasi binerkan cipherteks dalam bentuk 8 bit
dengan kunci dalam bentuk 8 bit, dengan operasi
XOR. Dari hasil operasi ini diperolehlah plainteks
yang masih dalam bentuk 8bit-8bit. Langkah terakhir
adalah mengubah 8bit tersebut menjadi karakterkarakter.
Edit :
Alhamdulillah, saya menemukan program yang lebih baik dan sangat berhasil dieksekusi untuk melakukan proses enkripsi sekaligus proses deskripsinya, dan tentu saja cocok dengan proses enkripsi dan deskripsi secara pengerjaan manual (namun tanpa pengerjaan proses "spiral". Bahasa pemrograman yang digunakan yaitu Java dengan editor JCreator. Berikut ini list program beserta urutan pengerjaannya :
1. Buat satu folder untuk penempatan file-file yang diperlukan.
2. Buat program enkripsi XOR nya, sbb :
class XOREnkripsi{
public String charToBinary(char c){
int ascii = (int)c;
String binaryCar = Integer.toBinaryString(ascii);
String addBit="";
if(binaryCar.length()<8){
for(int index=0; index < 8-binaryCar.length(); index++){
addBit = "0" +addBit;
}
}
return addBit+binaryCar;
}
public String XORKriptografi (String plain, String key){
StringBuffer enskripsi = new StringBuffer();
for(int index=0; index < plain.length(); index++){
int longKey = key.length();
Character textJ = new Character(plain.charAt(index));
Character keyJ = new Character(key.charAt(index%longKey));
int xor = Integer.parseInt(textJ.toString()) ^ Integer.parseInt(keyJ.toString());
enskripsi.append(xor);
}
return enskripsi.toString();
}
public String binaryToAsciiToString(String onebit){
int ascii;
ascii = Integer.parseInt(onebit, 2);
return Character.toString((char)ascii);
}
}
3. Buat program untuk konversi plainteks ke chiperteks, sbb :
import java.io.*;
import java.util.*;
class PlainToChiper{
public static void main(String[] args)
{
XOREnkripsi xor = new XOREnkripsi();
FileInputStream fis;
PrintWriter pw;
File file;
DataInputStream dis;
BufferedReader br;
String plainText = new String();
String plainKey = new String();
String binaryText = new String();
String binaryKey = new String();
String binaryChiper = new String();
String plainChiper = new String();
String chipperAllText = new String();
//plainText to binaryText
try{
//Reading keyText.txt file
//get plain text from file
fis = new FileInputStream("keyText.txt");
// Get the object of DataInputStream
dis = new DataInputStream(fis);
br = new BufferedReader(new InputStreamReader(dis));
//System.out.println("\nKey : ");
while ((plainKey = br.readLine()) != null) {
//System.out.println(plainKey);
//plainKey to binaryKey
for(int index=0; index < plainKey.length(); index++){
binaryKey = binaryKey + xor.charToBinary(plainKey.charAt(index));
}
}
//System.out.println("Binary Key : ");
//System.out.println(binaryKey+"\n");
//Encripting Process and Writing to File
//Writing Chipertext File
file= new File("chiperText.txt");
file.createNewFile();
pw = new PrintWriter(new FileWriter(file));
//get plain text from file
fis = new FileInputStream("plainText.txt");
// Get the object of DataInputStream
dis = new DataInputStream(fis);
br = new BufferedReader(new InputStreamReader(dis));
//System.out.println("\nPlain Text : ");
while ((plainText = br.readLine()) != null) {
binaryText="";
plainChiper="";
for(int index=0; index < plainText.length(); index++){
binaryText = binaryText + xor.charToBinary(plainText.charAt(index));
}
//System.out.println(plainText);
binaryChiper = xor.XORKriptografi(binaryText,binaryKey);
for(int index=0; index < binaryChiper.length(); index=index+8){
plainChiper=plainChiper+xor.binaryToAsciiToString(binaryChiper.substring(index,index+8));
}
pw.println(plainChiper);
chipperAllText = chipperAllText + plainChiper + "\n" ;
}
pw.flush();
//System.out.println("Binary Plain Text :");
//System.out.println(binaryText+"\n");
//Print Chippertext
System.out.println("\nChippertext : ");
System.out.println(chipperAllText+"\n");
}catch (Exception e){
System.err.println("Error: " + e.getMessage());
}
}
}
4. Buat pula program konversi dari chiperteks ke plainteks, sbb :
import java.io.*;
import java.util.*;
class ChiperToPlain{
public static void main(String[] args)
{
XOREnkripsi xor = new XOREnkripsi();
FileInputStream fis;
PrintWriter pw;
File file;
DataInputStream dis;
BufferedReader br;
String plainText = new String();
String plainKey = new String();
String binaryText = new String();
String binaryKey = new String();
String binaryChiper = new String();
String plainChiper = new String();
String chipperAllText = new String();
String plainTextAfterEnkripsi = new String();
//plainText to binaryText
try{
//Reading keyText.txt file
//get plain text from file
fis = new FileInputStream("keyText.txt");
// Get the object of DataInputStream
dis = new DataInputStream(fis);
br = new BufferedReader(new InputStreamReader(dis));
//System.out.println("\nKey : ");
while ((plainKey = br.readLine()) != null) {
//System.out.println(plainKey);
//plainKey to binaryKey
for(int index=0; index < plainKey.length(); index++){
binaryKey = binaryKey + xor.charToBinary(plainKey.charAt(index));
}
}
//Reading from file and Descripting Process
//get chiptertext from file
fis = new FileInputStream("chiperText.txt");
// Get the object of DataInputStream
dis = new DataInputStream(fis);
br = new BufferedReader(new InputStreamReader(dis));
//get chippertext from file
System.out.println("\nPlain Text After Enkripsi : ");
while ((plainChiper = br.readLine()) != null) {
plainTextAfterEnkripsi="";
binaryChiper="";
//chiperText to chiperBinary
for(int index=0; index < plainChiper.length(); index++){
binaryChiper = binaryChiper + xor.charToBinary(plainChiper.charAt(index));
}
//System.out.println(binaryChiper);
binaryText = xor.XORKriptografi(binaryChiper,binaryKey);
for(int index=0; index < binaryText.length(); index=index+8){
plainTextAfterEnkripsi=plainTextAfterEnkripsi+xor.binaryToAsciiToString(binaryText.substring(index,index+8));
}
System.out.println(plainTextAfterEnkripsi);
}
}catch (Exception e){
System.err.println("Error: " + e.getMessage());
}
}
}
5. Buat file dengan nama file "plainText" yang isinya tentu saja plainteks sbb : "Ini program enkripsi XOR".
6. Buat file juga dengan nama file "keyText" yang isinya kata kunci (NIM saya) sbb : "23209321".
7. Untuk proses enkripsi dengan program Java, maka eksekusi program "PlainToChiper", maka hasilnya adalah sbb :
ENKRIPSI :
http://tinypic.com/view.php?pic=11rbzi8&s=7
8. Untuk proses deskripsi dengan program Java, maka eksekusi program "ChiperToPlain", maka hasilnya adalah sbb :
DESKRIPSI :
http://tinypic.com/view.php?pic=16c6rs6&s=7
Plainteks = Ini tugas program enkripsi XOR
Merujuk tabel ASCII menjadi bilangan biner :
I = 01001001
n = 01101110
i = 01101001
spasi = 00100000
t = 01110100
u = 01110101
g = 01100111
a = 01100001
s = 01110011
p = 01110000
r = 01110010
o = 01101111
m = 01101101
e = 01100101
k = 01101011
X = 01011000
O = 01001111
R = 01010010
Representasi 8 bit plainteks menjadi bilangan biner:
01001001 01101110 01101001 00100000
01110100 01110101 01100111 01100001
01110011 00100000 01110000 01110010
01101111 01100111 01110010 01100001
01101101 00100000 01101110 01101110
01101011 01101001 01101001 01110000
01101001 01101001 00100000 01011000
01001111 01010010
Kunci = 23209321
Merujuk tabel ASCII menjadi bilangan biner :
2 = 00110010
3 = 00110011
0 = 00110000
9 = 00111001
1 = 00110001
Representasi 8 bit kunci menjadi bilangan biner :
110010 110011 110010 110000
111001 110011 110010 110001
Ket :
- Bit per bit plainteks dan kunci dioperasi binerkan dengan operasi XOR.
- Untuk kunci yang lebih pendek dari plainteks, kunci ditulis berulang-ulang.
- Setiap karakter pada kunci akan berpadanan dengan satu karakter pada plainteks. Walaupun nantinya bentuk 8bit, setiap satu karakter plainteks yang terdiri dari 8 bit akan berpadanan dengan satu karakter kunci yang terdiri dari 8 bit.
- Operasi yang dilakukan bukan untuk satu blok karakter 8 bit, namun per satu bit, sehingga karakter pengganti yang akan dihasilkan dari suatu plainteks akan sangat sulit untuk dicari frekuensinya. Karena kemungkinan menghasilkan pasangan karakter yang sama sangat sulit terjadi.
Sehingga operasi biner XOR plainteks dan kunci dalam bentuk bit dan karakter menurut tabel ASCII :
01001001 01101110 01101001 00100000
00110010 00110011 00110010 00110000
--------------------------------------XOR
01111011 01011101 01011011 00010000
{ ] [ DLE
01110100 01110101 01100111 01100001
00111001 00110011 00110010 00110001
--------------------------------------XOR
01001101 01000110 01010101 01010000
M F U P
01110011 00100000 01110000 01110010
00110010 00110011 00110010 00110000
--------------------------------------XOR
01000001 00010011 01000010 01000010
A DC3 B B
01101111 01100111 01110010 01100001
00111001 00110011 00110010 00110001
--------------------------------------XOR
01010110 01001100 01000000 01010000
V L @ P
01101101 00100000 01101110 01101110
00110010 00110011 00110010 00110000
--------------------------------------XOR
01011111 00010011 01011100 01011110
_ DC3 \ ^
01101011 01101001 01101001 01110000
00111001 00110011 00110010 00110001
--------------------------------------XOR
01010010 01011010 01010100 01000001
R Z T A
01101001 01101001 00100000 01011000
00110010 00110011 00110010 00110000
--------------------------------------XOR
01000111 01011010 00010010 01101000
G Z DC2 h
01001111 01010010
00111001 00110011
------------------XOR
01110110 01100001
v a
Hasil representasi karakter dari hasil operasi biner XOR 8 bit :
{][DLEMFUPADC3BBVL@P_DC3\^RZTAGZDC2hva
Menyusun rangkaian karakter tersebut dengan pola spiral. Algoritmanya sebagai berikut :
a. Karakter pertama akan menjadi pusat spiral.
b. Karakter berikutnya mulai menyusun ke kiri,setelah itu ke bawah, ke kanan dan begitu seterusnya mengikuti pola putaran jarum jam.
Hasil representasi karakter dari hasil operasi biner XOR 8 bit setelah disusun secara spiral, hasilnya adalah :
TABEL :
http://tinypic.com/view.php?pic=2q2e33c&s=7
Sebagai tahap akhir hasil enkripsi dengan pola spiral ini dituliskan lagi dengan pembacaan secara biasa,mulai dari baris pertama kolom sebelah kanan. Sehingga hasil pembacaan cipherteks diatas adalah :
RZTAGZ^UPADC3DC2\F{]BhDC3MDLE[Bv_P@LVa
2. Deskripsi
Untuk proses dekripsi sebagai kebalikan, untuk
memperoleh plainteks dari cipherteks tersebut. Tentu
saja harus mengubah susunan karakter yang ada pada
cipherteks dari struktur spiral yang ditulis ulang
menjadi struktur linear biasa.
Setelah diperoleh kembali dalam pola biasa, barulah
diubah karakter tersebut dalam bentuk 8 bit. Demikian
juga dengan kunci yang diberikan, juga diubah dalam
bentuk 8 bit.
Salah satu keistimewaan operasi biner XOR, adalah
jika A XOR B = C, maka C XOR B = A. Karena itu,
untuk mengubah cipherteks tadi, cukup dengan
mengoperasi binerkan cipherteks dalam bentuk 8 bit
dengan kunci dalam bentuk 8 bit, dengan operasi
XOR. Dari hasil operasi ini diperolehlah plainteks
yang masih dalam bentuk 8bit-8bit. Langkah terakhir
adalah mengubah 8bit tersebut menjadi karakterkarakter.
Edit :
Alhamdulillah, saya menemukan program yang lebih baik dan sangat berhasil dieksekusi untuk melakukan proses enkripsi sekaligus proses deskripsinya, dan tentu saja cocok dengan proses enkripsi dan deskripsi secara pengerjaan manual (namun tanpa pengerjaan proses "spiral". Bahasa pemrograman yang digunakan yaitu Java dengan editor JCreator. Berikut ini list program beserta urutan pengerjaannya :
1. Buat satu folder untuk penempatan file-file yang diperlukan.
2. Buat program enkripsi XOR nya, sbb :
class XOREnkripsi{
public String charToBinary(char c){
int ascii = (int)c;
String binaryCar = Integer.toBinaryString(ascii);
String addBit="";
if(binaryCar.length()<8){
for(int index=0; index < 8-binaryCar.length(); index++){
addBit = "0" +addBit;
}
}
return addBit+binaryCar;
}
public String XORKriptografi (String plain, String key){
StringBuffer enskripsi = new StringBuffer();
for(int index=0; index < plain.length(); index++){
int longKey = key.length();
Character textJ = new Character(plain.charAt(index));
Character keyJ = new Character(key.charAt(index%longKey));
int xor = Integer.parseInt(textJ.toString()) ^ Integer.parseInt(keyJ.toString());
enskripsi.append(xor);
}
return enskripsi.toString();
}
public String binaryToAsciiToString(String onebit){
int ascii;
ascii = Integer.parseInt(onebit, 2);
return Character.toString((char)ascii);
}
}
3. Buat program untuk konversi plainteks ke chiperteks, sbb :
import java.io.*;
import java.util.*;
class PlainToChiper{
public static void main(String[] args)
{
XOREnkripsi xor = new XOREnkripsi();
FileInputStream fis;
PrintWriter pw;
File file;
DataInputStream dis;
BufferedReader br;
String plainText = new String();
String plainKey = new String();
String binaryText = new String();
String binaryKey = new String();
String binaryChiper = new String();
String plainChiper = new String();
String chipperAllText = new String();
//plainText to binaryText
try{
//Reading keyText.txt file
//get plain text from file
fis = new FileInputStream("keyText.txt");
// Get the object of DataInputStream
dis = new DataInputStream(fis);
br = new BufferedReader(new InputStreamReader(dis));
//System.out.println("\nKey : ");
while ((plainKey = br.readLine()) != null) {
//System.out.println(plainKey);
//plainKey to binaryKey
for(int index=0; index < plainKey.length(); index++){
binaryKey = binaryKey + xor.charToBinary(plainKey.charAt(index));
}
}
//System.out.println("Binary Key : ");
//System.out.println(binaryKey+"\n");
//Encripting Process and Writing to File
//Writing Chipertext File
file= new File("chiperText.txt");
file.createNewFile();
pw = new PrintWriter(new FileWriter(file));
//get plain text from file
fis = new FileInputStream("plainText.txt");
// Get the object of DataInputStream
dis = new DataInputStream(fis);
br = new BufferedReader(new InputStreamReader(dis));
//System.out.println("\nPlain Text : ");
while ((plainText = br.readLine()) != null) {
binaryText="";
plainChiper="";
for(int index=0; index < plainText.length(); index++){
binaryText = binaryText + xor.charToBinary(plainText.charAt(index));
}
//System.out.println(plainText);
binaryChiper = xor.XORKriptografi(binaryText,binaryKey);
for(int index=0; index < binaryChiper.length(); index=index+8){
plainChiper=plainChiper+xor.binaryToAsciiToString(binaryChiper.substring(index,index+8));
}
pw.println(plainChiper);
chipperAllText = chipperAllText + plainChiper + "\n" ;
}
pw.flush();
//System.out.println("Binary Plain Text :");
//System.out.println(binaryText+"\n");
//Print Chippertext
System.out.println("\nChippertext : ");
System.out.println(chipperAllText+"\n");
}catch (Exception e){
System.err.println("Error: " + e.getMessage());
}
}
}
4. Buat pula program konversi dari chiperteks ke plainteks, sbb :
import java.io.*;
import java.util.*;
class ChiperToPlain{
public static void main(String[] args)
{
XOREnkripsi xor = new XOREnkripsi();
FileInputStream fis;
PrintWriter pw;
File file;
DataInputStream dis;
BufferedReader br;
String plainText = new String();
String plainKey = new String();
String binaryText = new String();
String binaryKey = new String();
String binaryChiper = new String();
String plainChiper = new String();
String chipperAllText = new String();
String plainTextAfterEnkripsi = new String();
//plainText to binaryText
try{
//Reading keyText.txt file
//get plain text from file
fis = new FileInputStream("keyText.txt");
// Get the object of DataInputStream
dis = new DataInputStream(fis);
br = new BufferedReader(new InputStreamReader(dis));
//System.out.println("\nKey : ");
while ((plainKey = br.readLine()) != null) {
//System.out.println(plainKey);
//plainKey to binaryKey
for(int index=0; index < plainKey.length(); index++){
binaryKey = binaryKey + xor.charToBinary(plainKey.charAt(index));
}
}
//Reading from file and Descripting Process
//get chiptertext from file
fis = new FileInputStream("chiperText.txt");
// Get the object of DataInputStream
dis = new DataInputStream(fis);
br = new BufferedReader(new InputStreamReader(dis));
//get chippertext from file
System.out.println("\nPlain Text After Enkripsi : ");
while ((plainChiper = br.readLine()) != null) {
plainTextAfterEnkripsi="";
binaryChiper="";
//chiperText to chiperBinary
for(int index=0; index < plainChiper.length(); index++){
binaryChiper = binaryChiper + xor.charToBinary(plainChiper.charAt(index));
}
//System.out.println(binaryChiper);
binaryText = xor.XORKriptografi(binaryChiper,binaryKey);
for(int index=0; index < binaryText.length(); index=index+8){
plainTextAfterEnkripsi=plainTextAfterEnkripsi+xor.binaryToAsciiToString(binaryText.substring(index,index+8));
}
System.out.println(plainTextAfterEnkripsi);
}
}catch (Exception e){
System.err.println("Error: " + e.getMessage());
}
}
}
5. Buat file dengan nama file "plainText" yang isinya tentu saja plainteks sbb : "Ini program enkripsi XOR".
6. Buat file juga dengan nama file "keyText" yang isinya kata kunci (NIM saya) sbb : "23209321".
7. Untuk proses enkripsi dengan program Java, maka eksekusi program "PlainToChiper", maka hasilnya adalah sbb :
ENKRIPSI :
http://tinypic.com/view.php?pic=11rbzi8&s=7
8. Untuk proses deskripsi dengan program Java, maka eksekusi program "ChiperToPlain", maka hasilnya adalah sbb :
DESKRIPSI :
http://tinypic.com/view.php?pic=16c6rs6&s=7
Kamis, 14 Oktober 2010
Buffer Overflow
Jika kita mengakses suatu situs web kemudian saat kita memberikan input yang tidak semestinya pada field browser ataupun pada field userId dan Password, maka web yang memiliki vurnerability akan terjadi Buffer Overflow.
Apakah yang dimaksud dengan Buffer Overflow ? Buffer adalah tempat penampungan. Overflow artinya kelebihan muatan. Jadi buffer overflow = suatu kondisi dimana element-element yang ada tidak dapat lagi menempati tempat penampungan yang ada.
Contohnya : char rumah[25]; // rumah yang bisa berisi 25 orang saja. char kamar[10]; // kamar yang bisa berisi 10 orang saja. Jika semua yang ada di rumah (25 orang) masuk ke dalam kamar (yang hanya bisa berisi 10 orang saja), kamar itu tidak akan dapat menampung 15 orang lainnya. Hal inilah yang bisa kita katakan buffer overflow, dimana kamar itu adalah buffer dan karena kapasitas kamar lebih kecil dari kapasitas yang akan masuk maka dapat dikatakan overflow.
Ok deh sekian dulu tulisan hari ini, yang terpenting adalah penguatan konsep dulu secara teoritis, sambil berjalan menuju ke arah lebih teknis. Wish me luck !!! Hehe...
Apakah yang dimaksud dengan Buffer Overflow ? Buffer adalah tempat penampungan. Overflow artinya kelebihan muatan. Jadi buffer overflow = suatu kondisi dimana element-element yang ada tidak dapat lagi menempati tempat penampungan yang ada.
Contohnya : char rumah[25]; // rumah yang bisa berisi 25 orang saja. char kamar[10]; // kamar yang bisa berisi 10 orang saja. Jika semua yang ada di rumah (25 orang) masuk ke dalam kamar (yang hanya bisa berisi 10 orang saja), kamar itu tidak akan dapat menampung 15 orang lainnya. Hal inilah yang bisa kita katakan buffer overflow, dimana kamar itu adalah buffer dan karena kapasitas kamar lebih kecil dari kapasitas yang akan masuk maka dapat dikatakan overflow.
Ok deh sekian dulu tulisan hari ini, yang terpenting adalah penguatan konsep dulu secara teoritis, sambil berjalan menuju ke arah lebih teknis. Wish me luck !!! Hehe...
Arbitrary Code Execution
Mengikuti anjuran salah satu guru fav, saya coba up date blog ini dengan tulisan-tulisan yang belum tentu berbobot hehe...Kata beliau (guruku) yang penting isi dalam sisi kuantitas terlebih dahulu, kualitasnya boleh belakangan...alias lagi kuantitas no.1, kualitas no 73, itu kan bagi beliau, kalo bagi saya si kualitasnya jadi no.1073 hehehe...tapi yang penting jadi 'seleb digital' aja dulu deh. Great Point !!!
Oke deh blog hari ini saya isi dengan tema masih seputar keamanan informasi, yaitu Arbitrary Code Execution saya singkat ACE, sebagai kelanjutan dari blog berjudul "Pengantar Shellcode". Sebagai pembuka ada baiknya untuk memperjelas tulisan mengenai Pengantar Shell Code adalah dengan menjawab pengertian Shell Code dan kenapa disebut shellcode, yaitu :
Bila hacker bisa membuat program mengeksekusi code apapun yang dia mau, maka code apakah yang dipilihnya? Pilihan terbaik adalah code yang memberikan dia shell sehingga dia bisa memberi perintah lain yang dia mau dengan leluasa. Oleh karena itu code itu disebut Shell Code.
Walaupun umumnya Shell Code memberikan shell, Shell Code tidak selalu memberikan shell. Attacker bebas menentukan code apa yang akan dieksekusi di komputer korban. Shell Code bisa melakukan apa saja mulai dari menghapus file, memformat hardisk, mengirimkan data, menginstall program baru dsb terserah keinginan attacker.
Nah sekarang, saya bahas mengenai ACE :
Dalam perancangan suatu sistem ataupun produk dari suatu sistem teknologi informasi yang dibangun selalu terdapat kesalahan/kekurangan yang diakibatkan oleh adanya Human Error yang dapat diistilahkan dengan istilah Vurnerability. Vurnerability merupakan bentuk human error yang menyatakan kecerobohan sang programmer saat membuat program, akibatnya program tersebut menjadi rentan disusupi para hacker dengan cara mengeksploit sehingga ACE pun dapat ditanam pada shell yang diretas dalam memory komputer. Bila sudah sampai pada tahapan ini maka seorang hacker telah dapat menjalankan code apapun yang diinginkannya, sehingga program akan mengikuti instruksinya dan mengabaikan perintah penciptanya, kondisi inilah yang disebut dengan Arbitrary Code Execution.
Dengan kata lain ACE adalah kondisi dimana attacker dapat menginjeksi sembarang code/instruksi ke dalam suatu proses yang sedang running, kemudian code tersebut dieksekusi. Code yang diinjeksi itu disebut dengan shellcode. Code dalam shellcode adalah dalam bentuk bahasa mesin atau opcode. Biasanya opcode ini tidak dituliskan dalam nilai binary karena akan menjadi sangat panjang, melainkan memakai nilai hexa yang lebih kompak.
Untuk penjelasan lebih lanjut pending aja dulu yah...maklum saya ini kan masih belajar (Seleb digital ranking 1073 hehe)
Oke deh blog hari ini saya isi dengan tema masih seputar keamanan informasi, yaitu Arbitrary Code Execution saya singkat ACE, sebagai kelanjutan dari blog berjudul "Pengantar Shellcode". Sebagai pembuka ada baiknya untuk memperjelas tulisan mengenai Pengantar Shell Code adalah dengan menjawab pengertian Shell Code dan kenapa disebut shellcode, yaitu :
Bila hacker bisa membuat program mengeksekusi code apapun yang dia mau, maka code apakah yang dipilihnya? Pilihan terbaik adalah code yang memberikan dia shell sehingga dia bisa memberi perintah lain yang dia mau dengan leluasa. Oleh karena itu code itu disebut Shell Code.
Walaupun umumnya Shell Code memberikan shell, Shell Code tidak selalu memberikan shell. Attacker bebas menentukan code apa yang akan dieksekusi di komputer korban. Shell Code bisa melakukan apa saja mulai dari menghapus file, memformat hardisk, mengirimkan data, menginstall program baru dsb terserah keinginan attacker.
Nah sekarang, saya bahas mengenai ACE :
Dalam perancangan suatu sistem ataupun produk dari suatu sistem teknologi informasi yang dibangun selalu terdapat kesalahan/kekurangan yang diakibatkan oleh adanya Human Error yang dapat diistilahkan dengan istilah Vurnerability. Vurnerability merupakan bentuk human error yang menyatakan kecerobohan sang programmer saat membuat program, akibatnya program tersebut menjadi rentan disusupi para hacker dengan cara mengeksploit sehingga ACE pun dapat ditanam pada shell yang diretas dalam memory komputer. Bila sudah sampai pada tahapan ini maka seorang hacker telah dapat menjalankan code apapun yang diinginkannya, sehingga program akan mengikuti instruksinya dan mengabaikan perintah penciptanya, kondisi inilah yang disebut dengan Arbitrary Code Execution.
Dengan kata lain ACE adalah kondisi dimana attacker dapat menginjeksi sembarang code/instruksi ke dalam suatu proses yang sedang running, kemudian code tersebut dieksekusi. Code yang diinjeksi itu disebut dengan shellcode. Code dalam shellcode adalah dalam bentuk bahasa mesin atau opcode. Biasanya opcode ini tidak dituliskan dalam nilai binary karena akan menjadi sangat panjang, melainkan memakai nilai hexa yang lebih kompak.
Untuk penjelasan lebih lanjut pending aja dulu yah...maklum saya ini kan masih belajar (Seleb digital ranking 1073 hehe)
Langganan:
Postingan (Atom)