domingo, 25 de agosto de 2013


BugTroid - Pentesting Free


Bueno hace algun tiempo el equipo creador del O.S Bugtraq habia lanzado algunos detalles su próxima creación cuyo nombre recibe BugTroid. Pues hace algunos dias ha sido lanzado de forma oficial por el equipo BuqTraq para todos aquellos amamantes de la seguridad informática.


Presentación - BugTroid  : https://www.youtube.com/watch?v=vue2hpGesXw



BugTroid es una herramienta totalmente innovadora desarrollado desde un inicio por el equipo ya mencionado (Bugtraq-Team).




Las características principales de esta aplicación, es que cuenta con mas de 200 herramientas de Android y Linux (PRO) para realizar pestenting y forense a través de su Smartphone o Tablet.




Cabe resaltar que la aplicaciones es compatible desde Android 3.0 hacia versiones posteriores.





Dispone de un menú categorizado según la naturaleza de las herramientas, de las cuales podemos encontrar en su repertorio tales como :

  • Anonimato
  • Busqueda de Personas
  • Auditoría para frecuencias 802.11 (Wirelles y Bluetooth)
  • Mapeo de Redes
  • Control Remoto
  • DDoS
  • Sniffers
  • Pestenting
  • Seguridad
  • Forense
  • Análisis web
  • Critografía
  • Fuerza Bruta 
  • Antivirus
  • Sistema




Desde el menú de la aplicación usted podrá :

  • Consultar la información de la herramienta
  • Instalar la aplicación 
  • Desinstalar la aplicación
  • Ejecutar la aplicación (Pro)




También dispone de apartado de Settings, el cual le servirá para administrar e instalar ciertos requerimientos para el correcto funcionamiento de las herramientas así como otras funciones :

  • Establecer fondo de pantalla
  • Instalar los requisitos mínimos para le funcionamiento de las herramientas.
  • Instalar accesos directos en el escritorio (PRO)
  • Instalar accesos directos de la consola (PRO)
  • Instalación de interpretes : Perl, Python, Ruby, Php y MySQL (PRO)





Bueno antes de terminar el post me gustaría saludar a todo el equipo que ha hecho posible la existencia de esta aplicación, desde aqui le envío un fuerte saludo a todo Bugtraq-Team.


Bueno por mi parte yo me despido y será hasta la próxima.....Nos vemos.














Introducción a Shellcode 

Bueno en a continuación vamos a tratar un tema muy interesante, personalmente es mas divertido. Voy a tratar de hacer este post de la forma mas entendible posible, ya que dicho tema tiene de cierta forma tiene su parte lógica como de programación. Pero como mis anteriores post voy a tratarlo de hacerle llegar un mensaje claro acerca de la Shellcode. Pues comenzemos... :)




Una shellcode es un conjunto de órdenes programadas generalmente en lenguaje ensamblador y trasladadas a opcodes que suelen ser inyectadas en la pila (o stack) de ejecución de un programa para conseguir que la máquina en la que reside se ejecute la operación que se haya programado.

El término shellcode deriva de su propósito general, esto era una porción de un exploit utilizada para obtener una shell. Para nosotros poder obtener esas ordenes o trozo de código, como base es necesario tener conocimiento en lenguaje ensamblador, y a su vez debemos de cumplir ciertos requisitos para la eficacia de la explotación de dicha vulnerabilidad que vamos a explotar.


Limite de tamaño  : Tenemos que reducir en su maxima expresion el número de bytes, esto es importante ya que para al momento de querer explotar vulnerabilidades vamos a tener un tamaño limitado debido al buffer u otros factores.

Autosostenible  : Como nosotros vamos a insertar nuestro código creado dentro de un proceso, dicho proceso debe estar totalmente aislado de nuestro código, no debe depender de variables externas ni de algun otro factor.

Ausencia de bytes nulos :  Nuestra shell debe prescindir de algun byte de valor 00 (null). Ya que su presencia pondria un stop en la ejecución de nuestra shell. Cabe decir que existen otros métodos de la cual se puede insertar un valor null ya sea utilizando algún conector lógico como or.



Bueno hasta el momento hemos dado una pequeña introducción de lo que es una shellcode. Pero como dije vamos hacer el post de forma estructurada y vamos a iniciar desde lo básico hasta el objetivo de dicho post. Pues comenzemos con lo básico.


Componentes del CPU - Unidad Central de Procesos.

  • Placa madre o base (Mainboard o Motherboard)
  • Microprocesador
  • Memorias
  • La Bios  (Basic Input-Output System)
  • Ranuras de Expansión
  • Conectores internos y conectores eléctricos
  • Interfaz IDE (Integrated Drive Electronics)
  • Interfaz Serial - ATA o SATA (Serial Advanced Technology Attachment)


Bueno ya sabemos los elementos que conforman el CPU, a continuación vamos a escoger como objeto de estudio al Microprocesador para continuar nuestra pequeña investigación.



MICROPROCESADOR




El microprocesador (o simplemente procesador) es el circuito integrado central y más complejo de un sistema informático. Es un circuito integrado conformado por millones de componentes electrónicos.

El es encargado de ejecutar los programas, desde el sistema operativo hasta las aplicaciones de usuario; sólo ejecuta instrucciones programadas en lenguaje de bajo nivel, realizando operaciones aritméticas y lógicas simples, tales como sumar,restar, multiplicar, dividir, las lógicas binarias y accesos a memoria.

Esta unidad central de procesamiento esta constituida, esencialmente, por registros, una unidad de control, una unidad aritmético lógica (ALU) y una unidad de cálculo en coma flotante.

Después de mencionar la arquitectura del Microprocesador vamos a enfocarnos en el estudio de los Registros.



REGISTROS

En arquitectura de ordenadores, un registro es una memoria de alta velocidad y poca capacidad, integrada en el microprocesador, que permite guardar transitoriamente y acceder a valores muy usados, generalmente en operaciones matemáticas.

Los registros están en la cumbre de la jerarquía de memoria, y son la manera más rápida que tiene el sistema de almacenar datos. Los registros se miden generalmente por el número de bits que almacenan; por ejemplo, un "registro de 8 bits" o un "registro de 32 bits". Los registros generalmente se implementan en un banco de registros, pero antiguamente se usaban biestables individuales, memoria SRAM o formas aun más primitivas.

Nota: Arquitectura Intel x86 (registros de 32 bits).




Tipos de Registros.


Los registros de datos :  son usados para guardar números enteros. En algunas computadoras antiguas, existía un único registro donde se guardaba toda la información, llamado acumulador.

Los registros de memoria :  son usados para guardar exclusivamente direcciones de memoria. Eran muy usados en la arquitectura Harvard, ya que muchas veces las direcciones tenían un tamaño de palabra distinto que los datos.

Los registros de propósito general :  son los que pueden guardar tanto datos como direcciones. Son fundamentales en la arquitectura de von Neumann. La mayor parte de las computadoras modernas usa GPR.

Los registros de coma flotante :  son usados para guardar datos en formato de coma flotante.

Los registros constantes  :  son los que tienen valores creados por hardware de sólo lectura. Por ejemplo, en MIPS el registro cero siempre vale 0.

Los registros de propósito específico :  son los que guardan información específica del estado del sistema, como el puntero de pila o el registro de estado.



De los registros mencionados anteriormente, los que destacan son :

Registros de propósito general : EAX, EBX, ECX, EDX, ESI, EDI. Dichos registros los usaremos para almacenar variables, direcciones de memoria, como contador en un buclo, etc.

Registros de control : ESP, EBP, EIP ... . Estos registros contienen información importante de nuestros programas. ESP indica la dirección de la cima de la pila (Stack Pointer), EBP indica la base del macro actual de la pila, es decir, indica el lugar donde empiezan las variables locales de la función que se está ejecutando en este momento (Base Pointer), y EIP contiene la dirección de la siguiente instrucción que ejecutará el procesador (Intruction Pointer)



Tipos de registro de forma mas detallada.





Es muy curioso que todos los registros empiecen con E. Pues esto se debe a que cuando se diseño la arquitectura Intel x86 de 32 bits, se quiso que fuese compatible con la arquitectura de 16 bits, y por ello se cogieron los mismos registros y se les añadió una E delante (de Extended), haciéndolos de 32 bits en lugar de 16. Por esta razón, podemos utilizar el registro AX para referirnos a los 16 bits mas bajos del registro EAX, y de la misma manera con todos los demás registros. Ademas, podemos referirnos, dentro de estos 16 bits , a los 8 bits mas bajos con AL y a los 8 bits mas altos con AH, y lo mismo para el resto de registros.


Para finalizar cabe decir que existen dos tipos de sistaxis para ensamblador en Intel x86. Por un lado tenemos la sintaxis Intel y por el otro la sintaxis AT&T. Los dos tipos de sintaxis tienen las mismas funcionalidades pero tienen diferente de estructura en su instrucción.


HACKING - SHELLCODE





Shellcode desde el punto de vista de una aplicación web.


  • La manipulación de las zonas de la memoria, que se encargar e la ejecución de las aplicaciones genera efectos de desbordes inesperados. (desbordes del valor que se le asentúa a una variable)

  • La memoria (bytes) que manejan las aplicaciones es tan vulnerable como el código mismo que las integra.

  • La memoria trabajo como un inspector, es decir realiza un seguimiento paso a paso de la ejecución que de las aplicaciones.




A continuación vamos a dar una visión General de la administración de la Memoria .



ADMINISTRACIÓN DE MEMORIA.




  • Stack (Pila) : Una pila (stack) es una lista ordinal o estructura de datos en la que el modo de acceso a sus elementos es de tipo LIFO ( Last In First Out, último en entrar, primero en salir) que permite almacenar y recuperar datos. Esta estructura se aplica en multitud de ocasiones en el área de informática debido a su simplicidad y ordenación implícita de la propia estructura.Para el manejo de los datos se cuenta con dos operaciones básicas: apilar (push), que coloca un objeto en la pila, y su operación inversa, retirar (o desapilar, pop), que retira el último elemento apilado.




  • Heap :  Es una estructura de datos similar a una pila. El heap (o almacenamiento libre) es el área de memoria usada para la asignación dinámica de memoria, el cual se trata de la asignación de almacenamiento de memoria para utilización por parte de un programa de computador durante el tiempo de ejecución de ese programa. Es una manera de distribuir la propiedad de recursos de memoria limitada entre muchas piezas de código y datos.





  •  BSS - Block Started by Symbol : Es utilizado por muchos compiladores y enlazadores para asignar una parte del segmento de datos ( Data ). Mientras se ejecutar un programa ,en este segmento de memoria BSS se almacenan  todas las variables globales y estáticas sin inicializar.


  • Data  : Un segmento de datos, es una parte del espacio de dirección virtual de un programa, que contiene las variables globales y variables estáticas que se inicializan por el programador . El tamaño de este segmento se determina por los valores colocadas allí por el programador antes de que el programa fue compilado o montado, y no cambia en tiempo de ejecución. El segmento de datos es de lectura y escritura, ya que los valores de las variables se pueden modificar en tiempo de ejecución.


  • Text : Conocido como segmento de código, es una de las secciones de un programa en un fichero objeto o en memoria, que contiene instrucciones ejecutables, contiene un tamaño fijo y es usualmente de solo-lectura.


REGISTROS


Anteriormente ya hemos explicado de forma referencial los distintos tipo de registros que existen, a continuación vamos a adicionar un poco mas de información de dichos registros en un pequeño cuadra comparativo.






Ahora vamos a proseguir definiendo algunos conceptos que son muy importantes y necesarios al momento que   Shellcode.



System Call :  Es un conjunto de funciones que permiten acceso a funciones especificas del sistema operacional como :

  1. Obtener entradas 
  2. Producir salidas.
  3. Terminar procesos.
  4. Ejecutar binarios.

Una llamada del sistema (System Call) es un mecanismo utilizado por una aplicación para solicitar un servicio del sistema operativo. Los ejemplos de los servicios prestados por el sistema operativo son la asignación y cancelación de asignación de memoria, la notificación de la fecha y la hora actuales., etc Estos servicios pueden ser utilizados por una aplicación con la ayuda de las llamadas al sistema.

La llamada del sistema permite un acceso al kernel, y las funciones que están íntimamente relacionadas son como read, write, fetch, primitas del sistema operacional.


String Format :  Son cadenas alfanuméricas que contienen símbolos especiales, los cuales son reconocidos por la función printf() y sus respectivos derivados como lo son sprintf(), fprintf() y vprintf().

Con ellas es posible especificar la manera como serán visualizados los demás argumentos entregador a la función.




Especificaciones de formato :

%d      -      presentado como número entero                              -     como valor.
%u      -      presentado como número natural                              -     como valor.
%x      -      presentado como número natural hexadecimal           -     como valor.
%s      -      presentado como cadena alfanúmerica                       -     como referencia.
%n      -      número de caracteres impresos hasta el momento      -      como referencia. 


Presicion : 

%3s : Rellenar con un maximo de 3 espacios

  • printf("S:%3s", "1");        ---> S :     1
  • printf("S:%3s", "12");      ---> S :   12
  • printf("S:%3s", "123");    ---> S : 123

Todo lo anterior se alinean a la derecha en la misma posición

  • printf("S:%4s", "1234");   ---> S : 1234


Ejemplo 1 - Básico 



Ejemplo 2 - Básico


  • Utilizando especificaciones de formato.




1.- Iniciamos pasando como parámetros al programa, una instrucción en comillas inversas, lo que sugiere la ejecución del programa lo que se encuentra entre comillas, tomando una palabra de 4 bytes de la pila (pues no había argumento), y así sucesivamente.

2 .- El programa ha tratado de escribir a una dirección de memoria al azar la cantidad de caracteres impresos.



String Format - Explotando Vulnerabilidad - Owasp



El exploit para String Format ocurre cuando los datos presentados de una cadena de entrada se evalúa como una orden por la aplicación. De esta manera, el atacante podría ejecutar código, leer la pila, o causar un fallo de segmentación en la aplicación en ejecución, provocando nuevos comportamientos que podrían comprometer la seguridad o la estabilidad del sistema.





Para entender el ataque, es necesario comprender los componentes que lo constituyen.




Componentes 


La función de formato es una función de conversión de ANSI C, como printf, fprintf, que convierte una variable primitiva del lenguaje de programación en una representación de cadena legible.

La cadena de formato es el argumento de la función de Formato y Z es una cadena ASCII que contiene el texto y formato de los parámetros, tales como: printf("El número mágico es:% d \ n", 1911);

El parámetro cadena de formato, como% x% s define el tipo de conversión de la función de formateo.




El ataque se podría ejecutar cuando la aplicación no valida correctamente la entrada enviada. En este caso, si un parámetro de cadena de formato, como% x, se inserta en los datos publicados, la cadena se analiza la función de formato, y la conversión especificada en los parámetros se ejecuta. Sin embargo, la función de formato se espera más argumentos como entrada, y si no se suministran estos argumentos, la función podía leer o escribir la pila.

De esta forma, es posible definir una entrada bien diseñada que podría cambiar el comportamiento de la función de formato, lo que permite al atacante para causar una denegación de servicio o ejecutar código arbitrario.




Si la aplicación utiliza funciones de formato en el código fuente, que es capaz de interpretar los caracteres de formato, el atacante podría explorar la vulnerabilidad mediante la inserción de caracteres de formato en una forma de la página web. Por ejemplo, si la función printf se utiliza para imprimir el nombre de usuario introducido en algunos campos de la página, el sitio web podría ser vulnerable a este tipo de ataque, según lo demostrado abajo:


printf(nombre_de_usuario);


Tabla de formato de funciones.




Como breve repaso vamos a presentar algunos de los parámetros de formato que pueden utilizarse y sus consecuencias:


  • "%x"   -   Leer datos de la pila

  • "%s"   -   Leer las cadenas de caracteres de la memoria del proceso
  • "%n"   -   Escriba un número entero a lugares de la memoria del proceso


Para nosotros poder descubrir si la aplicación es vulnerable a este tipo de ataque, es necesario verificar si la función de formato acepta y analiza los parámetros de cadena de formato que anteriormente ya hemos mencionado.





Ejemplo - Ataque de Denegación de Servicio - DoS


En este caso, cuando se solicita una dirección de memoria no válida, normalmente el programa se termina.


printf(nombre_de_usuario);
En este aspecto el atacante podría insertar una secuencia de cadenas de formato, por lo que el programa muestra la dirección de memoria donde se almacenan una gran cantidad de otros datos y, a continuación, el atacante aumenta la posibilidad de que el programa leerá una dirección ilegal, estrellándose el programa y haciendo que su no-disponibilidad.


printf(%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%);





Stack Overflow - Explotando vulnerabilidad (Stack Buffer Overflow) -  Owasp 


Como primer enfoque sobre este tipo de vulnerabilidad hay que tener presente que se origina por la manipulación o mal uso del bufffers.( Conjunto contiguo de espacio de memoria).

Stack Buffer Overflow (Desbordamientos de pila) se producen cuando los datos de tamaño variable se copia en buffers de longitud fija situados en la pila del programa sin ningún tipo de comprobación de límites. Vulnerabilidades de esta clase son generalmente considerados como de alta gravedad, ya que su explotación sería sobre todo permitir la ejecución de código arbitrario o Denegación de Servicio.


Jailbreak - Apple




Vulnerabilidades de desbordamiento de pila a menudo permiten a un atacante tomar el control directo del puntero de la instrucción y, por tanto, modificar la ejecución del programa y ejecutar código arbitrario. Además de sobrescribir el puntero de instrucción, resultados similares también pueden obtenerse a través de sobrescribir otras variables y estructuras, como manejadores de excepciones, que se encuentran en la pila.


Istruccciones de manejo del Stack

  • Push - Instrucción utilizada para colocar datos en el Stack.
  • Pop  - Instrucción utilizada para remover datos del Stack.
  • Esp   - Registro que define el límite del Stack, es decir apunta a la parte superior del Stack.



La clave para probar una aplicación en busca de vulnerabilidades de desbordamiento de pila es el suministro de los datos de entrada excesivamente grandes en comparación con lo que se espera. Sin embargo, someter la aplicación a los datos arbitrariamente grandes no es suficiente. Se hace necesario inspeccionar el flujo y las respuestas de la ejecución de la aplicación para determinar si un desbordamiento en realidad se ha activado o no. Por lo tanto, los pasos necesarios para localizar y validar los desbordamientos de pila sería adjuntar un depurador a la aplicación de destino o proceso, generar la entrada mal formada para la aplicación, sin perjuicio de la aplicación a la entrada mal formada e inspeccionar las respuestas en un depurador. El depurador permite que el probador para ver el flujo de ejecución y el estado de los registros cuando se desencadena la vulnerabilidad.


IDA-PRO - Desensamblador



Por otro lado, una forma más pasiva de las pruebas puede ser empleado, que consiste en la inspección de código ensamblador de la aplicación mediante el uso de desensambladores. En este caso, las distintas secciones se analizan en busca de firmas de fragmentos de montaje vulnerables. Esto a menudo se denomina como la ingeniería inversa y es un proceso tedioso.

A continuación vamos a abrir un archivo .exe cuyo nombre es samble el cual se va a ejecutar en un debugger, en nuestro caso sera Ollydbg.




Dado que la aplicación espera argumentos en la línea de comandos (una amplia secuencia de caracteres como 'A').Cuando nosotros vamos a abrir el ejecutable con los argumentos provistos y continuar la ejecución, se obtienen los siguientes resultados.





Como se muestra en la ventana de registros del depurador, el EIP (Extended Instruction Pointer), que apunta a la próxima instrucción a ejecutar, contiene el valor '41414141' .Nosotros sabemos que  '41' es una representación hexadecimal del carácter 'A' y por lo tanto la cadena 'AAAA' traduce  41414141.Esto demuestra claramente que los datos de entrada se puede utilizar para sobrescribir el puntero de instrucción con los valores suministrados por el usuario y la ejecución del programa de control. Un desbordamiento de pila puede también permitir la sobreescritura de estructuras basados ​​en la pila, como SEH (Structured Exception Handler) para controlar la ejecución de código y pasar por alto ciertos mecanismos de protección de la pila.Como se mencionó anteriormente, otros métodos de control de tales vulnerabilidades incluyen la ingeniería inversa binarios de la aplicación, que es un proceso complejo y tedioso, y el uso de técnicas de fuzzing.


Ejemplo - Gráfico.




Heap Overflow - Explotando vulnerabilidad(Stack Buffer Overflow) -  Owasp


Hay que tener presente que Heap es un segmento de memoria que se utiliza para almacenar los datos asignados dinámicamente y variables globales. Cada trozo de memoria en el montón formado por etiquetas de limitación que contienen información de la gestión de memoria.




Cuando un búfer basado en heap se desbordó la información de control en estas etiquetas se sobrescribe. Cuando la rutina de gestión de heap libera el búfer, una dirección de memoria sobrescribir se lleva a cabo dando lugar a una violación de acceso. Cuando el desbordamiento se ejecuta de una manera controlada, la vulnerabilidad permitiría a un adversario para sobrescribir una posición de memoria deseada con un valor controlado por el usuario. En la práctica, un atacante sería capaz de sobrescribir punteros de función y varias direcciones almacenadas en estructuras como GOT,. Dtors o TEB con la dirección de una carga maliciosa.


Características :


La zona de Heap, es aquel lugar de memoria para manejo de variables que permanecen por largo tiempo, las cuales continúan existiendo aún por largo tiempo, las cuales continúan existiendo aún la función haya retornado (y sus variables hayan sido eliminadas del Stack)

Funciones que manejan este segmento-malloc(), y free(), los cuales se apoyan en brk() o mmap() (esta dos últimas System Call ).





Existen numerosas variantes del desbordamiento de Heap (corrupción de Heap) la vulnerabilidad que puede permitir nada de sobrescribir punteros de función para la explotación de las estructuras de gestión de memoria para la ejecución de código arbitrario. La localización de desbordamientos de memoria Heap requiere un examen más detallado en comparación con desbordamientos de pila, ya que hay ciertas condiciones que deben existir en el código para estas vulnerabilidades para poder ser explotados.





Los principios de las pruebas de recuadro negro para los desbordamientos de memoria heap permanecen igual que desbordamientos de pila. La clave es suministrar en forma de cadenas de entrada que son más de lo esperado. Aunque el proceso de prueba sigue siendo el mismo, los resultados que son visibles en un depurador son significativamente diferentes. Mientras que en el caso de un desbordamiento de pila, un puntero de instrucción o SEH sobrescribe sería aparente, esto no es cierto para una condición de desbordamiento de Heap. Cuando se depura un programa de windows, un desbordamiento de Heap puede aparecer en varias formas, la más común es un cambio de puntero que tiene lugar después de la rutina de gestión de Heap entra en acción. A continuación vamos a ilustrar una vulnerabilidad de desbordamiento de Heap.





Los dos registros mostrados, EAX y ECX, se pueden rellenar con las direcciones de usuarios que forman parte de los datos que se utilizan para desbordar el búfer suministrado. Una de las direcciones que puede apuntar a un puntero de función que debe ser sobrescrito, por ejemplo UEF (filtro de excepción no controlada), y el otro puede ser la dirección del código de usuario que se proporciona que necesita ser ejecutado.Cuando se ejecutan las instrucciones MOV mostradas en el panel de la izquierda, el sobrescribir tiene lugar y, cuando se llama a la función, el código de usuario suministrado se ejecuta. Como se mencionó anteriormente, otros métodos de control de tales vulnerabilidades incluyen la ingeniería inversa binarios de la aplicación, que es un proceso complejo y tedioso, y el uso de técnicas de fuzzing.


Nota - Consideraciones del funcionamiento.


  • Cuando se usa malloc(), brk() asigna un blogque amplio de memoria en pedazos, el cual entrega el usuario segun su solicitud.


  • Cuando se usa free(), decide sobre el nuevo pedazo de memoria liberado, para armar un bloque mas grande disponible.



Ejemplo Gráfico.





Existen dos buffers contiguos definidos. El primero sobrepasa su tamaño y afecta al segundo. Particularmente sobre escribe la estructura de metadatos del segundo. Luego cuando se intenta liberar el segundo buffer posiblemente teniendo acceso a un segmento de memoria inválido.



SHELLCODE 






Características :


Es una pieza de código de maquina ejecutable o código script que tiene una sola misión, el cual es abrir un interprete de comandos en el sistema operativo.

Las shellcodes deben ser cortas para poder ser inyectadas dentro de la pila, que generalmente suele ser un espacio reducido.

Generalmente la creación de shellcode se nace mediante el código ensamblador.


Consideraciones de Funcionamiento.

Como anteriormente ya hemos mencionado y de forma un poco mas detallada , las shellcode son generalmente utilizados para explotar vulnerabilidades,cuyas técnicas empleadas son :


  1. Stack Buffers Overflows.
  2. Heap Buffers Overflows.
  3. Format String
  4. Integer Overflow
  5. Memory Corruption y algunas variaciones mas.



Esqueleto base de código Shell


  • Obtener el EIP


Dirección base. Cualquier variable o función en el código shell sera relativa a esta dirección. Para obtener esta dirección utilizamos las funciones CALL y POP.


  • Decodificar 


Generalmente encontramos en memoria caracteres NULL, los cuales nos impiden ejecutar nuestro código. Lo que implica que debamos codificar nuestro código generalmente con XOR con un valor predifinido.


  • Obtener las direcciones de las funciones requeridas.


Identificar en memoria los API, para identificar las direcciones de los procesos que requerimos.


  • Configurar el Socket de conexión.


Generalmente se requiere ubicar donde estan (en memoria) las funciones de socket(), bind(), listen() o sus equivalentes.


  • Creación del Shell



Ejemplo Gráfico.




Cabe resaltar que el nivel del shellcode también se rige por el algoritmo que se utiliza para la ofuscación o cifrado del código, si usted desea que su shell sea indetectable como muchos buscan hoy en día , eso invoca diseñar un algoritmo propio de cifrado, muy independiente de los que existen en la actualidad.


Recordando pequeño algoritmo de cifrado del gusano Flame.




Para poder analizar completamente una Shellode es necesario tener una estructura y de análisis para poder hacer un informe estructurado del funcionamiento de dicha Shell.



Bueno creo que con esto termino este post que espero les sea de utilidad al momento de intentar querer crear nuestro propio Shellcode o intentar analizar una mediante un debugger o desensamblador.

Bueno me despido y será hasta la próxima.....Nos vemos.