スープの上で

雑多なメモ

IoTSecJP Vol.2 訂正情報

2018年8月10日(金)にコミックマーケット94で頒布予定の「IoTSecJP Vol.2」について訂正情報がある場合はこちらに記載いたします。

初版訂正情報 2018/07/21:現在訂正情報はありません。

古いマルウェアを観察するシリーズ(2)Gafgyt

こんにちは。にほんももんがです。それではまたしても古いマルウェアを観察するシリーズをやりたいと思います。

今回はGafgyt(Lizkebab,qbot,Torlus,LizardStresserなどたくさん別名がある)です。Miraiが注目を浴びてからあまり注目されませんが、観測しているとまだまだ生きているみたいです。また、2018年4月に書かれた以下の記事でもまだまだ生きていると報告されていますね。

www.fiercetelecom.com

このマルウェアはたくさん別名があるのですが、掲示板やYoutubeにころがっている動画などを見ると、悪い人たちの間ではqbotで通っていることが多いみたいです。全く別のQbotというマルウェアもあるので、ここではGafgytと呼ぶことにします。

検体情報

もう一ヶ月ほど前になりますが、今回観察した検体は、2018年5月21日ごろハニーポットにひっかかりました。

stripされていなかったため、radare2で関数一覧を見てみました。

$ radare2 340ed60806df8656ced7c8989854adc680b2390dc6466a6108f307a0e5750175 
Warning: Cannot initialize dynamic strings
 -- Execute a command on the visual prompt with cmd.vprompt
[0x00008190]> aaa
[x] Analyze all flags starting with sym. and entry0 (aa)
[ ] 
[Value from 0x00008000 to 0x0002014c
aav: 0x00008000-0x0002014c in 0x8000-0x2014c
aav: 0x00008000-0x0002014c in 0x2814c-0x2f590
Value from 0x0002814c to 0x0002f590
aav: 0x0002814c-0x0002f590 in 0x8000-0x2014c
aav: 0x0002814c-0x0002f590 in 0x2814c-0x2f590
[x] Analyze len bytes of instructions for references (aar)
[x] Analyze function calls (aac)
[x] Use -AA or aaaa to perform additional experimental analysis.
[x] Constructing a function name for fcn.* and sym.func.* functions (aan)
[0x00008190]> afl
0x00008094    1 24           sym._init
0x000080b0    2 56           sym.__do_global_dtors_aux
0x00008128    1 8            sym.call___do_global_dtors_aux
0x00008130    1 28           sym.frame_dummy
0x00008188    1 8            sym.call_frame_dummy
0x00008190   18 46936 -> 444  entry0
0x000081cc    4 204          sym.init_rand
0x000082a0    3 300          sym.rand_cmwc
0x000083d8   11 304          sym.trim
0x00008508    4 108          sym.printchar
0x00008574   20 388          sym.prints
0x000086f8   18 488          sym.printi
0x000088e0   33 1004         sym.print
0x00008cd0    1 64           sym.zprintf
0x00008d10    1 68           sym.szprintf
0x00008d54    1 200          sym.Heliosprintf
0x00008e1c   29 632          sym.fdpopen
0x000090a4   11 384          sym.fdpclose
0x00009228    9 208          sym.fdgets
0x000092f8    5 124          sym.parseHex
0x00009378   22 424          sym.wildString
0x00009520    4 100          sym.getHost
0x00009584    4 88           sym.uppercase
0x000095dc    4 136          sym.makeRandomStr
0x00009664   19 720          sym.recvLine
0x00009938    1 56           sym.get_telstate_host
0x00009970    6 172          sym.read_until_response
0x00009a1c    7 296          sym.read_with_timeout
0x00009b44    3 112          sym.advance_state
0x00009bb4    1 48           sym.reset_telstate
0x00009be4    1 44           sym.contains_success
0x00009c14    1 44           sym.contains_fail
0x00009c44    5 96           sym.contains_response
0x00009ca4    9 216          sym.contains_string
0x00009d7c   14 640          sym.connectTimeout
0x00009ffc    9 400          sym.listFork
0x0000a194   21 396          sym.negotiate
0x0000a320   13 364          sym.matchPrompt
0x0000a490   25 676          sym.readUntil
0x0000a734   37 1008         sym.GetRandomPublicIP
0x0000ab2c    1 92           sym.GetRandomIP
0x0000ab8c    8 344          sym.csum
0x0000ace4    1 272          sym.tcpcsum
0x0000adf4    1 276          sym.makeIPPacket
0x0000af08    4 76           sym.sclose
0x0000af54    8 332          sym.socket_connect
0x0000b0a0   11 5088 -> 736  sym.StartTheLelz
0x0000c480    6 416          sym.sendSTD
0x0000c624   10 356          sym.sendHTTP
0x0000c790   41 1724         sym.sendUDP
0x0000ce4c   36 1620         sym.sendTCP
0x0000d4bc   98 2956         sym.processCmd
0x0000e084   11 448          sym.initConnection
0x0000e250   21 720          sym.getOurIP
0x0000e534    1 24           sym.getBuild
0x0000e550   83 3100         main
(以下略)
[0x00008190]> 

気になる関数名いくつかで検索してみたところ、以下のように同種の検体を解析している記事が見つかりました。「SSHハニーポットへの典型的な攻撃分析」といった内容の記事です。

www.sohu.com ※捜狐(sohu.com)は中国のポータルサイトです。

この記事で解析されている検体には「UpdateBins」という検体を更新するための関数があるようですが、今回ハニーポットで捕まえたものには存在していませんでした。 (リンクは貼りませんが、適当に検索して見つけたリークされたコードによると、UpdateBins関数はC2からUPDATEコマンドを受け取った際に決め打ちしたアドレスからファイルをwgetしてくるコードがハードコードされているだけでした)

記事内でも言及されているように、gafgytはmiraiと同じく様々なところにソースコードらしきものが転がっており(しかもそれぞれ実装言語が違ったり機能が違ったりする)、検体によってはそれらのコードから機能がさらに追加されていることがあります。2014年ごろから存在が確認されているようなので*1、もはや元のコードと違って当たり前なんでしょうね(とはいえそんなに変わっていないようにも見えるんですけど…)。

ちなみに、IoTSecJP Vol.1*2で観察日記を書いた「Remaiten」はこのgafgytとkaitenという別種のマルウェア両方の特徴を持っているものです。

C2の見つけ方

(100%でない&やり方が雑なのは自戒しつつ)gafgytはパッキングされていない限り、stringsコマンドにかけた結果を適当にIPっぽい文字列を抽出できるようgrepしてやればC2を見つけることができます。

$ strings <ファイル> | grep -e '[0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+:[0-9]\+'

静的解析ができるともう少し書けることがあるのかもしれませんが、今だにアセンブラ読めないのでこのへんで終わります。ジャーキー美味しい。

古いマルウェアを観察するシリーズ(1)Dofloo

お久しぶりです。にほんももんがです。先日参加した技術書典で頒布した「IoTSecJP vol.1」でも書いた通り、Cowrie(ハニーポット)を運用している私ですが、ssh/telnetを狙ってくるマルウェアは古めのものが多くあまり真新しいものを見つけられません。*1

もちろんちょっと前に流行った(今もかな?)GPON狙いのマルウェアなど、時流に乗ったマルウェアも時々いらっしゃったりするのですが、そもそも自分が気づく前にセキュリティリサーチャーの方々が非常に有用で詳細なレポートを出してくださるので、私がブログに書けるようなことがありません。*2

それでもどうにか少しづつマルウェア解析できるようにならないかなあと色々調べたりしているわけですが、最近ドツボにはまってしまい、ひたすらqemuのドキュメントやメーリングリストを読んでいるだけの日々を過ごしています。1日経つと何を調べていたか忘れてしまうので、だいたいは一度読んだことがあるページを開き、はて、どんな内容だったかなと首をひねる毎日です。

PEファイルの解析方法は詳細なものが色々と出ていますが、MIPSやARMのELFの解析方法なんてWriteupくらいしか見当たらず困っています。しかもWirteupなんてだいたいは理解している人々に対して書いているものなので、凡人には意味不明です。

仕方がないので、既にたくさん情報があり、本職の方々には「あー、まだ生きてるんだ〜!」と言われるようなマルウェアを観察しつつ日々を過ごして行きたいと思います。

検体情報

First submissionは5/3ですが、ハニーポットには6/1ごろひっかかりました。複数のアンチウイルスソフトがDoflooだとかAesddosだとか言っています。 これらのキーワードで検索するとSymantecさんのブログに行き当たりました。

www.symantec.com

このマルウェアはDDoS 攻撃の実行だけではなく、バックドアを開けるようで、C&C サーバーとの通信を暗号化する際に AES アルゴリズムを使うのでAesddosなどと呼ばれたりしているようです。

いつごろから出てきたのか調べてみたところ、SANSのホワイトペーパーには「Around mid-2014」って書いてありました(P5)。

https://www.sans.org/reading-room/whitepapers/malicious/analyzing-backdoor-bot-mips-platform-35902

捕まえたものはx86用でしたが、MIPSやARMなどのものもあるようです。

C2はどこなの

Dofloo(読み方わからない)はよくあるkaiten(tsunami)やGafgytなどとは違い、stringsさえ見ればC2わかってまうわ〜ということはありませんが、親切な(たぶん)リサーチャーによって検体からC2情報を抽出するスクリプトが提供されています。

RATConf-DecryptScript/Backdoor.Linux.Dofloo.b at master · felicitychou/RATConf-DecryptScript · GitHub

最終更新が2017年の2月頃と既に1年以上経ってしまっているので今でも使えるのかなと思いましたが、少なくとも上記検体からは抽出することができました(IPアドレスとポート)。 このスクリプトで抽出成功するということはC2のアドレスのオフセットやマジックナンバーが変わっていない様なので、きっと攻撃者は面倒くさがりやさんなんですね。

他にも色々と知りたいことはありますが、もうそろそろ飽きてきたのでここで終わります。 このファミリーについてもっと深く知りたい人はMalware Must Dieさんの記事を読むといいんじゃないかと思います。

MMD-0026-2014 - Linux/AES.DDoS: Router Malware Warning | Reversing an ARM arch ELF · MalwareMustDie!

今日もまたこの後はqemuと格闘します。では。

*1:面倒がってパスワードファイルを工夫したりしていないこともおそらく原因です

*2:360netlabさんのブログがすてき:GPON - Page 1 - 360 Netlab Blog - Network Security Research Lab at 360