/ SHA2017CTF

SHA2017 CTF - Compromised? (Forensics 100)

Description : We think our system got compromised, our hosting company uses some strange logtool. Are you able to dig into the logfile and find out if we are compromised?

Dans ce challenge on télécharge le fichier et on obtient un fichier .scap. Pour l'analyser on a utilisé sysdig un outil permettant de capturer l'état et l'activité du système à partir d'une instance Linux en cours d'exécution, puis d'enregistrer, filtrer et l'analyser.

On commence donc par analyser les process utilisés. On se retrouve avec le résultat suivant :

sysdig -r FOR100.scap -c topprocs_net
>Bytes               Process             PID                 
--------------------------------------------------------------------------------
807.48KB            [crypto]            1660
3.14KB              sshd                1700
3.14KB              sshd                1667
3.14KB              sshd                1628
3.14KB              sshd                1595
3.05KB              sshd                1522
3.05KB              sshd                1523
3.05KB              sshd                1525
3.05KB              sshd                1515

On regarde ensuite les connexions :

sysdig -r FOR100.scap -c topconns
>Bytes               Proto               Conn                
--------------------------------------------------------------------------------
807.48KB            tcp                 10.0.2.6:37210->10.0.2.15:4444
5.10KB              tcp                 10.0.2.15:51616->10.0.2.6:22
4.86KB              tcp                 10.0.2.15:51618->10.0.2.6:22
4.81KB              tcp                 10.0.2.15:51624->10.0.2.6:22
4.81KB              tcp                 10.0.2.15:51622->10.0.2.6:22
3.12KB              tcp                 10.0.2.15:51548->10.0.2.6:22
3.12KB              tcp                 10.0.2.15:51552->10.0.2.6:22
3.12KB              tcp                 10.0.2.15:51550->10.0.2.6:22
3.12KB              tcp                 10.0.2.15:51556->10.0.2.6:22
3.12KB              tcp                 10.0.2.15:51572->10.0.2.6:22
3.12KB              tcp                 10.0.2.15:51544->10.0.2.6:22
3.12KB              tcp                 10.0.2.15:51558->10.0.2.6:22
3.12KB              tcp                 10.0.2.15:51574->10.0.2.6:22
3.12KB              tcp                 10.0.2.15:51554->10.0.2.6:22

En dehors des connexions ssh on remarque qu'il y a eu beaucoup de traffic entre le serveur et une machine écoutant sur le port 4444, cela ressemble à un reverse shell.

Une autre commande permet d'espionner les commandes entrées par l'utilisateur. Parmis les retour on se rend compte d'une connexion user exécutant des commandes intéressantes :

sysdig -r FOR100.scap -c spy_users
>1658 12:27:58 user) chmod +x /tmp/[crypto]
 1658 12:27:58 user) /tmp/[crypto] 
   1658 12:28:12 user) /bin/sh -c /bin/sh
      1658 12:28:12 user) /bin/sh 
         1658 12:28:14 user) ls 

Il semblerait que user ai rendu exécutable un fichier puis l'ai lancé.
On va ensuite voir le contenu de /tmp (endroit dans lequel se trouvait le script :

sysdig -r FOR100.scap evt.type=open and fd.name contains /tmp
> 138880 12:27:44.097218197 0 scp (1625) < open fd=3(<f>/tmp/[crypto]) name=/tmp//[crypto] flags=6(O_CREAT|O_WRONLY) mode=0 
> 157724 12:28:10.477319909 0 [crypto] (1660) < open fd=5(<f>/tmp/challenge.py) name=/tmp/challenge.py flags=2310(O_LARGEFILE|O_TRUNC|O_CREAT|O_WRONLY) mode=0 

On y retrouve notre fichier [crypto] ainsi que challenge.py

sysdig -r FOR100.scap -A -c echo_fds fd.filename=challenge.py
from Crypto.Cipher import AES
import base64
import sys
obj = AES.new('n0t_just_t00ling', AES.MODE_CBC, '7215f7c61c2edd24')
ciphertext = sys.argv[1]
message = obj.decrypt(base64.b64decode(ciphertext))

D'après ce script il faut trouver l'argument passé en entrée pour retrouver le message. Pour la méthode la plus rapide était de décompresser l'archive FOR100.scap permettant de récupérer les data. Un magnifique coup de strings sur cela nous donne notre réponse :

strings data | grep "challenge.py"
>/tmp/challenge.py
>python /tmp/challenge.py cnKlXI1pPEbuc1Av3eh9vxEpIzUCvQsQLKxKGrlpa8PvdkhfU5yyt9pJw43X9Mqe
python test.py cnKlXI1pPEbuc1Av3eh9vxEpIzUCvQsQLKxKGrlpa8PvdkhfU5yyt9pJw43X9Mqe
>Congrats! flag{1da3207f50d82e95c6c0eb803cdc5daf}

`