Seccamp2020参加記 & 合同ブログ初号
こんにちは。Kmasaです。そして、お久しぶりです。このブログは今年の2月ぐらいからずっと冬眠していたのですが、ようやくお目覚めですね^^
冬眠している間に、もう卒論の提出締め切りの時期が差し迫っています。卒論書くの辛い。実装とか評価実験は終わっているので、あとは卒論書くだけなのですが、日本語の文章書くの本当に難しいと感じている今日この頃です。
はじめに
なぜ、いきなり冬眠から覚めたのか?と思われる方もいると思いますが、詳しいことは後に説明するとして簡単に言うと、あるコミュニティで合同ブログを書こうという話になり、私がトップバッターになったからですね。卒論提出締め切りとかの日程的なことを考慮すると早いほうが良かった。
合同ブログ初号として、この合同ブログについてと某キャンプの参加記を書きます。
経緯の発端
毎年、独立行政法人情報処理推進機構(IPA)と一般社団法人セキュリティ・キャンプ協議会が中心に展開されている情報セキュリティに関する人材育成などを目的とするセキュリティ・キャンプ全国大会があります。Kmasaは2ヶ月間、このキャンプに参加してました。
この記事を書いた理由
このキャンプでは講義以外にも受講生同士の交流というのもあり、7、8人程度の十数のグループに分かれ、キャンプ終了後にグループごとに決めたテーマについて活動していくというものがあります。
我々のグループは
グループ名:「控えめ関西人」
テーマ :「合同ブログの運営」
になりました。
まずはグループ名ですが、「メンバー全員が関西で生存している」ことを前提にしています。「控えめ」はご想像にお任せします(^^)
次に、テーマについては、共通の興味ある分野がなかったので技術寄りのテーマは厳しいという判断になりました。そう言った中、ほとんどのメンバーが今までにもブログなどいろいろ情報発信をしてきた経験があるのだけれど、うまく続かない!!みたいな人が多いよねーという話になりました。そこで、「継続的に活動できる合同ブログを運営していこう!」という案が出て、隔週ペースでメンバーが順番に技術的なブログを更新していく形になりました。
Outputは大事ですよねーー
運営形式についてはしばらく、このHatenaBlogを用いて各自のアカウントでブログを書いてそのリンクを合同ブログアカウントに貼ってまとめる形で進めます。
modestkansaipeople.hatenablog.com
*** 今後の予定(投稿締め切り)***
第一号:12/13(日):Kmasa
第二号:12/27(日):raccooooon
第三号: 1/10(日):raqqona
第四号: 1/24(日):lufe
第五号: 2/7(日):yecopenn
第六号: 2/21(日):かよ
第七号: 3/7(日):未定 (敬称略)
こんな感じです。ちなみに、ネタが無い!どうしても間に合わない!!みたいな人の救済処置もあるようなないような。
Before キャンプ
通常なら夏季に5日間かけて合宿という形で開催されるのですが、今年は新型コロナウイルスの影響で約2か月間、休日にオンライン形式で開催されました。夏頃に応募課題を出し、(なぜか)選考通過したのでビックリ!!っていうのが本音です。実は言うと、初めは(応募課題の内容的に)応募課題出しても通らないなと悟っていました。(こういう人も少なからずいるのではないかなー)そのまま出さないつもりでしたが、忘れたころに応募課題締め切り期間が延長されたことを聞いて、これは何かの縁かなと思ったので、3日間ぐらいで仕上げて(結構しんどかった)ダメでもともとという気持ちで出したら、通ってましたね!(かなり驚いた)
正直、応募課題はほとんど完全解答できなかったが、語りまくることだけに専念しましたね。語るの大事ですね。(キャンプ参加者が強強すぎてずっとビビっていたが...!?)
何がともあれ、参加できることになったので「必ず充実したキャンプにするぞ」という意気込みで臨みました!
コースは選択コースと集中コースがあり、私は選択コースのCトラック「脅威解析トラック」を受講しました。もともと、フォレンジック分野には興味があり一番近そうなのがCトラックだったので選びました。
開講してからしばらくして、追加受講の受付があり、今回は特別に選択コースを受講していても集中コースも受講できるということで、よくばりなことに2つのコースを掛け持ちすることになりました。集中コースの方は、Z-Ⅴトラック「Rustで作るLinux向けアンチウイルスソフトウェア」を選びました。
タイムテーブル
私の2ヶ月間を振り返ってみると、こんな感じ。
- 10/18(日)開講式
- 10/25(日)C1「なぜ、Webサイトは乗っ取られたのか?AWS環境における実践的なインシデントレスポンス」& C2「Long Live the Malware Analysis (Part.1)」
- 10/31(土) 集中コースゼミ&第一回ハッカソン
- 11/1(日)C3「Long Live the Malware Analysis (Part.2)」& C4「痕跡から手がかりを集める-アーティファクトの発見/分析技術」
- 11/7(土)集中コースゼミ&第二回ハッカソン
- 11/8(日)グループワークとかモロモロ
- 11/14 (土)集中コースゼミお休み
- 11/15 (日)C5「実践・難読化バイナリ解析(前編)」& C6「実践・難読化バイナリ解析(後編)」
- 11/21 (土)集中コースセミ&第三回ハッカソン
- 11/22 (日)C7「最先端のオフェンシブセキュリティ研究入門」& D8「セキュリティ啓発マンガの制作」
- 11/28 (土)集中コースゼミ&最終回ハッカソン&Zトラック合同成果発表会
- 12/6(日)成果発表&閉講式
2か月参加してみて...
キャンプ期間中はとにかく必死でした。私自身、B4(学部4年生)で研究生であるので、平日は研究、土日はキャンプということでなかなか休む時間が無かった気がします。さらに毎週の講義に対して予習、復習となるとハードスケジュールでしたね(いつもがスケジュール無さすぎたからかも....)。さらにさらに、欲張りで集中コースにも参加したのも大きかったですね。
どの講義もハンズオン形式で、講義の構成は予習を含めることで1講義4時間の限られた中で、解析ツールの有用性を含めた将来を見据えた解析技術について考えることができました!
各講義を受けて...
各講義の詳しい内容は同トラックで同グループのraqqonaさんがきれいにまとめている記事があったと思うのでそちらを参考にしてもらえばなと思います!(ごめんなさい。さぼった...)
後日、ちゃんとかく....(と思う)
簡単な感想としては.....
どの日程も非常に興味深い内容だった。フォレンジックに興味があったKmasaにとって、特にC1とC4に関しては実践的なフォレンジック手法を学べて良かった!フォレンジックの勉強というと、どうしてもツールの使い方とかに重きがいってしまい、アーティファクトを抽出するためのロジックや現場で必要となる考え方まで手が回らずにいることが多いのです。(多分.....)
今回の講義ではそういった点が考慮された構成になっていて、かつ実現場に近い形の環境での演習ができたため、これからしっかり復習することを前提すると非常に充実した講義を受講できました!(実は復習まだです....)
集中コースでの格闘
前述したとおりですが、私は選択コースのCトラック(メイン)の他に追加募集された集中コースのZトラックのⅤにも参加しました。Z-Ⅴはもともと2人受講生がおられて追加で私とネクストの受講生が入り、計4人でゼミやハッカソンを行っていました。トラック名にもあるように、Linux向けを前提としてアンチマルウェアのソフトウェアをRustで作るという大枠の中で、担当講師の方から提案されたテーマの中から選んで各自実装を行っていきました。
私は、「Rustでbashエミュレータの作成」というテーマで、マルウェアの前段ともいえるダウンローダ(wget & chmod & exec)の検知をできるようなプログラムを実装しました。(時間的にもbashエミュレータまでいい感じに実装はできなかったが... )
手法としては、正規表現を用いたパターンマッチを利用していています。検知率は提供されたマルウェア検体のデータセットにおいて、82.5%でした。詳しい内容はこちらで
検知を行っているロジックは非常に単純ですねw
ただ今回、正規表現の調整が非常に大変だった....
正直、冗長な正規表現だと思うが(余裕があれば精査したいけど.....)
まぁ検知率が82.5%まで到達したので良かったかなと思います。正直、正規表現はかなり自由度が高く、条件を緩くすれば限りなく検知率はあがります(それこそ、wget,chmod,exec の文字列マッチすればいいみたいな)
けれど、それだとコメントアウトされているものや極端な話、”wgetchmodexec” みたいな文字列があった時点で誤検知があきらかですね。(これなら、grepでいいじゃんってなっちゃう)
なので、ダウンローダで使用される各コマンド実行の対象ファイルの一致判定なども組み込んでいてgrepコマンドとの差別化を図っています。
さらに実はここだけの話、これまでにほとんどRustを書いたことがありませんでした。(完全に舐めてますね。もし講師の方が見ていたらすみませんでした)
けれど、追加受講が開始されるまでに必死にRustについて勉強して、ちゃんとZ-Ⅴの応募課題の2(3の途中)まではクリアした(3日間で仕上げた)のでその点は自分でも頑張ったなと思っています。(けれど、初回のゼミはとっても不安でした)
とは言ってもRust初学者だったことに変わりはない!
なので今回実装したコードはあんまり綺麗じゃないかも....
最後に、今回せっかくRustを使ったのでこれを機にこれからもRustの勉強をしていきたいと思っています!
After キャンプ
まず、キャンプに申し込んでよかったと思います。私の場合は申し込み期間の延長があったから今があるんですよね(運がよかった)。今回、オンラインということで合宿形式を経験していないので比較はできませんが、オンライン開催は良かったです。毎週の講義前に予習という形で事前準備ができるということも魅力的ですが、終わったあとも事後学習がしやすいということなので、長いスパンでじっくり成長できるのもいいですね!
卒論を書き終えたら、復習(事後学習)をしたいですね。
おわりに
この2ヶ月間は一瞬でしたが、充実した日々を過ごせたと思います。大学の卒業研究と並行してキャンプに参加するということで少々不安でしたが、日程が詰まっている方がすぐサボるKmasaには良かったかもしれませんね。来年はオンラインになるかオフラインになるかは不明ですが、もし興味が少しでも出たのならまずは応募してみるのもありですよ!(Kmasaは年齢的に受講生として参加するにはネクストしか参加できませんが...)
それでは、、、また(?)、、、
UserAgentに起因したXSSの危険性についての話
こんにちは。Kmasaです。先日、研の先輩から主題されたCTFにボコボコにやられたので、そこで学んだことを残しておく。CTFの内容としては、Web分野のXSSを題材とした問題であった。KmasaはXSSの脆弱性診断に関して、入力フォームへの診断文字列入力での診断程度のレベルしかやったことがなかった。(初心者に毛が生えた程度)
(注意: 脆弱性攻撃は自分が管理できる環境下で行いましょう。)
概要
タイトルにあるようにUserAgentの偽装(書き換え)による脆弱性に焦点を当て、今回はXSS攻撃の危険性について詳しく見ていく。
UserAgentとは
webページを閲覧するとき、どのデバイスからアクセスするかマチマチ。スマホやタブレット、さらにPCではWindowsやMac、Linuxといった多種の環境下でウェブページにアクセスできる。UserAgentではどの環境でアクセスしたかを示す情報を持ち、その情報をWebサーバに対して通知する。簡単にいうと、Webページに訪問する際は自分が誰なのかという情報がWebサーバ側に通知されるということ。
(例)Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:73.0) Gecko/20100101 Firefox/73.0
こんな感じでブラウザやOSの種類、バージョンなどが明記されている。
詳しい見方に興味があるやる気者は
を参考に。
もう少し詳しい話をすると、
ブラウザはHTTPと呼ばれるプロトコル(約束事)を介して、Webサーバとやりとりを行う。HTTPは「HTTP Request」と「HTTP Response」に分けられて、RequestではブラウザがWebサーバに対して要求する。
「HTTP Request」は主に、
- 「HTTP Request Line」
- 「HTTP Request Header」
- 「HTTP Request Message Body 」
の3つに分類される。
2つ目の「HTTP Request Header」では様々な情報が保持されており、UserAgentもここに含まれる。他には、
に書かれているような情報がある。
UserAgent偽装について
えっ!UserAgentの偽装ってできるの?
→できるのです!
例えば、Android端末からアクセスしているのに、自分を名乗る際に「私はMacです!」っと自信満々に虚偽の申告ができてしまう。
なぜ、偽装ができるのか!?
本来、UserAgentによりWebサーバは各端末環境に合った情報(HTMLなど)を返す。例えば、スマホ用のページとPC用のページが別々に用意されている場合、UsertAgentでどちらのページを振り分けるかを識別している。
ここで、スマホでwebページにアクセスしているけどPC用のWebページを見たいと思ったとき、UserAgentを偽装してスマホであってもPC用ページ情報を獲得することができる。
XSSについて
XSS攻撃の流れの例としては、
- まず、攻撃者は標的とするWebサイトに罠を仕掛ける。
- 第3者が罠を仕掛けたWebサイトを閲覧。
- そのWebサイト上の罠リンクをクリックする。
- あるWebサイトに飛び、不正なスクリプトを送る。
- ここで、問題のあるWebサイトであれば不正なスクリプトがユーザのブラウザ上で実行される。
- そして、偽ページが表示される。
- ユーザはその偽ページ上で個人情報などを入力する。
- 攻撃者はユーザの個人情報を取得してしまう。
恐ろしい。。。。
詳しくは、
を参考に。
さらに、XSSとCSRFを混同している人が多い(Kmasaも混同していた)のでCSRFとの違いは以下を参考に。
UserAgent + XSSの作用
ここまで、UserAgentとXSSの概要について見てきた。
それでは、本題に戻ろう!(やっと...........)
話を振り返ると、UserAgentを偽装(書き換え)経由でXSS攻撃の危険性はあるのかという問題。
結論から言うと、危険性はある!
先述したとおり、攻撃者は罠の一つとされるURLを仕掛けなければならない。ここで、UserAgentを介して罠を仕掛ければ危険なのでは?と思うかと。
残念ながら(残念じゃない!)UserAgentは第3者によって書き換えはできない。
→そりゃそうか。
書き換えができるとしたら自分自身。自分でUserAgentの書き換えしても自分自身に攻撃してることになるので、よっぽど攻撃されるのが好きな方でない限りしても無駄だと考えてしまうだろう。
こうすると一見、危険性は存在しないように思われるがWebサイトの仕様によっては危険性が存在する可能性がある。1つの例として、XSS対策が施されていない環境でUserAgentにおいて、ユーザからの入力を受け付けて(偽装して)その値(文字列)をWebアプリケーション上でそのまま使うという場合、危険性がある。もう少し詳しく言うと、UserAgentの内容をWebブラウザ上で出力するというWebアプリケーションがあったとする。(一番わかりやすい例で言うと、”UserAgentの確認サイト”かな。)ここで、サニタジングなどの文字列処理が行われていない場合、サーバからのResponseで文字列(偽装したUserAgent)が直接出力されてしまうとXSSが起こる可能性がある。(注意:多分、ここまで話して来たら実際にXSSがあるかどうか試してみたいと思う方もおられるかもしれない。度々言っていますが、他人のサイトなどにおいて無断で許可なく検証すると法にふれちゃうかもしれないのでクレグレも自分が管理できる環境以外では検証しないでください。)
まとめ
今回はUserAgentに起因したXSSというテーマで考えてきたけれど、XSS脆弱性の根本の部分は同じであるということ。つまり、Webサイト上の入力を受け付ける部分に対してはXSS脆弱性が存在する可能性があるということ。(サニタイジングなどの対策が必須)
つまり何が言いたいかというと、入力受け付け部分はWebブラウザ上に表示されている部分だけでなく、UserAgentなどのHTTP Request Header内でも存在し、それを利用したXSS攻撃を実行できてしまう危険性があるということを頭に入れておきたい。
特に、今後Webアプリケーションを実装する場合には注意すべきだろう。
おまけ
実はKmasaにとってはこの記事が第1号のブログとなる。もう少し、簡潔にかけるようになりたい。人にもわかるような記事を書けるようになると今後の研究やその発表にとっても役に立つと思うので、今後もこのような記事をちょこちょこ書いていきたい。
それでは......
毎日進捗 ー第0号ー
[ 自己紹介 ]
こんにちは。初めまして、Kmasa(ケーマサ)です。とある関西の大学生で、サイバーセキュリティ分野に関して日々勉強しております。CTF(Forensic好き)とか解析(今年から本格的にやる予定)とかモロモロやっています。今年は各地で開かれている勉強会にも積極的に参加する予定です!
[ 目的 ]
目的はシンプル。日常生活で学んだことを進捗報告ということでこのブログで書くだけ。同じように頑張っている方々と知識の共有をできればかと...
ほとんど、日記みたいなもの。
[ よくある(かもしれない)質問 ]
- 具体的にどんなことをするの?
学生生活で日々勉強したこと(サーバ構築とかフォレンジック解析とかその他モロモロ)をつぶやく感じでかく。たまには、様々な環境構築の備忘録としてのまとめとか記事にするかも。
- なぜ始めようと思ったの?
研究室の仲間に勧められたから。本人が進めたから、おそらく本人も同じようなことをやってくれると思う。実際のところは興味が湧いたから。
- 需要あるの?
ないでしょう。けれど、読者が一人でもいたら需要あると認識しています。環境構築の備忘録とかではもしかすると需要があるかも。
- どれくらいの頻度で記事をあげるの?
毎日!!!もはや、日記。
これは様子見て決めます。(弱気)
[ お断り ]
この記事を見て、自分も進捗を出せるように頑張ろうと思ってもらえばありがたいです。一緒に頑張りましょう。
記事の内容については不正確な部分もあると思いますので、もしよければご指摘していただければ幸いです。
その他、こんなことを記事にしてほしいとかあれば、ぜひぜひご連絡ください。
(注意)あと、たまに日本語おかしいことある。
早速、書いた!
日記という形で!
それでは...