Взлом

Hack Overflow. Как взломали Stack Overflow и как шло расследование


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

  • Взгляд изнутри
  • Ход атаки
  • Вас заметили
  • Расследование
  • Итоги

Нет на све­те прог­раммис­та, который не слы­шал бы о Stack Overflow. На этом чудес­ном сай­те мож­но най­ти ответ прак­тичес­ки на любой воп­рос — от спо­соба побороть хит­рый баг в коде до смыс­ла жиз­ни, все­лен­ной и все­го такого. В мае 2019 года Stack Overflow взло­мали, похитив исходни­ки плат­формы. При­чем взло­мали с исполь­зовани­ем рекомен­даций и советов, опуб­ликован­ных на самом Stack Overflow. Как это получи­лось и как уда­лось обна­ружить втор­жение?
 

Взгляд изнутри

Нес­мотря на то что боль­шинс­тво поль­зовате­лей вос­при­нима­ют Stack Overflow как бес­плат­ный ресурс для поис­ка отве­тов на тех­ничес­кие воп­росы о прог­рамми­рова­нии и адми­нис­три­рова­нии, это в пер­вую оче­редь ком­мерчес­кий про­ект. Сайт вхо­дит в сос­тав гло­баль­ной сети Stack Exchange Network, объ­еди­няющей нес­коль­ко пор­талов с воп­росами и отве­тами в раз­ных областях зна­ний, которые соб­раны на еди­ной плат­форме. Stack Overflow, дви­жок которо­го написан на С# с исполь­зовани­ем ASP.NET, стал пер­вым ресур­сом в этой сети.

Поль­зовате­ли пор­тала могут не прос­то задавать воп­росы и отве­чать на них, но и наращи­вать собс­твен­ную репута­цию бла­года­ря активно­му учас­тию в жиз­ни сай­та. Рей­тинг дает боль­ше воз­можнос­тей: допол­нитель­ный вес голоса при оцен­ке отве­тов, воз­можность редак­тировать чужие тек­сты и пос­ты — вплоть до модера­тор­ских пол­номочий. Stack Overflow быс­тро наб­рал популяр­ность: уже спус­тя четыре года пос­ле появ­ления его ауди­тория вырос­ла до двух мил­лионов пос­тоян­ных поль­зовате­лей и про­дол­жала понем­ногу уве­личи­вать­ся.

Мо­нети­зиру­ется пло­щад­ка за счет рек­ламы (поль­зовате­ли с высоким рей­тин­гом видят мень­ше объ­явле­ний) и встро­енно­го сер­виса по под­бору пер­сонала Stack Overflow Careers (поз­же пере­име­нован­ного в Talents), который поз­воля­ет сто­рон­ним фир­мам и рек­рутин­говым агентствам искать сот­рудни­ков сре­ди населя­ющих сайт прог­раммис­тов. Кро­ме того, Stack Overflow про­дает биз­нес‑вер­сию сво­его движ­ка и ока­зыва­ет тех­поддер­жку фир­мам, жела­ющим раз­вернуть собс­твен­ный сер­вис воп­росов‑отве­тов. Этот про­дукт нацелен на коман­ды раз­работ­чиков и поз­воля­ет соз­давать базы зна­ний для внут­рикор­поратив­ного исполь­зования. Называ­ется он Stack Teams.

Все эти ком­мерчес­кие про­екты неп­рерыв­но обновля­ются и совер­шенс­тву­ются. Прог­раммис­ты устра­няют выяв­ленные ошиб­ки, добав­ляют новые фун­кции, опти­мизи­руют код, улуч­шают интерфейс. При раз­работ­ке исполь­зуют­ся решения для тес­тирова­ния и кон­тро­ля вер­сий, репози­тории для хра­нения кода, билд‑сер­веры, баг‑тре­керы и вики для внут­ренней докумен­тации. Короче, все как у боль­ших соф­твер­ных кор­пораций. С той лишь раз­ницей, что боль­шинс­тво сот­рудни­ков Stack Exchange работа­ют уда­лен­но и под­клю­чают­ся к необ­ходимым ресур­сам через интернет.

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

 

Ход атаки

Как извес­тно, любая хакер­ская ата­ка начина­ется с раз­ведки. Таинс­твен­ный зло­умыш­ленник начал про­щупы­вать инфраструк­туру, свя­зан­ную с сер­висами хра­нения исходни­ков и сбор­ки бил­дов ком­мерчес­ких про­дук­тов Stack Exchange, еще 30 апре­ля 2019 года. По всей видимос­ти, реког­носци­ров­ка вклю­чала в себя стан­дар­тные мероп­риятия вро­де поис­ка суб­доменов, обще­дос­тупных ресур­сов и ска­ниро­вания пор­тов. Кро­ме того, он попытал­ся зай­ти в слу­жеб­ный чат для сот­рудни­ков Stack Exchange, но не смог получить дос­туп туда.

На сле­дующий день, 1 мая, хакер попытал­ся решить свою задачу «в лоб»: пред­ста­вив­шись одним из кор­поратив­ных кли­ентов, он отпра­вил зап­рос в тех­поддер­жку с прось­бой выс­лать ему исходный код Enterprise-про­дук­та в целях ауди­та. Не про­кати­ло: во‑пер­вых, Stack Exchange не пре­дос­тавля­ет исходни­ки сво­им поль­зовате­лям, а во‑вто­рых, адрес элек­трон­ной поч­ты зло­умыш­ленни­ка не уда­лось сопос­тавить ни с одним из реаль­ных кли­ентов ком­пании. Заяв­ка была ожи­даемо откло­нена.

Но это отнюдь не осту­дило пыл хакера. Зарегис­три­ровав­шись в сер­висе Stack Teams, он начал иссле­довать его воз­можнос­ти, отправ­ляя приг­лашения при­соеди­нить­ся к сер­вису на дру­гие свои учет­ки — веро­ятно, что­бы иссле­довать генери­руемые при этом зап­росы и откли­ки сер­вера. Одновре­мен­но он вни­матель­но изу­чал темати­чес­кие вет­ки на самом Stack Overflow, свя­зан­ные с про­дук­том Enterprise и сер­висом Teams.

Ад­мины StackOverflow под­меча­ют: «Нель­зя прос­то взять и взло­мать StackOverflow, не под­гля­дывая на StackOverflow»

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

info

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

В пос­леду­ющие дни ата­кующий тща­тель­но изу­чал про­фили сот­рудни­ков сап­порта Stack Exchange и осо­бен­ности обра­бот­ки зап­росов от поль­зовате­лей, но, видимо, не нашел ничего инте­рес­ного. Зато в одном из откры­тых репози­тори­ев ком­пании на GitHub он обна­ружил URL архи­ва с исходным кодом Stack Overflow, выложен­ного на при­ват­ном акка­унте GitHub Enterprise. Хакер попытал­ся ска­чать архив, но был перенап­равлен на стра­ницу авто­риза­ции. Сно­ва неуда­ча.

На­конец, 5 мая 2019 года нас­той­чивость ата­кующе­го была воз­награж­дена. Нас­трой­ки кон­тро­ля дос­тупа в Stack Exchange допус­кали имперсо­нацию поль­зовате­лей в тес­товых целях, бла­года­ря чему зло­умыш­ленни­ку уда­лось подоб­рать парамет­ры зап­роса, поз­воля­ющие авто­ризо­вать­ся в сис­теме на уров­не раз­работ­ки. Вслед за этим взлом­щик попытал­ся зай­ти на ряд внут­ренних ресур­сов, URL которых он нашел в докумен­тации на пор­тале под­дер­жки Enterprise-вер­сии про­дук­та, но прак­тичес­ки вез­де получил отказ в дос­тупе из‑за отсутс­твия необ­ходимых при­виле­гий. Вез­де, кро­ме одно­го слу­жеб­ного пор­тала, с помощью которо­го он смог повысить собс­твен­ные пра­ва до Community Manager — это роль, соот­ветс­тву­ющая уров­ню модера­тора сай­та.

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

Для сбро­са пароля учет­ки в Stack Exchange исполь­зует­ся сооб­щение email с «вол­шебной ссыл­кой» — этот тра­дици­онный спо­соб всег­да счи­тал­ся дос­таточ­но надеж­ным. Одна­ко у поль­зовате­лей с при­виле­гиями Community Manager есть воз­можность прос­матри­вать содер­жимое авто­мати­чес­ки отправ­ляемых сай­том писем. Таким обра­зом взлом­щик получил при­виле­гии раз­работ­чика, а заод­но — дос­туп к нас­трой­кам сай­та, вклю­чающим управле­ние мно­гими внут­ренни­ми его фун­кци­ями.

В течение некото­рого вре­мени хакер увле­чен­но изу­чал открыв­шиеся перед ним воз­можнос­ти, тес­тировал нас­трой­ки сай­та и пытал­ся понять, какими фун­кци­ями он теперь может управлять. Сре­ди про­чих парамет­ров он неожи­дан­но нат­кнул­ся на дан­ные учет­ной записи билд‑сер­вера TeamCity. Эта тех­ничес­кая учет­ка рань­ше исполь­зовалась для дос­тупа к TeamCity REST API непос­редс­твен­но из кода Stack Exchange. На вре­мя опи­сыва­емых событий эту фун­кцию уже убра­ли из кода, а вот учет­ную запись при­бить почему‑то забыли.

Об­радован­ный хакер попытал­ся вой­ти с эти­ми дан­ными на сер­вер TeamCity, нас­тро­енный на воз­можность авто­риза­ции через интернет, и из‑за неп­равиль­ной кон­фигура­ции служ­бы наз­начения ролей тут же получил к нему адми­нис­тра­тор­ский дос­туп.

info

TeamCity — написан­ный на Java билд‑сер­вер про­изводс­тва ком­пании JetBrains, раз­работан­ный для обес­печения неп­рерыв­ной интегра­ции. С помощью спе­циаль­ных сце­нари­ев он поз­воля­ет авто­мати­зиро­вать мно­гие рутин­ные про­цес­сы раз­работ­ки, вклю­чая отсле­жива­ние изме­нений в раз­ных вет­вях репози­тория, про­гон тес­тов, сбор­ку при­ложе­ния и его заг­рузку на сер­вер обновле­ний. TeamCity час­то исполь­зует­ся ком­пани­ями, которые работа­ют со сте­ком тех­нологий C#/ASP.NET.

Та­кой оглу­шитель­ный успех, по всей видимос­ти, стал сюр­при­зом для самого взлом­щика. Судя по тому, что он начал активно искать на Stack Overflow информа­цию о нас­трой­ке и исполь­зовании TeamCity, с этим про­дук­том он стол­кнул­ся впер­вые. Для начала хакер смог заг­рузить с сер­вера и изу­чить некото­рые сце­нарии нас­трой­ки кон­фигура­ции для Enterprise-про­дук­тов Stack. Одновре­мен­но с этим он про­дол­жает копать­ся в спра­воч­ных раз­делах на Stack Overflow в поис­ках све­дений о нас­трой­ке IIS, воз­можнос­тях TeamCity и осо­бен­ностях про­дук­тов Stack Teams. Изу­чение мат­части заняло у него нес­коль­ко дней.

В сре­ду, 8 мая (то есть на девятый день пос­ле пер­вой попыт­ки про­ник­нуть в инфраструк­туру Stack Exchange), зло­умыш­ленник прос­матри­вал адми­нис­тра­тив­ные ресур­сы TeamCity и слу­чай­но нат­кнул­ся на раз­дел диаг­ности­ки, поз­воля­ющий прос­матри­вать фай­лы на билд‑сер­вере. Сре­ди них он обна­ружил хра­нящий­ся в обыч­ном плейн‑тек­сте ключ SSH, который исполь­зовали аген­ты сбор­ки для получе­ния исходно­го кода из GitHub Enterprise. Тут сле­дует отме­тить, что если в учет­ную запись GitHub добав­лен откры­тый SSH-ключ, то этот ключ может исполь­зовать­ся для дос­тупа к репози­торию без допол­нитель­ной аутен­тифика­ции.

Это­го ока­залось дос­таточ­но, что­бы хакер успешно кло­ниро­вал нес­коль­ко клю­чевых репози­тори­ев (пока шел про­цесс кло­ниро­вания, он искал на Stack Overflow информа­цию по сбор­ке про­ектов .NET). Одновре­мен­но зло­дей попытал­ся авто­ризо­вать­ся в GitHub Enterprise нап­рямую с учет­ными дан­ными служ­бы, которые он рань­ше исполь­зовал для дос­тупа к TeamCity. Но тут его жда­ла неуда­ча: адми­ны ком­пании догада­лись нас­тро­ить в сво­ем экзем­пля­ре GitHub Enterprise двух­фактор­ную аутен­тифика­цию, а ском­про­мети­рован­ная учет­ка не вхо­дила в груп­пу Active Directory, которой был раз­решен туда дос­туп.

На сле­дующий день хакер безус­пешно попытал­ся под­клю­чить­ся к VPN Stack Exchange с исполь­зовани­ем вир­туаль­ной машины Azure и дан­ных учет­ной записи, открыв­шей ему дос­туп к TeamCity. Одновре­мен­но с этим он про­дол­жал искать информа­цию на Stack Overflow об осо­бен­ностях сбор­ки при­ложе­ний .NET под IIS, а так­же о выпол­нении сце­нари­ев SQL в сре­де Azure.

 

Вас заметили

11 мая зло­умыш­ленник извлек все копии кло­ниро­ван­ных им репози­тори­ев и начал иссле­довать жур­налы сбор­ки и кон­фигура­ции TeamCity. Затем он нас­тро­ил в TeamCity сопос­тавле­ние имен поль­зовате­лей Git таким обра­зом, что­бы в жур­налах ауди­та учет­ная запись аген­та сбор­ки, с которой сопос­тавлен ском­про­мети­рован­ный ключ SSH, выг­лядела дру­гой учет­ной записью.

Пос­ле это­го хакер соз­дал в TeamCity новый про­ект, отклю­чил для него про­вер­ку изме­нений в Git и попытал­ся сде­лать нес­коль­ко сбо­рок с раз­ными кон­фигура­циями, что­бы получить дос­туп к внут­ренней базе дан­ных Stack Exchange и сис­теме управле­ния пакета­ми NuGet.

Пос­ле ряда неудач­ных попыток взлом­щик пошел дру­гим путем. Он зарегис­три­ровал на GitHub обще­дос­тупную сущ­ность gist, содер­жащую набор SQL-инс­трук­ций, и соз­дал на сер­вере TeamCity работа­ющую сбор­ку, которая выпол­няла с исполь­зовани­ем этих инс­трук­ций миг­рацию SQL для базы дан­ных с информа­цией о поль­зовате­лях Stack Exchange. Это поз­волило взлом­щику повысить свои при­виле­гии в сети Stack до адми­нис­тра­тор­ских.

Пос­ле успешно­го выпол­нения SQL-зап­роса хакер начал стре­митель­но заметать сле­ды ата­ки — уда­лил все соз­данные им сбор­ки и почис­тил исто­рию в логах TeamCity. Единс­твен­ное, чего он не пре­дус­мотрел, так это того, что на сер­вере было нас­тро­ено некото­рое подобие «кор­зины», из которой впос­ледс­твии мож­но вос­ста­новить уда­лен­ные объ­екты. Это дало иссле­дова­телям воз­можность изу­чить хро­ноло­гию его дей­ствий.

12 мая нес­коль­ко учас­тни­ков сооб­щес­тва уве­доми­ли адми­нов Stack о появ­лении нового подоз­ритель­ного поль­зовате­ля, при­виле­гии которо­го без видимых при­чин вырос­ли до небыва­лых высот — он получил дос­туп на уров­не раз­работ­чика и адми­нис­тра­тора ко всем сай­там и ресур­сам в сети Stack Exchange. Эти фак­торы зас­тавили ответс­твен­ных сот­рудни­ков заподоз­рить: что‑то в сети, воз­можно, идет не так.

Ад­мины обра­тились к базе дан­ных, где сох­раня­ется жур­нал все­го тра­фика к обще­дос­тупным ресур­сам Stack Exchange. Исполь­зуя иден­тифика­тор подоз­ритель­ной учет­ной записи, они пос­тарались вычис­лить все свя­зан­ные с ней IP-адре­са и про­чую информа­цию, которая помог­ла бы вычис­лить зло­умыш­ленни­ка. На выходе получи­лось более 75 тысяч строк дан­ных, которые им пред­сто­яло тща­тель­но изу­чить.

 

Расследование

Со­пос­тавив логи с информа­цией из дру­гих источни­ков, иссле­дова­тели приш­ли к выводу, что повыше­ние при­виле­гий неиз­вес­тно­го поль­зовате­ля — это куль­минация ата­ки, для­щей­ся вот уже на про­тяже­нии 13 дней. Не имея точ­ного пред­став­ления о ее мас­шта­бе, в пер­вую оче­редь они уда­лили подоз­ритель­ную учет­ку и при­нялись искать в логах информа­цию о деятель­нос­ти зло­умыш­ленни­ка в сети. Имен­но бла­года­ря сох­ранив­шимся в жур­налах дан­ным впос­ледс­твии уда­лось вос­ста­новить хро­ноло­гию ата­ки — вплоть до поис­ковых зап­росов хакера на сай­те Stack Overflow.

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

Оставить комментарий

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