• XSS.stack #1 – первый литературный журнал от юзеров форума

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

baykal

(L2) cache
Пользователь
Регистрация
16.03.2021
Сообщения
370
Реакции
838
Привет форумчане. Думаю вам будет интересно почитать,может кто-то возмет на вооружение и добьется большего.

В статье описано 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

У нас есть приватный ключ,импортируем его в метамаск.
IaoLRRT.png

Теперь у нас есть нужный эфириум адрес.
O7r7mIo.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
я не выбрал галочку

ZpXr3qH.png

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

VvDeMjP.png


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

JMffjqu.png


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

TZcVouH.png


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

EA6KZQv.png


u2Ipz1a.png


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

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

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

Адрес Compound https://etherscan.io/address/0xc00e94cb662c3520282e6f5717214004a7f26888
Фейк

Адрес tokena Uniswap (uni)
Фейк

Настоящий адрес токена USDC https://etherscan.io/address/0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48
фейк: 0xa091a4bb56e72431cd8559acaa0407f230e13b48

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

iXZIEDG.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); // генерация адреса каждую секунду

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


Автор @dobush
источник конкурс exploit.in
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх