在上一篇解说 C2Profile 解析的时分,曾经提到过如何断入到真正的 beacon.dll 当中,并且也分明了它执行时的调用次第,Beacon 上线的一切流程也都是在第二次主动调用 DLLMain 时执行的。
由于主要阐明的是上线流程,功用性的暂且不提,但是中间会交叉 C2Profile 的读取操作。
0x01 Beacon 发送
经过导入表可以很明显的看到通讯相关的函数,所以就直接在关键函数上下断
首先调用 InternetOpenA 传入了 agent
接着是 InternetConnectA 传入 IP 与端口
之后便是 HttpOpenRequestA 传入了恳求类型和 URI
最后便是 HttpSendRequestA 发送恳求了,很明显能看到 COOKIE 曾经被加密了
接下来就需求往回跟,看它是从哪里停止加密的,最终发现,在进入功用性的 while 循环之前,就曾经完成了信息搜集和加密操作
这里也就顺带理一下 C2Profile 的解析,在加密之前,会先从 C2Profile 中取出一个值
回到 BeaconPayload 查一下 index 为 7 的就是 publickey,这也就阐明了,在取值的时分是经过 index 来取对应内容的
然后剖析一下 GetPtrValue,这里用 F5 就很不友好了,还是看汇编更容易了解一些
中间的 GetValue 也就是依据 index,取出来其中的值,并返回
整体下来的逻辑就是,依据 index 跳到对应的偏移,前八个字节用来判别类型,后八个字节是取出真正的值或地址,其他几个类型的取值也是一样的。
到这里为止,关于 C2Profile 的全部逻辑也就理分明了,之后就能够对 BeaconEye 停止剖析了。
0x02 TeamServer 处置
在 TeamServer 中运用了 NanoHTTPD 库来处置 HTTP 恳求,并且写了一个 WebServer 类,继承了 NanoHTTPD,并在里面写了处置函数,我们就直接在这个位置下断即可
在接到流程以后,继续往下跟,会跟入 MalleableHook.serve(),它实践上调用的是 BeaconHTTP.serve(),在这里停止理解析操作
到这里也就到了真正处置的中央了,它判别了长度能否是 128 位
跟进以后,直接就停止理解密操作
直接初始化私钥,然后停止解密
随后判别了标志位 48879,然后读取长度,看能否小于 117,接着把剩余的字符返回
接着会保存前 16 个字节,然后 16-20 判别字符集
之后在获取了 Listener 的名字以后,就来初始化 BeaconEntry 了
就是不时从中间取值,所以 metadata 主要的作用就是填写 Beacon 所需求的信息
接着调用 this.getSymmetricCrypto().registerKey 办法来注册加密 Key,这里传入的 var8 就是刚开端保存的前十六个字节
会先判别当前 BeaconId 能否存在,存在的话会直接 return,假如是第一次上线的话,肯定是不存在的,然后将传进来的十六字节 sha265,前一半作为 AESKey,后一半作为 HmacSHA256Key,接着将他们与 BeaconId 做成 Map
最后就调用 sendResponse 返回信息了
0x03 流程图
文章首发公众号平台
感谢您的来访,获取更多精彩文章请收藏本站。
![](https://www.gyzsq.com/wp-content/uploads/2022/07/9259adea4619.gif)
1 本站一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
2 本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
3 本站资源大多存储在云盘,如发现链接失效,请联系我们我们会第一时间更新。
![头像](/wp-content/themes/zibll/img/avatar-default.png)
- 最新
- 最热
只看作者