Slide 1

Slide 1 text

雑な攻撃からサーバーを守る一工夫
 +おまけ
 2022-06-26
 JAWS-UG 福岡 #12:9度目もちょっと濃い目にAWSの話をしてみよう 
 #jawsugfuk #jawsug
 Hiroaki Ogasawara @xhiroga


Slide 2

Slide 2 text

目次
 ● はじめに
 ● 攻撃
 ● 防御
 ● まとめ
 ● ???
 ● 今度こそおわり
 ● 参考


Slide 3

Slide 3 text

免責
 ● 発表者はセキュリティの専門家ではありません。
 ○ 現在学習中の内容を発表しています。
 ○ 誤りが含まれる可能性があります。
 はじめに


Slide 4

Slide 4 text

自己紹介
 はじめに


Slide 5

Slide 5 text

使ってね!
 はじめに


Slide 6

Slide 6 text

No content

Slide 7

Slide 7 text

攻撃


Slide 8

Slide 8 text

No content

Slide 9

Slide 9 text

ごく普通のアーキテクチャです
 攻撃
 ALB ECS DB リスナーは HTTPSのみ 有効 React (SPA)

Slide 10

Slide 10 text

(数年前)CTO「WAF導入したい〜!」
 攻撃
 現 CTO WAF導入したい〜! 
 コストかかりません? 
 でも攻撃されてますよ 
 マジすか?


Slide 11

Slide 11 text

マジ。
 攻撃来てました。
 URL未公開なのに。
 (攻撃元IPアドレスも乗っ取り被害者の 可能性があるため隠してます) 
 攻撃
 全部ウチのサーバーに 
 存在しないパス


Slide 12

Slide 12 text

思ってたのと違った
 思ってた攻撃
 ● APIエンドポイントを調べた上での標的型攻撃 
 ● アプリケーションが用いるパスに対して、SQL インジェクションなどを試みる 
 実際の攻撃
 ● AWSが持っているIPアドレスを狙った無差別型 攻撃(たぶん)
 ● .envの誤コミットや.gitの誤デプロイなど、広くあ りそうな間違いを狙う
 ● Binanceなどの大手暗号資産取引所への攻撃 の余波らしいものもある
 攻撃


Slide 13

Slide 13 text

大手暗号資産取引所への攻撃の余波 
 GET /bapi/fiat/v1/public/fiatpayment/menu?currency=CNY Accept: application/json, text/plain, */* Host: www.binance.com User-Agent: BNC/2.37.0 (build 10; iOS 14.8.0) Alamofire/4.9.0 Mclient-X-Tag: pch5D9lsORjgObhyjdSK timeout: 3000 Connection: close
 実際の攻撃
 攻撃
 無差別攻撃
 GET /.env Host: ***.***.***.*** User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36 Accept: */* Accept-Encoding: gzip
 ※あくまで私の案件で観測された攻撃を分類しただけで、汎用性や網羅性は全く保証できません。 


Slide 14

Slide 14 text

影響
 ● 存在しないパスにアクセスされるので、4XXエラーが大量に出る
 ○ モニタリングの4XXが使い物にならない 
 ● 万が一存在する脆弱性を突かれたら不安
 攻撃


Slide 15

Slide 15 text

推測
 手法
 ● AWSの持っているIPアドレスの範囲を自動で 攻撃?
 ● 過去に攻撃対象だったIPアドレスを、私達が引 き当ててしまった?
 ● 世界中のIPv4の範囲を自動で攻撃? 
 ● DNSサーバーへのブルートフォース攻撃が成 功し、ドメインを取得した? 
 攻撃者がIPアドレスでアクセスしていると推測した場 合、TLS証明書とはドメインが違うのを無視しているこ とになる。まあ攻撃者は気にしないか... 
 目的
 ● 侵入可能なサーバーの探索? 
 ● セキュリティの勉強?
 攻撃


Slide 16

Slide 16 text

防御


Slide 17

Slide 17 text

Hostヘッダーで防ぐ
 攻撃
 無差別攻撃(再掲)
 GET /.env Host: ***.***.***.*** User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36 Accept: */* Accept-Encoding: gzip
 大手暗号資産取引所への攻撃の余波(再掲) 
 GET /bapi/fiat/v1/public/fiatpayment/menu?currency=CNY Accept: application/json, text/plain, */* Host: www.binance.com User-Agent: BNC/2.37.0 (build 10; iOS 14.8.0) Alamofire/4.9.0 Mclient-X-Tag: pch5D9lsORjgObhyjdSK timeout: 3000 Connection: close
 IPアドレス総当りで攻撃しているせいか *1、Host ヘッダーが的外れ

Slide 18

Slide 18 text

※あくまで私の案件で効果が高かっただけで、違う攻撃には効果が薄い可能性があります。 


Slide 19

Slide 19 text

6/22 12:16ごろ適用 → 観測範囲では攻撃を 100%ブロック ※6/22以降のAllowedはおそらく全て正常なリクエスト

Slide 20

Slide 20 text

それ以外の案
 ● ALBのHost-based Routingで防ぐ
 ○ 指定したホスト名以外は403を返す
 ● CDNで防ぐ
 ※私達がWAFを用いたのは、単にすでにWAFを使っていたから
 防御
 参考: ALBへのアクセスを特定のHostヘッダのみに限定する方法の一例 - Developers.io 


Slide 21

Slide 21 text

試したけど上手く行かなかった案
 防御
 マネジメントルール 有効だが取りこぼしも ある

Slide 22

Slide 22 text

まとめ


Slide 23

Slide 23 text

意外と攻撃を受けている
 ● 見直してみましょう。
 ● 繰り返しますが、発表者は専門家ではありません。
 ○ 学習中の内容や誤っている可能性のある内容を含 みます。
 ● 皆さんの事例もこの後教えてください!
 まとめ


Slide 24

Slide 24 text

ちょっと待った!


Slide 25

Slide 25 text

Hostヘッダーで防ぐ
 ちょっと待った!
 無差別攻撃(再掲)
 GET /.env Host: ***.***.***.*** User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36 Accept: */* Accept-Encoding: gzip
 大手暗号資産取引所への攻撃の余波(再掲) 
 GET /bapi/fiat/v1/public/fiatpayment/menu?currency=CNY Accept: application/json, text/plain, */* Host: www.binance.com User-Agent: BNC/2.37.0 (build 10; iOS 14.8.0) Alamofire/4.9.0 Mclient-X-Tag: pch5D9lsORjgObhyjdSK timeout: 3000 Connection: close
 IPアドレス総当りで攻撃しているせいか *1、Host ヘッダーが的外れ いやいや、ドメインってIPアドレスか ら逆引きできるのでは? 攻撃者、なぜやらない?

Slide 26

Slide 26 text

IPアドレスからドメイン名を引く方法(2案)
 1. PTRレコードを見る
 2. TLSでサーバー証明書を取得し、証明書内のドメインを読む
 2. を実験します💡
 ちょっと待った!


Slide 27

Slide 27 text

実験
 import ssl from os import environ import OpenSSL host_ip = “8.8.8.8” cert = ssl.get_server_certificate((host_ip, 443)) x509 = OpenSSL.crypto.load_certificate(OpenSSL.crypto.FILETYPE_PEM, cert) components = x509.get_subject().get_components() hostname_byte = components[0][1] print(hostname_byte.decode('UTF-8'))
 ちょっと待った!


Slide 28

Slide 28 text

結果: できる!
 ちょっと待った!
 dns.google

Slide 29

Slide 29 text

● そもそもが「雑な攻撃」なので、攻撃者もいちいち気にしていない?
 ● 同一IPで複数Hostを提供している場合にややこしい?
 ● 私達のサーバーを狙った攻撃ではない?
 ● etc…
 → 結論、攻撃者の考えはよくわからない...
 なぜ使わない...?
 ちょっと待った!


Slide 30

Slide 30 text

補足
 セキュリティエンジニアの友人に伺いました。 
 IPアドレスを基にTLS証明書を取得し、記載されているドメインと突き合わせる手法は、ホワイトハッカーが脅威 ハンティングの一環でフィッシングサイトを検出するために利用しているとのこと。 
 ちょっと待った!


Slide 31

Slide 31 text

今度こそおわり


Slide 32

Slide 32 text

今度こそおわり
 ● 雑な攻撃は一工夫で防げる
 ● セキュリティを考え出すと、本質的な理解が必要だなぁ と気づく
 ● 参加者の皆様、セキュリティの話しましょう!!!
 ちょっと待った!


Slide 33

Slide 33 text

参考


Slide 34

Slide 34 text

● [AWS]AWSのIP帯域を狙った攻撃の実態と対策 
 ● ALBへのアクセスを特定のHostヘッダのみに限定する方法の一例 
 ● その他、ご助言をくださった皆様 
 参考