Уязвимост в OpenSMTPD, която позволява отдалечено изпълнение на код с root права

В пощенския сървър, разработен от проекта OpenBSD OpenSMTPD идентифицирани критична уязвимост (CVE-2020-7247), което ви позволява отдалечено да изпълнявате команди на обвивката на сървъра с права на root потребител. Уязвимостта беше идентифицирана по време на повторен одит, извършен от Qualys Security (предишен одит на OpenSMTPD беше извършено през 2015 г., а новата уязвимост е налице от май 2018 г.). проблем елиминиран във версия OpenSMTPD 6.6.2. На всички потребители се препоръчва незабавно да инсталират актуализацията (за OpenBSD корекцията може да бъде инсталирана чрез syspatch).

Предлагат се два варианта за атака. Първата опция работи в конфигурацията на 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

Добавяне на нов коментар