はまやんはまやんはまやん

hamayanhamayan's blog

Boot2Rootまとめ [HackTheBox,TryHackMe,入門]

はじめに

HackTheBox、TryHackMe、OSCPの勉強をしていてまとめていたBoot2Rootについてのナレッジをまとめていくことにした。
俗にいう一般イメージ的なハッキングというか、ハッキングされてランサムウェア被害が…みたいな過程を味わえるのがこの分野の問題になっている。

普通の環境に対してこれから紹介する知識を使ったら犯罪なので注意。
何を言われているかよくわからない人は見ないほうがいいです。
レッドチーム向けに役立つとは思うけれど、こんなまとめを見ないでちゃんとした資料で勉強した方がいいです。

Boot2Root

Boot2Rootでは、一般的には以下のような問題が出る。

脆弱な端末が提示され、その端末の管理者権限でのシェルを奪取せよ

問題文として提示されるのは攻撃先端末のIPアドレスだけである。(問題によっては追加情報があったりするけど)
なので、競技者はこのIPアドレスにアクセスをして、どういったサービスが動いているか、どういった脆弱性が存在するかというのをゼロから探索していくことになる。

ゴールについて

どうやって管理者権限を奪取したかを示すかであるが、CTFと同様に管理者しかアクセスできない所に「フラグ」が置いてあることが多い。
WindowsであればC:\Users\Administrator\Desktop\root.txtLinuxであれば/root/root.txtのような感じで置かれているので、これを提出すれば問題クリアとなる。
便宜上、ルートフラグと呼ぶことにする。

多くの問題ではチェックポイントとして、ユーザーフラグというものもある。
これは、ユーザー権限でのシェル奪取が成功したときに手に入るフラグである。
WindowsであればC:\Users\[任意ユーザー]\Desktop\user.txtLinuxであれば/home/[任意ユーザー]/user.txtのような感じで置かれている。
(所説ありそうですが、シェル奪取/獲得というのは、コマンドプロンプトとかbashみたいな雰囲気でコマンド実行できる状態を確保することを指します)

これ以外にも問題によっては攻撃の過程で手に入る情報について細かく回答したり、
フラグが3個以上あったり、特殊な場所にフラグが置いてあるものもあるが、特に断りが無ければ、↑のような形式を想定していればよい。

初学者に向けて

Boot2Rootに初めて取組む場合は、手取り足取り教えてくれる記事や文献を参考にしながら始めていくのがいい。
(というかそれしかなさそう)
あと問題に取り組む前に色々設定しなきゃいけなかったりするので、その辺も参考にすること。
「Boot2Root入門」と銘打っておきながら、この辺の手取り足取りは他に優れた記事が多数あるので、
そちらを参考にしてほしい。

プラットフォームについて

とりあえず3つ挙げておく。

  1. TryHackMe (https://tryhackme.com/) 超オススメ。ステップバイステップのものもあるので、初学者はここからが良い
  2. HackTheBox (https://www.hackthebox.eu/) オススメ。ちょっと前まで崖から突き落として這い上がってきた者限定サイトだったが、最近は学習教材もある
  3. VulnHub (https://www.vulnhub.com/) やや古く自分で環境を立ち上げる必要もあるので、初手ではオススメしない

ほかにもそれっぽいものがいくつかあるが、入門向けの本記事で扱う感じではないと思うので、とりあえず上の1,2をやるといい。3はちょっと微妙かも。

具体的な流れについて

さて、つらつら書いたが、これだけ聞いても想像が難しいかもとも思う。
実際に解く場合の流れについて、実例を以下に上げておく。

https://blog.hamayanhamayan.com/entry/2021/05/13/223627 を例にしています。ネタバレ有り注意)

  1. 謎のIPアドレスが与えられる
  2. 何が動いているかも分からないのでnmapでポートスキャンをして、何のポートが開いているか特定する
  3. ポート80が開いていて、見てみるとweb server(apache2)が動いていた。
  4. dirbusterでディレクトリスキャンをして、web serverで何が動いているか確認する
  5. /simpleというディレクトリが見つかり、CMS Made Simple version 2.2.8が動いていることが分かった
  6. このCMSには脆弱性CVE-2019-9053が報告されており、この脆弱性を利用するとCMSの管理者パスワードが特定できた
  7. CMSにログインするととあるユーザー名も特定できる
  8. 6で特定したパスワードは使いまわされており、このパスワードと7で得たユーザー名でssh接続すると成功
  9. /home/mitch/user.txtにユーザーフラグがある
  10. sudo -lをしてこのユーザーがsudoを通じて実行可能なものを確認する
  11. sudoを使えばroot権限でvimが動かせることが分かったので vim | GTFOBins を参考にして、これを悪用してvimからシェルを起動する。vimは管理者権限で動かせているので、そこから起動できるシェルもroot権限を持つ
  12. root権限のシェルが獲得できたので /root/root.txt が確認でき、これがルートフラグ

これを読んですんなり理解できるならば、かなり素養があるというか、周辺知識が豊富だと思う。
かなり抽象的に説明をすると、「ひたすら探索」→「脆弱点を攻撃」を繰り返して、現状よりもより上位の権限を奪取していくのが基本方針となる。
最初は、サーバーを利用するユーザーとしての権限しかない状態であるが、そこから得られる情報を探索し、脆弱点が見つかるとそれを悪用して別のユーザーが利用可能になる。
別のユーザーが利用可能になることで認可範囲も増えるのでさらに広い範囲で情報探索ができるようになる。
さらに広い範囲で情報探索をすると、新しく脆弱点が発見でき、さらに別のユーザーが利用可能に…ということを繰り返して最終的にはルート権限を得る。
上の実例をちょっとだけ抽象化すると、以下のようになる。

「どういうサービスが動いているか探索」手順1~5
→ 「脆弱点を突いて、ユーザーシェルを獲得する(ユーザーフラグ獲得)」 手順6~9
→ 「使えるようになったユーザーで何ができるか探索」手順10
→ 「脆弱点を突いて、ルートシェルを獲得する(ルートフラグ獲得)」手順11~12

これを繰り返すことでユーザーシェルを獲得したり、ルートシェルを獲得していくことになる。

より体系的/発展的な話

これ以降はより体系的な話、もしくは、より発展的な話をすることにする。
Boot2Rootについてなんとなく理解できていることを前提として進めるので注意。

より強くなるには

  • Boot2Rootはひたすら『探索』->『脆弱点をついて水平/垂直移動』を繰り返すゲームである
    • 必要とされる概念自体はそれほど多くはないが、サービスは無限にあるのでそれらすべてに対応する必要がある
    • おそらく出題側も完璧な知識は要求しておらず、見慣れぬサービスを見つけたら適切に検索して攻撃することが大切
  • 攻撃の過程でCTFの1部分が要求されることがある
    • 特にユーザーシェルを獲得するためにweb serverが起点になることは多く、Webカテゴリが得意であれば多少有利に働くこともあると思う
    • だが、普通にpwnも出るし、revも出るし、たまにcryptoも出る。forensicsもそう。
  • 根気と自動化
    • 根気よくひたすら基本の列挙をしていくのが重要な気がする
    • 抜け漏れと時間短縮のため、ある種の自動化をしていくのもオススメ
  • 最新技法のキャッチアップ
    • 流行っている最新の攻撃方法を使うような問題がタイムリーに出たりする
    • 難しい問題だとパッチが当たりきっているWindowsウイルス対策がかかっているみたいな状況もあり、対策されていないウイルス対策回避を自ら行うか、Twitterで適用に拾ってきた最新手法を適用してみたりすると攻撃が通ったりする
  • Rabbit Holeについて
    • Rabbit Holeというワードを見かけることがあるかもしれないが、これは出題者が置いた攻略には関係ない要素のことを指す
    • つまり、脆弱な点を探しても見つからない、囮のような部分になる
    • 明らかに怪しいものであっても意図的に置かれたRabbit Holeである可能性があるので、1点にこだわるのではなく、網羅的に探索を行うようにしよう

『探索』について

先ほど書いたようにBoot2Rootでは『探索』->『脆弱点をついて水平/垂直移動』を
繰り返すので脆弱点を付くのはもちろんだが、探索の質も要求される。
機械的にもれなく探索することが要求されるのはもちろんだが、時には攻撃者の気持ちになって探索的に探索を行うことも重要になる。

探索のメソッドの1つはスキャンである。 リクエストを飛ばし、その応答によって環境を把握する。

  • ポートスキャン
    • TCP/UDPでポートスキャンをしてサーバがどのようなポートを開けているか確認する。初手で確認するスキャン
    • どのようなサーバも何かを送ることができなければ攻撃できず、逆に、何かを送れるということはそこが攻撃点である可能性がある
    • ここで見つかったサービスに対して更なるスキャンを実施していく
  • 辞書を使ったスキャン
    • 「辞書」については後でセクションを用意するが、辞書を使ったスキャニングが求められる
    • ディレクトリスキャン: HTTP系サービスが動いているときにディレクトリ、ファイルパスを辞書を使ってスキャンすることで使えるエンドポイントが無いかを探す
    • パラメタスキャン: これも特にHTTP系サービスにおいて、普段は使われていない未知のパラメタを発見することを期待してスキャンをかける
    • サブドメインスキャン: これもよくあるのだが、ドメインが明示されているとき(エスパーのときもあるが)にサブドメインを列挙して、挙動が変わらないかを確認する
  • 脆弱性を狙ったスキャン
    • sqlmapのような脆弱性があるかどうかを確かめるスキャナーもある
  • 他にもサービス毎に固有のスキャン方法がある
    • WordPressが動いていたらwpscanを使ってみるといった感じで星の数ほどある
    • 少しニュアンスは違うかもしれないが、シェルを獲得した後にはlinpeasやwinpeasのようなスクリプトを使って環境をスキャンしたりする。これはリクエストを飛ばすというより設定ファイルを確認してくれるようなものだが、ネットワーク通信を介在しないだけで、あまりやっていることは変わらない
  • スキャンの範疇で語っていいかわからないが、ユーザー名を使った辞書攻撃をしてユーザー名を特定していく手法もある

他にもOSINTで情報を得る場合もある。
例えばポート443で会社のホームページがホスティングされていて社員紹介のページがあれば、
ユーザー名がそこから類推可能かもしれない。

悪用される『脆弱点』について

  • 脆弱性
  • 脆弱な設定を突いたり、認可が最小化されていない
    • 権限昇格時に多いかも
    • 重要なファイルがpublicになっていたり
  • 人間的な脆さを利用

と簡単に書いてしまったが、本当に色々ある。
網羅的に見たい場合はMITRE ATT&CKみたいなマジなやつを見たほうがいい。
この記事にぶら下げる子記事で紹介されるようなことはほぼほぼ脆弱点にまつわることだと思う。

横展開、もしくは、権限昇格をいかに行うか

(このセクション、用語の使い方がおかしい可能性あります)

水平移動、垂直移動とも言ったりする。
シェルを獲得した後に 水平も垂直もメソッド的にはそれほど違いはなく、単にどのユーザーに移るかによって言い方が変わる印象

  • 横展開, 水平移動, Lateral Movement, Pivoting
    • 一般ユーザーの権限を使って、他の一般ユーザーの権限を得ること
      • もしくは、侵害済みの端末を使って、他の端末のアクセス権限を得ること
    • 少し難しい問題だと、ユーザーシェルが手に入った後、権限昇格するために一旦他のユーザー権限を得る必要があるかも
    • 複数端末の問題もあり、その場合は侵害した端末から、さらに別の端末へアクセスをしたりする
  • 権限昇格, Priviledge Escalation, 垂直移動
    • root権限を取ること
    • 獲得したroot権限がdocker内のインスタンスでのroot権限だったりする。より上級の問題ではそこから、dockerをホストしている端末に対して権限昇格が必要だったりする
      • この動きを権限昇格と言ってしまっていいかわからないが、上位の権限を得ていることには変わりない気がする
      • だが、この手の移動はどちらかというとEscapingとかJailbreakみたいな言い方のほうが多い

移動方法については、基本的には以下の2通りのルートを使う。

  • とあるユーザー(例えばrootユーザー)の権限で動かしているプログラムに何とかしてRCEさせることで、そのユーザーの権限で特定プログラムを動かす
    • 特定プログラムと書いたが、1例として書くとリバースシェルを動かすことができれば、そのユーザーの権限で任意のコードを実行することができ、移動が完了する
  • とあるユーザーの認証情報が何らかの理由で漏洩し、ログインが可能になる
    • 認証情報がハードコーディングされていたりして、認証情報が漏れてしまう場合がある

『辞書』について

所感だがスキャンや辞書攻撃で使う辞書については、暗黙の了解というか結構みんな使っている辞書がある。
自分が使っている辞書について以下に書いておく。
以下の辞書を使っておけば大丈夫という訳ではないが、参考にしてほしい。

  • ディレクトリスキャン用辞書
    • /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt
    • /usr/share/dirb/wordlists/big.txt
    • /usr/share/SecLists/Discovery/Web-Content/raft-medium-directories-lowercase.txt
  • ユーザー名スキャン用辞書
    • /usr/share/seclists/Usernames/xato-net-10-million-usernames.txt
  • パスワードクラック用辞書
    • rockyou.txt
  • サブドメイン探索用辞書
    • /usr/share/seclists/Discovery/DNS/bitquark-subdomains-top100000.txt
  • パラメータ探索用辞書
    • /usr/share/SecLists/Discovery/Web-Content/burp-parameter-names.txt
  • たまにアドホックな辞書もある
    • サービスをもとに使える辞書を持ってきて使う
    • 規則性がある場合はそれをもとに作ったり、webサイトからキーワードを拾ってきて辞書にしたりすることもある

まとめ

まとめ…の前に

細かくまとめを書いていくが、サービスは無限にあって網羅性はあきらめている。
とりあえず手元にあるものを適当な粒度でまとめておいている感じなので、もっとたくさんまとめられている以下のようなサイトを参考にするか、
適当に[keyword] pentestとかで適宜検索しながら頑張るのがいい。

まとめ [WIP]

  • Boot2Rootにおけるスキャニングまとめ
  • Boot2RootにおけるActive Directory/Kerberos認証/LDAPまとめ
  • Boot2Rootにおける脆弱性調査まとめ
  • Boot2RootにおけるCMSまとめ
  • Boot2RootにおけるDocker/VMまとめ
  • Boot2RootにおけるCredentialsまとめ
  • Boot2Rootにおけるログイン総当たり
  • Boot2Rootにおける辞書攻撃まとめ
  • Boot2Rootにおけるアンチウイルス回避まとめ
  • Boot2RootにおけるExfiltrationまとめ
  • Boot2Rootにおけるポートスキャンとポート毎攻撃まとめ
  • Boot2RootにおけるLinux関連まとめ
  • Boot2Rootにおけるmetasploitまとめ
  • Boot2RootにおけるWindows関連まとめ [mimikatz]
  • Boot2RootにおけるPhishing関連まとめ
  • Boot2RootにおけるLateral Movementまとめ
  • Boot2RootにおけるPersistent/PostExploitまとめ
  • Boot2Rootにおけるリバースシェルまとめ
  • Boot2RootにおけるTunnelingまとめ

これに加えてCTFの各ジャンルで要求されることも頭に入れておく必要がある。
beginnerレベルにはどれも学習していますが、いつか全部かけるくらい極めたいですね…