¡Hola a todos! Hoy les comentaré sobre Wapiti, una herramienta de línea de comandos (desarrollada en Python) con licencia GPLv2, que nos permite auditar la seguridad de nuestras aplicaciones web. ¿Te interesa? Si es así veamos algunas de sus características.

wapiti_logo

Esta herramienta realiza exploraciones de caja negra, o sea, no “estudia” el código fuente de la aplicación sino que analiza las páginas web de la app desplegada, buscando scripts y formularios donde pueda inyectar datos. Una vez que obtiene esta lista, Wapiti actúa como un fuzzer, inyectando payloads para ver si un script es vulnerable.

Detección de vulnerabilidades

Wapiti puede detectar las siguiente vulnerabilidades:

  • Divulgación de archivos ( include/require, fopen, readfile… locales y remotos ).
  • Inyección de base de datos (inyecciones PHP/JSP/ASP SQL y inyecciones XPath).
  • Inyección XSS (Cross Site Scripting) (reflejada y permanente).
  • Ejecución de comandos (eval(), system(), passtru()…).
  • Inyección CRLF (División de respuesta HTTP, fijación de sesión…).
  • Injección XXE (XmleXternal Entity).
  • Uso de conocidos archivos potencialmente peligrosos (gracias la base de datos de Nikto).
  • Configuraciones de .htaccess débiles que pueden ser anuladas.
  • Presencia de archivos de backup que dan información sensible.

Wapiti soporta ambos métodos GET y POST de HTTP para los ataques. También permite incluir payloads personalizados, mostrar una advertencia cuando se detecta una anomalía (por ejemplo: 500 errors and timeouts) y diferenciar entre una inyección XSS permanente y una reflejada.

Características generales

  • Genera reportes de vulnerabilidades en varios formatos (HTML, XML, JSON, TXT…).
  • Se puede suspender y reanudar una exploración o un ataque.
  • Puede darle colores en la terminal para resaltar las vulnerabilidades.
  • Diferentes niveles de verbosidad.
  • Provee una manera rápida y fácil de activar y/o desactivar los módulos de ataque.
  • La adición de un payload puede ser tan fácil como añadir una línea a un archivo de texto.

Características de navegación

  • Soporta proxies HTTP y HTTPS.
  • Autenticación por varios métodos: Basic, Digest, Kerberos or NTLM.
  • Habilidad para restringir el alcance de una exploración (dominio, carpeta, página web).
  • Eliminación automática de un parámetro en las URLs.
  • Posibilidad de establecer las primeras direcciones URL para explorar (aunque no en su alcance).
  • Puede excluir algunas URLs de las de exploración y ataques.
  • Importación de cookies (obtenerlas con las herramientas wapiti-cookie y wapiti-getcookie).
  • Puede activar y/o desactivar la verificación de certificados SSL.
  • Extrae URLs de archivos Flash SWF.
  • Intenta extraer URLs de javascript (intérprete de JavaScript muy básico).
  • Soporta HTML5 (entiende etiquetas HTML recientes).

Descarga

Puedes descargar directamente desde sourceforge o instalarla desde los repositorios de tu distro favorita (con aptitude install wapiti si es una distro con paquetería .deb).

Uso

El uso de esta herramienta es bastante sencillo. La misma herramienta trae una ayuda donde nos explica como ejecutarlo y cuales son son las opciones que brinda. Basta con ejecutar en consola wapiti y nos saldrá una ayuda similar a esta:

Wapiti-2.3.0 (wapiti.sourceforge.net)
Wapiti-2.3.0 - Web application vulnerability scanner 

 Usage: python wapiti.py http://server.com/base/url/ [options] 

 Supported options are: 
 -s  
 --start  
 	To specify an url to start with. This option can be called several times.
 	Wapiti will browse these links to find more URLs even if the specified link is not in the scope.

 -x  
 --exclude  
 	To exclude an URL from the scan (eg: logout URLs). This option can be called several times to specify several URLs.
 	Wildcards (*) can be used in URLs for basic regex.
 	Example : -x http://server/base/?page=*&module=test
 	or -x http://server/base/admin/* to exclude a directory.

 -p  
 --proxy  
 	To specify a proxy. Currently supported proxies are HTTP and HTTPS.
 	This option can be called twice to specify the HTTP and the HTTPS proxy.
 	Example: -p http://proxy:port/

 -c  
 --cookie  
 	To import cookies to use for the scan. The cookie file must be in JSON format.
 	Cookies can be grabbed using the cookie.py and getcookie.py utilities (net directory).

 -t  
 --timeout  
 	To set the timeout (maximum time in seconds to wait for the server to send a response).

 -a  
 --auth  
 	Set credentials for HTTP authentication.

 --auth-method 
 	If the server requires an authentication, set the authentication method to use.
 	Currently supported methods are (some requires additional modules to install):
 		+ basic
 		+ digest
 		+ kerberos
 		+ ntlm

 -r  
 --remove  
 	Remove a parameter (name and value) from URLs.

 -n  
 --nice  
 	Define a limit of URLs to browse with the same pattern (ie, the maximum number of unique values for the same parameter).
 	Use this option to prevent endless loops during scan. Limit must be greater than 0.

 -m 
 --module 
 	Set the modules (and HTTP methods for each module) to use for attacks.
 	Prefix a module name with a dash to deactivate the related module.
 	To only browse the target (without sending any payloads), deactivate every module with -m "-all".
 	If you don't specify the HTTP methods, GET and POST will be used.
 	Example: -m "-all,xss:get,exec:post"

 -u 
 --color 
 	Use colors to highlight vulnerabilities and anomalies in output. 

 -v  
 --verbose  
 	Set the verbosity level. 
 	0: quiet (default), 1: print each URL, 2: print every attack. 

 -b 
 --scope 
 	Set the scope of the scan:
 		+ page: to analyse only the page given as the root URL.
 		+ folder: to analyse all the URLs under the root URL passed to Wapiti (default).
 		+ domain: to analyse all the links to the pages which are in the same domain as the URL passed to Wapiti.

 -f  
 --format  
 	Set the format type for the report. 
 	json: Report in JSON format 
 	html: Report in HTML format (default)
 	openvas: Report in OpenVAS XML format 
 	txt: Report in plain text (UTF-8) 
 	vulneranet: Report in VulneraNET (XML based) format 
 	xml: Report in XML format 

 -o  
 --output  
 	Set the name of the report file. 
 	If the selected report format is 'html', this parameter will be used as a directory name.

 -i 
 --continue 
 	This parameter indicates to Wapiti to resume the previous scan saved in the
specified XML status file.
 	The file name is optional, if not specified, Wapiti takes the default file from the "scans" folder.

 -k 
 --attack 
 	This parameter indicates to Wapiti to resume the attacks without scanning the website again, loading the scan status from the specified file.
 	The file name is optional, if it is not specified, Wapiti takes the default file from the "scans" folder.

 --verify-ssl <0|1>
 	This parameter indicates whether Wapiti must check SSL certificates.
 	Default is to verify certificates

 -h 
 --help 
 	To print this usage message

Personalmente me gusta ejecutar wapiti url_completa_de_tu_app_con_http_o_https -u -v 2. Al concluir el análisis automáticamente te crea una carpeta con el reporte generado en html.

Conclusiones

Esta herramienta puede ser de mucha utilidad tanto para desarrolladores como para administradores de red pues nos ayuda a detectar vulnerabilidades que muchas veces pasamos por alto y que podrían darnos muchos dolores de cabeza. He usado esta herramienta desde 2009 y se las recomiendo. En algún momento le desarrollé un front-end con PyQt pero por razones ajenas a mi voluntad lo perdí. Pero bueno, hoy por hoy contamos con una comunidad de software libre mucho más fuerte y entusiasta que en 2009 por lo que no pierdo las esperanzas de que haya alguien o algunos que se lancen a esta aventura. ¡Hasta la próxima!

Fuente: wapiti.sourceforge.net.