<ul>Como defenderse en terreno hostil: Protecciones para la Defcon 18 CTF Jaime Peñalba Estebanez www.painsec.com @Nighter...
Se va abe un follón...
¿De que va esto?
Un ejemplo
Mientras en algún oscuro strip...
Otros programaban esto...
El resultado
El resultado
Reglas <ul><li>Existe un SLA (Los servicios deben estar UP)
No se permiten DoS
Tampoco DoS físico
Todo lo demás vale </li></ul>
Limitaciones y Requisitos <ul><li>No se sabe que OS sera el servidor
No se puede hacer ningún cambio en kernel
No se sabe la arquitectura
No debería degradar el rendimiento
Debe proteger contra Stack/Heap BoF
Format String, Fallos lógicos, etc... </li></ul>
Posibles Soluciones <ul><li>A nivel de red
A nivel de sistema </li></ul>
Limitaciones y Requisitos <ul><li>No se sabe que OS sera el servidor
No se puede hacer ningún cambio en kernel
No se sabe la arquitectura
No debería degradar el rendimiento
Debe proteger contra Stack/Heap BoF
Format String, Fallos lógicos, etc... </li></ul>
Soluciones a nivel de Sistema <ul><li>Ptrace
Syscall hooking/proxying
LD_PRELOAD hooking/proxying </li></ul>
LD_PRELOAD Hooking No Si Hookeamos la llamada Es Seguro Llamamos a  strcpy() Llamamos a  strncpy() Servicio llama a strcpy...
Inconvenientes / Limitaciones <ul><li>Hay que parchear montones de funciones
No vale de nada con binarios estáticos
No detecta una llamada directa a una syscall </li></ul>
Inconvenientes / Limitaciones <ul>¡¡¡ ES UN WINDOWS !!! </ul>
Beneficios <ul><li>Es bastante portable
Funciona en espacio de usuario
El overflow nunca llega a ocurrir
Nos avisa de los servicios que atacan </li></ul>
¿Que podemos controlar? <ul><li>Stack based BoF
Heap based BoF
Format String attacks
Algunos fallos lógicos </li></ul>
Controlando Stack
Controlando Stack <ul>strcpy(destination, cadena); <ul><li>destination : dest=0xffffd5bb
cadena : src=0x80495e0 </li></ul></ul>
Controlando Stack <ul>cadena : src=0x80495e0 <ul>destination : dest=0xffffd5bb </ul></ul>
Controlando Stack
Upcoming SlideShare
Loading in …5
×

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

4,861 views

Published on

Published in: Travel, Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
4,861
On SlideShare
0
From Embeds
0
Number of Embeds
1,354
Actions
Shares
0
Downloads
164
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

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

  1. 1. <ul>Como defenderse en terreno hostil: Protecciones para la Defcon 18 CTF Jaime Peñalba Estebanez www.painsec.com @NighterMan </ul>
  2. 2. Se va abe un follón...
  3. 3. ¿De que va esto?
  4. 4. Un ejemplo
  5. 5. Mientras en algún oscuro strip...
  6. 6. Otros programaban esto...
  7. 7. El resultado
  8. 8. El resultado
  9. 9. Reglas <ul><li>Existe un SLA (Los servicios deben estar UP)
  10. 10. No se permiten DoS
  11. 11. Tampoco DoS físico
  12. 12. Todo lo demás vale </li></ul>
  13. 13. Limitaciones y Requisitos <ul><li>No se sabe que OS sera el servidor
  14. 14. No se puede hacer ningún cambio en kernel
  15. 15. No se sabe la arquitectura
  16. 16. No debería degradar el rendimiento
  17. 17. Debe proteger contra Stack/Heap BoF
  18. 18. Format String, Fallos lógicos, etc... </li></ul>
  19. 19. Posibles Soluciones <ul><li>A nivel de red
  20. 20. A nivel de sistema </li></ul>
  21. 21. Limitaciones y Requisitos <ul><li>No se sabe que OS sera el servidor
  22. 22. No se puede hacer ningún cambio en kernel
  23. 23. No se sabe la arquitectura
  24. 24. No debería degradar el rendimiento
  25. 25. Debe proteger contra Stack/Heap BoF
  26. 26. Format String, Fallos lógicos, etc... </li></ul>
  27. 27. Soluciones a nivel de Sistema <ul><li>Ptrace
  28. 28. Syscall hooking/proxying
  29. 29. LD_PRELOAD hooking/proxying </li></ul>
  30. 30. LD_PRELOAD Hooking No Si Hookeamos la llamada Es Seguro Llamamos a strcpy() Llamamos a strncpy() Servicio llama a strcpy() Se continua con la ejecución normal
  31. 31. Inconvenientes / Limitaciones <ul><li>Hay que parchear montones de funciones
  32. 32. No vale de nada con binarios estáticos
  33. 33. No detecta una llamada directa a una syscall </li></ul>
  34. 34. Inconvenientes / Limitaciones <ul>¡¡¡ ES UN WINDOWS !!! </ul>
  35. 35. Beneficios <ul><li>Es bastante portable
  36. 36. Funciona en espacio de usuario
  37. 37. El overflow nunca llega a ocurrir
  38. 38. Nos avisa de los servicios que atacan </li></ul>
  39. 39. ¿Que podemos controlar? <ul><li>Stack based BoF
  40. 40. Heap based BoF
  41. 41. Format String attacks
  42. 42. Algunos fallos lógicos </li></ul>
  43. 43. Controlando Stack
  44. 44. Controlando Stack <ul>strcpy(destination, cadena); <ul><li>destination : dest=0xffffd5bb
  45. 45. cadena : src=0x80495e0 </li></ul></ul>
  46. 46. Controlando Stack <ul>cadena : src=0x80495e0 <ul>destination : dest=0xffffd5bb </ul></ul>
  47. 47. Controlando Stack
  48. 48. ¿Como calculamos el espacio? <ul>Frame Pointers </ul>
  49. 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. 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. 51. Controlando Stack
  52. 52. Limitaciones / Inconvenientes <ul><li>GCC -fomit-frame-pointer
  53. 53. No previene la sobreescritura de otras variables locales en el mismo frame </li></ul>
  54. 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. 55. Controlando Heap
  56. 56. Controlando Heap
  57. 57. Controlando Heap El Heap contendría algo como esto: Variable buffer 4 bytes Variable is_admin 3 bytes Heap start lower addresses Heap end higher addresses
  58. 58. Controlando Heap Un bloque de memoria reservada es similar a esto:
  59. 59. ¿Como controlamos el Heap? <ul><li>Generamos un mapa de la memoria reservada
  60. 60. Hookeando las llamadas para reservar/liberar </li><ul><li>malloc(), calloc() -> agregamos paginas al mapa
  61. 61. realloc() -> modificamos el mapa
  62. 62. free() -> borramos paginas del mapa </li></ul></ul>
  63. 63. ¿Como controlamos el Heap?
  64. 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. 65. ¿Como controlamos el Heap?
  66. 66. Controlando Heap
  67. 67. Limitaciones / Inconvenientes <ul><li>Mayor consumo de memoria
  68. 68. El overflow se causa a través de una de las funciones no controladas (solución = canary) </li></ul>
  69. 69. Controlando Format String
  70. 70. Controlando Format String
  71. 71. Controlando Format String <ul>int printf(const char *format, ...); <ul><li>Hookear todas las funciones con “format”
  72. 72. Comprobar los % del format string
  73. 73. Comprobar si coinciden con “va_list” </li></ul></ul>
  74. 74. Los ganadores juegan sucio <ul>Algunos ejemplos: <ul><li>Hookeamos open()/fopen()...
  75. 75. Hookeamos exec()/system()...
  76. 76. O lo que cualquier mente enferma pueda imaginar. </li></ul></ul>
  77. 77. Hooking file access # List of files to be hooked files= { # Hooks applied to every service common = ( { filename = &quot;/home/[a-zA-Z0-9_.-]*/key&quot;; newname = &quot;/tmp/fakekey&quot;; }, { filename = &quot;/home/algo/auth.db&quot;; newname = &quot;/tmp/fake.db&quot;; } ); # Hooks applied to the service &quot;servicename&quot; servicename = ( { filename = &quot;/etc/passwd&quot;; newname = &quot;/tmp/fakepasswd&quot;; } ); };
  78. 80. <ul>Jaime Peñalba Estebanez - @NighterMan - www.painsec.com </ul>

×