Slide 1

Slide 1 text

長くて覚えやすくて複雑なパスワードと emojiの話 マジ卍 すみだセキュリティ勉強会2018その1 (2018/04/30) すみだセキュリティ勉強会 @ozuma5119 1

Slide 2

Slide 2 text

Agenda •1st section “emojiとパスワード” •長くて覚えやくて複雑なパスワード •絵文字でのパスワードクラッキング •2nd section “Unicodeとセキュリティ” •UTF-8/UTF-16/UTF-32 •文字コードで懸念される脆弱性 2

Slide 3

Slide 3 text

今日、話さないこと •パスワード定期変更 → 宗教論争 3

Slide 4

Slide 4 text

4 1st Section emojiとパスワード

Slide 5

Slide 5 text

攻撃しにくいパスワード •最近のトレンドは、 「とにかく文字数を多く」 •例) ${password}(自分の成年月日)-(定型 文字列) •Vn!px$2n •Vn!px$2n1990/01/01-SUMIDA 5

Slide 6

Slide 6 text

総当たりへの耐性 6 •たとえアルファベット小文字26種だけでも 文字数を増やせば、「べき乗」で効いてくる •a=26, n=文字数 •100文字のパスワードなら、26の100乗

Slide 7

Slide 7 text

でも今日は敢えて文字種に注目 7 •本日の勉強会に来ている人は、一般人 ではない 一般的な話以外も聞きたいと 思うので •「攻撃しにくい文字種」を考えてみる

Slide 8

Slide 8 text

8 本当にあった怖い話

Slide 9

Slide 9 text

本当にあった事案(脚色あり) 9 セキュリティルームで 作業したいんですけど。 ozuma5119

Slide 10

Slide 10 text

本当にあった事案(脚色あり) 10 パスワードはこれです。 メモ等は禁止です。 また、この紙は持ち出さない でください。 ozuma5119

Slide 11

Slide 11 text

本当にあった事案(脚色あり) 11 パスワードはこれです。 メモ等は禁止です。 また、この紙は持ち出さない でください。 ozuma5119 Nvb02u!$nvs9PNvp@ xp”!F (20文字くらいの乱数だった)

Slide 12

Slide 12 text

本当にあった事案(脚色あり) 12 ムリですね。 ozuma5119

Slide 13

Slide 13 text

本当にあった事案(脚色あり) 13 うん。 ozuma5119

Slide 14

Slide 14 text

14 パスワード再考

Slide 15

Slide 15 text

I think about “Good Password”.... 15 ・適度に長くて ・覚えやすく ・複数の文字種を含んで ・推測されにくい パスワード.....

Slide 16

Slide 16 text

I think about “Good Password”.... 16 ・適度に長くて ・覚えやすく ・複数の文字種を含んで ・推測されにくい パスワード.....

Slide 17

Slide 17 text

I think about “Good Password”.... 17 ・適度に長くて ・覚えやすく ・複数の文字種を含んで ・推測されにくい パスワード.....

Slide 18

Slide 18 text

18

Slide 19

Slide 19 text

19

Slide 20

Slide 20 text

ASCII文字からの脱却 20 •パスワードに絵文字を使ってみてはどうか •emojiだってUnicodeの1文字にすぎない •というか日本語とか半角カナとかもいっぱ い織り交ぜれば、非日本語圏の人は入力す らツラいのでは •辞書攻撃ツールなども、まさか絵文字に対 応しておらんやろ

Slide 21

Slide 21 text

対応状況:Twitter 21

Slide 22

Slide 22 text

対応状況:Twitter 22 ぶちこむ!!

Slide 23

Slide 23 text

ちゃんとログインできた 23

Slide 24

Slide 24 text

絵文字でログインできるよ 24 sumida_test001 %E3%81%8A%E3%81 %AF%E3%82%88.....

Slide 25

Slide 25 text

確認(TwitterのHTMLはUTF-8) 25 お は よ ー

Slide 26

Slide 26 text

パスワードPOST内容の確認 26 URLエンコードでは、絵文字とか特別な文字の 意識をする必要は無い。 単にバイト列をエンコードするだけ。 %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

Slide 27

Slide 27 text

パスワードに絵文字を使おう 27 うはwwwwっ楽しス これがパスワード

Slide 28

Slide 28 text

他サービスの対応状況 •WordPress •パスワードに絵文字使える •なおタイトルに絵文字など使う場合、 MySQLのutf8mb4設定(寿司ビール問 題)があるが、長い話になるので余裕 があれば語る 28

Slide 29

Slide 29 text

WordPressはビール脆弱 29

Slide 30

Slide 30 text

Yahoo! JAPAN:だめ 30

Slide 31

Slide 31 text

楽天:怒られた 31

Slide 32

Slide 32 text

Cookpad:だめ(使える文字わからん) 32

Slide 33

Slide 33 text

Windows 7:詰むぞ! 33

Slide 34

Slide 34 text

Linuxのユーザパスワード:OK 34 コピペでぶちこむ!!

Slide 35

Slide 35 text

ログインできるよ 35 コピペで

Slide 36

Slide 36 text

Macからsshするだけなら良いが... •Windowsはターミナル対応も必要 •PuTTY:OK •WinSCP:OK •TeraTerm:だめ •Windows PowerShell(WSLのssh利用):だめ •ConEmu(WSLのssh利用):だめ •障害時など、コンソールからしか入力できな いときハマるから、オススメはできない 36

Slide 37

Slide 37 text

(おまけ) dockerのwhalesay:OK 37

Slide 38

Slide 38 text

38 クラッキングツールの対応

Slide 39

Slide 39 text

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ファイルに絵文字パスワードを入れて おく

Slide 40

Slide 40 text

hydra:絵文字対応!!!!!!!1 40

Slide 41

Slide 41 text

wpscanでWordPress管理画面ログイン試行 41 # wpscan --url http://192.168.2.67/wordpress --wordlist /root/pass.lst --username beer --threads 10 https://wpscan.org/

Slide 42

Slide 42 text

wpscanも対応!!!!!!!!1 42 # wpscan --url http://192.168.2.67/wordpress --wordlist /root/pass.lst --username beer --threads 10

Slide 43

Slide 43 text

43 John the ripper

Slide 44

Slide 44 text

john the Ripper...の前におさらい 44 osumi:$6$tyRfXiDr$.Ygm5rlb0Pw8PPkkiVAOyZ40CQ3R Q9INbAMwEizuOZlcez1Q/LZwSU7yHK4Nt8UsfPw/bQ PiUghsvCkAyeDQa/:17607:0:99999:7::: Linuxのパスワードファイルは/etc/shadow ※FreeBSDは/etc/master.passwd ※他のUNIX系もだいたい同じだが、HP-UXだけは 独自の進化(話すと長いから省略)

Slide 45

Slide 45 text

john the Ripper...の前におさらい 45 osumi:$6$tyRfXiDr$.Ygm5rlb0Pw8PPkkiVAOyZ40CQ3 RQ9INbAMwEizuOZlcez1Q/LZwSU7yHK4Nt8UsfPw/b QPiUghsvCkAyeDQa/:17607:0:99999:7::: Linuxのパスワードファイルは/etc/shadow ソルト ハッシュ形式, $6$はSHA512 ログイン名 ハッシュ化された パスワード

Slide 46

Slide 46 text

john the Ripper...の前におさらい 46 osumi:$6$tyRfXiDr$.Ygm5rlb0Pw8PPkkiVAOyZ40CQ3R Q9INbAMwEizuOZlcez1Q/LZwSU7yHK4Nt8UsfPw/bQ PiUghsvCkAyeDQa/:17607:0:99999:7::: $ python -c 'import crypt; print crypt.crypt("お はよー☺", "$6$tyRfXiDr$”)’ $6$tyRfXiDr$.Ygm5rlb0Pw8PPkkiVAOyZ40CQ3R Q9INbAMwEizuOZlcez1Q/LZwSU7yHK4Nt8Usf Pw/bQPiUghsvCkAyeDQa/ 一致した

Slide 47

Slide 47 text

John the Ripperのつかいかた1 47 # unshadow passwd shadow > passwd.db # cat passwd.db root:$6$mO0Bqohl$Z03.tTtOUumg7UXfQ43u0JxLtkna OyM6YrteTa9sfdJltfZhYcqlkOV43.1Zfvq0fHX.FYNypaoZ qDlkQQ3yT0:0:0:root:/root:/bin/bash ....(省略).... osumi:$6$tyRfXiDr$.Ygm5rlb0Pw8PPkkiVAOyZ40CQ3R Q9INbAMwEizuOZlcez1Q/LZwSU7yHK4Nt8UsfPw/bQ PiUghsvCkAyeDQa/:1001:1001::/home/osumi:/bin/bas h ....(省略).... unshadowして/etc/passwdとshadowを結合

Slide 48

Slide 48 text

John the Ripperのつかいかた2 48 # cat p.lst password 1234567890 キャハがんばろ〜 pa$$word おはよー☺ PA$SWORD パスワードファイル(p.lst)を用意

Slide 49

Slide 49 text

John the Ripperのつかいかた3 49 # john --wordlist=p.lst passwd.db 辞書モードでハッシュをクラック # john --show passwd.db クラックできたパスワードを表示

Slide 50

Slide 50 text

johnも絵文字対応してた 50

Slide 51

Slide 51 text

1部まとめ •とりあえずパスワードに絵文字入れても意外に 通る •これからは絵文字パスワードが流行る[要出典] ハニーポットで、非ASCII文字のパスワードで来 ている例がある方はぜひ教えてください (私はまだ観測していません) 51

Slide 52

Slide 52 text

52 2nd Section Unicodeとセキュリティ

Slide 53

Slide 53 text

Unicodeのcode point 53 墨 U+58A8 UTF-8 0xE5A2A8 UTF-16LE 0xA858 UTF-16BE 0x58A8 UTF-32BE 0x000058A8 code point(文字コード表の位置)は、U+58A8 LE: リトルエンディアン BE: ビッグエンディアン

Slide 54

Slide 54 text

Unicodeのcode point 54 a U+0061 UTF-8 0x61 UTF-16LE 0x6100 UTF-16BE 0x0061 UTF-32BE 0x00000061 code point(文字コード表の位置)は、U+0061

Slide 55

Slide 55 text

Unicodeのcode point 55 U+1F62D UTF-8 0xF09F98AD UTF-16LE 0x3DD82DDE UTF-16BE 0xD83DDE2D UTF-32BE 0x0001F62D code point(文字コード表の位置)は、U+1F62D Loudly Crying Face ※面1(SMP)の文字

Slide 56

Slide 56 text

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(規格での文字表 の位置)だけ考える

Slide 57

Slide 57 text

BMP面の文字 57 群 0 (Unicodeでは常にゼロ) 面 0 (BMP) 墨 U+58A8 ※一般的な文字はほぼBMPに入っている

Slide 58

Slide 58 text

SMP面の文字 58 U+1F62D Loudly Crying Face 群 0 (Unicodeでは常にゼロ) 面 1 (SMP)

Slide 59

Slide 59 text

UnicodeとUTF-8/16/32 •Unicodeでは、文字表のcode pointに対して 複数のコード値がある •UTF-8 •UTF-16 (ビッグ|リトル)エンディアン + BOM有無 •UTF-32 (ビッグ|リトル)エンディアン + BOM有無 •ここにわかりにくさのポイントがあると思う 59

Slide 60

Slide 60 text

で、セキュリティの話は? •次のUTF-8に出てきます 60

Slide 61

Slide 61 text

61 UTF-8

Slide 62

Slide 62 text

UTF-8の特徴 •8bitを単位とし、code pointに独自演算をほどこし てコード値を生成する • どう計算するか話すと長いので省略 •ASCIIコードとの互換性が最大の魅力 • ASCII文字しかない文書は、ASCIIでもUTF-8でも全く同じ バイト列になる •ASCIIは1バイト、日本語や絵文字などは3〜4バイ トとなる可変長 • BMPは3バイト、面0以外のSMPなどは4バイト •2018年現在、ファイルやWebアプリ入出力(外部 コード)はほぼUTF-8で統一されている 62

Slide 63

Slide 63 text

UTF-8のセキュリティ問題 63 1つのcode pointに対して、複数のコード値が存在する / U+002F UTF-8 0x2F 0xC0AF (規格上は不正) 0xE080AF (〃) 0xF08080AF (〃) 本当は怖い文字コードの話 第4回 UTF-8の冗長なエンコード http://gihyo.jp/admin/serial/01/charcode/0004 文字をビット比較して「0x2F禁止」など安易に書くと、 ディレクトリトラバーサルの脆弱性を引き起こす

Slide 64

Slide 64 text

64 UTF-16

Slide 65

Slide 65 text

UTF-16の特徴 •16ビットを単位とし、歴史的にはもっとも正統(?)な 表現 • JavaやWindowsの内部コードとして利用されていることで 有名 •BMP(面0)では、code pointとコード値が一致する •SMPなど面0以外を扱うために魔改造がほどこされ、 とても分かりにくい[要出典] • サロゲートペアの利用 •エンディアンを明示するため、データの先頭にバイ ト順マーク(Byte Order Mark; BOM)が利用される • ビッグエンディアン:U+FEFF • リトルエンディアン:U+FFFE 65

Slide 66

Slide 66 text

UTF-16のサロゲートペア 66 U+1F62D UTF-16BE 0xD83DDE2D code point(文字コード表の位置)は、U+1F62D Loudly Crying Face U+D800〜U+DBFF:上位サロゲート U+DC00〜U+DFFF:下位サロゲート 結合文字(Aと^でâなど)との 混同に注意

Slide 67

Slide 67 text

Javaの内部コードはUTF-16 67 String str = "あいうえお"; for (char c : str.toCharArray()) { System.out.println(c + " => 0x" + Integer.toHexString(c)); } UTF-8でソースコードを書いて実行しても あ => 0x3042 い => 0x3044 う => 0x3046 え => 0x3048 お => 0x304a UTF-16のバイト列が得られる

Slide 68

Slide 68 text

68 UTF-32

Slide 69

Slide 69 text

UTF-32の特徴 •名前のとおり、32bit(4バイト)で表現する固定長 •code pointとコード値が完全一致 • エンディアンの問題は残るため、BOMが利用される •固定長のため扱いやすい •ASCII文字も4バイトになるため、特にASCII文字が多 い文書のサイズが膨れ上がる 69

Slide 70

Slide 70 text

70 補足:絵文字豆知識

Slide 71

Slide 71 text

emoji = emotion icon ? 71 海外では、emojiを日本語の”絵文字”と知らずに、emotion icon(emoticon)からの造語と思っている人が結構多い[要出典] https://www.reddit.com/r/todayilearned/comments/6fwuxi/til_the_word_emoji_has_no_connection_to_emotion/

Slide 72

Slide 72 text

Appleの絵文字の著作権 •iPhoneなどの絵文字を、そのままアプリのアイコ ンやデザインに使うことは禁止されている •絵文字を自由に使いたい場合は、Twitterがクリエ イティブ・コモンズとして提供しているアイコン を使うのがオススメ •https://github.com/twitter/twemoji 72

Slide 73

Slide 73 text

73 App Store審査ガイドラインより引用: https://developer.apple.com/jp/app-store/review/guidelines/

Slide 74

Slide 74 text

Agenda •1st section “emojiとパスワード” •長くて覚えやくて複雑なパスワード •絵文字でのパスワードクラッキング •2nd section “Unicodeとセキュリティ” •UTF-8/UTF-16/UTF-32 •文字コードで懸念される脆弱性 74

Slide 75

Slide 75 text

参考文献 • プログラマのための文字コード技術入門,矢野 啓介, 技術評論社 • 楽しい文字コード入門 知っておきたいUnicode Emoji編 • https://speakerdeck.com/todokr/le-siiwen-zi-kodoru-men-zhi- tuteokitaiunicode-emojibian • 本当は怖い文字コードの話 第4回 UTF-8の冗長なエンコード • http://gihyo.jp/admin/serial/01/charcode/0004 75

Slide 76

Slide 76 text

著作権表示 • 本スライド内の絵文字画像の著作権は、以下に帰属します。 Copyright 2018 Twitter, Inc and other contributors / CC BY 4.0 https://github.com/twitter/twemoji 76