Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Temas - elefren

#1
Que tal gente, aqui os dejo otro artículo que escribí en mi blog hace unas semanas, espero que os resulte interesante ;)


Introducción

En esta entrada vamos a ver como explotar un bug LFI (Local File Inclusion) en una web bajo JSP. Un LFI es una vulnerabilidad mediante la cual un atacante puede acceder a ficheros no destinados al usuario mediante un parámetro no controlado en un sistema modular.


LFI y estructura de archivos en un proyecto JSP

Como sabemos para explotar un LFI debemos conocer la estructura del ficheros del sistema al que estamos atacando, es decir si la web es por ejemplo de tipo index.jsp?pagina=inicio.jsp y conocemos que hay un directorio llamado panel, en el cual hay un jsp para agregar un usuario llamado gestionUsuarios.jps, introduciríamos la url index.jsp?pagina=panel/gestionUsuarios.jsp, y si desconocemos la estructura de los archivos y directorios de la web, habría que meterle en base a fuerza bruta. En JSP tenemos una ventaja, y es que los proyectos web en java están formados por la siguiente extructura:



Como vemos en la imagen, existe una una carpeta llamada WEB-INF en una ruta superior a la base de la aplicación, en la cual esta el archivo web.xml que es donde metemos diversos parámetros de configuración, y tirando de ahí ya se puede comenzar a extraer datos. En ese directorio también se guardan diferentes archivos de configuración como properties y demás, y utilizando fuerza bruta o conociendo algún dato del sistema podremos extraerlos.


Explotando el bug

Pues bien, ahora voy a llevar a cabo un ejemplo real de este ataque en una web que he encontrado la cual vamos a anonimizar, que tras ver su tipo de url vemos que tiene un parametro llamado module el cual parece vulnerable a LFI.



Pues viendo que está en Java y conociendo el detalle del famoso archivo web.xml, intentaremos escalar directorios y incluir este archivo a ver que sale, y tras un par de pruebas vemos que está tres directorios por encima de la base del sistema de modulación, y nos imprime información delicada en pantalla:



Como vemos, nos está soltando en pantalla todo el contenido del archivo, y si abrimos el código fuente de la web para verlo mas limpio podremos destacar lo siguiente:

Código: php
 
  ...
  <context-param>
    <param-name>Jdbc_url</param-name>
    <param-value>jdbc:mysql://127.0.0.1/BASE_DE_DATOS?user=USUARIO&amp;password=PASSWORD</param-value>
  </context-param>
  ...
  <context-param>
      <param-name>log_path</param-name>
      <param-value>c:/pdo/</param-value>
  </context-param>
  ...
  <taglib>
    <taglib-uri>/WEB-INF/struts-bean.tld</taglib-uri>
    <taglib-location>/WEB-INF/struts-bean.tld</taglib-location>
  </taglib>
  <taglib>
    <taglib-uri>/WEB-INF/struts-logic.tld</taglib-uri>
    <taglib-location>/WEB-INF/struts-logic.tld</taglib-location>
  </taglib>
  ...



Tras examinar la información que nos devuelve el archivo, podemos destacar:

-Vemos los datos de configuración de la base de datos MySQL a la que se conecta el sistema, que esta en la propia máquina (127.0.0.1). Con esto si el servidor no tiene bloqueadas las conexiones externas (que son muchos...) ya tendríamos acceso completo a la base de datos.

-También vemos la ruta de los archivos LOG del apache, y una cosa curiosa, que el servidor esta en windows... Que podamos conocer la ruta de los logs es muy peligroso, puesto que podríamos hacer peticiones vía HTTP con código java inyectado en el GET, y luego los incluimos por el LFI y dicho código que hemos mandado por GET anteriormente se ejecutaría, lo que nos permitiría ejecutar comandos en el propio servidor y subir una shell para aumentar nuestro control sobre este.

-Por ultimo cabe destacar que nos muestra las rutas de varios archivos de configuración que están en el mismo directorio, que tras acceder a ellos vemos que definen diversos parámetros de configuración, librerías y demás datos que el atacante puede aprovechar


Conclusión:

Para concluir este post, sobra mencionar que tenemos que tener cuidado cuando hagamos un sistema modular mediante includes, y para evitar este tipo de vulnerabilidades tenemos dos opciones, o almacenamos los módulos o archivos disponibles a incluir en un array, o si no también podemos controlar que en la variable no se puedan insertar puntos ni barras, para que así no se pueda descender ni escalar del directorio de los módulos a incluir.
#2
Buenas chicos, aquí os dejo este "artículo" que escribí inicialmente en un blog que tengo, y lo publico aquí para que sea de utilidad a los que desconozcan este método de bypassear el modsecurity.

Introduccion
Como muchos conocemos, por allá por el 2005 con la aparición de las inyecciones SQL y demás agujeros de seguridad en php, Apache implementó un modulo llamado mod_security el cual funciona como una especie de WAF (Web Application Firewall) que bloquea nuestras peticiones a la aplicación cuando detecta valores sospechosos por GET, POST, COOKIE, etc... Hoy en día siguen habiendo muchas aplicaciones web (desde la de la tienda del chapuzas de la esquina, hasta gubernamentales) con este modulo activado en su servidor pensando así sus administradores que está libres de posibles inyecciones y demás.

¿Cómo funciona mod_security?
El mod_security actúa en una capa sobre la ejecución de código, filtrando las peticiones al servidor a las que lleguen parámetros sospechosos como puede ser por ejemplo en una variable GET un "AND 1=1", UNION, entre otros... Entonces si este es el caso el servidor bloquea la peticion mostrándonos una pagina de error. De esta manera nos impide poder realizar una inyección SQL.


Rompiendo el mod_security
Sabiendo que el mod_security se blinda funcionando con un filtrado de expresiones, para evitarlo tan solo hay que saltar ese filtrado, pero claro si en el están incluidas palabras como UNION, UpdateXML, SELECT, WHERE, etc.. ¿cómo conseguimos ejecutar nuestras sentencias? pues muy sencillo, en MySQL existe una sintaxis para ejecutar dichos parámetros solo si el MySQL que se ejecuta es bajo una versión en concreto (ideal para los dump) la cual funciona de la siguiente manera:

Código: php

/*!40101 DELETE FROM ejemplo WHERE version=4 */
/*!50000 DELETE FROM ejemplo WHERE version=5 */


El código anterior si lo ejecutamos en una versión 4.x de MySQL solo ejecutará la primera sentencia, pues en la segunda le estamos diciendo que sea en versiones mayores a la 5. ¿Qué conseguimos con esto? pues que el mod_security no tiene filtrada esta sintaxis, es decir que cuando introducimos una petición GET con la sentencia en este formato se la tragará y nos ejecutará la inyección, aquí dejo algunos ejemplos:

Código: php

http://www.victima.com/acceso.php?codigo='/!*50000OR*/ 1=1
http://www.victima.com/ver?idc=265' /*!50000AND*/ updatexml(null,concat(0x3a,(SELECT pass FROM tabla LIMIT 0,1)),1)
http://www.victima.com/tfno.php?id=.4'/*!50000UNION*//*!50000SELECT*/1,2,3,4,5,6,7--


Conclusión
Como conclusión final de esta entrada pues creo que sobra decir, que lo mejor es hacer nuestras aplicaciones seguras, y evitar llegar a practicas como estas, pues un WAF, ya sea mod_security u otro en muchos casos no es seguro y la seguridad de nuestra web puede caer. Y en caso de que el WAF fuera seguro, imaginaros que en un momento por algún despiste del administrador, actualización o algo este se desactive, nuestra aplicación quedaría expuesta, así que lo mejor es no depender de estos módulos.