В прош­лом номере мы уже рас­смат­ривали, как мож­но под­нять свои при­виле­гии до сис­темных в мире Windows. Как ока­залось, вари­антов для это­го более чем дос­таточ­но. Что выб­рать, зависит как от ситу­ации, так и от тво­их пред­почте­ний. Одна­ко, как ты понима­ешь, рас­ширять свои пол­номочия при­ходит­ся не толь­ко для око­шек, но и для пин­гви­нов. Какие здесь есть воз­можнос­ти? Ну что ж, давай пос­мотрим...

warning

Вся информа­ция пре­дос­тавле­на исклю­читель­но в озна­коми­тель­ных целях. Лица, исполь­зующие дан­ную информа­цию в про­тиво­закон­ных целях, могут быть прив­лечены к ответс­твен­ности.

 

Prefase

Как ты пом­нишь (и как дол­жен пом­нить каж­дый адек­ватный адми­нис­тра­тор), работать в линук­се под рутом катего­ричес­ки не рекомен­дует­ся. В иде­аль­ном мире ты дол­жен исполь­зовать его толь­ко для кон­фигури­рова­ния сер­вера, уста­нов­ки и обновле­ния ПО и про­чих чис­то адми­нис­тра­тив­ных задач. Вся беда в том, что мы живем в обыч­ном мире, который очень далек от иде­аль­ного. Поэто­му такая ситу­ация все же иног­да слу­чает­ся. Прав­да, в боль­шинс­тве слу­чаев чис­то из‑за халат­ности, ибо так уж исто­ричес­ки сло­жилось, что поль­зовате­лям линук­са при­ходи­лось раз­бирать­ся в том, как работа­ет их опе­раци­онная сис­тема. А хоть нем­ного раз­бира­ясь в сис­теме и ее механиз­мах безопас­ности, под рутом уже сидеть не будешь. Поэто­му сегод­ня, в отли­чие от Windows, где мы говори­ли о получе­нии сис­темных при­виле­гий из‑под адми­на, будем рас­смат­ривать толь­ко вари­анты повыше­ния при­виле­гий от неп­ривиле­гиро­ван­ного поль­зовате­ля до рута. Итак, прис­тупим.

 

Эксплойты

Все спо­собы получе­ния прав супер­поль­зовате­ля в Linux мож­но условно раз­делить на две катего­рии. Пер­вая — это как раз таки исполь­зование экс­плой­тов. В отли­чие от Windows, c ее механиз­мом авто­мати­чес­кой уста­нов­ки обновле­ний, при­вер­женцам пин­гви­на при­ходит­ся по боль­шей час­ти самос­тоятель­но сле­дить за выходом зап­латок и их уста­нов­кой. В свя­зи с этим шанс встре­тить сре­ди Linux-машин не про­пат­ченную до кон­ца сис­тему гораз­до выше. Какие пре­иму­щес­тва дан­ного метода мож­но выделить? Для начала — боль­шинс­тво экс­плой­тов исполь­зуют уяз­вимос­ти в ядре ОС, что поз­воля­ет получить мак­сималь­ные при­виле­гии. Най­ти код под­ходяще­го экс­плой­та не так слож­но, и ты навер­няка зна­ешь пару ресур­сов. Плюс ко все­му, что­бы вос­поль­зовать­ся спло­итом, под­час не тре­бует­ся раз­бирать­ся во всех тон­костях исполь­зуемой уяз­вимос­ти — дос­таточ­но прос­то пра­виль­но ском­пилиро­вать его и запус­тить (иног­да, прав­да, при­ходит­ся его нем­ного кас­томизи­ровать, но доволь­но час­то все будет работать и без под­гонки напиль­ником). В общем виде алго­ритм дей­ствий выг­лядит сле­дующим обра­зом:

  1. Оп­ределить вер­сию ядра и дис­три­бути­ва.
  2. По­лучить спи­сок дос­тупных инс­тру­мен­тов для сбор­ки спло­ита.
  3. Дос­тавить спло­ит на целевую машину.
  4. Ском­пилиро­вать (при необ­ходимос­ти) и запус­тить.
  5. Нас­лаждать­ся получен­ным root’ом.

Ну а теперь о каж­дом шаге более деталь­но.

 

Идентификация

Су­дя по пла­ну, сна­чала надо узнать, куда мы вооб­ще попали, что за дистр исполь­зуем и какова вер­сия ядра. Вер­сию ядра мож­но вытянуть с помощью всем извес­тной коман­ды uname -a или ее ана­логов. Для того же, что­бы получить информа­цию об исполь­зуемом дис­три­бути­ве, надо гля­нуть в фай­лик *-release, лежащий в катало­ге etc (в зависи­мос­ти от дис­тра он может называть­ся по‑раз­ному: lsb-release в Ubuntu, redhat-release в Red Hat / CentOS и так далее):

cat /etc/*-release

Зная дис­три­бутив и вер­сию ядра, мож­но занять­ся вто­рым эта­пом — поис­ком под­ходящей «отмычки».

 

Поиск эксплойта

Как толь­ко вся необ­ходимая информа­ция ока­жет­ся на руках, нас­танет вре­мя искать под­ходящий экс­плойт. Пер­вое, что при­ходит на ум, — это exploit-db.com, но есть и аль­тер­нативы: 1337day, SecuriTeam, ExploitSearch, Metasploit, securityreason, seclists. В кон­це кон­цов, есть гугл, он точ­но зна­ет о спло­итах боль­ше всех.
За­бегая нем­ного впе­ред, ска­жу: иног­да по какой‑либо при­чине «отмычка» может не работать или же ее надо нем­ного адап­тировать под опре­делен­ные усло­вия или свои нуж­ды, то есть прой­тись по ней напиль­ником. В таком слу­чае не помеша­ет выудить о ней допол­нитель­ную информа­цию, которую мож­но почер­пнуть на одном из сле­дующих ресур­сов:

Итак, допус­тим, ты нашел под­ходящий экс­плойт, который дару­ет тебе про­пуск в мир рута. Оста­лось толь­ко как‑то переп­равить его на машину.

 

Доставка на дом

Для того что­бы дос­тавить спло­ит на мес­то, сущес­тву­ет дос­таточ­но мно­го спо­собов, от всем извес­тных cURL/wget, Netcat, FTP, SCP/SFTP, SMB до исполь­зования DNS TXT записей. Что­бы выяс­нить, какие из дан­ных инс­тру­мен­тов у нас пред­став­лены, выпол­няем:

find / -name wget
find / -name nc*
find / -name netcat*
find / -name tftp*
find / -name ftp

До­пус­тим, у нас нашел­ся Netcat. Для переда­чи фай­ла с его помощью на при­нима­ющей сто­роне запус­каем:

nc -l -p 1234 > out.file

То есть слу­шаем порт 1234. На отправ­ляющей выпол­няем сле­дующее:

nc -w 3 [destination] 1234 < out.file

Ес­ли переда­ча про­исхо­дит с *nix- на *nix-сис­тему, то есть там и там есть стан­дар­тные ути­литы, то для уско­рения про­цес­са переда­чи мож­но вос­поль­зовать­ся сжа­тием. В таком слу­чае коман­ды будут выг­лядеть так:

nc -l -p 1234 | uncompress -c | tar xvfp - // для получения
tar cfp - /some/dir | compress -c | nc -w 3 [destination] 1234 // для отправки

Ос­таль­ные вари­анты еще про­ще, так что не ста­нем рас­смат­ривать исполь­зование wget, FTP и про­чих обще­извес­тных методов.

 

Прятки

Хо­рошо, как дос­тавить, разоб­рались. Но как при этом не спа­лить­ся? Если твой спло­ит обна­ружат, будь уве­рен, что лазей­ку быс­тро прик­роют. Так что раз­мещать его, ком­пилиро­вать и запус­кать надо из какого‑то неп­римет­ного мес­та. В линук­се дирек­тории, начина­ющиеся с точ­ки (нап­ример, .secret_folder), явля­ются скры­тыми. Поэто­му логич­но было бы их исполь­зовать для сок­рытия сво­ей активнос­ти. Нап­ример, помес­тить в них код экс­плой­та: /tmp/.nothingthere/exploit.c. Прав­да, в таком слу­чае надо сна­чала убе­дить­ся, что tmp смон­тирова­на без опции noexec и из нее мож­но будет запус­тить соб­ранный спло­ит (для это­го вос­поль­зуйся коман­дой mount).

 

Сборка и запуск сплоита

Как толь­ко мы дос­тавили и раз­мести­ли спло­ит, его надо будет соб­рать/нас­тро­ить. Как пра­вило, спло­иты пишут­ся на С либо на одном из скрип­товых язы­ков Python/Perl/PHP. Пос­тоян­ные читате­ли ][ зна­ют, что оставлять на сво­ем сер­вере ком­пилятор не самое луч­шее решение, поэто­му обыч­но его выпили­вают. Если на твой воп­рос о вер­сии ком­пилято­ра gcc -v bash руг­нется gcc: command not found, зна­чит, тебе «повез­ло» и при­дет­ся идти в обход. То есть либо искать спло­ит на питоне, пер­ле или чем‑то еще, либо ком­пилить его на вир­туаль­ной машине с ана­логич­ной ОС и вер­сией ядра. Пос­ле чего перемес­тить получен­ный исполня­емый файл на целевой хост (прав­да, стоп­роцен­тной работы этот спо­соб не гаран­тиру­ет, спло­ит может упасть и обру­шить сис­тему, так что поак­курат­нее тут). Одна­ко, как показы­вает прак­тика, интер­пре­татор для одно­го из упо­мяну­тых язы­ков все же дол­жен при­сутс­тво­вать в сис­теме. Так что не сле­дует сра­зу опус­кать руки, вмес­то это­го про­веря­ем все вари­анты:

find / -name perl*
find / -name python*
find / -name gcc*
find / -name cc

В слу­чае успе­ха тебе оста­нет­ся толь­ко запус­тить ском­пилиро­ван­ный экс­плойт и нас­лаждать­ся повыше­нием. Ну или же раз­бирать­ся, почему он не сра­ботал, тут как повезет.

Основные опции LinEnum
Ос­новные опции LinEnum

Противодействие сплоитам

Ка­кие‑то новатор­ские рецеп­ты тут при­думать слож­но. Все и так дав­но извес­тно. Надо прос­то вов­ремя уста­нав­ливать зап­латки. Это пер­вое. Вто­рое — огра­ничить мес­та, отку­да мож­но запус­кать на исполне­ние фай­лы (пап­ку tmp уж точ­но сле­дует лишить дан­ной воз­можнос­ти). Ну и при­менить какое‑нибудь защит­ное решение, нап­ример grsecurity.

 

Права, файлы, пути и конфиги

Вто­рая катего­рия, которую мож­но выделить в под­нятии при­виле­гий, — это спо­собы, не свя­зан­ные с исполь­зовани­ем экс­плой­тов, а осно­ван­ные на поис­ке фай­лов с некор­рек­тно выс­тавлен­ными пра­вами. Здесь, как и в слу­чае с Windows, есть свои хит­рости, но в основном это все та же работа по сбо­ру и ана­лизу дан­ных. Обыч­но пер­вым делом ищут­ся фай­лы, которые дос­тупны всем на чте­ние и запись:

find / -perm 2 ! -type l -ls

Та­ких может ока­зать­ся дос­таточ­но боль­шое чис­ло, и сре­ди них мож­но най­ти что‑нибудь инте­рес­ное: кон­фигура­цион­ные фай­лы, исходни­ки сай­тов/при­ложе­ний, скрип­ты, запус­каемые init’ом или cron’ом. В прин­ципе, ситу­ация, ког­да файл дос­тупен всем на чте­ние и запись, — это нор­маль­ное явле­ние. Проб­лемы воз­ника­ют, ког­да поль­зовате­ли/адми­нис­тра­торы/скрип­ты начина­ют без­думно менять раз­решения. Поэто­му, ког­да ты изме­няешь раз­решения, ста­рай­ся избе­гать исполь­зования chmod 777. Ну и про­води пери­оди­чес­кий аудит, что­бы важ­ные фай­лы не ока­зались дос­тупны всем под­ряд.

 

Setuid + setgid

Как гла­сит докумен­тация, setuid и setgid явля­ются фла­гами прав дос­тупа, которые поз­воля­ют запус­кать исполня­емые фай­лы с пра­вами вла­дель­ца или груп­пы исполня­емо­го фай­ла (обыч­но root’а). Такие исполня­емые фай­лы, запущен­ные с повышен­ными при­виле­гиями, могут получать дос­туп к более при­виле­гиро­ван­ной информа­ции. Нап­ример, в слу­чае уста­нов­ки setuid на коман­ду ls ты получишь воз­можность прос­матри­вать содер­жимое дирек­торий, дос­туп в которые тебе изна­чаль­но был зап­рещен. А в слу­чае vim — пра­вить кон­фигура­цион­ные фай­лы, в которые до это­го не имел пра­ва заг­лядывать.

Со­ответс­твен­но, если в при­ложе­ниях с уста­нов­ленным setuid/setgid-фла­гом, при­сутс­тву­ют такие уяз­вимос­ти, как buffer overflow или command injection, то ата­кующий может выпол­нить про­изволь­ный код с повышен­ными при­виле­гиями. Поэто­му сле­дующим вари­антом обыч­но ищут исполня­емые фай­лы с дан­ными фла­гами.

sudo find / -xdev \(-perm 4000\) -type f -print0 -exec ls -s {} \;

В прин­ципе, мож­но и без sudo, это необ­ходимо лишь для того, что­бы про­верить дирек­тории, к которым у тебя нет дос­тупа.

unix-privesc-check предлагает на выбор всего две опции
unix-privesc-check пред­лага­ет на выбор все­го две опции

Обыч­но сущес­тву­ет три вари­анта даль­нейше­го исполь­зования таких исполня­емых фай­лов. Пер­вый — попытать­ся под­нять при­виле­гии, опи­раясь на фун­кци­онал, пре­дос­тавля­емый этим при­ложе­нием (вер­нее, при­думать свой спо­соб необыч­ного исполь­зования это­го фун­кци­она­ла). Вто­рой вари­ант — най­ти пуб­личный спло­ит или про­вес­ти самос­тоятель­ный фаз­зинг с целью выяв­ления багов. Тре­тий — command injection. Уни­вер­саль­ного рецеп­та нет, все зависит от ситу­ации.

 

SUDO

Ко­ман­да sudo (substitute user and do), что дос­ловно озна­чает «под­менить поль­зовате­ля и выпол­нить», поз­воля­ет делеги­ровать те или иные при­виле­гиро­ван­ные ресур­сы поль­зовате­лям с ведени­ем про­токо­ла работы. То есть пре­дос­тавля­ет поль­зовате­лям воз­можность выпол­нять коман­ды от име­ни root’а (либо дру­гих юзе­ров), исполь­зуя свой собс­твен­ный пароль, а не пароль рута. Пра­вила для при­нятия решений о пре­дос­тавле­нии дос­тупа находят­ся в фай­ле /etc/sudoers. Под­робнее о фор­мате это­го фай­ла и задании пра­вил ты можешь пос­мотреть в офи­циаль­ном ману­але или Википе­дии. Я лишь ска­жу, что этот файл так­же необ­ходимо тща­тель­но про­верять. Потому как час­то быва­ет, что некото­рые при­ложе­ния при уста­нов­ке его изме­няют, и при­том не в луч­шую сто­рону. В резуль­тате чего у поль­зовате­лей появ­ляет­ся воз­можность под­нять свои при­виле­гии (пост на Offensive security, повес­тву­ющий о таком слу­чае).

LinuxPrivChecker содержит большой список эксплойтов, который постоянно пополняется с Exploit Database
LinuxPrivChecker содер­жит боль­шой спи­сок экс­плой­тов, который пос­тоян­но попол­няет­ся с Exploit Database
 

PATH

Как и на вин­де, в линук­се некор­рек­тно нас­тро­енные пути так­же помогут под­нять свои при­виле­гии. Обыч­но такое слу­чает­ся с перемен­ной окру­жения PATH (исполь­зуй printenv для ее прос­мотра). Пос­мотрел? Отлично, а теперь ска­жи: что, если перемен­ная окру­жения PATH будет начинать­ся с . (.:/bin:/usr/sbin ....)? Обыч­но так дела­ют поль­зовате­ли, которые не хотят набирать два лиш­них сим­вола, то есть хотят вызывать коман­ду так: $ program вмес­то $ ./program. Добав­ление . в PATH озна­чает воз­можность выпол­нять фай­лы/скрип­ты из рабочей дирек­тории. Добавить ее мож­но сле­дующим обра­зом:

PATH=.:${PATH}
export PATH

А теперь пред­ста­вим ситу­ацию, что у нас есть два поль­зовате­ля: Джо (ата­кующий) и Боб. Джо зна­ет, что у Боба есть sudo-при­виле­гии на изме­нение паролей поль­зовате­лей, в том чис­ле и рута. Кро­ме того, Боб ленив и добавил . в перемен­ную окру­жения PATH. Хит­рый Джо пишет прог­рамму, которая будет менять пароль рута, называ­ет ее ls и кла­дет в пап­ку, куда любит заг­лядывать Боб. Теперь, ког­да пос­ледний зай­дет в пап­ку и захочет пос­мотреть ее содер­жимое, выпол­нится прог­рамма, которую написал Джо, и пароль рута будет изме­нен. Поэто­му всег­да про­веря­ем перемен­ные окру­жения на наличие инте­рес­ных вещей, а для себя дела­ем сле­дующие выводы:

  1. Ни­ког­да не исполь­зуем . в перемен­ной PATH.
  2. Ес­ли точ­ка там все‑таки при­сутс­тву­ют, раз­меща­ем сле­дующую стро­ку в .bashrc или .profile:
PATH=`echo $PATH | sed -e 's/::/:/g; s/:.:/:/g; s/:.$//; s/^://'`

Инструменты

Для авто­мати­зации поис­ка сла­бых мест мож­но вос­поль­зовать­ся сле­дующи­ми тул­зами:

  1. LinEnum — bash-скрипт, который сде­лает всю гряз­ную работу за тебя, выпол­няя все про­вер­ки, опи­сан­ные в дан­ном cheat sheet’e. Все­го в его арсе­нале око­ло 65 раз­личных про­верок, начиная от получе­ния информа­ции о вер­сии ядра и закан­чивая поис­ком потен­циаль­но инте­рес­ных SUID/GUID-фай­лов. Кро­ме того, скрип­ту мож­но передать клю­чевое сло­во, которое он будет искать во всех кон­фигура­цион­ных и лог‑фай­лах. Запус­кает­ся про­вер­ка сле­дующим обра­зом: ./LinEnum.sh -k keyword -r report -e /tmp/ -t. Пос­ле того как ска­ниро­вание завер­шится, тебе будет пред­став­лен доволь­но под­робный отчет, наибо­лее инте­рес­ные мес­та которо­го будут под­све­чены жел­тым цве­том.
  2. LinuxPrivChecker — Python-скрипт, который так­же при­годит­ся в поис­ке потен­циаль­ных вари­антов для повыше­ния при­виле­гий. В общем‑то, он выпол­няет все те же стан­дар­тные вещи: про­вер­ку при­виле­гий, получе­ние информа­ции о сис­теме... Но основная его фиш­кой в том, что по завер­шении про­вер­ки он пред­ложит тебе спи­сок экс­плой­тов, которые, по его мне­нию, помогут под­нять при­виле­гии. Такой вот молодец :).
  3. unix-privesc-check — дан­ный скрипт поз­воля­ет искать вари­анты для про­кач­ки при­виле­гий не толь­ко в Linux, но так­же и в Solaris, HPUX, FreeBSD. Он ста­рает­ся обна­ружить ошиб­ки кон­фигура­ции, которые поз­волили бы неп­ривиле­гиро­ван­ному поль­зовате­лю под­нять­ся в сис­теме.
  4. g0tmi1k’s Blog — а это блог, в котором хорошо опи­саны все те про­вер­ки, что выпол­няют­ся тре­мя наз­ванны­ми инс­тру­мен­тами. Так что нас­тоятель­но рекомен­дую заг­лянуть туда и поз­накомить­ся, что­бы пред­став­лять, как работа­ют эти инс­тру­мен­ты «изнутри».
 

Afterword

Как ты убе­дил­ся, в мире Linux с под­няти­ем при­виле­гий все тоже дос­таточ­но обы­ден­но. Сек­рет успе­ха прост: для того, что­бы добить­ся сво­ей цели, надо быть тер­пеливым и знать, где искать и что искать. Куда смот­реть, ты теперь зна­ешь, какие ути­литы задей­ство­вать для авто­мати­зации — тоже, так что теперь тебе под силу покорить не толь­ко win-, но и nix-сис­тему. Дер­зай!

Оставить мнение