2019.04.09
難読化シェル芸の世界 Bashとすてきな難読化①
『難読化シェル芸の世界 Bashとすてきな難読化』。ディープでユーモアあふれる難読化シェル芸の世界に触れてみてください。
『難読化シェル芸の世界』PDF書籍をマイナビブックス・Manateeで販売中です。
書籍の内容を一部公開! ぜひニッチでディープな世界に触れてみてください。
まえがき 難読化シェル芸とは
ようこそ難読化シェル芸の世界へ!難読化シェル芸って何だ・・・? 何を言っているんだ・・・? と思う方もいるかもしれませんが、それは極めて正常な反応です。本書に書かれていることは、基本的にはbashの機能を極限まで使い切って、そして全力を持ってふざけた、無駄に洗練された無駄の無い無駄な技術になります。
難読化シェル芸というニッチな世界を解説するものです。
ああ待ってください。ちゃんと役立つ情報もありますよ!「 難読化シェル芸」という言葉に注目してみると「難読化」、「シェル」、「芸」という言葉でできていますね。
難読化とは何でしょうか?
人類の歴史を振り返ると伝達すべき情報を隠す目的で戦争に使われたり 1) 、推理小説や、ヴィオニッチ手稿 2) のように人々の興味を惹くように愉快犯的に作られたりしました。人類は情報を太古から暗号化したり難読化していったのです。
ぜひ、本書によって「コンピュータサイエンスを利用した難読化の世界」に浸っていただけたら幸いです。本書は、サイバーセキュリティ分野においては、そのままでは、ほぼ使われることはありませんが、近年悪用が目立っているJavaScriptやPowerShellの難読化と非常に近い世界にあります。
こういった先端分野での応用においてもヒントになることでしょう。
Unicodeを応用した難読化
(書籍5章より)Unicodeと呼ばれる文字コードの規格があります。Unicodeは「この文字は、この値ね」というような1文字を対応する値に割り付けるだけに留まらず、様々な機能(ルール)が存在します。本章は、この中のUnicode結合文字という機能を利用した難読化を行います。
Unicode結合文字難読化シェル芸
Unicode結合文字とは
Unicode結合文字とは、先行する文字と結合するための文字になります。他の文字と結合して1文字となる文字です。Unicode結合文字を以下のようなことができました。Unicode結合文字を使うと文字通り、"文字を結合"できます。文字塗りつぶし - そう簡単には読ませない
-あえて上のちっちゃいほうを実行
1文字圧縮 - 1文字に全てを込める芸
Unicode結合文字について
例:「ポ」が2種類あります(闇が深い) 例: Unicodeの音符は闇が深い 3)。複付点64分音符(アクセント)
64分音符(U+1D163 ) 、付点(U+1D16D ) 、 付点(U+1D16D ) 、 アクセント (U+1D17B) を結合して音符を表現しています。 しかも全部4バイト文字/サロゲート ペアです。Unicode結合文字の仕様
以下のようなUnicode結合文字の仕様は、時としてソフトウェア実装上の困難をもたらします。[闇その1 ] 存在しない文字も作れて闇が深い
[闇その2 ] 何個でも結合できて闇が深い
また、まれにセキュリティ上の脆弱性の原因になることもあります。この面倒くさい仕様のために
• 1文字で何バイトになるかわからん問題
• そもそも、どこまでが1文字がわからん問題(「か゚」は1文字? 2文字?)
• バックスペース押したときにどこまで消えてほしいの問題
•「 ポプテ」と「ポプテ」が違うのでプログラミングめんどい問題
が生じます。
パスワード設定や、パスワードを忘れた際に利用する秘密の合言葉等は特にトラブルになりやすいです。WindowsでうまくいくのにmacOSはダメとか、そういう問題も起こり得ます。
Unicode結合文字の種類
このUnicode結合文字はたくさんの種類があります。他の文字に結合できる小さいアルファベットや数字が存在します。Unicode結合文字まとめ
• Unicode結合文字というのがある• macOSではよく濁音・半濁音に使われる
• 1文字に何個でも結合できる
• ソフトウェア実装上、困難なことが沢山ある
それでは難読化手法を解説していきます。
文字塗りつぶし - そう簡単には読ませない
① 文字塗りつぶし
以下の文字がUnicode結合文字になっています。ロシア圏で使用されるキリル文字です。この文字は、本来は数字を表現(10万、100万)する際に用いるようです。読み方は著者は全然わかりません。 これを文字に何回か重ねるとこうなります。
文字塗りつぶし デコード方法
キリル文字を削除する(0xd288,0xd289を削除)- あえて上のちっちゃいほうを実行
これはダイアクリティカルマーク(発音区別符号)というのを利用しています。-デコード方法
1. 本体を削除 tr -d a-z2. 0xcdが邪魔なので削除 tr -d $'\xcd'
3. 0xa3-0xaf を aeioucdhmrtvx に置換
まとめると以下のようになります。
1文字圧縮 - 1文字に全てを込める芸
まとめると以下のようになります。Unicodeゼロ幅文字難読化シェル芸
動機
「ゼロ幅文字にエンコードした隠し情報で、文書をリークしたメンバーを特定」2)というニュースがありました。 事の顛末は以下のようになります。• 競技ビデオゲームのチームが、プライベートの掲示板を利用
• 外部の掲示板にコピペしているやつがいた
• 見た目がわからない文字を仕込んで犯人を特定
• ゼロ幅文字をログインユーザごとに変えて仕込んだ !
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種類を使う ⇒ 4進数で表現できるというのがポイントです。
以下のような対応関係を考えてみます。
ゼロ幅スペースにエンコードの手順は以下のようになります。
1. 文字を16進数に変換(xxd)
2. 16進数を4進数に変換(bc)
3. 0 1 2 3 をゼロ幅スペースに置換(sed)
エンコーダをシェルスクリプトで実装すると以下になります。 仕込んだゼロ幅スペースのデコードの手順は以下のとおりです。
1. ゼロ幅スペースを 0 1 2 3 に置換(sed)
2. 16進数に変換(bc)
3. バイナリに変換(xxd)
デコーダをシェルスクリプトで実装すると次のようになります。
※ echo '' の''にはゼロ幅スペースを入れます(ゼロ幅なので印刷物だとわかりませんね)
Twitter用 Unicodeゼロ幅スペースぶっ込みツール
ツールを作ってみました。Twitterで使えることを確認しています。ゼロ幅スペースについて特別な処理をしていなければ、他のSNSでも使えるでしょう。これで他人に気付かれずに情報のやりとりをできますよ!インストール
ファイルダウンロードして実行権限を付けるだけです。動作環境
ただのシェルスクリプトなので、大抵の環境(Linux,Mac,Unix)で動くのではと思います。以下で、動作確認しました。
• CentOS Linux release 7.2.1511 x86_64
使い方
・エンコード実行すると '' が出力されますが間にエンコードされたゼロ幅スペースが詰まっています。 パイプ経由でも動作します。 ちなみにTwitterでは、ゼロ幅スペースはアスキー文字と同等に数えられるらしく、140文字ではなく280文字まで大丈夫でした。エンコードサイズが280文字を超えるとWARNINGを出すようにしています(エンコード自体は実施)。 wcを使えば、ゼロ幅スペースの文字数を数えることができます。 この短めの文で67文字も使うのでTwitterにはあまり長い文字列が仕込めません。
・デコード
base64コマンドと同様のインタフェースにしています。 ゼロ幅スペース以外の文字があっても、そこは無視してデコードする仕様です。 もちろんパイプ経由でもいけます。使えるシチュエーション
どのような場面で使えるか考えてみました。・このシェル芸を実行したのは誰だ!
・裏手順を隠しておく
・呪いを込めておく
・暗号的やり取り
・難読化シェル芸(echoと見せかけたdateの実行)
入力しにくいUnicode文字の入力
Unicode結合文字、Unicodeゼロ幅文字をキーボードから入力するには困難が伴います。以下のようにコードポイントを指定して出力するか、 または必要の文字を選択して出力できるサイト code.cside.com5) を利用するのがよいでしょう。