← All talks

Ghetto Superstar (Rootkiting the Linux)

BSides Sofia36:47449 viewsPublished 2024-04Watch on YouTube ↗
Speakers
Tags
CategoryTechnical
TeamRed
StyleTalk
About this talk
by Petar Anastasov & Yordan Stoychev Jumping into ring 0 to stay invisible and become the system's superstar. We're going to talk about rootkiting the Linux kernel for the sake of patching 'Live Forensics' and 'Incident Response'.
Show transcript [bg]

[музика]

раз 2т старт а няма да разочароваме и ние млава ме с времената в които живеем в презентацията днес ще имам много ai генерирани картинки а и така казвам се петър анастасов занимавам се с киберсигурност в частност offensive security вече повече от 20 години а опей ми е всичко в сен моя компания за киберсигурност която създадох не толкова отдавна също така миналата година бях поканен и в момента съм треньор на националния отбор по киберсигурност а където имам удоволствието и възможно най-ярките младежи в българия в сферата на етичното хакерство и ще го дам трибюта няма как част съм от един съм от старите мембъри ама старите да са разбира като от първите на 4247 обществото да го наречем това е

една група от е [аплодисменти] там това е една група от много яки хора които а с които защитавахме и представяхме разбира се неофициално на международни турнири по етично хакерство в българия а доста преди да успеем да сформираме националния отбор и общо взето това е за мен аз съм йордан йордан стойчев й тест съм в pwc но нали тази презентация няма нищо общо с това аз съм също състезател в националния отбор а къл хакър занимавам се с research exploitation основно аз съм от по-новите членове на 447 и да това е за мен извинявам се за покачването което се случва от време на време и така каква е идеята защо тази презентация тука ще спамна малко аз за да

да да отговоря той въпрос е малко комплексен в него си има и сентимент ще трябва да върна малко лентата назад и да сумирам три факта а първо при сиан дам един от двигателите за това яко събитие от известно време си ме полк айде бе няма ли да нещичко да да направите а така че второ а знам че ви се стори странничко ама имам една много любима песничка от моите тинейджърски години и тя се казва гето superstar днеска установих че никой не знае за тая песен благодаря ти което е което е супер странно ти си ми ясен а ще стане ясно нали какво общо има тая песен с цялото нещо а и и трето миналата година който е бил

тук имаше един толк беше а името му беше geto forensic който най-общо се говореше за как да търсим за евентуални аа лоши хакери които са влезли в системите ни и да установим тяхното присъствие там та тия трите факта аа ме закараха накараха ме да се замисля не може ли пък да обърнем палачинката да видим нали от едната страна търсят хакерите пък да видим какви са перспективите на хакерите когато влязат в нерегламентирано в чужда система и нали какъв е тяхният поглед върху нещата а това пък ми дава нали логическото право да си открадна думичката гето щото двата толка ще са свързани и с малко фантазия да прибавя су star към към цялата тая презентация като ще стане

а ясно а малко по-натам откъде ще дойде суперстар а и разбира се е ън аз имам едно такова виждане за живота ако няма ън няма смисъл преди а да започнем с нали по-съществените обяснения от това което ще правим а трябва да се върна тук да забравих забравих да сна също нещо важно нали решихме решихме че ще пишем root kit всъщност не стана ясно та решихме че ще пишем root kit а писал съм такъв root kit преди 20 години горе-долу концептът ми беше ясен а и какво е root kit root kit те взаимно ги заменят с backdoor доста често backdoor е някакъв тул който ви дава нерегламентиран достъп до система до някаква система root kit е

същото само че целта му е освен да даде достъп до системата да покрие себе си и да покрие извършителя който ползва системата нерегламентирано та както ми беше ясен концепта също така ми беше супер ясно кой ако го поканя ще бъде супер ентусиазиран да пне ин в тоя проект и това е данчо който е нашия а кърл night rider в отбора обадих му се по телефона и разговорът продължи около секунди данчо искаш ли да пишем root kit за ядрото данчо да добре супер идея и така той се присъедини към цялата тая идея та преди да започнем с съществото на самия ки трябва да уточня ей тия три булета които а предполагам много от вас знаят но за да има някакъв л трябва да да

ги обясним общо разбира се първото е рингове съвременните процесори предлагат един механизъм за протекция който се изразява в нива на привилегии на изпълняване на код а не за да може не всеки код не всеки процес да има достъп до критични ресурси в системата а x86 предлагат четири ринга от нула до три като нула е с най-висок приоритет три с най-нисък приоритет има най-малко привилегии и като съвременните операционни системи не само linux за което ще говорим днес са избрали да ползват нула за ядрото на операционната система там където се случват нещата и а три за users space другото което трябва да а обясня какво са така наречените wab cal modules а това е най-общо казано код който

динамично може да се прибавя и да се изважда от от ядрото от от ring нула и да работи с а високи привилегии много прост пример драйв ей сега за първи път работя с клиър а цъкнах клиър модулът се зареди този код е там аз имам нужда от него и ползвам клира та това са модулите в най-общия си вид по най-простия начин се зареждат с in mode по най-простия начин се вадят от ядрото с r mode и последното system calls нещата са навързани систем коловете са интерфейса между н0 ин 3 когато нещо някоя апликация някой код от ring ну иска да а да извърши нещо с високи привилегии и това може да бъде извършено разбира се

само от ядрото то се обръща към ядрото чрез а така наречените системни извиквания които са а дефинирани в ядрото а на ниско ниво как се случва това има една книжка art of assembly едно време беше като библията коеето му е интересно а не можем да го обясняваме защото си е доста дълго и свързано с архитектурата аа в интернет има една така а как да го кажа метафора за тия трите неща как се обясняват на мен с с крепост която е разделена нали със стени кой къде живем не знам си какво мен ми хрумна много по-добра метафора поне за мен е много по-добра метафора ако рин ну е общината във вашия град това са хората с ресурсите там се случват нещата и те

решават в един момент нас ни трябва повече ресурс какво ще измислим отнякъде се чува нали отвънка отвътре тука имаме един модул ще ни докара нови ресурси казва се синя зона зареждат от общината синята зона и вие трябва да я ползвате нали защото няма къде паркирате нищо че си е в собствения си град аа и за да я ползвате трябва да изпратите sms в случая тоя sms ще ви върне пък ами вие заплатихте успешно неуспешно а а та та та sms е системното повикване вие отправяте някаква заявка отсреща ви връщат нали каквото трябва да ви върне тая заявка отсега казвам от от отказвам да отговарям на въпроси какво правим с шофьорите на електрически коли а какъв е плант ring ну рин

3 планът ни е да вкараме root kit в рин ну там където е ядрото там където имаме неограничени възможности да ей а а и и този този root qu rootkit да прехваща всички заявки които идват от users space и евентуално могат а да разкрият че имаме нерегламентиран достъп до системата а за да се случи това си въвеждаме и не всъщност за да се случи това ще модифицираме кодовете на на сис коловете много общо и така така другото което споменах по-рано суперстар за за да се за да го вкараме в контекста и да се получат нещата а понеже т вече очевидно няма да е ролята с най-високи привилегии в системата тоест ние постоянно ще ѝ хвърляме прах в очите т че вижда каквото

си искаме ние той затова там с очила а на нас ни трябва нали като как да го кажа няма да използвам хакер че тая дума така се демонизира напоследък като трет актор на нас ни трябва някакъв достъп който да ни даде достъп до всичко нали а тъй като руд вече не върши тая работа и това което направихме с данчо е да въведем една изцяло и нова роля в ядрото която нарекохме суперстар що не а тази роля живее изцяло в ядрото има достъп до абсолютно всички ресурси зарежда се а много лесно и бързо както ще покажем след малко а окей повече подробности извинявам се както казах имам опит с подобен тип кит преди 20 години горе-долу данчо като

се раждал съм писал такъв и ми беше интересно да направя съпоставка какво беше тогава какво беше сега тогава ядрото беше 24 пак казвам почти съм сигурен че беше 24 а и тогава опциите бяха торба пълна с опции като основния метод който беше така най-широко разпространен е да използваме така наречената сил таблица в която просто си словете от едната страна имате името на сико от друга страна имате адреса на сила така си го представяте и адреса и ядрото когато се извика даден сил хваща адреса и скача на този код на който е този адрес та тогава тоя table беше експортнат в ядрото всички всички имаха достъп до него зареждаш си ся модул и вече може да си

правиш каквото си поискаш да да да модифицираш си table и да насочваш към свои функции какво е положението в момента table не е експортнат вече това се е случило между другото още тогава малко след като аз съм си написал моя root kit но торбата стои пълна с опции и дори бих казал че че по-пълна и човек с малко resch и пет-шест реда код може отново да се докопа до тоя си table когато зареди собствен модул пример един от примерите нали има и много по как да я нарека хардкор примери от типа просто може да си сканирате ъл space да си фингър принте нещата как ще ви спрат абсурд а там някъде когато са махнали cis table

от да не е експортната вече са вкарали една много а то не е технология ами фю ks данчо много обича да си го наричаме сонди както се казва на български а та какво правят kps аз тука съм понеже няма как да го кажа толкова добре колкото е описано съм хайлайт нали на най-важните а а неща от дефиницията първо това е дебъг механизъм за за ядрото искам да кажа че това е по дефолт във всичките ви linux дистрибуции познати пуснато а второ динамично можем да брейк нем във всяка функция в ядрото и трето можем да трап нем да трап нем означава да спрем да инжек нем наш код той да свърши нещо и да си продължи

оригиналния код а почти навсякъде в карне пространството и отдолу го повтарят за да стане ясно можем да инсерт нем код а почти навсякъде не можем да нали това е сонда не можем да инсерт нем в друга сонда окей можем да живеем с това а таква е идеята на всяко влизане и на излизане от функция ние можем да да брейк нем да поемем лола дали входящите параметри за хората които нали имат опит с програмиране дали входящи параметри дали а каквото ретърн в функцията ние имаме абсолютния пълен достъп до него може да направим каквото си поискаме и да кажем на карни да продължи окей тук преминаваме на а нещо като хибриден начин на водене на презентацията данчо ще говори аз ще

а ще му бъда оператор и ще показвам real time какво се случва просто го притеснявам така а имаме инсталирано убунто 2204 ъпдейтнато до до вчера мисля което ще бъде нашата витим машинка вижда ли се между другото да добре аз всичко направих голямо защото миналата година имаше един малък екран да да еми така а това е системата сега симулираме че нали трет актор е добил достъп и е решил да зареди свой модул в в системата

а ето го тука нашето модулче това с разширението то k няма да го заредя с in mode защото имаме както съм написал вчера един пост кст за накрая а ще го заредим с ей това лорче което прави някакви неща които всъщност са zero day с които данчо намерихме и по принцип и да искаме да ги кажем нямаме много голямо желание а и след като е зареден модула другото което ще направя е да да ре буутна системата не защото е необходимо вече сме абсолютно готови с с процеса който трябваше да направим твам го отново заради последния слайд който е малкият туист а в който ли ще докажем нещо а бит трябвало да се окей пак сме

вътре и а първото нещо което ще направя ще си разделя екранчето от ляво ваша страна ще стои нашия root тоест оригиналния root това е ro а вдясно а а тук пускам а хендлър за за криптиран ър shell какво евър shell системата ще се върже към нас що ще се върже към нас защото ние ще изпратим един магически пакет така да го нашим да го наречем данчо ще обясни какво се случва суперстар ще го видя о ти си мой човек и а би трябвало да се върже към нас така този чизел откъде дойде така а

що не то е виртуална машина бой той човек така се учи е данчо да каже колко пъти мго пъти колко рибу та стотици към no паник сигурно и така а данчо първата крачка успя а изпратихме магическия пакет и както виждате в горния терминал долния ще го затворя не ми трябва в горния терминал а имаме имаме достъп до машината която се върза към нас криптирано а тук ще направя една малка шашми за да не натисна нещо без да искам и да изгубя ла това не е абсолютно нищо свързано просто ми трябват 2

секунди тези които сега hack the box за hack the box [музика] ами имам ги не виждаш ли те излизат а готово тука сме

да е това тивен добре да виждаш ли на из го написа вма тъй ваше дясно а пък ще бъде супер стар само че за да стане суперстар трябва да направя едно нещичко да изпратя един кил сигнал който ще прихване няма да хване ще извика едно системно повикване което нашия суперстар вътре ще види и ще каже окей намесвам се готово сега се предполага вече че сме а суперстар и данчо хваща оттук насетне нещата да не си сбъркам пейно вете така окей нека видим какво всъщност стана когато нашия модул нашия ro kit беше зареден той сложи вътре в кла network hook който network hook може да си го представите като един филтър през който минава целия трафик към жената съответно

този нек този филтър чака нашия магически пакет нашия магически пакет и когато го засече сва този rever shell който в случая encrypt rever shell този rever shell е напълно скрит за системата и да това което пе направи прави се ей това той вече го спомена с q сигнала реално ни качи от root user суста да окей едно от първите неща които правим когато нашият модул бива зареден е всъщност да за да накараме кърнъла да забрави че модулът е бил зареден вътре в кърнъла има един нтст с всички заредени модове ако ние просто премахнем нашия модул този ring твист ще е все едно той никога не е бил заведен няма да може да бъде показан от команди като ls mode

които показват всички заредени модове а няма да може да бъде лона с rm mode например неговите символи ще са скрити от прок файловата система и така нататък друго нещо което правим веднага след като нашият модул е зареден е да оправим един вид cal tain какво е cal taint ами те са флагове които биват сепнати когато бива извършена някаква операция която може да дестабилизира системата като завеждането на на нашия модул например а съответно те обикновено могат само да бъдат сетна но не могат да бъдат асена защото нали вече е дестабилизирана един вид системата но ние намираме начин да ги тне и ги асева за да не оставяме никакъв fingerprint върху самата система да не се вбе вече сме били

лонати

да нека сега реално видим да както има inm и а rm mode така има ls mode и когато напишете ls mod то вади всички модули сега ще гребна само за нашия защото ще излязват иначе доста и да не търсим root не вижда нищо другото което трябваше да направя е

в ето в случая е нула което значи че няма нито един сетнат съответно не е което значи че едва ли не все едно няма никакъв модул който да е бил зареден и нищо което може да дестабилизира самата система казахме че нашия reversal е напълно скрит нека реално видим как е скрит като първо ще погледнем как неговият конек е скрит от програма като не например ако видим как работи nst реално ами не знам добре не работи това ама ня зна лазера лазера лазера не работи но ако погледнем реално как не stat работи той чете от едни файлове в прок файловата система ако ние отворим ръчно тези файлове ще видим че те индексират връзките на системата в

момента ако намерим начин да филтрираме тези файлове като хукнем нали правилните функции и филтрираме тези файлове съответно филтрираме и какво се показва в netstat скривайки нашата връзка напълно от netstat съответно а нека го видим в ляво е в случая нашият root user който тук няма нашия reversal може би помните отворене на пор 31337 докато пък вдясно е нашият super star user който вижда съответно нашия reversal окей но начина по който netstat реално взима връзките не е единственият начин друга програма ss socket statistics ги взима по а различен начин който е през ning съб системата на кла а какво е ning sub системата накла тя е една система за ipc за inter process communication но също и

за комуникация между процеси но също така е и за комуникация между къна и програмите и това което е в ring 3 може да видите в случая ss отваря един ning socket и получава съобщения по него какво са тея тези съобщения реално това е един буфер с един рист вътре един масив където са изложени всичките връзки в момента а на системата ние хукваме отново правилните функции а например message си кола и съответно можем да филтрираме този буфер а масива вът можем да махнем връзката която не искаме да се покаже от ss и съответно тя ще е скрита и от ss отново в в ляво в случая вдясно първо ще почнем е нашият superstar той а на

втория ред е нашият reversal conection той я вижда нашият root user не вижда нищо съответно е скрита за всички юзъри които не са super star окей а криенето на връзки е едно нещо но самият wv shell е процес нали баш shell съответно трябва да скрием и него защото иначе всеки може да напише да го види този шел и вече на става ясно начина по който всички програми които всъщност индексират не връзките ами процесите които вървят системата го правят през прок файловата система нещо микрофона отказва не знам го правят през провата система а в провата система за всеки процес който в момента върви има по една директория която името ѝ е про id на процеса съответно id на процеса за да скрием от

ps stop и други такива програми реално намира начин да скрием тази директория и съответно а се скрива и от ps и от топ и така нататък не пешо има върни пешо върни има още един слайд е това да а не е въпросът просто наме да си скрием нашия бал а представете си че от този shell например отворите отново топ и друг човек който е отворил топ по същото време ще може да види вашия топ а или програма която сте пуснали каквото и да е и съответно ще може да ви засече съответно ние искахме рекурсивно при криенето на процеси искахме един процес който произлиза от скрит процес също да е скрит затова хукваме сис коловете които създават нови процеси като рк или

клоу и реално постигаме това скривайки всеки процес произлязъл от скрит друг начин по който искахме да скриваме процеси е изцяло по име тоест ако имаме някоя програма която трябва да е скрита дори да не е пусната от суста потребител или от reversal или каквото и да е а тя също да еквита в случая хукваме например тези еви колове които са за пускане на програми и скриваме на база името нека го видим в действие

в ляво е нашият шел той не засича в ps въобще не излиза като че има такъв процес в дясно е нашият су star reversal и той ясно вижда процеса на нашия reversal сега ще пуснем един друг процес за да покажем курсивно това е една сп програма която просто свип за един час нищо особено да и тя също ще е невидима за root user или за който и да е друг ър докато пък нашият суперстар юзър може да я види съответно постигаме и тази рекурсивно на криенето на процеси секунда окей въпрос е да можем и да крием файлове защото добре вече разбрахме как е вършила ни срит връзките с скрити процес е скрит но искаме да крием и

файлове като например да можем да скрием нашия модул начина по който всички програми които реално индексират някоя директория като eos го правят е през този get system call get get directory entries взима нещата които са в тази директория други sub линкове файлове и така нататък а съответно той връща един буфер отново под формата все ено на масив налист с всичките файлове там може да видите обджекта под чиято форма го връща и ние филтрираме на база или името или in number което е едва ли не id на самия файл съответно можем да скрием файлове например всички файлове които съдържат в името си lk mbd биват скрити и можем конкретни други файлове по техния ine number също да ги

скрием ето отново в ляво виждате root user а за него е скрит нашият модул който може да го видите пък superstar user го вижда този lkm bdc една и съща директория а по-скоро в единия случай в а да ето в и двата случая вече е във директорията във директорията също го има нашия модул скрит от от root user но не е скрит от super st юзъра м да тука май пак аз хващах а не аз имам още окей нещо друго важно което всъщност сега ще да постигнем е не просто да смети от някой си потребител който пише ls пише топ или неста и така нататък ами реално да сме скрити от инструменти направени да откриват китове това

съответно е значително по-трудно отколкото нали това което обяснихме засега как реално да се скрием от някой си пишейки ps но реално тук ви даваме апта на едни две такива два такива инструмента check root kit и rootkit hunter които и двата не намират нашия root kit чат и да това е impressive а не само заради кита ами защото както пеш спомена ние имаме стн на системата той го показа като рестартира системата и ние продължа кит беше луднат автоматично и можехме пак да си изпълням нашия шел също е важно да кажем че имаме и други функции свързани например със лф като една интересна функция която всъщност добавихме е да чупим криптографските алгоритми като добавяме на по който случайността а по който

случайността работи в самия кърл съответно разравяйки случайността възваря и всички капито рски алгоритми които разчитат на случайност затова да са сигурни правейки ги значително по-малко сигурни да ти поемаш окей моя ред само искам да кажа имаме имаме имаме имаме нищо нямаме възможно е че догодина ще влезем в толка на колежката да аа и така аа тук сега момента моментът моментът а както казах когато зареждах модула там с данчо открихме а малко зиро дейче а с което туист нахме така леко нещата понеже окей малко сценарий не не от 224 година преди малко там хората казаха дама има тулове за туй нали знаете ed xd cm последния да затвори вратата и когато се обаждах на данчо и му казах данчо ще

го правим той каза ама як ще викам човек як ще е как а и затова а решихме любимия ми слайд а затова решихме да си сложим едно симчев менно с това и xdr и да видим какво можем да направим по въпроса какво сиче сложихме сложихме ваз го що защото е безплатно и защото от първо лице четяло кода мога да ви гарантирам че е много добро прост пример давам търси процесите по шест различни начина за скрити процеси търси по шест различни начина в смисъл ко видяхме кода с данчо и бяхме няма да разказвам другата история не разказвай и така пак трябва да се върна на машината да си отворя ваздух чтото то най-вероятно е таймаут нало и ако интернетът не е

умрял докато си правим презентацията ето гто агент е онлайн да отида на security

евентите да цъкна на всички една секунда ще го направя на 20 пет а така така така така така и а тука имаме х agent stop х agent start това е а това е нашият рестарт преди него може да видите че това тия сървиси които екзит вт нямат абсолютно нищо нас това това се случва постоянно това не знам snap map някакви работи а та това е след нашия рестарт виждате че нито преди рестарта нито след рестарта вак а е обърнал внимание на на нашата интервенция а повярвайте ми той следи доста зорко за това аа и след това можете да видите че а тази седмичка тука след рестарт а това е че са променени някакви портове ама не са променени портовете ами са

променени пидови на сървисите защото след рестарт те вземат нов пит и ваза го приема нали като като някакъв вид алърт не знам що е седем а но така е и както виждате всичко оттам нататъка до края е а някакви абсолютно нормални неща няма абсолютно никакъв никаква индикация за за нещата които правихме за за инсталирания root kit за стн на root kit и така нататък това е оп не

и това е благодаря ви за времето [аплодисменти]