前两天笔者写了一篇文章:Red Team 又玩新套路,竟然这样隐藏 C2
有读者之后反馈,照着文中的方法做,虽然可以上线,但是发送命令不能正常回显。
笔者重新看了一下之后发现,确实存在这个问题,因此写出这篇文章,记录一下定位问题的过程,给出解决方案。
有些童靴可能没时间细看,笔者在此总结下,主要是以下两个问题导致云函数不能正确回显数据:
- 云函数自动编码
- 增加 post 参数传递
下面,我会详细写出问题的定位流程以及最后的解决方案。
问题定位
首先,访问下载配置文件的 URL,发现可以正常下载。通过主机可以正常上线可知,云函数的 get 转发应该是正常的。
打开 beacon 指令页面,发送一下数据看看。
发现出现了如下字样:
这意味着什么呢?意味着被控机已经收到了指令。
指令显示受控机已经呼叫了服务器,且发送了 19 byte 的数据。
但是在返回执行指令的结果数据时,转发出现了问题。
查看受控端发送的 post 数据包如下:
发现受控端正常 post 了数据,云函数也正常返回状态 200。
那应该是云函数出现了问题。
查看了一下云函数的 post 日志:
原来是云函数擅自将 body 字段的数据进行 unicode 编码了。
推测是因为 byte 的二进制字段没办法放入云函数的 dict 字典中。
所以,这里需要修改 post 上传包的 body 字段,自己手动编码一下,然后再解码后转发给 CS 服务器。(解决方案参见下文“修改方法”中的方法一)
再试一下,发现还不行。
再次进行抓包,发现 CS 的上线包 post 是带参数传输的,如图所示:
而我们在云函数中没有传递这个参数,导致虽然受控机接收到了命令,且正确发送了数据,但是云函数转发的时候丢失了这个参数,即 id=85774 这个参数。
在云函数中加上就好了。(解决方案参见下文“修改方法”中的方法一)
这样之后就能正确回显了。
另外,有读者表示,可以直接使用 api 网关进行转发。
这个思路很好,也比较简单,相较于云函数来说更容易部署。
不过笔者没有时间去复现了,不知道会出现什么问题。
云函数有更多的可拓展性,因为原则上来说,云函数可以对数据进行任意变换,甚至可以加解密等,可以对流量有更好的保护。
修改方法
// 方法一
1. 开启网关 base64 编码,并在函数中 base64 解码,body=base64.b64decode(body) 。
在网关设置中开启 base64 编码,然后只设定特定 header 触发(不然会把 get 请求也进行 base64 编码)。
然后在函数中解码传输就好了,如下:
2. 增加参数传递函数。
params=event['queryString']
resp=requests.post(cs_server_address+path,headers=headers,data=body,timeout=20,params=params)
如图所示:
// 方法二(懒人版)
开启网关 base64 编码,在网关设置中开启 base64 编码,然后只设定特定 header 触发(不然会把 get 请求也进行 base64 编码)。
然后直接复制(云函数)代码到云函数,记得更改自己的上线地址。(关注公众号“微步在线研究响应中心”,回复“云函数”,可获取完整云函数代码。)
总结
笔者本意是想通过攻击复现,帮助大家明白 RT 的各种隐藏 C2 的技巧,方便之后做对应的防守策略。
其实,实际过程中 RT 可能使用各种方法综合进行隐匿, 详情可参见:红队攻防基础建设-神隐之路 – 安全客,安全资讯平台,作者依然是我们的老朋友「风起」。
上篇文章发出后,有很多读者选择亲自动手去尝试,这个精神很好!笔者也是看到有些读者有疑问,不想直接无视,所以在某个下午继续探究了下这些问题并做出解答。
然而,不希望大家在尝试成功之后,将该类攻击用作除了 Red vs Blue 外的其他用途。若有用作任何违法用途,与本文无关。互联网并非法外之地,即使使用该方法隐藏 C2,我们依然有方法溯源到人,望耗子尾汁。
本文作者:微步在线情报组,获取完整云函数代码请关注微信公众号“微步在线研究响应中心”,回复关键词【云函数】
来源:freebuf.com 2021-04-28 11:21:26 by: Threatbook
请登录后发表评论
注册