用Wolfram语言侦查黑暗面加密赎金支付beplay体育官网下载appbeplay体育手机官网安卓版
让我来告诉你一个故事,关于如何仅使用公共知识、一些有根据的猜测和beplay体育官网下载app.
但首先,我们要了解一点背景知识。
2021年5月7日,殖民地管道公司是受害者勒索软件攻击迫使美国最大的燃料管道关闭。第二天,联邦调查局证实俄罗斯黑客组织DarkSide对此负责。几乎同时,德国化工分销公司beplayapp体育下载布伦塔格是受害者另一起黑暗势力勒索软件攻击的证据
5月12日,殖民管道公司恢复运营,第二天黑暗势力宣布它正在解散并将在5月23日前偿还所有未偿债务。还有报道称殖民管道公司和布伦塔格支付了大量比特币赎金。
为了了解我们能从中了解到什么,我们首先需要同步我们的手表和区块链:
![]()
& # 10005
$TimeZone = 0;$BlockchainBase = "比特币";CloudConnect []; |
一些新闻媒体说,他们从受害者那里获得了信息,并确定了支付款项的钱包,但没有透露是哪些钱包。比特币上的所有交易都是公开的,所以我决定自己寻找并放置我们的区块链积分为了测试。然而,比特币每天有数十万笔交易,我需要一些可靠的东西来寻找。
从广泛传播的报道中,我知道Colonial Pipeline在5月8日的某个时候支付了75个比特币(BTC)作为赎金,而Brenntag在5月11日向同一组黑客支付了78.29个比特币。新闻报道通常使用当地时区,而区块链等信息系统则使用协调世界时(UTC)。我不确定从美国东海岸到东欧的所有时区,我应该扫描多大的交易窗口来查看Colonial Pipeline 5月7日至9日的付款,以覆盖5月8日全天。
另一方面,布伦塔格在德国,与我生活的时区相同,接近UTC。78.29比特币的支付看起来也像是一个更明确的搜索模式,所以我决定先调查这一线索。
作为起点,我在5月12日午夜几小时后随机挖掘了一个区块,并开始向后迭代,寻找输入金额大于78比特币的交易。由于数目如此之大,每个街区只有几块,有时甚至没有。
(为什么要寻找更大的交易,而不是完全相等的交易?就像现金纸币一样,通常交易的输入价值大于实际金额,然后返回差额。)
起初,我打算列出当天所有可疑的大额交易,然后逐一分析。但幸运的是,我不需要这样做,因为扫描很快就发现了一笔78.29比特币的交易:
![]()
& # 10005
Currentblock = 683175;blocktxs = ParallelMap[{#, BlockchainTransactionData[#, "TotalInput"]} &, BlockchainBlockData[currentblock, "TransactionList"]];选择[blocktx, Last[#] >数量[78,"Bitcoins"] &] |
马上,我检查了交易所在的区块被挖矿的时间:
![]()
& # 10005
BlockchainBlockData(683175年,“TimeMined”) |
5月11日格林尼治标准时间22:24,该区块被开采,有效地执行了转移。黑客说的最后期限是午夜吗?我们可能永远不会知道。
追踪比特币的轨迹
这笔交易有我正在寻找的确切金额作为输入:
![]()
& # 10005
第一个[BlockchainTransactionData["b5174dfd8fc409fd8576b59ba49983b49da2294a5975ef8f9dfea7c1fee0a65f", "输入"]] |
资金转出的地址是:
![]()
& # 10005
第一个(%(“地址”)) |
让我们来看看这个地址的公开信息:
![]()
& # 10005
BlockchainAddressData (%) |
该地址的余额为零,总交易计数为2,这意味着该地址仅被用作接收赎金并将其转移到其他地方的临时中继。一次性使用的地址是一种常见的做法,所以这个特定的细节没有什么值得怀疑的。
第一笔交易于5月11日22:04收到来自Brenntag的78.29 BTC付款,可追溯到Binance交换。20分钟后的第二笔也是最后一笔交易显示,比特币被分配到两个新地址:
![]()
& # 10005
%[["TransactionList", 1, "Outputs"]] |
不奇怪……现在那些也空了。
![]()
& # 10005
BlockchainAddressData["bc1qxu83k5qkj8kcqdqqenwzn7khcw4llfykeqwg45", \ "Balance"] |
![]()
& # 10005
BlockchainAddressData["bc1qqklq840yf39zdm4kvcvjfwrxdm27fxtxe37sjj", \ "Balance"] |
然后,两个地址之一的一笔交易引起了我的注意:
![]()
& # 10005
最后[BlockchainAddressData["bc1qxu83k5qkj8kcqdqqenwzn7khcw4llfykeqwg45", "TransactionList"]] |
它在5月8日收到了75比特币的部分付款,与Colonial Pipeline的付款相匹配,可以追溯到Coinbase交流:
![]()
& # 10005
BlockchainTransactionData[%["TransactionID"], {"TotalInput", "Timestamp"}] |
5月13日,也就是DarkSide宣布停止运营的那一天,同一地址上的最新交易清空了该地址和其他几个地址:
![]()
& # 10005
第一个[BlockchainAddressData["bc1qxu83k5qkj8kcqdqqenwzn7khcw4llfykeqwg45", "TransactionList"]] |
输出地址上仍然有107.8比特币,目前价值450万美元:
![]()
& # 10005
BlockchainAddressData["bc1q2sewgrnau4e4gvceh8ykzf8lqxawpluu0k0607", \ {"Balance", "ValueInUSDollars"}] |
当然,75和78加起来不等于107,所以一部分比特币很可能被支付给了提供受害者系统漏洞信息的人,还有一部分被套现了,数额较小。
暗方使用的地址集群
将107.8比特币储存到一个地址的交易有相当多的发送者:
![]()
& # 10005
BlockchainTransactionData["b0e381d02d966acbcd9224817e3db50b2bc3566e0060db36a6a17ee163152dd7", "Inputs"] //长度 |
一般来说,我更容易从视觉上消化信息。以下是交易如何表示为所有发送者在单个地址组合资金的图表:
![]()
& # 10005
(*从交易输入到输出生成有向边*)transactionGraph[txid_]:=模块[{txinfo = BlockchainTransactionData[txid], edges}, edges = Join[(*输入为红色*)样式[DirectedEdge[#[["Addresses", 1]], txid, -#["Amount"]],较暗[红色]]& /@ txinfo[" inputs "]],(*输出为绿色*)样式[DirectedEdge[txid, #[["Addresses", 1]], #["Amount"]],较暗[绿色]]& /@ txinfo[" outputs "]]];(*交易图的分层图*)transactionGraphPlot[edges_, txids: {__}]:= Block[{txvertices = (Rule[#, "Square"] & /@ txids)}, If[$CloudEvaluation, LayeredGraphPlot[edges, VertexShapeFunction -> txvertices], LayeredGraphPlot[edges, VertexShapeFunction -> txvertices, VertexLabels -> Placed["Name", Tooltip], EdgeLabels -> Placed["EdgeTag", Tooltip]]]];(*绘制多个事务在一起*)transactionsCommonGraph[txid_]:= transactionsCommonGraph[{txid}];transactionsCommonGraph[txids: {__}]:= {Flatten[transactionGraph /@ deleteduplections [txids]], deleteduplections [txids]}(*过滤传入的交易到一个地址*)addressInTransactions[address_]:= Block[{alltx = BlockchainAddressData[address, "TransactionList"], incomingtx}, incomingtx =选择[alltx, (!MemberQ[Flatten[#[["Outputs", All, "Addresses"]]], address] && !MemberQ[Flatten[#[["Outputs", All, "Addresses"]]], "1Lets1xxxx1use1xxxxxxxxxxxy2EaMkJ"]) &];(*注:1Lets1xxxx1use1xxxxxxxxxxxy2EaMkJ是垃圾邮件\交易中使用的地址,必须过滤掉噪音*)incomingtx = incomingtx[[所有,"TransactionID"]]]];(*过滤从一个地址发送的交易*)addressOutTransactions[address_]:= Block[{alltx = BlockchainAddressData[address, "TransactionList"], outcomingtx}, outcomingtx = Select[alltx, (MemberQ[Flatten[#[["Inputs", All, "Addresses"]]], address]) &];outcomingtx = outcomingtx[[所有,"TransactionID"]]];(*地址第一次和最后一次交易之间的时间*)addressLifetime[address_]:= Block[{txs = BlockchainAddressData[address, "TransactionList"]}, DateInterval[{最后一次[txs]["Timestamp"],第一次[txs]["Timestamp"]}]]; (* get addresses that sent transactions to address*) sendersTo[address_] := Block[ {alltx, incomingtx}, alltx = BlockchainAddressData[address, "TransactionList"]; (* find only the transactions where given address received funds*) incomingtx = Select[ alltx, ! MemberQ[Flatten[#[["Inputs", All, "Addresses"]]], address] && MemberQ[Flatten[#[["Outputs", All, "Addresses"]]], address] &]; DeleteDuplicates@ Flatten[incomingtx[[All, "Inputs", All, "Addresses"]]] ]; (* total bitcoin amount of received transactions *) addressTotalIncome[address_] := Block[ {txs}, txs = addressInTransactions[address]; Total[ Flatten[ Select[BlockchainTransactionData[#, "Outputs"], MatchQ[ #["Addresses"], {address}] &] & /@ txs][[All, "Amount"]]]]; id = "b0e381d02d966acbcd9224817e3db50b2bc3566e0060db36a6a17ee163152dd7\ "; transactionGraphPlot[transactionGraph[id], {id}] |
顶点的顶层是“消费”地址,中间的一个方形顶点象征着将它们联合起来的交易,底部的顶点是接收地址。红色和绿色箭头表示地址余额的负变化或正变化。
接收地址bc1q2sewgrnau4e4gvceh8ykzf8lqxawpluu0k0607仅在5月13日通过以下三个事务激活了几分钟:
![]()
& # 10005
BlockchainAddressData["bc1q2sewgrnau4e4gvceh8ykzf8lqxawpluu0k0607", "TransactionList"][[所有,"Timestamp"]]] |
让我们一起来想象一下:
![]()
& # 10005
transactionGraphPlot @@ transactionsCommonGraph[addressInTransactions["bc1q2sewgrnau4e4gvceh8ykzf8lqxawpluu0k0607"]] |
这个地址只有三笔交易,但它们来自36个不同的发件人:
![]()
& # 10005
cluster = sendersTo["bc1q2sewgrnau4e4gvceh8ykzf8lqxawpluu0k0607"] |
目前还不清楚接收地址是否属于DarkSide,但这27个地址中大多数都向该网站发送了总计500万美元的汇款。
![]()
& # 10005
长度(%) |
殖民管道公司和布伦塔格公司的赎金都支付到了这些地址,他们都签署了这份联合交易。
至少,这些地址做了属于黑暗势力。我们所知道的两笔付款都被分散到几个其他地址,然后多次合并。地址的创建和分而治之的转移可能是自动完成的,以随机化黑暗之面的轨迹,并使拼图更加困难。
所有地址都是从3月份开始活跃的,最后一次交易是在5月13日:
![]()
& # 10005
TimelinePlot[addressLifetime /@ cluster] |
在这段时间内,这些地址收到的交易金额不同:
![]()
& # 10005
addressTotalIncome /@集群 |
这些交易总计令人印象深刻的370个比特币,超过1300万美元:
![]()
& # 10005
总额(%) |
这表明,还有其他黑暗面勒索软件的受害者没有进入媒体的聚光灯下,或者更愿意对他们的勒索事件保密。
大局
让我们进一步看看“谁支付了付款人”。这张图取了所有27个之前的“发送者”地址,并追溯了一层资金:将比特币发送到这些地址的交易。大多数交易只是在27个集群中的两个地址之间进行支付,再次显示出它们是如何相互交织的:
![]()
& # 10005
l1tx = addressInTransactions["bc1q2sewgrnau4e4gvceh8ykzf8lqxawpluu0k0607"];l2tx = Flatten[addressInTransactions /@ cluster];transactionGraphPlot @@ transactionsCommonGraph[Flatten[{l1tx, l2tx}]] |
在右边,我们可以看到赎金受害者Brenntag和Colonial Pipeline支付的78.29和75比特币的分割。在我们的图表结构中,也有更多的交易遵循相同的模式,加起来达到了之前计算的370个BTC。
如果我们绘制出集群的传出交易,我们会看到更多的地址,其中部分赎金被发送到:
![]()
& # 10005
clusterOutTx = Flatten[addressOutTransactions /@ cluster];transactionGraphPlot @@ transactionsCommonGraph[clusterOutTx] |
其中大部分是在5月13日该组织解散时发出的:
![]()
& # 10005
outTxTimes = BlockchainTransactionData[#, "Timestamp"] & /@ clusterOutTx;DateHistogram[outTxTimes, "Day", ChartElementFunction -> ChartElementDataFunction["GradientScaleRectangle", "ColorScheme" -> " thermoetercolors "]] |
5月8日有一个显著的波动,可能意味着黑客为这项工作支付了一些费用,并在殖民管道付款后兑现了一些收益。其中一些可以追溯到大大小小的、中心化的和点对点的交易所。还有一些已经在人们的钱包里结束了。
最后的提示
这些是我发现的重点,当然还有更多有待发现的地方,所以请随意使用本文中嵌入的代码并分享您的发现。
就我个人而言,拥有Wolfram语言中所有正确的工具来着手进行网络调查计算新闻冒险是一种强大的感觉。beplay体育官网下载appbeplay体育手机官网安卓版更重要的是,成为其中的一员感觉很棒beplay体育手机官网安卓版Wolfram区块链实验室为Wolfram技术生态系统开发区块链集成和分析。beplay体育手机官网安卓版
我们将继续磨砺我们的工具,以备不时之需。就像这次,还有不可避免的下一次。
想知道更多吗?阅读Dariia Porechna的后续帖子黑暗面更新:FBI黑了黑客?关于联邦调查局于2021年6月7日没收殖民地管道公司支付给DarkSide的230万美元。
与......联系beplay体育手机官网安卓版Wolfram区块链实验室以了解如何将您的区块链集成到Wolfram语言中。beplay体育官网下载appbeplay体育手机官网安卓版与......联系beplay体育手机官网安卓版Wolfram技术咨询公司启动区块链项目。 |
当每个工作量证明验证使用的能源比一个典型的美国家庭一个月的能源还要多,并且加密货币被用于如上所述的赎金等非法活动时,人们很难对区块链和加密货币技术感到热情。当其他加密货币如门罗币和Tor被毒枭和非法洗钱者使用时,你不得不怀疑这种技术所谓的社会效益。beplay体育网页登录文明网