peinjector: infecta ejecutables fácilmente y también "al vuelo"

Hace más de un año vimos la posibilidad de añadir payloads en ejecutables "al vuelo" con BDFProxy, lo que significaba para nosotros el descubrimiento de un vector de infección muy interesante durante un ataque MiTM...

Hoy os presentamos peinjector, una herramienta que también puede infectar ejecutables de Windows (PE COFF) y que además incluye un proxy (interceptor) que también es capaz de modificar los ejecutables al "vuelo" pero mucho más completo y con mayor rendimiento: parcheo más transparente, infección ELF o MACH-O, PE code cave jumping, parcheo IAT y otros métodos de parcheo más "estáticos".

Características generales:

- Soporte de archivos PE x64 y x86.
- Código abierto
- Totalmente funcional en Windows y Linux, incluyendo scripts de instalación automatizada.
- Puede funcionar en hardware embebido, probado en una Raspberry Pi 2.
- En Linux, todos los servidores se integrarán automáticamente como servicio, sin necesidad de configuración manual.
- Escrito en C plano, no se requieren librerías externas (peinjector).
- La integración MiTM está disponible en C, Python y Java. Se incluye un ejemplo de implementación en Python.
- Facilidad de uso. Cualquier persona que pueda configurar un router en casa podrá configurar el servidor de inyector.
- Creador de shellcodes integrado y de fácil uso. Todos los shellcodes disponibles en 32 y 64bits con cifrado automático opcional.
- Podemos personalizar nuestro propio código shell e inyectarlo directamente o como un nuevo thread.

Características de funcionamiento:

- Elimina las comprobaciones de integridad tales como los checksums de la cabecera del PE, certificados, force-check-checksum-flag, ...
- Intenta inyectar el shellcode al final de la sección del ejecutable. Esto es posible debido al gap entre el valor SizeOfRawData y VirtualSize.
- Intentar redimensionar el tamaño de la sección del ejecutable e inyectar ahí el shellcode. Esto es posible debido al gap entre el valor FileAlignment y SectionAlignment.
- Inserta una nueva sección e inyecta ahí el shellcode.
- Trata de descubrir si el ejecutable puede detectar la infección (por ejemplo, configuraciones NSIS) y salta el ejecutable.
- Genera un nombre aleatorio para las secciones creadas por el flag del "nuevo nombre de la sección".
- Cifra el payload con claves aleatorias. El stub de descifrado es generado y ofuscado individualmente sobre la marcha para cada inyección, utilizando el motor polimórfico integrado.
- Inyecta el shellcode con uno de los métodos seleccionados e inserta un salto ofuscado al payload en otra sección. En principio el PE no apunta al shellcode porque puede aumentar la tasa de detección heurística de algún AV (por defecto: OFF).


                                  + configuration                  
                                  | payload                        
                                  | ...                            
                      +-----------v------------+                   
      +-------+       |                        |                   
      | PATCH <-------+      libpeinfect       <--+                
      +-------+       |                        |  |                
                      +-----------+------------+  |                
                                  |               |                
                      +-----------v------------+  |                
                      |                        |  |                
      +--------------->       libpetool        |  |                
      | change values |                        |  |                
      | add sections  +-----------^------------+  |                
      | resize sect.              |               |                
      + ...                  +----v----+          |                
                             | PEFILE  +----------+                
                             +----^----+                           
                                  |                                
                      +-----------v------------+                   
      PE File data    |                        |    PE File data   
      +--------------->       libpefile        +--------------->   
                      |                        |                   
                      +------------------------+   

libpefile

Proporciona el análisis de archivos PE, modificación y capacidades de volver a montarlo basándose en la especificación PE COFF. También funciona con muchos archivos no conformes y deliberadamente mal formados que el loader de Windows acepta.

libpetool

Proporciona modificaciones más complejas (añadir/cambiar el tamaño de las secciones). Mantiene compatibles los valores de la cabecera PE COFF.

libpeinfect

Proporciona diferentes métodos de infección, elimina comprobaciones de integridad, certificados, etc. Puede infectar totalmente un archivo (de forma estática, por ejemplo, desde el disco) o generar un parche (para la infección por MITM). Los conectores que trabajan con estos parches están disponibles en C, Python y Java. El archivo infectado mantiene su funcionalidad original.

Arquitectura:

Peinjector incluye de tres componentes: servidor, interfaz web (webgui) y proxy. Los puertos por defecto que se utilizan son:

- 3333: python webserver (GUI)
- 31337: puerto de datos de peinjector (communication proxy <-> peinjector)
- 31338: puerto de control de peinjector (communication GUI <-> peinjector)
- 8080: proxy

                                      +-----------------+-+
                                      |   web browser   |X|
            +-------------+           +-----------------+-+
            | peinjector- |           |       _____       |
    ------->+ interceptor +---------> |      /     \      |
    -orig.->+   (MITM)    +-patched-> |     | () () |     |
    -data-->+             +-data----> |      \  ^  /      |
    ------->+ +---------+ +---------> |       |||||       |
            | |connector| |           |                   |
            +-+-+-----^-+-+           +-----+------^------+
         raw    |     |              send   |      | get   
         header |     | patch        config |      | status
                |     |                     |      |       
            +-+-v-----+-+-+           +-+---v------+---+-+ 
            | |data port| |           | |http(s) server| | 
            | +---------+ |           | +--------------+ | 
            | peinjector  |           |                  | 
            | (core   +---+ crtl      +---+ peinjector-  | 
            | engine) |c p| protocol  |c p| control      | 
            |         |r o+----------->r r| (user        | 
            |         |t r<-----------+t o| interface)   | 
            |         |l t|           |l .|              | 
            +---------+---+           +---+--------------+ 

Instalación:

Descargamos el repositorio de Github:

git clone https://github.com/JonDoNym/peinjector

Instalamos peinjector-server que provee parcheo de ejecutables como servicio:

cd /pruebas/peinjector/peinjector/install/
sudo chmod a+x peinjector_install.sh
sudo ./peinjector_install.sh

root@kali:~/pruebas/peinjector/peinjector/install# service peinjector status
â peinjector.service - LSB: peinjector server
   Loaded: loaded (/etc/init.d/peinjector)
   Active: active (running) since Mon 2015-09-14 04:38:18 EDT; 40s ago
  Process: 1970 ExecStart=/etc/init.d/peinjector start (code=exited, status=0/SUCCESS)
   CGroup: /system.slice/peinjector.service
           ââ1974 /usr/bin/peinjector --server
       
Instalamos peinjector-control que administra el servidor de peinjector vía webgui:

cd /tmp/peinjector/pe-injector-control/install/
sudo chmod a+x peinjector-control_install.sh
sudo ./peinjector-control_install.sh


root@kali:~/pruebas/peinjector/pe-injector-control/install# service peinjector-control status
â peinjector-control.service - LSB: peinjector-control server
   Loaded: loaded (/etc/init.d/peinjector-control)
   Active: active (running) since Mon 2015-09-14 04:40:36 EDT; 58s ago
   CGroup: /system.slice/peinjector-control.service
           ââ2109 python3 ./peinjector_control.py

Sep 14 04:40:36 kali peinjector-control[2105]: Start peinjector-control server

Instalamos peinjector-interceptor que es el proxy MiTM con el conector de peinjector:

cd /tmp/peinjector/pe-injector-interceptor/install/
sudo chmod a+x peinjector-interceptor_install.sh
sudo ./peinjector-interceptor_install.sh

root@kali:~/pruebas/peinjector/pe-injector-interceptor/install# service peinjector-interceptor status
â peinjector-interceptor.service - LSB: peinjector-interceptor server
   Loaded: loaded (/etc/init.d/peinjector-interceptor)
   Active: active (running) since Mon 2015-09-14 04:43:38 EDT; 24s ago
  Process: 6252 ExecStart=/etc/init.d/peinjector-interceptor start (code=exited, status=0/SUCCESS)
   CGroup: /system.slice/peinjector-interceptor.service
           ââ6256 python2 ./peinjector_interceptor.py

Sep 14 04:43:38 kali peinjector-interceptor[6252]: Start peinjector-interceptor server

Hardening

Cambia el certificado del interfaz web por uno propio:

sudo openssl req -new -x509 -keyout /etc/peinjector-control/cert_example_do_not_use_this.pem -out /etc/peinjector-control/cert_example_do_not_use_this.pem -days 365 -nodes
sudo service peinjector-control stop
sudo service peinjector-control start

Configura una contraseña en el gui:

1. Ve a https://{your_ip}:3333/settings.htm
2. Pon una contraseña para el usuario 'admin'
3. Activa la autenticación (enable authentication)
4. USER: admin; PASS: {your_pass}

Asocia los puertos de peinjector a localhost para que sólo el webgui y el proxy puedan conectarse al servidor de peinjector (recomendable):

1. Ve a https://{your_ip}:3333/injector.htm
2. Haz clic en el botón local (interfaz de control)
3. Haz clic en el botón local (interfaz de datos)
4. Haz clic en el botón de reinicio para reiniciar el peinjector

Uso (demo):

1. Visitamos https://{your_ip}:3333



2. Navegamos a "shellcode" y nos desplazamos abajo a demo (calc).


3. Hacemos clic en "create and send shellcode".



4. Configuramos el navegador para usar el proxy {your_ip}:8080


5. Descargamos cualquier ejecutable, en nuestro ejemplo puttygen.exe.


6.  Ejecutamos el fichero exe y comprobamos como el payload ejecuta en segundo plano también la calculadora.


...y cómo podéis ver a continuación, el fichero infectado es casi FuD }:-)



Comentarios