
Escáner de seguridad de aplicaciones web creado por lcamtuf para Google - Espejo no oficial
http://code.google.com/p/skipfish/
Escrito y mantenido por:
Michal Zalewski [email protected] Niels Heinen [email protected] Sebastian Roschke [email protected]
Copyright 2009 - 2012 Google Inc, todos los derechos reservados.
Publicado bajo los términos y condiciones de la Licencia Apache, versión 2.0.
Skipfish es una herramienta activa de reconocimiento de seguridad de aplicaciones web. Prepara un mapa del sitio interactivo para el sitio objetivo realizando un rastreo recursivo y sondeos basados en diccionarios. El mapa resultante se anota con la salida de una serie de comprobaciones de seguridad activas (aunque, con suerte, no disruptivas). El informe final generado por la herramienta está pensado para servir como base para evaluaciones profesionales de seguridad de aplicaciones web.
Existe un buen número de herramientas comerciales y de código abierto con funcionalidad análoga (p. ej., Nikto, Nessus); quédate con la que mejor te convenga. Dicho esto, skipfish intenta abordar algunos de los problemas comunes asociados con los escáneres de seguridad web. Sus ventajas específicas incluyen:
Alto rendimiento: se han observado 500+ peticiones por segundo contra objetivos de Internet receptivos, 2000+ peticiones por segundo en redes LAN / MAN, y 7000+ peticiones contra instancias locales, con una huella muy modesta de CPU, red y memoria. Esto se puede atribuir a:
Modelo de multiplexación de E/S de red y procesamiento de datos de un solo hilo, completamente asíncrono, que elimina las ineficiencias de gestión de memoria, planificación y IPC presentes en algunos clientes multihilo.
Funciones avanzadas de HTTP/1.1 como peticiones de rango, compresión de contenido y conexiones keep-alive, además de la limitación forzada del tamaño de las respuestas, para mantener controlada la sobrecarga a nivel de red.
Caché inteligente de respuestas y heurísticas avanzadas de comportamiento del servidor para minimizar el tráfico innecesario.
Implementación orientada al rendimiento en C puro, incluyendo una pila HTTP personalizada.
Facilidad de uso: skipfish es altamente adaptable y fiable. El escáner incluye:
Reconocimiento heurístico de esquemas oscuros de manejo de parámetros basados en ruta y en consulta.
Manejo elegante de sitios con múltiples frameworks donde ciertas rutas siguen semánticas completamente diferentes, o están sujetas a reglas de filtrado distintas.
Construcción automática de listas de palabras basada en el análisis del contenido del sitio.
Funciones de escaneo probabilístico para permitir evaluaciones periódicas, limitadas en el tiempo, de sitios arbitrariamente complejos.
Comprobaciones de seguridad bien diseñadas: la herramienta pretende ofrecer resultados precisos y significativos:
Diccionarios artesanales que ofrecen una excelente cobertura y permiten probar $keyword.$extension a fondo en un plazo razonable.
Se prefieren sondeos diferenciales de tres pasos a la comprobación por firmas para detectar vulnerabilidades.
Se utiliza lógica al estilo de ratproxy para detectar problemas de seguridad sutiles: cross-site request forgery, inclusión de scripts entre sitios, contenido mixto, problemas de MIME y charset, directivas de caché incorrectas, etc.
Las comprobaciones de seguridad incluidas están diseñadas para manejar escenarios complejos: XSS almacenado (ruta, parámetros, cabeceras), inyección SQL o XML ciega, o inyección de shell ciega.
Firmas de contenido al estilo de Snort que resaltan errores de servidor, fugas de información o aplicaciones web potencialmente peligrosas.
El postprocesado del informe reduce drásticamente el ruido causado por los falsos positivos restantes o los trucos del servidor mediante la identificación de patrones repetitivos.
Dicho esto, skipfish no es una bala de plata y puede no ser adecuado para ciertos fines. Por ejemplo, no cumple la mayoría de los requisitos descritos en los Criterios de Evaluación de Escáneres de Seguridad de Aplicaciones Web de WASC (algunos a propósito, otros por necesidad); y, a diferencia de la mayoría de los proyectos de este tipo, no incluye una extensa base de datos de vulnerabilidades conocidas para comprobaciones de tipo banner.
A continuación se esboza una lista aproximada de las comprobaciones de seguridad que ofrece la herramienta.
Fallos de alto riesgo (que pueden conducir al compromiso del sistema):
Fallos de riesgo medio (que pueden conducir al compromiso de datos):
Problemas de bajo riesgo (impacto limitado o baja especificidad):
Además de una lista de problemas identificados, skipfish también ofrece resúmenes generales de los tipos de documentos y de problemas encontrados; y un mapa del sitio interactivo, con los nodos descubiertos mediante fuerza bruta señalados de forma distintiva.
NOTA: Como decisión de diseño consciente, skipfish no se quejará de forma redundante sobre problemas muy inespecíficos, incluyendo, entre otros:
La mayoría de estos aspectos son fáciles de inspeccionar en un informe si se desea; por ejemplo, todos los formularios HTML se enumeran por separado, al igual que las nuevas cookies o las cabeceras HTTP interesantes, y se espera que el auditor pueda optar por hacer ciertas recomendaciones de diseño basadas en estos datos cuando corresponda. Dicho esto, estas ocurrencias no se destacan como un fallo de seguridad específico.
Ante todo, por favor, no seas malvado. Usa skipfish únicamente contra servicios que te pertenezcan o para los que tengas permiso de prueba.
Ten en cuenta que todos los tipos de pruebas de seguridad pueden ser disruptivos. Aunque el escáner está diseñado para no llevar a cabo ataques maliciosos, podría interferir accidentalmente con el funcionamiento del sitio. Debes aceptar el riesgo y planificar en consecuencia. Ejecuta el escáner contra instancias de prueba cuando sea posible y prepárate para asumir las consecuencias si algo sale mal.
Ten en cuenta también que la herramienta está pensada para profesionales de la seguridad y es de naturaleza experimental. Puede devolver falsos positivos u omitir problemas de seguridad evidentes; e incluso cuando funciona perfectamente, no está pensada para ser una aplicación de apuntar y hacer clic. No tomes su salida al pie de la letra.
Ejecutar la herramienta contra sitios demo proporcionados por los proveedores no es una buena forma de evaluarla, ya que suelen aproximar las vulnerabilidades de manera muy imperfecta; no hemos hecho ningún esfuerzo por adaptarnos a estos casos.
Por último, el escáner simplemente no está diseñado para tratar con servidores HTTP maliciosos o que se comportan mal, y no ofrece garantías de un comportamiento seguro (o sensato) en esos casos.
Para compilarlo, simplemente descomprime el archivo y prueba con make. Lo más probable es que necesites instalar libidn primero.
A continuación, debes leer las instrucciones proporcionadas en doc/dictionaries.txt para seleccionar el archivo de diccionario adecuado y configurarlo correctamente. Este paso tiene un impacto profundo en la calidad de los resultados del escaneo posterior, así que no lo omitas.
Una vez que hayas seleccionado el diccionario, puedes usar -S para cargarlo y -W para especificar un archivo inicialmente vacío para las palabras clave específicas del sitio que se aprendan (que te resultarán útiles en evaluaciones futuras):
$ touch new_dict.wl
$ ./skipfish -o output_dir -S existing_dictionary.wl -W new_dict.wl
http://www.example.com/some/starting/path.txt
Puedes usar -W- si no quieres almacenar en ningún sitio las palabras clave aprendidas automáticamente.
Ten en cuenta que puedes proporcionar más de una URL inicial si lo deseas; todas serán rastreadas. También es posible leer URLs desde un archivo, utilizando la siguiente sintaxis:
$ ./skipfish [...other options...] @../path/to/url_list.txt
La herramienta mostrará algunas estadísticas útiles mientras el escaneo está en curso. También puedes cambiar a una lista de solicitudes HTTP en curso pulsando la tecla Intro.
En el ejemplo anterior, skipfish escaneará todo www.example.com (incluidos los servicios en otros puertos, si están enlazados desde la página principal) y escribirá un informe en output_dir/index.html. Puedes ver este informe con tu navegador favorito (debe estar habilitado JavaScript; y debido a las mejoras de seguridad recientes de file:/// en ciertos navegadores, puede que necesites acceder a los resultados a través de HTTP). El archivo index.html es estático; los resultados reales se almacenan como una jerarquía de archivos JSON, adecuados para el procesamiento automático o para diferentes frontends de presentación si es necesario. Además, una lista de todas las URLs descubiertas se guardará en un único archivo, pivots.txt, para facilitar el postprocesado.
Un sencillo script complementario, sfscandiff, se puede utilizar para calcular un delta entre dos escaneos ejecutados contra el mismo objetivo con las mismas opciones. El informe más reciente se anota de forma no destructiva añadiendo un fondo rojo a todos los nodos nuevos o modificados, y un fondo azul a todos los problemas nuevos o modificados encontrados.
Algunos sitios pueden requerir autenticación; nuestro soporte para ello se describe en doc/authentication.txt. En la mayoría de los casos, querrás usar el método de autenticación por formulario, que es capaz de detectar sesiones rotas para reautenticarse.
Una vez autenticado, ciertas URLs del sitio pueden cerrar tu sesión; puedes combatir esto de dos maneras: usando la opción -N, que hace que el escáner rechace intentos de establecer o eliminar cookies; o con el parámetro -X, que impide que se obtengan las URLs que coincidan:
$ ./skipfish -X /logout/logout.aspx ...other parameters...
La opción -X también es útil para acelerar tus escaneos excluyendo /icons/, /doc/, /manuals/ y otras ubicaciones estándar y mundanas de este tipo. En general, puedes usar -X e -I (solo rastrear URLs que coincidan con una subcadena) para limitar el alcance de un escaneo como quieras, incluso restringirlo a un protocolo y puerto específicos:
$ ./skipfish -I http://example.com:1234/ ...other parameters...
Una función relacionada, -K, te permite especificar nombres de parámetros que no se deben fuzzear (útil para aplicaciones que ponen IDs de sesión en la URL, para minimizar el ruido).
Otra opción de alcance útil es -D, que te permite especificar hosts o dominios adicionales a considerar dentro del alcance de la prueba. De forma predeterminada, todos los hosts que aparecen en las URLs de la línea de comandos se añaden a la lista, pero puedes usar -D para ampliar estas reglas, por ejemplo:
$ ./skipfish -D test2.example.com -o output-dir http://test1.example.com/
...o, para una coincidencia de comodín de dominio, usa:
$ ./skipfish -D .example.com -o output-dir http://test1.example.com/
En algunos casos, no quieres rastrear realmente un dominio de terceros, pero confías lo suficiente en su propietario como para no preocuparte por la inclusión de contenido entre dominios desde esa ubicación. Para suprimir las advertencias, puedes usar la opción -B, por ejemplo:
$ ./skipfish -B .google-analytics.com -B .googleapis.com ...other parameters...
De forma predeterminada, skipfish envía cabeceras HTTP minimalistas para reducir la cantidad de datos intercambiados por la red; sin embargo, algunos sitios examinan las cadenas User-Agent o el orden de las cabeceras para rechazar clientes no compatibles. En tal caso, puedes usar -b ie, -b ffox o -b phone para imitar uno de los dos navegadores populares (o iPhone).
En cuanto a la personalización de tus solicitudes HTTP, también puedes usar la opción -H para insertar cabeceras adicionales no estándar; o -F para definir una asignación personalizada entre un host y una IP (omitiendo el resolvedor). Esta última función es particularmente útil para servicios aún no lanzados o heredados.
Algunos sitios pueden ser demasiado grandes para escanearlos en un plazo razonable. Si el sitio presenta tarpits bien definidos (por ejemplo, 100.000 perfiles de usuario casi idénticos como parte de una red social), estas ubicaciones específicas pueden excluirse con -X o -S. En otros casos, puede que necesites recurrir a otros ajustes: -d limita la profundidad del rastreo a un número especificado de subdirectorios; -c limita el número de hijos por directorio; -x limita el número total de descendientes por rama del árbol de rastreo; y -r limita el número total de solicitudes a enviar en un escaneo.
Existe una opción interesante para evaluaciones repetidas: -p. Al especificar un porcentaje entre 1 y 100%, es posible indicar al rastreador que siga menos del 100% de todos los enlaces y que pruebe menos del 100% de todas las entradas del diccionario. Esto, naturalmente, limita la exhaustividad de un escaneo, pero a diferencia de la mayoría de los otros ajustes, lo hace de forma equilibrada y no determinista. Es extremadamente útil cuando estás configurando evaluaciones periódicas de tu infraestructura con límite de tiempo. Otra opción relacionada es -q, que establece la semilla aleatoria inicial del rastreador a un valor especificado. Esto se puede usar para reproducir exactamente un escaneo anterior y comparar resultados. La aleatoriedad se usa principalmente en el modo -p, pero también para tomar otras decisiones de gestión del escaneo en otros lugares.
Algunos servicios particularmente complejos (o rotos) pueden implicar un número muy elevado de páginas idénticas o casi idénticas. Aunque estas ocurrencias se atenúan por defecto en el informe, siguen ocupando espacio en pantalla y tardan un tiempo en procesarse a nivel de JavaScript. En casos tan extremos, puedes usar la opción -Q para suprimir por completo el informe de nodos duplicados, antes de que se escriba el informe. Esto puede darte una comprensión menos completa de cómo está organizado el sitio, pero no tiene impacto en la cobertura de las pruebas.
En ciertas evaluaciones rápidas, puede que tampoco te interese prestar atención a la funcionalidad deseada del sitio, con la esperanza de explorar únicamente secretos no enlazados. En tal caso, puedes especificar -P para inhibir todo el análisis HTML. Esto limita la cobertura y elimina la capacidad del escáner de aprender nuevas palabras clave examinando el HTML, pero acelera drásticamente la prueba. Otra opción igualmente limitante que reduce el riesgo de efectos persistentes de un escaneo es -O, que inhibe todos los pasos de análisis y envío de formularios.
Algunos sitios que manejan datos sensibles de usuarios se preocupan por SSL y por hacerlo bien. Skipfish puede ayudarte opcionalmente a detectar escenarios problemáticos de contenido mixto o de envío de contraseñas: usa la opción -M para habilitarlo. El escáner se quejará de situaciones como scripts http:// cargados en páginas https://, pero ignorará escenarios sin riesgo, como imágenes.
Del mismo modo, ciertos sitios meticulosos pueden preocuparse por los casos en los que el almacenamiento en caché está restringido a nivel de HTTP/1.1, pero no se proporciona una directiva explícita de caché HTTP/1.0; al especificar -E en la línea de comandos, skipfish registra cuidadosamente todos esos casos.
En algunas ocasiones, querrás limitar las peticiones por segundo para reducir la carga en el servidor del objetivo (o posiblemente eludir la protección DoS). La opción -l se puede usar para establecer este límite, y el valor indicado es la cantidad máxima de peticiones por segundo que quieres que realice skipfish.
Los escaneos normalmente no deberían llevar semanas. En muchos casos, probablemente quieras limitar la duración del escaneo para que se ajuste a una ventana de tiempo determinada. Esto se puede hacer con la opción -k, que permite especificar la cantidad de horas, minutos y segundos en un formato H:M:S. El uso de esta opción puede afectar la cobertura del escaneo si el tiempo de espera se agota antes de probar todas las páginas.
Por último, en algunas evaluaciones que involucran sitios autónomos sin contenido de usuario extenso, el auditor puede preocuparse por cualquier correo electrónico o enlace HTTP externo visto, incluso si no tienen un impacto de seguridad inmediato. Usa la opción -U para que se registren.
La gestión de diccionarios es un tema especial y, como se mencionó, se trata con más detalle en doc/dictionaries.txt. Por favor, lee ese archivo antes de continuar. Algunas de las opciones relevantes incluyen -S y -W (ya cubiertas), -L para suprimir el aprendizaje automático, -G para limitar el tamaño del tarro de adivinación de palabras clave, -R para descartar entradas antiguas del diccionario e -Y para inhibir el costoso fuzzing de $keyword.$extension.
Skipfish también incluye un mecanismo de autocompletado de formularios para maximizar la cobertura del escaneo. Los valores deben ser no maliciosos, ya que no están pensados para implementar comprobaciones de seguridad, sino para superar la lógica de validación de entrada. Puedes definir reglas adicionales o sobrescribir las existentes con la opción -T (-T form_field_name=field_value, p. ej., -T login=test123 -T password=test321; aunque ten en cuenta que -C y -A son un método mucho mejor para iniciar sesión).También hay un puñado de opciones relacionadas con el rendimiento. Usa -g para establecer el número máximo de conexiones que se mantendrán, globalmente, hacia todos los objetivos (es sensato mantenerlo por debajo de 50 aproximadamente para evitar saturar la pila TCP/IP de tu sistema o de los dispositivos NAT / cortafuegos cercanos); y -m para establecer el límite por IP (experimenta un poco: 2-4 suele ser bueno para localhost, 4-8 para redes locales, 10-20 para objetivos externos, 30+ para hosts realmente lentos o que no mantienen la conexión activa). También puedes usar -w para establecer el tiempo de espera de E/S (es decir, skipfish esperará solo durante un tiempo limitado por cada lectura o escritura individual), y -t para establecer el tiempo de espera total de la solicitud, para tener en cuenta sitios realmente lentos o realmente rápidos.
Por último, -f controla el número máximo de errores HTTP consecutivos que estás dispuesto a tolerar antes de abortar el escaneo; y -s establece la longitud máxima de una respuesta a obtener y analizar (las respuestas más largas se truncarán).
Al escanear sitios grandes y con mucho contenido multimedia, puede que también quieras especificar -e. Esto evita que los documentos binarios se mantengan en memoria con fines de generación de informes, y libera una gran cantidad de RAM.
Se puede limitar aún más la velocidad mediante herramientas de modo usuario de terceros, como trickle, o mediante el modelado de tráfico a nivel de kernel.
Ah, y las estadísticas del escaneo en tiempo real se pueden suprimir con -u.
Un escaneo estándar y autenticado de un sitio bien diseñado y autocontenido (advierte sobre todos los enlaces externos, correos electrónicos, contenido mixto y problemas de cabeceras de caché), incluida una fuerza bruta suave:
$ touch new_dict.wl
$ ./skipfish -MEU -S dictionaries/minimal.wl -W new_dict.wl
-C "AuthCookie=value" -X /logout.aspx -o output_dir
http://www.example.com/
Rastreo de cinco conexiones, pero sin fuerza bruta; simulando ser MSIE y confiando en el contenido de example.com:
$ ./skipfish -m 5 -L -W- -o output_dir -b ie -B example.com
http://www.example.com/
Solo fuerza bruta intensiva (sin extracción de enlaces HTML), limitada a un único directorio y con un tiempo de espera de 5 segundos:
$ touch new_dict.wl
$ ./skipfish -S dictionaries/complete.wl -W new_dict.wl
-P -I http://www.example.com/dir1/ -o output_dir -t 5 -I
http://www.example.com/dir1/
Para obtener una breve lista de todas las opciones de línea de comandos, prueba ./skipfish -h.
La mayoría de los problemas notificados por skipfish deberían ser autoexplicativos, siempre que tengas una buena comprensión de los fundamentos de la seguridad web. Si necesitas un repaso rápido sobre algunos de los temas más complicados, como el MIME sniffing, puede que te resulte útil nuestro completo Browser Security Handbook como punto de partida:
http://code.google.com/p/browsersec/
Si todavía necesitas ayuda, hay varias organizaciones que realizan un esfuerzo considerable para documentar y explicar muchas de las amenazas comunes a la seguridad web, y para aconsejar al público sobre cómo abordarlas. Te animo a que consultes los materiales publicados por OWASP y el Web Application Security Consortium, entre otros:
Aunque estaré encantado de diagnosticar problemas con el propio escáner, lamentablemente no puedo ofrecer ninguna ayuda con el funcionamiento interno de aplicaciones web de terceros.
A continuación se muestra una lista de características que actualmente faltan en skipfish. Si deseas mejorar la herramienta contribuyendo con código en alguna de estas áreas, por favor házmelo saber:
Comprobaciones de desbordamiento de búfer: tras considerarlo detenidamente, sospecho que no hay una forma fiable de probar los desbordamientos de búfer de forma remota. Al igual que la condición de fallo real que buscamos, las comprobaciones adecuadas del tamaño del búfer también pueden dar lugar a excepciones no capturadas, mensajes 500, etc. Aunque me encantaría que se demostrara que estoy equivocado.
Detección completa de XSS en JavaScript: hay varias comprobaciones rudimentarias en el código, pero no hay un motor de scripts adecuado para evaluar expresiones y el acceso al DOM integrado.
Errores de consumo de caracteres / inyección de codificación de longitud variable: estos problemas parecen estar en gran medida resueltos a nivel de navegador en este momento, por lo que tenían una prioridad mucho menor en el momento de escribir esto.
Comprobaciones de seguridad y extracción de enlaces para contenido de terceros basado en plugins (Flash, Java, PDF, etc.).
Sondeos de fuerza bruta de contraseñas y de fuerza bruta de nombres de archivo numéricos.
Integración con motores de búsqueda (vhosts, rutas iniciales).
Decodificación de VIEWSTATE.
Autenticación NTLM y digest.
Pruebas PHP más específicas (inyección en eval, RFI).
Soporte de proxy: hay un soporte experimental de proxy HTTP disponible a través de una directiva #define en config.h. Añadir soporte para el proxy HTTPS es más complicado y sigue en desarrollo.
Opción de reanudar el escaneo, mejor información de tiempo de ejecución.
Soporte de instalación independiente (make install).
Interfaz web de programación y gestión.
No hay rastreador web tan bueno que no exista un framework web que, algún día, lo haga arder. Si te encuentras con lo que parece ser un mal comportamiento (por ejemplo, un escaneo que tarda una eternidad y genera demasiadas solicitudes, nodos completamente erróneos en la salida del escaneo o caídas totales), consulta primero nuestra página de problemas conocidos:
http://code.google.com/p/skipfish/wiki/KnownIssues
Si no encuentras una respuesta satisfactoria allí, recompila el escáner con:
$ make clean debug
...y vuelve a ejecutarlo de esta manera:
$ ./skipfish [...previous options...] 2>logfile.txt
A continuación, puedes inspeccionar logfile.txt para hacerte una idea de lo que salió mal; si parece un problema del escáner, elimina cualquier información sensible del archivo de registro y envíalo al autor.
Si el escáner se bloqueó, recompílalo como se indicó anteriormente y luego escribe:
$ ulimit -c unlimited $ ./skipfish [...previous options...] 2>logfile.txt $ gdb --batch -ex back ./skipfish core
...y asegúrate de enviar también al autor la salida de ese último comando.
Skipfish es posible gracias a las contribuciones y los valiosos comentarios del equipo de ingeniería de seguridad de la información de Google.
Si tienes informes de errores, preguntas, sugerencias o inquietudes sobre la aplicación, puedes ponerte en contacto con el autor principal en [email protected].
Advertencias internas:
Entradas informativas no específicas: