Jaime Peñalba - Como defenderse en terreno hostil: Protecciones para la Defcon 18 CTF [RootedCON...

download Jaime Peñalba - Como defenderse en terreno hostil: Protecciones para la Defcon 18 CTF [RootedCON 2011]

If you can't read please download the document

Transcript of Jaime Peñalba - Como defenderse en terreno hostil: Protecciones para la Defcon 18 CTF [RootedCON...

  • 1.
    • Como defenderse en terreno hostil: Protecciones para la Defcon 18 CTF Jaime Pealba Estebanez www.painsec.com @NighterMan

2. Se va abe un folln... 3. De que va esto? 4. Un ejemplo 5. Mientras en algn oscuro strip... 6. Otros programaban esto... 7. El resultado 8. El resultado 9. Reglas

  • Existe un SLA (Los servicios deben estar UP) 10. No se permiten DoS 11. Tampoco DoS fsico 12. Todo lo dems vale

13. Limitaciones y Requisitos

  • No se sabe que OS sera el servidor 14. No se puede hacer ningn cambio en kernel 15. No se sabe la arquitectura 16. No debera degradar el rendimiento 17. Debe proteger contra Stack/Heap BoF 18. Format String, Fallos lgicos, etc...

19. Posibles Soluciones

  • A nivel de red 20. A nivel de sistema

21. Limitaciones y Requisitos

  • No se sabe que OS sera el servidor 22. No se puede hacer ningn cambio en kernel 23. No se sabe la arquitectura 24. No debera degradar el rendimiento 25. Debe proteger contra Stack/Heap BoF 26. Format String, Fallos lgicos, etc...

27. Soluciones a nivel de Sistema

  • Ptrace 28. Syscall hooking/proxying 29. LD_PRELOAD hooking/proxying

30. LD_PRELOAD Hooking No Si Hookeamos la llamada Es Seguro Llamamos astrcpy() Llamamos astrncpy() Servicio llama a strcpy() Se continua con la ejecucin normal 31. Inconvenientes / Limitaciones

  • Hay que parchear montones de funciones 32. No vale de nada con binarios estticos 33. No detecta una llamada directa a una syscall

34. Inconvenientes / Limitaciones

  • ES UN WINDOWS !!!

35. Beneficios

  • Es bastante portable 36. Funciona en espacio de usuario 37. El overflow nunca llega a ocurrir 38. Nos avisa de los servicios que atacan

39. Que podemos controlar?

  • Stack based BoF 40. Heap based BoF 41. Format String attacks 42. Algunos fallos lgicos

43. Controlando Stack 44. Controlando Stack

  • strcpy(destination, cadena);
    • destination : dest=0xffffd5bb 45. cadena : src=0x80495e0

46. Controlando Stack

  • cadena : src=0x80495e0
    • destination : dest=0xffffd5bb

47. Controlando Stack 48. Como calculamos el espacio?

  • Frame Pointers

49. Controlando Stack Local Variables Saved EBP RET src dest destino Saved EBP RET Local Variables Saved EBP RET argv argc Stack Growth Higher Addresses 50. Controlando Stack strcpy() frame 0 function() frame 1 main() frame 2 argc argv[] RET Old EBP Local Variables RET Old EBP =0xffffd618 destino[] dest =0xffffd5eb src =0x08049618 RET Old EBP =0xffffd5f8 Local Variables 0xffffd5c8 Local Variables 0xffffd5f8 0xffffd618 0xffffd5eb %EBP 51. Controlando Stack 52. Limitaciones / Inconvenientes

  • GCC -fomit-frame-pointer 53. No previene la sobreescritura de otras variables locales en el mismo frame

54. Limitaciones / Inconvenientes strctpy(destino, AAAAA AAAA SI); RET Saved EBP admin = NO Argumento 1 Argumento 2 local_variable[4] destino[5] admin = SI 55. Controlando Heap 56. Controlando Heap 57. Controlando Heap El Heap contendra algo como esto: Variable buffer 4 bytes Variable is_admin 3 bytes Heap start lower addresses Heap end higher addresses 58. Controlando Heap Un bloque de memoria reservada es similar a esto: 59. Como controlamos el Heap?

  • Generamos un mapa de la memoria reservada 60. Hookeando las llamadas para reservar/liberar
    • malloc(), calloc() -> agregamos paginas al mapa 61. realloc() -> modificamos el mapa 62. free() -> borramos paginas del mapa

63. Como controlamos el Heap? 64. Como controlamos el Heap? Nuestro mapa de memoria Aspecto del Heap void *canary_addr void *start_addr char canary_value[4] unsigned int size Struct dyn_mem *next void *canary_addr void *start_addr char canary_value[4] unsigned int size Struct dyn_mem *next buffer 4 bytes Canary 0x00 + 3 bytes is_admin 3 bytes Canary 0x00 + 3 bytes 65. Como controlamos el Heap? 66. Controlando Heap 67. Limitaciones / Inconvenientes

  • Mayor consumo de memoria 68. El overflow se causa a travs de una de las funciones no controladas (solucin = canary)

69. Controlando Format String 70. Controlando Format String 71. Controlando Format String

  • int printf(const char *format, ...);
    • Hookear todas las funciones con format 72. Comprobar los % del format string 73. Comprobar si coinciden con va_list

74. Los ganadores juegan sucio

  • Algunos ejemplos:
    • Hookeamos open()/fopen()... 75. Hookeamos exec()/system()... 76. O lo que cualquier mente enferma pueda imaginar.

77. Hooking file access # List of files to be hooked files= { # Hooks applied to every service common = ( { filename= "/home/[a-zA-Z0-9_.-]*/key"; newname = "/tmp/fakekey"; }, { filename= "/home/algo/auth.db"; newname = "/tmp/fake.db"; } ); # Hooks applied to the service "servicename" servicename = ( { filename= "/etc/passwd"; newname = "/tmp/fakepasswd"; } ); }; 78. 79. 80.