Panoptic

·4 min de lectura
panoptic python tool lfi

Panoptic

Intro

Ocasionalmente, durante una prueba de penetración, encuentro una vulnerabilidad de tipo LFI que no se puede convertir a un RFI fácilmente y ser exploitado. Esta puede ser una vulnerabilidad muy frustrante para escalar tu acceso cuando no tienes una buena base de datos de las ubicaciones predeterminadas de configuraciones conocidas, registros u otros archivos importantes. Fue a partir de esta frustración que nació Panoptic. Con la colaboración y la ayuda inestimable de Miroslav Stampar, escribimos una herramienta que busca archivos comúnmente conocidos a través de vulnerabilidades LFI. En este post, voy a demostrar algunas de las características y capacidades de la herramienta Panoptic.

Prerequisitos

Para comenzar tendrá que tener Python 2.6+ (es posible que funcione con versiones anteriores pero no las he probado)

  • Python 2.6+
  • Git (Opcional)

Descarga

El siguiente paso es descargar el proyecto.

Puede clonar Panoptic desde el repositorio hosteado en Github (Recomendado)

git clone https://github.com/lightos/Panoptic.git

o puede bajar el ZIP directamente desde

https://github.com/lightos/Panoptic/archive/master.zip

La razón por la cual se recomienda clonar el proyecto desde el repositorio GIT es porque luego se podrá usar la función –update que hace una petición pull al git.

Corriendo el programa

Para correr Panoptic, simplemente ejecute el script principal panoptic.py.

$ python panoptic.py -h

El menu de ayuda

Figura 1: El menú de ayuda de Panoptic.

En el screenshot se puede observar que Panoptic tiene toda las opciones básicas que uno esperaría encontrar en una herramienta de exploitación web (peticiones GET/POST, soporte para proxies socks 4/5 y HTTP, user-agents para escoger de, habilidad de agregar encabezados personalizados y cookies, etc…). No voy a tocar estos temas porque la mayoría de gente ya los entiende y sabe para que sirven.

Panoptic tiene heurísticas integradas para detectar cuando un archivo es encontrado, sin embargo, en raras ocasiones esto puede fallar. En esta situación, puede utilizar el argumento –bad-string para especificar una cadena a coincidir en la respuesta HTML cuando un archivo no se encuentra. Si Panoptic detecta esta cadena en la respuesta del HTML entonces se sabe que el archivo no fue encontrado.

Todas las rutas de los archivos se encuentran en el archivo cases.xml. Cada ruta de archivo se asocia con un software, una categoría de software, un sistema operativo y una clasificación en función de si el archivo es un registro, archivo de configuración o de otro tipo. Aquí es donde los argumentos –os, –software, –category y –type sirven. Con estos argumentos, se puede filtrar la búsqueda para que busque sólo aquellos archivos específicos.

./panoptic.py –url “http://localhost/lfi.php?file=x” –os “Windows” –software “WAMP” –type “log”

El XML contiene toda las rutas de los archivos.

Figura 2: El XML contiene toda la información de cada archivo.

Si desea ver todas las opciones disponibles, puede usar el argumento –list.

./panoptic.py –list software

Funciones

Panoptic no solo muestra las rutas de los archivos encontrados, también puede guardar los archivos a una carpeta. Con el argumento –write-file, el contenido de cada archivo se guardara en output//.txt, para que no tenga que volver a peticionar el archivo luego para verlo. También corre el output por una función que quita el HTML no deseado.

El argumento –write-file

Figura 3: Una captura de la carpeta output creado por Panoptic con el argumento –write-file usado para guardar todo los archivos encontrados.

Muchas veces la vulnerabilidad LFI se encontrara dentro de carpetas y tendrá una extensión de archivo al final. En este caso se pueden usar los argumentos –prefix, –multiplier y –postfix

Este es un ejemplo clásico de un código PHP vulnerable donde se requiere un nullbyte para terminar el include para ignorar la extension del archivo al final. Con el siguiente comando Panoptic puede lograr esto:

./panoptic.py –url “http://localhost/lfi.php?file=x” –prefix “../” –multiplier 3 –postfix “%00”

Extras

Como algunos de ustedes sabran, bypasear filtros es un pasatiempos mio. Al decir esto, no podía excluir la posibilidad de que una petición fuera bloqueada por algún firewall y no haya manera alrededor de ella. Por esta razon incluyi el argumento –replace-slash. Este argumento reemplaza todo los diagonales en la ruta de archivos por lo que se especifique.

./panoptic.py -u “http://localhost/lfi.php?file=x” –replace-slash “/././”

En el caso de /etc/passwd se convirtiria en /././etc/././passwd. Una exelente herramienta que se puede usar para encontrar bypases de filtros y determinar la profundidad de el LFI es DotDotPwn que viene incluido en Backtrack R2.

Una característica interesante que le hemos incorporado a Panoptic es el análisis y parseo de archivos. Aunque basico por el momento, actualmente puede parsear el archivo de passwd de *NIX para extraer la carpeta de inicio de cada usuario y buscar diferentes combinaciones de archivos comunes dentro de esas carpetas. Algunos de los archivos que busca son:

  • .bash_config
  • .bash_history
  • .bash_logout
  • .ksh_history
  • .Xauthority

Para la lista completa puede consultar el archivo home.txt. Otro archivo que puede parsear es el indice del log binario de MySQL (mysql-bin.index), la cual usa para extraer los logs bianrios. Esta opcion esta activada por defecto y se puede desactivar con el argumento –skip-file-parsing.

Panoptic detecta el archivo passwd y parsea las carpetas de los usuarios para buscar archivos comunes.

Figura 4: Panoptic detecta el archivo passwd y parsea las carpetas de los usuarios para buscar archivos comunes dentro de esas carpetas.

Outro

Más funciones se añadirán una vez tengamos un poco de información de los usuarios y corrijamos posibles errores que puedan existir. Todas las contribuciones siempre son bienvenidas!