Содержание статьи
Pentest Award
В августе 2023 года прошла церемония награждения Pentest Award — премии для специалистов по тестированию на проникновение, которую учредила компания Awillix. Мы публикуем лучшие работы из каждой номинации. Эта статья заняла третье место в номинации «Ловись, рыбка», посвященной фишингу.
Этот способ мы применили по заказу одного очень крупного российского холдинга в ходе комплексной операции Red Team. Заказчик настоял на реализации следующего сценария: нас «устраивают» в компанию по согласованной легенде как внешних сотрудников на удаленке с выданным MacBook в качестве рабочего ноута.
Так как привилегии обычных сотрудников на «маках» в организации сильно урезаны, обращения к техподдержке по большей части состоят из писем вроде «админ, помоги мне установить такую‑то программу». Из этого родилась идея воспользоваться этой особенностью рабочего процесса для повышения привилегий на «маке» до рута и заполучить служебную учетку из /
для развития дальнейших атак на AD.
Спуфим диалог аутентификации
В паблике есть мануал по написанию вредоносного расширения, которое умеет само стартовать при запуске VS Code и светить назойливым окном в глаза ненавистному админу, клянча его пароль.
![](https://static.xakep.ru/images/72b80d5fe07db2727227f34863ee5260/33165/image7_NhLptfm.png)
Достоинство этого метода в том, что можно получить креды привилегированной учетки в открытом виде. Расширение пишется в пользовательскую директорию ~/.
, поэтому, даже если у админа стоит чистый VS Code, запуск модульного окна сохранится.
Недостаток в том, что надо поймать очень уставшего админа, чтобы предприятие взлетело, — диалоговое окно рисуется с помощью AppleScript, поэтому выглядит весьма халтурно и серьезно отличается от встроенных окон запроса расширенных привилегий. В связи с этим мы решили найти другой способ абьюзить VS Code.
Модифицируем VS Code
Несмотря на то что VS Code можно запускать с привилегиями пользователя, внутри есть дополнительные функции, которые требуют прав администратора. Например, интеграция команды code
в консоль (для этого вносятся изменения в системный PATH
). В VS Code это делается командой из Command Palette (Command-Shift-P).
Хотя разработчики Code настоятельно не рекомендуют изменять встроенные системные команды, хакеры любят жить опасно, поэтому способ есть.
![](https://static.xakep.ru/images/72b80d5fe07db2727227f34863ee5260/33164/image6.png)
![](https://static.xakep.ru/images/72b80d5fe07db2727227f34863ee5260/33161/image3_l2puSMR.png)
Грепнув каталог с VS Code по строке command
, найдем отсылку к 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
} ...
Далее, грепнув по 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
;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 без пароля. Это делается с помощью изменения файла настроек /
.
![](https://static.xakep.ru/images/72b80d5fe07db2727227f34863ee5260/33162/image4.png)
К сожалению, этот способ не взлетел в macOS 13.2.1, поскольку теперь недостаточно быть рутом, чтобы менять содержимое чувствительных файлов на диске (все, что связано с кредами и аутентификацией). Для этого у процесса, который запрашивает такие изменения, должна быть привилегия Full Disk Access, которая навешивается только через GUI.
Продолжение доступно только участникам
Вариант 1. Присоединись к сообществу «Xakep.ru», чтобы читать все материалы на сайте
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее
Вариант 2. Открой один материал
Заинтересовала статья, но нет возможности стать членом клуба «Xakep.ru»? Тогда этот вариант для тебя! Обрати внимание: этот способ подходит только для статей, опубликованных более двух месяцев назад.
Я уже участник «Xakep.ru»