关于CS流量行为
首先生成一个payload,在虚拟机中启用wireshark之后直接执行,可以捕获一个完整的流量信息。


上线之后执行 whoami,然后退出
打开 wireshark,过滤对话,通过 C2 地址可以过滤出 Cobalt Strike 的流量。我这里按照传递数据包的大小排序了,可以看到最上面有一个传递 payload (攻击载荷,Beacon)的会话。

随后过滤相关数据包,直接推荐直接使用ip来过滤,防止漏掉会话流

我这里因为执行了sleep 0,所以流量看起来非常不清晰,所以这里我重新抓包分析。

随后加上http协议过滤,可以看到业务流程

首先是checksum8,这个原理来自这两处
metasploit-framework/uri_checksum.rb at master · rapid7/metasploit-framework (github.com)
Cobalt Strike: Using Known Private Keys To Decrypt Traffic – Part 2 – NVISO Labs[

我们可以看到没有检测出我刚刚创建的 payload 存在该特征,但是示例中的URI确实被检测出该特征。而且在另一次实验中获取的该值也符合该设定。所以暂且按下不表。

可以看到这个是符合 CS x64 特征的,而且我确实生成的是该类木马。

从流量中来看,第一个数据包直接传输 CS 的 Beacon,并且没有加密流量,因为 Beacon本身就是需要自解密的。

第二个数据包中就出现了Cookie字段,里面存放的是一段 Base64 之后的数据。这段数据被称之为元数据。

分析元数据的部分参考这篇文章
CS Beacon通信分析 - Cobalt Strike (gitbook.io)
https://wbglil.gitbook.io/cobalt-strike/cobalt-strike-yuan-li-jie-shao/cs-mu-biao-shang-xian-guo-cheng
首先我们反编译cobaltstrike.jar找到 HTTP Beacon每次回连发送元数据请求时使用的方法,Cobalt Strike关于Beacon GET处理的核心代码在BeaconHTTP里。

从代码中分析就可以知道,元数据本质上是 Beacon 本地产生一个 16 byte的数据,该数据做 SHA-256 处理之后,前16位作为AES秘钥,16-32位作为HmacSHA256,用于加解密传递的数据。

元数据本身则通过 RSA 公钥加密,这样 C2 就和 Beacon 完成了秘钥协商,接下来通过检查任务列表中是否存在任务,存在任务则下发任务,Beacon完成任务之后,通过POST返回执行之后的结果。

接下来,我们就需要获取到本地的 RSA 公钥,然后就可以解密并生成 AES 的 key,并以此来解密流量。
首先找到cobaltstrike.beacon_keys文件,然后打开它,可以发现它是一个序列化之后的文件。

同样的从代码中找到解析文件的地方,使用它的方法来获取 key。

(KeyPair) CommonUtils.readObject(file, null));
使用BeaconTool直接解析出公私钥。

darkr4y/geacon: Practice Go programming and implement CobaltStrike's Beacon in Go (github.com)
随后RSA解密元数据,并且按照代码中的格式解析,就可以计算出 AES 的 key 和一些额外信息

接下来,在某个心跳包的回包中,我们就可以发现我们的服务器对受控终端发出了一条指令。

解密就可以看到我们服务器下发的指令

至于%COMSPEC%就是 cmd.exe 的绝对路径。
接下来就可以顺理成章的解密返回数据。
对应的返回数据包

对应的解密数据

我有一个用户工厂。我希望默认情况下确认用户。但是鉴于unconfirmed特征,我不希望它们被确认。虽然我有一个基于实现细节而不是抽象的工作实现,但我想知道如何正确地做到这一点。factory:userdoafter(:create)do|user,evaluator|#unwantedimplementationdetailshereunlessFactoryGirl.factories[:user].defined_traits.map(&:name).include?(:unconfirmed)user.confirm!endendtrait:unconfirmeddoenden
两个gsub产生不同的结果。谁能解释一下为什么?代码也可在https://gist.github.com/franklsf95/6c0f8938f28706b5644d获得.ver=9999str="\tCFBundleDevelopmentRegion\n\ten\n\tCFBundleVersion\n\t0.1.190\n\tAppID\n\t000000000000000"putsstr.gsub/(CFBundleVersion\n\t.*\.).*()/,"#{$1}#{ver}#{$2}"puts'--------'putsstr.gsub/(CFBundleVersio
我在一段非常简单的代码(如我所想)中得到了一个错误的值:org=4caseorgwhenorg=4val='H'endputsval=>nil请不要生气,我希望我错过了一些非常明显的东西,但我真的想不通。谢谢。 最佳答案 这是典型的Ruby错误。case有两种被调用的方法,一种是你传递一个东西作为分支的基础,另一种是你不传递的东西。如果您确实在case中指定了一个表达式语句然后评估所有其他条件并与===进行比较.在这种情况下org评估为false和org===false显然不是真的。所有其他情况也是如此,它们要么是真的,要么是假的。
假设您在Ruby中执行此操作:ar=[1,2]x,y=ar然后,x==1和y==2。是否有一种方法可以在我自己的类中定义,从而产生相同的效果?例如rb=AllYourCode.newx,y=rb到目前为止,对于这样的赋值,我所能做的就是使x==rb和y=nil。Python有这样一个特性:>>>classFoo:...def__iter__(self):...returniter([1,2])...>>>x,y=Foo()>>>x1>>>y2 最佳答案 是的。定义#to_ary。这将使您的对象被视为要分配的数组。irb>o=Obje
我是Cucumber测试的新手。我创建了两个特征文件:events.featurepartner.feature并将我的步骤定义放在step_definitions文件夹中:./step_definitions/events.rbpartner.rbCucumber似乎在所有.rb文件中查找步骤信息。有没有办法限制该功能查看特定的步骤定义文件?我之所以要这样做,是因为即使我使用了--guess标志,我也会遇到不明确的匹配错误。我之所以要这样做,有以下几个原因。我正在测试CMS,并希望在不同的功能中测试每种不同的内容类型(事件和合作伙伴)。事件.特征Feature:AddpartnerA
我在思考流量控制的最佳实践。我应该走哪条路?1)不要检查任何东西并让程序失败(更清晰的代码,自然的错误消息):defself.fetch(feed_id)feed=Feed.find(feed_id)feed.fetchend2)通过返回nil静默失败(但是,“CleanCode”说,你永远不应该返回null):defself.fetch(feed_id)returnunlessfeed_idfeed=Feed.find(feed_id)returnunlessfeedfeed.fetchend3)抛出异常(因为不按id查找feed是异常的):defself.fetch(feed_id
我经常将预配置的lambda插入可枚举的方法中,例如“map”、“select”等。但是“注入(inject)”的行为似乎有所不同。例如与mult4=lambda{|item|item*4}然后(5..10).map&mult4给我[20,24,28,32,36,40]但是,如果我制作一个2参数lambda用于像这样的注入(inject),multL=lambda{|product,n|product*n}我想说(5..10).inject(2)&multL因为“inject”有一个可选的单个初始值参数,但这给了我......irb(main):027:0>(5..10).inject
我希望访问我机器上的所有HTTP流量(我的Windows机器-不是服务器)。据我了解,拥有一个本地代理是所有流量路线的必经之路。我一直在谷歌搜索但未能找到任何资源(关于Ruby)来帮助我。非常感谢任何提示或链接。 最佳答案 WEBrick中有一个HTTP代理(Rubystdlib的一部分)和here's一个实现示例。如果你喜欢生活在边缘,还有em-proxy伊利亚·格里戈里克。这postIlya暗示它似乎确实需要一些调整来解决您的问题。 关于ruby-如何捕获所有HTTP流量(本地代理)
defreverse(ary)result=[]forresult[0,0]inaryendresultendassert_equal["baz","bar","foo"],reverse(["foo","bar","baz"])这行得通,我想了解原因。有什么解释吗? 最佳答案 如果我使用each而不是for/in重写它,它看起来像这样:defreverse(ary)result=[]#forresult[0,0]inaryary.eachdo|item|result[0,0]=itemendresultendforainb基本上就
完成这个有困难。我正在使用seed.rb+factory_girl来使用rakedb:seed填充数据库。(我知道固定装置存在,但我想以这种方式完成,这只是一个示例,数据库将填充复杂的关联对象。)我的种子.rb:require'factory_girl_rails'["QM","CDC","SI","QS"].eachdo|n|FactoryGirl.create(:grau,nome:n)end还有我的/factories/graus.rbFactoryGirl.definedofactory:graudonomeendend但是当我运行时:rakedb:seed我得到:rakeab