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.
Domeny .onion powstają w następujący sposób:
- Generowana jest para kluczy RSA-1024
- Generowany jest hash SHA1 z zakodowanego DER klucza publicznego z formacie ASN.1
- 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
- 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