この記事はpaizaとはマジで関係ありません!!!!!!!!!!!!
ネタなかったので記事ストックから引っ張り出してきました。ごめんな謝意。
はじめに & TsukuCTFの話
こんにちは、paiza アドベントカレンダー 2022 2日目担当のxryuseixです。明日の記事はもじゃさんによる「macの通知を冥鳴ひまりさんに読み上げてもらいたい」で、明日は氏家葵さんによる「今年の山の成果報告⛰」です。
僕は普段TaruTaruとしてCTFに参加しています。僕らは先日TsukuCTF 2022を開催しました。そこで僕が出題した問題OchakumiではTorネットワーク上に置かれたWebサーバについて調査する問題でした。このWebサーバからGitHubレポジトリを特定し、そのレポジトリの.gitignoreファイルから秘匿するつもりだったであろうHTMLファイルを特定するとフラグが得られる問題になっていました。
この問題はWASMが使われていたのですが、本質は以下の箇所でした。
また、Go で Wasm を作成した場合、go.mod の modules の値がそのまま WASM の中に反映されます。その結果、modules をレポジトリにしている場合はレポジトリ名が判明します。(引用)
それはさておき、今回はこの問題を作成する際に使用した、Vanity AddressでTorサーバ立てる技術について記載しようと思います。
VPSを借りる
まずはVPSを借りましょう。VPSサービスによってはTorサーバとして使うと嫌な顔をされることがあります1。そんなことよりも、VPSサービスによっては本当に秘匿されてるか怪しいので、Torサーバを選ぶときはちゃんと選びましょう。
どうしよっかなって思ってたら「ダークウェブの教科書 匿名化ツールの実践 (ハッカーの技術書)」にその辺りのことが書いてありました。その中で紹介されているTraviaは安くて使いやすくて良さそうでした。OSはDebianを選択しました。
torのインストールと設定
基本的にはNginxとTorが起動できれば良いです。それぞれのインストールはインターネットにいろいろあるのでaptとかでうまくやってください。
いくつかの設定ファイルの中身は公開します。
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;
}
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;
}
}
}
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
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の作成手順は以下の通りです。
- 適当な公開鍵 ≒ ドメインを作成する
- それが指定した文字列から始まるならプログラムを終了する
という、ブルートフォース戦法です。まあなんか諸々で高速化はされているらしいです。
そこで使用するのがこのツールです。このツールは数少ないonion v3(新しいフォーマット)に対応するVanity Address作成ツールです。あとで計算結果の"鍵"だけscpとかで本番サーバに送ればいいので、ツールを本番環境で実行する必要はありません。
makeでビルドしたのち、以下のコマンド1つでとりあえず動きます3。
./mkp224o -d onions -s -n 1 tsuku22
onions
ディレクトリに作成した鍵ファイル=ドメインファイルが入ります。今回はtsuku22qotvyqz5kbygsmxvijjg7jg2d7rgc42qhaqt3ryj66lntrmid.onion
を作成しました。この値を本番サーバへscpで送信します。
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を起動します。
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
にヒントが残っているかもしれません。
cat /var/log/daemon.log
私の場合はこのように、パス名がおかしくなっていました(これくらいTorがどうにかやってくれとは思いつつ)(これでも動いた時があった、なぜ??)。
- HiddenServiceDir /var/lib/tor/hidden_service/
+ HiddenServiceDir /var/lib/tor/hidden_service
また、secret keyのアクセス権限も正しく設定されていませんでした。
chmod 644 /var/lib/tor/hidden_service/hs_ed25519_secret_key
再度以下のコマンドを実行します。
systemctl restart tor
systemctl restart nginx
うまくいくと/var/log/daemon.log
の末尾はこのようになります。
参考文献
書籍だと前述の通り、これに非常に詳しく書かれていました。
ダークウェブの教科書 匿名化ツールの実践 (ハッカーの技術書)
この記事はめっちゃわかりやすいです。
【ダークウェブ構築】EC2のUbuntuでtor Hidden Service (.onion) サイトを構築する