В пощенския сървър, разработен от проекта OpenBSD
Предлагат се два варианта за атака. Първата опция работи в конфигурацията на OpenSMTPD по подразбиране (приема заявки само от localhost) и ви позволява да използвате проблема локално, когато атакуващият има достъп до интерфейса на локалната мрежа (loopback) на сървъра (например на хостинг системи) . Втората опция се появява, когато OpenSMTPD е конфигуриран да получава външни мрежови заявки (пощенски сървър, който приема поща на трети страни). Изследователите са подготвили прототип на експлойт, който работи успешно както с версията OpenSMTPD, включена в OpenBSD 6.6, така и с преносима версия за други операционни системи (извършено в Debian Testing).
Проблемът е причинен от грешка във функцията smtp_mailaddr(), която се извиква, за да провери коректността на стойностите в полетата „MAIL FROM“ и „RCPT TO“, които определят подателя/получателя и се предават по време на връзката с мейл сървъра. За да проверите частта от имейл адреса, която идва преди символа „@“, се извиква функцията smtp_mailaddr().
valid_localpart(), който приема (MAILADDR_ALLOWED) знаците "!#$%&'*/?^`{|}~+-=_", както се изисква от RFC 5322.
В този случай директното екраниране на низа се извършва във функцията mda_expand_token(), която замества само знаците “!#$%&'*?`{|}~” (MAILADDR_ESCAPE). Впоследствие редът, подготвен в mda_expand_token(), се използва при извикване на агента за доставка (MDA) с помощта на командата 'execle("/bin/sh", "/bin/sh", "-c", mda_command,...' , В случай на поставяне на писма в mbox чрез /bin/sh, се стартира редът „/usr/libexec/mail.local -f %%{mbox.from} %%{user.username}“, където стойността „% {mbox.from}” включва екранирани данни от параметъра „MAIL FROM”.
Същността на уязвимостта е, че smtp_mailaddr() има логическа грешка, поради която, ако празен домейн бъде изпратен на имейл, функцията връща успешен код за потвърждение, дори ако частта от адреса преди „@“ съдържа невалидни знаци . Освен това, когато подготвя низ, функцията mda_expand_token() не избягва всички възможни специални знаци на обвивката, а само специалните знаци, разрешени в имейл адреса. По този начин, за да изпълните вашата команда, е достатъчно да използвате символа „;“ в локалната част на имейла. и интервал, които не са включени в набора MAILADDR_ESCAPE и не са екранирани. Например:
$nc 127.0.0.1 25
ЗДРАВЕЙ, професоре.фалкен
ПОЩА ОТ:<;sleep 66;>
RCPT ДО:
ДАННИ
.
Затворете
След тази сесия OpenSMTPD, когато бъде доставен на mbox, ще стартира командата през обвивката
/usr/libexec/mail.local -f ;заспиване 66; корен
В същото време възможностите за атака са ограничени от факта, че локалната част на адреса не може да надвишава 64 знака, а специалните знаци '$' и '|' се заменят с ":" при екраниране. За да заобиколим това ограничение, използваме факта, че тялото на писмото се предава след изпълнение на /usr/libexec/mail.local през входния поток, т.е. Чрез манипулиране на адреса можете само да стартирате интерпретатора на команди sh и да използвате тялото на писмото като набор от инструкции. Тъй като заглавките на услугата SMTP са посочени в началото на писмото, се препоръчва да използвате командата read в цикъл, за да ги пропуснете. Един работещ експлойт изглежда така:
$nc 192.168.56.143 25
ЗДРАВЕЙ, професоре.фалкен
МАЙЛ ОТ:<;за i в 0 1 2 3 4 5 6 7 8 9 abcd;прочетете r;готово;sh;изход 0;>
RCPT ДО:[имейл защитен]>
ДАННИ
#0
#1
...
#d
за i в WOPR; направи
echo -n "($i) " && id || прекъсвам
готово > /root/x."`id -u`.""$$"
.
Затворете
Източник: opennet.ru