Генерируем ключи и фейковые похожие адреса

  • Автор темы Admin

Admin

#1
Администратор
Регистрация
31.12.2019
Сообщения
6,977
Реакции
34
Привет форумчане. Рад что тут такой интересный конкурс, решил и я кое чем поделится
Думаю вам будет интересно почитать,может кто-то возмет на вооружение и добьется большего.

В статье описано 2 метода
1. как создать смарт контракт с адресом похожим на любой другой (пригодится для создания фейковых смарт контрактов)
2. генерируем ключи,адреса

Идея генерировать миллионы новых адресов,или создать смарт контракт с адресом например схожим на адрес какого-нибудь ICO проекта зародилась у меня еще в конце 2018 года.

Часть 1

Этот метод будет на руку тем,кто занимается фишингом в сфере крипты.
Задумывались ли вы когда нибудь как вообще создается адрес в сети эфириум?
А как создается адрес смарт контракта?
Не буду слишком глубоко вникать в теорию,приводить формулы и показывать график эллиптической кривой и тд.
Если коротко,то любой смарт-контракт, в сети Ethereum имеет уникальный адрес.
На первый взгляд адрес смарт-контракта выглядит случайным, но на самом деле адрес смарт-контракта– это хеш адреса отправителя транзакции и значения nonce (nonce это число исходящих транзакций с этого адреса)
Формула : deployed_address = sha3(rlp.encode([sender, nonce]))
Если кратко, то например адрес DAI Stablecoin в сети эфириум это - 0x6b175474e89094c44da98b954eedeac495271d0f
Ок, попробуем создать смарт контракт с похожим адресом

Сначала скрипт генерирует приватный ключ

Код:
function randstr(){
var chars='0123456789abcdef';
var strlen=64;
var randomstr='';
for(var i=0;i<strlen;i++){
var rnum=Math.floor(Math.random()*chars.length);
randomstr+=chars.substring(rnum,rnum+1);
}
return randomstr;// это рандомно сгенерированный приватный ключ

Дальше, из этого ключа создается адрес (это еще не адрес смарт контракта,а просто обычный адрес,назовем его для простоты адресом кошелька)

Код:
var priv=randstr();
var generatorpoint=ec.g;
var pubkeycord=generatorpoint.mul(priv);
var x=pubkeycord.getX().toString('hex');
var y=pubkeycord.getY().toString('hex');
var publickey=x+y;
var hashpublic=keccak256(new Buffer.from(publickey,'hex'));
var adr=new Buffer.from(hashpublic,'hex');
adr=adr.slice(-20).toString('hex');
adr='0x'+adr;// это будет адрес сгенерированный из нашего приватного ключа

Далее,как мы получаем смарт контракт с нужными символами в начале и в конце адреса?

Код:
for(var i=0;i<10;i++){ 
/*
Я тут указал значение максимального nonce 10,больше указывать смысла нет,потому что при деплое в сеть смарт контракта нам нужно будет вручную увеличивать nonce у отправляющего адреса. Ниже подробно напишу об этом
*/
var nonce=i;
nonce=nonce.toString();
if(nonce=='0'){nonce='0a';}
var hex=converter.decToHex(nonce);
var sender = adr;
sender=sender.toString();
var input_arr = [ sender, hex ];
var rlp_encoded = rlp.encode(input_arr);
var contract_address_long = keccak('keccak256').update(rlp_encoded).digest('hex');
var contract_address = contract_address_long.substring(24); 
contract_address = '0x'+contract_address;
contract_address=contract_address.toString();

var cont_adr_cut_front=contract_address.substring(0,5); // substring(0,5 )если хотим чтобы спереди было например 5 нужных нам символов, а если 4 то указываем substring(0,4) тд
cont_adr_cut_front=cont_adr_cut_front.toString();

var cont_adr_cut_back=contract_address.substring(40,42); // с конца получим 2 нужных символа
//а если хотим например чтобы было 4 символа то указываем substring(38,42)
cont_adr_cut_back=cont_adr_cut_back.toString();

console.log(''+cont_adr_cut_front+' '+cont_adr_cut_back+'');

if(cont_adr_cut_back=='0f' && cont_adr_cut_front=='0x6b1'){ // указываем тут какие символы хотим вначале и сзади

console.log('Найдено'+cont_adr_cut_back);

var alldata='generated key: '+priv+' generated address: '+adr+' nonce: '+nonce+' nuzhniy contract: '+contract_address+'\r\n';
ms.push(alldata);
fs = require('fs');
fs.writeFile('Gener-adr2.txt', ms, function(err){ // запишем все в текстовый файл (приватный ключ,сгенерированный адрес,nonce и адрес будущего сгенерированного смарт контракт)
    if (err) return console.log(err);
});

} //else {console.log('NO '+nonce+'');}
} //for

Получилось следующее
Ключ 4625ce80606d3fc31566894ce39a5121356666b9ca3a41ff06bf68f18a4f859a
Адрес 0x5162cb8d3dd3a93b1358e35832fd5fe402858075
Nonce 7
У нас есть приватный ключ,импортируем его в метамаск.

fd44bf0cc5c8369360447.png


Теперь у нас есть нужный эфириум адрес.

a576edf65a5f35d3c3c93.png


Nonce свежегенерированного адреса равен 0,в данном случае нам нужно чтобы он был равен 7,чтобы получить нужный адрес.
Просто вручную с этого адреса 6 раз отправляем на наш другой адрес немного эфира (хоть 0.0000000000001).да это затратно,но nonce по другому невозможно искусственно повысить,для того и я указал в скрипте что максимальное значение nonce я ставлю 10
После того как мы сделали 6 транзакций идем на https://remix.ethereum.org/
Это код простого смарт контракта,который принимает эфир,а также дает возможность вывести эфир и токены со своего баланса

Код:
pragma solidity 0.5.17;

interface erc20_token{
function transfer(address _to, uint256 _value) external returns (bool);
}

contract Exploit  {
 string public name; 
    
   address owner;
 mapping(address => uint256) balances;
 constructor() public {
 owner = msg.sender;
   name='FORUM exploit.in/topic/187486/';
  }
    function() external payable {} 
    
    // vivod ETH
    function withdraw_eth(address payable _kuda) public  {
    require(owner == msg.sender);
_kuda.transfer(address(this).balance); // vidod vsego ETH s balansa
   }
        

        
  // vivod ERC20 tokenov      
 function withdraw_erc20(uint256 _val,address token_adr,address _komu) public{
 require(owner == msg.sender);
erc20_token(token_adr).transfer(_komu,_val); }
    
}

Заливаем смарт контракт в сеть.Смотрим чтобы injected address был тот который мы сгенерировали, иначе с другого адреса получится смарт контракт с другим адресом.

Жмем Deploy
Enable optimisation я не выбрал галочку

993cb6a311235680a1293.png


Жмем на Verify and Publish чтобы смогли взаимодействовать с контрактом

64f40934569c1d22b8873.png


Указываем данные так как на Remix (тип компиляции 1 файл,версия компилятора та же что и была выбрана на Remix,без лицензии)

5607dcb9a6874c4c08936.png


Попадаем на след страницу.Сюда копируем и вставляем код смарт контракта

9d8d4b5668d65c7d06644.png


Если все сделано правильно то контракт будет успешно задеплоен,о чем увидите соответствующую надпись и пройдя по адресу смарт контракта увидите поля для работы с функциями

6ef6bd3055388f3137ac0.png


3459596f0265d67203ec5.png


Сгенерированный смарт контракт
https://kovan.etherscan.io/address/0x6b1efdd7340dd248b166c8e656117f345c2c5e0f
А это адрес реального DAI https://etherscan.io/address/0x6b175474e89094c44da98b954eedeac495271d0f

Как видите спереди 0x6b1 и в конце 0f схожи. Если запустить скрипт на каком либо VPS сервере и на более долгое время,то одинаковых символов можно найти больше (так как пишу статью и делаю скрины,то пришлось довольствоваться малым количеством символов. В данном случае ушло меньше часа на моем стареньком Lenovo 2012г)

Другие сгенерированные адреса

Адрес Compound https://etherscan.io/address/0xc00e94cb662c3520282e6f5717214004a7f26888
Фейк
https://kovan.etherscan.io/address/0xc0050568448f885bd9773d254d3ab200c4fa7888
Адрес tokena Uniswap (uni)
https://info.uniswap.org/#/tokens/0x1f9840a85d5af5bf1d1762f925bdaddc4201f984
Фейк
https://kovan.etherscan.io/address/0x1f9f5f873fb7f50ddc5ca8b096a25eaaf1e64984
Настоящий адрес токена USDC https://etherscan.io/address/0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48
фейк: 0xa091a4bb56e72431cd8559acaa0407f230e13b48

Можно создать несколько js файлов чуть откорректировав строки,где надо указать какие символы хотите получит в конце и в начале и можно запустить параллельно несколько окон

56842390d75cd1a3d0932.png


Часть 2

Этот скрипт просто генерирует адрес и проверяет есть ли в нем баланс

Код:
const http = require('http');
const hostname = 'localhost';
const port = 3000;

// packages
const rlp = require('rlp');
const keccak = require('keccak');
var converter = require('hex2dec');
const EC=require('elliptic').ec;
const ec=new EC('secp256k1');
const keccak256=require('js-sha3').keccak256;
const Web3 = require("web3");
const web3 = new Web3(new Web3.providers.HttpProvider("https://mainnet.infura.io/v3/fa58565ce17d44628a6b20e5134*****")); укажите тут свой API токен от Infura

var ms=new Array();
setInterval(function()
{

//random string for privatekey
function randstr(){
var chars='0123456789abcdefABCDEF';//символы для создания ключа
var strlen=64;
var randomstr='';
for(var i=0;i<strlen;i++){
var rnum=Math.floor(Math.random()*chars.length);
randomstr+=chars.substring(rnum,rnum+1);
}
return randomstr;//this is returned privatekey
}


var priv=randstr();
var generatorpoint=ec.g;
var pubkeycord=generatorpoint.mul(priv);
var x=pubkeycord.getX().toString('hex');
var y=pubkeycord.getY().toString('hex');
var publickey=x+y;
var hashpublic=keccak256(new Buffer.from(publickey,'hex'));
var adr=new Buffer.from(hashpublic,'hex');
adr=adr.slice(-20).toString('hex');
adr='0x'+adr;
ms.push('\r\n');
ms.push(priv,adr);


web3.eth.getBalance(adr, function(err, result) {
  if (err) {
    console.log(err)
  } else {
      var balance=web3.utils.fromWei(result, "ether");
      ms.push(balance); 
    console.log('address: '+adr+ '   balance: '+balance+' ETH')

//Запишем в текстовый файл если нашли баланс
    if(balance>0.001){
        fs = require('fs');
    fs.writeFile('naydenbalans.txt',ms,function(err){
    if (err) return console.log(err);
});    
    }
      }
})

},1000); // генерация адреса каждую секунду

4921f704d56153dc912af.png


Спасибо за чтение,думаю кому то реально поможет

Автор: dobush
 

Members, viewing this thread

Сейчас на форуме нет ни одного пользователя.