Unicode ゼロ幅スペースを利用して情報を隠して仕込む

情報隠蔽ツールを作った。 ゼロ幅スペースというUnicodeの闇。
kanata8ヶ月前に追加

ゼロ幅スペースというUnicodeの闇

ZeroWidthSpace

動機 : 先日こういう話題があった

ゼロ幅文字にエンコードした隠し情報で、文書をリークしたメンバーを特定

とある会員制掲示板からの文書の流出に困った運営者が、 ユニコードの見えない文字「ゼロ幅文字(Zero-Width characters)」を使って流出させたユーザーを特定した、という話 が出ていました。 ...

  • 要約
    • 競技ビデオゲームのチームが、プライベートの掲示板を利用
    • 外部の掲示板にコピペしているやつがいた
    • 見た目がわからない文字を仕込んで犯人を特定

原理 : Unicodeゼロ幅スペースを仕込んだ

ゼロ幅スペース(Wikipedia)

コンピュータの組版に用いられる非表示文字で、文書処理システムに対して語の切れ目を示すのに用いる

めっちゃ種類ある

U+034F , U+200B , U+200C , U+200D , U+200E , U+200F , U+2028 , U+2029 , U+202A , U+202B , U+202C , U+202D , U+202E , U+2061 , U+2062 , U+2063 , U+FEFF

いろんな事に(難読化シェル芸)に使えるんじゃ・・・!

元ネタに習って4種類を使う ⇒ 4進数で表現できる!

CodePoint 名称 デコード時
U+200B ゼロ幅空白 0
U+200C ゼロ幅非接合子(筆記体の時の制御) 1
U+200D ゼロ幅接合子(筆記体の時の制御) 2
U+FEFF ゼロ幅のノーブレークスペース 3

ゼロ幅スペースにエンコード

  1. 文字を16進数に変換(xxd)
  2. 16進数を4進数に変換(bc)
  3. 0 1 2 3 をゼロ幅スペースに置換(sed)
ZWS1=$'\u200b'
ZWS2=$'\u200c'
ZWS3=$'\u200d'
ZWS4=$'\ufeff'

echo "unko" |xxd -p|tr a-z A-Z \
  |sed 's/^/obase=4; ibase=16; &/g'|bc \
  |sed s/0/$ZWS1/g |sed s/1/$ZWS2/g \
  |sed s/2/$ZWS3/g |sed s/3/$ZWS4/g 

仕込んだゼロ幅スペースのデコード

  1. ゼロ幅スペースを 0 1 2 3 に置換(sed)
  2. 16進数に変換(bc)
  3. バイナリに変換(xxd)
ZWS1=$'\u200b'
ZWS2=$'\u200c'
ZWS3=$'\u200d'
ZWS4=$'\ufeff'

echo '‌‌‌‌‍‍‌‍‍‌‍​​‍‍' \
  |sed s/$ZWS1/0/g |sed s/$ZWS2/1/g \
  |sed s/$ZWS3/2/g |sed s/$ZWS4/3/g \
  |sed 's/^/obase=16; ibase=4; &/g'|bc|xxd -ps -r

※ echo '' の''にはゼロ幅スペース入ってる

ツール作った

ツール作ったのだけど、後述の 「Twitter用 Unicodeゼロ幅スペースぶっ込み用ツール」 の方が使い勝手がよい

Instration

ファイルダウンロードして実行権限をつけるだけ

$ wget https://raintrees.net/attachments/download/472/EncodeZeroWidthSpace.sh
$ chmod u+x ./EncodeZeroWidthSpace.sh
$ wget https://raintrees.net/attachments/download/473/DecodeZeroWidthSpace.sh
$ chmod u+x ./DecodeZeroWidthSpace.sh

動作環境

ただのシェルスクリプトなので、だいたいの環境(Linux,Mac,Unix)で動くのでは

以下で、動作確認しました。

  • CentOS Linux release 7.2.1511 x86_64

Usage

エンコード

./EncodeZeroWidthSpace.sh '💩'
'​​‍‌‍‌​‍‍‍‍‌​​‍‍'

デコード

./DecodeZeroWidthSpace.sh 'T​​‍‌‍‌​‍‍‍‍‌​​‍‍his is a pen'
'💩'

Twitter用 Unicodeゼロ幅スペースぶっ込みツール に作り直した

前述のツールだとTwitterで使えないことがわかった

調査してTwitter用に良さそうな4種類のゼロ幅スペースを確認する

シェル芸bot氏のことも考慮して、割と真面目に作り直した

Instration

ファイルダウンロードして実行権限をつけるだけ

$ wget https://raintrees.net/attachments/download/486/zws
$ chmod u+x ./zws

動作環境

ただのシェルスクリプトなので、だいたいの環境(Linux,Mac,Unix)で動くのでは

以下で、動作確認しました。

  • CentOS Linux release 7.2.1511 x86_64

Usage

エンコード

実行すると '' が出力されるが間にゼロ幅スペースが詰まっている

./zws unko
'‌⁢‌‌​​‍‍‌‍⁢‍​​‍‍‌‍‍⁢​​‍‍‌‍⁢⁢​​‍‍'

パイプ経由でもできる

echo "unko"|./zws
'‌⁢‌‌​​‍‍‌‍⁢‍​​‍‍‌‍‍⁢​​‍‍‌‍⁢⁢​​‍‍'

ちなみにTwitterでは、ゼロ幅スペースはアスキー文字と同等に数えられるらしく、140文字ではなく280文字までいけた
エンコードサイズが280文字を超えるとWARNINGを出すようにしている(エンコード自体はする)

./zws aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
[WARN] This encoded size over 280 characters. You can not tweet. Now 285 characters.
'‌‍​‌‌‍​‌‌‍​‌‌‍​‌‌‍​‌‌‍​‌‌‍​‌‌‍​‌‌‍​‌‌‍​‌‌‍​‌‌‍​‌‌‍​‌‌‍​‌‌‍​‌‌‍​‌‌‍​‌‌‍​‌‌‍​‌‌‍​‌‌‍​‌‌‍​‌‌‍​‌‌‍​‌‌‍​‌‌‍​‌‌‍​‌‌‍​‌‌‍​‌‌‍​‌‌‍​‌‌‍​‌‌‍​‌‌‍​‌‌‍​‌‌‍​‌‌‍​‌‌‍​‌‌‍​‌‌‍​‌‌‍​‌‌‍​‌‌‍​‌‌‍​‌‌‍​‌‌‍​‌‌‍​‌‌‍​‌‌‍​‌‌‍​‌‌‍​‌‌‍​‌‌‍​‌‌‍​‌‌‍​‌‌‍​‌‌‍​‌‌‍​‌‌‍​‌‌‍​‌‌‍​‌‌‍​‌‌‍​‌‌‍​‌‌‍​‌‌‍​‌‌‍​‌‌‍​‌‌‍​‌​​‍‍'

シェル芸bot氏はゼロ幅スペースを普通にマルチバイト文字として数える(140文字制限)ので、bot氏に処理をお願いする時は140文字までの制限を意識する必要がございます

ゼロ幅スペースの文字数を数えるには wc -m コマンドで数えることができます

./zws 'I hava an apple'|wc -m
67

この短めの文で67文字も使うのでTwitterにはあまり長い文字列が仕込めません

デコード

base64コマンドっぽいインタフェースにした
ゼロ幅スペース以外の文字があっても、そこは無視してデコードする

./zws -d 'this is a pen‌⁢‌‌​​‍‍‌‍⁢‍​​‍‍‌‍‍⁢​​‍‍‌‍⁢⁢​​‍‍'
unko

もちろんパイプ経由でもいける

echo '‌⁢‌‌​​‍‍‌‍⁢‍​​‍‍‌‍‍⁢​​‍‍‌‍⁢⁢​​‍‍'|./zws -d
unko

使えるシュチュエーション

このシェル芸を実行したのは誰だ!

./zws -d 'echo unko⁢‍‌⁢‍‍‌⁢‍​​‌⁢‍​⁢‍​​‌‍‍‌⁢⁢‍​⁢‍​​‌‍‌‍‌​​‍‍'
私です

裏手順を隠しておく

./zws -d 'stop.sh #アプリを停止、yを入力‌⁢​​‌‍‍⁢‌‍‍‌‌‍⁢​‌‍⁢​​‍​​‌‍​‌‌⁢​​‌‍⁢​‌‍‍‌​​‍‍'
pkill apli

呪いを込めておく

./zws -d 'Start.sh #アプリ起動⁢‍‌‌‍⁢‍​‍⁢​​⁢‍​⁢‍​​‍‍​‍‍⁢‍​⁢‍​​‌‍‌⁢⁢⁢‍​⁢‍​​‌‍​‌​​​‍‍'
帰りたい

暗号的やり取り

実はTwitterはゼロ幅スペースが使えます

他のSNSでも使えそう(未確認)

./zws -d '草⁢‍‌⁢‍​‍‌‍⁢‍‌⁢‍‌‌‍‍​⁢‍⁢​‍⁢‍​⁢‍​​‌‍‍​​⁢‍​⁢‍​​‌‍‌⁢‍​​‍‍'
特売だぞ

難読化シェル芸

echoと見せかけたdateの実行

echo 'echo unko‌‍‌​‌‍​‌‌⁢‌​‌‍‌‌​​‍‍'|./zws -d|bash
2018716日 月曜日 10:26:37 JST


コメント

クリップボードから画像を追加 (サイズの上限: 100 MB)