¿Cómo construir un desafío de pirateo que use XSS?

15

Las conferencias de seguridad a menudo tienen desafíos de piratería. Mis colegas y yo hemos creado un número de estos. Todavía no hemos hecho una que incluya una vulnerabilidad de secuencias de comandos entre sitios.

He visto desafíos que hacen esto. Un enfoque fue que una página determinada (vulnerable a XSS almacenada) fue solicitada por un navegador de forma periódica (cada 10 s, creo). Después de un ataque exitoso, su carga útil se ejecutó en ese navegador y el desafío fue extraer la cookie.

Un problema con este enfoque es que cuando varias personas trabajan simultáneamente en el desafío, interfieren entre sí, y usted puede robar las ideas de otras personas. Una idea alternativa era tener solo XSS reflexivo, y una página en la que pueda enviar un enlace al sitio, que el administrador revisará antes de que se publique.

Una opción interesante es cuánto tiempo debe permanecer abierto el navegador. Si permanece abierto por un tiempo (alrededor de 60), las personas pueden usar herramientas como BeEF, lo que lo hace un poco más fácil. Si solo está abierto para 2s, debes escribir el ataque.

Hay una serie de detalles que afectan qué tan bien funcionará el desafío en la práctica. Preferiría las respuestas de personas con experiencia en la ejecución de desafíos de pirateo XSS que funcionaron bien. Pero en su defecto, me conformaré con una especulación informada.

Si ayuda, solemos asistir a conferencias técnicas en el Reino Unido, por ejemplo. B-Sides Manchester, SteelCon, SecuriTay.

¡Además, cualquier sugerencia sobre cómo defender el navegador de las vulnerabilidades de JavaScript sería bienvenida!

    
pregunta paj28 22.12.2016 - 15:56
fuente

4 respuestas

15

El enfoque más común que he visto es ejecutar un bot browserless que obtiene enlaces vulnerables a través de un sistema de envío. Luego visita cada uno de estos enlaces durante unos segundos con un conjunto de cookies mágicas.

Se puede encontrar un ejemplo en el artículo " Cómo agregar un bot con capacidad XSS a su CTF " donde el bot se implementa como una instancia sin cabeza PhantomJS . Del mismo modo, el hackxor game utiliza HtmlUnit para simular una víctima de navegación y este desafío XSS utiliza una instancia de Zombie.js .

De hecho, hay varias razones para evitar el XSS almacenado: los jugadores no solo aprenderán sobre los métodos de los demás y eventualmente interferirán con sus cargas útiles, sino que la gente podría comenzar a molestar a otros con redirecciones o bucles infinitos que lo mantendrán ocupado limpiando todo.

En su lugar, sugeriría una vulnerabilidad XSS reflejada con un sistema de envío simple donde los jugadores pueden proporcionar enlaces que luego son visitados por el bot. Dependiendo de la situación, el envío podría ubicarse en el contexto de un formulario de contacto, un simple escucha de socket, un mensaje privado de IRC o, si se siente elegante, una cuenta de correo electrónico donde se extraen y visitan los enlaces de los correos electrónicos entrantes.

Definitivamente evitaría un sistema que requiera interacción manual. De lo contrario, la gente preguntará constantemente si sus cargas útiles ya se han ejecutado, si se puede volver a visitar, etc. Dependiendo de qué tan agresivos sean los jugadores, también debe pensar en una forma de enviar el límite de tasa. (Un CAPTCHA para el formulario de contacto encajaría bien con el escenario).

    
respondido por el Arminius 22.12.2016 - 18:08
fuente
3

Recomendaría entornos de contenedores individuales para separar los conflictos entre los participantes.

Para ver un ejemplo: consulte el CTF de una hora de SANS en enlace : el CtF de una hora utiliza Docker y Guacamole para proporcionar un intercambio rápido ambiente de aprendizaje. Guacamole proporciona la interfaz visual (VNC / RDP / SSH) a los contenedores Docker.

Para un método fácil de enseñar vulnerabilidades de secuencias de comandos entre sitios, es posible que desee considerar una simulación educada del ataque con código personalizado. Desde el punto de vista de los atacantes, es legítimo, pero el back-end simula los resultados visuales.

    
respondido por el Kamic 22.12.2016 - 17:55
fuente
1

Es claramente genial reducirlo con un enfoque sistemático de desarrollo de CTF. Esto podría hacerse a través de repositorios de conocimiento que contienen un vector de ataque similar.

Por ejemplo, en su CTF, usted pretende centrarse en code injections , las variantes relacionadas con code injection ataques están absolutamente relacionadas con explotación del script del lado del cliente . Para limitarlo, use la función ingrediente clave de la que se abusa. En este caso particular, en su mayoría JavaScript y es JS Engines son vulnerables. Por lo tanto, su equipo debe ser capaz de recopilar información con respecto a este ejemplo, JS Vuln DB puede buscar sus CVE's + es POC empezar desde!

Tomemos otro escenario. Digamos que debes hacer CTF's para los vectores 'Archivo Incluye', ejemplos como LFI , RFI , SSI , etc. podría utilizar la API proporcionada por cve-search & luego posiblemente mapear todos los CVE hacia abajo para que sea más fácil.

La idea es centralizar & sin embargo, aísla la práctica en el entorno seguro si eres parte del equipo azul. En segundo lugar, sugiero que tal vez, un buen ajuste o una explotación basada en el contexto adicional del búfer podría funcionar después de haber torcido los originales. De ahí es donde empiezas. El primer problema de que le roben ideas de cookies es que puede rectificarlo fácilmente mediante el uso de diferentes espacios de arena paralelos. Supongo que hay proveedores que tienen este tipo de configuración. Consulta CTF365 .

    
respondido por el Shritam Bhowmick 22.12.2016 - 17:53
fuente
0

Si todo lo que necesita es que su servidor visite una url determinada, en lugar de hacer girar los bots y las hebras, etc., la solución más sencilla sería visitar la url inmediatamente (tan pronto como se envíe la url) con una biblioteca. (como solicitudes en python) que permite analizar la respuesta también. Como si un administrador o algún otro bot lo hubiera visitado de verdad, en sus propios navegadores.

ACTUALIZACIÓN:

Aquí sigue una explicación más detallada (según lo solicitado). Tan pronto como se reciba la entrada del usuario (en este caso, por ejemplo, una URL), simplemente pásela a la siguiente función:

def simulate_admin_visits(url):
try:
    #initialise with empty cookies
    jar = requests.cookies.RequestsCookieJar()
    #visit the page that allows the admin to login 
    #and collect the cookies from the response
    response = requests.post(LOGIN_URL, data={'uname': ADMIN_UNAME, 'password': ADMIN_PASSWORD}, cookies=jar)
    jar.update(response.cookies)
    #visit the user-submitted content using the just-collected cookies
    #here the exploit/ctf_challenge-solution is allowed to work
    <parse the submitted content>
    #have the admin logout
    requests.get(LOGOUT_URL, cookies=jar)
except ConnectionError:
    print 'Could not connect to ' + url
    
respondido por el iammyr 07.02.2018 - 14:48
fuente

Lea otras preguntas en las etiquetas