🔰

Exploit.EducationでCTF入門:Nebula環境構築とLevel 00攻略

に公開

Exploit.Education は CTF とかの初心者向けのサイト.CTF 始めたいので自習する.

Nebula
Nebula covers a variety of simple and intermediate challenges that cover Linux privilege escalation, common scripting language issues, and file system race conditions.

Nebula is an ideal place to get started for people new to Linux exploitation.

とのことなので,Nebula から始めるが,環境構築が必要.

Nebula環境構築

Nebula をここからダウンロードする.

iso イメージなので実行には仮想環境が必要.自分は VMware を採用.

VMware インストール方法

既に iso イメージを動かせる仮想環境を持っている人は飛ばしてください

  1. VMware ダウンロードには Broadcom のアカウントが必要
  2. ログイン後,1. My Download を選択 2. Free Software Downloads available HERE を選択
  3. VMware を選択
  4. 好きなバージョンを選択してダウンロード,ウィザードに従ってインストール完了

VMware で Nebula 起動

  1. 新規仮想マシンを作成
  2. ウィザードで標準を選択
  3. インストーラディスクイメージでダウンロードしたイメージを選択
  4. 使用する OS で Linux, Ubuntu 選択
  5. あとはボタンポチポチで完成

問題00を解いてみる

解説ページ : https://exploit.education/nebula/

Getting started
Have a look at the levels available on the side bar, and log into the virtual machine as the username “levelXX” with a password of “levelXX” (without quotes), where XX is the level number. Some levels can be done purely remotely.

とのことなので,まずは level00 でログインしてみる.

入れた

問題

Level 00
This level requires you to find a Set User ID program that will run as the “flag00” account. You could also find this by carefully looking in top level directories in / for suspicious looking directories.

Alternatively, look at the find man page.
To access this level, log in as level00 with the password of level00.

とのこと.Set User ID program って何?って AI に聞いたら >>

「Set User ID プログラム」は、主に UNIX や Linux などのシステムにおける、SUID (Set User ID) ビットが設定された実行可能ファイルのことを指します。

これはファイルの特殊なパーミッション属性の一つで、このビットが設定されたプログラムを実行すると、そのプログラムは実行したユーザーの権限ではなく、ファイル所有者の権限で動作するという特徴があります。

🔑 Set User ID プログラムの主なポイント
動作権限の変更: 通常、プログラムは実行したユーザーの権限で動作しますが、SUIDが設定されていると、ファイル所有者の権限(多くの場合、rootユーザー)で動作します。

用途: 一般ユーザーが通常の権限では実行できない、システム管理に必要な特定の操作(例:パスワードの変更を行うpasswdコマンドなど)を一時的に高い権限で行うために使用されます。

セキュリティリスク: 高い権限で動作するため、もしそのプログラムに脆弱性があった場合、悪用されるとシステム全体に深刻なセキュリティリスクをもたらす可能性があります。そのため、SUIDを設定するファイルは慎重に選ぶ必要があります。

つまり「 "flag00" の権限で動く SUID を設定されているファイルを探せ!」とのことらしい.問題文によれば find コマンドを使えとのことなので,AI にどうやって find で見つけるか聞いてみる >>

SUID プログラムは、ファイルの所有者の権限で動作するため、検索の条件として「SUID ビットが設定されていること」と「所有者が flag00 であること」の2つを指定します。


🔎 find コマンドによる検索方法

以下のコマンドを実行すると、ルートディレクトリ (/) 以下にある、SUID ビットが設定されており、かつ flag00 ユーザーが所有するすべてのファイルがリストアップされます。

find / -user flag00 -perm -4000 -type f 2>/dev/null
オプション 意味
find / ルートディレクトリ (/) から検索を開始します。
-user flag00 ファイルの所有者flag00 であることを指定します。
-perm -4000 SUID ビット (4000) が設定されているファイルを見つけます。
-type f レギュラーファイル (実行可能なプログラムなど) のみを検索対象とします。
2>/dev/null 検索中にアクセス権限がないディレクトリで発生する「Permission denied」などのエラーメッセージを非表示にします。

📝 検索結果の確認方法

単にファイルパスをリストアップするだけでなく、パーミッションの詳細情報も確認したい場合は、-exec オプションを追加して ls -l コマンドを実行します。

find / -user flag00 -perm -4000 -type f -exec ls -l {} \; 2>/dev/null

このコマンドの出力で、所有者のパーミッション部分が rws のように s になっていることを確認できます。

ということで find を実行してみる.

一見得られた find の出力が省略されて (/bin/.../flag00) いて,完全なパスを得られていないように見えるが,普通 find は出力を省略することはない.これはもしかして隠しディレクトリ ... なのか?

本当に隠しディレクトリ ... だった.ということで /bin/.../flag00 をそのまま実行すればよい.

この問題の学び

  • SUID program (Set User ID program) とは,作成したユーザーの権限で実行されるプログラムである.
  • SUID は脆弱性になりうる.
  • SUID program を探すには,
    find / -perm -4000 -type f 2>/dev/null
    
    のように find を使用するとよい.

Python を使う

ssh で入る

直接ターミナルを叩くのではなく,代わりに Python を用いてバイナリ・エクスプロイテーションできる.

まずは仮想マシンの外部から ssh でアクセスできるか確かめよう.

私は Windows + VMware + WSL2 という構成なので,VMware の環境に WSL2 からアクセスすることを目指す.これらはすべて同じネットワーク内部にいるので,NAT,ポートフォワーディングを設定する必要はない.

get ip addr
まず ip アドレスを知る必要がある.VMware の仮想マシンには,ルーター役をしてくれるホスト OS が DHCP で動的に ip アドレスを割り当てている.そこで ip addr コマンドを実行して自身のアドレスを明らかにする.


eth0 の inet ... がアドレス

結果,ip アドレスは 192.168.126.128 であった.すなわち,192.168.126.128 に呼びかければ sshd が生きていれば返答してくれる.確認 (service ssh status) したところ生きているようだ.

ssh
WSL2から ssh 接続で試してみる.今回はパスワード接続なのが明らかなので,

ssh -o PreferredAuthentications=password level00@192.168.126.128

でよい.

結果・・・

入れた.

Python で pwn

pwntools が一般的らしい.ということで仮想環境を作成し,pwntools をインストールする.

$ python -m venv v
$ pip install pwntools

pwntools の使い方は以下の通り.

from pwn import *

CRED = 'level00'
HOST = '192.168.126.128'
PORT = 22

shell = ssh(CRED, HOST, password=CRED, port=PORT)
proc = shell.process(b'/bin/.../flag00')
proc.sendline(b'getflag')
proc.interactive()

これを実行すると getflag できる.今後は Python で解いていく所存.[完]


メモ: VMnet1, VMnet8

VMnet1

ホストオンリー接続

  • 仮想マシンとホスト OS の間だけで通信できるネットワーク
  • NAT接続はしないので,設定できない

VMnet8

NAT(Network Address Translation)接続専用の仮想スイッチ

  • 通信範囲 : 仮想マシン,ホストOS,外部ネットをつなぐ仮想プライベートネットワーク
  • ホスト OS がルーターの役目を果たして外部ネットとつなげる

VMnet8 の NAT 設定でできること

  1. ポートフォワーディングの定義
    • 外部ネットからの通信をホスト OS が受け取った時,それを指定された仮想マシンの IP addr とポートに転送するルールを設定できる
  2. VMnet8 のサブネット・DHCPのカスタム
  3. NAT IP addr の確認・変更
    • 仮想マシンから外部への通信時に出口となる NAT デバイス(仮想ルーター)の IP addr を確認できる

Discussion