25 may 2016

ROPInjector: Evasión de AV a través de ROP

En la pasada Black Hat USA de 2015 se presentó una charla denominada ROPInjector: Using Return-Oriented Programming for Polymorphism and AV Evasion en la que sus investigadores comentaban como utilizar ROP para mejorar los ratios de evasión en la detección de binarios maliciosos. ROP es utilizado, generalmente, para hacer un bypass de DEP, Data Execution Prevention. Es decir, cuando se detecta una vulnerabilidad en un software, el cual se ejecuta en un escenario con DEP como medida de protección, se puede utilizar ROP como vía para hacer el bypass a DEP. En la charla los investigadores proponían un uso diferente de ROP, proponiendo utilizarlo para lograr mejorar la evasión de antivirus y una vía alternativa al polimorfismo.

La idea principal es utilizar ROP para no levantar sospechas en la parte del antivirus. ROP puede ser utilizado para transformar cualquier shellcode proporcionada a un esquema ROP-based equivalente. En otras palabras, el objetivo de la investigación era conseguir un binario que reduzca la detección de los AV. Los investigadores enumeraron algunos desafíos para la creación de ROPInjector:

  • El nuevo fichero PE debería ser eficiente en la evasión de AV. Es decir, bajar el ratio de detección frente a otras técnicas de evasión, como las que pueden ser utilizadas por Veil-Evasion, Shellter o Payday
  • El fichero PE benigno dónde se realizará la inyección no debe estar corrupto. 
  • La herramienta ROPInjector fue planteada como genérica. Es decir, otros podrán añadir shellcodes. 

ROPInjector tiene una serie de etapas que deben ser validadas para generar el binario malicioso. Las etapas que utiliza la herramienta para su funcionamiento fueron enumeradas en la charla y son las siguientes:
  • Análisis de la shellcode. Ésta debe ser para arquitecturas x86. 
  • Encontrar ROP gadgets en el fichero PE.
  • Transformar la shellcode en un ROP chain equivalente.
  • Inyectar en el fichero PE los ROP gadgets, si son requeridos.
  • Ensamblar ROP chain en el fichero PE.
  • Generar el fichero final (PE Patching).
En la siguiente imagen se muestra cómo queda la estructura, antes y después de la inyección de ROP y el parcheo del binario final. 


Durante la presentación de la charla los investigadores mostraron una evaluación que hicieron de su herramienta a través de la manipulación de 9 binarios legítimos. Los binarios utilizados fueron Firefox.exe, java.exe, AcroRd32.exe, cmd.exe, notepad++.exe, etcétera. Como se ve binarios conocidos y utilizados en el día a día. El estudio y evaluación utilizaba varias técnicas y combinaciones:
  • Sin parchear, es decir, fichero original.
  • ROP’ed shellcode & run last.
  • ROP’ed shellcode & delayed execution (20 segundos de delay). 
  • Shellcode sin alterar.
Utilizaron Virus Total para comprobar el ratio de detección y los resultados pueden ser vistos en la siguiente gráfica. La shellcode que utilizaron fue un reverse TCP Shell:


PoC: Probando ROPInjector

Decidí probar la herramienta, la cual se puede obtener desde Github y solo se necesita compilar. El objetivo era probar qué resultados obtendría y si conseguiríamos obtener un ratio de detección bajo o aceptable. Una vez compilada la herramienta se puede lanzar de manera sencilla a través de la siguiente instrucción: ropinjector.exe [fichero PE benigno] [shellcode a inyectar] [fichero PE malicioso a generar] [opciones*]. 

Cuando bajamos ROPInjector vienen 3 shellcodes dentro de la carpeta con mismo nombre. Añadir shellcodes es sencillo y para el tercer ejemplo que mostraré a continuación añadí una shellcode que se puede obtener de exploit-db.


Caso 1: Shellcode opencalc.bin

Dentro de la carpeta shellcodes encontramos un fichero denominado opencal.bin. Generamos un fichero PE malicioso con ROPInjector, el cual haya insertado dicha shellcode en el binario resultante. Al subirlo a Virus Total se obtiene un resultado bastante interesante 4 de 56 motores AV han detectado el fichero como malicioso.


Caso 2: shell inversa TCP

Dentro de la carpeta shellcodes se encuentra el fichero revshell.txt, el cual contiene una shellcode que ejecutará una shell y se conectará de forma inversa a nosotros, cuando el binario sea ejecutado. Tras crear el binario con ROPInjector y subirlo a Virus Total observamos un resultado de 17 de 56 motores AV detectándolo. No es el mejor resultado, pero viendo el listado de AV que lo detectan se echa en falta algunos de los principales del mercado. 


Caso 3: shellcode importada

Para el último caso, importamos en un fichero txt una shellcode y la utilizamos para generar un fichero malicioso con ROPInjector. El resultado que hemos obtenido es de 2 de 56 motores AV, lo cual es un resultado muy prometedor, y prácticamente indetectable. 

Interesante herramienta que ofrece un punto de vista distinto a la hora de generar binarios maliciosos. Los resultados, aunque no se haya alcanzado el 0 de 56, se pueden entender como satisfactorios, ya que en 2 de los 3 casos probados, el código malicioso era detectado por menos del 10% de los AV. 

No hay comentarios:

Publicar un comentario