Athari katika OpenSMTPD ambayo inaruhusu utekelezaji wa msimbo wa mbali na upendeleo wa mizizi

Katika seva ya barua iliyotengenezwa na mradi wa OpenBSD Fungua SMTPD kutambuliwa mazingira magumu muhimu (CVE-2020-7247), ambayo hukuruhusu kutekeleza amri za ganda kwa mbali kwenye seva na haki za mtumiaji wa mizizi. Udhaifu huo ulitambuliwa wakati wa ukaguzi upya uliofanywa na Qualys Security (ukaguzi wa awali wa OpenSMTPD ulifanyika mnamo 2015, na athari mpya imekuwepo tangu Mei 2018). Tatizo kuondolewa katika toleo la OpenSMTPD 6.6.2. Watumiaji wote wanapendekezwa kusakinisha mara moja sasisho (kwa OpenBSD, kiraka kinaweza kusakinishwa kupitia syspatch).

Chaguzi mbili za kushambulia zinapendekezwa. Chaguo la kwanza hufanya kazi katika usanidi chaguo-msingi wa OpenSMTPD (kukubali maombi kutoka kwa mwenyeji pekee) na hukuruhusu kutumia tatizo ndani ya nchi, wakati mshambuliaji ana uwezo wa kufikia kiolesura cha mtandao wa ndani (loopback) kwenye seva (kwa mfano, kwenye mifumo ya kupangisha) . Chaguo la pili hutokea wakati OpenSMTPD imesanidiwa kupokea maombi ya mtandao wa nje (seva ya barua ambayo inakubali barua za watu wengine). Watafiti wametayarisha mfano wa matumizi ambayo hufanya kazi kwa mafanikio pamoja na toleo la OpenSMTPD lililojumuishwa katika OpenBSD 6.6 na toleo linalobebeka la mifumo mingine ya uendeshaji (inayofanywa katika Jaribio la Debian).

Tatizo linasababishwa na hitilafu katika smtp_mailaddr() chaguo la kukokotoa, ambalo huitwa kuangalia usahihi wa maadili katika sehemu za "MAIL FROM" na "RCPT TO" ambazo hufafanua mtumaji/mpokeaji na hupitishwa wakati wa muunganisho. na seva ya barua. Kuangalia sehemu ya barua pepe inayokuja kabla ya alama ya "@", kitendakazi cha smtp_mailaddr() kinaitwa.
valid_localpart(), ambayo inakubali (MAILADDR_ALLOWED) herufi "!#$%&'*/?^`{|}~+-=_", kama inavyotakiwa na RFC 5322.

Katika hali hii, kutoroka kwa mfuatano moja kwa moja kunatekelezwa katika chaguo la kukokotoa la mda_expand_token(), ambalo huchukua nafasi ya vibambo "!#$%&'*?`{|}~" (MAILADDR_ESCAPE). Baadaye, laini iliyotayarishwa katika mda_expand_token() inatumika wakati wa kupiga wakala wa uwasilishaji (MDA) kwa kutumia amri ya 'execle("/bin/sh", "/bin/sh", "-c", mda_command,...' Katika kesi ya kuweka herufi kwa mbox kupitia /bin/sh, mstari β€œ/usr/libexec/mail.local -f %%{mbox.from} %%{user.username}” itazinduliwa, ambapo thamani β€œ% {mbox.from}” inajumuisha data iliyotoroka kutoka kwa kigezo cha "MAIL FROM".

Kiini cha athari ni kwamba smtp_mailaddr() ina hitilafu ya kimantiki, kutokana na ambayo, ikiwa kikoa tupu kitatumwa kwa barua pepe, chaguo hili la kukokotoa hurejesha msimbo uliofaulu wa uthibitishaji, hata kama sehemu ya anwani iliyo kabla ya "@" ina vibambo batili. . Zaidi ya hayo, wakati wa kuandaa kamba, kazi ya mda_expand_token() haiepuki wahusika wote maalum wa shell, lakini ni wahusika maalum tu wanaoruhusiwa katika anwani ya barua pepe. Kwa hivyo, kutekeleza amri yako, inatosha kutumia ishara ";" katika sehemu ya ndani ya barua pepe. na nafasi, ambazo hazijajumuishwa katika seti ya MAILADDR_ESCAPE na hazijaepukika. Kwa mfano:

$nc 127.0.0.1 25

HELO profesa.falken
BARUA KUTOKA:<;lala 66;>
RCPT KWA:
DATA
.
kujiondoa

Baada ya kipindi hiki, OpenSMTPD, ikiwasilishwa kwa mbox, itazindua amri kupitia ganda

/usr/libexec/mail.local -f ;lala 66; mzizi

Wakati huo huo, uwezekano wa mashambulizi ni mdogo kwa ukweli kwamba sehemu ya ndani ya anwani haiwezi kuzidi herufi 64, na herufi maalum '$' na '|' hubadilishwa na ":" wakati wa kutoroka. Ili kukwepa kikomo hiki, tunatumia ukweli kwamba mwili wa barua hupitishwa baada ya kukimbia /usr/libexec/mail.local kupitia mkondo wa pembejeo, i.e. Kwa kuchezea anwani, unaweza tu kuzindua mkalimani wa amri ya sh na kutumia mwili wa herufi kama seti ya maagizo. Kwa kuwa vichwa vya huduma vya SMTP vimeonyeshwa mwanzoni mwa barua, inashauriwa kutumia amri ya kusoma katika kitanzi ili kuruka. Unyonyaji wa kufanya kazi unaonekana kama hii:

$nc 192.168.56.143 25

HELO profesa.falken
MAIL KUTOKA:<;kwa i katika 0 1 2 3 4 5 6 7 8 9 abcd;fanya kusoma r;done;sh;toka 0;>
RCPT KWA:[barua pepe inalindwa]>
DATA
#0
#1
...
#d
kwa maana mimi katika WOPR; fanya
echo -n "($i) " && id || mapumziko
imefanywa > /root/x."`id -u`.""$$"
.
kujiondoa

Chanzo: opennet.ru

Kuongeza maoni