一个Minecraft后门蠕虫的分析
SakuraKooi
2021年02月05日 12:58

收到了一个很有意思的蠕虫病毒样本, 专门感染minecraft服务器插件的, 来让我们康康代码

cut-off

首先说如何防止: 

  • 在所有插件jar内放置 .l_ignore 文件可以预防插件被感染

  • 添加 -Dfym_st=true 命令行参数可以阻止后门启动(但仍会感染你的插件)

  • 用host屏蔽 client.hostflow.eu 这个域名可以阻止后门连接服务器

  • 不要使用来历不明的插件

cut-off

这个病毒作者利用这些病毒插件来破坏其他服务器, 做视频盈利

病毒作者的yt频道: https://www.youtube.com/channel/UCL3R3PtNwTzTxYdyBSiUyfw

建议去点个举报(笑

cut-off

作者对代码进行了混淆, 不过和没混淆一样, 都不用过反混淆(

建议立即抛弃proguard投入zelix的怀抱(x

插件主类onEnable()里面被插入了病毒的初始化代码

就是第二行这个, 传的参数是plugins目录路径

转进ImageL10.a()

首先判断了系统,非windows不激活病毒

感染其他插件的逻辑

初始化了javaassist库, 遍历整个plugins目录, 挨个打开所有的jar文件

如果jar里含有.l_ignore文件则认为已经感染过并跳过, 否则开始执行感染

寻找继承了JavaPlugin的类也就是插件主类, 在onEnable()方法内插入病毒的初始化代码(没错就是第一张图那个), 生成[插件主类名+L10]这个类写入感染逻辑, 并将整个javaassist目录复制到被感染的jar里

后门启动的代码

如果没有设置全局变量fym_st, 则设置为true并加载位于javaassist.ws.a类的后门(避免后门的重复启动)

转进javaassist.ws.a

这个类继承了javassist.orgs.java_websocket.client.b(其实是org.java_websocket.client.WebSocketClient)

后门使用websocket协议进行通讯, 远程服务器的地址是http://client.hostflow.eu:5050/ws

连接后门服务器, 循环读取远程命令, 以一秒为间隔

下面有两个执行后门逻辑的方法

远程命令

这个方法实际上是public abstract void onMessage(String message), 即收到文本信息, 如果以$$exec$$开头, 则投递一个任务到bukkit的任务调度器

投递的任务的代码

任务代码很简单, 以后台身份执行所收到的命令

远程代码执行

这个方法实际上是 public void onMessage(ByteBuffer bytes), 即收到二进制数据

后门逻辑将所收到的数据使用javaassist加载为可运行的类, 并投递任务通过反射的方式执行远程代码中的execute方法

数据上报代码段1

收集最后一次启动的服务器日志, 通过访问amazon的ip服务获得服务器的ip, 尝试获取本机地址

数据上报代码段2

收集服务器ip, 端口, 版本, 玩家数量, 在线模式. 最大玩家数, 正版认证, 在线玩家列表, 拼装成消息并通过websocket发送到后门服务器

cut-off

分析完毕, 后门代码就是这些了, 启动后感染全服务端的所有插件, 然后连接远程服务器并上报所感染的服务器信息, 然后这个人就顺着所上报的信息中的服务器地址和端口号进服, 利用远程命令和代码执行来搞破坏, 最后做成视频传youtube, 建议去点个举报(

cut-off

不要使用来历不明的插件