比赛环境下的提权
Linux提权操作存在于许多比赛环境中,比如拿到服务器普通用户权限,但是flag为root只读等等情况,都需要进行提权操作,下列方法是比赛环境中的常见提权方式(大部分都是人为产生的提权漏洞),真实环境中下列方法可能无法提权
SUID提权
什么是SUID
SUID(Set User ID)是 Linux 文件权限中的一个特殊标志位。当一个可执行文件设置了 SUID 后,任何用户运行它时,进程会以该文件所有者的身份运行,而不是以当前用户的身份运行。
例如,我们先查找一下哪些命令有SUID权限 find / -perm -u=s -type f 2> /dev/null :

可以看到默认情况下有这些,我们以 passwd 举例,查看一下文件信息,可以看到存在s标志位,意为有SUID权限

我们都知道,普通用户修改密码时,需要修改 etc/shadow ,但这个文件只有 root 才能写入。当passwd 设置了 SUID 后,普通用户运行它时,进程临时拥有 root 权限,所以能完成密码修改。这就是SUID的设计初衷,让普通用户执行某些操作时,临时拥有root权限
这里推荐一个网站,可以直接查询对应命令所能利用的提权方法
Find
在ctf比赛中,主办方可能会人为地给一些命令赋予SUID权限,其中就包括find。在真实环境中,老版本的 Ubuntu(以及其他一些早期 Linux 发行版)中,find 命令曾经默认带有 SUID 权限。
比如这里我们手动给Find一个SUID

再使用 -exec 参数执行命令,这里我们直接whoami,可以看到命令执行的一瞬间,是root权限

那我们可以直接 bin/bash -p 新开一个会话,提权成功
这里的
-p是 privileged(特权模式) 的意思。让 bash 保留当前的用户(root) ID,不主动降权。如果没有 -p ,bash 会“自我保护”——自动丢弃 root 权限

xxd
xxd 是 Linux下一个非常实用的小工具,主要用来把二进制数据转换成十六进制显示
在xxd有SUID权限的情况下,可以直接读文件,这里以 /etc/shadow 文件举例,普通用户是无法查看的,我们直接 xxd /etc/shadow ,就可以读到了

date
date命令是用来查看或设置系统的日期和时间的,但也可以用来读文件,在有SUID权限的情况下,也可以读取普通用户无法读取的文件,这里我们还是读取shadow文件 date -f /etc/shadow

CP/MV
这两个命令可以覆盖文件,所以当这两个命令有SUID权限的情况下,可以直接覆盖 etc/passwd 文件,从而修改root密码,或者添加管理员用户,从而提权
SUID提权的命令有很多,这里就先举例到这。
在比赛中可以先查一下主办方给了哪些命令SUID权限find / -perm -u=s -type f 2> /dev/null,再上这个网站查一下怎么用即可。
Cronjobs定时任务提权
在某些CTF比赛中,题目开启了Cronjobs定时任务,并且定时任务是以root权限执行 /tmp 或其他目录下的脚本,而这些目录对普通用户可写,那么参赛者就可以替换脚本内容,等待 Cron 执行后获得 root shell。
在这里我们演示一下,假设任务计划执行的是py脚本,权限746,位于 /tmp 临时文件夹,有执行权限,且普通用户可编辑

cleanup.py内容如下,是一个类似清理日志的脚本

随后我们添加任务计划 vim /etc/crontab,意为每分钟执行一次py脚本

到这里,思路就清晰了。任务计划以root权限执行,而执行的py脚本所有人可以编辑,所以我们可以编辑任务计划,做一个反弹shell,弹回来就是root权限,从而提权
那么这里我们切换回普通用户,写入一个反弹shell。这里推荐一个生成反弹shell的网站

随后监听反弹shell,提权成功

当然要使用任务计划提权,条件也很苛刻:
- 必须是root执行这个任务计划
- 执行的文件必须对普通用户可写
- 执行的文件内可以执行系统命令
sudo提权
在 CTF 比赛中,当拿到一个低权限 shell 后,第一时间要执行的命令之一就是 sudo -l,列出当前用户被允许(或禁止)执行的 sudo 命令
示例输出:
$ sudo -l
Matching Defaults entries for alice on this host:
env_reset, mail_badpass,
secure_path=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
User alice may run the following commands on this host:
(root) NOPASSWD: /usr/bin/vim
(ALL) /usr/bin/systemctl restart nginx这个输出的意思是:
- alice 可以无需密码以 root 身份运行
vim - alice 可以以任意用户身份运行
systemctl restart nginx(需要密码)
拿到输出后,也可以直接去 GTFOBins 查对应命令有没有已知的逃逸方式,往往直接就能提权。
sudo find
这里我们做个测试,先用root编辑 /etc/sudoers 配置文件,让我们的普通用户可以以root权限执行 find 命令,且无需密码
# User privilege specification
root ALL=(ALL:ALL) ALL
# Members of the admin group may gain root privileges
%admin ALL=(ALL) ALL
# Allow members of group sudo to execute any command
%sudo ALL=(ALL:ALL) ALL
# See sudoers(5) for more information on "@include" directives:
jerry ALL=(root) NOPASSWD:/usr/bin/find记得把
find命令的SUID权限取了,如果前面配置了
随后我们直接Find提权,可以发现无需密码,直接进入root会话,提权成功

注意这里不是SUID提权,find 在这里没有SUID权限,而是sudo提权
sudo less
除了 find ,还有 less 也可提权,这里我们依旧编辑 sudoers 配置文件,允许普通用户以root权限 less 查看Ubuntu日志
# Cmnd alias specification
# User privilege specification
root ALL=(ALL:ALL) ALL
# Members of the admin group may gain root privileges
%admin ALL=(ALL) ALL
# Allow members of group sudo to execute any command
%sudo ALL=(ALL:ALL) ALL
# See sudoers(5) for more information on "@include" directives:
jerry ALL=(root) NOPASSWD:/usr/bin/less /var/log/syslog随后我们切换普通用户 sudo 执行:sudo less /var/log/syslog

因为 less 命令执行后,程序并不会退出,还可以在下方输入命令进行执行,直接 !/bin/bash 开启一个新会话。而这条 less 命令是 sudo 以 root 权限执行的,所以新的会话自然是root,提权成功

真实环境下的提权
sudo自身漏洞提权
sudo 命令在不同版本下,存在不同情况的提权漏洞,可以在Exploit Database上查询
我们在测试环境执行 sudo --version 来查看当前 sudo 版本,可以看到是1.9.15p5,是个较高的版本

来到Exploit Database上查询,可以看到对应sudo漏洞,刚好是我们这个版本,并且该漏洞在1.9.17p1才被修复

漏洞原理大致是:
sudo 有一个 -h <主机名> 参数,本意是列出某台远程主机上的权限规则(仅用于查询,不执行命令)。
但漏洞在于:当你用 -h 指定一个有权限的远程主机名时,sudo 会错误地把那条规则当作在本机也有效,从而允许命令执行。
接下来我们复现一下,首先创建一个低权限用户test,并加入test用户组,确保没有任何sudo执行权限


随后 root 执行 visudo 编辑 sudoers 文件,我们需要编写两条主机别名,并划清 test 用户在这两个主机名上的权限

Ctrl + O 保存后退出,随后使用test用户,sudo -l 查看当前权限,可以看到是不可sudo执行任何命令

随后 sudo -h testEnvironment -i ,可以发现提权失败了,我们的系统可能打了补丁,修复了这个问题,报错提示说:a remote host may only be specified when listing privileges.,提权失败~

可能在没有打补丁的系统中,或许能提权成功吧......

总结
Linux提权往往是内网渗透的必要条件,拿到低权限shell后,第一时间收集各类版本信息,并上网查询对应版本已存在的可利用提权方法,逐一尝试。
祝你在提权的道路上一帆风顺!
版权声明:本文采用 CC BY-NC-SA 4.0 协议授权,转载请注明出处并保留原始链接。
原文链接:https://www.jerrygao.cn//blog/E4BA94E7A78DE58FAFE8A18CE79A84linuxE68F90E69D83E696B9E5BC8F
评论 1
后台又让我破开了,我啥也没干,就进去看了看,日志我删了,验证码的php明文防回的token记得加密
感谢大佬放我一马,正在修复😂
你后台密码是啥?找到后台了,但是密码不对。
666密码你猜吧
