hacktricks/blockchain/blockchain-and-crypto-currencies
2024-01-16 22:44:24 +00:00
..
README.md Translated ['backdoors/merlin.md', 'blockchain/blockchain-and-crypto-cur 2024-01-16 22:44:24 +00:00

从零开始学习AWS黑客攻击成为英雄通过 htARTE (HackTricks AWS Red Team Expert)

支持HackTricks的其他方式

基本术语

  • 智能合约:智能合约只是存储在区块链上的程序,当预定条件满足时运行。它们通常用于自动化执行一个协议,以便所有参与者可以立即确定结果,无需任何中介参与或时间损失。(来自这里)。
  • 基本上,智能合约是一段代码,当人们访问并接受合约时将被执行。智能合约运行在区块链上(因此结果是不可变的)并且可以在接受它们之前被人们阅读。
  • dApps去中心化应用程序是在智能合约之上实现的。它们通常有一个前端,用户可以与应用程序交互,后端是公开的(因此可以被审计),并且是作为智能合约实现的。有时需要使用数据库,以太坊区块链为每个账户分配了一定的存储空间。
  • 代币 & 货币货币是充当数字 货币的加密货币,而代币是代表某种价值的东西,但它不是货币。
  • 实用代币:这些代币允许用户稍后访问某项服务(它在特定环境中具有一些价值)。
  • 安全代币:这些代表了某项资产的所有权
  • DeFi去中心化金融
  • DEX去中心化交易平台
  • DAOs去中心化自治组织

共识机制

为了被认可,区块链交易必须被附加区块链上。验证者(矿工)执行这种附加;在大多数协议中,他们为此获得奖励。为了保持区块链的安全,必须有一种机制来防止恶意用户或团体控制大多数验证

工作量证明是另一种常用的共识机制,它使用计算能力的验证来验证交易,要求潜在攻击者获取验证网络的大部分计算能力。

工作量证明 (PoW)

这使用计算能力的验证来验证交易,要求潜在攻击者获取验证网络的大部分计算能力。
矿工选择几个交易,然后开始计算工作量证明拥有最大计算资源的矿工更有可能更早完成工作量证明并获得所有交易的费用。

权益证明 (PoS)

PoS通过要求验证者拥有一定数量的区块链代币来实现这一点,要求潜在攻击者获取区块链上大部分代币以发起攻击。
在这种共识中,矿工拥有的代币越多,矿工被要求创建下一个区块的可能性就越大。
与PoW相比这大大减少了矿工的能源消耗

比特币

交易

一个简单的交易是从一个地址向另一个地址转移资金
比特币中的一个地址公钥的哈希,因此,为了从一个地址进行交易,某人需要知道与该公钥(地址)相关联的私钥。
然后,当进行交易时,它会使用地址的私钥签名,以表明交易是合法的

在比特币中产生数字签名的第一部分可以用以下方式在数学上表示:
Sig = Fsig(Fhash(m),dA)

其中:

  • _d_A 是签名的私钥
  • m交易
  • Fhash 是哈希函数
  • Fsig 是签名算法
  • Sig 是结果签名

签名函数Fsig产生一个包含两个值的签名SigR和S

  • Sig = (R, S)

一旦计算出R和S它们就被序列化成一个字节流使用一个国际标准编码方案进行编码该方案被称为Distinguished Encoding Rules或DER。为了验证签名是否有效使用了一个签名验证算法。验证数字签名需要以下内容

  • 签名R和S
  • 交易哈希
  • 对应于用于创建签名的私钥的公钥

验证签名实际上意味着只有私钥的所有者生成了公钥才能在交易上产生签名。如果签名确实有效签名验证算法将返回“TRUE”。

多重签名交易

多重签名地址是与多个ECDSA私钥相关联的地址。最简单的类型是m-of-n地址 - 它与n个私钥相关联并且从这个地址发送比特币需要至少m个密钥的签名。多重签名交易是从多重签名地址发送资金的交易。

交易字段

每个比特币交易都有几个字段:

  • 输入比特币从哪个地址转移的数量和地址
  • 输出:每个转移每个 输出的地址和金额
  • 费用:支付给交易矿工资金数量
  • Script_sig:交易的脚本签名
  • Script_type:交易类型

两种主要的交易类型:

  • P2PKH: "支付到公钥哈希":这是如何进行交易的方式。您要求发送方提供有效的签名(来自私钥)和公钥。交易输出脚本将使用签名和公钥,并通过一些加密函数检查是否与公钥哈希匹配,如果匹配,则资金将是可支配的。这种方法以哈希的形式隐藏您的公钥以获得额外的安全性。
  • P2SH: "支付到脚本哈希":交易的输出只是脚本(这意味着想要这笔钱的人发送了一个脚本),如果使用特定参数执行,将导致布尔值为truefalse。如果矿工使用提供的参数运行输出脚本并导致true资金将被发送到您想要的输出P2SH用于多重签名钱包,使输出脚本逻辑在接受交易之前检查多个签名P2SH也可以用来允许任何人或没有人支配资金。如果P2SH交易的输出脚本只是1表示真,那么尝试支配输出而不提供参数将只会导致1,使得任何尝试的人都可以支配这笔钱。这也适用于返回0的脚本,使得输出无人可以支配。

闪电网络

该协议有助于对一个通道执行多个交易,并 发送 最终 状态到区块链以保存。
提高了比特币区块链的速度它只允许每秒7次支付并且它允许创建更难追踪的交易,因为通道是通过比特币区块链的节点创建的:

闪电网络的正常使用包括通过提交资金交易到相关的基础区块链第1层打开支付通道,然后进行任意数量的闪电网络交易,这些交易更新了通道资金的暂定分配而不将其广播到区块链,最后通过广播 最终版本的结算交易来分配通道的资金,以关闭支付通道。

请注意,通道的任何一方都可以随时停止并将通道的最终状态发送到区块链。

比特币隐私攻击

共同输入

理论上一个交易的输入可以属于不同的用户,但实际上这是不寻常的,因为它需要额外的步骤。因此,通常可以假设同一交易中的2个输入地址属于同一所有者

UTXO找零地址检测

UTXO表示未花费的交易输出UTXOs。在使用前一笔交易的输出作为输入的交易中需要花费整个输出(以避免双重支付攻击)。因此,如果意图是将该输出的部分资金发送到一个地址,并保留 其他 部分,将出现两个不同的输出预期的一个和一个随机新的找零地址,剩余的资金将被保存在那里。

然后,观察者可以假设生成的新找零地址属于UTXO的所有者

社交网络和论坛

有些人在互联网上的不同网站上提供了他们的比特币地址信息。这使得识别地址所有者变得非常容易

交易图

通过以图形表示交易,可以以一定的概率知道账户的资金去向。因此,可以了解与区块链上的用户有关的一些信息。

不必要的输入启发式

也称为“最优找零启发式”。考虑这个比特币交易。它有两个输入分别值2 BTC和3 BTC以及两个输出分别值4 BTC和1 BTC。

2 btc --> 4 btc
3 btc     1 btc

假设其中一个输出是找零另一个输出是付款。有两种解释付款输出要么是4 BTC输出要么是1 BTC输出。但如果1 BTC输出是付款金额那么3 BTC输入就没有必要因为钱包本可以只花费2 BTC输入并因此支付更低的矿工费。这表明真正的付款输出是4 BTC而1 BTC是找零输出。

这对于有多个输入的交易来说是一个问题。解决这种泄露的一种方法是增加更多输入,直到找零输出高于任何输入,例如:

2 btc --> 4 btc
3 btc     6 btc
5 btc

强制地址重用

强制地址重用激励地址重用是指敌手向已在区块链上使用过的地址支付(通常是小额的)比特币。敌手希望用户或他们的钱包软件将这些支付作为更大交易的输入,通过共同输入所有权启发式方法揭露其他地址。这些支付可以被理解为一种强迫地址所有者无意中重用地址的方式。

这种攻击有时被错误地称为灰尘攻击

钱包正确的行为是不花费已经使用过且为空的地址上的硬币。

其他区块链分析

  • 精确支付金额为了避免带有找零的交易支付金额需要等于UTXO这是非常意外的。因此没有找零地址的交易很可能是同一用户的两个地址之间的转账
  • 整数金额:在一笔交易中,如果其中一个输出是一个“整数金额”,那么很有可能这是对一个设定了“整数金额”价格的人的支付,所以另一部分必须是剩余的。
  • 钱包指纹识别:细心的分析师有时可以推断出某个交易是由哪个软件创建的,因为不同的钱包软件并不总是以完全相同的方式创建交易。钱包指纹识别可以用来检测找零输出,因为找零输出是由相同钱包指纹的钱包花费的。
  • 金额和时间关联:如果进行交易的人泄露了交易的时间和/或金额,那么这笔交易就很容易被发现

流量分析

一些组织嗅探你的流量可以看到你在比特币网络中的通信。
如果敌手看到一个交易或区块从你的节点发出而之前没有进入,那么它几乎可以肯定交易是由你发起的或区块是由你挖出的。由于涉及到互联网连接,敌手将能够将IP地址与发现的比特币信息关联起来

一个无法嗅探所有互联网流量但在比特币节点上拥有大量节点以便更接近源头的攻击者可能能够知道正在宣布交易或区块的IP地址。
此外,一些钱包会定期重新广播他们未确认的交易,以便它们更有可能在网络中广泛传播并被挖掘。

其他攻击以获取地址所有者信息

更多攻击请阅读 https://en.bitcoin.it/wiki/Privacy

匿名比特币

匿名获取比特币

  • 现金交易:使用现金购买比特币。
  • 现金替代品:购买礼品卡或类似物品,并在网上兑换比特币。
  • 挖矿:挖矿是获取比特币最匿名的方式。这适用于单独挖矿,因为挖矿池通常知道哈希者的IP地址。
  • 盗窃:理论上,另一种获取匿名比特币的方式是盗窃它们。

混币器

用户会将比特币发送到混币服务,服务会扣除一定费用后将不同的比特币发送回用户。理论上,观察区块链的敌手将无法链接进出交易。

然而,用户需要信任混币服务会返还比特币,并且不会保存有关收到和发送资金关系的日志。
一些其他服务也可以用作混币器,比如比特币赌场,你可以发送比特币并稍后取回。

CoinJoin

CoinJoin将不同用户的多笔交易混合成一笔,以使观察者更难以分辨哪个输入与哪个输出相关。
这提供了新的隐私级别,然而,一些交易中的某些输入和输出金额相关或与其他输入和输出的金额差异很大,仍然可以被外部观察者关联

比特币区块链上可能的CoinJoin交易ID的例子有402d3e1df685d1fdf82f36b220079c1bf44db227df2d676625ebcbee3f6cb22a85378815f6ee170aa8c26694ee2df42b99cff7fa9357f073c1192fff1f540238

https://coinjoin.io/en
类似于CoinJoin但更好适用于以太坊的是 Tornado Cash (资金由矿工提供,所以它只是出现在你的钱包中)。

PayJoin

前一节讨论的CoinJoin类型可以通过检查具有相同值的多个输出来轻易识别。

PayJoin也称为支付到端点或P2EP是两方之间的一种特殊CoinJoin其中一方支付另一方。然后交易没有具有相同值的多个输出的特征因此不会明显地显示为等额输出CoinJoin。考虑这笔交易

2 btc --> 3 btc
5 btc     4 btc
它可以被解释为一个简单的交易支付给某个地方剩余的零钱现在忽略哪个输出是支付哪个是零钱的问题。另一种解释这个交易的方式是2 BTC输入是由商家拥有5 BTC是由他们的客户拥有这个交易涉及客户支付1 BTC给商家。没有办法判断这两种解释哪个是正确的。结果是一个coinjoin交易它打破了常见的输入所有权启发式规则并提高了隐私性但也是**无法检测的,与任何常规比特币交易无法区分**。

如果PayJoin交易即使是适度使用也会使得**常见的输入所有权启发式规则在实践中完全失效**。由于它们无法检测我们甚至不知道它们今天是否正在被使用。由于交易监控公司主要依赖于该启发式规则截至2019年PayJoin的想法引起了极大的兴趣。

# 比特币隐私良好实践

## 钱包同步

比特币钱包必须以某种方式获取有关其余额和历史的信息。截至2018年底最实用和最私密的现有解决方案是使用**全节点钱包**(这是最大限度的私密)和**客户端区块过滤**(这是非常好的)。

* **全节点:** 全节点下载整个区块链,其中包含比特币中曾经发生的每一笔链上[交易](https://en.bitcoin.it/wiki/Transaction)。因此,观察用户互联网连接的对手将无法了解用户感兴趣的是哪些交易或地址。
* **客户端区块过滤:** 客户端区块过滤通过创建包含每个区块中每笔交易的**所有地址**的**过滤器**来工作。过滤器可以测试**元素是否在集合中**;可能出现误报,但不会出现漏报。轻量级钱包将**下载**区块链中每个**区块**的所有过滤器,并检查与其**自己的地址**的匹配情况。包含匹配项的区块将从点对点网络完整下载,这些区块将用于获取钱包的历史和当前余额。

## Tor

比特币网络使用点对点网络这意味着其他节点可以了解您的IP地址。这就是为什么建议**每次与比特币网络交互时都通过Tor连接**。

## 避免地址重用

**地址被多次使用对隐私非常有害,因为这将更多的区块链交易与证明它们是由同一实体创建的联系起来**。使用比特币最私密和安全的方式是每个支付给你的人都发送一个全新的地址。收到的币一旦被花费,地址就不应再次使用。此外,在发送比特币时也应要求一个全新的比特币地址。所有好的比特币钱包都有一个用户界面,它会阻止地址重用。

## 多笔交易

**通过多于一笔链上交易**支付给某人可以大大减少基于金额的隐私攻击的力量例如金额关联和整数金额。例如如果用户想支付5 BTC给某人他们不希望5 BTC的价值容易被搜索到那么他们可以发送两笔交易价值2 BTC和3 BTC加起来总共是5 BTC。

## 避免找零

避免找零是指精心选择交易输入和输出,以完全不需要找零输出。**没有找零输出对隐私来说是极好的**,因为它打破了找零检测启发式规则。

## 多个找零输出

如果避免找零不是一个选项,那么**创建多个找零输出可以提高隐私**。这也打破了通常假设只有一个找零输出的找零检测启发式规则。由于这种方法比通常使用更多的区块空间,因此避免找零是更可取的。

# Monero

当Monero被开发时它寻求解决的迫切需求是**完全匿名**,在很大程度上,它已经填补了这个空白。

# Ethereum

## Gas

Gas指的是衡量在以太坊网络上执行特定操作所需的**计算** **努力**的单位。Gas指的是成功进行以太坊上的**交易**所需的**费用**。

Gas价格以**gwei**表示gwei本身是ETH的一个单位 - 每个gwei等于**0.000000001 ETH**10-9 ETH。例如您可以说您的gas费用是1 gwei而不是说您的gas费用是0.000000001 ether。'gwei'这个词本身意味着'giga-wei',它等于**1,000,000,000 wei**。Wei本身是ETH的**最小单位**。

要计算交易将要花费的gas请阅读此示例

假设Jordan必须支付Taylor 1 ETH。在交易中gas限制是21,000单位基础费用是100 gwei。Jordan包括了10 gwei的小费。

使用上面的公式,我们可以计算出`21,000 * (100 + 10) = 2,310,000 gwei`或0.00231 ETH。

当Jordan发送钱时Jordan的账户将扣除1.00231 ETH。Taylor将收到1.0000 ETH。矿工收到0.00021 ETH的小费。基础费用0.0021 ETH被销毁。

此外Jordan还可以为交易设置一个最大费用`maxFeePerGas`。最大费用和实际费用之间的差额将退还给Jordan即`refund = max fee - (base fee + priority fee)`。Jordan可以设置一个最大金额来支付交易的执行而不用担心在交易执行时“超出”基础费用而过度支付。

由于基础费用是由网络根据区块空间的需求计算的这最后一个参数maxFeePerGas有助于控制将要支付的最大费用。

## 交易

注意,在**以太坊**网络上,交易是在两个地址之间进行的,这些可以是**用户或智能合约地址**。\
**智能合约**通过**特殊** **交易**存储在分布式账本中。

改变EVM状态的交易需要向整个网络广播。任何节点都可以广播请求在EVM上执行交易在此之后**矿工**将**执行** **交易**并将结果状态更改传播到网络的其余部分。\
交易需要**费用**,必须被挖掘才能成为有效。

提交的交易包括以下信息:

* `recipient`  接收地址(如果是外部拥有的账户,交易将转移价值。如果是合约账户,交易将执行合约代码)
* `signature`  发送者的标识符。当发送者的私钥签署交易时生成,确认发送者已授权此交易
* `value`  从发送者到接收者转移的ETH金额以WEI表示ETH的一个单位
* `data`  可选字段,包含任意数据
* `gasLimit`  交易可以消耗的最大气体单位量。气体单位代表计算步骤
* `maxPriorityFeePerGas` - 作为小费包含给矿工的最大气体量
* `maxFeePerGas` - 愿意为交易支付的最大气体量(包括`baseFeePerGas`和`maxPriorityFeePerGas`

请注意,没有任何字段是用于起始地址的,这是因为可以从签名中推断出这一点。

# 参考资料

* [https://en.wikipedia.org/wiki/Proof\_of\_stake](https://en.wikipedia.org/wiki/Proof\_of\_stake)
* [https://www.mycryptopedia.com/public-key-private-key-explained/](https://www.mycryptopedia.com/public-key-private-key-explained/)
* [https://bitcoin.stackexchange.com/questions/3718/what-are-multi-signature-transactions](https://bitcoin.stackexchange.com/questions/3718/what-are-multi-signature-transactions)
* [https://ethereum.org/en/developers/docs/transactions/](https://ethereum.org/en/developers/docs/transactions/)
* [https://ethereum.org/en/developers/docs/gas/](https://ethereum.org/en/developers/docs/gas/)
* [https://en.bitcoin.it/wiki/Privacy](https://en.bitcoin.it/wiki/Privacy#Forced\_address\_reuse)

<details>

<summary><strong>从零开始学习AWS黑客攻击直到成为专家通过</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>

支持HackTricks的其他方式

* 如果您想在**HackTricks中看到您的公司广告**或**下载HackTricks的PDF版本**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)
* 获取[**官方PEASS & HackTricks商品**](https://peass.creator-spring.com)
* 发现[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家的[**NFTs**](https://opensea.io/collection/the-peass-family)系列
* **加入** 💬 [**Discord群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram群组**](https://t.me/peass) 或在**Twitter** 🐦 上**关注**我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。

</details>