Я ёсьць root. Разбіраемся ў павышэнні прывілеяў ОS Linux

Першы квартал 2020 года я правёў за падрыхтоўкай да іспыту OSCP. Пошук інфармацыі ў Google і мноства "сляпых" спроб адымалі ў мяне ўвесь вольны час. Асабліва няпроста аказалася разабрацца ў механізмах павышэння прывілеяў. Курс PWK надае гэтай тэме вялікую ўвагу, аднак метадычных матэрыялаў заўсёды недастаткова. У Інтэрнэце ёсць куча мануалаў з карыснымі камандамі, але я не прыхільнік сляпога прытрымлівання рэкамендацый без разумення, да чаго гэта прывядзе.

Мне жадаецца падзяліцца з вамі тым, што атрымалася пазнаць за час падрыхтоўкі і паспяховай здачы іспыту (уключаючы перыядычныя набегі на Hack The Box). Я адчуваў наймацнейшае адчуванне падзякі да кожнай макулінцы інфармацыі, якая дапамагала мне прайсці шлях Try Harder больш свядома, цяпер мой час аддаць належнае кам'юніці.

Я жадаю даць вам мануал па падвышэнні прывілеяў у OS Linux, улучальны ў сябе разбор найболей частых вектараў і сумежных фішак, якія вам абавязкова спатрэбяцца. Часцяком самі механізмы падвышэння прывілеяў досыць нескладаныя, цяжкасці ўзнікаюць пры структураванні і аналізе інфармацыі. Таму я вырашыў пачаць з «агляднай экскурсіі» і далей разглядаць кожны вектар у асобным артыкуле. Спадзяюся, я зэканомлю вам час на вывучэнне тэмы.

Я ёсьць root. Разбіраемся ў павышэнні прывілеяў ОS Linux

Такім чынам, чаму павышэнне прывілеяў увогуле магчыма ў 2020-м, калі метады добра вядомыя ўжо вельмі даўно? Насамрэч пры пісьменным звароце карыстальніка з сістэмай павысіць прывілеі ў ёй сапраўды не атрымаецца. Асноўная глабальная праблема, якая спараджае такія магчымасці, заключаецца ў небяспечнай канфігурацыі. Наяўнасць у сістэме састарэлых версій ПЗ, якія змяшчаюць уразлівасці, таксама з'яўляецца прыватным выпадкам небяспечнай канфігурацыі.

Падвышэнне прывілеяў праз небяспечную канфігурацыю

Першым чынам давайце разбяромся з небяспечнай канфігурацыяй. Пачнём з таго, што ІТ-адмыслоўцы часта карыстаюцца мануаламі і рэсурсамі накшталт stackoverflow, многія з якіх утрымліваюць небяспечныя каманды і канфігі. Яскравы прыклад - навіна аб тым, што самы які капіюецца са stackoverflow код утрымоўваў памылку. Дасведчаны адмін убачыць вушак, але гэта - у ідэальным свеце. Нават пісьменныя спецыялісты пры падвышанай працоўнай нагрузцы здольныя дапускаць памылкі. Прадстаўце, што адмін займаецца падрыхтоўкай і ўзгадненнем дакументацыі на чарговы тэндэр, раўналежна ўнікае ў новую тэхналогію, якую маецца быць укараніць у наступным квартале, пры гэтым перыядычна вырашае задачы па падтрымцы карыстачоў. І тут яму наразаюць задачу па-хуткаму падняць пару віртуалак і раскачаць на іх сэрвісы. Як вы думаеце, якая верагоднасць таго, што адмін проста не заўважыць вушак? Потым спецыялісты мяняюцца, а мыліцы застаюцца, пры гэтым кампаніі заўсёды імкнуцца мінімізаваць выдаткі, у тым ліку на ІТ-шнікаў.

Псеўдаабалонка і jailbreak

Сістэмная абалонка, атрыманая на стадыі эксплуатацыі, часта бывае абмежаванай, асабліва калі вы набылі яе праз узлом карыстача вэб-сервера. Напрыклад, абмежаванні абалонкі могуць перашкодзіць ужыць каманду sudo з высновай памылкі:

sudo: no tty present and no askpass program specified

Пасля атрымання абалонкі я рэкамендую стварыць паўнавартасны тэрмінал, напрыклад з дапамогай Python.

python -c 'import pty;pty.spawn("/bin/bash")'

Вы спытаеце: "Навошта мне тысяча каманд, калі я магу скарыстацца адной, напрыклад, для перадачы файлаў?" Справа ў тым, што сістэмы бываюць сканфігураваны па-рознаму, на чарговым хасце можа быць не ўсталяваны Python, аднак ёсць Perl. Майстэрства ў тым, каб мець магчымасць рабіць у сістэме звыклыя рэчы без звыклых інструментаў. Поўны пералік магчымасцяў можна знайсці тут.

Нізкапрывілеяваны шелл можна атрымаць, выкарыстоўваючы каманды 1 и каманды 2 (дзіўна, што нават GIMP).

Прагляд гісторыі каманд

Linux збірае гісторыю ўсіх выкананых каманд у файле ~/.bash_гісторыя. Калі сервер актыўна выкарыстоўваецца, і яго гісторыя не чысціцца, існуе вялікая верагоднасць знайсці ў гэтым файле ўліковыя дадзеныя. Чысціць гісторыю банальна няёмка. Калі адміністратар змушаны выбіраць дзесяціпавярховыя каманды праз , вядома, яму будзе зручней выклікаць гэтую каманду з гісторыі, чым уводзіць нанова. Плюс многія не ведаюць аб гэтым "хаку". Калі ў сістэме прысутнічаюць альтэрнатыўныя абалонкі накшталт Zsh ці Fish, яны вядуць сваю гісторыю. Каб вывесці гісторыю каманд у любой абалонцы, дастаткова набраць каманду history.

cat ~/.bash_history
cat ~/.mysql_history
cat ~/.nano_history
cat ~/.php_history
cat ~/.atftp_history

Існуе shared hosting, пры якім сервер выкарыстоўваецца для хостынгу некалькіх сайтаў. Звычайна пры такой канфігурацыі для кожнага рэсурсу ствараецца свой карыстач з асобнай хатняй дырэкторыяй і віртуальны хост. Дык вось, пры няправільнай наладзе ў каранёвай дырэкторыі вэб-рэсурсу можна выявіць файл .bash_history.

Пошук пароляў у файлавай сістэме і напады на сумежныя сістэмы

Канфігурацыйныя файлы розных сэрвісаў могуць быць даступныя для чытання вашаму бягучаму карыстачу. У іх можна сустрэць уліковыя дадзеныя ў адкрытым выглядзе - паролі для доступу ў базу дадзеных або сумежныя сэрвісы. Адзін і той жа пароль можа быць скарыстаны як для доступу ў базу дадзеных, так і для аўтарызацыі карыстача root (credential staffing).
Бывае так, што знойдзеныя ўліковыя дадзеныя належаць сэрвісам на іншых хастах. Развіццё нападу на інфраструктуру праз скампраметаваны хост нічым не горш эксплуатацыі іншых хастоў. Сумежныя сістэмы таксама можна знайсці з дапамогай пошуку IP-адрасоў у файлавай сістэме.

grep -lRi "password" /home /var/www /var/log 2>/dev/null | sort | uniq #Find string password (no cs) in those directories
grep -a -R -o '[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}' /var/log/ 2>/dev/null | sort -u | uniq #IPs inside logs

У выпадку, калі на скампраметаваным хасце маецца вэб-прыкладанне, даступнае з Інтэрнэту, лепш выключыць яго логі з пошуку IP-адрасоў. Адрасы карыстальнікаў рэсурса з Інтэрнэту нам наўрад ці будуць карысныя, а вось адрасы ўнутранай сеткі (172.16.0.0/12, 192.168.0.0/16, 10.0.0.0/8) і тое, куды яны заходзяць, мяркуючы па логах, могуць уяўляць цікавасць.

судо

Каманда sudo дае карыстачу магчымасць выканаць каманду ў кантэксце root з дапамогай уласнага пароля ці зусім без яго выкарыстання. Многія аперацыі ў Linux патрабуюць прывілеяў root, аднак праца з-пад root лічыцца вельмі дрэннай практыкай. Замест гэтага лепш ужываць выбарачны дазвол на выкананне каманд у кантэксце root. Аднак шматлікія прылады Linux, уключаючы стандартныя тыпы vi, можна выкарыстоўваць для падвышэння прывілеяў суцэль легітымнымі спосабамі. Для пошуку падыходнага спосабу рэкамендую паглядзець тут.

Першае, што трэба зрабіць, атрымаўшы доступ у сістэму, - выканаць каманду sudo -l. Яна выведзе дазвол на выкарыстанне каманды sudo. Калі атрыманы карыстач без пароля (напрыклад, apache ці www-data), вектар падвышэння прывілеяў праз sudo малаверагодны. Пры выкарыстанні sudo сістэма запытае пароль. Праз каманду passwd задаць пароль таксама не выйдзе, яна запытае бягучы пароль карыстальніка. Але калі sudo усё ж даступны, то, у сутнасці, неабходна шукаць:

  • любыя інтэрпрэтатары, кожны можа спавіць shell (PHP, Python, Perl);
  • любыя тэкставыя рэдактары (vim, vi, nano);
  • любыя праглядальнікі (less, more);
  • любыя магчымасці працы з файлавай сістэмай (cp, mv);
  • тулы, якія маюць выхад у bash, інтэрактыўны ці ў выглядзе выкананай каманды (awk, find, nmap, tcpdump, man, vi, vim, ansible).

Suid/Sgid

У Інтэрнэце ёсць мноства мануалаў, якія раяць сабраць усе suid/sgid каманды, аднак рэдкі артыкул дае канкрэтыку, што рабіць з гэтымі праграмамі. Варыянты павышэння прывілеяў, якія не ўлічваюць прымяненне эксплоітаў, можна знайсці тут. Таксама шэраг выкананых файлаў мае спецыфічныя ўразлівасці пад версію АС, напрыклад.

У ідэальным свеце трэба прапусціць усе ўсталяваныя пакеты хаця б праз searchsploit. На практыцы падобнае варта праробліваць з найболей папулярнымі праграмамі тыпу sudo. Таксама заўсёды ёсць варыянт выкарыстаць і падтрымліваць распрацоўку аўтаматызаваных прылад, якія падсвецяць цікавыя, з пункта гледжання падвышэння прывілеяў, выкананыя файлы з выстаўленымі бітамі suid/sgid. Пералік такіх інструментаў я прывяду ў адпаведным раздзеле артыкула.

Даступныя на запіс скрыпты, якія запускаюцца Cron або Init, у кантэксце Root

Задачы cron могуць выконвацца ў кантэксце розных карыстачоў, у тым ліку root. Калі ў cron выстаўлена задача са спасылкай на выкананы файл, і ён даступны вам для запісу, яго лёгка можна падмяніць шкоднасным і выканаць падвышэнне прывілеяў. Пры гэтым па змаўчанні файлы з задачамі cron даступныя на чытанне любому карыстачу.

ls -la /etc/cron.d  # show cron jobs 

Падобнай выявай ідуць справы з init. Адрозненне ў тым, што задачы ў cron выконваюцца перыядычна, а ў init - пры старце сістэмы. Для эксплуатацыі запатрабуецца перазагрузка сістэмы, пры гэтым частка сэрвісаў можа і не падняцца (калі яны не былі прапісаны ў аўтазагрузку).

ls -la /etc/init.d/  # show init scripts 

Таксама можна пашукаць файлы, даступныя для запісу любому карыстачу.

find / -perm -2 -type f 2>/dev/null # find world writable files

Метад даволі вядомы, дасведчаныя сістэмныя адміністратары акуратна карыстаюцца камандай chmod. Аднак на прасторах Сеткі ў пераважнай большасці мануалаў апісана выстаўленне максімальных правоў. Падыход неспрактыкаваных сістэмных адміністратараў "абы зарабіла" стварае магчымасці для павышэння прывілеяў у прынцыпе. Калі ёсць магчымасць, лепш пашукаць у гісторыі каманд небяспечнае выкарыстанне chmod.

chmod +w /path 
chmod 777 /path

Атрыманне доступу ў абалонку іншых карыстальнікаў

Глядзім спіс карыстальнікаў у /etc/passwd. Зважаем на тых, у каго ёсць абалонка. Можна пабруціць гэтых карыстальнікаў - не выключана, што праз атрыманага карыстальніка ў выніку атрымаецца павысіць прывілеі.

Для падвышэння бяспекі рэкамендую заўсёды прытрымвацца прынцыпу мінімальных прывілеяў. Таксама мае сэнс надаць час праверцы небяспечных канфігурацый, якія маглі застацца пасля траблшутинга, - гэта «тэхнічны абавязак» сістэмнага адміністратара.

Самапісны код

Варта ўважліва паглядзець на выкананыя файлы ў хатняй дырэкторыі карыстальніка і вэб-сервера (/var/www/, калі не зададзена іншая). Гэтыя файлы могуць апынуцца зусім небяспечным рашэннем і ўтрымоўваць у сабе неверагодныя мыліцы. Вядома, калі вы маеце які-небудзь фрэймворк у дырэкторыі вэб-сервера, не мае сэнсу шукаць у ім zero-day у рамках пентэста, аднак знайсці і вывучыць кастамныя дапрацоўкі, убудовы і кампаненты рэкамендуецца.

Для падвышэння бяспекі лепш па магчымасці адмовіцца ад выкарыстання уліковых дадзеных у самапісных скрыптах, а таксама ад патэнцыйна небяспечнага функцыяналу, напрыклад чытанні /etc/shadow ці маніпуляцый з id_rsa.

Падвышэнне прывілеяў праз эксплуатацыю ўразлівасцяў

Перш чым спрабаваць павысіць прывілеі праз эксплуатацыю, важна разабрацца з перадачай файлаў на мэтавы хост. Апроч звыклых сродкаў накшталт ssh, ftp, http (wget, curl) ёсць цэлы «заапарк» магчымасцяў.

Для павышэння бяспекі сістэмы рэгулярна абнаўляйце яе да актуальных стабільных версій, а таксама старайцеся выкарыстоўваць дыстрыбутывы, разлічаныя на Enterprise. У адваротным выпадку, рэдка, але бываюць сітуацыі, калі apt upgrade робіць сістэму непрацаздольнай.

Эксплуатацыя сэрвісаў, запушчаных у кантэксце карыстальніка root

Некаторыя сэрвісы Linux працуюць ад прывілеяванага карыстача root. Іх можна знайсці з дапамогай каманды ps aux grep root. Пры гэтым сэрвіс можа не анансавацца ў Сетку і быць даступным лакальна. Калі ён мае публічныя эксплоіты, іх можна смела прымяняць: падзенне сэрвісу ў выпадку няўдачы значна менш крытычна, чым падзенне АС.

ps -aux | grep root # Linux

Самым удалым выпадкам можна лічыць працу ўзламанага сэрвісу ў кантэксце карыстальніка root. Эксплуатацыя сэрвісу SMB дае прывілеяваны доступ SYSTEM у сістэмах Windows (напрыклад, праз ms17-010). Аднак у сістэмах Linux такое сустракаецца нячаста, таму можна правесці нямала часу над павышэннем прывілеяў.

Эксплуатацыя ўразлівасцяў ядра Linux

Гэта шлях, якім трэба ісці ў апошнюю чаргу. Няўдалая эксплуатацыя можа прывесці да падзення сістэмы, а ў выпадку рэбуту некаторыя сэрвісы (у тым ліку тыя, праз якія атрымалася атрымаць першапачатковы shell) могуць не падняцца. Бывае, што адміністратар банальна забыўся ўжыць каманду systemctl enable. Плюс гэта выкліча шмат незадаволенасці вашымі працамі, калі эксплуатацыя не была ўзгоднена.
Калі вырашылі выкарыстоўваць зыходныя коды з exploitdb, абавязкова прачытайце каментары ў пачатку скрыпту. Апроч іншага, тамака звычайна напісана, як след правільна кампіляваць дадзены эксплоіт. Калі самому лянота або па тэрмінах трэба было «ўчора», можна пашукаць рэпазітары з ужо скампіляванымі эксплоітамі, напрыклад. Аднак варта разумець, што ў такім выпадку вы атрымаеце ката ў мяшку. З іншага боку, калі б праграміст разбіраўся да байта, як уладкованы кампутар і выкарыстоўваны ім софт, ён бы за ўсё жыццё не напісаў бы і радкі кода.

cat /proc/version
uname -a
searchsploit "Linux Kernel" 

Metasploit

Для таго, каб злавіць і апрацаваць злучэнне, заўсёды лепш выкарыстоўваць модуль exploit/multi/handler. Галоўнае - выставіць правільны payload, напрыклад, generic/shell/reverce_tcp або generic/shell/bind_tcp. Абалонку, атрыманую ў Metasploit, можна палепшыць да Meterpreter з выкарыстаннем модуля post/multi/manage/shell_to_meterpreter. Маючы Meterpreter, вы можаце аўтаматызаваць працэс постэксплуатацыі. Напрыклад, модуль post/multi/recon/local_exploit_suggester правярае платформу, архітэктуру і неабходныя для эксплуатацыі сутнасці і прапануе модулі Metasploit для павышэння прывілеяў на мэтавай сістэме. Дзякуючы Meterpreter, падвышэнне прывілеяў часам зводзіцца да запуску патрэбнага модуля, аднак узлом без разумення адбывалага пад капотам не з'яўляецца тру (вам яшчэ справаздачу пісаць).

інструменты

Прылады аўтаматызацыі лакальнага збору інфармацыі захаваюць вам вялікую колькасць сіл і чакай, аднак самі па сабе не здольныя цалкам выяўляць шлях падвышэння прывілеяў, асабліва ў выпадку эксплуатацыі ўразлівасцяў ядра. Інструменты аўтаматызацыі выканаюць за вас усе неабходныя каманды для збору інфармацыі аб сістэме, але важна таксама здолець прааналізаваць атрыманыя дадзеныя. Спадзяюся, мой артыкул будзе вам у гэтым карысны. Вядома, інструментаў існуе значна больш, чым я прывяду ніжэй, аднак яны ўсё робяць прыкладна адно і тое ж - тут, хутчэй, справа густу.

Linpeas

Дастаткова свежая тула, першы коміт датуецца студзенем 2019 года. На дадзены момант мой любімы інструмент. Сутнасць у тым, што ён падсвятляе найбольш цікавыя вектары павышэння прывілеяў. Пагадзіцеся, зручней атрымаць экспертную адзнаку на такім узроўні, чым разбіраць маналітныя волкія дадзеныя.

LinEnum

Другі мой любімы інструмент, ён таксама збірае і сістэматызуе дадзеныя, атрыманыя ў выніку лакальнага пералічэння.

Linux-exploit-suggester (1,2)

Гэты эксплоіт прааналізуе сістэму на наяўнасць прыдатных умоў для эксплоітаў. Па сутнасці, зробіць працу, ідэнтычную модулю Metasploit local_exploit_suggester, але прапануе не модулі Metasploit, а спасылкі на зыходныя коды exploit-db.

Linuxprivchecker

Дадзены скрыпт збярэ і сістэматызуе па раздзелах вялікая колькасць інфармацыі, якая можа быць карысная для фарміравання вектара павышэння прывілеяў.

Іншым разам я падрабязна разбяру павышэнне прывілеяў у АС Linux праз suid/sgid.

Крыніца: habr.com

Дадаць каментар