已知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
相关产品推荐
相关产品推荐

