ssh ポートフォワーディング#
横断的な内部ネットワークプロキシのプロセス中に、ターゲットマシンが Linux サーバーである場合、ssh を使用して内部ネットワークプロキシ操作を実現することができます。最も一般的に使用されるのはダイナミックフォワーディングです。
ssh には 3 つのポートフォワーディングモードがあります:
-
ローカルフォワーディング(-L オプション)
-
リモートフォワーディング(-R オプション)
-
ダイナミックフォワーディング(-D オプション)
-
攻撃マシン:攻撃者のマシン
-
ログイン待機マシン:制御された Linux サーバー
-
ターゲットマシン:攻撃マシンが直接アクセスできないターゲットホスト
ローカルフォワーディング#
ローカルフォワーディングは、ローカルホストのポートをログイン待機ホストのポートを介してリモートホストのポートに転送することを意味します。
ローカルフォワーディングは、-L オプションで指定され、次の形式です:ssh -L [攻撃マシンのIP]
:<攻撃マシンのポート番号>:< ターゲットマシンの IP>:< ターゲットマシンのポート番号 > < ログイン待機マシンのユーザー名 >@< ログイン待機ホストの IP>
以下のシナリオを想定してみましょう:
攻撃者は攻撃マシン
を介してLinuxサーバー(ログイン待機マシン)
を制御し、アカウントとパスワードを取得しました。そして、ターゲットマシンがありますが、このマシンは内部ネットワークにあり、攻撃マシン
からアクセスすることはできませんが、ログイン待機マシン
からアクセスすることができます。以下のトポロジ図のようなものです。
この場合、host1
がhost3
にアクセスする方法はありますか?
host2
を介して転送する必要があります。host2
は中間者として機能し、host1
とhost3
の間の暗号化されたデータを転送します。
たとえば、host3 には 80 番の Web サービスポートがあり、host1 はこの Web サービスにアクセスする必要があります。その場合、host1 で ssh 接続して host2 にログインするだけで、ローカルポートフォワーディングが実現できます。
host1 での操作
ssh -L 0.0.0.0:8888:10.10.10.129:80 [email protected]
- 攻撃マシンの IP はオプションであり、次のように書くこともできます。
ssh -L 8888:10.10.10.129:80 [email protected]
このコマンドは、ターゲットマシンの 80 ポートを攻撃マシンの 8888 ポートにマッピングします。この時点で、攻撃者はローカルの 8888 ポートにアクセスするだけで、ターゲットマシンの 80 ポートにアクセスできます。
リモートポートフォワーディング#
以下のシナリオを想定してみましょう。このシナリオはペネトレーションテストではあまり一般的ではありませんが、host1 は host3 に直接アクセスすることは許可されておらず、host2 は host3 にアクセスできますが、host1 は host2 にアクセスできません。この場合、リモートポートフォワーディングが使用されます。
host2 での操作
ssh -R 0.0.0.0:8888:10.10.10.129:80 [email protected]
または
ssh -R 8888:10.10.10.129:80 [email protected]
このコマンドは、ターゲットマシン(host3)の 80 ポートをログイン待機マシン(host2)の 8888 ポートにマッピングします。この時点で、攻撃者はローカルの 8888 ポートにアクセスするだけで、ターゲットマシン(host3)の 80 ポートにアクセスできます。
ダイナミックポートフォワーディング#
ダイナミックフォワーディングは、-D オプションで指定されます。
形式:-D [ローカルホスト:]
ローカルホストポート
前述の 2 つと比べて、ダイナミックフォワーディングはリモートホストとそのポートを指定する必要がなく、SOCKS プロトコルを介してデータ転送が行われます。
以下のシナリオを想定してみましょう:
攻撃者は攻撃マシン
を介してLinuxサーバー(待機マシン)
を制御し、アカウントとパスワードを取得しました。そして、ターゲットマシンがありますが、このマシンは内部ネットワークにあり、攻撃マシン
からアクセスすることはできませんが、待機マシン
からアクセスすることができます。以下のトポロジ図のようなものです。
攻撃マシン(host1)で操作
ssh -D 127.0.0.1:8888 [email protected]
または
ssh -D 8888 [email protected]
このコマンドは、SOCKS プロキシを作成し、そのプロキシを介して送信されるすべてのデータパケットが host2 を経由して転送されるようにします。
どのように使用しますか?
- Firefox ブラウザを使用して、ブラウザで SOCKS5 プロキシ 127.0.0.1:8888 を設定し、ブラウザで host2 が存在するネットワーク内の任意の IP にアクセスできるようにします。
- 通常のコマンドラインアプリケーションの場合、proxychains-ngを使用します。次のようなコマンドを参照してください:
brew install proxychains-ng
設定ファイルを編集します
vim /usr/local/etc/proxychains.conf # ProxyListセクションの下に "socks5 127.0.0.1 8888" の設定を追加します
ターゲットネットワークにアクセスする
proxychains-ng wget http://10.10.10.129 # 他のコマンドラインの前にproxychains-ngを追加します
SSH トンネルの一般的なパラメータ:
-C 圧縮転送、転送速度の向上
-f データ転送をバックグラウンドで実行する
-N サイレント接続を確立する
-g リモートホストがローカルホストのポートに接続することを許可する
-L ローカルポートフォワーディング
-R リモートポートフォワーディング
-D ダイナミックポートフォワーディング、つまり SOCKS プロキシ
-p SSH 接続ポートを指定する
実験環境の構築#
環境の設定#
- 攻撃マシン
- 17.1.26.131
- ログイン待機マシン
- 17.1.26.133
- 10.10.10.130
- ターゲットマシン
- 10.10.10.129
ローカルポートフォワーディング#
攻撃マシン(host1)で次のコマンドを実行します:
ssh -L 8888:10.10.10.129:80 [email protected]
攻撃マシン(host1)でポートの状態を確認すると、8888 ポートがリッスンされていることがわかります。
ローカルホストでブラウザを開き、8888 ポートにアクセスして成功するかどうかを確認します。http://127.0.0.1:8888/123.aspにアクセスしてください。
リモートポートフォワーディング#
環境は前と同じですが、次のコマンドをログイン待機マシン(host2)で入力します:
ssh -R 8888:10.10.10.129:80 [email protected]
ローカルホストに戻り、ポートが開いているかどうかを確認します。netstat -tnlp を実行し、8888 ポートが開いていることが表示されます。
同時に、ブラウザを開いてhttp://127.0.0.1:8888/123.aspにアクセスし、成功するかどうかを確認します。
ダイナミックポートフォワーディング#
環境とローカルフォワーディングは同じですが、攻撃マシン(host1)のコマンドラインウィンドウで次のコマンドを実行し、ssh ログインパスワードを入力します:
ssh [email protected] -D 55555
攻撃マシン(host1)でポートの状態を確認します。
攻撃マシン(host1)でブラウザの SOCKS プロキシを設定します。
攻撃マシン(host1)のブラウザで直接http://10.10.10.129/123.aspにアクセスします。
参考#
https://jeremyxu2010.github.io/2018/12/ssh%E7%9A%84%E4%B8%89%E7%A7%8D%E7%AB%AF%E5%8F%A3%E8%BD%AC%E5%8F%91/
https://www.ruanyifeng.com/blog/2011/12/ssh_port_forwarding.html
https://reznok.com/ssh-tunneling-magic/
画像提供