Linux 提权之提权大赏

笔记目录

1、可读shadow文件利用提权

条件:
枚举shadow文件,看到shadow文件是全局可读的,这是可以利用的

利用流程:
将有hash的用户提取出来,可以尝试暴力破解

破解hash值

登陆root用户,成功提权

2、可写shadow文件利用提权

条件:
枚举shadow文件,看到shadow文件是全局可写的,这是可以利用的

利用流程:
因为是利用重要文件的可写属性,会修改文件,所以在操作之前对于shadow文件进行一个备份

提权路径:既然这个文件可写,我们肯定希望把root用户的密码hash替换成我们自己的
先在kali做一些准备,生成明文密码的hash
-m 指定加密方式,一般linux用户shadow文件中存储的是sha-512加密算法的hash
参照kali中shadow文件root用户的hash值替换保存起来备用

回到靶机,现在我们需要把准备好的root用户的hash替换靶机中的


登陆root用户,成功提权

3、可写passwd文件利用提权

条件:
枚举passwd文件,看到passwd文件是全局可写的,这是可以利用的

利用流程:
现在的Linux发行版密码hash都是存储在shadow文件中的,passwd只用一个x来占位
重要文件先备份,1、防止误操作,方便可以退回;2、渗透测试结束后,方便还原系统
然后生成自己密码的hash,写到passwd中,替代x
补充:其实mkpasswd和openssl这两种命令生成hash值都是可以的,只是因为mkpasswd是shadow实用工具套件之一,而在passwd文件中大家更习惯于用openssl生成临时使用很便捷的hash值


登陆root用户,成功提权

4、sudo环境变量提权

条件:
env 指环境变量
env_reset 指重置环境变量,也是系统的一个安全属性,就是用sudo去执行命令的时候,把之前的环境变量清楚,本来这是一条安全属性,这么执行就够了
但是,当前用户有env_keep命令选项,指环境变量保持
LP=linker dynamic 动态连接器,能够预加裁共享库的这么一个功能

利用流程:
提权路径:既然它能够加载共享库,那我们就定义一个共享库,我们用C语言来实现
引入需要的库
因为是预加载,所以要声明这么一个函数,实现提权操作
unsetenv("LD_PRELOAD"); 因为是预加载的,我们只需要它加载一遍就够了,所以在开始执行之后,就把预加载的环境变量卸掉


c语言共享库的编译
-fPIC 指定文件位置的无关参数,因为它在运行时,需要被映射到不同程序的内存空间
-shared 指定shared关键字
-o 输出 共享库文件 源文件
-nostartfiles 我们希望执行共享库之后,只启动新的shell会话,不需要其他功能,也可以加这么一个参数

上面我们解决了提权的逻辑,但还需要提权的权限,正好从上面枚举sudo得知,find具有root执行的权限,
我们继承了find命令的sudo权限,在find之前预加载了这个DL动态连接器,而这里面有提权逻辑。

反推一下,根据sudo -l的列表显示,find命令本身就可以实现提权的,但是提权逻辑是在find的执行之后,或者要给find相关语句,现在是我们并不需要给find的任何语句,因为预加载了一个我们的提权逻辑

5、自动任务文件权限提权

条件:
查看系统自动任务

利用流程:
提权路径:可以看到有一个每分钟以root的用户身份执行overwrite.sh脚本,尝试进行反弹shell
locate 查找文件位置,查看得知我们是有overwrite.sh脚本的可写权限

先在kali本地建立一个监听

回到靶机构造反弹shell,并写入具有自动执行的脚本里


kali获得反弹shell,并通过python反射实现交互提升

6、自动任务PATH环境变量提权

条件:
查看crontab 系统自动任务,得知有SHELL的指定,也有PATH路径变量的指定,并且我们注意到在以冒号分隔的路径集中,第一个显示的是user的家目录,而当前我们获得的系统初始shell用户名就是user,同时我们可以查看到overwrite.sh脚本并没有用绝对路径

利用流程:
提权路径:那我们可以考虑在家目录中给他一个“李鬼”,他会优先读取家目录的内容,就不会读取/usr/local/bin/这个目录下的overwrite.sh脚本文件,这里有两个前提,1、因为在程序执行时,它会按照pass变量中靠前的路径先执行的原则去寻找文件,2、crontab中的路径是自动任务执行的时候使用的路径,它不会使用用户自定义的路径
可以看一下我们能定义的这个路径是什么样,这个路径集中并不包括当前用户的家目录,即使包括,crontab在执行的时候也不会理他,而是用chrontab自己指定的PATH变量路径集

提权过程
创建一个同名的文件overwrite.sh,并写入能提权脚本,给上执行权限。因为我们现在就在我自己的家目录,也就是crontab指定的PATH变量路径集中的第一个位置


等1分钟再执行,就应该可以了
-p 运行可执行文件获取root权限

7、自动任务通配符提权(tar)

条件:
可以看到第二个自动任务脚本中,用tar打包家目录中所有文件,并存在临时目录下,每分钟去备份,这是很符合真实服务器配置需求的,经常管理员会对重要的目录按周期进行备份

利用流程:
tar 的相关选项
--checkpoint=n 每写入n项记录进行一次检查点操作
--checkpoint-action=ACTION 在每个检查点执行指定的动作


先在kali中构造一个最简单的二进制反弹shell

并架设一个简单web服务器,用于传递反弹shell脚本

并在新窗口建立一个本地监听

回到靶机中,下载下来,并给上执行权限


然后因为要用到car的检查点去提权,需要建这么几个文件

然后等待让自动任务每分钟去打包家目录下的文件,然后通过tar的checkpoint去执行我们的反弹shell,并通过python反射实现交互提升

8、SUID可执行文件已知利用提权(exim-4.84-3)

条件:
手动枚举,查找具有UID权限的可执行文件命令,用find去从根目录下搜索,按权限查找具有SU权限的文件,类型是f 文件,因为当前用户是低权限用户,用户会有很多报错,所以直接扔掉
执行如下这些文件将以属主的权限运行,会获得提权路径

利用流程:
现在我们关注exim-4.84-3这个
使用searchsploit 查找漏洞工具,可以看到有一个本地提权利用

-m 下载


并架设一个简单web服务器,用于传递提权脚本

回到靶机中,下载下来,并给上执行权限


然后执行进行提权

9、SUID共享库注入提权(suid-so)

条件:
手动枚举,查找具有UID权限的可执行文件命令,执行这些文件,将会以属主的权限运行,会获得提权路径

利用流程:
执行查看这个命令的具体功能,发现只有:计算一些事,请等待,+进度条,没有其他任何信息

这样我们通过string查看可读字符串有哪些,发现执行了一个so格式的共享库,我们就可以修改这个共享库文件达到提权

在这之前,我们先用strace工具做一下追踪,并把错误信息重定向显示出来,发现并没有这个共享库文件

之后我们就在这个目录下写入最简单的提权语句,并进行编译


再次执行这个命令,发现命令行提示符带有“#”号,用户名已经是root,提权成功

10、SUID环境变量利用提权(相对路径suid-env)

条件:

利用流程:
执行查看这个命令的具体功能

这样我们通过string查看可读字符串有哪些,发现设置了一些组id和用户id,然后还存在使用service启动apache2服务,但是这里是相对路径,便可以进行利用
利用原理:相对路径我们可以对它进行劫持,让它运行我们给他提供的service,而不是传统的系统里面的那个service

实现一下,用c语言编写一个提权代码,并编译成service这个名字,让它优先读取,再次执行发现并没有优先执行我们的service文件


对service路径进行指定,把当前路径放在环境变量中最前面,因为相对路径肯定就是在$PATH这个环境变量依次去找

再次执行这个命令,发现命令行提示符带有“#”号,用户名已经是root,提权成功

11、巧用SUID-shell功能提权#1(绝对路径suid-env2)

条件:

当bash版本<4.2时,可以在bash中定义函数,然后用路径的组合做文件名

利用流程:

利用bash版本<4.2,定义一个函数,这个函数名称就是这个路径,bash语言提权命令
export -f 导出函数

再次执行这个命令,发现命令行提示符带有“#”号,用户名已经是root,提权成功

12、巧用SUID-shell功能提权#2

条件:

当bash版本<4.4时,可以考虑调试模式下对bush的环境变量进行设置

利用流程:

利用bash版本<4.4,并对环境变量提前进行设置
-i 忽略当前已有的任何环境变量的选项
SHELLOPTS 指定环境变量的选项集,可以有多个选项,用冒号讲行分割
xtrace 用于任何命令,在执行每个命令之前先打印这个命令
PS4 提示字符串下加入提权代码,结合着刚刚我们设定的xtrace来使用的

-p 特权模式,
发现命令行提示符带有“#”号,用户名已经是root,提权成功

13、密码和密钥历史文件提权

条件:
查看历史命令,是否存在敏感文件

利用流程:
猜想系统root用户是否时这个密码,进行碰撞,成功率是很高的

这种情况在实际渗透测试也会经常发生
查看家目录下所有history相关的文件,指定一个les,列出相关信息

还可进行查看.viminfo文件,也有可能会有敏感信息

14、密码和密钥配置文件查看提权

条件:
关注网站、应用、可能连接数据库的各种配置文件等,根据枚举看到系统有哪些应用来排查的

利用流程:
查看相关文件,并对敏感信息追踪

15、SSH密钥敏感信息提权

条件:
查找是否有ssh相关信息,因为SSH不但高权限用户能够使用,我们获得的低权限用户也可能允许使用SSH密钥这种方式进行登录

利用流程:
查看到根目录下有.ssh的隐藏文件,发现正好是SSH的私钥

复制粘贴拿到kali中,使用ssh进行连接
并指定公钥、主机支持的算法类型

16、NFS提权

条件:
NFS 共享文件模式,网络文件分享
枚举exports是否有NFS服务

/tmp 共享的路径
* 任意主机都可以链接
rw 读写
sync 同步的意思,是指所有操作都立即生效
insecure 是允许使用非保留的端口进行连接
no_root_squash 表明不希望将root用户请求映射为匿名用户,就是允许以root用户方式连接NFS
no_subtree_check 指不希望进行此检查
利用流程:
回到kali中,切换到root用户,确保连接的时候是以root方式进行连接的

mount进行挂载
vers=3 指定NFS的版本,2、3都可以

查看tmp目录下挂载后的信息

现在需要将我们的提权文件写进去,用linux系统中可执行文件来实现,建立提权文件

查看NFS共享库目录下,是否有这个文件,给上执行权限

在靶机中执行它,便以属主的权限启动新的办事,提权成功

17、内核利用提权(40839.c)

条件:
查看内核版本,2.6.32是一个比较低的版本,尝试利用提权

利用流程:
尝试用linpeas.sh对于内核的漏洞进行枚举
-L 追踪重定向的链接
| sh 用管道符给到sh去执行

但是发现靶机这里没有curl命令,我们变通一下,回到kali中下载linpeas.sh

然后用nc建立一个监听,同时把linpeas.sh输入到nc中

然后在靶机中执行扫描,用cat接收伪设备传递来的扫描

查看到漏洞扫描结果,提示有脏牛漏洞,编号是40611

回到kali中,使用searchsploit查找并下载下来

简单查看一下利用文件源码,上面是注释,下面是利用代码,重点关注下编译方法和使用方法,发现要进行编译,然后直接执行就好

使用PHP建立一个简易的web服务器用来传递利用文件

靶机下载下来

按照它的方法编译,并执行,发现报错,从上面源文件分析得知,它使用写访问,占位符操作的

从之前searchsploit查找情况得知,追踪查找一下Dirty COW相关的漏洞,发现还有一个passwd这个可能会更加直观一点

可以在这里先看一下40839文件的操作,比较用法上的差别,发现更为简单一点,编译执行,或者在执行的时候给一个密码,su直接切换就行


下载下来存在本地,并通过web服务器传递到靶机中


进行编译和执行,提权成功

18、doasless+vi提权

条件:
查看当前用户有哪些特权

利用流程:
查看doas配置文件,发现在没有密码的情况下环保持境变量为user的用户可以按照root的方式去执行

用它less这个命令来读这个日志,less查看文档时可以按v变成可编辑状态(vi)
那现在想想,现在我们可以进入编辑状态,但是权限时doas给的,具有root权限,那我们就可以在vi的这个环境下使用"!"启动一个shell,而这个shell里面继续执行了一个新的shell


已经可以发现命令行提示符带有“#”号,用户名已经是root,提权成功

19、利用MOTD机制提权

条件:
motd 登录时显示Linux系统的欢迎信息,00-header这个文件内容是显示在最前面的
在Linux中,/etc/update-motd.d目录下的脚本和程序是以root用户的身份运行的。
/etc/motd是一个文本文件,用于在用户登录系统时显示一条消息。该消息通常用于向用户提供系统的重要信息、公告、警告或其他相关通知

利用流程:
我们就可以直接把反弹shell写进去


回到kali设置一个监听

退出并重新登录,使靶机执行motd.d目录

查看kali监听,发现命令行提示符带有“#”号,用户名已经是root,提权成功

20、可预测PRNG暴力破解SSH提权

条件:
当拿到服务器用户的公钥后,可以使用我们自己的私钥库进行碰撞

利用流程:
利用prng 伪随机数生成器,并-m 下载下来


查看5622.txt得知使用方法,根据提示先下载伪随机数生成器压缩包文件,然后解压,然后运行下面的脚本,其实逻辑就是grep搜索


查看解压后的文件,发现有非常多的文件对,.pub文件是指的公钥,同名文件则是对应私钥

我们把已知公钥取一段就可以,太短容易会碰撞出多个相同文件,太长耗时,一般取30多个字符就行

利用grep 命令进行搜索碰撞公钥,如果搜索到对应公钥,则可以利用私钥无密登录
-l 搜索到结果后列出文件名
-r 递归搜索,如果有多层目录的话
发现可以碰撞出,我们直接把同名文件私钥拿来ssh登录就行


通过指定公钥、主机支持的算法类型,成功无密码登录该用户