Slapdash Safeguards

にわか仕込みのセキュリティ

カスタムフォントとZIPファイルトリックを使用した「Gootloader」の展開

Gootloaderは2020年あたりから確認されているマルウェア

loaderと名にある通り、友達(マルウェア)を連れてくるマルウェア

最近はActive Directoryドメインコントローラ侵害やWindowsバックドアとなるマルウェアを連れてきて、ランサムウェア被害に繋がるケースもあるとのこと。

この「Gootloader」関連ファイルをダウンロードさせるために、Webページやzipファイルで使用されていた手法が気になった。

カスタムフォントを使用した難読化

ソースより、

(以下google翻訳)
興味深い点の一つは、Gootloaderがファイル名を難読化するためにカスタムWebフォントを使用していることです。そのため、ユーザーがファイル名をコピーしたりソースコードを調べたりすると、‛›μI€vSO₽*'Oaμ==€‚‚33O%33‚€×:O[TM€v3cwv,のような奇妙な文字が表示されます。しかし、被害者のブラウザでレンダリングされると、これらの文字は Florida_HOA_Committee_Meeting_Guide.pdfのような完全に判読可能なテキストに魔法のように変換されます。これは、GootloaderがページのJavaScriptコードにZ85エンコーディング(Base85の亜種)を使用して直接埋め込むカスタムWOFF2フォントファイルによって実現されています。Z85エンコーディングは、32KBのフォントを40KBに圧縮するBase85の亜種です。

OpenTypeの置換機能や文字マッピングテーブルを使用する代わりに、ローダーは各グリフが実際に表示するものを交換します。フォントのメタデータは完全に正当なものに見えます。文字「O」は「O」という名前のグリフに、「a」は「a」という名前のグリフに、といった具合です。しかし、これらのグリフを定義する実際のベクターパスは交換されています。ブラウザーがグリフ「O」のシェイプを要求すると、フォントは代わりに文字「F」を描画するベクター座標を提供します。同様に、「a」は「l」、「9」は「o」、「±」のような特殊なUnicode文字は「i」を描画します。 ソースコード内の意味不明な文字列「 Oa9Z±h•」は、画面上では「Florida」と表示されます。

この手法は静的解析手法を無効化します。「請求書」や「契約書」といったキーワードを文字列検索しても、ソースコードにこれらの単語が存在しないため、何も返されません。

つまり、カスタムフォント(WOFF2フォントファイル)を使用することで通常は意味が通じないような文字列を意味のある文字列に変換している。これは、高度なcssやjsでテキスト変換をしているわけでは無い。そのため、Webの通信監視、Webページのソースコードスキャンを行うようなセキュリティ製品に検知されない。

「 Oa9Z±h•」が「Florida」になるようなフォントなんて滅茶苦茶過ぎる。

特定のキーワード「請求書」や「契約書」だったり「緊急」や「危険」みたいなキーワード、もしくはマルウェアシグネチャが怪しいWebページの検知ルールにあっても、Webページに表示されるまで本当のデータが分からない。なので、バレにくいということ。

これってもしかして、フィッシングメールとかにも応用できるような手法なのだろうか。全く同じ手法でなくとも、カスタムフォントみたいなことでフィッシングメール検知ルール回避とかありそうな気がする。

展開ツールによって動作を変えるzipファイルトリック

先とは別ソースより、

(以下google翻訳)
ZIPファイルのトリックは進化しています。攻撃者は、 Windows以外のツールを混乱させる方法でZIPアーカイブを改変します。

・Windows エクスプローラーでは、アーカイブによって有効な .JS ファイル (目的のペイロード) が抽出されます。
・しかし、 VirusTotal、Python の zip ユーティリティ、7-Zipなどのツールで開くと、無害に見える .TXT ファイルとして解凍されます。

この単純な回避手法は、ペイロードの本質を自動分析から隠すことで、攻撃者に時間を稼ぎます。

Windowsエクスプローラアンチウイルス系の製品に入っている圧縮ファイルの解析方法の差異を悪用することで、ターゲットシステムにマルウェアを展開できるようにしている。

何か昔CTFの問題でやったような気がするなぁ。

つまり、Windowsエクスプローラはファイルの実体となるローカルファイルヘッダから読むが、それ以外はzipファイルに含まれるファイルのインデックスとなるセントラルディレクトリから解析することが多い。そのため、セントラルディレクトリから確認した場合にはセントラルディレクトリに無いファイルは解析されない。

wikipedia ZIPファイルフォーマット(https://ja.wikipedia.org/wiki/ZIP_(%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%83%E3%83%88))より。

セントラルディレクトリには、どのファイルが圧縮ファイル内のどこに配置されているかという情報があるが、zipファイルの形式的にはセントラルディレクトリに無いものも含められちゃうってこと。Windowsエクスプローラはファイルの実体が配置されているローカルファイルヘッダから読むので、含まれるファイル全てを展開する。しかしながら、セントラルディレクトリから読み始めるものは、セントラルディレクトリに登録の無いものは認識できず、ファイルスキャン等がスルーされると。

可能な限りエラーを避けるためにzipファイルの仕様に忠実に従って処理をするようにしたものの、それを完全に無視する機構がwindowsにはあったということか。全てのWindowsで未だにそうなのか詳細は分からないが、確かにありそう。

詳しくはWikizipファイル形式)を見るべし。