essay - 2022 middle

First Post:
Last Update:
Word Count: 2.2k
Read Time: 8min

[TOC]

观前提示

本篇文章我会比较随意发挥 算是属于想到哪里讲到哪里 可能并没有什么逻辑。老规矩先给各位来一首歌。

祝各位不会 No Roots

正文

第一次日站

今年三月份那时我日下了人生中第一个站,对方服务基本都是以 API 形式暴露的,所以信息收集从去年做到了今年,三月份某天发现目标 Yapi 暴露在外网。我粗粗一看,开了注册口,立马注册了一个测试用户,创建项目,然后随手检查了不久前出的 Yapi RCE 洞,随手就拿下了 Shell ,然后对利用的 Mock script 进行一手魔改,做成了一个简易的 webshell, 快快乐乐的拿下了生产资料。

魔改的代码 已经开源出去了 https://github.com/Esonhugh/yapi-rce-webshell

1
2
3
4
5
webshell.py http://<target>/test/test2 . cat /etc/passwd

{'dir': '.', 'cmd': 'cat /etc/passwd'}
root:x:0:0:root:/root:/bin/bash
....

这样他就可以执行你想要的任意一个命令了

为什么采用这种方法其主要原因是:当时对方机器在内网是穿出来的,内网环境其他网络链接几乎全部受控。贸然连上自己的 控制服务器 或者自己的服务,风险其实很高,而且我尝试过反弹,但是我发现根本出来常用的几个网站其他基本连不了。所以最后被逼无奈使用这种 webshell 的方法。

进去就是 root ,都不用提权。之后发现 Jenkins 收集了大多数配置信息摸清楚对方 CICD 是用在测试上的 一整个服务器和其他几个服务器都是 测试环境 k8s 。也正是因为这个 Jenkins 才有了 那时候 DASCTF 的那道题。

第一次的出题

DASCTF x SU 那次比赛因为我是 Team-SU 成员之一。所以看到群里师傅们出题,我也有参与到。

当时并没有想好具体出什么 (主要还是懒 想搞一个简单点的题目 别环境太复杂 搞个半天)于是就借用了 渗透中的一次经历的一部分。

于是乎搞了一个

graph LR Rce --> gitRepo & Webshell Webshell --> ping --wireshark_filter--> Jenkins_secrets --> git_sshkey git_sshkey & gitRepo --> git_history --> flag

核心关键点在于 wireshark 抓包过滤规则,git 使用,如何泄露源码仓库地址。

后来发现有非预期 主要是因为 github deploy key 是有提示的。ssh -t 就能出 属于是非预期,但是也很合理。

第一份 CVE

缘起

在四月份,某天我的同事也是我的好兄弟在做一个项目的时候,邀请我来进行网站的简单测试,于是我毫不客气地打开了网站,毫不犹豫的摸了摸一些相关与 API 交互的接口。当然我有看过源码,这些接口都有做过过滤以及完善的逻辑,基本上是不存在问题的。于是抱着瞎整活的目的,我尝试在测试图片消息的时候传输了一段自己的头像。也就是喜闻乐见的 Image

就在这时我注意到一个问题,那就是我鼠标划过图片消息所在的 column 的时候我发现他的 tooltip 自动加载出来了我的 image。所实话我当时就觉得有所警惕。因为理论上我输入的是文本内容,不应该产生如上的结果。我敏感的意识到,这里可能有问题,于是我试探性的使用了 onload=alert(1) 尝试验证一波我的猜想。

果不其然,鼠标一划过,界面开始加载我的图片,但是我没有看到 弹出提示,我愣了一下,图片完全加载完毕之后,预计之中的 弹窗他就出现了。我当场就把正在摸鱼的我的好兄弟叫过来了,向他展示了这个新奇的发现。(打心底里来说,他能写出 XSS 我是不信的,他好歹也是搞过安全的人)只见他细细一看,鼠标一滑,眉头一皱。他立马神情凝重的回到办公位,哈哈坐牢了,细细看起出问题的地方。横看竖看,翻了文档又看了github。他说 “这绝壁**是框架的锅”。(我当时想的是 好家伙 怕不是一个洞哦)我当时说,能不能给个简单的小的演示样例。(原谅我,我一点 Vue 都不会写,当时我甚至都没有开始学前端。当然开始学前端也大概在这件事情之后没多久了。)很快他就有了 演示样例。

也就是 https://github.com/asjdf/element-table-xss-test

浅浅的分析一手

炒一手冷饭

那么这里是什么问题呢

当时我是分析到这里 我发现这里 直接获取了 column 的数据 render

就定位到了这里的 ts code 然后给了链接

01

先下一手 同事的演示

注意哦 他这里的 element plus 已经可以是最新了 所以我们把版本定位在受到影响的 2.0.5 (fix at 2.0.6 以上)

1
2
3
4
5
"dependencies": {				
"core-js": "^3.8.3",
"element-plus": "^2.0.5", // ==> "element-plus": "2.0.5"
"vue": "^3.2.13"
}

然后这里 table 的代码 fix 的位置在 /element-plus/es/components/table/src/util.ts 文件里.

于是打开浏览器直接在那里下断 然后去触发 xss 最后会停在这里

02

我们可以看到这里是有加内容的 我们的 payload 被完整的加载出来了。

03

这里可以看到我们再往下几步就会触发 innerHTML 属性的添加了。看到这里我们算是已经看到了 漏洞点了。

这里我们回看调用栈

这里是 /element-plus/es/components/table/src/util.mjs 的 createTablePopper 函数调用 也就是在 element-plus 中为路径 /packages/components/table/src/util.mjs

04

然后是调用它的 /element-plus/es/components/table/src/table-body/events-helper.mjs 的 handleCellMouseEnter 望文生意 就是处理当 鼠标移入事件 的函数。在 element-plus 中为路径 /packages/components/table/src/table-body/events-helper.ts

05

然后再跟 就跟到了 之前的 render-helper 的位置 /element-plus/es/components/table/src/table-column/render-helper.mjs

也就是在 element-plus 中路径为 /packages/components/table/src/table-column/render-helper.ts

06

可以看到这里一串的执行流程 从 innerText 的 Rows 到了 innerHTML 的 Row 内容完全一样,没有过滤什么的需要绕过所以很简单的 payload 就能触发这个问题,只需要恶意数据能塞入带有属性 show-overflow-tooltip 就可以触发。

解决方案是加 escape 但是我想如果他这里是 innerText 可能会更好的解决,也不用引入 一手 外源的 escapeHTML 工具。

最后这个漏洞是第一个 ELement-Plus 的 CVE ,aka CVE-2022-27103。同时也是我的第一个 CVE。

Svelte 的恩恩怨怨

上面的事情结束没多久我就开始新坑了, Svelte 确实对我这种对前端理解不深的大白痴,友好很多。而且语法简单,跟着他们官方教程走一圈就可以了。

然后我完善了我的 Networker-Project 目的是方便 生成 dn42 wireguard 链接配置 而且前端自带 preview 配置的功能 也带有后端导出和生成的功能。它在:https://github.com/Esonhugh/Networker-Project 中。包含前后端的源码,也算是我的第一份前后端全栈项目了。

第一次云渗透

还记得第一次日站嘛。在那之后 我开始了学习云原生和云渗透的路子了。加之一些之前 日 k8s 的小小经验。我摸了一些云服务的大概样貌,s3协议啊,aws aliyun-cli 工具啊之类的也看了一些。(虽然到最后都是补全)五月某一天,我意外摸到一个暴露在外未鉴权的 k8s 监控和管理界面于是摸进去一看,命令执行啥的都有,不过可惜是测试服务器。拉下来服务配置和服务软件 进行一手逆向 看到和云厂商有相关的内容 经典渗透 AKSK 收集利用 GetShell,然后靠着 AKSK 摸下云服务器 oss 等一大票云服务。

在检查日下来的第一个站的笔记中我也找到了当时保存的 AKSK 配置信息。

后记

这几个月也算是收获丰富。

声明:以上事件纯属虚构 为梦里所见请勿当真。