Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Mariano Palomo - Taller de reversing en sistemas Windows aplicado a CTFs [rooted2019]

305 views

Published on

Mariano Palomo - Taller de reversing en sistemas Windows aplicado a CTFs [rooted2019]

Published in: Technology
  • Be the first to comment

Mariano Palomo - Taller de reversing en sistemas Windows aplicado a CTFs [rooted2019]

  1. 1. Taller de reversing en sistemas Windows aplicado a CTFs Rooted-Con 2019
  2. 2. Who Am I @voidm4p voidm4p@protonmail.com https://voidm4p.me • Mariano Palomo • Graduado en Ingeniería Informática por la UGR • Malware Analyst en Entelgy InnoTec Security • Con interés en reversing, análisis de malware y no tan análisis...
  3. 3. Laboratorio de reversing/análisis de malware Host Guest VM Host-Only BURP Transparent Proxy iptables dnsmasq iptables -t nat -A PREROUTING -i vmnet1 -p tcp -m tcp -m multiport ! --dports 53,8000 -j REDIRECT --to-port 8080 iptables -t nat -A PREROUTING -i vmnet1 -p udp -m udp -m multiport ! --dports 53,8000 -j REDIRECT --to-port 8080 iptables -A FORWARD -i vmnet1 -j ACCEPT iptables -A FORWARD -i enp3s0 -j ACCEPT bogus-priv dhcp-option=option:dns-server,172.16.125.1 dhcp-option=option:router,172.16.125.1 dhcp-range=172.16.125.50,172.16.125.150,12h domain-needed interface=vmnet1 no-poll server=8.8.4.4 server=8.8.8.8
  4. 4. Hardening • Instrucción CPUID y clon de BIOS: fichero .vmx • Direcciones MAC • Registros, tamaño disco duro, número de procesadores, etc. cpuid.1.ecx="0---:----:----:----:----:----:----:----" SMBIOS.reflectHost = TRUE
  5. 5. Hardening https://github.com/a0rtega/pafish https://github.com/LordNoteworthy/al-khaser
  6. 6. Herramientas • Reversing • Editores Hexadecimales
  7. 7. Herramientas • PE Tools • Debuggers VBScript y JScript
  8. 8. Herramientas • Monitorización SSOO • MS Office
  9. 9. ATENEA • Plataforma de desafíos de seguridad informática • Compuesta por diferentes retos • Criptografía y Esteganografía • Exploiting • Forense • Networking • Reversing https://atenea.ccn-cert.cni.es
  10. 10. ATENEA ESCUELA • Plataforma básica de desafíos de seguridad informática • Fomentar el aprendizaje de los usuarios menos entendidos en el campo de la seguridad. https://atenea.ccn-cert.cni.es/escuela/home
  11. 11. Reversing: ¿por donde empezar? • Arquitectura de computadores • Ensamblador sintaxis Intel x86 • Formato Portable Executable (PE) • Desensamblador/Decompilador • Código ensamblador • Depurador • Programación: C/C++, Delphi, .NET, Python, … • Microsoft Developer Network (MSDN) • Unpacking
  12. 12. Retos ATENEA
  13. 13. Crackme! If you can… • El objetivo principal del crackme es obtener determinada clave codificada embebida dentro del binario. • Dicha clave podrá visualizarse en claro cuando se ejecute el mismo de la manera adecuada. 8fd4bfa088881776a16b1155e7639bbe
  14. 14. Crackme! If you can… $ file Crypt0-8fd4bfa088881776a16b1155e7639bbe.exe Crypt0-8fd4bfa088881776a16b1155e7639bbe.exe: PE32 executable (console) Intel 80386, for MS Windows • DETECT IT EASY (DIE) • Compilador: Visual C/C++ • No parece estar empaquetado
  15. 15. Crackme! If you can… • Análisis estático para entender el flujo del programa • Partimos del Entry Point • Este no es el “Main” que ha creado el programador, hay código que ha insertado el compilador.
  16. 16. Crackme! If you can… • Pseudocódigo C de la función main generado por el decompilador • param_1 > 2: hay que pasarle al menos dos parámetros al programa • FUN_0040100 tiene que devolver != 0
  17. 17. Crackme! If you can… • FUN_0040100 • Comprobación de procesos en ejecución con blacklist https://docs.microsoft.com/en-us/windows/desktop/api/tlhelp32/nf-tlhelp32-createtoolhelp32snapshot https://docs.microsoft.com/en-us/windows/desktop/api/tlhelp32/nf-tlhelp32-process32first - https://docs.microsoft.com/es-es/windows/desktop/api/tlhelp32/nf-tlhelp32-process32next https://docs.microsoft.com/es-es/windows/desktop/api/tlhelp32/ns-tlhelp32-tagprocessentry32
  18. 18. Crackme! If you can… • Comprobando el nombre del equipo
  19. 19. Crackme! If you can… • Si el nombre no es el esperado…
  20. 20. Crackme! If you can… • Descifrado de una cadena • Comparada con el segundo parámetro pasado al programa
  21. 21. Crackme! If you can… • Clave utilizada en descifrado
  22. 22. Matrioska • Averigua la flag y supera este reto de especial dificultad. • PISTA: Piensa en el verdadero cifrado... • La contraseña del zip es infected 56cec8a0d69e0e458ffdc6855ea97834
  23. 23. Matrioska - T.exe $ 7z e matrioska-56cec8a0d69e0e458ffdc6855ea97834.zip $ file T.exe T.exe: MS-DOS executable, MZ for MS-DOS $ hexdump -C T.exe | more 00000000 4d 5a 40 00 01 00 00 00 02 00 00 00 ff ff 00 00 00000010 b8 00 00 00 00 00 00 00 0a 00 00 00 00 00 00 00 00000020 0e 1f ba 0e 00 b4 09 cd 21 b8 01 4c cd 21 57 69 00000030 6e 33 33 20 2e 45 58 45 2e 0d 0a 24 40 00 00 00 00000040 50 45 00 00 4c 01 04 00 b6 7f 64 5b 00 00 00 00 00000050 00 00 00 00 e0 00 8e 83 0b 01 02 19 00 9c 58 00
  24. 24. Matrioska - T.exe • Binario empaquetado con MPRESS
  25. 25. Matrioska - T.exe
  26. 26. Matrioska - T.exe • Binario creado con Delphi
  27. 27. Matrioska - T.exe • Array con los botones de la GUI • offset con el código que maneja la pulsación de cada tecla • Poniendo un breakpoint en cada uno y pulsando las teclas podemos averiguar cuál corresponde con cada uno…
  28. 28. Matrioska - T.exe • 1A • 2E • 33 • 4C • 5OK • 6CC • 7B • 8D • 9F • 101 • 112 • 124 • 135 • 146 • 157 • 168 • 179
  29. 29. Matrioska - T.exe • TForm1_FormCreate • Función que inicializa la interfaz • Contador de clicks
  30. 30. Matrioska - T.exe • A_counter  v11  v2+980 • E_counter  v10  v2+984 • 3_counter  v9  v2+992 • C_counter  v8  v2+996 • Otros  v2+1060 • Otros2  v2+1064
  31. 31. Matrioska - T.exe • Llama la atención una cadena con cabezera MZ • >>> chr(0x4d)+chr(0x5a) • 'MZ' • A continuación una escritura en fichero “t.tmp”
  32. 32. Matrioska - T.exe • Hay varias secciones de código iguales a esa • ¿Qué orden siguen?  • xrefs de cada variable
  33. 33. Matrioska - T.exe • Se podría extraer cada parte y concatenarla en un fichero, pero… Hemos venido a jugar!! • Localizamos dónde es llamada cada función en la que tenemos esas cadenas Parte 1 Parte 2 Parte 3 Parte 4 Parte 5 Parte 6 Parte 7 Parte 8 A OK OK C
  34. 34. Matrioska - T.exe • Botón A
  35. 35. Matrioska - T.exe • Botón OK (Parte 1) • Botón OK (Parte 2)
  36. 36. Matrioska - T.exe • Botón C • Se renombra t.tmp y se ejecuta
  37. 37. Matrioska - a.exe • Compilado con Visual C/C++ • No empaquetado, aunque existe una sección con nombre UPX
  38. 38. Matrioska - a.exe • Localizamos el Main del programa tras el código del compilador • Oculta la ventana • Operaciones que retrasan la ejecución… …
  39. 39. Matrioska - a.exe • Hook en DbgUiRemoteBreakin para saltar a ExitProcess  Anti-attach Antes Después
  40. 40. Matrioska - a.exe • Comprobación de permisos • Debe ejecutarse como hijo de un proceso con nombre cmd.exe
  41. 41. Matrioska - a.exe • Comprobación de versión de Windows • Variable asignada en la función del nuevo hilo
  42. 42. Matrioska - a.exe • sub_401990 • Keylogger de 12 caracteres
  43. 43. Matrioska - a.exe • Si se introduce el valor esperado • Se escribe en una clave de registro la segunda parte (6 caracteres) • Se iguala a 1 byte_452BC4
  44. 44. Matrioska - a.exe • Comprobación del valor introducido
  45. 45. Matrioska - a.exe • Comprobación Anti-máquina virtual
  46. 46. Matrioska - a.exe • Comprobación Anti-debug: https://www.symantec.com/connect/articles/windows-anti-debug-reference
  47. 47. Matrioska - a.exe • Escritura de un fichero con nombre “p”
  48. 48. Matrioska - a.exe • Lectura de recurso “666” • Descifrado y escrito en 1.ps1
  49. 49. Matrioska - a.exe • Si alguna condición no es la que esperaba, se borra
  50. 50. Matrioska - p • Fichero codificado en base64 • Después de decodificar, tiene cabecera TIF • No parece una imagen TIF válida
  51. 51. Matrioska - 1.ps1 • Script powershell ofuscado • Sustituimos iex por write
  52. 52. Matrioska - 1.ps1 • Obtenemos otro script ofuscado • Repetimos el mismo proceso
  53. 53. Matrioska - 1.ps1 • Obtenemos otro script ofuscado • Repetimos el mismo proceso
  54. 54. Matrioska - 1.ps1 • Comprobación anti-debug • Comprueba que existan la clave del registro y fichero “p”
  55. 55. Matrioska - 1.ps1 • Lee la clave de registro y le aplica un XOR con 1 a cada carácter
  56. 56. Matrioska - 1.ps1 • Comprobación de ese valor en la función “hackerman”
  57. 57. Matrioska - 1.ps1 • Aplicamos XOR sobre el valor para calcular el inicial
  58. 58. Matrioska - 1.ps1 • Se escribe el valor tras el XOR en un fichero “dork” • Se calcula el carácter resultado de restar 4056 a cada valor de un array • Se escribe en un fichero “a.xsl” • Se ejecuta mediante wmic (técnica de bypass) • Se borra
  59. 59. Matrioska - a.xls • Fichero XML con código JScript. • Técnica dotNetToJscript
  60. 60. Matrioska - a.xls • _0x2cf9: Un array con valores codificados en base64 • Funciones varias…
  61. 61. Matrioska - a.xls • Debuggearlo o mostrarlo por pantalla: tú elijes!
  62. 62. Matrioska - a.xls • Objeto serializado • No es funcional, pero basta para analizar su código
  63. 63. Matrioska - serialized_obj • La fecha del sistema debe ser 1/1/2019 • La URL devuelve 500  El flujo continúa en el catch
  64. 64. Matrioska - serialized_obj • p: ciphertext • dork: w10123shark01 • Se borran “p” y “dork” • Anti-debug basado en tiempo • Descifrado con AES de “p” usando con la clave de dork
  65. 65. Matrioska - serialized_obj • La fecha del sistema debe ser 1/1/2019 • La URL devuelve 500  El flujo continúa en el catch
  66. 66. Matrioska - w • El verdadero cifrado… http://www.cyber-forensics.ch/how-to-find-truecrypt-containers/
  67. 67. Matrioska - w • ¿Cuál es la pass? John… • $ python truecrypt2john.py w_decoded > true_hashes.txt • john --wordlist=rockyou.txt true_hashes.txt https://raw.githubusercontent.com/magnumripper/JohnTheRipper/2a18678301cef281a168ea6d84980449d5c8e4da/run/truecrypt2john.py
  68. 68. Matrioska - w • ¿Cuál es la pass? Hashcat… $ dd if=w_decoded of=w_decoded_hidden bs=1 skip=65536 count=512 $ hashcat --help | grep "True" -A 14 62XY | TrueCrypt | Full-Disk Encryption (FDE) X | 1 = PBKDF2-HMAC-RIPEMD160 | Full-Disk Encryption (FDE) X | 2 = PBKDF2-HMAC-SHA512 | Full-Disk Encryption (FDE) X | 3 = PBKDF2-HMAC-Whirlpool | Full-Disk Encryption (FDE) X | 4 = PBKDF2-HMAC-RIPEMD160 + boot-mode | Full-Disk Encryption (FDE) Y | 1 = XTS 512 bit pure AES | Full-Disk Encryption (FDE) Y | 1 = XTS 512 bit pure Serpent | Full-Disk Encryption (FDE) Y | 1 = XTS 512 bit pure Twofish | Full-Disk Encryption (FDE) Y | 2 = XTS 1024 bit pure AES | Full-Disk Encryption (FDE) Y | 2 = XTS 1024 bit pure Serpent | Full-Disk Encryption (FDE) Y | 2 = XTS 1024 bit pure Twofish | Full-Disk Encryption (FDE) Y | 2 = XTS 1024 bit cascaded AES-Twofish | Full-Disk Encryption (FDE) Y | 2 = XTS 1024 bit cascaded Serpent-AES | Full-Disk Encryption (FDE) Y | 2 = XTS 1024 bit cascaded Twofish-Serpent | Full-Disk Encryption (FDE) Y | 3 = XTS 1536 bit all | Full-Disk Encryption (FDE) $ hashcat -m 6211 w_decoded -w 3 rockyou.txt --force $ hashcat -m 6211 w_decoded_hidden -w 3 rockyou.txt --force
  69. 69. Matrioska - w • ¿Flag?
  70. 70. Matrioska - Flag • $ file Flag • Flag: openssl enc'd data with salted password
  71. 71. Matrioska - Flag import sys import subprocess ciphers = ["AES-128-CBC", "AES-128-CBC-HMAC-SHA1", "AES-128-CBC-HMAC-SHA256", "AES-128-CFB", "AES-128-CFB1", "AES-128-CFB8", "AES-128-CTR", "AES-128-ECB", "AES-128-OFB", "AES-128- XTS", "AES-192-CBC", "AES-192-CFB", "AES-192-CFB1", "AES-192-CFB8", "AES-192-CTR", "AES-192-ECB", "AES-192-OFB", "AES-256-CBC", "AES-256-CBC-HMAC-SHA1", "AES-256-CBC-HMAC-SHA256", "AES-256-CFB", "AES-256-CFB1", "AES-256-CFB8", "AES-256-CTR", "AES-256-ECB", "AES-256-OFB", "AES-256-XTS", "BF-CBC", "BF-CFB", "BF-ECB", "BF-OFB", "CAMELLIA-128-CBC", "CAMELLIA-128- CFB", "CAMELLIA-128-CFB1", "CAMELLIA-128-CFB8", "CAMELLIA-128-ECB", "CAMELLIA-128-OFB", "CAMELLIA-192-CBC", "CAMELLIA-192-CFB", "CAMELLIA-192-CFB1", "CAMELLIA-192-CFB8", "CAMELLIA-192-ECB", "CAMELLIA-192-OFB", "CAMELLIA-256-CBC", "CAMELLIA-256-CFB", "CAMELLIA-256-CFB1", "CAMELLIA-256-CFB8", "CAMELLIA-256-ECB", "CAMELLIA-256-OFB", "CAST5-CBC", "CAST5-CFB", "CAST5-ECB", "CAST5-OFB", "DES-CBC", "DES-CFB", "DES-CFB1", "DES-CFB8", "DES-ECB", "DES-EDE", "DES-EDE-CBC", "DES-EDE-CFB", "DES-EDE-OFB", "DES-EDE3", "DES-EDE3- CBC", "DES-EDE3-CFB", "DES-EDE3-CFB1", "DES-EDE3-CFB8", "DES-EDE3-OFB", "DES-OFB", "DESX-CBC", "RC2-40-CBC", "RC2-64-CBC", "RC2-CBC", "RC2-CFB", "RC2-ECB", "RC2-OFB", "RC4", "RC4- 40", "RC4-HMAC-MD5", "SEED-CBC", "SEED-CFB", "SEED-ECB", "SEED-OFB"] digests = ["DSA", "DSA-SHA", "MD4", "MD5", "RIPEMD160", "SHA", "SHA1", "SHA224", "SHA256", "SHA384", "SHA512", "whirlpool"] for length in range(4, 7): print "Trying password length: %s" % str(length) for cip in ciphers: for dig in digests: bashCommand = "bruteforce-salted-openssl -c %s -d %s -l %s -m %s -s "%s" -t 8 %s" % (cip, dig, str(length), str(length), "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz.#_", sys.argv[1]) process = subprocess.Popen(bashCommand.split(), stdout=subprocess.PIPE, stderr=subprocess.PIPE) output, error = process.communicate() if "candidate" in output: print "%s - %s" % (cip, dig) print output
  72. 72. Matrioska - Flag import sys import subprocess for cipher,v in rockyiu.iteritems(): for digest,v2 in v.iteritems(): for x in v2: bashCommand = 'openssl %s -d -md %s -in %s -out ./decrypt/Flag-%s- %s-%s.txt -pass pass:%s' % (cipher.lower(), digest.lower(), sys.argv[1], cipher.lower(), digest.lower(), x, v2) process = subprocess.Popen(bashCommand.split(), stdout=subprocess.PIPE, stderr=subprocess.PIPE) output, error = process.communicate() print output print error
  73. 73. Matrioska - Flag import string import sys printable_chars = set(bytes(string.printable, 'ascii')) with open(sys.argv[1], 'rb') as f: printable = all(char in printable_chars for char in f.read()) if printable: print(sys.argv[1]) https://stackoverflow.com/questions/42064158/checking-if-a-byte-is-ascii-printable
  74. 74. Matrioska - Flag $ python3 checkStrings.py Flag.txt Flag.txt
  75. 75. FIN @voidm4p voidm4p@protonmail.com
  76. 76. Muchas gracias

×