A principios de diciembre, celebramos una competencia de equipo en seguridad de la información. Además de OTUS , los organizadores del evento para los "hackers blancos" fueron Volga CTF y CTF.Moscow . Quizás ha llegado el momento de resumir y hablar en detalle sobre las tareas. En primer lugar, el evento tuvo éxito:- Se prepararon 9 tareas en tres áreas: Pentest, Ingeniería inversa, Seguridad de Linux y Desarrollo seguro;
- Participaron 217 equipos;
- Se registraron más de 800 intentos de pasar banderas;
- Se registraron más de 300 banderas aprobadas.
En segundo lugar , las tareas eran diferentes en complejidad, por lo que no todos podían resolver el problema:
En tercer lugar , inmediatamente después de la finalización del maratón en línea, realizamos
tres seminarios web donde hablamos sobre los ganadores, dimos las respuestas correctas y anunciamos los resultados finales:
- Resultados del CTF: "Seguridad de Linux y desarrollo seguro";
- Resultados del CTF: Pentest;
- los resultados de CTF: "ingeniería inversa".
En cuarto lugar , le ofrecemos las
condiciones de las tareas y descripciones textuales de sus soluciones . Tenga en cuenta que algunas tareas incluyen archivos.
Dirección 1: Pentest
Tarea 1 - Bases de datos100
El sitio usa activamente bases de datos. Intenta hacer inyecciones SQL.
Enlace al sitio: http://193.41.142.9:8001/shop/login
Solución:Vamos a la sección principal de la tienda / tienda / productos /, después de atascarnos en el campo de búsqueda, encontramos inyección SQL.
Ingrese 1 "O" 1 "=" 1 "-, desplácese hacia abajo y vea un producto que faltaba anteriormente, la bandera está en su descripción.
Bandera: bandera {5ql_1nject10n_15_t00_51mpl3_f0r_y0u}Tarea 2 - Cookies150
Mi amigo desarrolló una plataforma de tienda en línea. Pidió una prueba de blackbox. Verifique la seguridad de las cookies, puede obtener derechos de administrador.
Enlace al sitio: http://193.41.142.9:8001/shop/login
Solución:Inicie sesión, mire las cookies y vea las cookies secretas:
«MTExMTAxMSAxMDAwMTAgMTExMDEwMSAxMTEwMDExIDExMDAxMDEgMTExMDAxMCAxMTAxMTEwIDExMDAwMDEgMTEwMTEwMSAxMTAwMTAxIDEwMDAxMCAxMTEwMTAgMTAwMDEwIDExMTAxMDEgMTExMDAxMSAxMTAwMTAxIDExMTAwMTAgMTAwMDEwIDEwMTEwMCAxMDAwMDAgMTAwMDEwIDExMDEwMDEgMTExMDAxMSAxMDExMTExIDExMDAwMDEgMTEwMDEwMCAxMTAxMTAxIDExMDEwMDEgMTEwMTExMCAxMDAwMTAgMTExMDEwIDEwMDAxMCAxMDAwMTEwIDExMDAwMDEgMTEwMTEwMCAxMTEwMDExIDExMDAxMDEgMTAwMDEwIDExMTExMDE =»
Decodificar base 64, se obtienen los datos binarios: 100010 1110101 1110011 1111011 1100101 1110010 1101110 1100001 1101101 1100101 100010 111010 100010 1110101 1110011 1100101 1110010 100010 101100 100000 100010 1101001 1110011 1011111 1100001 1100100 1101101 1101001 1101110 100010 111010 100010 1000110 1100001 1101100 1110011 1100101 100010 1111101
{"username":"user", "is_admin":"False"}
a texto y obtenemos:
{"username":"user", "is_admin":"False"}
, cambiamos False a True y lo decodificamos de nuevo:
01111011 00100010 01110101 01110011 01100101 01110010 01101110 01100001 01101101 01100101 00100010 00111010 00100010 01110101 01110011 01100101 01110010 00100010 00101100 00100000 00100010 01101001 01110011 01011111 01100001 01100100 01101101 01101001 01101110 00100010 00111010 00100010 01010100 01110010 01110101 01100101 00100010 01111101
«MDExMTEwMTEgMDAxMDAwMTAgMDExMTAxMDEgMDExMTAwMTEgMDExMDAxMDEgMDExMTAwMTAgMDExMDExMTAgMDExMDAwMDEgMDExMDExMDEgMDExMDAxMDEgMDAxMDAwMTAgMDAxMTEwMTAgMDAxMDAwMTAgMDExMTAxMDEgMDExMTAwMTEgMDExMDAxMDEgMDExMTAwMTAgMDAxMDAwMTAgMDAxMDExMDAgMDAxMDAwMDAgMDAxMDAwMTAgMDExMDEwMDEgMDExMTAwMTEgMDEwMTExMTEgMDExMDAwMDEgMDExMDAxMDAgMDExMDExMDEgMDExMDEwMDEgMDExMDExMTAgMDAxMDAwMTAgMDAxMTEwMTAgMDAxMDAwMTAgMDEwMTAxMDAgMDExMTAwMTAgMDExMTAxMDEgMDExMDAxMDEgMDAxMDAwMTAgMDExMTExMDE =»
Cambie el valor de las cookies a una nueva y vaya al perfil del usuario.
Bandera: bandera {d0_y0u_l1k3_c00k13s}Tarea 3: lectura de archivos200
A menudo encontramos fuentes con fugas y una extraña lógica de trabajo. Los posibles vectores de ataque generalmente se encuentran por fuzzing. Te sugiero que hagas esto.
Enlace al sitio: http://193.41.142.9:8001/shop/login
Solución:Comenzamos dirb (habitual common.txt es suficiente), encontramos páginas
/shop/_source/
y
/shop/files/
.
Habiendo familiarizado con la fuente
_source
entendemos que tenemos la vulnerabilidad de Recorrido de ruta + algunos filtros simples.
Para obtener el indicador, debe realizar una solicitud POST a
/shop/files/
con el parámetro "archivo", cuyo valor debe ser
%2E%2E/%2E%2E/flag
.
En respuesta a la solicitud, habrá una bandera.
Bandera: bandera {y0u_g0t_0ur_s3cr3t}Dirección 2: "Seguridad de Linux y desarrollo seguro"
Tarea 1 - VCS50
¿Pero el cliente nos dio algo superfluo?
El archivo contiene el código fuente de parte del sitio.
Enlace al sitio: http://193.41.142.9:8002/
Adjunto: tarea.7zSolución:Tenemos acceso al código fuente. Al final resultó que, los desarrolladores también pusieron un repositorio git. Observamos git log, vemos commit con arreglos. Usamos git show <hash commit>, vemos los archivos modificados y su contenido, una bandera se almacena en una de las líneas.
bandera {22717297f6a3603608d260c9e5f69e0a}Tarea 2 - Algo50
Tenemos un nuevo reto. Realice un control de desarrollo seguro. El cliente proporcionó un archivo con la parte abierta del sitio que se está desarrollando. Para probar su algoritmo hash, proporcionó un hash: 666c61677b32646733326473323334327d. Verifique el algoritmo para la posibilidad de transformación inversa.
El archivo contiene el código fuente de parte del sitio.
Enlace al sitio: http://193.41.142.9:8002/
Adjunto: tarea.7zSolución:El código fuente tiene un algoritmo de hash de contraseña. En realidad, este no es un algoritmo hash, sino que simplemente convierte datos de un formato de cadena a hexadecimal.
Usamos Python:
import binascii binascii.unhexlify("666c61677b32646733326473323334327d")
Obtenemos
la bandera:
bandera {2dg32ds2342}Tarea 3 - Archivos archivos archivos150
Terminemos la auditoría. ¿Ves también esta vulnerabilidad? Genial Entonces, obtener un archivo secreto es fácil para usted.
El archivo contiene el código fuente de parte del sitio.
Enlace al sitio: http://193.41.142.9:8002/
Adjunto: tarea.7zSolución:En el código fuente del módulo principal del programa, puede ver el lector de archivos (esta es la aplicación principal de este servicio). La función para verificar la existencia de un archivo no busca caracteres especiales de ninguna manera y simplemente concatena dos líneas => vulnerabilidad de recorrido de ruta.
También en Dockerfile, docker-compose.yml, puede ver las asignaciones de archivos y la estructura de carga en el contenedor. Usando este conocimiento, generamos una carga útil:
http://193.41.142.9:8002/files?password=qgzc6!78zxcbkj123fdgd234&filename=../../../../../../src/secret_files/flag.txt
flag {a0a7c3fff21f2aea3cfa1d0316dd816c}
Dirección 3: "ingeniería inversa"
Tarea 1 - Serpiente100
Nuestra compañía siempre está tratando de eludir cualquier protección de software. Ayúdanos a lidiar con Python esta vez.
Archivo adjunto: task.pycSolución:Usamos el código de bytes de Python descompilado por el módulo Unpypy6:
descompyle6 task.pyc.
Descompilamos, obtenemos una bandera:
bandera {w3l1_pyth0n}
Tarea 2 - Robot150
Esta vez nos encontramos con una aplicación extraña, ayúdame a encontrar la contraseña para ingresar.
Adjunto: app.apkSolución:La aplicación está en Android, así que cárguela en un analizador estático como BytecodeViewer y vea el código fuente restaurado del programa. Tenga en cuenta que esto es Kotiln, y a menudo utiliza programación funcional, como en este caso. En una de las funciones anónimas descompiladas, encontramos la marca de verificación, la verificación en sí:
(String)paramFunction1.invoke(Boolean.valueOf(Arrays.equals(paramString, h))); invoke: ((StringBuilder)localObject).append("flag{"); ((StringBuilder)localObject).append(this.$m); ((StringBuilder)localObject).append('}');
variable h: {102, 97, 50, 98, 102, 54, 52, 54, 101, 52, 57, 97, 98, 53, 101, 53, 54, 102, 50, 98, 55, 52, 52, 56, 48, 98, 97, 54, 49, 48, 49, 55};
Vemos que parece caracteres impresos codificados. Usamos Python:
'' .join (chr (x) para x en [102, 97, 50, 98, 102, 54, 52, 54, 101, 52, 57, 97, 98, 53, 101, 53, 54, 102, 50 , 98, 55, 52, 52, 56, 48, 98, 97, 54, 49, 48, 49, 55])
Obtenemos la bandera:
bandera {fa2bf646e49ab5e56f2b74480ba61017}
Misión 3 - Bin200
Esta vez nos encontramos con un archivo binario. La tarea es la misma, obtener la contraseña secreta.
Adjunto: tareaSolución:Se da un archivo binario. Cargamos en el desensamblador y vemos seis funciones de validación escritas en C ++.
Se ejecutan de forma idéntica y se llaman entre sí, verificando la bandera en partes de 5 elementos.
Lo restauramos por etapas utilizando información del desensamblador. Obtenemos la bandera en partes:
0) verificación de longitud
1) bandera {
2) tarifafa
3) _172a
4) k14sc
5) _eee}
Combina y obtén la bandera:
bandera {feefa_172ak14sc_eee}¡Eso es todo, colegas! ¡Gracias a todos por participar, cuídate a ti mismo, a tus seres queridos y a tus datos! Feliz año nuevo