SnykでHack the BoxなどのCTFチャレンジを攻略する
Mathias Conradt
2022年9月1日
0 分で読めますHack The Box(HTB)は、サイバーセキュリティのトレーニングをゲーム感覚で学べるプラットフォームです。ペネトレーションテスターを目指す人はもちろん、セキュリティチャンピオンを目指す開発者や、アプリケーションの安全性を高めるために攻撃者の考え方を理解したい人にも最適です。
トレーニングや教育におけるゲーミフィケーションの効果を、私は信じています。正直なところ、社内セキュリティ研修に参加したり、認定試験の勉強をしたりしても、半年後には学んだことをすっかり忘れてしまう、という経験は誰にでもあるのではないでしょうか。HTBは、実践的なキャプチャー・ザ・フラッグ(CTF)ゲームという別のアプローチを採用しています。プレイヤーは、通常LinuxまたはWindowsの仮想マシンであるマシンに侵入し、脆弱性を発見して悪用することで、2つのフラグを取得します。まず一般ユーザーのフラグを獲得し、次に権限昇格によってrootユーザーのフラグを取得します。フラグとは、マシン上にある特定のテキストファイルの内容です。
Hack The Boxでは、プラットフォームの中心となる「マシン」のほかに、「チャレンジ」と呼ばれる小規模なタスクにも取り組めます。チャレンジは通常、やや短時間で完了でき、取得するフラグも1つだけですが、多くの場合、ダウンロード可能なリソースファイル一式が用意されています。たとえば、Wiresharkで解析するpcapファイルや、対象アプリケーションのソースコード一式などです。ソースコードがあれば、アプリケーションの構造やコードを分析できます。まさにSnykが役立つ場面です。
Snykを使えば、脆弱性や侵入経路となり得る箇所をすばやく見つけられます。Snyk CLIでは、プロジェクトに対してSAST(静的アプリケーションセキュリティテスト)とSCA(ソフトウェア構成分析)を実行できます。また、package.jsonなどのアプリケーションマニフェストファイルをスキャンし、オープンソースライブラリに含まれる既知の脆弱性を検出します。PoCも提示してくれます。
BlinkerFluidsチャレンジの分析
BlinkerFluidsチャレンジは、HTBの魅力をよく示す好例です。比較的簡単で、入門にも適しているため、この記事ではデモとして取り上げます。

チャレンジを起動すると、ホストのIPアドレスとポート(この例では46.101.2.216:32221)が表示されます。ブラウザーで開くと、シンプルなインターフェースのウェブサイトが表示されます。

http://46.101.2.216:32221を開いて、このターゲットURLの先に何があるか見てみましょう。
アプリケーションは、請求書の一覧と、請求書をPDFとしてエクスポート、削除、新規作成する機能を備えた単一ページで構成されています。

PDFのエクスポートリンクにカーソルを合わせると、PDFは静的アセット用と思われるフォルダーから配信されていることがわかります。

請求書作成用のエディターは、マークアップ言語(Markdown)で入力した内容をPDFに変換するWYSIWYGエディターのようです。

実際のターゲットホストをさらに調べる前に、チャレンジで提供されているリソースをダウンロードしましょう。zipファイルをダウンロードして展開すると、Dockerイメージとしてパッケージ化されたNodeアプリケーションのソースコード一式が手に入ります。Dockerfileとpackage.jsonも含まれています。
ルートフォルダーにはflag.txtもあります。HTBのチャレンジでは、通常/flag.txtのパスにフラグが置かれています。ただし、このzipパッケージ内のファイルは単なるプレースホルダーで、探している実際のフラグではありません。HTBプラットフォームでは、独自のロジックでオンライン上のフラグを生成し、ローテーションしています。いずれにしても、これでBlinkerFluidsアプリの材料と仕組みがわかりました。
実際のアプリケーションは「challenge」サブフォルダーにあります。node_modulesには、直接依存および推移的依存となるNodeライブラリがいくつか設定されています。また、先ほど見たエクスポート済みPDFの配信元と思われるstaticフォルダーも確認できます。
Snykによる脆弱性スキャン
オンラインのインスタンスに侵入して/flag.txtを取得する方法を探しているため、コードを詳しく調べてロジックを理解できます。時間と紙幅の都合上、この記事では詳細には立ち入りません。
基本的には、独自に記述されたコードか、直接依存または間接依存(推移的依存)のいずれかに含まれる脆弱性を探します。
Snyk CLIを使えば、その両方を調べられます。Snykをまだインストールしていない場合は、次のコマンドを実行してください。
または、Snyk CLIのインストールページに記載されている、お好みの方法でインストールしてください。
まずchallengeサブフォルダー内で、独自コードに対するSASTテストを実行します。
すると、次の結果が表示されます。
脆弱性がいくつか見つかり、深刻度の高いものもありますが、今回の目的に利用できるものはありません。XSSはこの場合、あまり役に立ちません。それでは、SCAテストを続けましょう。
SCAテストでは、Snykがプロジェクトのマニフェストファイルを分析します(Node.jsの場合はpackage.jsonとpackage-lock.jsonです)。
package.jsonにある直接依存は5つだけですが、package-lock.jsonを見ると、推移的依存を含めると合計371個もあります。これだけの脆弱性を手作業で確認するのは大変です。次を実行してみましょう。
次の結果が得られます。

今度はよさそうです。サービス停止を引き起こしてもプラットフォームへのアクセスにはつながらないため、ReDoSの問題は無視できます。一方、md-to-pdfの重大なRemote Code Execution (RCE)の脆弱性は有望です。まさに求めていたものです。md-to-pdfは、請求書のMarkdownをPDFに変換するヘルパーライブラリだと考えられます。
ここでSnykの威力がよくわかります。プロジェクトの依存関係を数秒で分析して脆弱性を検出し、Snyk Vulnerability Databaseへのリンクも提示してくれます。さらに、エクスプロイトのPoCや元の問題報告へのリンクも確認できます。

この情報はエクスプロイトに役立ちますが、上のスクリーンショットにもあるように、Snykのレポートには問題の修正方法も提案されています。実際の対応につなげられる、実用的なアドバイスです。
ただし、ここでは攻撃者の立場にいるので、詳しい情報を得るために元のGitHub issueも確認してみましょう。
GitHub issueで指摘されている問題は、gray-matter(md-to-pdfがフロントマターの解析に使用)が、デフォルトでJSエンジンを公開していることです。つまり、与えられたMarkdownに対してevalを実行するため、Markdownの内容を制御できる人なら誰でも任意のJavaScriptを実行できます。
元のPoCに加えて、コメント欄には少し変更を加えたPoCもあります。

このPoCは、ディレクトリの一覧を取得して表示しようとするものです。目的は/flag.txtにあるフラグの内容を確認することなので、少し変更を加えてフラグファイルの内容を読み取ります。
このコードを請求書ジェネレーターに貼り付けて保存すると、探しているフラグが入ったPDFが生成されます。



このフラグを提出すれば、チャレンジクリアです。次のチャレンジに進みましょう :)
SnykでCTFの達人を目指そう
Hack The Boxのチャレンジは、脆弱性とその悪用方法を楽しく学べる方法です。今回のチャレンジでは、Snykがアプリケーションの依存関係をすばやく分析し、悪用方法に関する情報とともに重大なRCE脆弱性を提示してくれたため、攻略できました。また、アプリケーション開発者向けに、問題の修正方法も提示されました。
ぜひご予定ください。Snykは11月9日に「Fetch the Flag CTF」を開催します。16のチャレンジが待っています。ぜひ登録して、一緒に楽しみましょう。
CTFを始めよう
オンデマンドのバーチャル入門ワークショップで、CTFチャレンジの解き方を学びましょう。
著者について
Mathias Conradtは、ソフトウェアエンジニアリングとプリセールスの経験を持つ起業家・サイバーセキュリティの専門家です。Snyk Ambassadorであり、DevSecCon Germany Chapterのリードを務めています。また、CTFプレイヤーでもあります。詳しくはこちらの個人ウェブサイトをご覧ください。



