
最小限のalpine Dockerコンテナ内でTor、proxychains、dnsmasqを使用してnmapで.onion隠しサービスをスキャンします。
Torネットワーク上の隠し「オニオン」サービスをスキャンするためにnmapを使用します。alpineベースの最小限のイメージで、proxychainsを使用してnmapをラップします。Torとdnsmasqはs6を介してデーモンとして実行され、proxychainsはTor SOCKSプロキシ(ポート9050)を使用するようnmapをラップします。TorはDNSPortを介して、ポート9053へのDNSリクエストを匿名で解決するよう設定されています。dnsmasqはこのlocalhost:9053を権威DNSサーバーとして設定されています。Proxychainsはローカルリゾルバ経由でDNSをプロキシするよう設定されているため、すべてのDNSリクエストはTorを経由し、アプリケーションは.onionアドレスを解決できます。
$ docker run --rm -it milesrichardson/onion-nmap -p 80,443 facebookcorewwwi.onion
[tor_wait] Wait for Tor to boot... (might take a while)
[tor_wait] Done. Tor booted.
[nmap onion] nmap -p 80,443 facebookcorewwwi.onion
[proxychains] config file found: /etc/proxychains.conf
[proxychains] preloading /usr/lib/libproxychains4.so
[proxychains] DLL init: proxychains-ng 4.12
Starting Nmap 7.60 ( https://nmap.org ) at 2017-10-23 16:17 UTC
[proxychains] Dynamic chain ... 127.0.0.1:9050 ... facebookcorewwwi.onion:443 ... OK
[proxychains] Dynamic chain ... 127.0.0.1:9050 ... facebookcorewwwi.onion:80 ... OK
Nmap scan report for facebookcorewwwi.onion (224.0.0.1)
Host is up (2.7s latency).
PORT STATE SERVICE
80/tcp open http
443/tcp open https
Nmap done: 1 IP address (1 host up) scanned in 3.58 seconds
コンテナが起動すると、Torとdnsmasqをデーモンとして起動します。tor_waitスクリプトがTor SOCKSプロキシが起動するのを待ってから、コマンドを実行します。
デフォルトでは、docker runの引数は/bin/nmapに渡され、nmapがTor経由で動作するために必要な引数-sT -PN -n "$@"でnmapを呼び出します(explainshell.com経由)。
例えば、次のように指定すると:
docker run --rm -it milesrichardson/onion-nmap -p 80,443 facebookcorewwwi.onion
次のように実行されます:
proxychains4 -f /etc/proxychains.conf /usr/bin/nmap -sT -PN -n -p 80,443 facebookcorewwwi.onion
nmap用のカスタムスクリプトに加えて、curlおよびnc用のカスタムラッパースクリプトが/bin/curlと/bin/ncに存在し、これらをproxychainsでラップします。これらを呼び出すには、docker runの最初の引数としてcurlまたはncを指定するだけです。例:
docker run --rm -it milesrichardson/onion-nmap nc -z 80 facebookcorewwwi.onion
次のように実行されます:
proxychains4 -f /etc/proxychains.conf /usr/bin/nc -z 80 facebookcorewwwi.onion
また、
docker run --rm -it milesrichardson/onion-nmap curl -I https://facebookcorewwwi.onion
次のように実行されます:
proxychains4 -f /etc/proxychains.conf /usr/bin/curl -I https://facebookcorewwwi.onion
元の/usr/bin/nmapや/usr/bin/nc、/usr/bin/curlを含む他のコマンドを呼び出したい場合は、docker runの最初の引数として指定できます。例:
docker run --rm -it milesrichardson/onion-nmap /usr/bin/curl -x socks4h://localhost:9050 https://facebookcorewwwi.onion
環境変数は1つだけです:DEBUG_LEVEL。0以外の値に設定すると、より多くのデバッグ情報が表示されます(具体的には、Torの起動を待つ間のTorへの接続試行)。例:
$ docker run -e DEBUG_LEVEL=1 --rm -it milesrichardson/onion-nmap -p 80,443 facebookcorewwwi.onion
[tor_wait] Wait for Tor to boot... (might take a while)
[tor_wait retry 0] Check socket is open on localhost:9050...
[tor_wait retry 0] Socket OPEN on localhost:9050
[tor_wait retry 0] Check SOCKS proxy is up on localhost:9050 (timeout 2 )...
[tor_wait retry 0] SOCKS proxy DOWN on localhost:9050, try again...
[tor_wait retry 1] Check socket is open on localhost:9050...
[tor_wait retry 1] Socket OPEN on localhost:9050
[tor_wait retry 1] Check SOCKS proxy is up on localhost:9050 (timeout 4 )...
[tor_wait retry 1] SOCKS proxy DOWN on localhost:9050, try again...
[tor_wait retry 2] Check socket is open on localhost:9050...
[tor_wait retry 2] Socket OPEN on localhost:9050
[tor_wait retry 2] Check SOCKS proxy is up on localhost:9050 (timeout 6 )...
[tor_wait retry 2] SOCKS proxy UP on localhost:9050
[tor_wait] Done. Tor booted.
[nmap onion] nmap -p 80,443 facebookcorewwwi.onion
[proxychains] config file found: /etc/proxychains.conf
[proxychains] preloading /usr/lib/libproxychains4.so
[proxychains] DLL init: proxychains-ng 4.12
Starting Nmap 7.60 ( https://nmap.org ) at 2017-10-23 16:34 UTC
[proxychains] Dynamic chain ... 127.0.0.1:9050 ... facebookcorewwwi.onion:443 ... OK
[proxychains] Dynamic chain ... 127.0.0.1:9050 ... facebookcorewwwi.onion:80 ... OK
Nmap scan report for facebookcorewwwi.onion (224.0.0.1)
Host is up (2.8s latency).
PORT STATE SERVICE
80/tcp open http
443/tcp open https
Nmap done: 1 IP address (1 host up) scanned in 4.05 seconds
execを実行してnmapなどのコマンドを呼び出します