关于云函数无法回显的解答

 

前两天笔者写了一篇文章:Red Team 又玩新套路,竟然这样隐藏 C2(https://www.anquanke.com/post/id/239180)

有读者之后反馈,照着文中的方法做,虽然可以上线,但是发送命令不能正常回显。

笔者重新看了一下之后发现,确实存在这个问题,因此写出这篇文章,记录一下定位问题的过程,给出解决方案。

有些童靴可能没时间细看,笔者在此总结下,主要是以下两个问题导致云函数不能正确回显数据:

  1. 云函数自动编码
  2. 增加 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,我们依然有方法溯源到人,望耗子尾汁。

本文作者:微步在线情报组,获取完整云函数代码请关注微信公众号“微步在线研究响应中心”,回复关键词【云函数】

(完)