Ukryty serwis Tor – generowanie spersonalizowanych adresów

W poprzednim poście omówiłem pokrótce tworzenie serwisu w domenie .onion, a teraz opiszę generowanie spersonalizowanych domen.

Tworzenie serwisów pod takimi domenami wiąże się z problemami bezpieczeństwa. Domeny onion są długie, trudne do zapamiętania oraz rozpoznania przez człowieka, więc narażasz swoich użytkowników na phishing.

jRcHZl1

Domeny .onion powstają w następujący sposób:

  1. Generowana jest para kluczy RSA-1024
  2. Generowany jest hash SHA1 z zakodowanego DER klucza publicznego z formacie ASN.1
  3. Połowa powstałego hasha SHA1 jest kodowana w Base32, co daje nam domenę złożoną z liter i cyfr od 2 do 7
  4. Dodawana jest końcówka .onion

Więcej informacji na ten temat dostępne jest w oficjalnej dokumentacji.

Domyślnie po pierwszej konfiguracji torrc generowana jest losowa domena bez żadnych spersonalizowanych przedrostków jak 2ux45eq2rq3km2x3.onion. Jeśli zależy Ci jednak na specjalnie przygotowanej domenie, jak to robiło SilkRoad a obecnie Facebook, musisz poświęcić trochę mocy obliczeniowej na wygenerowanie takiej domeny. Do tego służą dwa programy: Shallot, który używa CPU i scallion, który ma wsparcie dla GPU. Poniższe instrukcje są dla systemów *N*X:
Shallot

git clone git@github.com:katmagic/Shallot.git
cd Shallot
./configure
Liunx detected.  Have you considered switching to BSD?
Configuration successful.  This does not mean it will build.
If you are missing gcc, or required libraries/headers, you
will need to install them first.
make
cc  -O3 -I/usr/include -I/usr/local/include -L/usr/lib -L/usr/local/lib  -Wall -o src/math.o -c src/math.c
cc  -O3 -I/usr/include -I/usr/local/include -L/usr/lib -L/usr/local/lib  -Wall -o src/error.o -c src/error.c
cc  -O3 -I/usr/include -I/usr/local/include -L/usr/lib -L/usr/local/lib  -Wall -o src/linux.o -c src/linux.c
cc  -O3 -I/usr/include -I/usr/local/include -L/usr/lib -L/usr/local/lib  -Wall -o src/print.o -c src/print.c
cc  -O3 -I/usr/include -I/usr/local/include -L/usr/lib -L/usr/local/lib  -Wall -o src/thread.o -c src/thread.c
cc  -O3 -I/usr/include -I/usr/local/include -L/usr/lib -L/usr/local/lib  -Wall -o src/shallot.o -c src/shallot.c
cc  -O3 -I/usr/include -I/usr/local/include -L/usr/lib -L/usr/local/lib -pthread src/math.o src/error.o src/linux.o src/print.o src/thread.o src/shallot.o -o shallot -lm -lpthread -lssl -lcrypto

Shallot powinien być teraz skompilowany i gotowy do użycia:

./shallot
Usage: shallot [-dmopv] [-f ] [-t count] [-x time] [-e limit] pattern
  -d        : Daemonize (requires -f)
  -m        : Monitor mode (incompatible with -f)
  -o        : Optimize RSA key size to improve SHA-1 hashing speed
  -p        : Print 'pattern' help and exit
  -f  : Write output to 
  -t count  : Forces exactly count threads to be spawned
  -x secs   : Sets a limit on the maximum execution time. Has no effect without -m
  -e limit  : Manually define the limit for e
Version: 0.0.3-alpha
 
./shallot test
--------------------------------------------------------------
Found matching domain after 5171 tries: wtqlgwtestmlx5qp.onion
--------------------------------------------------------------
-----BEGIN RSA PRIVATE KEY-----
MIICXgIBAAKBgQC25lJhtdzlXtopUJLwn7YhN3/KZieLl3cAKKMA4KwbPJMpLDJc
ENVd8lDgV6faWHOeKH94tobwbdWlKwWHvi+n3T7kbqpvmBononOMBbXL303TaJaP
se8AzjoSJFHbzo85YjPgGfN5ObdXSxe9Y9mMQP3PSg4L2Pn2+TNqYzNXCQIDAQKB
AoGARG0Rikpl2AyrhR9DG6qvdph5mEnidHB8poxUpEeJJimGRth0Uw/Jc4FxfHe1
hbKh9fi8xzV3feXhmfEZ9tLNQEJ8G72PvTuV9vbI44LXyd3ESJD1ZIbn/qWr5/8J
GeweI+qrdBUEZIDacxmflpzAre7tjoZzHRLDGija0ScPGFkCQQDote8t+3vhOLft
5CTluQH7jjLbc3l/CESgOnAQPwpFkw1F8rIPfzoj+LS3X66qzCvMleFQSB1ykgrb
yDxUaTRjAkEAyTQ55nuaBSySsc0guW4ihcroYzGn/4NkaPiLsVwh+xLtRxp+Ww4P
eVRGrRX5dGHExQzhquwNT6WFhvV1G2fUowJBAIPoMfRGCOh4CT+Cin2z6DkL6iip
xBt740tx6n42fqb4efSHBnGaR/IHybfMDyCjyIyeRT45qHQUDvuOOeEIDi8CQQCa
DbmKY/mfiZ+OHpp1Pduj9XgL40cq9Rk0n63GsJhEZ7lmKWkS86nQfiGWhkAn3Cyj
CRzEaxKs2k1htyi+fFB7AkEAqxh1BW2yqMNWNDJYU5Z4qGo7d/vqB2qDC+1lEPwt
u32L0e00gLO+WEqpTEF9J72cIZD2LYGinKIXKAO5xhhDPA==
-----END RSA PRIVATE KEY-----

Wygląda na to, że wszystko jest OK.
Shallot na wejściu przyjmuje jako argument wyrażenie regularne określające jaką domenę chcielibyśmy wygenerować. Jeśli chcesz, by domena zaczynała się od określonych znaków, rozpocznij wyszukiwanie z parametrem ‘^test’:

~/Projects/Shallot(branch:master) » ./shallot '^test'
----------------------------------------------------------------
Found matching domain after 281987 tries: testx6g3574l2rjc.onion
----------------------------------------------------------------
-----BEGIN RSA PRIVATE KEY-----
MIICWwIBAAgQBQnMjRxiK/ijoXqrtP2fipNDwFM1hHeCuTLXmN+Na0Rim85l
vA5vsEbCEl/xJFTTmzeZUsrCbkj1nd2oD6Mfpp/G0Pg4LWg52Bk/Hl0EXzCL
QuSqku8Tj+itG7Hjhz2po7Fya9AFD8vGVdkF7pevw03d3lxXJfs24wIDAtHB
AoGAWrC6ZwUF3kSXpOBS5NY8Gnb57NxUbhV0AfhILKWQh45ojxd9BWnrzzv+
TYkimY2+GqIDYtY1CedmbXIIUrhsUREVI+GXbyuDfpp46Le2EcyJLToL+xWY
9gQ8mchaaIOtwhNAPMQYC1TDNZlTDYiQg2lUXOcrdgECQQDlQSaYfYpCElMU
u9/qZsdpjWVvKepw97DmNdqnxHA7hnPz8XOY6PMyWHWh/qe2UDQsN1Ras4OS
qL4lmTwTAkEA185I6k74Mf4DjIVXpkIWeeUxX5IQCl/e9ySQSkeQ5KvnUgC2
cSzBqXjxt64f9PjXDKs+ZTJIdbLT8QJARG3nE70ht5LeRHrnczPgBQyt9Wqn
eBuAPAsd2+9ObSWBUQxFEpXP0jdC7K9I1Kf5l9HoEEKxMkmjc1K/jwJANA6D
7fZkWsV12/NvKtU+C+ftGF96aOI5x5Flm7VdY1LLi3XDvkVnRTzLATBTyNFZ
sR3fTd0ZjzeCe8oQJCN6Df/hbImO7TRPaa3xJbueAz56DXPFod6kUd4pHb3H
bM0Jm9hCbD7ZxTtOdB/2vnz/Q6fLL3h+hZQ==
-----END RSA PRIVATE KEY-----

Klucz prywatny został wygenerowany, więc idziemy dalej.

scallion
Ze scallionem sprawa jest nieco łatwiejsza, nie trzeba go kompilować samemu, bo autor przygotował paczkę z plikami binarnymi gotowymi do użycia (chyba możemy mu zaufać). Autor przygotował też przykładowy wynik działania programu:

$ mono scallion/bin/Debug/scallion.exe -d 0 prefix
Cooking up some delicions scallions...
Using kernel optimized from file kernel.cl (Optimized4)
Using work group size 128
Compiling kernel... done.
Testing SHA1 hash...
CPU SHA-1: d3486ae9136e7856bc42212385ea797094475802
GPU SHA-1: d3486ae9136e7856bc42212385ea797094475802
Looks good!
LoopIteration:40  HashCount:671.09MH  Speed:9.5MH/s  Runtime:00:01:10  Predicted:00:00:56  Found new key! Found 1 unique keys.
 
  2014-08-05T07:14:50.329955Z
  prefix64kxpwmzdz.onion
  -----BEGIN RSA PRIVATE KEY-----
MIICXAIBAAKBgQCmYmTnwGOCpsPOqvs5mZQbIM1TTqOHK1r6zGvpk61ZaT7z2BCE
FPvdTdkZ4tQ3/95ufjhPx7EVDjeJ/JUbT0QAW/YflzUfFJuBli0J2eUJzhhiHpC/
1d3rb6Uhnwvv3xSnfG8m7LeI/Ao3FLtyZFgGZPwsw3BZYyJn3sD1mJIJrQIEB/ZP
ZwKBgCTUQTR4zcz65zSOfo95l3YetVhfmApYcQQd8HTxgTqEsjr00XzW799ioIWt
vaKMCtJlkWLz4N1EqflOH3WnXsEkNA5AVFe1FTirijuaH7e46fuaPJWhaSq1qERT
eQT1jY2jytnsJT0VR7e2F83FKINjLeccnkkiVknsjrOPrzkXAkEA0Ky+vQdEj64e
iP4Rxc1NreB7oKor40+w7XSA0hyLA3JQjaHcseg/bqYxPZ5J4JkCNmjavGdM1v6E
OsVVaMWQ7QJBAMweWSWtLp6rVOvTcjZg+l5+D2NH+KbhHbNLBcSDIvHNmD9RzGM1
Xvt+rR0FA0wUDelcdJt0R29v2t19k2IBA8ECQFMDRoOQ+GBSoDUs7PUWdcXtM7Nt
QW350QEJ1hBJkG2SqyNJuepH4PIktjfytgcwQi9w7iFafyxcAAEYgj4HZw8CQAUI
3xXEA2yZf9/wYax6/Gm67cpKc3sgKVczFxsHhzEml6hi5u0FG7aNs7jQTRMW0aVF
P8Ecx3l7iZ6TeakqGhcCQGdhCaEb7bybAmwQ520omqfHWSte2Wyh+sWZXNy49EBg
d1mBig/w54sOBCUHjfkO9gyiANP/uBbR6k/bnmF4dMc=
-----END RSA PRIVATE KEY-----
 
  pmJk58BjgqbDzqr7OZmUGyDNU06jhyta+sxr6ZOtWWk+89gQhBT73U3ZGeLUN//ebn44T8exFQ43ifyVG09EAFv2H5c1HxSbgZYtCdnlCc4YYh6Qv9Xd62+lIZ8L798Up3xvJuy3iPwKNxS7cmRYBmT8LMNwWWMiZ97A9ZiSCa0=
  B/ZPZw==
 
init: 491ms / 1 (491ms, 2.04/s)
generate key: 1193ms / 6 (198.83ms, 5.03/s)
cpu precompute: 10ms / 6 (1.67ms, 600/s)
total without init: 70640ms / 1 (70640ms, 0.01/s)
set buffers: 0ms / 40 (0ms, 0/s)
write buffers: 3ms / 40 (0.08ms, 13333.33/s)
read results: 67442ms / 40 (1686.05ms, 0.59/s)
check results: 185ms / 40 (4.63ms, 216.22/s)
 
9.50 million hashes per second
 
Stopping the GPU and shutting down...

OK, powiedzmy, że masz wygenerowaną swoją domenę .onion i chcesz ją teraz opublikować. Przejdź do katalogu HiddenServiceDir, w którym przechowywany jest klucz prywatny i domena, u mnie było to /srv/tor/. Zmodyfikuj plik private_key wklejając tam uzyskany klucz prywatny w formacie:

-----BEGIN RSA PRIVATE KEY-----
MIICXAIBAAKBgQCmYmTnwGOCpsPOqvs5mZQbIM1TTqOHK1r6zGvpk61ZaT7z2BCE
FPvdTdkZ4tQ3/95ufjhPx7EVDjeJ/JUbT0QAW/YflzUfFJuBli0J2eUJzhhiHpC/
1d3rb6Uhnwvv3xSnfG8m7LeI/Ao3FLtyZFgGZPwsw3BZYyJn3sD1mJIJrQIEB/ZP
ZwKBgCTUQTR4zcz65zSOfo95l3YetVhfmApYcQQd8HTxgTqEsjr00XzW799ioIWt
vaKMCtJlkWLz4N1EqflOH3WnXsEkNA5AVFe1FTirijuaH7e46fuaPJWhaSq1qERT
eQT1jY2jytnsJT0VR7e2F83FKINjLeccnkkiVknsjrOPrzkXAkEA0Ky+vQdEj64e
iP4Rxc1NreB7oKor40+w7XSA0hyLA3JQjaHcseg/bqYxPZ5J4JkCNmjavGdM1v6E
OsVVaMWQ7QJBAMweWSWtLp6rVOvTcjZg+l5+D2NH+KbhHbNLBcSDIvHNmD9RzGM1
Xvt+rR0FA0wUDelcdJt0R29v2t19k2IBA8ECQFMDRoOQ+GBSoDUs7PUWdcXtM7Nt
QW350QEJ1hBJkG2SqyNJuepH4PIktjfytgcwQi9w7iFafyxcAAEYgj4HZw8CQAUI
3xXEA2yZf9/wYax6/Gm67cpKc3sgKVczFxsHhzEml6hi5u0FG7aNs7jQTRMW0aVF
P8Ecx3l7iZ6TeakqGhcCQGdhCaEb7bybAmwQ520omqfHWSte2Wyh+sWZXNy49EBg
d1mBig/w54sOBCUHjfkO9gyiANP/uBbR6k/bnmF4dMc=
-----END RSA PRIVATE KEY-----

Usuń plik hostname, i przeładuj tora, zależnie od systemu będzie to:

/etc/init.d/tor reload
systemctl tor reload

Zapraszam teraz na mojego bloga dostępnego w sieci Tor: agiloblulimjeqlq.onion

[Total: 0    Average: 0/5]