V poštovním serveru vyvinutém projektem OpenBSD
Jsou navrženy dvě možnosti útoku. První možnost funguje ve výchozí konfiguraci OpenSMTPD (přijímá požadavky pouze z localhost) a umožňuje zneužít problém lokálně, když je útočník schopen přistupovat k místnímu síťovému rozhraní (loopback) na serveru (například na hostingových systémech) . Druhá možnost nastane, když je OpenSMTPD nakonfigurován pro příjem externích síťových požadavků (poštovní server, který přijímá poštu třetích stran). Výzkumníci připravili prototyp exploitu, který úspěšně funguje jak s verzí OpenSMTPD obsaženou v OpenBSD 6.6, tak s přenosnou verzí pro jiné operační systémy (prováděné v Debian Testing).
Problém je způsoben chybou funkce smtp_mailaddr(), která je volána pro kontrolu správnosti hodnot v polích „MAIL FROM“ a „RCPT TO“, které definují odesílatele/příjemce a jsou předávány během připojení. s poštovním serverem. Chcete-li zkontrolovat část e-mailové adresy, která je před symbolem „@“, zavolá se funkce smtp_mailaddr()
valid_localpart(), která přijímá (MAILADDR_ALLOWED) znaky "!#$%&'*/?^`{|}~+-=_", jak vyžaduje RFC 5322.
V tomto případě se přímé escapování řetězce provádí ve funkci mda_expand_token(), která nahrazuje pouze znaky „!#$%&’*?`{|}~“ (MAILADDR_ESCAPE). Následně je řádek připravený v mda_expand_token() použit při volání doručovacího agenta (MDA) pomocí příkazu 'execle("/bin/sh", "/bin/sh", "-c", mda_command,...' V případě umístění dopisů do mboxu přes /bin/sh se spustí řádek „/usr/libexec/mail.local -f %%{mbox.from} %%{user.username}“, kde je hodnota „% {mbox.from}” obsahuje uniklá data z parametru „MAIL FROM“.
Podstatou zranitelnosti je, že smtp_mailaddr() má logickou chybu, kvůli které v případě odeslání prázdné domény na email funkce vrátí úspěšný ověřovací kód, i když část adresy před „@“ obsahuje neplatné znaky. . Dále, při přípravě řetězce funkce mda_expand_token() neunikne všem možným speciálním znakům shellu, ale pouze speciálním znakům povoleným v e-mailové adrese. Ke spuštění příkazu tedy stačí použít symbol „;“ v místní části e-mailu. a mezery, které nejsou zahrnuty v sadě MAILADDR_ESCAPE a nejsou uvozeny. Například:
$nc 127.0.0.1 25
HELO profesor.falken
POŠTA OD:
RCPT TO:
ÚDAJE
.
KONEC
Po této relaci OpenSMTPD po doručení do mbox spustí příkaz přes shell
/usr/libexec/mail.local -f ;sleep 66; vykořenit
Možnosti útoku jsou zároveň omezeny tím, že místní část adresy nesmí přesáhnout 64 znaků a speciální znaky ‚$‘ a ‚|‘ jsou při escapování nahrazeny „:“. Abychom toto omezení obešli, využíváme toho, že tělo dopisu se po spuštění /usr/libexec/mail.local přenese přes vstupní proud, tzn. Manipulací s adresou můžete pouze spustit interpret příkazů sh a použít tělo dopisu jako sadu instrukcí. Vzhledem k tomu, že hlavičky SMTP služby jsou uvedeny na začátku písmene, doporučuje se použít k jejich přeskočení příkaz read ve smyčce. Pracovní exploit vypadá asi takto:
$nc 192.168.56.143 25
HELO profesor.falken
MAIL FROM:
RCPT TO:<[chráněno e-mailem]>
ÚDAJE
#0
#1
...
#d
pro i ve W O PR; dělat
echo -n "($i) " && id || přestávka
hotovo > /root/x."`id -u`.""$$"
.
KONEC
Zdroj: opennet.ru