LPE на казенном макбуке. Злоупотребляем установкой VS Code для локального повышения привилегий

Содержание статьи

  • Спуфим диалог аутентификации
  • Модифицируем VS Code
  • Вывод

Ког­да тебе нуж­но зас­тавить сот­рудни­ков тех­поддер­жки выдать кре­ды и при­виле­гии в macOS, но так, что­бы они при этом ничего не заподоз­рили, мож­но сме­ло пред­лагать завер­шить уста­нов­ку легитим­ного ПО, которое ты пред­варитель­но кас­томизи­ровал. Для при­мера раз­берем, как это сде­лать с любимым все­ми Visual Studio Code. Pentest Award

В августе 2023 года прош­ла церемо­ния наг­ражде­ния Pentest Award — пре­мии для спе­циалис­тов по тес­тирова­нию на про­ник­новение, которую учре­дила ком­пания Awillix. Мы пуб­лику­ем луч­шие работы из каж­дой номина­ции. Эта статья заняла третье мес­то в номина­ции «Ловись, рыб­ка», пос­вящен­ной фишин­гу.

Этот спо­соб мы при­мени­ли по заказу одно­го очень круп­ного рос­сий­ско­го хол­динга в ходе ком­плексной опе­рации Red Team. Заказ­чик нас­тоял на реали­зации сле­дующе­го сце­нария: нас «устра­ивают» в ком­панию по сог­ласован­ной леген­де как внеш­них сот­рудни­ков на уда­лен­ке с выдан­ным MacBook в качес­тве рабоче­го ноута.

Так как при­виле­гии обыч­ных сот­рудни­ков на «маках» в орга­низа­ции силь­но уре­заны, обра­щения к тех­поддер­жке по боль­шей час­ти сос­тоят из писем вро­де «админ, помоги мне уста­новить прог­рамму». Из это­го родилась идея вос­поль­зовать­ся этой осо­бен­ностью рабоче­го про­цес­са для повыше­ния при­виле­гий на «маке» до рута и заполу­чить слу­жеб­ную учет­ку из /etc/krb5.keytab для раз­вития даль­нейших атак на AD.

 

Спуфим диалог аутентификации

В паб­лике есть ма­нуал по написа­нию вре­донос­ного рас­ширения, которое уме­ет само стар­товать при запус­ке VS Code и све­тить назой­ливым окном в гла­за ненавис­тно­му адми­ну, клян­ча его пароль.

Дос­тоинс­тво это­го метода в том, что мож­но получить кре­ды при­виле­гиро­ван­ной учет­ки в откры­том виде. Рас­ширение пишет­ся в поль­зователь­скую дирек­торию ~/.vscode, поэто­му, даже если у адми­на сто­ит чис­тый VS Code, запуск модуль­ного окна сох­ранит­ся.

Не­дос­таток в том, что надо пой­мать очень уставше­го адми­на, что­бы пред­при­ятие взле­тело, — диало­говое окно рису­ется с помощью AppleScript, поэто­му выг­лядит весь­ма хал­турно и серь­езно отли­чает­ся от встро­енных окон зап­роса рас­ширен­ных при­виле­гий. В свя­зи с этим мы решили най­ти дру­гой спо­соб абь­юзить VS Code.

 

Модифицируем VS Code

Нес­мотря на то что VS Code мож­но запус­кать с при­виле­гиями поль­зовате­ля, внут­ри есть допол­нитель­ные фун­кции, которые тре­буют прав адми­нис­тра­тора. Нап­ример, ин­тегра­ция коман­ды code в кон­соль (для это­го вно­сят­ся изме­нения в сис­темный PATH). В VS Code это дела­ется коман­дой из Command Palette (Command-Shift-P).

Хо­тя раз­работ­чики Code нас­тоятель­но не рекомен­дуют изме­нять встро­енные сис­темные коман­ды, хакеры любят жить опас­но, поэто­му спо­соб есть.

Греп­нув каталог с VS Code по стро­ке command in PATH, най­дем отсылку к JS-фун­кции installCommandLine:

$ pwd
/Applications/Visual Studio Code.app

$ grep -r ‘command in PATH’
./Contents/Resources/app/out/vs/workbench/workbench.desktop.main.js:… class S extends I.Action2{constructor() {super({id:»workbench.action.installCommandLine»,title:{value:(0,t.localize)(1,null,L.default.applicationName),original:Install '${L.default.applicationName}' command in PATH} …

Да­лее, греп­нув по installCommandLine, най­дем само тело исполня­емой коман­ды.

$ grep -r ‘installShellCommand’
./Contents/Resources/app/out/vs/code/electron-main/main.js:… async installShellCommand(T){const{source:U,target:H}=await this.n();try{const{symbolicLink:re}=await p.SymlinkSupport.stat(U);if(re&&!re.dangling){const Y=await(0,u.realpath) (U);if(H===Y)return}await p.Promises.unlink(U)}catch(re){if(re.code!==»ENOENT»)throw re}try{await p.Promises.symlink(H,U)}catch(re) {if(re.code!==»EACCES»&&re.code!==»ENOENT»)throw re;const{response:Y}=await this.showMessageBox(T,{type:»info»,message:(0,y.localize) (0,null,this.h.nameShort),buttons:[(0,y.localize)(1,null),(0,y.localize)(2,null)]});if(Y===0)try{const ne=osascript -e "do shell script "mkdir -p /usr/local/bin && ln -sf '${H}' '${U}'" with administrator privileges";await(0,O.promisify)(E.exec) (ne)}catch{throw new Error((0,y.localize)(3,null,U))}}} …

Как видишь, нич­то не меша­ет нам добавить собс­твен­ное дей­ствие к коман­де osascript, но надо при­думать, что имен­но мы можем сде­лать для сох­ранения и пос­леду­юще­го вос­ста­нов­ления при­виле­гиро­ван­ного дос­тупа.

osascript -e "do shell script "mkdir -p /usr/local/bin && ln -sf '${H}' '${U}'" with administrator privileges"

Курс Offensive Security «EXP-312: Advanced macOS Control Bypasses» пред­лага­ет изме­нить нас­трой­ки PAM-модуля (а имен­но переч­ня обя­затель­ных кри­тери­ев при аутен­тифика­ции через sudo), что­бы имперсо­ниро­вать root без пароля. Это дела­ется с помощью изме­нения фай­ла нас­тро­ек /etc/pam.d/sudo.

К сожале­нию, этот спо­соб не взле­тел в macOS 13.2.1, пос­коль­ку теперь недос­таточ­но быть рутом, что­бы менять содер­жимое чувс­тви­тель­ных фай­лов на дис­ке (все, что свя­зано с кре­дами и аутен­тифика­цией). Для это­го у про­цес­са, который зап­рашива­ет такие изме­нения, дол­жна быть при­виле­гия Full Disk Access, которая навеши­вает­ся толь­ко через GUI.

Источник: xakep.ru

Ответить

Ваш адрес email не будет опубликован. Обязательные поля помечены *