WOWHoneyhotを植えてみる
久しぶりにハニーポット関連。 morihi-soc 氏が作成した WOWHoneypot というWebハニーポットを使ってみました。
詳しい説明は以下のスライドで。
Python3だけで動く極々単純な仕組みのハニーポットです。ざっくり言うと、待ち受けポートでHTTPが動いて、デフォルトではとりあえず200を返すWebサーバです。 正直初めてWebハニーポットを建てるのなら、これくらいシンプルなものでいいと思います。どうせ高機能なの入れてもデフォルトでしか動かさないだろうし……。
いつものようにDockerで動かします。 必要なのはPython3のみなので、別にそのままホスト上でやってもいいんですが、最近なんかツールを入れるときはとりあえずDockerに使うようになってきました。
こんな感じのDockerfileを作ります。
FROM ubuntu:latest RUN apt-get update && apt-get -y upgrade RUN apt-get -y install git python3 WORKDIR /root RUN git clone https://github.com/morihisa/WOWHoneypot.git wowhoneypot WORKDIR /root/wowhoneypot CMD ["python3", "wowhoneypot.py"]
で、ビルドします。
docker build -t wowhoneypot .
で、立ち上げます。
docker run -it -v /home/blue/wowhoneypot/log:/root/wowhoneypot/log -p 80:8080 -d --name wowhp wowhoneypot
ポートは80番に接続し、コンテナ内のログ用のディレクトリを共有にしています。
1か月ほど動かしてみた
期間
2017年12月24日 ~ 2018年1月26日
アクセス数
全アクセス : 2149
ユニークなソースIP : 290
1つのIPからの最多アクセス回数 : 287
観測した攻撃の例
S2-045を狙った攻撃は色々なところから色々なコマンドを実行しようとしょっちゅう来ています。 D-Link製のルーターを狙った攻撃では、「cd /var/tmp && echo -ne \x00\xA0\xAF\x21\x20 >> drop && echo OK」というようなコマンド実行が大量にあり、おそらくバイナリファイルを直接echoで書き出そうとしているようでした。 Shellshockも一度来ると複数のURLパスに大量に同じコマンド実行を試みる攻撃があり、アクセス数がかなり増えました。 phpmyadminの脆弱性を狙った攻撃もかなり頻繁にあり、特にZmEuというツールを利用したスキャン(参考)がかなり多いです。
後は意味は分からないですが、/直下へのPOSTで謎のBase64で符号化されたデータを送ってくるリクエストが900件以上ありました(参考)。
それ以外には、Ruby on Railsを狙った攻撃や、魔法少女アパッチマギカ、Tomcatの管理画面へのログイン試行、新年の挨拶なんかを観測できました。
WebLogicを狙う攻撃を観測してみたい
植えてからしばらくして、WebLogicの脆弱性(CVE-2017-10271)のPoCが公開され、実際の攻撃に利用されだしました。前回の記事 でも書きましたし、WOWHoneypotでも観測できたようです。
ハニーポット観察記録(38)「WebLogic の WLS Security に対するコマンド実行の試み(CVE-2017-10271)」 at www.morihi-soc.net
ということで、うちでも観測してみたいなーと思い、記事では7001番ポート(WebLogicのデフォルトポート)に攻撃が来ていたので、こちらでも7001番ポートで待ち受けてみました。
docker run -it -v /home/blue/wowhoneypot/log_7001:/root/wowhoneypot/log -p 7001:8080 -d --name wowhp_7001 wowhoneypot
Dockerで立ち上げるポートを付け替えているだけです。 結果として、2017年12月28日 ~ 2018年1月26日の期間で42のアクセスがありました。
内CVE-2017-10271を狙った攻撃は全部で6つのIPから24件ありました。「/wls-wsat/CoordinatorPortType」へのPOSTですが、それとは別に、調査目的のGETリクエストも4つのIPから5件ありました。PoCによっては最初にGETしてWebLogicのコンテンツであるかを確認するようなものもあったので、そうした攻撃前の調査通信と思われます。
攻撃の内容はpingコマンドで攻撃の成功を確認するものや、wgetでファイルをダウンロードするもの、また、touchコマンドで「/tmp」配下にファイルを作成するものなどがありました(touchでファイルを作成したところで何がしたいのか不明ですが……)。
WebLogicの攻撃は事前にHTTPヘッダでWebLogicを利用していることを調べたり、GETでコンテンツがあるかを確認してから攻撃が来るパターンもあるようなので、ちゃんと観測しようとすると、その辺の調整は必要ですね。
(ちなみに、CVE-2017-10271を狙った攻撃を観測するようのルールはすでにあるようなので、アップデートすれば観測できそうです。)
今回は以上です。 漠然とハニーポットを立てて攻撃を観測するのもいいですが、何か特定の脆弱性を狙った攻撃を観測したいとなった場合はある程度カスタマイズは必要ですね。 WOWHoneypotでもルールにマッチした場合に応答を変えるような機能もありますし、単純なものなら、それだけで事足りそうです。 もしくは、WOWHoneypotを参考にして、自分で作ってもいいかなと思いました。ソースコードはそれほど複雑でもないので。
後はログの分析の方法を考える必要がありますね。同じ攻撃ばっかり見ててもつまらないので……。
Oracle WebLogic Server のWLS Security に関する脆弱性(CVE-2017-10271)について
10月にOracle WebLogicはパッチが出てましたが、その時に修正された脆弱性の攻撃コードが先週末あたりに公開されました。
実際に攻撃も来ているようで、探すと中国語での解説記事をちらほら見かけます。 morihi-soc 氏のハニーポットでも攻撃が観測されているそうです。
WOWHoneypot で WebLogic の WLS Security の脆弱性(CVE-2017-10271)を狙った攻撃を検知してる。コインマイニングするプログラムのダウンロード&実行が目的みたい。検体解析結果→ https://t.co/CAdcVLUski
— morihi-soc@C93→1日目(金) 東3キ-45b (@morihi_soc) 2017年12月24日
CVE-2017-10271について
JVN(JVNDB-2017-008734 - JVN iPedia - 脆弱性対策情報データベース)によると、脆弱性の内容は以下のようになっています。
概要
Oracle Fusion Middleware の Oracle WebLogic Server には、WLS Security に関する処理に不備があるため、機密性、完全性、および可用性に影響のある脆弱性が存在します。
影響を受けるシステム
オラクル
Oracle WebLogic Server 10.3.6.0.0
Oracle WebLogic Server 12.1.3.0.0
想定される影響
リモートの攻撃者により、情報を取得される、情報を改ざんされる、およびサービス運用妨害 (DoS) 攻撃が行われる可能性があります。
ただ、いくつかの中国語の記事を見る限り、場合によってはリモートコード実行が可能なようです。
【漏洞预警】Oracle WebLogic wls-wsat RCE CVE-2017-10271 & CVE-2017-3506|指尖安全|垂直互联网安全媒体
とりあえずGoogle翻訳に突っ込んだ結果をかいつまんで書くと以下のような感じです(間違っている可能性があることはご容赦ください)。
- WebLogicのWLSコンポーネントにはリモートコード実行の脆弱性があり、該当するCVE-2017-3506のパッチが今年4月にリリースされた
- CVE-2017-3506の攻撃コードは公開されていないが、攻撃には利用されていた
- 4月に公開されたパッチをバイパスできる脆弱性(CVE-2017-10271)が見つかり、これは10月のパッチで修正された
ということのようです。 影響を受けるバージョンは限られていますが、リモートコード実行が可能なため、注意が必要です。
検証
WebLogic は有償のプロダクトですが、開発などの用途で使うための無償版があります(Oracleへの登録が必要です)。 今回はDockerでWebLogicの環境を作って本脆弱性の検証をやってみます。
環境構築
脆弱性のあるOracle WebLogic Server 12.1.3をDockerで建てます。
とりあえず、公式のDocker関連ファイルを持ってきます。
git clone https://github.com/oracle/docker-images.git
色々あるのを全部持ってきますが、使うのはOracleJavaとOracleWebLogicです。
まずベースとなるJavaのイメージを作成します。今回はJava8で。
cloneした「/OracleJava/java-8/」のディレクトリに「server-jre-8u151-linux-x64.tar.gz.download」というファイルがありますが、中身を見るとテキストでダウンロード先とファイルのハッシュが書いてあります。 このファイルを落としてこいということなので、リンクから同名のファイル(server-jre-8u151-linux-x64.tar.gz)を落としてきます。 落としてきたファイルは「~~.download」と同じディレクトリに置きます。
で、ビルドします。ビルドにはスクリプトが用意してあるので、叩くだけです。
sh build.sh
「doceker images」で確認するとoracle/serverjre:8のイメージができています。これが、WebLogicのベースになります。
次にWebLogicのイメージを作ります。やり方は上と同じです。今回は12.1.3なので、「/OracleWebLogic/dockerfiles/12.1.3/」のディレクトリを確認し、必要なファイルを落としてきます。 「fmw_12.1.3.0.0_wls.jar.download」と「wls1213_dev_update3.zip.download」があるので、それぞれのファイル内のリンクから同名ファイルをダウンロード(登録が必要)し、同じディレクトリに設置します。 その後、「/OracleWebLogic/dockerfiles/」にある、buildDockerImage.shを叩きます。
./buildDockerImage.sh -g -v 12.1.3
oracle/weblogic:12.1.3-genericのDockerイメージができます。
ようやくWebLogicのベースイメージができたので、ここからサンプルのDockerfileからWebLogicサーバを建てます。 「/OracleWebLogic/samples/1213-domain/」でREADME.mdの通りに実行します。
docker build -t 1213-domain --build-arg ADMIN_PASSWORD=admin1234 .
ADMIN_PASSWORDは英数8文字以上みたいな制約があるので気を付けてください。 これでWebLogicサーバのDockerイメージができました。 できたイメージはこんな感じ。
これを起動します。
docker run -d --name wlsadmin --hostname wlsadmin -p 7001:7001 1213-domain
http://localhost:7001/console へアクセスして、こんな画面がでれば成功です。
攻撃コード検証
まず、「http://localhost:7001/wls-wsat/CoordinatorPortType」へアクセスしてみます。このパスが今回の攻撃対象になります。
PoCはこのパスに対して、POSTで実行するコマンドを含んだSOAPのXMLを投げつけます。
成功すると、サーバからは500 Internal Server Errorが返ります。コマンドの結果はレスポンスには載ってきません。
ここでは例として、「echo "HACKED!!" > /tmp/Hack」というコマンドを実行してみました。
コンテナの中に入って、確認します。
確かにファイルが作成されていました。
ということで、リモートでコード実行ができました。
まとめ
日本ではあまり騒がれていませんが、すでに攻撃が行われており、該当するバージョンのWebLogicを利用している場合、おそらくデフォルトの状態で刺さる可能性がある危険な脆弱性です。 対策としては、WebLogicのバージョンアップ、暫定策として、wls-wsatへのアクセス制御や、関連するコンポーネントの削除が挙げられています。
WebLogicのログがどこにあるのか分からなかったのですが、もしログがあるなら、「/wls-wsat/CoordinatorPortType」へのPOSTでのアクセスログあるか、そのレスポンスが500になっていないかを確認するのがいいかと思います。
WebLogicの環境構築がちょっと面倒でしたが(有償の製品なので仕方ないですね)、とりあえずは検証まで行うことができて満足しました。
追記 (2017/12/28)
以下2点を補足として。
SECCON 2017 Online CTF
今年も会社のチームで参加しました。 時間いっぱいの参加はできませんでしたが、 今年は昨年よりpwn以外の問題が増え、とっつきやすくなった感じです。 最近はどのCTFも軒並み難易度が高く、参加しても1番簡単な問題が1問解けるかどうかというくらいだったので、今回のような手ごろな問題を解いて達成感を得られるのはとてもありがたいです。 達成感、重要ですよね。
以下、軽くWrite up。
Run me! (Programming 100)
import sys sys.setrecursionlimit(99999) def f(n): return n if n < 2 else f(n-2) + f(n-1) print "SECCON{" + str(f(11011))[:32] + "}"
再起でフィボナッチ数列を求めていますが、再起が深すぎて実行するとプログラムが止まります。なので、再起なしで、フィボナッチ数列を求めてやれば答えが出ます。
n={1:1,2:1} for i in range(3,11012): n[i]=n[i-1]+n[i-2] print("SECCON{" + str(n[11011])[:32] + "}")
この問題はすぐに解けました。再起の上限の設定なんてあるんだなーと。
Vigenere3d (Crypto 100)
$ python Vigenere3d.py SECCON{************} POR4dnyTLHBfwbxAAZhe}}ocZR3Cxcftw9
昨年のSECCONでも出てきたヴィジュネル暗号の3D版です。昨年と解き方は同じだろうということで、暗号処理の中身はあまり気にせず、頭の「SECCON{」を暗号し、出力の先頭と一致する鍵を探します。
s = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz_{}" def _l(idx, s): return s[idx:] + s[:idx] def crypto(p, k1, k2): t = [[_l((i+j) % len(s), s) for j in range(len(s))] for i in range(len(s))] c = t[s.find(p)][s.find(k1)][s.find(k2)] return c key = [] cp = [['S','P'], ['E','O'], ['C','R'], ['C','4'], ['O','d'], ['N','n'], ['{','y']] for c in cp: keys = [] for i in s: for j in s: if crypto(c[0], i, j) == c[1]: keys.append([i,j]) key.append(keys[0]) print key
鍵は2つあり、14文字の鍵とその逆順を使います。1文字ごとの2つの鍵の組み合わせを総当たりしています。 この処理で鍵の前半7文字とその逆順の前半7文字(つまり後半7文字)の組み合わせが出てきます。 ここで、それぞれの鍵は変数sのパターン分66通り出てくるのですが、実行してみると、66通りのどの鍵を使っても出力は同じになることが分かります。 そのため、1文字目はすべて「A」となる鍵を持ってきています。 これで、14文字の鍵が全てわかりますので、その鍵で復号して暗号文に一致する文字を探します。
flag = '' i = 0 tmp = [] for g in reversed(key): tmp.append([g[1], g[0]]) key = (key + tmp) * 3 cstr = 'POR4dnyTLHBfwbxAAZhe}}ocZR3Cxcftw9' for p in cstr: for k in s: if crypto(k, key[i][0], key[i][1]) == p: flag += k i += 1 print flag
換字のテーブルの構造はほとんど考えず、ただ総当たりでやりました。鍵が66通りどれでやっても結果が同じことに気づくのに時間がかかりました。
Powerful_Shell (Binary 300)
難読化されたPowershellを実行する問題。 まず、ps1ファイルを実行できるよう、管理者権限のPowershellコンソールで「Set-ExecutionPolicy RemoteSigned」を実行します。
ファイルの中身を見ると、「$ECCON」という変数に色々入れて最後に実行しているっぽいので、ラスト1文を消して「echo $ECCON」にすると、難読化を解除したスクリプトが見えます。
最初に耐解析的なセクションがあり、イベントログの件数を確認し、少なすぎればサンドボックスと判定します。この処理におそらく管理者権限が必要で、管理者権限のあるコンソールでなければ処理が停止します。
管理者権限のコンソールでスクリプトを実行してみます。
背景が黒くなり「SECCON」ロゴが出てきます。耐解析のセクションを抜けると鍵盤が出てきて、入力に応じて音がでます。 出力する音を決めているのは「$keytone」という変数なので、ここをechoとかで見てみる(難読化解除後の16~20行目をコピペしてコンソールに張り付けてから、「echo $keytone」)。
Name Value ---- ----- j 493.891672853823 s 293.669745699181 y 415.31173722644 w 277.187329377222 u 466.171663254114 g 392.002080523246 e 311.132257498162 t 370.000694323673 h 440.007458245659 f 349.234151046506 d 329.633144283996 a 261.63 k 523.26
91行目の「$secret」変数の値と一致するkeyが正解。
「$secret=@(440,440,493,440,440,493,440,493,523,493,440,493,440,349)」
「hhjhhjhjkjhjhf」を入力すると「さくらさくら」が流れて、次のステージに行けます。 (ロゴといい、すごい凝ってる) パスワードを求められるので、さらに100行目以降の難読化を解除していきます。
色々やっているっぽいけど、とりあえず、「$plain」変数をechoします。 すると、asciiが10進になっているようなものが出てくるので、これを文字列に変換。 また、意味の分からない難読化されたスクリプトが出てきます。
${;}=+$();${=}=${;};${+}=++${;};${@}=++${;};${.}=++${;};${[}=++${;}; ${]}=++${;};${(}=++${;};${)}=++${;};${&}=++${;};${|}=++${;}; ${"}="["+"$(@{})"[${)}]+"$(@{})"["${+}${|}"]+"$(@{})"["${@}${=}"]+"$?"[${+}]+"]"; ${;}="".("$(@{})"["${+}${[}"]+"$(@{})"["${+}${(}"]+"$(@{})"[${=}]+"$(@{})"[${[}]+"$?"[${+}]+"$(@{})"[${.}]); ${;}="$(@{})"["${+}${[}"]+"$(@{})"[${[}]+"${;}"["${@}${)}"];"${"}${.}${(}+${"}${(}${|}+${"}${(}${)}+${"}${(}${)}+${"}${)}${|}+${"}${)}${&}+${"}${(}${+}+${"}${&}${@}+${"}${+}${=}${+}+${"}${|}${)}+${"}${+}${=}${=}+${"}${[}${]}+${"}${)}${@}+${"}${+}${+}${+}+${"}${+}${+}${]}+${"}${+}${+}${(}+${"}${.}${@}+${"}${[}${]}+${"}${&}${=}+${"}${+}${+}${[}+${"}${+}${+}${+}+${"}${+}${=}${|}+${"}${+}${+}${@}+${"}${+}${+}${(}+${"}${.}${@}+${"}${.}${|}+${"}${(}${|}+${"}${+}${+}${=}+${"}${+}${+}${(}+${"}${+}${=}${+}+${"}${+}${+}${[}+${"}${.}${@}+${"}${+}${+}${(}+${"}${+}${=}${[}+${"}${+}${=}${+}+${"}${.}${@}+${"}${+}${+}${@}+${"}${|}${)}+${"}${+}${+}${]}+${"}${+}${+}${]}+${"}${+}${+}${|}+${"}${+}${+}${+}+${"}${+}${+}${[}+${"}${+}${=}${=}+${"}${.}${|}+${"}${+}${.}+${"}${+}${=}+${"}${)}${.}+${"}${+}${=}${@}+${"}${[}${=}+${"}${.}${(}+${"}${(}${|}+${"}${(}${)}+${"}${(}${)}+${"}${)}${|}+${"}${)}${&}+${"}${.}${@}+${"}${[}${]}+${"}${+}${=}${+}+${"}${+}${+}${.}+${"}${.}${@}+${"}${.}${|}+${"}${&}${=}+${"}${[}${&}+${"}${+}${+}${|}+${"}${(}${|}+${"}${+}${+}${[}+${"}${.}${(}+${"}${)}${@}+${"}${]}${+}+${"}${[}${|}+${"}${[}${|}+${"}${.}${|}+${"}${[}${+}+${"}${+}${@}${.}+${"}${+}${.}+${"}${+}${=}+${"}${|}+${"}${&}${)}+${"}${+}${+}${[}+${"}${+}${=}${]}+${"}${+}${+}${(}+${"}${+}${=}${+}+${"}${[}${]}+${"}${)}${@}+${"}${+}${+}${+}+${"}${+}${+}${]}+${"}${+}${+}${(}+${"}${.}${@}+${"}${.}${|}+${"}${)}${+}+${"}${+}${+}${+}+${"}${+}${+}${+}+${"}${+}${=}${=}+${"}${.}${@}+${"}${)}${[}+${"}${+}${+}${+}+${"}${|}${&}+${"}${.}${.}+${"}${.}${|}+${"}${]}${|}+${"}${+}${.}+${"}${+}${=}+${"}${|}+${"}${&}${)}+${"}${+}${+}${[}+${"}${+}${=}${]}+${"}${+}${+}${(}+${"}${+}${=}${+}+${"}${[}${]}+${"}${)}${@}+${"}${+}${+}${+}+${"}${+}${+}${]}+${"}${+}${+}${(}+${"}${.}${@}+${"}${.}${[}+${"}${&}${.}+${"}${(}${|}+${"}${(}${)}+${"}${(}${)}+${"}${)}${|}+${"}${)}${&}+${"}${+}${@}${.}+${"}${.}${(}+${"}${(}${|}+${"}${(}${)}+${"}${(}${)}+${"}${)}${|}+${"}${)}${&}+${"}${+}${@}${]}+${"}${.}${[}+${"}${+}${.}+${"}${+}${=}+${"}${+}${@}${]}|${;}"|&${;}
ここは本当に意味が分からなくて、しばらく悩みましたが、結局、一番最後についている「|&${;}」がスクリプトを実行している箇所だろうと考え、ここを削除し、「${;}」をechoすると、また10進数をcharに変換しているようだったので、これをascii化。
'$ECCON=Read-Host -Prompt \'Enter the password\'\r\nIf($ECCON -eq \'P0wEr$H311\'){\r\n\tWrite-Host \'Good Job!\';\r\n\tWrite-Host "SECCON{$ECCON}"\r\n\x0c'
でフラグにたどり着きました。
Powershellはあまり詳しくないのですが、思っていたよりかなり柔軟な難読化ができるんだなあ、という印象です。
その他
後は、Log search (Web 100) や SqlSRF (Web 400) に挑んではいましたが、答えにたどり着けず。Log search はElastic SearchのQuery DSLをインジェクションするのかと思って色々試していましたが、「違うじゃん」と分かったところで、諦めました。回答はもう少し単純だったようで、Elastic Searchももっと触れておかないとなと感じました。SqlSRF みたいな問題はいつも、割と好きで解きたいと思いつついつも解けない問題です。
後はCode Blueで坂井弘亮氏が話していたSOPの問題もありましたが、手を付けられませんでした。
今回もpwn系も少し解けるようになりたいなー、とCTFのたびに思っています。
Code Blue 2017 カンファレンス参加レポート
11月9~10日に開催された日本のセキュリティカンファレンスであるCode Blue 2017に参加してきました。
備忘録的に興味深かった内容をさらっと書いておこうかと思います。ちゃんと理解できていない部分もあるので、間違っている可能性もあるとご理解ください。
基調講演:サイバースペースにおける国家主権
サイバー犯罪と国家の主権に関する話。書いていたメモが消えたので、感想だけ軽く……。
講演者はNATO法律顧問であり、航空宇宙、海事、サイバー戦略および政策に関して企業として組織に助言しているとのこと。 陸・海・空の軍事関係にサイバー空間を足してどう対応していくべきかを考える。 原子力潜水艦や船舶、衛星などの実際の攻撃事例が面白かった。 様々な課題がありますが、協力していきましょうというのはよくある国際社会とサイバー犯罪に関する講演の結論です。 今回も教育や学習という面でこのカンファレンスを通じて理解を深めましょうといった内容で、最初の基調講演としてはふさわしい内容だったのではないでしょうか。
参考URL
Galileo atomic clocks failed: What can we learn from it?
FACT CHECK: Did Russia Hack the GPS System of the USS John McCain to Cause a Collision?
Step-Oriented Programming による任意コード実行の可能性
講演者の坂井弘亮氏は独自組み込みOS「KOZOS」を作成している。それと、SECCONの実行委員の方。
- 組み込み機器はデバッグポートが有効になっていると基本的になんでも行えてしまう
ので、リリースの際にはデバッグポートは使えないようにしましょう
コードを実行できないからと言って、安全ではなく、SOP(Step-Oriented Programming)という方法で攻撃ができる(一般的な名称ではない?)
- 組み込み機器ではRSPプロトコルを使ってリモートデバッグを行う
- 組み込みのデバッグではプログラムカウンタを簡単にいじれるので、ROPのように既存のコードを使ったコード実行が容易
- SECCONでSOPを利用して解く問題を出したところ、みんなSOPを利用して問題を解いていたので、この手法自体は誰もが簡単に思いつくものである
技術的な内容は難しかったですが、SECCONの問題の解説はなかなか面白かったです。 実際にリモートデバッグを使ったコード実行のデモを行っていたので、漠然と何をやっているのかは理解できました。 組み込み機器に対する攻撃手法はあまり詳しくありませんが、普段 Exploit する人たちからしたら、今回の攻撃の手法はROPからすぐに思いつくのかなあという感想。
参考URL
Howto: GDB Remote Serial Protocol
産業制御システムに対するStuxnet以来最大の脅威
Industroyerという産業システムを狙ったマルウェアの解析に関する話
- 産業システムを狙うマルウェアとしては、Stuxnet → HAVEX(Dragonfly) → BlackEnergy → Industroyer といった大きな事例があった
- 各マルウェアは産業システムで行う破壊活動の内容の違いがある
- 産業システムと言っても管理はWindowsで行われており、そこが狙われる
- (正直 Industroyer のペイロードの解説などはちょっと理解ができなかった)
- Industroyer というマルウェアはとても多機能で、後からモジュールをロードできる
- 攻撃者は多数のモジュールを用意し、攻撃対象に合わせたモジュールをロードし、目的を達成する
結局のところ、狙われているのはWindowsであり、今回の解析対象もWindowsマルウェアでした。 質疑で日本も標的になりうるかとい質問に、個別システムのモジュールを攻撃者が用意することができれば、どんなシステムも標的になりうるという点が印象深かった。
参考URL
停電の原因は産業制御システム狙うマルウェアか 「Stuxnet以来、最大の脅威」 - ITmedia エンタープライズ
産業制御システムに最大級の脅威をもたらすマルウェア「インダストロイヤー」 | マルウェア情報局
WIN32/INDUSTROYER A new threat for industrial control systems
日本を狙うAPT攻撃の全体像 - APT攻撃インシデントSTIXデータベース
JPCERTの方の発表。日本で行われたAPTの利用されたマルウェア、攻撃キャンペーン、Threat Actorなどを紐づけて全体像を把握するための仕組みをつくりましたと言う内容
- ここ数年日本で活動していた Blue termite、APT17、Tick/Daserf、ChChes が対象
- STIX形式で各内容まとめてみると、攻撃者の動向が把握できる
- 各キャンペーンの活動時期をTimelineとして並べるデモを行った
ただ、標的型攻撃のインシデント詳細をそこまで大量に持っているのはJPCERTくらいじゃないかと思う。問題提起がそもそもJPCERTの内部の問題なんじゃ……。 JPCERTの持っている情報も機微なものが含まれるので、そのまま公開はできないとのこと。 手軽な情報共有の基盤を作ったのなら分かるが、STIX形式の入力は現状「頑張って」やっているそうで、頑張らなきゃ使えないシステムは普及しないのでは……。 JPCERT以外の組織での利用シーンはあまり思いつかないのが正直なところ。 マルウェアの挙動なんかは面白かったので、もう少し掘り下げてほしかったけど、そこは次の講演者の発表で。
参考URL
脅威情報構造化記述形式STIX概説:IPA 独立行政法人 情報処理推進機構
攻撃者の行動を追跡せよ -行動パターンに基づく横断的侵害の把握と調査-
引き続きJPCERTの方の発表。
- 攻撃者の利用するツールはマルウェア以外(正規のツール、コマンド)も多くあり、それらは検知が困難
- 攻撃者が侵入後行う活動に着目し、どのようなコマンドが実行されるかを調査
・初期調査
tasklist ⇒ 仮想環境の検知など
・探索活動
dir ⇒ 欲しいファイルの探索
net ⇒ ローカルネットワークの探索
ping⇒ネットワーク内のホストを探すため
echo⇒スクリプトファイル(powershell)の作成
dumpel、LogParser(デフォルトでは入っていない)
cscript ⇒ ログオンイベントの探索
・感染拡大
at,schtasks ⇒ コマンド実行
・痕跡の削除
del
wevtutil ⇒ イベントログの削除(イベントログを見ることもできるので、他の用途でも利用される)
- こうしたマルウェアの挙動を見るにはイベントログがもっとも有用
- ただし、デフォルトではコマンドの内容までは取れないので、監査ポリシーの設定は必要
- Sysmonというツールを併用するとよい
- 攻撃者によってイベントログが削除されることを考えて、イベントログサスクリプションを利用する
さすが、JPCERTは見ている量が違うなと。 ちゃんとやっているその内容も逐次公開してくれているので、ありがたい限りです。 ほとんどはJPCERTのサイトで公開している内容ですが、こうして改めて話を聞く機会があるのはとてもうれしい。
参考URL
インシデント調査のための攻撃ツール等の実行痕跡調査に関する報告書(第2版)公開(2017-11-09)
Sysmon - Windows Sysinternals | Microsoft Docs
インサイドShell:.NETハッキング技術を応用したPowerShell可視性の向上
- マルウェアダウンローダーのEXEファイルからjavascriptへの変遷
- Powershellがダウンローダーや横展開で利用されているが、Powershell自体は正規のプロセスのため検知が難しい
- ASMIという機能が提供されており、Powershellを利用した攻撃の防御に有効
- ただ、Windows 10のみ、Powershell v5のみという制約があり、また、ASMIをバイパスする手段も存在する
- .NETネイティブコードをフックして対象外のWindows、Powershellのバージョンで動作するASMIを実装する
- Powershellコードの実行時のメソッドをフックすることで、難読化されたスクリプトを解除した状態で表示できる
スライド、実際のコードは公開されています。ASMIという機構については知らなかったので、勉強になりました。 Powershellは最近攻撃によく利用されるので、勉強しなくちゃならないなーと。
参考URL
DotNetHooking/CodeBlue_1110_JP.pdf at master · tandasat/DotNetHooking · GitHub
GitHub - tandasat/DotNetHooking
Releases · PowerShell/PowerShell · GitHub
国産IT資産管理ソフトウェアの(イン)セキュリティ
リクルートのRed Teamに所属する西村宗晃氏の講話。国産IT資産管理ソフトウェアと聞くと、最近注意喚起のあった某社製品を思い浮かべますが、今回の話はそれではなく、(その事例に端を発してはいますが、)国産IT資産管理ソフトウェア一般に色々な脆弱性がありますという内容。
- IT資産管理ソフトウェアとは
社員のPCを一元管理するためのソフトウェア
ソフトウェアファイルの管理、デバイスの利用制限、プログラムの配布(アップデート配信)、社員のPCの遠隔操作といった機能と持つ(話者曰く、つまりMeterpreterみたいなもの)
通常、社内のイントラ内で利用しているが、持ち出し用のPCでUSBタイプのモデムを使うなど、グローバルIPが振られたときに攻撃される恐れがある。
IT資産管理ソフトウェアの通信
・クライアントPCの遠隔操作用通信
・管理操作(管理者が専用クライアントソフトから管理機へアクセス)
・クライアントPCからのインベントリ情報の送信、管理指示(定常的な通信)
・管理機からの指示(緊急でのクライアントへの命令など)
- 国産IT資産管理ソフトウェアの脆弱性
実際にいくつかの国産IT資産管理ソフトウェアに見つかった脆弱性の紹介
管理機通信の偽装
クライアントPCと管理機は暗号化された独自プロトコルを利用して通信しているが、暗号化通信の鍵がインストーラに埋め込まれており、復号可能。
復号した通信に管理機のドメインとポートが書いてあり、そこを書き換えることで管理機を偽装することができた。
鍵は全て共通のものを利用しており、製品を利用している他社のPCにも同じことができる。クライアントPCの遠隔操作
クライアントPCとVNCで接続するタイプのソフトウェアだが、認証がかけられていなかった。試したところ、特定のバージョンのVNCで接続すると、簡単にリモート接続ができてしまった。管理機へのアクセスの不備
管理機へ認証なしでアクセスが可能だった。さらに、管理機にSQLインジェクションの脆弱性があり、社員のPCの情報をすべて見ることができるようになっていた。管理機との通信の悪用
通信内容は暗号化されているが、暗号方式が脆弱であったり、Windows のCryptAPIを利用しており、APIをフックするといった手法で暗号が解かれることがある。一度暗号化を解いてしまうと、SQLインジェクションや管理者のパスワードを窃取されるなどの攻撃が行われる。
また、管理機に社員番号のディレクトリが作成されるようなタイプのソフトウェアでは、社員番号にディレクトリパスを指定することでディレクトリトラバーサルが可能な事例も存在した。
- こうしたソフトウェアは体験版を個人で取り寄せることも可能で、おそらく攻撃者もそうやって脆弱性を探している
例のソフトウェアの脆弱性の話をするのかと思っていましたが、予想とは違っていました。ただ、なかなか面白い内容で、こういうソフトウェアって意外と脆弱性多いんだな、と率直に思いました。 別にIT資産管理ソフトウェアだけでなく、他の国産ソフトウェアもきっと似たような事例はあるんじゃないかと思っています。特定の国を狙った標的型攻撃にその国でよく利用されていているソフトウェアをハックする方法は以前からありますし、最近は特に増えている気もします。 今回のようなRed Teamの活動の重要性が分かりました。
基調講演: OSSによる自動車の自動運転化 –
車のネットワークをハックして自動運転を行おうというオープンソースプロジェクトの紹介
- 各社の公開資料や自動車のリバースエンジニアリング(OpenDBC)から自動車を運転するためのAPIを作る
- 運転に必要なAPI:ブレーキ、ガス、ステアリングを既存APIをもとに組み立てる
- cabana:自動車のハッキングのためのオープンソースのPythonライブラリ
- openpilotのデモ
主に自動運転の話でしたが、リバースエンジニアリングや、自動車のAPIなど、普段聞かない話は面白かったです。 法整備や国ごとの特色など、課題は多そうですが、自動運転は未来の技術として期待したいです。
参考URL
GitHub - commaai/opendbc: democratize access to car decoder rings
Find the pattern in the S-Boxes and write a short program to generate them with - Pastebin.com
openpilot/SAFETY.md at devel · commaai/openpilot · GitHub
9 minutes of openpilot. unedited. - YouTube
聞いていないけど興味があった講演(参考資料だけ)
■SSRFの新時代 - 有名プログラミング言語内のURLパーサーを攻撃!
https://www.blackhat.com/docs/us-17/thursday/us-17-Tsai-A-New-Era-Of-SSRF-Exploiting-URL-Parser-In-Trending-Programming-Languages.pdf
■マン・イン・ザ・NFC
DEF CON 25 - Haoqi Shan, Jian Yuan - Man in the NFC - YouTube
■大義のために:趣味と実益のためのVMware RPCインターフェースの活用
https://ruxcon.org.au/assets/2017/slides/ForTheGreaterGood.pdf
■商用ホワイトボックス暗号方式" に対する "鍵回復攻撃"
Practical attacks on commercial white-box cryptography solutions
https://eprint.iacr.org/2015/753.pdf
■Trueseeing: Effective Dataflow Analysis over Dalvik Opcodes
GitHub - linkedin/qark: Tool to look for several security related Android application vulnerabilities
trueseeing 2.0.9 : Python Package Index
全体の感想
日本の国内外問わず、セキュリティに関するさまざまなトピックを聞くことができました。普段聞かない領域の話も多くあり、とても勉強になりました。 今回は特に日本の事例が面白かったです。 色々なセキュリティの記事やニュースを見ていると国外のすごい人は色々いますが、国内にもすごい人はいるなあ、と感じました。 これからもセキュリティ業界をますます発展させていきたいですね。
Apache Tomcat の脆弱性(CVE-2017-12617)について
9月の中頃から少し騒がれていたApache Tomcatのリモートコード実行の脆弱性についてです。
関連する脆弱性は CVE-2017-12615、CVE-2017-12616、CVE-2017-12617 の3つです。 それぞれが順番に出てきて、情報が小出しにされている感じでしたが、結局条件を満たしていれば、影響範囲は割と広いようです。
結構早い段階で検証している方もいたので、PoCはあるということは分かっていました。
Tomcatの一連のRCEの脆弱性について(CVE-2017-12615, CVE-2017-12617) - Cat.6(ねころっく)
脆弱性の内容自体は以下の通りです(サイオスのセキュリティブログから)。
Tomcatの複数の脆弱性 ( CVE-2017-12617, CVE-2017-12615 , CVE-2017-12616 ) — | サイオスOSS | サイオステクノロジー
CVE-2017-12617
リモートからの任意のコード実行の可能性
重要度 - Important
影響するバージョン : 9.0.0.M1 to 9.0.0, 8.5.0 to 8.5.22, 8.0.0.RC1 to 8.0.46, 7.0.0 to 7.0.81
サーバ上の設定でHTTP PUTが有効になった状態(つまり、readonly initialisationパラメータをfalseに設定している時)でで動作している際に、特別に細工されたリクエストにより、サーバにJSPファイルをアップロードすることが可能です。このJSPにコードを仕込むことで、サーバ上で任意のコードを実行することが可能になります。
9/19に公開されたCVE-2017-12615に対する修正では、この問題は解決されませんでした。
CVE-2017-12615
リモートからの任意のコード実行の可能性
重要度 - Important
影響するバージョン : Windows:
7.0.0 to 7.0.79 Windows上でHTTP PUTが有効になった状態(つまり、readonly initialisationパラメータをfalseに設定している時)でで動作している際に、特別に細工されたリクエストにより、サーバにJSPファイルをアップロードすることが可能です。このJSPにコードを仕込むことで、サーバ上で任意のコードを実行することが可能になります。
この修正は実際には、リリース時のチェックの関係で7.0.81に加えられているため、更新する際には7.0.81にする必要が有ります。
CVE-2017-12616
情報流出の可能性
重要度 - Important
影響するバージョン : 7.0.0 to 7.0.80
VirtualDirContextを使用している際に、セキュリティ制限をバイパスすることが出来ます。これにより、特別に細工されたリクエストを用いてVirtualDirContextにより提供されるJSPリソースのソースコードを見る事が可能になります。
CVE-2017-12617 の検証
Linux環境でTomcatのリモートコード実行を行ってみました。 readonlyパラメータをfalseにしておくと、PUTメソッドでファイルがアップロードできます。
検証環境
設定ファイルの変更
Tomcatの「conf/web.xml」ファイルでreadonlyパラメータをfalseにします。
攻撃コードの実行
脆弱な Tomat サーバに対してPUTメソッドでファイルを設置します。
テストのファイルをPUTし、アクセスすると、ファイルが作成されていることが分かります。
JSPファイルをアップロードすることで任意のコード実行が可能です。
アップロードしたファイルにアクセスして、「whoami」を実行してみます。
コマンドの実行結果が返ってきました。
ちなみに、脆弱な設定になっていないTomcatサーバへPUTをしようとしても403が返ってきます。
脆弱性の内容としてはPUTによるファイルアップロードが実態のようです。JSPファイルをアップロードしてコード実行が行うことができますが、バックドアをアップロードしてコード実行を行うのは一般的な攻撃手法なので、なぜリモートコード実行の脆弱性なのかが分かりません。
検証してみた感想としては、これただのPUTじゃんという思いが強いのですが、PUTが可能ということ自体が重大な脆弱性であるので、アップデートするなり適切な対処をしましょう。
参考
Tomcatの複数の脆弱性 ( CVE-2017-12617, CVE-2017-12615 , CVE-2017-12616 ) — | サイオスOSS | サイオステクノロジー
Apache Tomcatに含まれる脆弱性(CVE-2017-12617)に関する脆弱性検証レポート | NTTデータ先端技術株式会社
Tomcatの一連のRCEの脆弱性について(CVE-2017-12615, CVE-2017-12617) - Cat.6(ねころっく)
今月のApache Strtus 2 のリモートコード実行の脆弱性(S2-052/S2-053)
毎度おなじみのApache Struts 2 のリモートコード実行の脆弱性です。
前回の脆弱性からさほど時間が経っていませんが、今回もまたCriticalな脆弱性が出てきました。
ブログのネタを提供してくれるのはうれしいのですが、余計な仕事を増やされるのは困りものです。
S2-052(CVE-2017-9805)について
S20-50~S2-052 までは同時に公開されました。そのうちS2-052 の脆弱性はレートがCriticalとなっており、緊急性の高いものでした。
今回はREST プラグインが有効になっているという前提条件が付きます。
概要
Apache StrutsのRESTプラグインを有効にしていると、XStream ハンドラのデシリアライズの処理に起因してリモートからコード実行が可能になる脆弱性
影響範囲
修正バージョン
対策
- 修正バージョンへのアップデート
- REST プラグインの無効化
検証
今回もすぐにPoCが公開されましたので、検証してみました
Dockerでさくっと、Struts 2.5.12の環境を作ります。
POSTで Content-type ヘッダに「application/xml」にし、ボディにコード実行のPoCを入れます。今回実行するコマンドは「touch /tmp/hackedByMe」としています。
投げます。
500番のエラーが返ってきます。
これで攻撃は成功しているようで、サーバ側で攻撃のプロセスは起動しているようです。
Dockerのコンテナの中に入って確認すると、確かにtouchコマンドで作成したファイルが置いてありました。
応答がエラーページになっており、使用したPoCでは、例えばcatのような標準出力の値をそのまま表示させることはできません。バックドアを作ったり、一度ファイルに書き込んで、外に投げるなどが必要です。
ちなみに脆弱性のない修正版の Struts 2.5.13 で試したところ、同様に500番エラーが返ってきましたが、プロセスは実行されませんでした。
脆弱なバージョンでREST プラグインが有効になっていればほぼ攻撃は成功するため、緊急性の高い脆弱性です。
S2-53(CVE-2017-12611)について
S2-052が公開されたしばらく後に公開された脆弱性はレートはModerateとなっています。
こちらはアプリケーションの作りによって回避可能な脆弱性です。
概要
Freemarkerタグの処理に脆弱性があり、開発者が誤った使い方をしていると、リモートからコード実行が可能になる脆弱性
影響範囲
修正バージョン
対策
- 修正バージョンへのアップデート
- 実装上の問題はあまり詳しくないので下手なことは書けませんが、Freemarkerタグを使って要求の値を読み取ることができるような実装になっている場合に脆弱性が発生するようです(違っていたらすみません)。
検証
S2-053に対して脆弱なアプリケーションが公開されていたので、検証してみました。 Dockerで引っ張ってきて起動すると、以下のようなアプリケーションが立ち上がります。
nameには任意の値を入れることができ、適当な文字列を入れると、その文字がnameに表示されます。 そして、%{100-9}のような値を入れると計算結果の「91」がnameに入ります。
このnameという変数でFreemarkerタグが利用されており、脆弱な状態になっています。 ここに攻撃コードを入れます。今回は「whoami」を実行してみます。
ユーザ(root)が表示されました。
また、「cat /etc/passwd」を実行してみると以下のようになります。
こちらは分かりやすいリモートコード実行ですが、アプリケーションがこのデモ用のサイトと同じような作りになっている必要があります。 アプリケーション個別の実装を考慮する必要がある分、攻撃者にとっては若干攻撃コストが上がります。
また、脆弱性の範囲はS2-045などをかぶっている部分が多いので、この攻撃を行うならS2-045のほうが…という気もしなくはないです。
ただ、2.3系では最新版以外は有効ですし、S2-045などの脆弱性をパーサの変更などで対処してバージョンアップをしていないというような場合は、影響を受ける可能性があるので、注意が必要です。
参考
Apache Struts 2 の脆弱性 (S2-052) に関する注意喚起
CVE-2017-9805 (S2-052) - 脆弱性調査レポート | ソフトバンク・テクノロジー
Apache Struts 2における脆弱性 (S2-052、CVE-2017-9805)は悪用可能と確認 | セキュリティ対策のラック
Apache Struts 2の脆弱性(S2-052)や(S2-053)についてのまとめてみた。 - にゃんたくのひとりごと
VulApps/s/struts2/s2-053 at master · Medicean/VulApps · GitHub
DEF CON 25で発表されたSMBLorisの脆弱性を検証してみる
今年のDEF CONで発表されたSMBを狙ったDoS攻撃に関するお話です。
SMBLoris Windows Denial of Service Vulnerability
脆弱性を悪用する攻撃に SMBloris という名前をいう名前を付けています。 名前は2009年に見つかったApacheのDoS攻撃である Slowloris に因んだものでしょうか。
影響を受ける範囲は Windows 2000 から Windows 10 までと幅広く、LAC社のブログでは Debian でも成功したとの記述があります。
Windows SMBの脆弱性「SMBLoris」の再現を確認しました | LAC WATCH | 株式会社ラック
SMBLorisのサイトでは以下のように書かれています。
Is Samba affected?
Samba, an alternative to SMB for other operating systems, is also vulnerable in a default install but has a workaround.
Set: max smbd processes = 1000 in smb.conf (usually found in /etc/samba).
デフォルトでは影響を受けるようですが、設定によって回避ができるようです。
すべてのバージョンのSMBで認証不要で攻撃可能ですので、445番ポートが空いていればほぼ攻撃を受けると考えてよさそうです。
脆弱性についてですが、今のところCVE番号などは採番されていないようです。
また Microsoft からはこの脆弱性に対応するパッチは出ないそうです。445番ポート閉じろってことですね。
ここ最近、Eternalblue みたいな445番ポートを狙った攻撃がしょっちゅう話題になっていたので、まさか今更そんなポートを外部に公開している企業なんかないだろう、と信じています。
検証
各所で検証動画とかが公開されているので、新しさはないですが、ちょっとやってみました。
とはいえやるのは、PoCを打つだけです。
攻撃先は Windows 10 です。
で、打った際のタスクマネージャ。
メモリの使用率が急激に上昇しています。
表示上は72%ですが、この時点でタスクマネージャが固まって動かなくなりました。
攻撃先ホストへPingを打っていたのですが、そこそこlossしています。
攻撃止めてもしばらくは固まったままでした(普段使いのPCだったからちょっと心配した)。
検証は以上です。SMB経由のDoSが攻撃としてどの程度有用かわかりませんが、通常の脆弱性への対処ができていれば、今回の攻撃の影響はそこまでではないかなという所感です。
参考
DEFCON-25-zerosum0x0-alephnaught-Koadic-C3
Windows SMB Zero Day to Be Disclosed During DEF CON | Threatpost | The first stop for security news