2022年の振り返り
はじめに
今年は何をしただろう。 何を成し遂げただろう。
去年掲げた目標から抜粋してみる。
自分のやる分野を狭めよう。 人生計画を立てよう。 習慣化も徹底しよう。 資格を一つは取ろう。 セキュリティの知識を深めよう。 開発の経験をつけよう。
こう並べてみると多い気もするが、頑張りたい。 とりあえず短くていい。少しずつ始めていこう。 自分にあったペースでつづけていこうと思う。
最後に良いお年を。来年は今年より成長できますように。
去年の目標を改めてみると、いろいろなことが思い浮かんできた。
学業
現在3回生であり、4回生に進級するには必要単位数があるので頑張ている。 春学期についても努力をしていたが、自分でもびっくりなぐらい単位の取得ができなかった。 これには今の自分も納得はしていないが、この時初めて成績開示って大事だなって思った。成績開示は成績発表日を含めて3日以内に申請書を書かないといけないらしいので、もし秋学期についてもどうように納得できなかったら、実施しようと思う。追加で、フル単している方々がとてもすごいということも身にしみて感じた。 その結果秋学期についてはほとんどフル単を取らなければ進級ができないといった状態。そのため、がんばってはいるが、最近寝不足で大学に行けていないのが一つの不安点。課題等に関しては毎回提出をしているが、結果は期末試験でほとんど決まってしまうのでそこまでの踏ん張りどころだと勝手に思っていて、勉強しなきゃなと思っている。 しかし、最近は留年しても地盤を固める時間が増えるかなって思って甘えだしてきてしまっている自分がいる。 加えて、最近大学院で勉強したい意欲が出ており、低レイヤーよりの研究をしたいと現在研究テーマを考えている状態。しかし、低レイヤーといってもいろいろとあるため、自分の興味があるものを探しているがいい案が思いつかない。何も進捗がない状態で3年生がもう終わろうとしている。 大学も進級できるかわかんないのに大学院試の勉強をしておいて、特に数学については頑張っているつもりが、自分が怠惰であるため人並みより下の成果ではある気がする。研究テーマが決まっていないこともあり、他大学の教授にアポを取れていない状態であり、悪循環になっている。 TOEICについても最近試験を受けたのですが、1,2年生の頃は600点台にもかかわらず、510点。今まで上振れていたのか、今が下振れているのかはわからんが、英語の能力は下がっている。もっと勉強します。 来年は一ヶ月弱ニュージランドに留学に行くつもりで、英語の勉強を集中してできなばいいと思っている。実際にどのような行動になるかはわかっていないが、いい感じにホストファミリーとも関係を保ちつつ、勉強していきたい。
資格については今年度は3つ「eJPT」「OSCP」「AP」受けましたが、「eJPT」のみの合格でした。ここらへんで「OSCP」を受けて自分の体力のなさ、「AP」を受けて自分の基礎知識不足を痛感した。
最近はまだ大学一年生からやり直したいなと思っているが、結局同じように生活しそうなのでいまいちだなって葛藤している。
インターン・イベント
今年は「GMOサイバーセキュリティ byイエラエ株式会社」「株式会社サイバーエージェント」「ウォンテッドリー株式会社」「ピクシブ株式会社」「合同会社DMM.com」といった5つの会社に期間は別々ですが、インターンをさせていただきました。 脆弱性診断や、Go言語によるサービス開発、KubernetesやTerraform for AWSについて、PHPやCIなど幅広いことをいろいろな会社で経験して、次は長期のインターンでプログラムをしっかり書くことができるインターン等に参加したいなと思っております。
それぞれの会社でいろいろと教えてもらったことや感想等がたくさんあり、参加記等を書こうと思っていたのですが、結局書いていない次第です。(書いてあるやつもあるのですが公開できていない模様)
CODEBLUEの学生スタッフにも参加させていただきました。 いろいろな会社のセキュリティエンジニアの方とお話や面識を得られたのでとてもいい機会であり、次回も参加できたらいいなと思っております。こういったイベントのスタッフというのは大変でありましたが、やりがいというのもあって楽しいなって思いました。上の方が私達には大変なことを伝えなかったおかげで楽しかった可能性はありますが、こういった機会があったら積極的に参加していきたいと思いました。 12月31日にはEventHubの録画が見れなくなってしまうので早く見なければ!ってなっていますが、行動が遅かったため全ては見ることはできなさそうです...。
VRChat
VRChatに入って2年立ちました。4-8ぐらいまでは一度飽きてしまった時期がありましたが、最近またずぶずぶになっております。最近はPublicにはほとんど行かず、新しい出会いが少ないですが楽しいのでいいかなって思ってます。できれば英語等の語学を上げたいなって思っていましたが、あまりうまく行かないってなっております。10点トラッキングできるようになったんですが、最近トングルがうまく作動せずに、逆に余分にUSBでつけているとトラッキングが飛ぶようになってしまいました。 年末年始は実家に帰っているのですが、一週間目で依存症の発作っぽいのが出始めてきました。早く帰ってVRChatしたい...。
総括
こう見ると今年もいろいろなことをしてきたのだなって思いました。 結局目標の習慣化とやる分野については狭めることはできず、いろいろなことを一気にやって何もできなくなってしまったときもあったのでやることは3つ以上つけるのはやめようと思います。 9月からは大学だけで精いっぱいでセキュリティ的知識を深めることや開発について全然できておりませんでした。そのため、TwitterのTLとかを見ると何もしていない自分が恥ずかしく虚しくなっていました。 自分のペースで行こうと語り続けますが気分は良くなりません。 うまい解決方法があればいいんですが、如何せん私はエンジニアは向いていない気がしています。プログラムを書けるようになるビジョンがまた最近見えなくなってきました。
これからも直向きに努力は続けていこうと思います。
来年(2023年)の目標
やりたいことも増えてきたので、中途半端ではなくやったことをブログ等にまとめて自分の頭を整理するようにしたい。 学業については、とりあえず4年生に上がっていることと、一つ資格を取っておきたい。夏までには研究テーマが決めたい。 今年よりもエンジニアという職業になれるようにプログラミングというやつや、基本的な知識について習得したい。
最後にいいお年を。来年もさらなる成長できますように。
CODEBLUE2022の「防衛を考え直す-Active Directoryでのリスクの数値化」のレポートと感想
Active Directory(AD)は、企業ネットワークのバックボーンとして広く採用されている。そのため、ADを乗っ取ることは組織全体をコントロールすることを意味する。しかし、ADを悪利用しようとする敵対者のニュースが後を絶たない。われわれの研究によると、これは防御側と攻撃側の間に大きなギャップを生じさせていることが分かった。AD環境における潜在的な攻撃ベクトルが見えないと、防御者は何を防御すべきかの手がかりを得られない。防御者が環境中の潜在的な攻撃ベクトルを認識していたとしても、効果的なリスク低減はもちろん、作業の優先順位をつけるためにリスクの重大性を理解しなければ、防御を実施することは困難な場合が多い。 上記の課題を克服するため、われわれはまず、ADにおいての知識の範囲内ですべての攻撃ベクトルを評価し、防御者に可視性を提供する。そして、その評価に基づき、攻撃ベクトルや経路のリスク定量化を行うために、Active Directoryを対象とした実用的なリスクモデルを提案する。このモデルでは、組織内のさまざまなタイプのシナリオで無理なく利用できるよう、柔軟性を考慮したリスクファクターを定義している。本講演では、リスクモデルを深く掘り下げた後、攻撃ベクトルと攻撃経路をどのようにモデルに適用し、リスクを定量化できるかを紹介する。 本講演では、聴講者は、潜在的な攻撃を早期に発見するために、攻撃ベクトルを列挙することで、すぐに行動を起こすことができる。また、攻撃経路を列挙した後、リスク定量化モデルを適用し、防御作業の優先順位付けを行うことが可能だ。また、リスクモデルに基づく戦略を共有することで、効果的かつ包括的な方法でリスク全体を低減することもできる。 登壇者 マース・チェン、デクスター・チェン
レポート
Active Directoryリスクの数値化をすることによってどのような利益をもたらすのかなどの説明をする。
Active Directoryの概要
セキュリティに課題や解説作
AD(Active Directory)はMicrosoftが開発した中央集権型のユーザとコンピュータリソースを管理するシステムであり、LDAP(Lightweight Directory Access Protocol)やKerberosやDNSも含んでいる。 ADは会社の環境では不可欠なものであり、いろいろなデバイスと繫がっているということ。 例えばSSO(Single Sign-On)やメールアクセスや内部のサイトとの認証がある。
ADのサービスは以下に示すサービスなどがある。 - DS (Domain Services) ADのサーバの役割を担っており、管理者がネットワークからのリソースやアプリケーションデータに関する情報を分散データベースに管理・保存吸えるようにするサービスであり、ログオンで認証を行い、ディレクトリリソースへのアクセスを制御するといったセキュリティの統合を行うサービス。 - FS (Federation Services) セキュリティや企業の境界を超えてデジタルIDと認証の権利を安全に共有し、IDを連携することとアクセス管理を行うサービス。 - CS (Certificate Services) 電子文書や電子メールの暗号化、電子署名に使用されるPKI(Public Key Infrastructure)を作成・管理するサービス。 - RMS (Rights Management Services) 機密文書や電子メールを保護するサービスであり、従来のfirewallやACLs(Access Controll Lists)とは異なり、暗号化と保護した状態はファイルがどこに転送されたりしても持続的に行われる。
上記の中でも今回は攻撃を最も受けているAD DSについて話していく。 以下のサイトから参照すると、ADを使っていないところは少なく、Azure ADやADを利用していることがわかる。ほとんどの企業ではAD DSが中心であり、多くの脆弱性が存在するということを攻撃者はわかっている。 https://futurecio.tech/one-identity-reveals-barriers-to-zero-trust-framework-adoption/
Lockbitと呼ばれるランサムウェアではGPO(Group Policy Object)を使用して、ランサムウェアを拡散することを行った。
ここで、なぜADは攻撃されやすいのかと、攻撃を検知、対策することが難しいのだろうか。 - Misconfiguration ADの設定は複雑であり、たくさんある。そのためデフォルトの状態であることがおおい。 設定ミスは時間をかけてチェックしなければならない。 - Techniques Implementation 攻撃されたときに実際に行わなければいけないことの選択肢が多すぎるということ。 攻撃を検知すると言っても多くのテクニックが存在し、サービスが存在するため、どれを使っていいのかが難しい。 - secure AD 安全性を確保するために対応する緩和策を見つけることができるが、100%実施することが難しい。 - Attack Pathes 脆弱性が多く存在していて、その脆弱性に対応するための重大度などを決めるのが難しい。それをどこから直していけばいいのかといった目星をつけることが難しい。
すなわち、私達は攻撃を検知することや防御する方法については知っているが、攻撃経路や攻撃ベクトルをどのように優先的に対策していくべきかを考えることが難しい。これによって時間をかけないと抑制できるようにならない。
上記の問題に対して我々はリスク数値化モデルを使用することによって優先順位をつけることができ行動することができるのではないかと考えた。
Active Directoryのリスクの数値化の詳細
- Attack Vector ADの機能を悪用した攻撃手法
- Threat Source 評価対象についてのあるアクセス権を持つ攻撃者について
- Likelihood 攻撃者が攻撃を開始し、影響を与える確率
- Impact 攻撃が成功した場合に想定される被害
Likelihood = (Thread Initiation ✕ Thread Occurrence) +- Predisposing Condition
- T.I.(Thread Initiation) 攻撃者が攻撃を開始する確率 権利を持つアカウントやドメイン内のアカウントのカバレッジ率が攻撃を開始する権利を持っており、このカバレッジ率は攻撃者が攻撃を開始できるアカウントのいずれかを制御しているかどうかの不確実性を反映する役割を果たしている。
- T.O.(Thread Occurrence) 攻撃が成功する確率 ここで攻撃の最初ができたとしてもそれが最終的な攻撃が成功するとは限らない。
- P.C.(Presposing Condition) 環境において脅威の発生に影響を与える値
Impactではどの権限が取得されたことなどのわかりやすい形で数値化する。
よってRiskはLikelihood ✕ Impactと定義する。
潜在的攻撃のリスクの数値化
実際の評価を以下に示す。
Kerberoasting攻撃
事例としてKerberoasting攻撃について話す。 ドメインアカウントにSPN(Service Principal Name)を設定すると、有効なTGT(Ticket Granting Ticket)を持つすべてのドメインユーザーがサービスチケットを要求することができ、サービスチケットの一部は、サービスアカウントのパスワードハッシュで暗号化されており、攻撃者はパスワードのブルートフォース(総当り)をすることができる。これに加え、 評価するために、デフォルトのドメイン環境設定のまま、ドメイン全体に対して、カーバオーストのリスクアセスメントを実施。 SPNを設定したドメインユーザや、パスワードの複雑さ(7文字)と更新期間(42日)はデフォルト設定、サービスチケットの暗号化アルゴリズムをRC4の有効化にした状態で始める。 先程の評価値から考えると、すべてのドメインユーザが攻撃を行うことができるため、T.I.は100%であり、危険度5のVery Highに位置し、T.O.は有効期間内内にパスワードが解読されたかどうかで判断する。ここでRC4を2080tiでハッシュレートを計算した結果64%であることがわかり、危険度は3のMiddleに位置することがわかった。 次に、P.C.については、アカウントのパスワードを変えなかったことで+5p, デフォルトではoffのDESアルゴリズムを有効化していたことで+5pとなるが、RC4暗号を無効化することで-5p, AES暗号アルゴリズムを有効化することで-2p, 組織でpasswordの安全管理をすることで弱いパスワードが存在しない状態を作ることで-1pと行った感じで計算する。
ここで先程示した計算式に乗っとって計算すると、基本的なインパクトは15でHighで、RC4が有効なため、+5pして、Domain Administratorがクラッキングされた場合は、20でVery Highになり、MSSQL Service Accountの場合は12でMiddleとなる。
例えばRC4の暗号化アルゴリズムを無効化することでAdministratorがクラッキングされたときの影響度は15でHighとなる。
ACLの乱用
ADではすべての情報はDO(Domain Object)として保存・管理されており、各DOはドメインアカウントにアクセス権を与えることができる。これによって、攻撃者はアクセス権を悪用することによって横展開することができるようになる。 ACLには2つの種類があり、Generic RightsとObject-Specific Rightsが存在する。 Generic Rightsは書き込み権限などであり、オブジェクト固有の権限を含むドメインオブジェクトを完全に制御することができる権限であり、Object-Specific Rightsはドメインオブジェクト固有のものであり、限定的な権限である。
この攻撃が有効的なのはほとんどの場合設定ミスによって起きるものである。 しかし、ドメインオブジェクトの種類によってACLの乱用方法については異なる。
- User Account
- パスワードの強制変更
- SPNの有効化によるKerberoasting攻撃の実施
- as-reporoastingの事前認証の無効化
- PKINITを用いたKerberos認証の証明書を設定する
- Computer Account
- リソースベースの制約付きの代表設定をする
- ローカル管理者パスワードを取得する
- PKINITを用いたKerberos認証の証明書を設定する
- Domain Group
- ドメイングループから付与される権限を持つメンバーを追加する
- Organizational Unit
- Organizational Unitオブジェクトに含まれる継承フラグを指定したACLを作成する。
- Group Policy Object
- 新規にポリシー設定を行い、アカウントに権限を与える。
- Domain Object
- DCSync攻撃を行う。
- Certificate Template Object
- 脆弱なテンプレートを設定して悪用できるようにする。
評価するために、デフォルトのドメイン環境設定のままで、{dexter,administrator}@corp.localという2つのアカウントと、ACLを{User-Force-Change-Password, GeneralAll}を有効にした状態で行う。 ここからAD DOは他のアカウントに特定の権限を付与しており、攻撃者はその権限が与えられたアカウントを乗っ取り、DOを制御するためにアカウントを悪用をする。
評価すると、T.I.についてはACLが付与されたアカウントのカバレッジ率に起因する。ACLがUser-Force-Change-Passwordの場合は25%以下であり、重要度は2でLowに位置され、T.O.については、一度ACLが設定されてしまった場合は、攻撃者が権限乱用することができるため、成功率は100%であるため、重大度は5のVery Highになる。すなわち、Likelihoodは10のMiddleである。 ここで攻撃の成功率に影響を与えるのは防衛機構のみであり、防衛機能があった場合P.C.は-2pとなり、アクセス権を奪われたアカウントによって影響度が異なる。
次に、ACLがGenericAllの場合は、可能性が100%であり、重要度は5でVery Highに位置され、T.O.については、一度ACLが設定されてしまった場合は、攻撃者が権限乱用することができるため、成功率は100%であるため、重大度は5のVery Highになる。すなわち、Likelihoodは25のVery Highである。 今回はDomain ObjectのGeneral User Accountが乗っ取られた場合は影響度は2のLowとなり、Riskとしては10のMiddleとなった。
次は、Domain Groupの30%のアカウントが保持しているACLがGenericAllの場合は、重要度は3でMiddleに位置され、T.O.については、一度ACLが設定されてしまった場合は、攻撃者が権限乱用することができるため、成功率は100%であるため、重大度は5のVery Highになる。すなわち、Likelihoodは15のHighである。 Domain ObjectのAdministratorが乗っ取られた場合は影響度は5のVery Highとなり、Riskとしては20のVery Highとなった。
先程の評価値から考えると、すべてのドメインユーザが攻撃を行うことができるため、T.I.は100%であり、危険度5のVery Highに位置し、T.O.は有効期間内内にパスワードが解読されたかどうかで判断する。ここでRC4を2080tiでハッシュレートを計算した結果64%であることがわかり、危険度は3のMiddleに位置することがわかった。 次に、P.C.については、アカウントのパスワードを変えなかったことで+5p, デフォルトではoffのDESアルゴリズムを有効化していたことで+5pとなるが、RC4暗号を無効化することで-5p, AES暗号アルゴリズムを有効化することで-2p, 組織でpasswordの安全管理をすることで弱いパスワードが存在しない状態を作ることで-1pと行った感じで計算する。
繊細的攻撃の道ずじのリスクの数値化
攻撃経路に対しての数値化を行いたい。 各攻撃が可能な権利を持つアカウント数を収集し、アカウントの重複を排除する。 最も大きな影響を与える攻撃や、ドメインアクセスの攻撃経路も確認する。 ここについても先程のRiskの計算と同じ式を適用できる。
攻撃経路の定量化では、経路に応じて評価していく。 以下の数を取得して判断する。 - Local Admin counts Administrator groupに所属しているアカウントの数 - Logon Session コンピュータシステムに対してリモートアクセスできるアカウントの数 - ACL Abuse Domain ObjectからACLの権限を付与されているアカウントの数 - DCSync Domain Replication権限を持っているアカウントの数
他の評価の指標として、ドメイン内で、サーバーのローカル管理者権限を持つユーザーを取得し、アクセスしているログオンセッションの数を計算する。そのログインしているユーザの中で他のユーザーに対してGenericAllの権限を持つユーザーのの数を計算し、そのユーザの中でDCSyncを実行する権限を持つユーザの数を取得するといったこと。
事例として、150のアカウントの中で35のユーザが60のコンピュータに足してLocal Administrator権限を持っている場合、T.I.の重要度は3でありMiddleとすることができ、Impactについてはサーバのコンピュータなので3であり、Middle. Logon Session Dumpされた場合は、30のコンピュータの中で40のlogon sessionあった場合はT.I.の重要度は3でMiddle.Impactについては通常のdomain userになるだけで、administratorにはならないため、重要度は2でLow. のように行っていく。
この中から先程の4つの経路で一番高いところから対策していくべきである。
緩和策
- 攻撃経路の無効化 攻撃経路を可能にする設定を削除する SPN設定の設定を見直す
- 可能性を低下させる 攻撃するために使用される特権を付与されたアカウントを減らす ネストしているグループが存在するため、不要なアカウントが入っていないか注意深くチェックする。
- 検出メカニズムの強化 特定の攻撃イベントに対しての検出を強くする。 Advanced Audit PolicyやSecure Access Controller ListをDomain Objectで使用する
感想
設定ミスでの脆弱性は、一度設定したらいいだろうと思って見直さないことがおおいと感じました。実際に自分で使っているツールなどの設定をいちいち確認するしていないということ。せめて新しい方が入ってきて設定の説明をしたりや、不具合ができたときなどに見るぐらい。ADのすべての設定をチェックするツール等があれば便利になりそうだなって思いました。(ありそう。)
CODEBLUE2022の「工場で警報-0から100、OTの脅威エミュレーション」のレポートと感想
2010年にStuxnetがイランの核開発プログラムに大きな被害を与えて以来、ICSのセキュリティ問題が提起されている。多くの研究者が、ハッキングの技術や経路、歴史上知られている攻撃について調査し、さらに多くのマルウェアや事件が発生している。企業は、脆弱性を発見する効率的な方法を必要としているが、ICS(Industrial Control System)ペンテスターに予算を割くことができないかもしれない。この問題を解決するために、われわれは、MITREのオープンソースツールであるCalderaのプラグインとして、珍しいOT(Operatinal Technology)ターゲティング、オープンソースの敵対者エミュレーションツールを作ろうとしている。ユーザーは、IT攻撃とOT敵対者を簡単に組み合わせることができ、その過程で攻撃のステップを変更したり、手動でコマンドを送信したりすることができる。
われわれは、20以上の工場のトラフィックをレビューし、2022年にMITREが定義した19のICSマルウェア、PIPEDREAM/Incontrollerを分析した経験をまとめた。ICSマルウェアの主な傾向として、単一プロトコルを標的とするものから、モジュール化され、複数のプロトコルに対応するものに変化していることが分かっている。また、マルウェアの動作は4段階の攻撃フローに集約されていることを、実際のマルウェアによる攻撃を交えて説明する。また、以上の結論をもとに、敵対者の自動エミュレーションツールを構築した。
このツールは、MITRE ICSマトリックスにある10の一般的なプロトコルと23以上の技術をすでにサポートしており、OTで定義されたICSマルウェアの動作の80%以上を再現することが可能になっている。また、4段階の結論にしたがって、マルウェアに利用されていない攻撃も追加している。石油、ガス、水道、電力工場の実機、SCADA(Supervisory Control And Data Acquisition)開発者向けのプロトコルシミュレーション、ハニーポットでテストした。 本発表では、デモを行う予定。 登壇者 ヴィク・ホワン、ソル・ヤン
レポート
概要
まずは、用語から
ICS(Industrial Control System)は産業プロセスの制御や監視に使用されている制御技術の一部である。
SCADA(Supervisory Control And Data Acquisition)は大きな施設やインフラを構成する装置・設備からデータを取得し、ネットワークを通して一か所に集めて管理できるシステムである。
DCS(Distributes Control Systems)は工場やプラントなどの工業用コンピュータシステムである。
PLC(Programmable Logic Controller)は制御装置であり、エレベータなどの制御に使われている。
IED(Intelligent Electronic Device)は電力システム機器を制御するコントローラを指す。
HMI(HuMan Interface)は人間と機会が情報をやり取りするための装置などを指す。
DCSは制作した企業によってプロトコルがカスタマイズされていて異なり、使用している企業によってアーキテクチャが異なって、複雑でデバイスの制御が難しい。
SCADAのプロトコルは公開されており、ほとんどのセキュリティ研究ではSCADAに注力している状態である
プロトコルが公開されているので、システムの情報やデータなどを簡単に読み取ることができる。
from: https://www.zscaler.es/resources/security-terms-glossary/what-is-purdue-model-ics-security
IT(Information Technology) System
PCやWeb Serverが該当する。
従来のIT領域と既知のIT領域であり、インターネットに接続するのが多い領域であり、攻撃の多くはここからはじまる。
OT(Operational Technology) System
レベル3以下は、製造工程に関わるものである。
レベル3とレベル2の一部には、管理・監視のためのWindowsシステムが存在する。
レベル2以下は、特殊な制御システム(デジタルや信号)を持つ機器が構成している。
ICS Malware overview 2010 - 2022
2010年は最初のICSを標的としたマルウェアであるSTUXNET。
2011, 2012年はデータを盗むことを目的としたHavex, DuquとFlame, ACAD/Medre.A。
2015, 2016年はModular Designと呼ばれる小さい単位のモジュールが合わさって一つのマルウェアとなるBlackEnergy2, TrongateとPLC-Blaster, Industroyer。
2017年, 2018年はSIS(Strategic Information System)を標的としたモジュラ型のTRITONやICSを標的とした初めてのランサムウエアWannacry, Bad Rabbit, NotPetya, VPNFillter, Ryuk。
2019年はIT分野を標的としたEKANS, REVil, LockerGogaといったランサムウェア。
2022年は複数のことができるようなMultiple moduler designを採用したIncontroller/PIPEDREAMや、ウクライナを標的としたIndustroyer2といったマルウェアが存在した。
上記の概要をみると、4つに部分分けすることができた。
最初はデータ採取のために作成され、そこからモジュール型デザインになり、次にランサムウェアとしてWindowsが対象に展開しておき、今ではより複雑になって様々なモジュールを持っている。
ICSについてのマルウェアは複数のプロトコルに対応したものになってきている。
すなわち、上記から2つの目的、「データ収集」「工場の制御破壊」をもっていると考えられる。
より分類すると、WormはSTUXNETやHavexなどの拡散と情報収集に特化しており、RansomewareはHMIやIT/OTデバイスの特定のプロセスを見つけて暗号化し、工場のオペレーションを停止させることに特化している。Tookitは複数のスクリプトが書き込まれており、柔軟な攻撃をすることができる。
私達の経験から4つのことを知ってほしい。
PLCsやIEDsに影響を与えるマルウェアはとても少なく、殆どはWindowsに標的を絞っているということ。
マルウェアのソースコードを見ると、攻撃目標のIPアドレスや特徴がハードコードされているため、入ってくる前にIPアドレスや特徴を知られてしまっているということ。
PLCsは3つのモードがあり、物理的にボタンで操作する必要がある。実行モードであれば、マルウェアが制御する機会が少ないということ。
通常はHMIとPICとのやり取りは1対1や1対多のIPアドレスバインディングで展開されるため、PLC-blasterと呼ばれる攻撃手法のようにPLC感の接続を悪用するPLCプロキシ攻撃は機能しないということ。
攻撃者の攻撃シナリオ
Adversarial EmulationやBAS(Breach and Attack Simulation)とも呼ばれる。
MITRE ATT&CK for icsとTTPsをもとに攻撃者のシナリオを構築し、自動化したい。
現在ある侵入・攻撃エミュレーションツールは、既知の脅威やスキルを用いて脆弱性を自動で見つけるツールは、IT分野にはあるが、OTにはほとんど存在しない。ここで言うもの
Metasploit や isf のような人間の意思決定や手動での実行とは異なり、自動化に重点を置いたもののことをいっている。
OTの中ではOpen Sourceのものはあまりない。
Adversarial Emulation tools
Domain/Type | Commercial | Open source |
---|---|---|
IT | SafeBreach | APT Simulator |
AttackIQ | Atomic Red | |
XMCyber | Caldera | |
Cymulate | Infection Monkey | |
... | ... | |
OT | Otorio | ? |
ここでSTNUXNET, HAVEX, Industroyer, Trisis, Industroyer2, IncontrollerのOTへの攻撃をMITRE ATT&CKに当てはめてみると、4つの段階「発見、収集、操作、回避」があると考えた。
発見段階では、パケットのレスポンスをチェックしたり、特定の関数を実行してみたりすること。
TRITONはブロードキャストをしてデバイスを発見した。
収集段階では、パケットを収集してデータを取得する。
STUXNETは2週間で最大、最小速度を取得していた。
操作段階では、HMIでエラーやアラームを起動させたり、PLCの制御を失敗させたりして、デバイスを攻撃する。
IndustroyerはIEC-61850 を使用してデバイスを破壊していた。
回避段階では、ログやデータを消したり、不要なデータを残したり、PLCモードをチェックし、マルウェアが動作するようにする。
BlackEnergyはKillDisksでWindowsのデータを消したりしていた。
使用されている頻度の高いもの
Ranking | PLC Manufacturers | PLC Band Names | Protocols |
---|---|---|---|
1 | Siemens | Simatic | S7 |
2 | Rockwell Automation | Allen Brandley | Ethernet/IP |
3 | Mitsubishi Electric | Melsec | Melsec |
4 | Schneider Electric | Modicon | Modbus |
5 | Omron | Sysmac | Omron |
6 | Emerson Electric (GE) | RX3i & VersaMax (GE Fanuc) | DeltaV, modbus |
7 | Keyence | KV & V-8000 | Ethernet/IP, modbus |
8 | ABB (B&R Automation) | AC500 X20 & X90 | IEC61850 |
9 | Bosch | Rexroth ICL | CAN, modbus |
10 | Hitachi | EH & H | CODESYS, FL-NET PROTOCOL... |
上記のような産業用制御システムの攻撃を自動化するためにScarlet OTというものを作成している。多いプロトコルをサポートし、マルウェア的挙動を実現させたい。しかし、ロジックベースになるため、環境によりシステムのアーキテクチャなどが変わるため、人間のように経験上の意思決定や柔軟な攻撃が難しい。そのため、異なる攻撃を組み合わせたり、攻撃の途中に人間がコマンドを実行できるようにしたりといった汎用的なものにしたいと考えている。
セキュリティトレーニングや適切に守れているかのチェックに使用できればいいなと考えている。
現在は10個のプロトコルと23のテクニックがサポートされている。例としてTrisisの攻撃シナリオが存在する。
IEC 61850のGOOSEプロトコルを解析して、パケットの内容を書き換えてアラームを発生させたりするデモもあった。
Digital twinを作成することによって道の脆弱性を見つけたりすることができるため、できるようになりたい。
感想
普段産業用制御システムについての話を聞かないことや、身近ではないことで多くの知らない言葉等が出てきて調べているうちに色々と学ぶことができました。企業の方もセキュリティについてはしっかりと対策等はされているとは思うが、IT分野に比べるとOT分野はやはりまだ少ないだろうと考える。これからの技術がどのような影響を与えるのかはまだわからないが、ネットワークにつながるものであるので攻撃される機会が多くなってきていることが予想されるため、産業用制御システムのセキュリティについても急務で行う必要がありそうだなと思いました。
CA Tech Accel 参加記
2022年1月から2022年3月まで約3ヶ月間CA Tech Accelに参加してきました。
※この記事は個人的な感想や偏見が入っているため、理解して読んでいただけると幸いです。
CA Tech Accelとは
Cyber Agentが主催している育成型プログラムであり、今年度は24卒のエンジニア志望学生を対象にし、22卒のCyber Agent内定者の方々とチームを組んで成長しようといったものです。
今年度はBackend, Frontend, Game-Client, iOS, Android, MLDSといった6つの分類があり、合計11チームありました。
参加者の技術力は個人的にバラけているかなといった印象でした。
参加するにはCyber Agent内定者の方から認知してもらったり、推薦してもらう必要があると思います。 そのため、以上が達成できれば意欲があれば誰でも参加できると思います。
参加の経緯
今まで色々とセキュリティについて学んできましたが、プログラミング経験が本の写経や大学での授業だけであり、自分でプログラムを書いているといった気分ではなかったため、プログラミングが苦手でした。脆弱性診断をしている上でプログラムがどのように作られているのかや、自分での検証といったところなどで開発経験や実力が必要だとは思ってはいたのですが、なかなか手を出せずにいました。ただただ基本的な脆弱性を知っている頭でっかちなどになりたくないとも思ってました。そのため、プログラミングができるようになりたい。自分でプログラムを書いている気になりたい。といった技術力と自信を得たかった時にCA Tech Accelについて大学の先輩から教えていただいて、参加しようと思いました。
上記は今思うとこうだなって思っただけで、実際はインフラなどのミドルウェアみたいなものを作ってみたいけど、自分には実装力が足りないし、何をすればいいかわからないとか、クラウドなどのインフラ技術を触ってみたいといった曖昧な感じで「インフラエンジニア枠」で応募した気がします。
その時に実際に何に悩んでいるのかといったことが当時の私にはわかっていなかったと思います。
内容
Go
ちょうどCA Tech Accel開始と同時に並行してSecHack365をやっていたのでAPIをGoで描き始めました。
※SecHack365のことはそっちの参加記を書く予定なのでできたらそちらをみてください。
この時何もプロダクト開発をしたことがなくずっとどのようにすれば書けるかを本を買い漁ったり、QiitaやZennの記事を読み漁っていました。
最初はほとんど何かのコピペだったことを覚えています。この当時はプログラミングで公式ドキュメントを読むといった基本的で一番大事なことをやっていませんでした。全て記事や本から取ってきてエラーに苦しんでました。
APIはひと段落すると、次に私は実際にAPIを生やしたり作ったりしたいわけではないことに気づきました。
最初の自分が言っていたようにミドルウェアを作りたいのかな?と思いながらまずは、CLIなどのソフトウェア?を作ることにしました。
文字列を解析したり、それによって判断を変えたりと表面上ことをしたいのではなくいろんな処理に興味があることがわかったためGo言語の静的解析に取り組みました。コードを書いていく中でGoの標準パッケージの中身を読んだりして自分でやっとひとつ静的解析を作ることができました。この時、自分で作ったと言った自信ができたと思いました。標準パッケージを読みながらテストを書いて、実際にコードを走らせて出力を解析して作っていく。こんなプログラマーにとって当たり前のことがやっとできるようになりました。
自分が考えて作ったものをOSSがマージしてくれるととても嬉しいです。今後も多くのOSSに貢献していきたいと思いました。
ちょくちょく22卒の内定者の方々が講義を行なってくれてGoの標準パッケージについてやテストについて、ちょうどGo1.18のリリースの時期だったので1.18の新機能のこと、実際にこの関数はどこで使ったりするのかなどの実務的なことや実践的なことを教えてもらいました。他にも自分で作っているときに出た疑問点をSlackのtimesチャンネルに投下していました。
Goについてもまだまだだと思っているので色々なものを作りながらプログラミングの経験を積んだり、Goに限らず他の言語でも色々なことをしてみてプログラミング力をつけていきたいと思います。
Kubernetes
インフラについて興味を持ってはいましたが、実際には何も触ったことがなかったため、Kubernetesについては本当に何もわからない状態でした。
まず、「Kubernetes完全ガイド」を購入し、本を読んで基本的なリソースについて理解してからgithub上でKubernetesクラスタを一から作ってみるといったものが公開されていたため、それをやって基本的な構造について実際に手を動かしながら理解できました。まだ自分が使うところまでいけてはいないのでこれから何かサービス開発やサーバー設計をしたときに一緒に組み込みたいなって思ってます。
キャリア面
Cyber Agentの社員さんや22卒の内定者の方々からCyber Agentのことをたくさん教えていただきました。部署ごとの特徴や何をやっているかなどこのようなことを聞けるのはここだけだろうと思いました。色々なエンジニアの方とも喋って〇〇エンジニアはこんなことをするといった具体例などを知ることができ、視野が広がりました。
自分はセキュリティエンジニアの道しか考えていませんでしたが、この機会にプログラミングが苦手ではなくなったのでバックエンドエンジニアやSREに興味を持つようになりました。
実際に自分が作ったものを見ると嬉しいですし、何より楽しいと思うようになりました。加えてそのような開発や基盤構築をしているとセキュリティエンジニアとしても成長している気がします。
このように自分の将来のなりたいキャリア像なども浮かべることができるようになりました。
加えてインターンやそういったイベントのことも教えていただいて多くの会社のことを知ったりしてどの会社がどんなことをやっていて、何をしているか等の興味も出てきました。
これから多くのインターンに参加してその会社ごとの業務を知りながら、環境にもまれたりしながらどんどん技術力等を高めていきたいです。
おわりに
本当にこの3ヶ月ですごい成長したなって思っています。これも最初にCA Tech Accelを教えていくださった先輩と、近くて支えてくださったメンターさん、Cyber Agentについてやキャリアについて教えてくださった人事の方や関わったCyber Agentの社員さん本当にありがとうございました。この3ヶ月すごい楽しかったです。これからも色々なことに挑戦をしてみて成長していきたいと思います。この機会に知り合った方々とこれからもよろしくお願いします。
最後になりますが、ありがとうございました。またの機会があればよろしくお願いします。
2021年感想?
はじめに
多くの初体験と失敗をした一年。
アドベントカレンダーはやりきれなかったし、習慣化の日記も身につかなかった。 12月中にやると決めていたことも達成できなかった。
失敗を上げれば切がないほど出てくる気がする。成功したことはなんだろう。
イベントへの参加?チューターを行ったこと?
でも、去年はコロナ禍の大学であまり人と関わりを持てなかったが、今年は積極的にイベントに参加したことで多くの方の知り合えたと感じた。
今年で一番私が「やった!」と思えたのは脆弱性診断のバイトにありつけたこと。 未経験で、セキュリティについても深く理解できていない私でもとりあえず半年間がんばれている。 時々CTFをやったりしながらやはり調べるのが大事であると実感する。
私は今年が一番自分の中で情報技術の分野に踏み出した感がある。
多くのことに興味を持った年でもあった。 今までセキュリティしか見えていなかったが、実際にいろいろと経験してみて他に必要なことがたくさんでてきた。 Hardening Projectに参加して守る側を、OSCP Labで攻撃側を体験したことによってインフラ関係にも興味や関心がでてきた。 去年まで「ネットワークなんてやりたくない!」と言っていた自分はどこに言ってしまったのだろう。
今年は多くのことを「同時に」やりすぎてしまった・ いろんなものに同時に手を出しても全て中途半端で終わってしまい、結局なんのせいかも得られない。
今年の一番の教訓は時間配分や物事の取捨選択。 何をどの時間までに「やらなければならない」のか。そしてやらなければいけないことがあるのになぜ他のことに手を出してしまい、やらないのか。 このままないがしろにしていると大学を卒業できなくなるまで単位が危うくなってしまう。 そろそろいろいろと確認をしながら物事を勧めていく必要がある。
バイト
今年は長期で2つのバイトをやらせていただいた。 一つはMinecraftのModを書く仕事(環境構築等も) 初めてbatファイルを書いたりした。 「Windowsのcmd.exeクソ喰らえ!」と何回言いながらやっていたのかわからない。 もう殆ど顔を出していないが、まだ契約は続いている。
2つは脆弱性診断の仕事 社内LT会にも参加させていただき、様々なプラットフォームでの検証や診断、知識を学ばさせていただきました。 一度検証鯖だったけど、落としてしまうといった失敗をしてしまったのもありますが、楽しくやらせていただいてます。
脆弱性系
PortSwiggerのWeb Security Academyをやったり、TryHackMeや, HackTheBox, Offensive Security Labなど多くのペネトレーション系のこともやった。 いろいろとやったが、実際に自分ができるようになったとはまだ到底思えない。 脆弱性の検証にも乏しく、ほとんど自分の環境で試すことができなかった。
SecHack365
SecHack365に参加して今まで実際のところSecHackをやっていなかった。 せめてやっていたのは習慣化だけであるが、それも途中で投げ出してしまった。 12月に入ってやっとこのプログラムに入っていることを実感した。 正直これから一生ハッカソンなんてやんないって心に決めていた。 これは自分にプログラミング能力がないからなのか、自分がチーム開発に向いていないからなのか。 正直どちらもありえるかもしれない。
今までハッカソンが好きな方やプログラミングが好きな方がすごいとずっと思ってきたが、かけるようになると楽しいのだろうか。 私もその領域までいけるのだろうか。おそらく「趣味」にならなければならないのだと思う。 今は何もかけないので楽しさもわからず、ただ苦痛なだけであるが、わかると楽しいのだと思っている。 実際に受験時期に高校数学が好きであったが、わかったから好きであったのだと最近思い始めてきた。 大学数学を学んで、何もわからずにやっている数学は楽しくない。 研究が向いていないのだろうか。これは再来年に研究が始まったときにわかることであるが、その時の自分がどうなっているのかはわからない。 今より成長していてほしいと願うばかりある。
VRChat
VRChatに入って1年経ったが、人見知りなのは変わりなく、初めてあった人に自分からあいさつするのが今でも苦手である。 実際自分からはしないというコミュ力のかけらもないかもしれない。人間としてよくないかもしれない。 でも、仲良くなった方とはこれからも良い関係を続けていきたい。 最近入る時間がお遅くなっており、その結果会えない方も多いので考えないとなと思ってる。 今年の最後にフルトラになることもできたが、これは今年の7月頃からずっとなるなる詐欺をしていたため、やっとかと自分でも思ってる。 そのときにお金があればすぐに買っていた...。 今年の最後にいい感じに閉めれそう。実家に帰っているので新年はフルトラでは迎えられないことは残念だけど、下宿先にワクワクしながら帰れるので来年お楽しみが増えたと思って帰ります!
来年
自分のやる分野を狭めよう。 人生計画を立てよう。 習慣化も徹底しよう。 資格を一つは取ろう。 セキュリティの知識を深めよう。 開発の経験をつけよう。
こう並べてみると多い気もするが、頑張りたい。 とりあえず短くていい。少しずつ始めていこう。 自分にあったペースでつづけていこうと思う。
最後に良いお年を。来年は今年より成長できますように。
Application Shimmingって何ぞや。
気になって夜しか眠れなかったので自分の備忘録として残しておく。
Application Shimとは
Microsoft Windows Application Compatibility Infrastructure/Framework (アプリケーションシム)は、コードを書き換えることなく、古いOSのアプリケーションに修正プログラムを適用させ、新しいOSで動作することができるようにできる。そのためアプリケーションの挙動をどのように行うかをOSに伝えることができるのがShimの特徴。
※例:WindowsXP用に開発されたアプリケーションをWindows10で動作させる。
シムがない状態の場合、以下の図のようにアプリケーションがWindowsと直接やり取りをする。
シムを用いると以下の図のようにアプリケーションはWindowsとの直接やり取りをやめ、間にはいり、シムに書かれているコードによってWindowsに対してリクエストを投げたり、レスポンスを得るといった挙動をする。
これはリンクの性質を利用してWindowsからAPIコールを代替コードであるShimにリダイレクトする。以下の図のように外部バイナリファイルへの呼び出しはImport Address Tableと呼ばれるAPIエンドポイントへのアドレスが記載されているルックアップテーブルを介して行う。
シムを用いることで以下の図のようにインポートテーブルで解決されたWindows関数のアドレスを修正し、それを代替シムコード内の関数へのポインタに置き換えることができる。
Import Tableからのリダイレクトはアプリケーションのロード時に静的にリンクされた.dllファイルに対して行う。GetProcAddress APIをフックすることで、動的にリンクされた.dllファイルをシム化することも可能。 実際にプログラムが実行されると、シムキャッシュが参照され、プログラムがシムデータベースを使用するか確認される。
以上のように簡単に言えばApllicationを実行する際に、Windowsのバージョンを関係なしにすることができるということである。
Application Shimming Attack
上記に説明したApplication ShimのAPIをフックする対象を変更することでマルウェアの永続化や任意コード実行、権限昇格等ができるようになる。
しかし、バイナリを読み込む際にシムエンジンを実行して適切な修正プログラムを適用するためにシムデータベースと呼ばれるものをチェックする。
マルウェアの攻撃の一般的なアプローチは単純にsdbinst.exeを実行して悪意あるsdbファイルを指定する方法がある。
通常はシムはユーザモードで実行するように設計されており、不正なシムを任意にインストールできないように管理者権限を必要とするが、特定のシムを利用するとアカウント制御のバイパスやDLL injection、Disable NX, SEHやメモリアドレスの閲覧が可能になる。
参考文献
https://attack.mitre.org/techniques/T1546/011/
https://techcommunity.microsoft.com/t5/ask-the-performance-team/demystifying-shims-or-using-the-app-compat-toolkit-to-make-your/ba-p/374947
https://www.elastic.co/jp/blog/ten-process-injection-techniques-technical-survey-common-and-trending-process
電子メールについて
以下電子メールのことをメールと呼ぶ。
メールのすべてのデータはテキストデータとして送信する。
今まではプレーンテキストのみであったが、MIMEによりメール内容の文字修飾やファイルの添付などが可能。
以下の図ではメールの配送についてまとめた。 ※アイコンはさくらネットワーク株式会社様より。
実際にメールサーバーを構築する場合は、図のように送信メールサーバー(SMTPサーバー)と受信メールサーバー(POP/IMAPサーバー)の構築が必要になる。
ここでプロトコルやサーバについて少し。以下3つは応用層のプロトコルである。
SMTP
Simple Mail Transfer Protocolすなわち簡易メール転送プロトコル。
通常ポート番号は25, 587であり、SSL/TLSを用いると追加で465の場合もある。
DNSのMXレコードを用いて送信先サーバを特定する。
図にもあったようにメールサーバ間の転送だけでなくメーラからの送信にも用いられる。
サーバとクライアントの役割が明確に分類されている。
以下はRFC5321より
対話型でコマンドやその応答、メールがやりとりできる。
受信側でもSMTPを用いてもよいが、受信側でメッセージをキューイングする機能が限られているため以下の2つのプロトコルと組み合わせて使用する。
POP3
Post Office Protocolすなわちメール取得プロトコル。
通常ポート番号は110でありSSL/TSLを用いると追加で995の場合もある
SMTPと同様対話型でコマンドやその応答、メールの取得や消去ができる。
POP3は通常ユーザ側にメールなどをダウンロードし、メールサーバには残さないため、個人利用で用いられる際に使われている。
IMAP
Internet Message Access Protocolすなわちメール操作プロトコル。
通常ポート番号は143でありSSL/TSLを用いると追加で993の場合もある
SMTPと同様対話型でコマンドやその応答、メールの取得や消去ができる。
POP3とは違い、メールをメールサーバに保存したまま管理することにより複数のコンピュータで管理することができる。
参考文献
https://centossrv.com/postfix.shtml
https://www.amazon.co.jp/dp/4274219895/ref=cm_sw_r_tw_dp_8Z9VMZGZXYGZP3TYBCFR
https://tex2e.github.io/rfc-translater/html/rfc5321.html