区块链攻击利用技术拓展
译文声明

本文是翻译文章,文章原作者Adam Chester,文章来源:mdsec.co.uk                                
原文地址:https://www.mdsec.co.uk/2019/01/activebreach-powered-by-the-blockchain/                   


译文仅供参考,具体内容表达以及含义原文为准

译者前言:本篇文章描述了一种利用区块链来用作C2的新型技术

无论你是做哪一方面的, 都不难否定区块链对我们日常生活的影响有多大。作为数字货币革命的中坚力量, 区块链已经变得越来越强大, 已经被认为是互联网未来革命的研究方向。在攻击拓展时, 我们一直在考虑合适的时机转移到区块链, 我们自豪地宣布, 我们正朝着实现这一目标的方向前进

OK. . . 就这样,那么什么是区块链呢?

很抱歉我不会将这部分内容放到这里,我不知道区块链什么时候成为了营销流行语,但有很多东西声称是“Powered by The Blockchain”, 我想深入区块链以了解攻击者是否有其他的攻击方式。

在这篇文章中,我们将探索以太坊智能合约,并探索在区块链上实施C2的潜在方式。 但在我们开始之前,我们需要了解以太坊的一些基础知识,以帮助你能够理解文章的其余部分。

 

以太坊智能合约

你可能在以太币中听说过以太坊,这种货币类似于比特币。你也可能遇到过Blockchain的概念,它作为许多加密货币的分布式账单。然而,我发现使用以太坊非常酷的一个领域是智能合约的概念。对智能合约的过度简化是将其视为旨在实现资金转移处理自动化的应用程序,该资金转移时不会被篡改或破坏。例如,想象一下在某个特定日期之间在多方之间分配储蓄的过程。一种传统的方法是让一个信任的人或公司在日期到来时完成这种转移,但这带来了某些明显的风险。如果这个人只是决定但不转移怎么办?或者,如果信任公司在转移日期之前解散了怎么办?这就是智能合约发挥作用的地方,是一个小型不可变程序,只需执行编译代码而无需手动交互。所以根据上面的例子,应用程序将用以太网转账,然后在特定日期将资金转移到一组钱包,除了创建者(或者如果DAO示例是任何东西都能通过,则是具有安全意识的个人)之外的任何人的合约之外。

要开始与以太坊的智能合约进行交互,我们需要安装一些工具。我们将使用的第一个工具是Mist,可以在这里从Github下载。 Mist提供了一个图形用户界面,用于开发和部署以太坊区块链的智能合约,还附带了一个IDE,用于调试你的Solidity代码。

如果你更喜欢命令行,可以安装许多有用的工具来帮助你开发和部署智能合约,包括Geth,这是一个在GO中编码的命令行界面,用于与以太坊交互。

安装客户端后,我们需要连接到网络。为了避免在我们的测试过程中弄乱以太坊区块链并为我们节省一些以太币,我们将使用一个测试网络。在这篇文章中,我们将使用Ropsten测试网络,因为在撰写本文时,Rikeby测试网络不可用。

由于我们在测试网络上运营,没有真正的资金将被交换,这意味着我们可以创建一个帐户并通过faucet添加资金。对于Ropsten,我们可以使用https://faucet.ropsten.be/。随着钱包的创建和从faucet添加以太币,我们可以开始创建一些将在区块链上执行的代码。我们来看看Solidity。

 

Solidity

Solidity是一种面向对象的编程语言,可用于开发以太坊的智能合约。 这种语言相对简单,对于之前在OOL中开发的人来说看起来很熟悉。 我们来看一个简单的例子:

在这里,我们看到Solidity代码,它将在其状态中存储数据变量。 我的意思是,在执行AddData函数并提供参数时,数据变量将被更新并保留在区块链上。 那么这个代码是如何执行的呢? 这是以太坊虚拟机(EVM)发挥作用的地方。 编译的Solidity代码生成字节码,在创建合约时将其添加到区块链中。 然后在以太坊虚拟机挖掘过程中执行该字节码。 为了说明这是如何工作的,让我们部署一个包含一组简单函数来回显添加的数据合约:

当我们的智能合约被编译并添加到区块链中时,我们可以调用我们的方法(在下面的示例中,我们将使用Mist来调用我们部署的函数)。 让我们添加一个字符串,该字符串将被存储在智能合约中:

为了执行我们的代码(或者更具体地说,要求矿工执行我们的智能合约),我们需要向矿工支付一些小费。 我们想要支付的小费金额可以在执行我们的智能合约的请求期间设定,价格较高可以让我们的执行请求更快被提取,因为这对矿工更有吸引力。

一旦我们的请求发出,我们就可以看到我们提交的数据被添加到区块链中(例子如下):

我们的数据存储在区块链中,任何帐户都可以调用GetEchoData来返回存储的数据:

 

利用区块链事件

所以现在我们已经了解了如何去部署一个智能合约,我们已经准备好开发一些东西可以让我们使用这个分布式和匿名平台。 没有什么比创建一个简单的C2框架来通过区块链隧道传输请求更好的方法了。

使用上面的Solidity代码,我相信你可以看到存储数据并将存储数据传递到客户端是多么容易,但在我们继续研究下去之前,让我们来看看智能合约提供的另一个很酷的功能—–事件。

Solidity中的事件工作机制就和你想的一样,应用程序订阅事件,然后在事件触发时,存储的数据将被传输给订阅事件的应用程序。 这当然为我们提供了一种发送和接收数据的好方法,而无需处理缓冲和转发的逻辑部分。 让我们看一个Solidity事件如何工作的简单代码示例:

如果我们将此代码部署到区块链,我们需要一种方法来订阅这些事件。在我们的例子中,我们将使用Golang(自加入团队以来,0x09AL向我们展示了这种语言的强大),但如果你喜欢Python之类的东西,你也有许多其他的Python的API可以使用。

首先,我们需要生成一些代码,将我们的Golang代码与我们的Solidity合约联系起来。 abigen是一个geth下的工具,它在合约创建和生成一些Golang程序块期间提供了合约应用程序二进制接口(ABI)并,允许调用Solidity函数。例如:

abigen –abi example.abi –pkg example –type Example –out ./example.go

这种类似于在调用RPC服务时如何使用IDL生成C ++代码块,在我们的例子中,我们正在调用由以太坊挖掘机上的EVM执行的代码。

一旦我们生成了中间代码,我们就可以使用Golang连接到以太坊的Ropsten网络并接收事件数据。例如,一个简单的客户端看起来像这样:

我不会查看上面的每一行代码,因为Go-Ethereum库有很好的文档记录功能,但有一个值得进一步研究的地方,我们与ropsten.infura.io的连接部分。

使用以太坊客户端时,本地节点设置为与区块链同步。在客户端第一次执行时,可能需要一段时间来验证区块链,这个区块链验证部分不太适合我们当前的研究。 Infura允许我们通过使用JSON-RPC协议与托管的以太坊客户端进行交互,为区块链验证问题提供了一个很好的解决方法。通过这个平台,我们可以完美访问以太坊区块链而无需运行本地节点和产生任何延迟。这种环境对于创建POC是完美的,但是它引入了单点检测,所以在采用Infura之前应该考虑这一点。

回到上面的示例代码,在编译和执行时,我们看到在将数据发送到事件处理程序之前没有任何有意思的事情。使用Mist,我们可以使用公开的方法向我们的事件处理程序添加数据:

一旦我们的事件处理程序被调用,我们将看到我们的应用程序会读取相关的事件数据:

当然,在执行函数调用之后,你会注意到在应用程序响应事件之前有一段延迟(在写入此内容后Ropsten大约需要30-60秒)。这个延迟归因于我们需要在区块链进行交易,并且这是通过区块链实现分布式应用程序的副作用之一。

通过完成我们的小例子,我们可以看到在两个或多个系统之间通过区块链传递数据是多么的简单。在我们继续之前,值得攻击者思考的是利用这种方式实现C2的一个主要优势–匿名。

通常,当蓝队检测到交互协议时,可以识别出口流量的目的地。在红队练习的情况中,这可能是AWS EC2重定向服务器,Azure CDN实例或DNS服务器,通常会有攻击者为了实现回连而暴露的资产。但当使用智能合约中继流量时,这会让恶意分析变得更加困难,因为分析员可分析的所有内容都是与钱包地址关联的分布式账单的数据。如果没有可怕的OPSEC故障,很难分辨谁可能拥有一个地址,或者从哪里访问到的数据,从而为攻击者提供匿名(或者更确切地说是假名)。

话虽这么说,对防守方来说并不是一件坏事。通过对以太坊短时间的了解后,很明显攻击者必须弥补区块链C2与传统C2模型的一些差异,以避免发现他们的攻击 活动。攻击者必须的考虑因素是任何人都可以检查区块链,所有事件数据都以纯文本形式传输和存储。此外,区块链是不可变的和永久性的,这意味着安全研究者也可以访问数据,这些数据不仅可以揭示一个受损端点的行为情况,还可以揭示在某个攻击时段可能已被感染的其他端点。

然而,有一些缺点可以被解决,例如,在数据被添加到事件处理程序之前加密。虽然这没有消除合约执行记录,但它确实保护了传递的任何数据或发出的命令,使得将攻击活动与被攻击端点相关联的分析工作变得更加困难。

攻击者必须考虑的另一个领域是任何人都有能力检查合约程序并调用其方法。虽然我们无法阻止这种情况发生,但我们可以验证调用我们的Solidity代码的帐户,以确保只有处于我们控制下的账户才能添加事件数据,例如:

在这里,我们可以看到智能合约的一个很酷的特点……它们是不可变的,这意味着一旦它们被创建,它们就无法改变。 因此,在上面的示例中,我们可以看到我们的构造函数(在创建合约时调用)将owner字段设置为添加合约的帐户地址。 设置此字段后,无法更改它,这意味着只有与我们合约下的关联账户才能触发事件…非常酷!

 

BlockchainC2

为了探索在以太坊上传递C2流量的可行性,我想创建一个可以在多个连接代理上执行命令的简单POC。在圣诞假期花了一些时间,我制作了BlockchainC2作为展示。

看了这篇文章的人请放弃你的其他想法……这个POC的创建目的只是为了探索区块链如何被攻击者用于C2以及向防御者展示潜在的IOC。它不应被视为具有实际作用的C2框架,不应在实时场景中使用。

BlockchainC2需要一些构成元素才能使用,第一个是钱包。 Myth可用于创建具有所需密钥库格式的钱包。在MacOS上,密钥库通常位于〜/ Library / Ethereum / Keystore中。或者,我们可以使用geth为我们创建所需的格式:

geth account list –keystore / tmp / mykeystore /

执行后,这将生成你的帐户地址:

它需要的密钥格式可以在/ tmp / mykeystore /中找到,并且看起来像这样:

现在我们有了一个帐户,可以创建一个配置文件,用于BlockchainC2,其格式如下:

要开始使用BlockchainC2,必须部署合约。 可以通过使用bc2serverd的-setup选项执行来完成:

./cmd/bc2server --setup --config config.json --pass Passw0rd1

确保将创建的合约地址添加到config.json中,然后你可以使用以下命令执行bc2server:

./cmd/bc2server --config config.json --pass Passw0rd1

这将启动将处理传入代理客户端的命令行界面。 要生成客户端,我们可以使用:

./cmd/bc2agent --config config.json --pass Passw0rd1

启动客户端后,将启动通过区块链建立连接的处理程序。 如上所述,我们知道发送的所有数据对于任何关心这个连接的人都是可见的。 为了避免这种情况,使用以下加密连接:

在这里,我们可以看到RSA公钥的初始交换,该公钥用于加密来自客户端的AES会话密钥。 协商会话密钥后,服务器和客户端之间的数据将被加密。

通过建立加密通道,可以交换命令。 在此POC中,BlockchainC2支持在远程客户端上执行命令并检索执行结果以及检索远程文件的功能。 例如,让我们看看当发送请求之后在MacOS客户端上执行命令时的表现:

要查看在此次交互期间添加到区块链的内容,我们可以使用Etherscan查看:

我们来看看BlockchainC2的实际应用

BlockchainC2可以在这里下载

*文章为作者独立观点,不代表BSCEC立场

转载此文章须经作者同意,并请附上出处(安全客)及本页链接。原文链接 https://www.anquanke.com/post/id/169248

白帽汇安全研究院转载2019-01-11 12:14:19 安全客 331