关于木马免杀

1.工具篇

1.1Cobalt Strike及其二开

Cobalt Strike 是一款基于java语言开发的渗透测试神器,常被业界人称为CS神器。(webshell管理、shellcode的生成、钓鱼网站生成、多人团队攻击侧服务器搭建,总之功能非常多)

官方网站:

1
https://www.cobaltstrike.com/

官方文档:

1
https://hstechdocs.helpsystems.com/manuals/cobaltstrike/current/userguide/content/topics/welcome_main.htm#_Toc65482705

关于cs的二次开发,包括修改profile文件、修改默认的证书、

安装插件 CrossC2-GithubBot-2021-11-02.cna

魔改cs目的是修改其特征防溯源,或是替换模板让其生成的payload直接达到免杀效果,以及添加实用的插件功能。

主要内容包括:

  • 配置特征消除(50050改成其他端口、修改cs的ssl证书、改profile文件)

  • 上线流量特征消除

采用默认http(s)的CS请求url为4位字符串(如aaa9),将这4位字符串作为传入,通过算法checksum8会得到92(93),蓝队可以以此判定为CS连接器为了

防止这一点,可以自定义字符串(如xiaodi),通过checksum8得到其值(比如是115),那么再替换CS源码中的92为115即可

  • 生成payload特征消除

    比如对http(s)生成payload做特征消除,用x86资源bin替换x64的,实现x64生成与x86一致,实现生成即免杀(结合之前的免杀技术效果更好)

    对Powershell生成Payload做特征消除,用x86资源ps1替换原本ps1,实现生成即免杀(结合之前的免杀技术效果更好)

profile文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
##基本语法

# this is a comment , # 是注释
# 设置全局变量 , 和其他无关是cs自身的一些机制
set global_option "value";
# 协议的配置 , 如: http-get , https-post等

# 代码块
protocol-transaction {
set local_option "value";
client {
# customize client indicators
}
server {
# customize server indicators
}
}

内容基本上是关于set和一些协议上的配置。

下面会以 jquery-c2.4.5-jx.profile 文件为例来解释其中的各个配置项的作用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
# Malleable C2 Profile
# Version: CobaltStrike 4.5
# File: jquery-c2.4.5.profile
# Description:
# c2 profile attempting to mimic a jquery.js request # uses signed certificates
# or self-signed certificates
# Authors: @joevest, @andrewchiles, @001SPARTaN ### Global Option Block

# 设置全局变量 sample_name , 值是当前文件名
set sample_name "jQuery CS 4.5 Profile";
# 设置心跳包的时间 , 单位毫秒
set sleeptime "1000"; # 45 Seconds 1000毫秒==1秒
# set sleeptime "<60000>"; # 1 Minute , 默认的

# 设置心跳包时间的波动范围 45 +- 45*37%
set jitter "50"; # % jitter 1 +- 1*50%

# 意味着每次HTTP服务器响应时,都会附加一个长度在0到100个字符之间的随机字符串。这样做的目的是为了增加服务器响应的大小的不可预测性,使得Cobalt Strike的通信模式更难以通过网络监控工具被识别和分析。
set data_jitter "100";

# 设置全局的UA头
set useragent "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36";

##https-certificate ssl证书配置

https-certificate {

set C "US"; #国家
set CN "jquery.com";
set O "jQuery";
set OU "Certificate Authority";set validity "365";

set keystore "cobaltstrike.store"; # 证书文件
set password "1qazwsx"; # 证书密码
}


##SMB和TCP , smb会在横向渗透使用到

### SMB Beacon
set pipename "mojo.5688.8052.183894939787088877##";
## smb管道的名字

set pipename_stager "mojo.5688.8052.35780273329370473##";
# smb stager管道的名字
set smb_frame_header "\x80";

### TCP Beacon 监听端口
set tcp_port "42585";
set tcp_frame_header "\x80";

##DNS beacon , 不经常使用 , 但是对于只有DNS协议出网的设备可以使用

dns-beacon {

set dns_idle "74.125.196.113";
## 第一次dns查询的地址
set dns_max_txt "252";
## 最大查询次数 , 255以下 , 能被4整除
set dns_sleep "0";
## sleep时间
set dns_ttl "5";
## ttl值
set maxdns "255";
# 最大dns服务转接数量
set dns_stager_prepend ".resources.123456.";
## 使用dns协议的马,pe头追加的内容
set dns_stager_subhost ".feeds.123456.";
## 子域名的查询配置
# DNS subhosts override options, added in version 4.3
set beacon "a.bc.";
set get_A "b.1a.";
set get_AAAA "c.4a.";
set get_TXT "d.tx.";
set put_metadata "e.md.";
set put_output "f.po.";
set ns_response "zero";
}

算了,不水字数了,基本上协议都眼熟,看不懂度娘一下。

profile特征的修改参考以下项目:

1
2
3
4
https://github.com/threatexpress/malleable-c2
https://github.com/xx0hcd/Malleable-C2-Profiles
https://github.com/Tylous/SourcePoint
https://wbglil.gitbook.io/cobalt-strike/cobalt-strikekuo-zhan/malleable-c2

重写Stager和Beacon参考大牛

1
2
3
4
5
6
7
8
9
10
11
12
鸡哥的项目:
https://bbs.pediy.com/thread-269115.htm
https://github.com/mai1zhi2/SharpBeacon/tree/master

WBGlIl大神的项目
https://xz.aliyun.com/t/9929

LiHua大佬的
https://github.com/NoOne-hub/Beacon.dll

go项目
https://github.com/darkr4y/geacon/tree/4.0

最后一定要检查是否可用

1
2
3
4
chmod+x c2lint
./c2lint [/path/to/my.profile]
# 如 ./c2lint bing_jx.profile
# 进行各种协议 如 smb , http , https的请求模拟 , 判断是否可用 , 请求结束下面会有结果输出 (黄色警告,红色语法错误)

图片

修改默认服务端口

1
2
3
4
5
6
vim teamserver
##只需要修改最后一行的-Dcobaltstrike.server_port
## ,可以是 80 , 443 , 3389 , 8080, 8443等常见端口 (1-65535)
# start the team server.
java -XX:ParallelGCThreads=4-Dcobaltstrike.server_port=8080-Djavax.net.ssl.keyStore=./cobaltstrike.store -Djavax.net.ssl.keyStorePassword=Microsoft -server-XX:+AggressiveHeap -XX:+UseParallelGC -classpath ./cobaltstrike.jar
server.TeamServer $*

修改ssl证书

1.购买域名,申请免费的ssl证书

2.修改teamserver证书密码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
##查看默认证书
keytool -list-v-keystore cobaltstrike.store
Picked up _JAVA_OPTIONS: -Dawt.useSystemAAFontSettings=on -Dswing.aatext=true 输入密钥库口令:
# 默认口令是 Microsoft

##生成伪造证书

# 原ssl证书文件备份
mv cobaltstrike.store cobaltstrike.store.bak
# 生成证书
keytool -keystore cobaltstrike_new.store -storepass 1qazwsx -keypass 1qazwsx -genkey-keyalg RSA -alias qq.com -dname"CN=US,OU=qq.com,O=Software,L=Somewhere,ST=Cyberspace, C=CN"
# ssl证书重命名
mv cobaltstrike_new.store cobaltstrike.store

##然后在teamserver中设置即可

-Djavax.net.ssl.keyStore=./cobaltstrike.store # 注意密码

虽然伪装的证书可以欺骗fofa这类搜索引擎 , 但是毕竟是伪造的 , 使用ssl证书查询工具是查询不到颁发

机构的 , 因为是我们自己生成的, 真正的证书是证书签发机构颁布的 , 腾讯云购买域名就可以免费申请

ssl证书, 不过要实名备案 , 推荐Cloudflare , letsencrypt或各国外云服务提供商不需要实名备案

CrossC2插件

cs默认是不支持上线linux主机的 , 但是可以通过安装CrossC2插件实现

因为一些原因,目前强制只支持HTTPS beacon。

下载地址

1
https://github.com/gloxec/CrossC2/releases

1.2sgn编码器

SGN是一个用于进攻性安全目的的多态二进制编码器,其核心是生成静态不可检测的二进制payloads。该项目基于线性反馈移位寄存器(LFSR)的工作原理,但相比原版,它提供了更多的改进和增强功能,如64位支持、更小的解码器、无明显循环条件的解码过程等。(对cs生成的shellcode进行加密)

github:

1
https://github.com/EgeBalci/sgn

图片

1.3SkyShadow

从本机获取微软 DLL 列表,并快速生成指定文件夹下所有 EXE 的 Unique DLL Hijacking Payload,用于伪造DLL文件。

白加黑简单来说就是通过白名单的exe运行来去加载恶意的dll达到shellcode加载的目的,那么就需要利用工具对exe加载的dll进行了解。

1
https://github.com/Librafeng/SkyShadow

1.4ZeroEye

用于扫描 EXE 文件的导入表,列出导入的DLL文件,并筛选出非系统DLL,符合条件的文件将被复制到特定的 binX64binX86 文件夹,并生成 Infos.txt 文件记录DLL信息。是和skyshadow一样类型的工具,都是ZeroEye更偏自动化一点,而skyshadow更方便手动制作dll劫持。(后面有时间再补充白加黑的内容)

1
https://github.com/ImCoriander/ZeroEye

2.免杀手法(骚操作)