Google Docs成为Google SOCKS:通过Google Drive实现C2通信
Luke Baggett //
如果你监控一个具有互联网访问权限的网络,几乎不可避免地会看到大量与Google服务器之间的流量。通过使用Google作为中继与Google流量混合,可能帮助攻击者避免检测。
攻击者如何利用Google作为中继?一种方法是使用Drive API,该API允许通过Google Drive自动上传和下载数据。这个API简单快速,足以在两个系统之间实现相对可靠的通信。SSH、Metasploit Meterpreter会话等都可以通过此API在Google服务器上进行中继。
我创建了一个名为google_socks.py的脚本作为概念验证。该脚本启动一个Python socket对象,来自socket的每组新数据都以特定名称作为新文件推送到drive。每个脚本通过文件名知道要读取哪些文件。下图说明了两个系统如何通过此方法进行通信。
左侧的客户端读取名为"File 2"的文件,并创建名为"File 1"的新文件。右侧的客户端执行相反的操作。使用此方法时,两个socket应该能够像直接连接一样运行,但具有额外的延迟。
这到底效果如何?让我们看几个演示:
基本数据传输和Shell
在此视频中,两个google_socks.py脚本都在本地端口监听Netcat客户端。这些脚本然后在它们的socket和Google Drive之间转发数据,允许Netcat客户端进行通信。
参数"-P 0.2"指定0.2秒的轮询间隔,"-j 0"指定0轮询随机化(也称为抖动),"-c 0"告诉脚本使用脚本中存储的第零组凭据。这样做有助于防止API请求速率限制,当一个API客户端每秒向服务器发送超过10个查询时会发生这种情况。
SSH
使用Google Drive作为中继存在权衡。你获得高吞吐量,但也有高延迟。当使用需要快速连续发送和接收小数据包的东西(如SSH)时,这一点变得更加明显。
在上面的视频中,有一个google_socks.py实例监听本地端口9090,另一个实例连接到端口22上的远程SSH服务器。SSH客户端然后连接到本地端口9090,流量通过Google Drive转发到远程SSH服务器。
Meterpreter
Linux主机:192.168.56.1 Windows VM:192.168.56.101 Kali VM:192.168.56.102
在此演示中,Meterpreter通过Google Drive与multi-handler通信。Kali VM生成一个Meterpreter有效载荷,该载荷连接到192.168.56.1端口9090的Linux主机。Linux主机监听192.168.56.1端口9090,然后将数据转发到Google Drive。另一个google_socks.py脚本将数据从Drive中继到Kali VM上192.168.56.102端口9090的multi-handler。
有效载荷在Windows VM上执行,Meterpreter会话打开。需要一些时间才能完全加载,以便meterpreter接受命令,这就是为什么进程列表命令最初失败的原因。截图命令运行,并且工作完美。
想自己尝试吗?你可以在我的github上下载PoC脚本。
你需要运行–setup,这将解释如何为自己设置API访问权限。
以下是一些关于python客户端库的好资源:
https://google.github.io/google-api-python-client/docs/epy/googleapiclient-module.html https://developers.google.com/resources/api-libraries/documentation/drive/v3/python/latest/index.html https://developers.google.com/resources/api-libraries/documentation/drive/v2/python/latest/index.html