comment
IRC Chat
play_arrow
Este sitio utiliza cookies propias y de terceros. Si continúa navegando consideramos que acepta el uso de cookies. OK Más Información.

Bad chars y encoders/decoders en payloads

  • 4 Respuestas
  • 6118 Vistas

0 Usuarios y 1 Visitante están viendo este tema.

Conectado ANTRAX

  • *
  • Administrator
  • Mensajes: 5380
  • Actividad:
    75%
  • Reputación 31
  • ANTRAX
    • Ver Perfil
    • Underc0de
    • Email
  • Skype: underc0de.org
  • Twitter: @Underc0de
« en: Marzo 30, 2012, 12:11:02 pm »
Hoy en  la lista de la ekoparty alguien pregunto como podia detectar bad chars en una payload.

Es por eso que voy a introducir un poco estos conceptos:
Una payload como todos sabemos es una combinacion de codigo y datos que se inyectan en un proceso corriendo para explotarlo, puede ser para un buffer overflow, memory corruption, heap overflow, etc.
Esta payload generalmente debe tener unos requisitos para que el programa la acepte, por ejemplo si la payload pasa por strcpy no podemos tener un caracter nulo porque no terminaria de copiar todo el buffer, sino que lo haria hasta donde este el caracter nulo (0).
Ejemplo:

buffer = "\x12\x41\x23\x34\x21\x34\x23\x00\x98\x93\x83\x11";
__________________________________||_______________
strcpy copia hasta aca, el resto no lo copia

A ese byte lo consideramos un bad char y es lo que tenemos que evitar, se puede utilizar un encoder en asm si nuestra payload va a ser ejecutada, sino tenemos que pensar en cambiar la payload.
El caracter nulo es un bad char caracteristico de strcpy y varias funciones mas porque es el caracter que se usa para terminar las cadenas en C (y varios lenguajes mas). Pero si nos encontramos ante un servidor HTTP por ejemplo tendriamos que tener en cuenta otros bad chars como es el caso de '\r' o '\n' que son terminadores de linea en el protocolo y seguramente nos van a interrumpir la payload cuando el server la parsee.
Otros protocolos/programas tendran otros bad chars y es por eso que a veces tendremos que reversear el programa si nuestra payload por alguna razon no llega a provocar la corrupcion que estamos buscando.

Aqui por ejemplo tenemos un pequeno programa en python para buscar bad chars en una payload, solamente ponemos nuestra payload y los bad chars que no acepta el programa que queremos explotar.

Código: Python
  1. payload = "\x12\x41\x23\x34\x21\x34\x23\x00\x98\x93\x83\x11"
  2. bad_chars = "\x00\n"
  3.  
  4. for offset in range(0, len(payload)):
  5.     if(payload[offset] in bad_chars):
  6.         print "tienes un bad char en el offset %s" % (offset)
  7.  

Por otro lado como habia mencionado hay veces que no podemos remover ese bad char porque puede ser una intruccion fundamental en nuestra shellcode como un long jump obligatorio a una direccion que contenga 0.
Aqui entran en juego los encoders, lo que se hace es codificar la payload y agregar un decoder en la misma, que son pequenos stubs en ASM que se ejecutan antes de la payload y decodifican el resto.
Una de las codificaciones mas usadas es la que se hace con XOR, como bien sabemos si nosotros xoreamos un byte con otro podemos volver al estado inicial volviendolo a xorear con el mismo byte.

Ejemplo : 
10 XOR 32 = 22
22 XOR 32 = 10

Ahora que tenemos la teoria, sabemos que podemos xorear toda la payload y agregar un header que la vuelva a su estado decodificado.

Un codificador de payload podria ser asi:

Código: C
  1. #include <stdio.h>
  2.  
  3. int size_payload = 12;
  4. char *payload = "\x12\x41\x23\x34\x21\x34\x23\x00\x98\x93\x83\x11";
  5. char   xor_code = 0x22; //este byte tiene que ser igual en el stub en asm
  6.  
  7. int main(int argc, char *argv[])
  8. {
  9.     int i;
  10.     for(i = 0; i < size_payload; i++){
  11.         No tienes permisos para ver links. Registrate o Entra con tu cuenta("0\\x%x", (char *)payload[i] ^ xor_code);
  12.     }
  13. }
  14.  

y el stub que se le agregaria a una payload seria algo asi:

Código: ASM
  1.     jmp call_inicio
  2. inicio:
  3.     pop  esi                           ; sacamos la direccion de la payload codificada de la pila y la guardamos en esi
  4.     mov eax, payload_code ; con el byte que xoreamos nuestra payload
  5.     xor   ebx,ebx                   ;
  6.     mov ecx, payload_size  ; el tamano que tiene nuestra payload
  7. otra_vez:
  8.     xor   dword ptr[esi+ebx], eax ; aqui aplicamos el xor
  9.     inc   eax            ; aumentamos eax, es con el que contamos las posiciones de memoria
  10.     dec  ecx
  11.     jnz   otra_vez    ; si no terminamos de decodificar la payload saltamos a otra_vez
  12.     jmp  comienzo_payload  ; una vez que terminamos saltamos a la payload real
  13. call_inicio:
  14.     call  inicio          ; usamos este truco para guardar la direccion de memoria donde comienza la payload, recordemos que call pone en la pila la
  15.                               ;siguiente memoria
  16. comienzo_payload:
  17.        ; aqui va nuestra payload codificada.
  18.  

Como veran es un codigo de apenas unos bytes y aunque este no esta optimizado pueden conseguir encoders/decoders muy eficientes que pueden hasta comprimir la payload si es muy grande.

Espero que les haya gustado y cualquier cosa preguntan.

Saludos,

Autor: snf
« Última modificación: Diciembre 19, 2015, 09:37:46 pm por Cl0udswX »


Desconectado #self

  • *
  • Underc0der
  • Mensajes: 4
  • Actividad:
    0%
  • Reputación 0
    • Ver Perfil
« Respuesta #1 en: Noviembre 15, 2014, 06:08:29 pm »
hola, solamente comentar, que dependiendo de donde se use ese payload, podría haber más caracteres que fuesen considerados como badchar en un payload para explotar una vulnerabilidad concreta

Desconectado Y3K

  • *
  • Underc0der
  • Mensajes: 173
  • Actividad:
    0%
  • Reputación 0
    • Ver Perfil
« Respuesta #2 en: Noviembre 17, 2014, 03:44:16 pm »
Anda... Sobre ésto me gustaría aprender más.

Desconectado Stederr

  • *
  • Underc0der
  • Mensajes: 8
  • Actividad:
    0%
  • Reputación 0
    • Ver Perfil
    • MultiAportes - Un blog de computación y otras ideas
  • Skype: MiPerfilEsFalso
  • Twitter: MiPerfilEsFalso
« Respuesta #3 en: Enero 25, 2015, 08:44:57 pm »
Había leído hace no mucho sobre esto pero no me había quedado muy claro hasta leer tu tema, excelente explicación.

Desconectado Azav

  • *
  • Underc0der
  • Mensajes: 23
  • Actividad:
    0%
  • Reputación 0
    • Ver Perfil
« Respuesta #4 en: Enero 25, 2015, 09:46:05 pm »
Nunca he usado un payload, digamos que es un área que no me llama mucho la atención, pero todo lo que se habla en este artículo es muy similar a algo que estoy programando. Justamente lo que estoy programando ahora es un encoder/decoder de archivos, que primero comprime el archivo todo lo posible y luego cifra su contenido byte a byte, usando algo parecido a XOR, una modificación que inventé. Lo voy a publicar hoy o mañana.

Lo que no me queda claro es que el hecho de xorear toda la payload no va a evitar que aparezca un bad char, por ejemplo:
payload_original                          =  "\x12\x41\x23\x34\x21\x00\xA0\x98\x83\xBC"
payload_xored (con byte 0x98)    = "\x86\x57\x75\x64\x77\x98\x08\x00\x15\x24"

¿O estoy confundido?  ???

 

¿Te gustó el post? COMPARTILO!



ASWcrypter – script en python & bash para generar payloads indetectables

Iniciado por ANTRAX

Respuestas: 0
Vistas: 125
Último mensaje Septiembre 20, 2018, 11:59:16 am
por ANTRAX
Kwetza - Inyecta Payloads en Aplicaciones Android

Iniciado por ANTRAX

Respuestas: 0
Vistas: 1596
Último mensaje Julio 17, 2017, 12:08:55 pm
por ANTRAX