ЦВЕ-2019-17059: Објашњен Преаутх-РЦЕ у Сопхосовом Цибероаму

Радимо напорно са истраживачима интерне и екстерне безбедности овде, на ТхеБестВПН-у, како бисмо открили озбиљне рупе у даљини у експлоатацији у ССЛ ВПН-овима и заштитним зидовима, попут Цибероам, Фортигате и Цисцо ВПН-ова. Овај чланак је технички корак у вези са крпа критичне рањивости која утиче на Цибероам ССЛ ВПН такође познат као ЦибероамОС.


Овај Цибероам искоришћај, назван ЦВЕ-2019-17059, је критична рањивост која омогућава нападачима приступ вашем Цибероам уређају без давања корисничког имена или лозинке. Поврх тога, одобрени приступ је највиши ниво (роот), који у суштини пружа нападачу неограничена права на вашем Цибероам уређају.

У већини мрежних окружења Цибероам уређаји се користе као фиревалл и ССЛ ВПН гатеваис. Ово омогућава потенцијалном нападачу снажно упориште у мрежи. Олакшава напад на домаћине унутар мреже, а будући да се Цибероам уређајима обично верује у већини окружења, то даје додатној предности потенцијалном нападачу.

Према Сходану (претраживачу уређаја повезаних на интернет), постоји више од 96.000 Циберроам уређаја са свих страна света. Већина ових уређаја инсталирана је у предузећима, универзитетима, а неки у светски познатим банкама. То доводи до напада који имају огроман утицај на ова окружења.

Рад са Сопхосовим тимом за сигурност био је велико одушевљење, јер су брзо поступили признајући и извадили закрпе само неколико дана након нашег почетног извештаја о њима. Кудос њима! (казна намењена!)

откривање Цибероама

А будући да је већина ових ентитета привлачна мета нападачима, то чини бубе све критичнијим.

ЦибероамОС даљинско неовлашћено извршавање коријенске наредбе

ЦибероамОС је модификовани оперативни систем заснован на Линуку за Цибероам уређаје. Овај ОС има интернетско конфигурацијско сучеље и ССЛВПН портал.

Веб интерфејс је подељен на два главна дела:

  • Предња страна написана на Јави
  • Потпора која користи комбинацију Ц и Перл

Нећемо заронити дубоко у унутрашњост предњег или задњег кода, углавном ради уштеде времена и ограничавања количине откривених информација. Али кратко ћемо дискутовати како се буг активира.

И конфигурациона и ССЛВПН сучеља имају сервлет који управља главним операцијама. Те се операције дефинирају кориштењем параметра под називом „мод“.

Већина њих је оверена. Али постоји неколико могућности којима можемо приступити без аутентификације (попут пријаве).

Грешке које смо пронашли налазе се у антивирусном / антиспам модулу за е-пошту. Режим захтева за ову крајњу тачку (модул, оп) је 458.

Једна ствар коју треба напоменути је да су опцодес пресликани на њихова имена у Цибероам бази података (интерна база података Постгрес). Претражујући 458, можемо сазнати како се зове име овог кода.

Ево редака из СКЛ скрипте за иницијализацију базе података који приказује име опцоде 458:

уметните у тблцревент (опцоде, опис, моде, типе типе)
вредности ('РЕЛЕАСЕКУАРАНТИНЕМАИЛФРОММАИЛ', 'РЕЛЕАСЕ КУАРАНТИНЕ МАИЛ ОФ МАИЛ', '458', 2);

Опкодне функције се чувају у директорију / _цонф / цсц / цсццонф /. Нећемо открити цео код рањиве функције, али пружићемо неколико исјечака који показују где и како се буг дешава.

Код из сучеља Јава који обрађује опцоде 458:

иф ((јсонОбјецт.гетСтринг ("хднСендер") .екуалс ("") ||
валидатеЕмаил (јсонОбјецт.гетСтринг ("хднСендер"))) &&
валидатеЕмаил (јсонОбјецт.гетСтринг ("хднРеципиент")) &&
исСафеФилеПатх (јсонОбјецт.гетСтринг ("хднФилеПатх")) && б) {
хттпСервлетРеспонсе.сетЦонтентТипе ("тект / хтмл");
ЦибероамЛоггер.дебуг ("Антивирус / АнтиСпам", "ЦСЦ константна вредност " +
ЦСЦЦонстантс.исЦЦЦ);

Као што видите горе, неколико параметара се провјерава на исправност. Ако су валидне вредности, десиће се следеће:

финал ЕвентБеан евентБиМоде = ЕвентБеан.гетЕвентБиМоде (363);
... редиговано.
финал инт сендВизардЕвент = цсцЦлиент.сендВизардЕвент (евентБиМоде, хасхМап, склРеадер);

Као што видимо горе, имамо нови код догађаја (363) који ће бити послан надокнади. Грешка коју смо открили налази се у коду који то рјешава у позадини.

Опцоде је назван сендмаил, а да би избегли експлоатацију ове грешке, редиговаћемо већину кода из следећег кода.

Руковатељ опцоде-а за сенд_маил.

...редиговано ...

$ парам = $ захтев->{издање};
парам = ДЛОПЕН (басе64_децоде, парам)
ЛОГ апплог " Вриједности декодирања :: $ парам \ н"
% рекуестДата = сплит (/ [&=] /, $ парам);
$ маилСерверХост = $ рекуестДата {хднДестДомаин};
$ маилФром = $ рекуестДата {хднСендер};
$ маилТо = $ рекуестДата {хднРеципиент};
$ филе = $ КУАРАНТИНЕ_ПАТХ."/".$ рекуестДата {хднФилеПатх};

$ маилфиле = $ рекуестДата {хднФилеПатх};
$ валидате_емаил ="лажно";
мој $ емаил_регек = '^ ([\.]? [_ \ - \! \ # \ {\} \ $ \% \ ^ \&\ * \ + \ = \ | \? \ '\\\\\ / а-зА-З0-9]) * @ ([а-зА-З0-9] ([-]? [а-зА- З0-9] +) * \.) + ([А-зА-З0-9] {0,6}) $ ';
иф ($ рекуестДата {хднРеципиент} = ~ / $ емаил_регек / && ((дефинисано $ рекуестДата {хднСендер} && $ рекуестДата {хднСендер} ек '') || $ рекуестДата {хднСендер} = ~ / $ емаил_регек /) && индекс ($ рекуестДата {хднФилеПатх}, '.. /') == -1) {
$ валидате_емаил ="истина";
}
.... редиговано....

Као што видимо горе, псеудо-Перл код показује нам како позадина прима улаз из фронтенда ($ рекуестДата) и како покушава да верификује неке параметре које шаљемо.

Након провере, ако су наши параметри валидни, извршава се следећа шифра:

% маилрек = ("маилацтион"=>"$ МАИЛ_ФОРВАРД","предмет"=>"$ стрСубјецт","тоЕмаил"=>"$ маилТо","датотеке прилога"=>"$ филе","смтпсерверхост"=>"$ маилСерверХост","са адресе"=>"$ маилФром");

оут = ОПЦОДЕ маил_сендер јсон% маилрек

Горњи код поставља наше параметре захтева у променљиву маилрек и позива функцију маил_сендер (ОПЦОДЕ). Видећемо како се извршава овај опцоде и где се тачно догађа РЦЕ:

#маилацтион 0 = маил_витх_вар, 1 = маил_форвард, 2 = маил_аттацхмент
$ маилацтион = $ захтев->{маилацтион};
$ субјецт = $ захтев->{предмет};
$ маилбоди = '';
$ аттацхментфиле = $ захтев->{датотеке прилога};
$ тоЕмаил = $ захтев->{тоЕмаил};

#маил боди
АКО("дефинисан $ захтев->{маилбоди} && '' не $ захтев->{маилбоди}") {
$ маилбоди = $ захтев->{маилбоди};
}
#СМТП сервер хост
АКО("дефинисан $ захтев->{смтпсерверхост} && '' не $ захтев->{смтпсерверхост}") {
$ смтпсерверхост = $ захтев->{смтпсерверхост};
} ЕЛСЕ {
резултат = КУЕРИ "изаберите сервисну вредност из тблцлиентсервицес где сервицекеи = 'МаилСервер'"
АКО("дефинисан $ резултат->{оутпут}->{сервицевалуе} [0] && '' не $ резултат->{оутпут}->{сервицевалуе} [0]") {
$ смтпсерверхост = $ резултат->{оутпут}->{сервисна вредност} [0];
} ЕЛСЕ {
$ смтпсерверхост ="127.0.0.1";
}
}

#СМТП порт
АКО("дефинисан $ захтев->{смтпсерверпорт} && '' не $ захтев->{смтпсерверпорт}") {
$ смтпсерверпорт = $ захтев->{смтпсерверпорт};
} ЕЛСЕ {
резултат = КУЕРИ "изаберите сервисну вредност из тблцлиентсервицес где сервицекеи = 'МаилСерверПорт'"
АКО("дефинисан $ резултат->{оутпут}->{сервицевалуе} [0] && '' не $ резултат->{оутпут}->{сервицевалуе} [0]") {
$ смтпсерверпорт = $ резултат->{оутпут}->{сервисна вредност} [0];
} ЕЛСЕ {
$ смтпсерверпорт ="25";
}
}

#СМТП аутх флаг
$ смтпаутхфлаг ="0";
АКО("дефинисан $ захтев->{смтпаутхфлаг} && '' не $ захтев->{смтпаутхфлаг}") {
$ смтпаутхфлаг = $ захтев->{смтпаутхфлаг};
} ЕЛСЕ {
резултат = КУЕРИ "изаберите сервисну вредност из тблцлиентсервицес где је сервицекеи = 'СМТПАутхентицатионФлаг'"
АКО("дефинисан $ резултат->{оутпут}->{сервицевалуе} [0] && '' не $ резултат->{оутпут}->{сервицевалуе} [0]") {
$ смтпаутхфлаг = $ резултат->{оутпут}->{сервисна вредност} [0];
}
}

АКО("$ смтпаутхфлаг == 1") {
АКО("дефинисан $ захтев->{маилусернаме} && '' не $ захтев->{маилусернаме}") {

$ маилусернаме = $ захтев->{маилусернаме};
$ маилпассворд = $ захтев->{маилпассворд};

} ЕЛСЕ {
резултат = КУЕРИ "изаберите сервисну вредност из тблцлиентсервицес где је сервицекеи = 'МаилСерверУсернаме'"
$ маилусернаме = $ резултат->{оутпут}->{сервисна вредност} [0];
резултат = КУЕРИ "изаберите сервисну вредност из тблцлиентсервицес где сервицекеи = 'МаилСерверПассворд'"
$ маилпассворд = $ резултат->{оутпут}->{сервисна вредност} [0];
}
} ЕЛСЕ {

$ маилусернаме = "";
$ маилпассворд = "";

}
АКО("дефинисан $ захтев->{фромаддресс} && '' не $ захтев->{фромаддресс}") {
$ фромаддресс = $ захтев->{фромададресс};
} ЕЛСЕ {
резултат = КУЕРИ "изаберите сервисну вредност из тблцлиентсервицес где је сервицекеи = 'ФромАддресс'"
$ фромаддресс = $ резултат->{оутпут}->{сервисна вредност} [0];
}

#Режим заштите
АКО("дефинисан $ захтев->{смтпсецурити} && '' не $ захтев->{смтпсецурити}") {
$ смтпсецурити = $ захтев->{смтпсецурити};
} ЕЛСЕ {
резултат = КУЕРИ "изаберите сервисну вредност из тблцлиентсервицес где је сервицекеи = 'смтпсецурити'"
$ смтпсецурити = $ резултат->{оутпут}->{сервисна вредност} [0];
}

$ смтпсецуритимоде = 0;
АКО("$ смтпсецурити ек 'СТАРТТЛС'") {
$ смтпсецуритимоде = 1;
} ЕЛСЕ ИФ ("$ смтпсецурити ек 'ССЛ / ТЛС'") {
$ смтпсецуритимоде = 2;
}

#СМТП сертификат

$ смтпцертифицате = '';
$ цертпассворд = '';

АКО("$ смтпсецуритимоде! = 0") {
АКО("дефинисан $ захтев->{смтпцертифицате} && '' не $ захтев->{смтпцертифицате}") {
резултат = КУЕРИ "изаберите цертнаме, лозинку са тблвпнцертифицате где цертид = $ захтев->{смтпцертифицате}"
} ЕЛСЕ {
резултат = КУЕРИ "одаберите цертнаме, лозинку из тблвпнцертифицате где је цертид = (одаберите сервицевалуе :: инт из тблцлиентсервицес где јекеикеи = 'смтпцертифицате')"
}

$ смтпцертифицате = $ резултат->{оутпут}->{цертнаме} [0];
$ цертпассворд = $ резултат->{оутпут}->{пассворд} [0];

}

# Из адресе са именом
АКО("дефинисан $ захтев->{фромаддрессвитхнаме} && '' не $ захтев->{фромаддрессвитхнаме}") {
$ фромаддрессвитхнаме = $ захтев->{фромаддрессвитхнаме};
} ЕЛСЕ {
$ фромаддрессвитхнаме = $ ОЕМНАМЕ . " <" . $ са адресе . ">";
}

Горњи код ради исто што је урадио и други опцоде када се покрене. Иницијализира варијабле (неке од нас или са уређаја ако нису наведене).

Након додељивања променљивих извршава се следећи блок кода.

оут = ЕКСЕЦСХ "/ бин / цсцхелпер маил_сенд '$ фромаддресс' '$ фромаддрессвитхнаме' '$ тоЕмаил' '$ тоЕмаил' '$ субјецт' '$ маилбоди' '$ смтпсерверхост' '$ смтпсерверпорт' '$ маилусернаме' '$ маилпассворд' '$ маилацтион' ' $ смтпсецуритимоде '' $ смтпцертифицате '' $ цертпассворд '' 1 '' $ аттацхментфиле '"

И ту је, извршење команде. Сада је позив овде ЕКСЕЦСХ који позива / бин / сх -ц "АРГУМЕНТИ". Када се извршење дешава помоћу вредности које контролишемо, лако можемо постићи даљинско извршавање команди, а све без аутентификације.

За неколико месеци ћемо објавити потпуни извештај и Доказ концепта са правилним обрисима.

Ажурирање: Ово истраживање је прво објављено у тексту ТецхЦрунцх, више о томе прочитајте овде.

Brayan Jackson Administrator
Sorry! The Author has not filled his profile.
follow me