Skip to content
KitploitKITPLOIT
OutilsExploitsBlog
Log in
Soumettre
OutilsExploitsBlog
Soumettre

Outils de Hacking, PenTest et Cybersécurité pour votre Arsenal de Sécurité !

Kitploit est un répertoire d'outils de hacking, de cybersécurité et de pentesting. Découvrez les dernières mises à jour des projets pour trouver des vulnérabilités, analyser des systèmes, automatiser les tests et renforcer votre sécurité.

FluxContactConfidentialité© 2026 Kitploit

Répertoire d'outils

Catégories

Voir toutes les catégories
Loading categories
forgejo-hostmatcher-0001-ssrf — Forgejo 16.0.5 - Élevé - À distance - SSRF - hostmatcher autorise 0.0.0.1 comme IP publique | Kitploit
Outils/GitHubGitHub/abraxas/forgejo-hostmatcher-0001-ssrf
Analyse des VulnérabilitésExploitationExploitation d'Applications WebSécurité WebTests d'IntrusionRed TeamingLabs et Pratique
GitHubabraxas/forgejo-hostmatcher-0001-ssrf

forgejo-hostmatcher-0001-ssrf

Forgejo 16.0.5 - Élevé - À distance - SSRF - hostmatcher autorise 0.0.0.1 comme IP publique

Voir le dépôt
1il y a 4 joursPas encore vérifié

Populaires

Voir tout →

Découvrez les outils les plus utilisés par notre communauté.

Explorer tous les outils

Parcourez notre collection d'outils

Voir tous les outils →
Partager

Abraxas Labs - forgejo-hostmatcher-0001-ssrf

abraxaslabs.tech  ·  github.com/abraxas  ·  @abraxas_null  ·  [email protected]  ·  forgejo-hostmatcher-0001-ssrf

forgejo-hostmatcher-0001-ssrf

Classe : SSRF Portée : Distante

Forgejo 16.0.5 (8d24b7d) - Forgejo

La valeur par défaut de [webhook] ALLOWED_HOST_LIST est vide, donc services/webhook/deliver.go construit le client avec le prédicat intégré external. Ce prédicat est le IsGlobalUnicast() && !isPrivate() de Go. isPrivate correspond à RFC1918/4193 plus l'ajout CGNAT de la v16.0.2. Le 0.0.0.0/8 de la RFC 6890 n'appartient à aucune de ces catégories. 127.0.0.1 est loopback et refusé. 0.0.0.1 est autorisé.

Un utilisateur connecté peut déclencher un webhook vers http://0.0.0.1 et lire le corps HTTP depuis l'historique du hook. 127.0.0.1 sur le même port est refusé.

IDpas encore de CVE
ClasseSSRF
PortéeDistante (authentifié ; tout utilisateur pouvant créer un webhook de dépôt)
CWECWE-918
CVSSÉlevé : 7.7 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:N/A:N
ProduitForgejo
Affectéjusqu'à v16.0.5 (8d24b7d) ; résidu de l'ajout CGNAT de la v16.0.2
Authutilisateur connecté pouvant créer un webhook de dépôt
LicenceGNU Affero GPL v3.0
Lab127.0.0.1 uniquement

Ce qu'un attaquant peut faire

S'inscrire sur une installation par défaut, créer un dépôt, configurer un webhook forgejo vers http://0.0.0.1:<port>/..., le tester, et lire le corps de la réponse.

PrivilègeMéthode / sinkReconnaissance / intégrité / disponibilitéProuvé en lab ou déduit
Composer vers 0.0.0.1 de ce réseau en contournant la liste d'autorisation par défaut des webhooksPOST /api/v1/repos/{owner}/{repo}/hooks puis POST .../hooks/{id}/tests avec l'URL http://0.0.0.1:8080/ssrfReconnaissance (HTTP sortant depuis l'hôte Forgejo)Prouvé en lab. Historique stocké : corps HTTP 200 FORGEJO-HOSTMATCHER-0001-WITNESS
Lire la réponse HTTP complète de ce qui a réponduGET /{owner}/{repo}/settings/hooks/{id} affiche ResponseInfo.BodyReconnaissance (SSRF à réponse complète)Prouvé en lab. Même témoin dans la page d'historique
Même classe via IPv4-mapped [::ffff:0.0.0.1]Même matcher To4() puis checkIPReconnaissanceDéduit de hostmatcher. Le lab a utilisé 0.0.0.1
Atteindre un listener lié plus largement que le loopback dans le netns ForgejoLe connect() Linux vers 0.0.0.0/8 est cet-hôte une fois que 0.0.0.1 est sur loReconnaissanceProuvé en lab contre l'oracle sidecar. Pas une affirmation sur un IMDS cloud spécifique

Fermé sur le même matcher par défaut : 127.0.0.1 (refus prouvé en lab dans l'historique), 127.0.0.0/8, RFC1918, CGNAT 100.64.0.0/10, link-local 169.254.0.0/16 y compris l'IMDS IPv4, non spécifié 0.0.0.0. Le webhook sortant ne gagne pas X-Forgejo-Internal-Auth / INTERNAL_TOKEN. Ce n'est pas du RCE en soi.

Ce n'est pas le correctif CGNAT de la v16.0.2. Forgejo n'a jamais développé de liste de réseaux réservés à la manière de Gitea. Même classe que gitea-hostmatcher-0000-ssrf.

Comment je l'ai trouvé

La v16.0.2 a mis le CGNAT dans private. Les correctifs qui ajoutent une deny-list sont un cadeau : on lit la liste, puis on se demande ce que l'IANA possède encore et que la liste a oublié. Une chasse similaire prétendait que IsGlobalUnicast de Go 1.26 fermait 0.0.0.1. J'ai vérifié le prédicat et les tests dans l'arbre. Ils ne couvrent jamais 0.0.0.1.

Fausses pistes déjà consignées : traiter le HTTP 201 de création de webhook comme l'oracle (l'historique est l'oracle) ; la livraison vers 127.0.0.1 qui réussit (ce serait un autre bug - le lab exige qu'elle soit refusée) ; atteindre /api/internal avec X-Forgejo-Internal-Auth ; un reverse shell. Du théâtre.

Lab

python3 forgejo-hostmatcher-0001-ssrf-Abraxas-Labs.py

ou :

cd lab
./run.sh

Cible uniquement http://127.0.0.1:19320. Image codeberg.org/forgejo/forgejo:16.0.5. Le sidecar oracle partage le netns Forgejo sur le port 8080.

create-hook name=neg-loopback ...
negative-control 127.0.0.1 blocked
create-hook name=hit-0001 ...
poll id=2 witness=True
SUCCESS forgejo-hostmatcher-0001-ssrf how=live pin=v16.0.5 0.0.0.1:8080 HTTP 200 FORGEJO-HOSTMATCHER-0001-WITNESS

Le correctif

Traiter le 0.0.0.0/8 de la RFC 6890 comme non-externe (une liste de réseaux réservés, pas IsGlobalUnicast). 0.0.0.1 doit être refusé de la même manière que 127.0.0.1.

Références

  • codeberg.org/forgejo/forgejo tag v16.0.5
  • hostmatcher.go
  • Correctif voisin : v16.0.2 CGNAT
  • Même classe sur Gitea : gitea-hostmatcher-0000-ssrf
  • RFC 6890
  • CWE-918

Licence

GNU Affero GPL v3.0. Voir LICENSE. Lab loopback uniquement. Aucune garantie.

Télécharger l’outil