任意prefixのドメイン(Vanity Address)でOnionサーバを構築する

# この記事はpaizaとはマジで関係ありません！！！！！！！！！！！！

ネタなかったので記事ストックから引っ張り出してきました。ごめんな謝意。

## はじめに & TsukuCTFの話

こんにちは、[paiza アドベントカレンダー 2022](https://adventar.org/calendars/8068) 2日目担当の[xryuseix](https://twitter.com/ryusei_ishika)です。明日の記事はもじゃさんによる「[macの通知を冥鳴ひまりさんに読み上げてもらいたい](https://zenn.dev/s10akir/articles/4c1aa17313ed58)」で、明日は氏家葵さんによる「今年の山の成果報告⛰」です。

僕は普段[TaruTaru](https://ctftime.org/team/157513)としてCTFに参加しています。僕らは先日[TsukuCTF 2022](https://ctftime.org/event/1753)を開催しました。そこで僕が出題した問題[Ochakumi](https://fans.sechack365.com/ctf/TsukuCTF2022/Ochakumi)ではTorネットワーク上に置かれたWebサーバについて調査する問題でした。このWebサーバから[GitHubレポジトリ](https://github.com/GaOACafa/website)を特定し、そのレポジトリの[.gitignore](https://github.com/GaOACafa/website/blob/master/.gitignore#L5)ファイルから秘匿するつもりだったであろうHTMLファイルを特定するとフラグが得られる問題になっていました。

この問題はWASMが使われていたのですが、本質は以下の箇所でした。

> また、Go で Wasm を作成した場合、go.mod の modules の値がそのまま WASM の中に反映されます。その結果、modules をレポジトリにしている場合はレポジトリ名が判明します。([引用](https://fans.sechack365.com/ctf/TsukuCTF2022/Ochakumi#:~:text=%E3%81%BE%E3%81%9F%E3%80%81Go%20%E3%81%A7%20Wasm%20%E3%82%92%E4%BD%9C%E6%88%90%E3%81%97%E3%81%9F%E5%A0%B4%E5%90%88%E3%80%81go.mod%20%E3%81%AE%20modules%20%E3%81%AE%E5%80%A4%E3%81%8C%E3%81%9D%E3%81%AE%E3%81%BE%E3%81%BE%20WASM%20%E3%81%AE%E4%B8%AD%E3%81%AB%E5%8F%8D%E6%98%A0%E3%81%95%E3%82%8C%E3%81%BE%E3%81%99%E3%80%82%E3%81%9D%E3%81%AE%E7%B5%90%E6%9E%9C%E3%80%81modules%20%E3%82%92%E3%83%AC%E3%83%9D%E3%82%B8%E3%83%88%E3%83%AA%E3%81%AB%E3%81%97%E3%81%A6%E3%81%84%E3%82%8B%E5%A0%B4%E5%90%88%E3%81%AF%E3%83%AC%E3%83%9D%E3%82%B8%E3%83%88%E3%83%AA%E5%90%8D%E3%81%8C%E5%88%A4%E6%98%8E%E3%81%97%E3%81%BE%E3%81%99%E3%80%82))

それはさておき、今回はこの問題を作成する際に使用した、Vanity AddressでTorサーバ立てる技術について記載しようと思います。

## VPSを借りる

まずはVPSを借りましょう。VPSサービスによってはTorサーバとして使うと嫌な顔をされることがあります[^1]。そんなことよりも、VPSサービスによっては本当に秘匿されてるか怪しいので、Torサーバを選ぶときはちゃんと選びましょう。

どうしよっかなって思ってたら「[ダークウェブの教科書 匿名化ツールの実践 (ハッカーの技術書)](https://amzn.asia/d/hm2qU7g)」にその辺りのことが書いてありました。その中で紹介されている[Travia](https://www.trabia.com/)は安くて使いやすくて良さそうでした。OSはDebianを選択しました。

[^1]: これは適当な発言です、すまんね^^

## torのインストールと設定

基本的にはNginxとTorが起動できれば良いです。それぞれのインストールはインターネットにいろいろあるのでaptとかでうまくやってください。

いくつかの設定ファイルの中身は公開します。

<details>
<summary>nginx.conf</summary>
<div>

```conf:nginx.conf
user  nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;

events {
    worker_connections  1024;
}


http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    include /etc/nginx/conf.d/*.conf;
    server_names_hash_bucket_size 128;
}
```

</div>
</details>


<details>
<summary>conf.d/hidden_service.conf</summary>
<div>

```conf:conf.d/hidden_service.conf
server {
    server_name REWRITE_YOUR_ONION_DOMAIN.onion;
    root /usr/share/nginx/html/hidden_service;

    location / {
        index index.html;
    }
    location /main.wasm {
        add_header Content-Type application/wasm;
        types {
            application/wasm wasm;
        }
    }
}
```

</div>
</details>

<details>
<summary>torrc</summary>
<div>

```diff:torrc
+ HiddenServiceDir /var/lib/tor/hidden_service
+ HiddenServicePort 80 127.0.0.1:80
- #HiddenServiceDir /var/lib/tor/other_hidden_service/
- #HiddenServicePort 80 127.0.0.1:80
```

</div>
</details>

`hidden_service.conf`の`server_name`は今後作成した値を使用するため、この時点では空欄でも問題ありません。

この設定の場合、ドキュメントルートは`/usr/share/nginx/html/hidden_service`のindex.htmlが表示されるようになるので、ここにHTMLや画像などを入れます。

## Vanity Addresの取得

OnionドメインはBase32形式の56文字で表されます。このドメインは公開鍵をベースとして作成されるため、基本的にはSurface Webのような任意の意味のある文字列をドメインにすることができません。しかし、かっこいいドメインにしたくないですか？？？？ 例えば、TwitterのTorサーバのドメインは`twitter3e4tixl4xyajtrzo62zg5vztmjuricljdp2c5kshju4avyoid.onion`です。このようにほぼランダムな文字列ではあるものの、先頭の数文字は任意の文字にすることができます。そこで、TsukuCTFの問題も`tsuku22`をprefixとするOnionドメイン(Vanity Address)を作成することにしました[^2]。

基本的なVanity Addressの作成手順は以下の通りです。

1. 適当な公開鍵 ≒ ドメインを作成する
2. それが指定した文字列から始まるならプログラムを終了する

という、ブルートフォース戦法です。まあなんか諸々で高速化はされているらしいです。

[^2]: tsukuctf22をprefixにすることは計算量的に厳しい

そこで使用するのがこのツールです。このツールは数少ないonion v3(新しいフォーマット)に対応するVanity Address作成ツールです。あとで計算結果の"鍵"だけscpとかで本番サーバに送ればいいので、ツールを本番環境で実行する必要はありません。

https://github.com/cathugger/mkp224o

makeでビルドしたのち、以下のコマンド1つでとりあえず動きます[^3]。

[^3]: どうにかこうにかすると並列化とかできるはずです

`./mkp224o -d onions -s -n 1 tsuku22`

`onions`ディレクトリに作成した鍵ファイル=ドメインファイルが入ります。今回は`tsuku22qotvyqz5kbygsmxvijjg7jg2d7rgc42qhaqt3ryj66lntrmid.onion`を作成しました。この値を本番サーバへscpで送信します。

```bash
scp -r onions/tsuku22qotvyqz5kbygsmxvijjg7jg2d7rgc42qhaqt3ryj66lntrmid.onion root@178.17.170.40:~/onion
cp onion/*  /var/lib/tor/hidden_service
```

**最後に、`conf.d/hidden_service.conf`の`server_name`を忘れずに変更します。**

## デプロイ&Access

全部準備が終わったら、最後にtorとnginxを起動します。

```bash
systemctl restart tor
systemctl restart nginx
```

ちゃんと繋がればおしまい。

## FAQ

### Vanify Domainを新しくして`/var/lib/tor/hidden_service`と`/etc/nginx/conf.d/hidden_service.conf`を変更したのにアクセスできない。

`/var/log/daemon.log`にヒントが残っているかもしれません。

```bash
cat /var/log/daemon.log
```

私の場合はこのように、パス名がおかしくなっていました(~~これくらいTorがどうにかやってくれとは思いつつ)(これでも動いた時があった、なぜ？？)~~。
![スクリーンショット 2022-10-12 2.42.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/343837/9d5ba209-64ac-1213-8d01-8ffc5b6ded58.png)

```diff:/etc/tor/torrc
- HiddenServiceDir /var/lib/tor/hidden_service/
+ HiddenServiceDir /var/lib/tor/hidden_service
```
また、secret keyのアクセス権限も正しく設定されていませんでした。

![スクリーンショット 2022-10-12 2.42.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/343837/742e5382-b281-64f2-791a-9eb1557f4c93.png)
![スクリーンショット 2022-10-12 2.43.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/343837/741b4f1d-3d76-bd6b-3a86-be1c45ad5dcd.png)

```bash
chmod 644 /var/lib/tor/hidden_service/hs_ed25519_secret_key
```

再度以下のコマンドを実行します。

```bash
systemctl restart tor
systemctl restart nginx
```

うまくいくと`/var/log/daemon.log`の末尾はこのようになります。

![スクリーンショット 2022-10-12 2.49.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/343837/09ac8949-6426-9a32-b294-095333566a1b.png)



## 参考文献

書籍だと前述の通り、これに非常に詳しく書かれていました。

[ダークウェブの教科書 匿名化ツールの実践 (ハッカーの技術書)](https://amzn.asia/d/hm2qU7g)

この記事はめっちゃわかりやすいです。

[【ダークウェブ構築】EC2のUbuntuでtor Hidden Service (.onion) サイトを構築する](https://milestone-of-se.nesuke.com/product/oss/construct-tor-site-with-ubuntu/)