TryHackMe(THM):OWASP Juice Shop

目次

この記事は、DeepL翻訳を利用して和訳しています。

www.deepl.com

 

このサイトに書かれている攻撃手法は「自分に権利のあるサイト」以外では使用しないでください」

 

Task 1 Open for business!

    この部屋では、OWASPが発表したWebアプリケーションの脆弱性TOP10を紹介します。これらの脆弱性は、あらゆる種類のウェブ・アプリケーションのあらゆるタイプのものに見られます。しかし、今日は OWASP が作成した「Juice Shop」を見てみましょう。
 

 

f:id:akebono-haze:20211103114441p:plain

 
     Burp Suiteを使用しますので、まだ設定されていない方は、ここに「Burp Suite」ルームへのリンクがあります。
    
    「Burp Suite」ルームはサブスクライバー専用のルームで、アクセスするためにはTryHackMeのサブスクリプションが必要になります】。
    
    さらに、「Web Fundamentals」の部屋をチェックすることを強くお勧めします。
    
       [Web Fundamentals」の部屋はフリールームで、この部屋のように誰でも完成させることができます】。
    
    Juice Shopは大規模なアプリケーションなので、トップ10からすべてのトピックを網羅することはありません。
    
    ただし、以下の項目については、この部屋の進行に合わせて目を通しておくことをお勧めします。
    
 

<-------------------------------------------------> 
    Injection
    Broken Authentication
    Sensitive Data Exposure    
    Broken Access Control
    Cross-Site Scripting XSS
    <------------------------------------------------->

    [タスク3」以降は、タスク完了時に表示されるフラグが必要となります。
    

f:id:akebono-haze:20211103115849p:plain


   

Troubleshooting


    現在使用しているブラウザのプロキシ設定で、一時的にburpを無効にする。ページを更新すると、フラグが表示されます。
    
    これはアプリケーションの問題ではなく、burpがフラグを表示しないようにするための問題です。
    
    XSSタスクを実行しても動作しない場合は、以下の点にご注意ください。クッキーやサイトデータを消去してください。
    
    タスクが完了したことを確認したにもかかわらず、まだ動作しない場合。[タスク8]にアクセスすると、タスクの完了を確認することができます。
    
    クレジットはOWASPとBjorn Kimminichに帰属します。
    
    Answer the questions below

Deploy the VM attached to this task to get started! You can access this machine by using your browser-based machine, or if you're connected through OpenVPN.
 

    No answer needed


 Once the machine has loaded, access it by copying and pasting its IP into your browser; if you're using the browser-based machine, paste the machines IP into a browser on that machine.

    No answer needed

 Task 2  Let's go on an adventure!

f:id:akebono-haze:20211103144801p:plain

  

 実際のハッキングの部分に入る前に、周りを見てみるのもいいでしょう。Burpでインターセプトモードをオフにしてから、サイトを見て回ります。これにより、Burpはサーバーからのさまざまなリクエストを記録し、後で役立つ可能性があります。
    
    これはアプリケーションの中を歩くことであり、偵察の意味もあります。

    Answer the questions below

Question #1: What's the Administrator's email address?

f:id:akebono-haze:20211103144851p:plain

レビューには各ユーザーのメールアドレスが表示されています。Apple Juiceの製品をクリックすると、管理者のメールが表示されます。

f:id:akebono-haze:20211103144922p:plain

Question #2: What parameter is used for searching?

f:id:akebono-haze:20211103145156p:plain

アプリケーションの右上にある虫眼鏡をクリックすると、検索バーが表示されます。

f:id:akebono-haze:20211103145212p:plain

テキストを入力してEnterキーを押すと、入力されたばかりのテキストが検索されます。

ここで、先ほど入力したテキストで更新されるURLに注目してください。

これで、/#/search? の後に検索パラメータが表示され、文字q

f:id:akebono-haze:20211103145642p:plain

Question #3: What show does Jim reference in his review?

 ジムはグリーンスムージーという製品のレビューをしました。リプリケーターについて言及しているのがわかります。

f:id:akebono-haze:20211103145819p:plain

replicator」でググると、「スタートレック」というテレビ番組で使われていたことがわかります。

f:id:akebono-haze:20211103145928p:plain

Task 3  Inject the juice

f:id:akebono-haze:20211103151434p:plain

この課題では、インジェクション脆弱性に焦点を当てます。インジェクション脆弱性は、ダウンタイムやデータの損失を引き起こす可能性があるため、企業にとって非常に危険です。ウェブ・アプリケーション内のインジェクション・ポイントを特定することは、たいていの場合、エラーを返すので非常に簡単です。インジェクション攻撃には多くの種類があり、そのうちのいくつかを紹介します。
    

SQL Injection SQLインジェクションとは、攻撃者が悪意のある、あるいは不正なクエリを入力して、データベースからデータを取得したり改ざんしたりすることです。また、場合によってはアカウントにログインすることもあります。
Command Injection コマンドインジェクションとは、ウェブアプリケーションが入力されたデータやユーザーが操作したデータをシステムコマンドとして実行することです。攻撃者は、このデータを改ざんして、自分のシステムコマンドを実行することができます。これは、誤って設定されたpingテストを実行するアプリケーションに見られます。
Email Injection メールインジェクションとは、悪意のあるユーザーがメールサーバーの事前承認なしにメールメッセージを送信できるセキュリティ脆弱性です。これらは、攻撃者がフィールドに余分なデータを追加し、それがサーバーによって正しく解釈されない場合に発生します。

  
しかし、今回は、SQLインジェクションを使用することにします。
詳細はこちら Injection
    
Answer the questions below

Question #1: Log into the administrator account!

ログインページが表示されたら、メールとパスワードの欄にデータを入力します。
メールとパスワードの欄共にに「a」と入力します。
    
送信をクリックする前に、Interceptモードがオンになっていることを確認してください。

f:id:akebono-haze:20211103152042p:plain

これで、サーバーに送信されたデータを確認することができます。
[Proxy]-[Interception]の画面に切り替えて[Forward]ボダンを何度か押下します。

f:id:akebono-haze:20211103152234p:plain

ここで、「email:」の横にある「a」を「 ' or 1=1--」に変更し、[Intercept is on]ボタンを押下してサーバーに転送します。

f:id:akebono-haze:20211103152722p:plain

f:id:akebono-haze:20211103152325p:plain

なぜこのような仕組みになっているのでしょうか?

  1. 文字「'」は、SQLクエリのブラケットを閉じます。
  2. SQL文中の「OR」は、どちらか一方が真であれば真を返す。1=1は常に真なので、この文全体が真となります。したがって、このステートメントは、電子メールが有効であることをサーバーに伝え、私たちをユーザーID 0(たまたま管理者アカウントである)にログインさせます。
  3. --文字は、SQLでデータをコメントアウトするために使用されます。コメントとして解釈されるため、ログイン時の制限は機能しなくなります。これは、pythonjavascriptでそれぞれ#や//のコメントがあるようなものです。

 

ブラウザでWeb画面を見ると答えが表示されます。

f:id:akebono-haze:20211103153548p:plain

Question #2: Log into the Bender account!

質問1で行ったことと同様に、今度はBenderのアカウントにログインしてみましょう。再度、ログインリクエストをキャプチャしますが、今回はmail欄に「bender@juice-sh.op'--」と記入します。

f:id:akebono-haze:20211103153716p:plain

さあ、それをサーバーに転送してください

 

    ここで、「email:」の横にある「a」を「bender@juice-sh.op'--」に変更し、[Intercept is on]ボタンを押下してサーバーに転送します。

f:id:akebono-haze:20211103153746p:plain

f:id:akebono-haze:20211103154023p:plain

しかし、なぜ1=1にしないのか?

メールアドレスは有効なので(trueを返します)、強制的にtrueにする必要はありません。したがって、'--'を使ってログインシステムを回避することができます。

なお、1=1は、メールアドレスやユーザ名がわからない場合や無効な場合に使用できます。

Task 4  Who broke my lock?!

f:id:akebono-haze:20211103211800p:plain

このタスクでは、さまざまな欠陥を利用した認証の悪用について見ていきます。認証の欠陥とは、操作に対して脆弱なメカニズムを指します。これらのメカニズムは、以下の通りです。
    
 高い権限を持つアカウントでの脆弱なパスワード
パスワードを忘れた時のページ
詳細はこちらをご覧ください。Broken Authentication
 

Answer the questions below

Question #1: Bruteforce the Administrator account's password!

SQLインジェクションを使ってAdministratorアカウントにログインしましたが、まだパスワードがわかりません。ブルートフォース攻撃を試してみましょう。もう一度ログインリクエストをキャプチャしますが、プロキシ経由ではなく、Intruderに送信してみましょう。
    
BurpSuiteのログ(/rest/user/login行)画面上で右クリックし、「Send To Intruder」を選択します。

f:id:akebono-haze:20211103212149p:plain

メニューバーにある「Intruder」がオレンジ色の変化するので、クリックします。

f:id:akebono-haze:20211103212434p:plain

emailには「admin@juice-sh.op」を入力し、Password欄は入力されている値を削除後、画面右にある[Add$]ボダンを2回押下します。

f:id:akebono-haze:20211103212548p:plain

値をセット後、[Payloads]タブに移動します。
    
「Payload Option[Simple List]」にある[load]ボタンを押下します。
/usr/share/seclists/Passwords/Common-Credentials/best1050.txtからリストを読み込むことができます。

f:id:akebono-haze:20211103212947p:plain

 [Start attack]ボタンを押下します。

確認のメッセージボックスが表示されたら[OK]ボタンを押下します。

f:id:akebono-haze:20211103213125p:plain

ファイルがBurpに読み込まれたら、攻撃を開始します。リクエストをステータスでフィルタリングしたいと思います。

失敗したリクエストは、401 Unauthorizedを受け取ります。f:id:akebono-haze:20211103213208p:plain
一方、リクエストが成功すると、200 OKが返されます。f:id:akebono-haze:20211103213300p:plain

結果を見ると117番目で1個だけ200が返ってきてるので、パスワードがわかります。

f:id:akebono-haze:20211103213359p:plain

完了したら、そのパスワードでアカウントにログインします。

Question #2: Reset Jim's password!

信じられないかもしれませんが、パスワードリセットの仕組みも悪用される可能性があります パスワードを忘れた」ページのメール欄に入力すると、ジムのセキュリティ質問は「あなたの長男のミドルネーム」に設定されます。タスク2では、ジムがスタートレックに関係しているかもしれないことがわかりました。「Jim Star Trek」でググると、Star TrekのJame T. Kirkのwikiページが出てきます。

f:id:akebono-haze:20211103213625p:plain

email欄に「jim@juice-sh.op」と入力後、[tab]キーを押下すると、秘密の質問「Your eldest siblings middle name?」が表示されます。
Googleで「Jim Star Trek」でググると、彼の家族構成がわかります。

f:id:akebono-haze:20211103213731p:plain

Wikiページを見ると、彼には兄がいることがわかります。
兄のミドルネームはサミュエルのようです。
これを「パスワードを忘れた方」のページに入力すると、パスワードの変更が成功します。
 「New Password」と「Repeat New Password」の2か所に任意の同じ文字列を入力することでパスワードを変更することができました。

f:id:akebono-haze:20211103213845p:plain

f:id:akebono-haze:20211103214022p:plain

Task 5  AH! Don't look!

f:id:akebono-haze:20211103214139p:plain

Webアプリケーションでは、センシティブなデータを安全かつ確実に保存・送信する必要があります。しかし、場合によっては、開発者がセンシティブなデータを正しく保護しておらず、脆弱な状態になっていることがあります。
    
多くの場合、データ保護がウェブアプリケーション全体に一貫して適用されておらず、特定のページが一般にアクセス可能になっています。また、開発者が知らないうちに情報が公開され、Webアプリケーションが攻撃を受けやすい状態になっていることもあります。

詳細はこちら Sensitive Data Exposure

Answer the questions below

Question #1: Access the Confidential Document!

f:id:akebono-haze:20211103214811p:plain

会社概要のページに移動し、「利用規約を確認する」にカーソルを合わせます。
 

f:id:akebono-haze:20211103214901p:plain

 

http://<IPアドレス>/ftp/legal.md にリンクしていることがわかります。その/ftp/ディレクトリに移動すると、そのディレクトリが公開されていることがわかります!

 


f:id:akebono-haze:20211103215015p:plain

f:id:akebono-haze:20211103215114p:plain

acquisitions.mdをダウンロードして保存します。ここには他にも興味のあるファイルがあるようです。
/>ダウンロードした後、ホーム画面に移動してフラッグを受け取ってください。

f:id:akebono-haze:20211103215237p:plain


Question #2: Log into MC SafeSearch's account!

youtu.be

ビデオを見て、曲の中で目立つ部分があります。
彼は、パスワードは「Mr Noodles」だが、いくつかの「vowels into zeros」、つまり「o」を「0」に置き換えていると指摘する。
mc.safesearch@juice-sh.op アカウントのパスワードが "Mr.N00dles "であることがわかりました。

f:id:akebono-haze:20211103215558p:plain

Question #3: Download the Backup file!

ここで、http://<IPアドレス>/ftp/ フォルダに戻って、package.json.bak をダウンロードしようとします。しかし、.mdと.pdfのファイルしかダウンロードできないという403が表示されているようです。

f:id:akebono-haze:20211103215818p:plain

これを回避するために、「Poison Null Byte」と呼ばれる文字バイパスを使用します。Poison Null Byteは次のようなものです。%00.

なお、urlを使ってダウンロードできるので、これをurlエンコードしておきます。
    
    The Poison Null Byte will now look like this: %2500. Adding this and then a .md to the end will bypass the 403 error!
Poison Null Byteは以下のようになります。%2500. これを追加し、最後に.mdを追加することで、403エラーを回避することができます。

f:id:akebono-haze:20211103220119p:plain

「http://<IPアドレス>/ftp/package.json.bak%2500.md」をURLに入力するとファイルがダウンロードできます。

なぜこのような仕組みになっているのでしょうか?
Poison Null Byteとは、実際にはNULLターミネーターのことです。文字列の特定のバイトにNULL文字を置くことで、文字列はその時点で終了するようサーバーに伝え、残りの文字列をNULL化します。
ファイルをダウンロード後、TOPページに戻るとフラグが表示されています。

f:id:akebono-haze:20211103220233p:plain

Task 6  Who's flying this thing?

f:id:akebono-haze:20211103220319p:plain

最近のシステムでは、複数のユーザーが異なるページにアクセスできるようになっています。管理者は、ウェブサイトのさまざまな要素を編集、追加、削除するために、管理ページを使用するのが一般的です。WeeblyやWixなどのプログラムでウェブサイトを構築する際に使用されることがあります。 
    
    When Broken Access Control exploits or bugs are found, it will be categorised into one of two types:
    Broken Access Controlのエクスプロイトやバグが発見された場合、2つのタイプのいずれかに分類されます。 

Horizontal Privilege Escalation あるユーザーが、同じレベルの権限を持つ他のユーザーのアクションを実行したり、データにアクセスできる場合に発生します。
Vertical Privilege Escalation あるユーザーが、より高いレベルの権限を持つ別のユーザーのアクションを実行したり、データにアクセスしたりできる場合に発生します。。

f:id:akebono-haze:20211103220846p:plain

Credits: Packetlabs.net
More information: Broken Access Control

Answer the questions below

Question #1: Access the administration page!

まず、Firefoxでデバッガを開きます。
 (またはChromeのSources)
そのためには、「Web Developers」メニューから「Web Developers」を選択します。

f:id:akebono-haze:20211103222904p:plain   f:id:akebono-haze:20211103222918p:plain

次に、ページを更新して、main-es2015.jsのjavascriptファイルを探します。
その後、http://<IPアドレス>/main-es2015.js のそのページに移動します。

f:id:akebono-haze:20211103223812p:plain

これを私たちが読める形式にするには、下部の{ }ボタンをクリックします。f:id:akebono-haze:20211103223849p:plain

今度は "admin "という言葉で検索してみてください。

admin "を含むいくつかの異なる単語が出てきますが、私たちが探しているものは "path: administration "です。
 

f:id:akebono-haze:20211103224402p:plain

これは「/#/administration」というページを示唆しており、数行下のabout pathで見ることができますが、ログインしていない状態でそこに行ってもうまくいきません。
これは管理者用のページなので、閲覧するためには管理者アカウントでなければならないのは当然です。

ユーザーのアクセスを阻止するには、ユーザーが使用する必要のあるアプリケーションの部分のみをロードするのが良い方法です。これにより、管理ページのような機密情報の漏洩や閲覧を防ぐことができます。
TOP画面からログイン画面を表示させてユーザ「admin@juice-sh.op」でログインします。
その後「http://<IPアドレス>/#/administration」にアクセスするとフラグが表示されます。

f:id:akebono-haze:20211103224612p:plain

Question #2: View another user's shopping basket!

管理者アカウントにログインし、「Your Basket」をクリックします。リクエストをキャプチャできるように、Burpが起動していることを確認してください
表示されるまで各リクエストを転送します。GET /rest/basket/1 HTTP/1.1

f:id:akebono-haze:20211103224755p:plain

今度は、/basket/の後の数字1を2に変えてみます。

f:id:akebono-haze:20211103224841p:plain

変更後、[Intercept on]を押下するとユーザーID 2のバスケットが表示されます。フラグを同時に表示されます。

f:id:akebono-haze:20211103225051p:plain

これで、ユーザーID 2のバスケットが表示されます。他のユーザーIDでも、バスケットがあれば同様のことができます。

f:id:akebono-haze:20211103225223p:plain

Question #3: Remove all 5-star reviews!

http://<IPアドレス>/#/administration のページに再度アクセスします。
表示された画面上で星5つのレビューの横にあるゴミ箱のようなアイコンをクリックするとフラグが表示されます。
 

f:id:akebono-haze:20211103225602p:plain

f:id:akebono-haze:20211103225720p:plain

Task 7  Where did that come from?

f:id:akebono-haze:20211103225825p:plain

XSSクロスサイトスクリプティング)とは、攻撃者がウェブアプリケーション内でjavascriptを実行できてしまう脆弱性のことです。これらは、Web アプリケーションで最も多く発見されるバグの 1 つです。ウェブアプリケーションごとにクエリの解析方法が異なるため、その複雑さは簡単なものから非常に難しいものまで様々です。
XSS攻撃には大きく分けて3つの種類があります。

DOM (Special) DOM XSSDocument Object Model-based Cross-site Scripting)は、HTML環境を利用して悪意のあるjavascriptを実行するものです。このタイプの攻撃は、一般的に<script></script>というHTMLタグを使用します。
Persistent (Server-side) 永続的な XSS は、それを含むページがサーバーに読み込まれたときに実行される javascript です。これらは、ユーザーデータがページにアップロードされる際に、サーバーがユーザーデータをサニタイズしない場合に発生します。これらは、ブログ記事によく見られます。。
Reflected (Client-side) 反射型XSSとは、ウェブアプリケーションのクライアント側で実行されるjavascriptのことです。これらは、サーバーが検索データをサニタイズしていない場合に最もよく見られます。

 More information: Cross-Site Scripting XSS


Answer the questions below

 Question #1: Perform a DOM XSS!

f:id:akebono-haze:20211103230503p:plain

 今回は、iframe要素にjavascriptのalertタグを使用します。
 <iframe src="javascript:alert(`xss`)">

f:id:akebono-haze:20211103230614p:plain

これを検索バーに入力すると、アラートが表示されます。

f:id:akebono-haze:20211103230658p:plain

ここでは、多くのウェブアプリケーションで見られる一般的なHTML要素であるiframeを使用していますが、他にも同じ結果が得られるものがあります。
このタイプのXSSは、XFS(Cross-Frame Scripting)とも呼ばれ、Webアプリケーション内のXSSを検出する最も一般的な形式の1つです。
ユーザーがiframeや他のDOM要素を変更できるようなウェブサイトは、XSS脆弱性を持つ可能性が高いです。

 

なぜこのような仕組みになっているのでしょうか?
検索バーは、サーバーにリクエストを送信し、関連情報を返信するのが一般的ですが、ここに欠陥があります。正しいインプットサニテーションを行わないと、検索バーに対してXSS攻撃を行うことができてしまいます。
 f:id:akebono-haze:20211103231746p:plain

Question #2: Perform a persistent XSS!

 まず、adminアカウントにログインします。
 今回の攻撃では、「最終ログインIP」のページに移動してみます。
  最後のIPアドレスが0.0.0.0または10.x.x.xと表示されます。

f:id:akebono-haze:20211103232051p:plain

最後にログインしたIPが記録されるので、今度はログアウトして「新しい」IPが記録されるようにします。

f:id:akebono-haze:20211103232221p:plain

Burp [intercept on]になっていることを確認し、ログアウト要求をキャッチするようにします。
続いて「Headers」タブに移動し、新しいヘッダーを追加します。
True-Client-IP
<iframe src="javascript:alert(`xss`)">

f:id:akebono-haze:20211103232354p:plain

設問分の画像は上図が表示されていますが、自分の環境は下図のように設定します。

f:id:akebono-haze:20211103232513p:plain

入力後[Add]ボタンを押下します。

そして、そのリクエストをサーバーに転送します    

 管理者アカウントに戻ってサインインし、「Last Login IP」ページに再度アクセスすると、XSSアラートが表示されます。

f:id:akebono-haze:20211103232613p:plain

なぜこのヘッダーを送らなければならないのか?
True-Client-IPヘッダーは、X-Forwarded-Forヘッダーと似ており、どちらもサーバーやプロキシにクライアントのIPを伝えます。このヘッダーにはサニテーションがないため、XSS攻撃を行うことができます。
    
TOP画面に戻るとフラグが表示されます。

f:id:akebono-haze:20211103232848p:plain

Question #3: Perform a reflected XSS!

まず、反映されたXSSを実行するために、正しいページにいる必要があります。
管理者アカウントにログインし、「注文履歴」ページに移動します。

f:id:akebono-haze:20211103233019p:plain

そこに「トラック」のアイコンがありますので、それをクリックするとトラックの結果ページが表示されます。また、注文にはIDが付けられていることがわかります。

f:id:akebono-haze:20211103233119p:plain

f:id:akebono-haze:20211103233156p:plain

5267-c4a5d023fd3b621cの代わりに、iframeのXSSである<iframe src="javascript:alert(`xss`)">を使用します。

f:id:akebono-haze:20211103233221p:plain

URLを送信した後、ページを更新すると、XSS!というアラートが表示されます。

 

なぜこのような仕組みになっているのでしょうか?
サーバーには、各トラッキングIDのルックアップテーブルやデータベース(サーバーの種類による)が用意されています。id」パラメータがサーバーに送信される前にサニタイズされていないため、XSS攻撃を行うことができます。


「ページを更新」を忘れていて、何度もURL欄をリターンキーを押下してしまいました。(笑)
アラート画面とともにフラグが表示されます。

f:id:akebono-haze:20211103233319p:plain

Task 8  Exploration!

この部屋で紹介されていない難しい課題に挑戦したい場合は、Juice-shopの「/#/score-board/」セクションをチェックしてみてください。ここでは、自分がクリアした課題や、さまざまな難易度の課題を見ることができます。

   
Answer the questions below

Access the /#/score-board/ page

画面にフラグが表示されます。

f:id:akebono-haze:20211103233858p:plain

設問はこれで完了!

Score Bordの内容をすべて実行できるように日々精進しなければ...