NFLabs. エンジニアブログ

セキュリティやソフトウェア開発に関する情報を発信する技術者向けのブログです。

「セキュリティ・ミニキャンプ 2021 オンライン」に講師として参加してきました

こんにちは、事業推進部 研究開発担当の保要です。

2021年10月30日(土)~ 2021年11月20日(土)の毎週土曜日に開催されていた セキュリティ・ミニキャンプ 2021 オンライン に講師として参加し、2日目の「サイバー攻撃対応 入門」の講義を担当してきました。

本講座では一般的なサイバー攻撃の流れや手法を学習し、Linuxサーバに対するサイバー攻撃を検知、調査する方法を演習を通して体験してもらいます。演習では、ネットワーク型IDSのアラートやサーバのネットワーク関連のログの分析や、パケットキャプチャログや擬似的な攻撃を受けたサーバのディスクイメージの解析を行います。

この記事では、セキュリティ・ミニキャンプの選考問題、事前課題、講義当日、修了試験の内容について紹介します。

セキュリティ・ミニキャンプ とは

本題に入る前に、まずセキュリティ・キャンプおよびセキュリティ・ミニキャンプについて簡単に紹介します。

「セキュリティ・キャンプ」(以下、キャンプ)は、学生に対して情報セキュリティに関する高度な技術教育を実施し、次代を担う情報セキュリティ人材の発掘・育成を目的としたイベントです。主催はIPA(情報処理推進機構)および 一般社団法人セキュリティ・キャンプ協議会です。

2004年から開催されている歴史あるイベントで、毎年8月頃に集中的に*1 全国大会およびネクスト・キャンプが開催されています。キャンプでは業界トップクラスの講師陣によるハイレベルな講義が行われ、多くの卒業生が情報セキュリティやIT業界で活躍しています。 私も2013年にキャンプに参加し、セキュリティ業界の門を叩いた一人になります。

キャンプの全国大会はハイレベルな講義のため、いきなり全国大会を目指すのは敷居が高いです。そこで全国大会にチャレンジする足がかりとして 「セキュリティ・ミニキャンプ」 (以下、ミニキャンプ)が開催されています。

ミニキャンプは、情報セキュリティ人材育成に関心の高い全国各地で年に数回開催されていますが、ここ数回は新型コロナウイルスの影響もありオフラインの開催が中止になっていました。*2 このような状況であったため、今回オンラインでのミニキャンプが企画されて、全国各地から応募者を募る形となりました。

選考問題

ミニキャンプに応募するためには選考問題に回答する必要があります。 今回のミニキャンプでは講師5名がそれぞれ問題を出題し、5問あるうちの3問に少なくとも回答する形でした。

私が出題したのは、pcapファイルに記録されている通信を確認し、人がWebサイトにアクセスした際に発生させたもの、プログラムが発生させたものを判別せよという問題です。

この選考問題は応募者のスキルを確認するのが目的ですので、投稿された応募用紙では以下のようなスキルを確認していました。

  • Wiresharkでpcapファイルを見ることができるか
  • Wiresharkの機能(フィルタ機能や統計機能)を活用して大量の通信から目的の通信を見つけることができる
  • 多角的な観点で通信の特徴を見て、通信を判別しているか

具体的な解説は本記事の最後で紹介しています。

事前課題

事前課題では、講義で使用する解析・分析ツールの基本的な使い方を身に着けてもらうために2つの課題を出しました。

Wiresharkを使ったパケット解析

選考問題でもWiresharkのスキルを確認したのですが選考問題を解いてない方もいたので、選考問題を解いてない方向けにWiresharkの課題を用意しました。

この課題では、私が学生時代に講師を担当していた「CTF for ビギナーズ」の講義スライドでWiresharkの基本的な使い方を学んでもらい、演習問題を解いてWiresharkの使い方に慣れてもらいました。

www.slideshare.net

演習問題はもともとCTF の練習用に作ったので Flag の発見がゴールとなっていますが、今回はゴールに辿り着くまでの細かい設問(ゴール)も用意して Wireshark の機能に習熟してもらえるよう工夫しました。

具体的には「HTTPプロトコルが使われている通信のDisplay Filterと使われているUser-Agentは何か?」、「IPアドレスA または IPアドレスB の通信のみ表示するDisplay Filterと表示されるパケット数は何か?」というような設問です。

Flag を見つけるだけの課題では、本来身につけてもらいたいスキルを得られないまま答えにたどり着く場合があります*3が、このように細かく設問を出すことで身につけて欲しいスキルを習得しながら演習問題を解いてもらえたと思います。

Linuxコマンドによる基本的なログ分析

grepやuniq、sortなど基本的なLinuxコマンドを用いて、ApacheアクセスログおよびLinux認証ログを分析してもらいました。

分析対象のログは、様々なセキュリティに関連するログをデータセットとして公開している Security Repo (hxxps://www.secrepo[.]com/) *4 です。

この課題の演習問題も 「IPアドレスA からアクセスがあった時間と調べるのに使ったコマンド」、「無効なユーザの認証が行われた回数と調べるのに使ったコマンド」のような設問を用意し、ログ分析に必要なLinuxコマンドを習得してもらえるように工夫しました。

f:id:takahoyo:20220111180555p:plain

講義

キャンプはオンラインなので、講義当日は自宅から講義を行いました。

講義の内容は弊社で実施している「ログ分析入門」研修の内容をベースに、主に3つのトピックスを扱いました。

サイバー攻撃者と攻撃の流れ

サイバー攻撃に対応するためには、まずサイバー攻撃について知ることが重要です。 そこで、まずは攻撃の背景にいる攻撃者と攻撃の流れについて講義を行いました。

このセクションでは、まず一般的に言われているサイバー攻撃の背景にいる攻撃者 (Who)や攻撃目的(Why) 、攻撃のタイミングや対象をどのように決めるか(What, Where, When)を説明し、サイバー攻撃のことを知る必要性を説明しました。

その後、攻撃者が具体的にどのような流れでサイバー攻撃を行うのか(How)について、 Unified Kill Chain を用いて説明しました。

また、攻撃手法を学ぶ注意点として、サイバーセキュリティに関連する法律を知ることも重要です。 そのため関連する法律についても説明しました。

f:id:takahoyo:20220111173406p:plain

サイバー攻撃の検知・分析

次に、サイバー攻撃の流れを把握した上で、サイバー攻撃を検知・分析する演習を行いました。

攻撃の検知では、まずサイバー攻撃検知のきっかけの一例を紹介し、その中のネットワーク型IDSで攻撃を検知した場合に焦点を当てて演習を行いました。 演習で使用したIDSログは OSSの Suricata のアラートログで、分析に使用したツールは EveBox です。

また、攻撃の分析では一つのログ・情報だけでなく、複数のログ・情報を相関して分析し、より確度の高い結果を得ることが重要です。 演習の後半では、Apacheアクセスログ、Linux認証ログや公開情報も併せて分析し、IDSログ分析結果の確認や深堀りを行いました。

f:id:takahoyo:20220111175751p:plain

サイバー攻撃発覚後の詳細調査

最後に、検知した攻撃を他の証拠を用いて詳細に解析することで攻撃の原因や影響範囲の特定を調査する演習を行いました。

具体的には、サイバー攻撃の検知・分析で判明した情報から、Wiresharkでのpcapファイルの解析、演習用VM (Linux) に読み取り専用でmountしたディスクイメージの解析を行い、検知・分析時にはわからなかった攻撃者の詳細な挙動を調査しました。

これらのデータは、攻撃を検知時に分析したデータよりも情報量が多いデータが含まれているため、取得できる場合は検知・分析時にはわからなかった詳細な情報を調査できます。

f:id:takahoyo:20220111191153p:plain

修了試験

最終日にはミニキャンプの総復習としてCTF形式の修了試験を実施しました。 試験問題は5人の講師が各1問ずつ講義に関連した内容を作問し、出題しました。

私が出題した問題は、講義で扱ったシナリオと関連したDrupalに存在する任意コード実行の脆弱性を悪用された通信ログを解析する問題です。 問題を少し複雑にするために講義の範囲外の知識も必要となってしまいましたが、適宜ヒントを出してその点はカバーしました。

どのような問題を出題したかは、本記事の最後で紹介しているのでそちらをご覧ください。

講師を担当した感想

今回の講義はかなりボリュームが多かったため、講義の後半は時間が足りませんでした。そのため、講義の後半はほとんど参加者に手を動かしてもらう時間が取れず、講義に満足してもらえたかとても不安でした。 しかし、参加者からは講義終了後も多くの質問をいただいたり、「面白かった」、「解析の方法がわからなかったので参考になった」、「一つ一つの証拠から攻撃者の動きが見えたときは気持ちよかった」などの感想もいただけたため、参加者が満足できる講義が出来たと一安心しています。 このようなポジティブな意見をもらえると、講師をやった甲斐があったと感じますね。

また、セキュリティ・キャンプの活動の一つの目的としてスタッフも含めた参加者同士のネットワーキングもあると思いますが、今回はオンラインということもありチューターや参加者と直接会って交流する機会がなかったのは寂しかったです。 オンラインの懇親会やDiscordなどを使い少し交流はできましたが、コロナ禍が収束しオフラインで会える機会が来ることを楽しみにしたいと思います。

さいごに

セキュリティ・キャンプは私の現在の仕事や活動の原点となったイベントで、日頃から何か恩返しが出来ればと考えていました。 それが、今回ミニキャンプの講師という形で恩返しが出来たのでとても良かったです。 今後またキャンプのコミュニティに対して何か恩返しできる機会があれば、積極的に活動できればと考えています。

最後になりますが、参加してくださった参加者・チューター・講師のみなさま、このような機会を与えてくださったセキュリティ・キャンプ関係者のみなさま、そして活動を支援してくれたNFLabs.のメンバーに感謝したいと思います。 ありがとうございました。

おまけ: 選考問題および修了試験問題の解説

選考問題の解説

出題した問題

Webサーバに対する通信を記録したpcapファイルがあります。 このpcapファイルには、人がWebサイトにアクセスした際に発生させた通信とプログラムが自動的に発生させている通信が含まれています。 人がWebサイトにアクセスした際に発生したと考えられる通信のクライアントが使用しているTCPポート番号を答えてください。 また見つけた方法と判断した理由についても書いてください。

問題ファイル: pcapファイル。募集要項のページ で公開されています。

まず問題ファイルはpcapファイルなので、Wireshark で開きます。

f:id:takahoyo:20220111114519p:plain

画面右下の Packets を見ると、4841パケット記録がされているとわかります。

一つずつ見ていくには少し量が多いので、Wireshark の統計機能を用いて記録されている通信の全体像を把握します。 Statistics -> Conversations 機能で記録されているTCP通信の統計情報を確認します。

各セッションの情報を確認するとHTTPに用いられる 80/tcp 宛に通信しているのは共通していますが、いくつか通信量が多いセッションが確認できます。 そこで Bytes A->B(クライアントからサーバへの通信量)でデータを並び替えてみます。

f:id:takahoyo:20220111115418p:plain

通信量が明らかに異なるTCPセッションが6つあるのがわかります。 またDuration(セッションの通信時間)を見ると、他のセッションよりも通信時間が長いこともわかります。

多くの通信は548bytesおよび614bytesなのに対して、この通信量は少々イレギュラーです。

そこで以下のようなDisplay Filterを作成し、該当の送信元のポート番号のTCPセッションとWebアクセスに使われるHTTPの通信のみに表示を絞ります。

(tcp.port == 42400 or tcp.port == 42402 or tcp.port == 42548  or tcp.port == 42544 or tcp.port == 42640  or tcp.port == 42642) and http

f:id:takahoyo:20220111134042p:plain

どのアプリケーションが通信を発生させたか判断する最もシンプルな方法はUser-Agentです。 HTTPのUser-Agentを見ると、Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Firefox/78.0 となっており、該当の通信は Firefox (Webブラウザ)≒ 人が発生させた通信と考えられます。

他にもHTTP通信があるので、先程のDisplay Filterの先頭に not をつけて表示を絞ります。 絞って表示された通信のUser-Agentを確認すると、curl/7.74.0となっています。curlはCLIプログラムであり、シェルスクリプトなどのプログラムで多く使用されますので、これらの通信はプログラムが発生させたと考えられます。

f:id:takahoyo:20220111144832p:plain

したがって、答えの送信元ポート番号は以下のように考えられます。

42400, 42402, 42544, 42548, 42640, 42642

​ ここまでが問題の答えにたどり着くまでのアプローチですが、これが100点の回答ではありません。 実際はUser-Agentは偽装できたり、SeleniumなどのWebブラウザの操作を自動化するフレームワークを使っている可能性などもあるためです。

よって、今回の問題の採点においては、User-Agentの偽装により答えが100%正確でないことに触れていたり、判別に使える他の通信特徴を触れている場合は加点を行いました。具体的には以下のような特徴です。

  • User-AgentがFirefoxのものは、 / にアクセスした直後にCSSやJS、favicon.icoを取得している
    • これはWebブラウザの挙動によるもの
  • User-Agentがcurlのものは約1秒おきにアクセスをしているが、Firefoxのものは規則性がない
    • プログラムによるアクセスは一定時間sleepをするようなことが多いので規則性ができやすい

通信の分類は1つの特徴よりも、複数の特徴を見た方がより精度の高い判断ができます。

修了試験問題の解説

出題した問題

とあるWebアプリケーションに存在する任意コードの実行の脆弱性を悪用されて、サーバ内のデータが持ち出されてしまったようだ。 どのような脆弱性が悪用されたか調査し、持ち出されたデータの中に含まれるFLAGを探してください。

問題ファイル: pcapファイル

問題ファイルがpcapファイルなので、まずWiresharkで開きます。

f:id:takahoyo:20220113111955p:plain

問題文からWebアプリケーションに対する攻撃であるとわかるので、http でDisplay Filter をかけます。

f:id:takahoyo:20220113112404p:plain

一番最初に出てくる CHANGELOG.txt のアクセスに対するレスポンスを見ると、Drupal 7.54 の文字が見えるため、対象のWebアプリケーションはCMSの Drupal 7.54 であると考えられます。

f:id:takahoyo:20220113150540p:plain

"Drupal 任意コード実行" のキーワードで検索するといくつか任意コードの実行の脆弱性が見つかります。その中でも、特にCVE-2018-7600(通称: Drupalgeddon2、Drupal 7.58より前のバージョンが対象)に関する情報が多く、Drupal 7.54も影響を受けます。

次にいくつかのHTTP通信をFollow TCP Streamで見ていくと、Linixのコマンド echo と base64、PHPのファイル名 create.php のような文字列が確認できる通信があります。

f:id:takahoyo:20220113150228p:plain

URI先頭の/?q=user/password&name のようなキーワードで検索すると、以下のようなDrupalの脆弱性を悪用した攻撃を観測した記事が見つかります。

www.ibm.com

この記事によると、name[%23markup]= 以降に実行を試みるコマンドが記録されている攻撃が観測されているので、以下の部分が実行を試みているコマンドであることがわかります。

文字列の一部がURLエンコードされているので、CyberChef を使って文字列をデコードします。

f:id:takahoyo:20220113124348p:plain

base64でエンコードされた文字列をデコードして、ファイル create.php に書き込んでいます。

このエンコードされた文字列をさらにCyberChefでデコードすると、PHPのコードが出てきました。

f:id:takahoyo:20220113124710p:plain

つまり、攻撃者は以下のような挙動を行うWebシェルを設置しています。

  • パラメータ c があるPOSTリクエストを受け取った場合に処理
  • パラメータ c のデータを ROT13 でデコード
  • ROT13でデコードしたデータをBase64でデコード
  • デコードしたデータをコマンドとして実行

設置したWebシェルへのPOSTリクエストがないか確認すると、3回リクエストが発生しています。

f:id:takahoyo:20220113140849p:plain

最初のWebシェルへのリクエストに対するレスポンスを見てみると、Linuxの /etc/passwd の情報が含まれておりコマンド実行の成功がわかります。

f:id:takahoyo:20220113145815p:plain

以上より、パラメータ c に含まれる文字列をROT13、Base64の順でデコードすることでWebシェルで実行されるコマンドが復号できるとわかるので、CyberChefで判明したアルゴリズムに従ってパラメータ c の文字列をデコードしてみると攻撃者が実行したコマンドがわかります。

f:id:takahoyo:20220113141713p:plain

どうやら攻撃者はopensslコマンドでflagファイルを暗号化し、netcatを用いて暗号化されたflagファイルを IPアドレス 192.168.180.163、TCPポート1337 宛に転送しているようです。

そこでWiresharkでtcp.port == 1337 でフィルタしてみます。

f:id:takahoyo:20220113142228p:plain

すると、netcatで転送しているデータのパケットが見つかるので、これをFollow TCP Streamを用いてエクスポートします。 転送データをバイナリファイルとしてエクスポートする場合、Show data asRaw を選択し、Save as を押します。

f:id:takahoyo:20220113142720p:plain

データはAESで暗号化されてますが、攻撃者が暗号化に使用したコマンドが残っているので復号可能です。 攻撃者が使用したコマンドのオプション -e-d に変えて、in と outのファイルを逆にするとファイルの復号ができます。

f:id:takahoyo:20220113143651p:plain

ファイルを復号すると、FLAGが出てきました。

mc2021{H4PPY_M1N1C4MP_GR4DU4T10N}

*1: 近年はコロナ禍でオンライン開催されていることもあり、毎週末約2ヶ月にわたって行われてます

*2:筆者もミニキャンプ in 徳島 2020とミニキャンプ in 東京 2021で講師を担当する予定でしたが、いずれもコロナの影響で中止にとなってしまいました。。

*3:極端な例だと、WiresharkのDisplay Filterを学んでもらいたいにも係わらず、Wireshark を使わずに stringsコマンドを実行してgrepするだけでFlagが見けてしまう場合です。

*4: このログが配布されているサイトへアクセスすると、自分のIPアドレスが含まれたアクセスログがデータセットの一部となるため defangしてます。ご注意してください。