sakuraです。
本ブログ記事は、「CDIで働くエンジニアに、オススメの勉強方法を聞いてみた」シリーズ 3日目のMalware Analysis、OSINT、Forensic分野です。
他の分野の記事に興味がある方は、以下もご確認ください。
今回も質問内容は変わらず、以下となっています。
- Q1: 普段の業務はなんですか?
- Q2: 学生時代何をやっていましたか?
- Q3: 現状の能力はどう培われましたか?
- Q4: 学生時代に何をやっておくと業務に入りやすいですか?
- Q5: 学び始めで、おすすめの教材はありますか?
- Q6: あらかた学んだあと、実力を伸ばすおすすめの方法はありますか?
- Q7: 新卒1年目〜新卒3年目までに望む能力はありますか?
それでは、現役セキュリティエンジニアの回答を見ていきましょう〜
回答
Q1: 普段の業務はなんですか?
- APTグループなど国家が背後にいるサイバー攻撃の解析とアトリビューションなどのレポート作成、及び報告。
- 自社の脅威インテリジェンス製品開発。
- 顧客のサイバーセキュリティに関連するアドバイザリー、業務のコンサルティング。
Q2: 学生時代何をやっていましたか?
- CTF
- マルウェア解析の研究
Q3: 現状の能力はどう培われましたか?
- ググる。Twitter、勉強会、界隈の知り合いからいい資料を教えてもらう。
Q4: 学生時代に何をやっておくと業務に入りやすいですか?
- 英語
- 技術も勿論だが、論理的な思考力
- 卒論、修論とは別に、対外発表経験
Q5: 学び始めで、おすすめの教材はありますか?
Q6: あらかた学んだあと、実力を伸ばすおすすめの方法はありますか?
- 勉強する前にまずやる
Q7: 新卒1年目〜新卒3年目までに望む能力はありますか?
- 「何をやったらいいですか?」ではなく、「これやったらこうなったけど、どうすればいいですか?」というふうに質問できるようにしてほしい。
- 自分ならどうするかを考える力
- 魚を与えるというより、魚の釣り方を教えたいので、なぜそれを行おうとしたのかという思考プロセスの言語化ができると良い。
Q4: 学生時代に何をやっておくと業務に入りやすいですか?
- 基本的な解析スキルの習得
- 実際の業務で扱う検体は多様なため、一つの検体を解析できても、すべての検体に対応できるとは限りません。
- そのため、初学者は基礎的な解析スキルを段階的に身につけ、手札を増やすことが重要です
- 静的解析ツールを触ってみる
- C言語やC++、Rustで書かれた、Windows上で動作するEXEファイルを用意する
- Hello Worldレベルの自分が理解できる簡単なバイナリ
- 用意したEXEファイルを IDA, Ghidra, Radare2 などで開いてみる
- C言語やC++、Rustで書かれた、Windows上で動作するEXEファイルを用意する
- 静的解析ツールを触りながら、以下のようなことが出来るようにしておくと良い。
- ソースコードと逆アセンブル・デコンパイル結果の対応関係の理解
- コンパイラやリンカによる最適化や、追加されたライブラリコードの識別
- IDA や Ghidra の基本的な使い方を覚える
- 各ウィンドウの見方
- コード間の移動の仕方
- シンボルのリネーム方法
- 構造体の扱い方など
- ツールに慣れたら、マルウェアでよく見られる挙動を自作プログラムに追加し、解析を行う。
- マルウェアの挙動といっても、基本的にはシステムプログラミングの延長であるため、気構える必要はない。
- 例として以下のような機能を実装し、どのように逆アセンブルやデコンパイル結果に現れるかを確認する
- ファイル操作やプロセス操作などのWindowsAPI
- FindFirstFile, FindNextFileなど
- ネットワーク通信
- WinSock API や curl の利用など
- 任意コマンドの実行
- CreateProcess, system など
- 永続化手法
- レジストリの変更(RegSetValueEx)
- Windowsサービスの作成 (CreateService)
- スタートアップフォルダへの登録
- プロセスインジェクション
- VirtualAllocEx, WriteProcessMemory, CreateRemoteThread を用いたインジェクション手法
- ファイル操作やプロセス操作などのWindowsAPI
- 動的解析にも挑戦してみる
- Hyper-V、VMware、VirtualBox等を用いて仮想環境を構築
- 自作プログラムがツール上からどのように見えるか確認する
- x64dbg や WinDBG を使ったデバッグ
- Wireshark, Fakenet-NG を使った通信解析
- SystemInformerやSysInternalsを利用し、Windows上でのプロセス挙動を把握
- その他個人的に触っておくと勉強になる項目
- PEファイルのパーサー自作
- ライブラリを使用したパーサーと、バイナリデータを直接解析する方法の両方を試す。
- 高度な攻撃者は独自のPEフォーマットを作成することがあるため、フォーマットの理解は重要
- シェルコードの実装と解析
- マルウェアでは、ファイルフォーマットを持たない実行可能なコードである、シェルコードが利用されることがしばしばある。
- 簡単なシェルコードを手書きしたり、VisualStudio等で位置独立となるようなコードを書いてシェルコードとして使えるようにしてみる
- シェルコードをメモリ上に配置し、実行してみる
- シェルコードで簡単なEXEファイルのローダープログラムを書いてみる
- msfvenomなどの既存ツールが生成するシェルコードの解析
- インジェクション手法などの再現と解析
- バイナリ内のコードがトリガーされる方法やその実行場所は1つではなく、インジェクション手法などによって変化する
- 静的・動的解析ツールでスレッドやプロセスをまたいで実行されるコードを(必要であればダンプするなどして)追跡できるようになることが大事
- 難読化されたバイナリの解析
- コンパイラ最適化オプションを変えたバイナリの解析
- 最適化による影響を比較し、関数のインライン化、ループの展開、変数の削除などの変化を学ぶ。
- 難読化ツールを使用したバイナリの解析
- obfuscator-llvm を用いたコード難読化
- VMProtect, Themida, UPX などでどのようにコードが変化するか解析ツールで見ておくだけでも勉強になる
- よくあるアンチデバッグ技術に対して、バイナリ内のコードにパッチを適用したりすることで回避する方法を習得
- 既存のマルウェアサンプルを解析し、レポートを書く。
- 無料のマルウェアリポジトリなどを活用して既知のマルウェアをリバースエンジニアリングし、セキュリティ企業が公開しているレポートの内容を再現できるかやってみる
- PEファイルのパーサー自作
- まとめ
- (かなり駆け足で書いたので抜け漏れや他にも書きたいことはいろいろあるが)
- 自分がやりたいこと、できるようになりたいことに集中できるよう、解析対象のバイナリのレベルを自分の理解できる範囲で段階的に上げること
- ディスク上のファイルを分析する手法も重要だが、マルウェアは基本的にOS上のプロセスメモリ内で実行されるため、プロセスやスレッドに対する解析手法を多く持っているとよい。
- 特に暗号や難読化、プロセスをまたぐようなマルウェアが登場したときに重宝する
- 静的・動的解析ツールへの習熟
- 各ツールの強みと弱みを把握し、用途に併せて使い分けられるようになるとよい
- また、最近はLLMを活用することで、学習効率を向上させることも可能になっているため、上手に利用できると良いと思います。
- (例) サンプルコードの生成、逆アセンブル結果やデコンパイル結果の解説、解析ツールの効率的な活用方法の提案
- まずは書籍などで基礎を網羅的に学んだ後、興味のある分野についてLLMを活用しながら環境構築やツールの操作を実践してみると、効率よく学習を進められると思う
Q1: 普段の業務はなんですか?
- サイバー犯罪や国家を背景とした脅威アクターの調査・分析
- OSINTトレーニングの開催
Q2: 学生時代何をやっていましたか?
- 同じこと
Q3: 現状の能力はどう培われましたか?
- ブログを読んで、実践した。
- 一切ブックマークせずに、そのページの単語を所々で覚えておいて、自分でOSINTしてググり倒して再度辿り着けるか?をやったりしていた(記憶力の向上にも繋がった)。
- 実際にその力を使ってお仕事をしている人と繋がりを持って、どんな発想でどんなことをやっているのか、会話をする中で盗んでいった。
- とにかくいろんな立場のいろんな人の意見を聞いたり、繋がりを作ったりした。自分たちにとって敵と思われるような人たちに対しても同様のことをした。
- 会う人の経歴をOSINTで調べ上げてから、会いに行ってみたりした。
- 自分の興味のあることに対して常に本気で向き合った。
- オープンマインドで物事に取り組んで、面白そうなことを常にいろんな角度で昼夜問わず調べ続けた。
Q4: 学生時代に何をやっておくと業務に入りやすいですか?
- 学生時代にインターンとかで社会人としての練習をした方が良かったなと思いました。
- いろんな手続きとかをやることが業務でも出てきますが、自分は手続きが下手くそなので困ったりする事が多々ありました。
- 人前で何かを説明する能力
- 積み重ねれば出来るようになりますが、学生時代にもう少し人前で話す経験をしておいた方が良かったなと思いました。
- コミュニケーション能力:
- 困った時に人に聞けるか?というのは、社会人として根本的に必要な能力だなと日々思います。
- 社会に出ると何事も一人でお仕事をするわけではないので、コミュ力大事です。
- 自己管理能力:
- これは体調を整えるとか、期限を守るように仕事するとかそういう能力です。
- いまだに下手くそですがそういう能力も磨いておくととても役に立つと思います。
- どんなことでもリスクがあるということを知っておくと、なお良いと思います。
- ただ社会人をやるだけでもいろんなリスクやら何やらがあります。
- それをどうやってリスクヘッジするのかを考える視点は、どんな業務にも共通して必要な能力だと思います。
Q5: 学び始めで、おすすめの教材はありますか?
Q6: あらかた学んだあと、実力を伸ばすおすすめの方法はありますか?
- バランス感覚を知る。
- 他の人がやっていないことは何か?を知る。
- 人がやっていないことはやらないだけの理由があるので、他の人がやれなかった理由を考えた上で自分だったらどういうアプローチでどう解決するのかを考え続けること。
- そのためには技術力をつけ続けるだけではなく、倫理、法律、業界の情勢、世界の動きなど幅広い視野が必要になる。
- 物事をブレイクダウンして、どうやったら自分の目的を達成できるのか?を考え続ける能力を伸ばし続けるべき。
Q7: 新卒1年目〜新卒3年目までに望む能力はありますか?
- 常に前のめりで自分の興味関心に没頭できる能力がある事が望ましい。
- 「夢中」になる感覚。
- 「夢中」を知らなければ、自分の興味のある分野を伸ばし続けることはできない。
- 「勉強する」とか「頑張って何かをする」とかじゃない、自分自身が本当に楽しいと思えるものを探す能力が大事。
- それを見つけられる人がプロになれるような気がする。
Q1: 普段の業務はなんですか?
- セキュリティインシデントにあってしまったPC・サーバのフォレンジック調査やWebサーバのアクセスログ調査なんかをやったりしてます
Q2: 学生時代何をやっていましたか?
- 遊んだりバイトしたりしかしてなかったと思います(後悔してます)
Q3: 現状の能力はどう培われましたか?
- 仕事で追い込まれながら
Q4: 学生時代に何をやっておくと業務に入りやすいですか?
- プログラミング(なんでもいいからある程度自信が持てるのがあるといいと思います)
- 情報系限定になるかもですが、大学の授業を真面目に受ける、卒論に真面目に取り組むのも大事かなと思います
Q5: 学び始めで、おすすめの教材はありますか?
- フォレンジックという意味なら、ぜひ弊社のCDIR-Lをよろしくお願いします
Q6: あらかた学んだあと、実力を伸ばすおすすめの方法はありますか?
- SANSのトレーニング(FOR500、FOR508)
Q7: 新卒1年目〜新卒3年目までに望む能力はありますか?
- とにかく自分で考える能力、それを自分の言葉でアウトプットするようにすること(能力かは微妙ですが…)
最後に
本ブログ記事では、Malware Analysis、OSINT、Forensic分野でのおすすめの勉強方法を紹介しました。
明日は本シリーズ最後のブログ記事で、分野はDev(開発)、Infraです。
お楽しみに!