Content Discovery Webアプリケーションに対する偵察行為

# はじめに
攻撃者[^1]は攻撃前の事前準備として、公開されている情報を基に偵察行為を行います。

本記事は攻撃者がどのようにして情報収集を行なっているかなど、Webアプリケーションに対する偵察を行う目的及び実行するための手段について記載しています。

攻撃者の偵察行為を知ることは、理にかなったセキュリティ対策の考え方を身につけることができます。

[^1]: アタッカー、クラッカー
## 目的と手段
攻撃者が偵察行為として情報収集を行う目的は、収集した情報を基にシステムの脆弱性を特定し、攻撃方法を確立するためです。

偵察行為はサイバーセキュリティフレームワークでも定義されています。
[キルチェーン](https://ja.wikipedia.org/wiki/%E3%82%AD%E3%83%AB%E3%83%81%E3%82%A7%E3%83%BC%E3%83%B3)や、**MITRE ATT&CKフレームワーク**の場合、[PRE Matrix（Enterprise）](https://attack.mitre.org/matrices/enterprise/pre/)に含まれます。MITRE ATT&CKフレームワークについては以前書いた[攻撃を基に防御を最大化する考え方　MITRE ATT＆CKについて理解する](https://qiita.com/Brutus/items/684c954b447b8a4d9d73)をご参照ください。

従って攻撃者はターゲットとするシステムに対して、入念な情報収集を行います。
また偵察行為は[パッシブ](https://e-words.jp/w/%E3%83%91%E3%83%83%E3%82%B7%E3%83%96.html)な偵察と、[アクティブ](https://e-words.jp/w/%E3%82%A2%E3%82%AF%E3%83%86%E3%82%A3%E3%83%96.html)な偵察が存在します。

パッシブな偵察はターゲットに接触することなく、ニュース記事、求人情報、ドメイン等から情報収集する行為です。また、Twitter、Facebook、LinkedInなどSNSからも収集します。

逆にアクティブな偵察は公開されている企業のホームページ及び、サービスのコンテンツに対して、様々なツールなどを駆使して情報収集を行います。そのため、システムのアクセスログなどに証跡が残ります。

:::note
また[OSINT](https://ja.wikipedia.org/wiki/%E3%82%AA%E3%83%BC%E3%83%97%E3%83%B3%E3%83%BB%E3%82%BD%E3%83%BC%E3%82%B9%E3%83%BB%E3%82%A4%E3%83%B3%E3%83%86%E3%83%AA%E3%82%B8%E3%82%A7%E3%83%B3%E3%82%B9)という分析手法もよく使われています。
オープンデータを活用した事例では、[ベリングキャット](https://ja.wikipedia.org/wiki/%E3%83%99%E3%83%AA%E3%83%B3%E3%82%B0%E3%82%AD%E3%83%A3%E3%83%83%E3%83%88)が有名です。
:::

## OSINT
OSINTはインターネット上で公開されている情報に対する調査になるため、再現性の高い調査方法です。

なお、公開情報の性質として意図的に公開されている情報もあれば、まとめサイトやWikipediaなど意図せず第三者的に公開されている情報もあります。そのため、削除されずに残っている情報も存在し続けるという性質を持ちます。

### DNS
jpドメインの場合、[WHOIS](https://whois.jprs.jp/)からドメインを所有している組織の担当者やメールアドレスなど、攻撃の種となる多くの情報を入手することができます。また、whois以外でもドメインからIPアドレスをはじめ、色々な情報を検出するサービスがインターネット上に存在しています。

[DNSDumpster](https://dnsdumpster.com/)は公開されていないサブドメインを検出し、収集したDNS情報を表とグラフでグラフィカルに可視化します。

:::note warn
例えば、管理画面のURLなど意図的に公開していないドメイン情報は攻撃者にヒントを与えます。
:::

### GitHub
言わずもがなですがGitHubにSSH秘密鍵やAWSのアクセスキーなどクレデンシャル情報はアップロードしてはいけません。ヒューマンエラーが起こる前提で、クレデンシャル情報の取扱いに対するルールや、ガードレール的な仕組みがあることが望ましいです。

:::note warn
`git log -p`を実行し、各コミットで反映された変更点を表示することができます。そのため、クレデンシャル情報を削除しても、攻撃者は複製したリポジトリのログから情報を取得することができます。
:::

### S3
AWSのS3を使用している環境にて、S3のバケットポリシーの設定がパブリックアクセスできる設定の場合、バケット名とファイル名を知ることができれば誰でもアクセスできます。

そのため、意図的にパブリックアクセスを許可してない場合、システム管理者はセキュリティ事故に繋がるリスクが生じやすいことを認識しておくことが重要です。

S3に対するアクセス方式は以下の2種類があります。

- Path-Style Requests
`https://s3.amazonaws.com/<バケット名>/<ファイル名>`
`https://s3-ap-northeast-1.amazonaws.com/<バケット名>/<ファイル名>`

- Virtual Hosted-Style Requests
`https://<バケット名>.s3.amazonaws.com/<ファイル名>`
`https://<バケット名>.s3-ap-northeast-1.amazonaws.com/<ファイル名>`

参考：[Virtual hosting of buckets](https://docs.aws.amazon.com/AmazonS3/latest/userguide/VirtualHosting.html)

:::note alert
S3のバケット及び、オブジェクトにアクセスできるということは、S3に対するリクエストのAPIが実行されているということです。従ってS3の料金の仕組みについて認識しておくことは重要です。例えば、AWS CloudTrailを使用し、データイベントを取得している環境に対して、異常なS3に対するアクセスが行われた場合、CloudTrailのコストが増加する要因になります。
:::

企業の対策として大規模な組織でマルチアカウントを運用しているケースの場合、管理が煩雑になりやすくなります。

そのような状況では[AWS Control Tower](https://aws.amazon.com/jp/controltower/)や、[Amazon GuardDuty](https://aws.amazon.com/jp/guardduty/)を使用して、S3のパブリックアクセスなどの驚異を検出することがきるため、重宝するでしょう。

ただ、上記のようなマネージドサービスはコストがかかるため、スタートアップなどでコストを抑えたい場合は、例として[AWS CloudTrail](https://aws.amazon.com/jp/cloudtrail/)のイベントログや、[Amazon EventBridge](https://aws.amazon.com/jp/eventbridge/)を組み合わせることでイベントを検知して通知するなど、工夫次第で安上がりにコストを抑えることもできます。

## 偵察行為の勘所
Webアプリケーションを偵察する際の勘所について以下に記載しています。

### Google Chrome デベロッパー ツール
Webサイトから情報収集するためにブラウザは誰でも利用可能なインターフェースです。
Google Chromeの場合、デベロッパー ツールを起動して調査を行います。

ターゲットに関する基本的な情報はNetworkタブのResponse headerから、ミドルウェアなど多くの情報が得られます。また、Sourcesタブではブレークポイントを設定してJavaScriptのコードをデバッグすることができます。

多くの場合、JavaScriptファイルを表示すると、1行に表示されます。これは、最小化されているためです。つまり、ファイルを小さくするためにすべての書式設定（タブ、スペース、改行）が削除されています。よって、難読化されているため、簡単に閲覧することはできません。

:::note warn
難読化を解除するためには、2つの中括弧{}であるPrettyPrintオプションを使用して、スクリプトを整形して表示することができます。
:::

![スクリーンショット 2022-04-10 21.07.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/30cbdee3-8d5a-56e1-0faf-fb247b159945.png)

Googleを例に上記、赤枠の`{}`をクリックすると、難読化されたスクリプトを整形して表示することができます。

![スクリーンショット 2022-04-10 21.07.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/a3a34167-55e8-5f5f-aac4-9e88d849fd90.png)

### robots.txt
robots.txtファイルは、検索エンジンのクローラに対して、どのURLにアクセスしてよいかを伝えるものです。また、Webサイトの特定のコンテンツに対するクロール禁止などを検索エンジンのクローラーに通知するドキュメントです。一般的には検索エンジンの結果に表示されないように、特定の領域を制限するために使用されます。

:::note warn
robots.txtファイルに記載しているページが、管理画面やWebサイトの顧客向けのファイルなどの領域であることを示す場合、robots.txtファイルは、攻撃者に有益な情報を提供します。
:::

参考：[robots.txt の概要](https://developers.google.com/search/docs/advanced/robots/intro?hl=ja)

### sitemap.xml
sitemap.xmlはrobots.txtとは対照的に、Webサイトの内容を検索エンジンのクローラーに提供するために使用されます。

:::note warn
SEO対策目的でサイトマップを作成することが多いですが、セキュリティの観点ではコンテンツからの情報から、まだ公開されていない情報について攻撃者にヒントを与える可能性があります。
:::

参考：[サイトマップを Google に送信する](https://developers.google.com/search/docs/advanced/sitemaps/build-sitemap?hl=ja#addsitemap)

### Favicon
フレームワークを使用してWebサイトを構築し、Faviconをデフォルトから変更しない場合、攻撃者に使用しているフレームワークのヒントを与える可能性があります。

:::note warn
フレームワークで使用しているFaviconのハッシュ値と、[OWASP favicon database](https://wiki.owasp.org/index.php/OWASP_favicon_database)に公開されているハッシュ値を突合することで、フレームワークやミドルウェアのバージョンを特定することができます。
:::

### User-Agentの偽装
スクレイピングなどのツールからHTTPリクエストを実行する場合、システムによっては403のステータスコードを返し、アクセスできない場合があります。

:::note warn
その場合、攻撃者は`User-Agent`を偽装してアクセスを試みます。`User-Agent`の偽装方法はツールなどによって異なりますが、多くは簡単にできます。
:::

### IPアドレスの秘匿
`User-Agent`同様、IPアドレスの偽装も簡単に行うことができます。
攻撃者はIPアドレスを偽装することで、調査を撹乱します。

:::note warn
例えば、[Tor Browse](https://www.torproject.org/)の本来の目的は、プライバシー保護を目的としていますが、攻撃者の思考は違います。
:::

## ツール
攻撃者がアクティブな偵察行為を行う場合、コンテンツスキャナーを使用してコンテンツを検出します。

コンテンツスキャナーはブルートフォースアタックのように、ワードリストを使用します。ワードリストは一般的に使用される単語の長いリストを含む単なるテキストファイルです。

例えば、パスワードワードリストには最も頻繁に使用されるパスワードが含まれますが、コンテンツを検索する場合は、最も一般的に使用されるディレクトリ名とファイル名を含むリストが必要になります。コンテンツスキャナーでよく使用される単語リストは2009年に発生した[RockYou](https://en.wikipedia.org/wiki/RockYou)のデータ侵害による発覚したパスワードのリストです。Kali Linuxではデフォルトで`/usr/share/wordlists/`に用意されています。

その他、GitHubの[SecLists](https://github.com/danielmiessler/SecLists)というリポジトリから、特定のアプリケーションおよびプラットフォーム用のワードリストを入手することができます。

**※本記事で記載していツールを個人の環境や自システム以外で実施する場合、[不正アクセス行為の禁止等に関する法律](https://elaws.e-gov.go.jp/document?lawid=411AC0000000128)に触れる可能性があるため、不正の目的での使用はしないでください。**

### dirb
**dirb**はWebコンテンツスキャナーです。 コマンドの引数にURLを指定して実行します。

辞書を基にHTTPリクエストを作成し、各リクエストのHTTPレスポンスコードを確認してコンテンツチェックを行います。デフォルトは`/usr/share/wordlists/dirb/common.txt`を使用しますが、任意の`wordlist_file`ファイルを指定することができます。

- 実行例        
`$ dirb http://<IPアドレス>`

```console
kali@kali:~$ dirb http://<IPアドレス>

-----------------
DIRB v2.22    
By The Dark Raver
-----------------

START_TIME: Sat Apr  9 09:10:09 2022
URL_BASE: http://<IPアドレス>/
WORDLIST_FILES: /usr/share/dirb/wordlists/common.txt

-----------------

GENERATED WORDS: 4612                                                          

---- Scanning URL: http://<IPアドレス>/ ----
+ http://<IPアドレス>/index.php (CODE:200|SIZE:6163)                                      
==> DIRECTORY: http://<IPアドレス>/javascript/                                            
+ http://<IPアドレス>/server-status (CODE:403|SIZE:277)                                   
                                                                                          
---- Entering directory: http://<IPアドレス>/javascript/ ----
                                                                                          
-----------------
END_TIME: Sat Apr  9 09:25:08 2022
DOWNLOADED: 9224 - FOUND: 2
```

- 参考：[Dirb](https://www.kali.org/tools/dirb/)

### gobuster
**gobuster**もDirb同様、ワードリストを使用してWebサイトに対してコンテンツスキャンを行います。

Go言語で書かれていて、[gobuster](https://github.com/OJ/gobuster)から取得できます。

実戦的な使い方として、`gobuster`を実行してディレクトリを検出後、検出したディレクトリを指定して更に掘り下げた探索をしたり、ファイル名が特定できている場合は`-x`のオプションを付与することで効率的に探索ができます。

- 実行例 
`$ gobuster dir --url http://<IPアドレス> --wordlist <wordlist_file>`

```console
kali@kali:~$ gobuster dir --url http://<IPアドレス> --wordlist /usr/share/wordlists/dirb/common.txt 
===============================================================
Gobuster v3.0.1
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@_FireFart_)
===============================================================
[+] Url:            http://<IPアドレス>
[+] Threads:        10
[+] Wordlist:       /usr/share/wordlists/dirb/common.txt
[+] Status codes:   200,204,301,302,307,401,403
[+] User Agent:     gobuster/3.0.1
[+] Timeout:        10s
===============================================================
2022/04/09 10:23:04 Starting gobuster
===============================================================
/.hta (Status: 403)
/.htpasswd (Status: 403)
/.htaccess (Status: 403)
/index.php (Status: 200)
/javascript (Status: 301)
/server-status (Status: 403)
===============================================================
2022/04/09 10:23:50 Finished
===============================================================
```

- 参考：[Gobuster](https://www.kali.org/tools/gobuster/)

### ffuf
**ffuf**はWebアプリケーションなどにリクエストするデータの入力を自動化することで、レスポンスの振る舞いからコンテンツを発見するなど、ファジングを行う目的で利用されます。

- 実行例
`$ ffuf -w /usr/share/wordlists/dirb/common.txt -u http://<IPアドレス>/FUZZ`

```console
kali@kali:~$ ffuf -w /usr/share/wordlists/dirb/common.txt -u http://<IPアドレス>/FUZZ

        /'___\  /'___\           /'___\       
       /\ \__/ /\ \__/  __  __  /\ \__/       
       \ \ ,__\\ \ ,__\/\ \/\ \ \ \ ,__\      
        \ \ \_/ \ \ \_/\ \ \_\ \ \ \ \_/      
         \ \_\   \ \_\  \ \____/  \ \_\       
          \/_/    \/_/   \/___/    \/_/       

       v1.2.0-git
________________________________________________

 :: Method           : GET
 :: URL              : http://<IPアドレス>/FUZZ
 :: Wordlist         : FUZZ: /usr/share/wordlists/dirb/common.txt
 :: Follow redirects : false
 :: Calibration      : false
 :: Timeout          : 10
 :: Threads          : 40
 :: Matcher          : Response status: 200,204,301,302,307,401,403
________________________________________________

.htaccess               [Status: 403, Size: 277, Words: 20, Lines: 10]
.htpasswd               [Status: 403, Size: 277, Words: 20, Lines: 10]
.hta                    [Status: 403, Size: 277, Words: 20, Lines: 10]
                        [Status: 200, Size: 6163, Words: 855, Lines: 375]
index.php               [Status: 200, Size: 6163, Words: 855, Lines: 375]
javascript              [Status: 301, Size: 317, Words: 20, Lines: 10]
server-status           [Status: 403, Size: 277, Words: 20, Lines: 10]
:: Progress: [4614/4614] :: Job [1/1] :: 415 req/sec :: Duration: [0:00:14] :: Errors: 0 ::
```

参考：[Ffuf](https://www.kali.org/tools/ffuf/)

### OWASP
上記のようなツールを踏まえて、セキュリティ対策を行うために有益となる脆弱性診断ツールのOWASP Zapを最後に紹介します。

[Open Web Application Security Project（OWASP）](https://owasp.org/)は、ソフトウェアのセキュリティを向上させるために活動する非営利団体です。

Webアプリケーションのセキュリティ分野を専門とし、ガイドラインや、脆弱性診断ツール等を作成しているオンラインコミュニティです。

[OWASP Top Ten](https://owasp.org/www-project-top-ten/)はWebアプリケーションのセキュリティに関する10の最も重要なセキュリティ上の懸念事項を概説したドキュメントです。


- Top 10 Web Application Security Risks（2021）

| Rank | Name | 
|:-----------:|:------------|
| 1          | [A01:2021-Broken Access Control](https://owasp.org/Top10/A01_2021-Broken_Access_Control/)        |
| 2          | [A02:2021-Cryptographic Failures](https://owasp.org/Top10/A02_2021-Cryptographic_Failures/)        |
| 3          | [A03:2021-Injection](https://owasp.org/Top10/A03_2021-Injection/)        |
| 4          | [A04:2021 – Insecure Design](https://owasp.org/Top10/A04_2021-Insecure_Design/)        |
| 5          | [A05:2021 – Security Misconfiguration](https://owasp.org/Top10/A05_2021-Security_Misconfiguration/)        |
| 6          | [A06:2021 – Vulnerable and Outdated Components](https://owasp.org/Top10/A06_2021-Vulnerable_and_Outdated_Components/)        |
| 7          | [A07:2021 – Identification and Authentication Failures](https://owasp.org/Top10/A07_2021-Identification_and_Authentication_Failures/)        |
| 8          | [A08:2021 – Software and Data Integrity Failures](https://owasp.org/Top10/A08_2021-Software_and_Data_Integrity_Failures/)        |
| 9          | [A09:2021 – Security Logging and Monitoring Failures](https://owasp.org/Top10/A09_2021-Security_Logging_and_Monitoring_Failures/)        |
| 10          | [A10:2021 – Server-Side Request Forgery (SSRF)](https://owasp.org/Top10/A10_2021-Server-Side_Request_Forgery_%28SSRF%29/)        |

**OWASP Zap**は、BurpSuiteによく似たセキュリティテストフレームワークです。これは、非常に堅牢な列挙ツールとして機能します。Webアプリケーションのテストに使用されます。また、無料で利用できます。

![スクリーンショット 2022-04-14 0.02.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/f3d79cb2-0f47-da24-ce11-f25d39faf331.png)

公式ウェブサイトの[Download ZAP](https://www.zaproxy.org/download/)からインストーラーをダウンロードできます。Kali Linuxでは最初からインストールされています。

また、色々な拡張機能が公開されています。

- [zap-extensions](https://github.com/zaproxy/zap-extensions)
- [HUNT](https://github.com/bugcrowd/HUNT)

その他、[OWASP Juice Shop](https://owasp.org/www-project-juice-shop/)ではセキュリティトレーニングを行うことができます。

# おわりに
昨今の情勢や、IOT機器等インターネットに接続するデバイスの増加を背景に、サイバー攻撃はこれからも増加していきます。

サイバー攻撃を防ぐことは完全にできないため、攻撃者がどの様な手段を講じてくるかその思考を理解し、攻撃を基に防御を最大化する考え方が重要だと考えています。

また、クラウドを安全に利用するためには原理原則を踏まえた、クラウドの仕様に対する理解が重要です。