You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

已知sudo密码时,Python脚本如何提权至root并运行程序?

嘿,刚好做过类似的Linux提权POC,既然已经拿到了sudo密码,用subprocess实现提权其实核心就是通过标准输入把密码传给sudo命令——毕竟默认sudo是交互式要求输入密码的,咱们得用程序把密码"喂"进去。下面分两种场景给你具体代码:

一、让当前Python脚本自提权至root

思路很直接:先检查当前进程的有效用户ID是不是0(root的UID),如果不是,就用sudo重新调用Python解释器来运行当前脚本,同时把密码通过stdin传进去。

import os
import subprocess
import sys

def escalate_to_root(sudo_password):
    # 先检查是否已经是root身份
    if os.geteuid() == 0:
        print("当前已是root权限,无需提权")
        return
    
    # 构造sudo命令:用root身份重新运行当前脚本
    cmd = ["/usr/bin/sudo", "-S", sys.executable] + sys.argv
    # -S参数是关键,让sudo从标准输入读取密码而非交互式弹窗
    
    try:
        # 启动子进程并传入密码
        proc = subprocess.Popen(
            cmd,
            stdin=subprocess.PIPE,
            stderr=subprocess.PIPE,
            text=True
        )
        # 传入密码必须加换行符,模拟用户输入密码后按回车的操作
        stdout, stderr = proc.communicate(input=f"{sudo_password}\n")
        
        if proc.returncode != 0:
            print(f"提权失败:{stderr.strip()}")
            sys.exit(1)
        else:
            # 提权成功后,原普通权限进程可以退出,新的root进程会继续执行脚本逻辑
            sys.exit(0)
    except Exception as e:
        print(f"执行出错:{str(e)}")
        sys.exit(1)

# 假设你已经通过目标方式获取到sudo密码,存在这个变量中
sudo_password = "your_obtained_password_here"

# 先执行提权操作
escalate_to_root(sudo_password)

# 提权成功后,以下代码都会以root身份运行
print("已获得root权限,可执行任意高权限操作")
print("示例:读取/etc/shadow首行内容")
with open("/etc/shadow", "r") as f:
    print(f.readline())

二、用root权限运行其他外部程序

如果不需要整个脚本提权,只是要单独运行某个特定程序(比如/bin/bash、系统命令或自定义二进制文件),直接用sudo -S调用目标程序即可:

import subprocess

def run_as_root(sudo_password, command):
    # 构造带sudo的命令列表
    cmd = ["/usr/bin/sudo", "-S"] + command
    try:
        proc = subprocess.Popen(
            cmd,
            stdin=subprocess.PIPE,
            stdout=subprocess.PIPE,
            stderr=subprocess.PIPE,
            text=True
        )
        stdout, stderr = proc.communicate(input=f"{sudo_password}\n")
        
        if proc.returncode != 0:
            print(f"命令执行失败:{stderr.strip()}")
            return None
        else:
            return stdout.strip()
    except Exception as e:
        print(f"执行出错:{str(e)}")
        return None

# 示例1:运行root权限的bash并执行命令
sudo_password = "your_obtained_password_here"
bash_result = run_as_root(sudo_password, ["/bin/bash", "-c", "whoami && cat /etc/shadow | head -1"])
if bash_result:
    print("命令输出:")
    print(bash_result)

# 示例2:运行系统级命令(比如更新包列表)
update_result = run_as_root(sudo_password, ["apt", "update"])
if update_result:
    print("包更新输出:")
    print(update_result)

几个关键注意点

  • 确保/usr/bin/sudo路径正确,大部分Linux发行版都是这个路径,少数特殊发行版可以用which sudo确认;
  • -S参数不能省略,它是让sudo从标准输入读取密码的核心配置;
  • 传入密码时必须加换行符\n,否则sudo会一直等待输入;
  • 实际POC中,密码应该是你动态获取到的值,千万不要硬编码在脚本里;
  • 提权成功与否还依赖目标用户的sudo配置,比如用户是否拥有sudo权限、是否被限制执行某些命令等。

内容的提问来源于stack exchange,提问作者Kotlinboy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 04:23:02