404CTF - Vaut mieux sécuriser que guérir
Description
Lors d’une compétition de lancer de poids, un athlète laisse son ordinateur allumé avec sa session ouverte. Cependant, une personne a utilisé son ordinateur et, a vraisemblablement fait des cachotteries. Nous vous mettons à disposition le dump de la RAM de l’ordinateur après l’incident.
Investiguez ce dump mémoire pour comprendre ce qu’il s’est passé.
La deuxième partie du flag est le nom d’une certaine tâche.
Les deux parties sont séparées d’un tiret “-”. Par exemple si le flag de la première partie est “flag1” et celui de la deuxième partie est “flag2”. Le réel flag du challenge sera 404CTF{flag1-flag2}
Premiers pas
Après avoir dézippé le dump, j’ai utilisé volatility
afin de commencer une reconnaissance basique.
Les Process
Rien de très fameux, on note que l’explorer est ouvert et PowerShell a été lancé :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
Name Pid PPid Thds Hnds Time
-------------------------------------------------- ------ ------ ------ ------ ----
0xffffd50ebabff080:winlogon.exe 516 444 3 0 2024-03-12 09:57:36 UTC+0000
. 0xffffd50ebb026580:fontdrvhost.ex 680 516 5 0 2024-03-12 09:57:37 UTC+0000
. 0xffffd50ebb10c080:dwm.exe 860 516 13 0 2024-03-12 09:57:37 UTC+0000
. 0xffffd50ebb93e580:userinit.exe 2968 516 0 ------ 2024-03-12 08:58:11 UTC+0000
.. 0xffffd50ebb940580:explorer.exe 2528 2968 61 0 2024-03-12 08:58:11 UTC+0000
... 0xffffd50ebba91580:unregmp2.exe 3668 2528 0 ------ 2024-03-12 08:58:15 UTC+0000
... 0xffffd50eb9b7a580:OneDriveSetup. 4736 2528 0 ------ 2024-03-12 09:00:13 UTC+0000
... 0xffffd50ebb9f4580:ie4uinit.exe 3452 2528 0 ------ 2024-03-12 08:58:14 UTC+0000
... 0xffffd50eb9707080:powershell.exe 4852 2528 13 0 2024-03-12 09:07:46 UTC+0000
.... 0xffffd50ebbd88580:conhost.exe 4544 4852 4 0 2024-03-12 09:07:46 UTC+0000
... 0xffffd50eba11d580:fsquirt.exe 4612 2528 0 ------ 2024-03-12 09:00:02 UTC+0000
... 0xffffd50ebb9f1580:unregmp2.exe 3432 2528 0 ------ 2024-03-12 08:58:14 UTC+0000
... 0xffffd50eb9aef580:MSASCuiL.exe 5512 2528 1 0 2024-03-12 09:00:12 UTC+0000
... 0xffffd50ebb972300:FirstLogonAnim 1012 2528 0 ------ 2024-03-12 08:58:11 UTC+0000
|
Je m’en vais donc chercher le fichier suivant : “ConsoleHost_History.txt”
1
2
3
4
5
6
7
8
9
10
11
12
|
klm@KLM:~/CTFs/40424$ python3 /home/klm/Utils/Forensic/volatility3/vol.py -f memory.dmp windows.filescan | grep ConsoleHost_history
0xd50ebb98a080.0\Users\Maison\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadline\ConsoleHost_history.txt 216
klm@KLM:~/CTFs/40424$ python3 /home/klm/Utils/Forensic/volatility3/vol.py -f memory.dmp windows.dumpfiles --virtaddr 0xd50ebb98a080
Volatility 3 Framework 2.5.0
Progress: 100.00 PDB scanning finished
Cache FileObject FileName Result
DataSectionObject 0xd50ebb98a080 ConsoleHost_history.txt file.0xd50ebb98a080.0xd50eb945d010.DataSectionObject.ConsoleHost_history.txt.dat
klm@KLM:~/CTFs/40424$ cat file.0xd50ebb98a080.0xd50eb945d010.DataSectionObject.ConsoleHost_history.txt.dat
rm hacked.ps1
|
Tiens tiens tiens.
Petit strings des familles :
1
2
3
4
5
6
7
8
9
|
klm@KLM:~/CTFs/40424$ strings memory.dmp | grep -Fi "hacked.ps1"
"C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" .\hacked.ps1
\hacked.ps1
powershell .\hacked.ps1
rm hacked.ps1
wsPowerShell\v1.0\powershell.exe" .\hacked.ps1
GET /hacked.ps1 HTTP/1.1
"C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" .\hacked.ps1
"C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" .\hacked.ps1
|
Ce qui nous intéresse ici c’est le GET /hacked.ps1 HTTP/1.1
Récupérer un fichier supprimé ?
J’ai passé une petite heure à essayer de récupérer le script sans succès. En passant par la table MFT, scrollant à l’infini dans HxD sans rien trouver jusqu’à ce que je me demande si c’était possible de récupérer les paquets HTTP du dump.
J’ai donc trouvé un super plugin : https://github.com/Memoryforensics/carve_packets
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
|
klm@KLM:~/CTFs/40424$ python2.7 /home/klm/Utils/Forensic/volatility/vol.py --plugins=/home/klm/CTFs/40424 -f memory.dmp --profile=Win10x64_17134 networkpackets --dump-dir .
Volatility Foundation Volatility Framework 2.6.1
*** Failed to import volatility.plugins.crypto.solvecrypto1 (ImportError: No module named crypto.solvecrypto1)
Network analysis of carved packets:
Number of carved packets
------------------------
514
Potential local interfaces used by analyzed system
--------------------------------------------------
10.0.2.15 with mac No ARP resolves seen
Potential gateways used by analyzed system
------------------------------------------
No ARP resolves <-> 52:54:00:12:35:02
ARP resolves Number of packets
-------------------------------------- -----------------
10.43.0.1 is at 26:ea:19:79:96:00 18
10.42.13.116 is at f4:7b:09:0b:a4:00 2
10.42.25.179 is at c8:cb:9e:7a:5a:49 2
10.42.39.245 is at 54:14:f3:c6:89:f0 2
10.42.34.244 is at 8c:55:4a:1f:73:ef 1
10.42.18.210 is at c4:bd:e5:a2:49:28 1
10.43.0.13 is at 08:00:27:a1:e0:61 1
Public IP src or dst Number of packets Source ports < 1024 Destination ports < 1024 Total bytes Minimum packet size Maximum packet size Average packet size
-------------------- ----------------- ------------------- ------------------------ ------------ ------------------- ------------------- -------------------
2.21.35.225 210 443 27878 40 674 132
2.21.35.217 100 443 121301 40 1500 1213
20.111.58.202 32 443 8269 40 1500 258
88.221.83.184 28 443 6315 40 1500 225
20.103.156.88 18 443 7391 40 1500 410
20.234.120.54 16 443 6945 40 1500 434
2.21.35.241 9 443 453 40 71 50
8.8.8.8 3 53 569 174 203 189
172.64.149.23 2 80 80 40 40 40
152.199.19.161 2 443 80 40 40 40
192.229.221.95 2 80 80 40 40 40
104.18.38.233 2 80 80 40 40 40
2.21.225.223 2 80 80 40 40 40
52.113.194.132 1 443 40 40 40 40
|
On obtient alors un fichier appelé packets.pcap
, on sort les objets HTTP directement sans même regarder et on tombe sur :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
# | ___ _ _ _ # ,d88b.d88b #
# Title : Wallpaper-Troll | |_ _| __ _ _ __ ___ | | __ _ | | __ ___ | |__ _ _ # 88888888888 #
# Author : I am Jakoby | | | / _` | | '_ ` _ \ _ | | / _` | | |/ / / _ \ | '_ \ | | | |# `Y8888888Y' #
# Version : 1.0 | | | | (_| | | | | | | | | |_| | | (_| | | < | (_) | | |_) | | |_| |# `Y888Y' #
# Category : Prank | |___| \__,_| |_| |_| |_| \___/ \__,_| |_|\_\ \___/ |_.__/ \__, |# `Y' #
# Target : Windows 10,11 | |___/ # /\/|_ __/\\ #
# Mode : HID | |\__/,| (`\ # / -\ /- ~\ #
# | My crime is that of curiosity |_ _ |.--.) )# \ = Y =T_ = / #
# | and yea curiosity killed the cat ( T ) / # Luther )==*(` `) ~ \ Hobo #
# | but satisfaction brought him back (((^_(((/(((_/ # / \ / \ #
#__________________________________|_________________________________________________________________________# | | ) ~ ( #
# # / \ / ~ \ #
# github.com/I-Am-Jakoby # \ / \~ ~/ #
# twitter.com/I_Am_Jakoby # /\_/\_/\__ _/_/\_/\__~__/_/\_/\_/\_/\_/\_#
# instagram.com/i_am_jakoby # | | | | ) ) | | | (( | | | | | |#
# youtube.com/c/IamJakoby # | | | |( ( | | | \\ | | | | | |#
############################################################################################################################################################
|
On cherche un peu et on retrouver le nom de la tâche (A.K.A Flag2) :
Register-ScheduledTask -Action $Action -Trigger $Trigger -TaskName "XXX"
Puis je lis le code jusqu’à identifier du base 64 dans un champ, je décode :
1
2
|
klm@KLM:~/CTFs/40424$ echo "e1ByQG5rM2Qt" | base64 -d
{XXXXXX
|
On a donc désormais le flag complet : 404CTF{XXXXXXXXX}
Super chall, j’ai découvert pas mal de nouvelles choses, j’avoue que je suis plutôt de niveau moyen en forensique.
~K.L.M