すみだセキュリティ勉強会2018その1での発表資料です。 http://ozuma.sakura.ne.jp/sumida/2018/03/22/38/
長くて覚えやすくて複雑なパスワードとemojiの話 マジ卍すみだセキュリティ勉強会2018その1 (2018/04/30)すみだセキュリティ勉強会@ozuma51191
View Slide
Agenda•1st section “emojiとパスワード”•長くて覚えやくて複雑なパスワード•絵文字でのパスワードクラッキング•2nd section “Unicodeとセキュリティ”•UTF-8/UTF-16/UTF-32•文字コードで懸念される脆弱性2
今日、話さないこと•パスワード定期変更→ 宗教論争3
41stSectionemojiとパスワード
攻撃しにくいパスワード•最近のトレンドは、「とにかく文字数を多く」•例)${password}(自分の成年月日)-(定型文字列)•Vn!px$2n•Vn!px$2n1990/01/01-SUMIDA5
総当たりへの耐性 6•たとえアルファベット小文字26種だけでも文字数を増やせば、「べき乗」で効いてくる•a=26, n=文字数•100文字のパスワードなら、26の100乗
でも今日は敢えて文字種に注目 7•本日の勉強会に来ている人は、一般人ではない 一般的な話以外も聞きたいと思うので•「攻撃しにくい文字種」を考えてみる
8本当にあった怖い話
本当にあった事案(脚色あり) 9セキュリティルームで作業したいんですけど。ozuma5119
本当にあった事案(脚色あり) 10パスワードはこれです。メモ等は禁止です。また、この紙は持ち出さないでください。ozuma5119
本当にあった事案(脚色あり) 11パスワードはこれです。メモ等は禁止です。また、この紙は持ち出さないでください。ozuma5119Nvb02u!$nvs9PNvp@xp”!F(20文字くらいの乱数だった)
本当にあった事案(脚色あり) 12ムリですね。ozuma5119
本当にあった事案(脚色あり) 13うん。ozuma5119
14パスワード再考
I think about “Good Password”.... 15・適度に長くて・覚えやすく・複数の文字種を含んで・推測されにくいパスワード.....
I think about “Good Password”.... 16・適度に長くて・覚えやすく・複数の文字種を含んで・推測されにくいパスワード.....
I think about “Good Password”.... 17・適度に長くて・覚えやすく・複数の文字種を含んで・推測されにくいパスワード.....
18
19
ASCII文字からの脱却 20•パスワードに絵文字を使ってみてはどうか•emojiだってUnicodeの1文字にすぎない•というか日本語とか半角カナとかもいっぱい織り交ぜれば、非日本語圏の人は入力すらツラいのでは•辞書攻撃ツールなども、まさか絵文字に対応しておらんやろ
対応状況:Twitter 21
対応状況:Twitter 22ぶちこむ!!
ちゃんとログインできた 23
絵文字でログインできるよ 24sumida_test001%E3%81%8A%E3%81%AF%E3%82%88.....
確認(TwitterのHTMLはUTF-8) 25お は よ ー
パスワードPOST内容の確認 26URLエンコードでは、絵文字とか特別な文字の意識をする必要は無い。単にバイト列をエンコードするだけ。%E3%81%8A%E3%81%AF%E3%82%88%E3%83%BC%F0%9F%99%8C%E2%98%BA%F0%9F%92%A8%F0%9F%91%80%F0%9F%8C%B8
パスワードに絵文字を使おう 27うはwwwwっ楽しスこれがパスワード
他サービスの対応状況•WordPress•パスワードに絵文字使える•なおタイトルに絵文字など使う場合、MySQLのutf8mb4設定(寿司ビール問題)があるが、長い話になるので余裕があれば語る28
WordPressはビール脆弱 29
Yahoo! JAPAN:だめ 30
楽天:怒られた 31
Cookpad:だめ(使える文字わからん) 32
Windows 7:詰むぞ! 33
Linuxのユーザパスワード:OK 34コピペでぶちこむ!!
ログインできるよ 35コピペで
Macからsshするだけなら良いが...•Windowsはターミナル対応も必要•PuTTY:OK•WinSCP:OK•TeraTerm:だめ•Windows PowerShell(WSLのssh利用):だめ•ConEmu(WSLのssh利用):だめ•障害時など、コンソールからしか入力できないときハマるから、オススメはできない36
(おまけ) dockerのwhalesay:OK 37
38クラッキングツールの対応
hydraでWordPress管理画面にログイン試行 39# hydra -l beer -P pass.lst 192.168.2.67 http-post-form ¥"/wordpress/wp-login.php:log=^USER^&pwd=^PASS^:login_error"•ログインエラー時にlogin_errorが出るのでそれを拾う•ユーザ名 beer は分かっているものとする•pass.lstファイルに絵文字パスワードを入れておく
hydra:絵文字対応!!!!!!!1 40
wpscanでWordPress管理画面ログイン試行 41# wpscan --url http://192.168.2.67/wordpress--wordlist /root/pass.lst --username beer --threads 10https://wpscan.org/
wpscanも対応!!!!!!!!1 42# wpscan --url http://192.168.2.67/wordpress--wordlist /root/pass.lst --username beer --threads 10
43John the ripper
john the Ripper...の前におさらい 44osumi:$6$tyRfXiDr$.Ygm5rlb0Pw8PPkkiVAOyZ40CQ3RQ9INbAMwEizuOZlcez1Q/LZwSU7yHK4Nt8UsfPw/bQPiUghsvCkAyeDQa/:17607:0:99999:7:::Linuxのパスワードファイルは/etc/shadow※FreeBSDは/etc/master.passwd※他のUNIX系もだいたい同じだが、HP-UXだけは独自の進化(話すと長いから省略)
john the Ripper...の前におさらい 45osumi:$6$tyRfXiDr$.Ygm5rlb0Pw8PPkkiVAOyZ40CQ3RQ9INbAMwEizuOZlcez1Q/LZwSU7yHK4Nt8UsfPw/bQPiUghsvCkAyeDQa/:17607:0:99999:7:::Linuxのパスワードファイルは/etc/shadowソルトハッシュ形式, $6$はSHA512ログイン名ハッシュ化されたパスワード
john the Ripper...の前におさらい 46osumi:$6$tyRfXiDr$.Ygm5rlb0Pw8PPkkiVAOyZ40CQ3RQ9INbAMwEizuOZlcez1Q/LZwSU7yHK4Nt8UsfPw/bQPiUghsvCkAyeDQa/:17607:0:99999:7:::$ python -c 'import crypt; print crypt.crypt("おはよー☺", "$6$tyRfXiDr$”)’$6$tyRfXiDr$.Ygm5rlb0Pw8PPkkiVAOyZ40CQ3RQ9INbAMwEizuOZlcez1Q/LZwSU7yHK4Nt8UsfPw/bQPiUghsvCkAyeDQa/一致した
John the Ripperのつかいかた1 47# unshadow passwd shadow > passwd.db# cat passwd.dbroot:$6$mO0Bqohl$Z03.tTtOUumg7UXfQ43u0JxLtknaOyM6YrteTa9sfdJltfZhYcqlkOV43.1Zfvq0fHX.FYNypaoZqDlkQQ3yT0:0:0:root:/root:/bin/bash....(省略)....osumi:$6$tyRfXiDr$.Ygm5rlb0Pw8PPkkiVAOyZ40CQ3RQ9INbAMwEizuOZlcez1Q/LZwSU7yHK4Nt8UsfPw/bQPiUghsvCkAyeDQa/:1001:1001::/home/osumi:/bin/bash....(省略)....unshadowして/etc/passwdとshadowを結合
John the Ripperのつかいかた2 48# cat p.lstpassword1234567890キャハがんばろ〜pa$$wordおはよー☺PA$SWORDパスワードファイル(p.lst)を用意
John the Ripperのつかいかた3 49# john --wordlist=p.lst passwd.db辞書モードでハッシュをクラック# john --show passwd.dbクラックできたパスワードを表示
johnも絵文字対応してた 50
1部まとめ•とりあえずパスワードに絵文字入れても意外に通る•これからは絵文字パスワードが流行る[要出典]ハニーポットで、非ASCII文字のパスワードで来ている例がある方はぜひ教えてください(私はまだ観測していません)51
522ndSectionUnicodeとセキュリティ
Unicodeのcode point 53墨U+58A8UTF-8 0xE5A2A8UTF-16LE 0xA858UTF-16BE 0x58A8UTF-32BE 0x000058A8code point(文字コード表の位置)は、U+58A8LE: リトルエンディアンBE: ビッグエンディアン
Unicodeのcode point 54aU+0061UTF-8 0x61UTF-16LE 0x6100UTF-16BE 0x0061UTF-32BE 0x00000061code point(文字コード表の位置)は、U+0061
Unicodeのcode point 55U+1F62DUTF-8 0xF09F98ADUTF-16LE 0x3DD82DDEUTF-16BE 0xD83DDE2DUTF-32BE 0x0001F62Dcode point(文字コード表の位置)は、U+1F62DLoudly Crying Face ※面1(SMP)の文字
Unicodeの群、面•基本多言語面(BMP: Basic Multilingual Plane)• 面0(ゼロ)と呼ばれる• code pointは16進4ケタとなる(例:U+58A8)•補助多言語面(SMP: Supplementary Multilingual Plane)• 面1と呼ばれる• codepointは16進5ケタ、先頭は1となる(例:U+1F62D)• 面の上位に「群」もあるが、群0しか使われない56※UTF-8などはいったん忘れて、code point(規格での文字表の位置)だけ考える
BMP面の文字 57群 0 (Unicodeでは常にゼロ)面 0 (BMP)墨U+58A8※一般的な文字はほぼBMPに入っている
SMP面の文字 58U+1F62DLoudly Crying Face群 0 (Unicodeでは常にゼロ)面 1 (SMP)
UnicodeとUTF-8/16/32•Unicodeでは、文字表のcode pointに対して複数のコード値がある•UTF-8•UTF-16 (ビッグ|リトル)エンディアン + BOM有無•UTF-32 (ビッグ|リトル)エンディアン + BOM有無•ここにわかりにくさのポイントがあると思う59
で、セキュリティの話は?•次のUTF-8に出てきます60
61UTF-8
UTF-8の特徴•8bitを単位とし、code pointに独自演算をほどこしてコード値を生成する• どう計算するか話すと長いので省略•ASCIIコードとの互換性が最大の魅力• ASCII文字しかない文書は、ASCIIでもUTF-8でも全く同じバイト列になる•ASCIIは1バイト、日本語や絵文字などは3〜4バイトとなる可変長• BMPは3バイト、面0以外のSMPなどは4バイト•2018年現在、ファイルやWebアプリ入出力(外部コード)はほぼUTF-8で統一されている62
UTF-8のセキュリティ問題 631つのcode pointに対して、複数のコード値が存在する/U+002FUTF-80x2F0xC0AF (規格上は不正)0xE080AF (〃)0xF08080AF (〃)本当は怖い文字コードの話 第4回 UTF-8の冗長なエンコードhttp://gihyo.jp/admin/serial/01/charcode/0004文字をビット比較して「0x2F禁止」など安易に書くと、ディレクトリトラバーサルの脆弱性を引き起こす
64UTF-16
UTF-16の特徴•16ビットを単位とし、歴史的にはもっとも正統(?)な表現• JavaやWindowsの内部コードとして利用されていることで有名•BMP(面0)では、code pointとコード値が一致する•SMPなど面0以外を扱うために魔改造がほどこされ、とても分かりにくい[要出典]• サロゲートペアの利用•エンディアンを明示するため、データの先頭にバイト順マーク(Byte Order Mark; BOM)が利用される• ビッグエンディアン:U+FEFF• リトルエンディアン:U+FFFE65
UTF-16のサロゲートペア 66U+1F62DUTF-16BE 0xD83DDE2Dcode point(文字コード表の位置)は、U+1F62DLoudly Crying FaceU+D800〜U+DBFF:上位サロゲートU+DC00〜U+DFFF:下位サロゲート結合文字(Aと^でâなど)との混同に注意
Javaの内部コードはUTF-16 67String str = "あいうえお";for (char c : str.toCharArray()) {System.out.println(c + " => 0x" + Integer.toHexString(c));}UTF-8でソースコードを書いて実行してもあ => 0x3042い => 0x3044う => 0x3046え => 0x3048お => 0x304aUTF-16のバイト列が得られる
68UTF-32
UTF-32の特徴•名前のとおり、32bit(4バイト)で表現する固定長•code pointとコード値が完全一致• エンディアンの問題は残るため、BOMが利用される•固定長のため扱いやすい•ASCII文字も4バイトになるため、特にASCII文字が多い文書のサイズが膨れ上がる69
70補足:絵文字豆知識
emoji = emotion icon ? 71海外では、emojiを日本語の”絵文字”と知らずに、emotionicon(emoticon)からの造語と思っている人が結構多い[要出典]https://www.reddit.com/r/todayilearned/comments/6fwuxi/til_the_word_emoji_has_no_connection_to_emotion/
Appleの絵文字の著作権•iPhoneなどの絵文字を、そのままアプリのアイコンやデザインに使うことは禁止されている•絵文字を自由に使いたい場合は、Twitterがクリエイティブ・コモンズとして提供しているアイコンを使うのがオススメ•https://github.com/twitter/twemoji72
73App Store審査ガイドラインより引用:https://developer.apple.com/jp/app-store/review/guidelines/
Agenda•1st section “emojiとパスワード”•長くて覚えやくて複雑なパスワード•絵文字でのパスワードクラッキング•2nd section “Unicodeとセキュリティ”•UTF-8/UTF-16/UTF-32•文字コードで懸念される脆弱性74
参考文献• プログラマのための文字コード技術入門,矢野 啓介, 技術評論社• 楽しい文字コード入門 知っておきたいUnicode Emoji編• https://speakerdeck.com/todokr/le-siiwen-zi-kodoru-men-zhi-tuteokitaiunicode-emojibian• 本当は怖い文字コードの話 第4回 UTF-8の冗長なエンコード• http://gihyo.jp/admin/serial/01/charcode/000475
著作権表示• 本スライド内の絵文字画像の著作権は、以下に帰属します。Copyright 2018 Twitter, Inc and other contributors / CC BY 4.0https://github.com/twitter/twemoji76