Introducción a la informatica forense con Perl by Xianur0

Hola, Hola, yo se que hace tiempo no publico ningún paper, pero esta vez me dio la gana, así que no fastidien preguntando el por que xD

No tengo ganas de explicar que es Informática forense así que busquen en google hijos de mami xD

Vamos a trabajar con imágenes de memoria, no vamos a tocar el disco duro en este paper.

Hay muchas formas de dumpear la memoria, a mi me gusta hacerlo con dd (desde live o si esta linux instalado mejor xD)
Un detalle con la memoria es que la información no desaparece de forma inmediata, por lo que incluso minutos después de apagar la pc aun quedaran rastros de nuestra información (pueden investigar del Cold boot attack para hacer esto mas extremo)…

En fin, regresando al tema, una forma de dumpear la memoria para este experimento es la siguiente:

linux-7nli:/dev # dd if=/dev/mem of=/media/usb/mem.img
dd: leyendo «/dev/mem»: Dirección incorrecta
1806320+0 registros leídos
1806320+0 registros escritos
924835840 bytes (925 MB) copiados, 31,8378 s, 29,0 MB/s

Esto es, extraemos una imagen binaria de mem con dd (esta es la memoria).

Ya que tenemos la imagen binaria de la memoria podemos trabajar sobre ella, una forma es usando el comando strings, pero no me gusta mucho por lo que programe un simple script en perl que nos ayudara… bastante con este trabajo.


#!/usr/bin/perl
# By Xianur0
# xianur0.null[at]gmail.com
$imagen = $ARGV[0] || die("Uso: $1 imagen.dd\n");
open BIN,$imagen;
my %uris = ();
my %disks = ();
my %bookmarks = ();
my %cookies = ();
my %emails = ();
my %volumenes = ();
my %mysqls = ();
my %proxys = ();
my $bookmark = "";
my $nbookmark = "";
my @lineas = ();
my $lineabin = "";
my $minpass = 5;
my $maxpass = 20;
my $todo = "";
my $grabar = 0;
sub ascii2char($)
{
(my $str = shift) =~ s/@([0-9]{2})@/chr($1)/eg;
return $str;
}
sub hex2ascii($)
{
(my $str = shift) =~ s/([a-fA-F0-9]{2})/chr(hex $1)/eg;
return $str;
}

open PASSWORD,">resultados/passwords.txt";
open MYSQL,">resultados/mysql.txt";
open URI,">resultados/uri.txt";
open COOKIE,">resultados/cookies.txt";
open BOOKMARKS,">resultados/bookmarks.txt";
open VOLUMEN,">resultados/volumenes.txt";
open DISK,">resultados/disks.txt";
open EMAIL,">resultados/emails.txt";
open PROXY,">resultados/proxys.txt";
open ENCRYPTED,">resultados/encrypted.txt";
open BRUTE,">resultados/bruteforce.txt";
open STRINGS,">resultados/strings.txt";
print "Extrayendo datos...\n";
while($lineabin = ) {
@lineas = ($lineabin =~ m/([\w\d&\*=\-\_\[\]\s"'\/\\\%;\:\.\t\,\#\)\(\@\?`]+)/g);
BUCLE: foreach $linea (@lineas) {
$linea =~ s///g;
next BUCLE if(length($linea) = $minpass && length($linea) <= $maxpass && $linea !~ /^(\s|\t)+$/) {
print BRUTE $linea."\n";
}
if($nbookmark ne "") {
if($linea =~ /()/) {
$bookmark .= $linea;
} else {
$bookmarks{$nbookmark} = $bookmark;
$nbookmark = "";
$bookmark = "";
}
}
if($linea =~ /((https?|file|ftp|smb):\/\/.+)/) {
my $uri = $1;
$uri =~ s/\s+.+//g;
print URI $uri."\n" if($uris{$uri} < 1 || $uris{$uri} eq "");
$uris{$uri}++;
}
if($linea =~ /(\/dev\/disk\/by-id\/(.+))/) {
my $disk = $1;
print DISK $disk."\n" if($disks{$disk} < 1 || $disks{$disk} eq "");
$disks{$disk}++;
}
if($linea =~ /]+)?>/) {
if($nbookmark ne "") {
print BOOKMARKS $bookmark."\n" if($bookmarks{$nbookmark} < 1 || $bookmarks{$nbookmark} eq "");
$bookmarks{$nbookmark}++;
$nbookmark = "";
$bookmark = "";
}
elsif($linea =~ /<bookmark href="([^"]+)/) {
$bookmark .= $linea;
$nbookmark = $1;
}
}
if($linea =~ /([\w\d\@]+\@46\@volume)/) {
my $volume = $1;
$volume =~ s/\@46\@volume$//;
$volume = ascii2char($volume);
print VOLUMEN $volume."\n" if($volumenes{$volume} = $minpass && length($pass) <= $maxpass);
}
if($linea =~ /Cookie:\s(.+)/) {
my $cookie = $1;
print COOKIE $cookie."\n" if($cookies{$cookie} < 1 || $cookies{$cookie} eq "");
$cookies{$cookie}++;
} elsif($linea =~ /(PHPSESSID=[\w\d]+)/) {
my $cookie = $1;
print COOKIE $cookie."\n" if($cookies{$cookie} < 1 || $cookies{$cookie} eq "");
$cookies{$cookie}++;
}
if($linea =~ /([\w\d\-_\.]+@[\w\d\-_\.]+\.\w+)/) {
my $email = $1;
print EMAIL $email."\n" if($emails{$email} < 1 || $emails{$email} eq "");
$emails{$email}++;
}
if($linea =~ /mysql (.+)/) {
my $lineamysql = $1;
my ($usuario) = ($lineamysql =~ /-u(\s*[^\s]+)/);
my ($password) = ($lineamysql =~ /-p(\s*[^\s]+)/);
if($usuario ne "") {
print MYSQL $lineamysql."\n" if($mysqls{$usuario.":".$password} < 1 || $mysqls{$usuario.":".$password} eq "");
$mysqls{$usuario.":".$password}++;
}
}
if($linea =~ /export (.+?)_proxy="([^"]+)"/) {
my $proxyhttp = $1;
print PROXY $proxyhttp."\n" if($proxys{$proxyhttp} < 1 || $proxys{$proxyhttp} eq "");
$proxys{$proxyhttp}++;
}
if($linea =~ /ECRYPTFS_FNEK_ENCRYPTED\.(.+)/) {
my $enckey = $1;
print ENCRYPTED $enckey."\n" if($cifrados{$enckey} < 1 || $cifrados{$enckey} eq "");
$cifrados{$enckey}++;
# print "eCryptfs Filname Encryption Key Encrypted: ".$enckey."\n\n";
}
}
}
close(MYSQL);
close(URI);
close(COOKIE);
close(BOOKMARKS);
close(VOLUMEN);
close(DISK);
close(EMAIL);
close(PROXY);
close(ENCRYPTED);
close(STRINGS);
close(PASSWORD);
print "Datos extraídos exitosamente!\n";

Este script no es mas que una serie de regex para intentar detectar datos sensibles, en este caso este script nos permite obtener:

  • Posibles passwords
  • Passwords de mysql
  • Uri’s visitadas
  • Cookies
  • Bookmarks
  • Volúmenes (almacenamiento extraible) que se conectaron alguna vez (y que aun están registrados en memoria)
  • Discos duros
  • Mail-list
  • Proxy’s configurados
  • Datos de discos encriptados 😉
  • Diccionario de bruteforce con todo lo que pudiera ser una password
  • Otras cadenas

Un dato interesante es: Si el sistema emplea Swap… muchos datos aun aparecerán después de meses xD…

linux-7nli:/home/xianur0/depredador/forense # perl forense.pl /media/usb/mem.img
Extrayendo datos…
Datos extraídos exitosamente!

Estos datos los va a guardar dentro de una carpeta llamada: “resultados” (que previamente deberíamos haber creado xD)

Ahora bien, ya extraídos esos validos datos, toca usarlos ;)…

#!/usr/bin/perl # By Xianur0 # xianur0.null[at]gmail.com open HASHES,”hashes.txt”; open BRUTE,”resultados/passwords.txt”; open CRACKEADAS,”>resultados/crackeados.txt”; my @hashes = <HASHES>; my @brute = <BRUTE>; my $contador = 0; foreach $linea (@brute) { $linea =~ s/^(password|passwd|pass|pwd)\s*=*\s*//g; $password1 = $linea; $password2 = $linea; $password1 =~ s/\\//g; $password2 =~ s/^[“‘]+//; $password2 =~ s/[“‘;]+$//; $password3 = $password2; $password3 =~ s/\\//g; @passwords = ($password1,$password2,$linea,$password3); foreach $password (@passwords){ foreach $hash (@hashes) { if (crypt($password, $hash) eq $hash) { print “[!] Password crackeada: “.$linea.”\n”; print CRACKEADAS “Password: “.$linea.”\nHash: “.$hash.”\n\n” } $contador++; print $contador.”\n” if(($contador%100) == 0); } } }

Este otro script perl es un crackeador las hashes de /etc/passwd o /etc/shadow (encriptacion común).

Por lo que muchas veces va a caer la password de algún usuario 😉 jeje

Algo interesante es que muchas veces nos vamos a topar con urls que se visitaron en modo “incógnito” en algún navegador, estos datos también aparecen por que existen en la memoria, así que no crean que son invisibles 😉

También podemos encontrar imágenes y documentos, pero eso se verá en otra publicación 😉

Fuente: infiernohacker.com

Matías Moreno Cárdenas

Publicado por: Matías Moreno Cárdenas

Analista de Seguridad IT y hacking ético / Desarrollador de Software Multiplataforma. Actualmente analista de seguridad informática y hacking ético en Grupo SIA

Deja un comentario