Прибыльный DLL Hijacking

Ни для кого не секрет, что за последнее время уязвимость типа DLL Hijacking была найдена в довольно большом количестве популярных приложений (например, Winamp, uTorrent, FireFox, Opera и др.). Суть уязвимости сводится к возможности подгрузки сторонней DLL при открытии некоторых типов файлов этими приложениями.
Решил провести оценку потенциальных возможностей от данного наплыва. Так как специфика уязвимости состоит в том, что зачастую требуется, чтобы инстанс приложения не был запущен до попытки открытия файла, то наиболее актуальными показались следующие уязвимости: уязвимость в Winamp и уязвимость в Daemon tools lite.
Идея использования состоит в следующем: берутся свежие релизы с зарубежных музыкальных и игровых трекеров (например, sceneaccess, waffles, what.cd, blackcats-games), комплектуются dll'кой и перезаливаются на популярные российские трекеры (rutracker, торренты на ВКонтакте и т.д.). Подбирая актуальные новинки, можно получить приличное количество скачиваний в короткие сроки или можно выкладывать фейки альбомов/игр/фильмов.
С помощью фейков удается привлечь большее количество скачиваний в сутки, особенно если следить за раздачами и пересоздавать их в случае разоблачения, реальные раздачи обладают большей стабильностью.

Для тестирования данной идеи была написана DLL, которая обладает следующим функционалом:
1. Ищет процесс FireFox
2. Сплайсит функцию send
3. Добавляет дополнительный текст при отправке личного сообщения на ВКонтакте

Конечно, можно было бы сделать более широкий функционал, например: отправка аккаунтов от различных сервисов на гейт, инжект во все популярные браузеры, а не только в FireFox, инжект в всевозможные icq клиенты, подмена выдачи поисковиков, прописывание себя в реестр в AppInit_DLLs, скачивание и запуск чего-либо из интернета, да, в конце концов, закрепление в системе.
Но целью было исследование эффективности, а не получение прибыли с этого. DLL состоит из двух частей: одна часть на С, другая - на masm. Первая часть хранит в себе вторую и осуществляет поиск процесса и инжект в него второй части. Вторая часть осуществляет сплайсинг функции send и подмену содержимого сообщений. Да, реализация так себе, но, кому надо - тот перепишет под себя.

Код первой части:

Пример использования функции RtlCompressBuffer для сжатия файла можно посмотреть тут.
Преобразовать сжатый файл в hex можно следующим скриптом на Perl:

Код второй части:

inject.asm, используемый в коде, представляет собой набор макросов из статьи "Делаем собственный инжектор". Данный файл на всякий случай включен в архив в конце статьи.

Если у Вас возникают проблемы с пониманием кода, то советую обратиться к следующим статьям: раз, два, три. Необходимые инструменты для компиляции второй части можно найти тут.

Результат работы выглядит следующим образом:
1. Пользователь пишет сообщение, нажимает отправить

2. В исходящих оказывается сообщение с пользовательским текстом и добавкой из библиотеки

Ужасно тривиально.
Чем это полезно? Во-первых, можно осуществлять рассылки без необходимости приобретения актуальных программ для этих целей, во-вторых, не требуются прокси, т.к. рассылку осуществляет владелец аккаунта (хотя объемы рассылки будут заметно ниже, ибо не каждый общается со всем своим контакт-листом каждый день), в-третьих, такие рассылки с большей вероятностью проходят фильтр на основе теоремы Байеса (меньше вероятность того, что получатель нажмет кнопку "Это спам", большее разнообразие текстов).

Знакомый человек протестировал данную систему, и вот что у него получилось.
1. Было создано 10 разных раздач на нескольких трекерах.
2. В качестве контента использовались новинки из области музыки, игр и фильмов (т.к. mpc тоже уязвим).
3. Одна удачная раздача набрала ~8900 скачиваний всего за несколько дней.

4. Суммарно 10 раздач были скачаны ~50000 раз

О проценте сработавших инжектов судить можно только косвенно, но по информации знакомого ему удалось заработать ~150$ за 7 дней на этом деле. Для многих это, наверное, не слишком большая сумма, однако тут многое зависит от качества реализации и оригинальности идеи.
Более качественный и функциональный код + несколько удачных раздач + правильный подход смогут дать многократное увеличение прибыли.

Исходные коды: скачать
Программа для сжатия с помощью RtlCompress из комментариев: скачать

Прибыльный DLL Hijacking: 73 комментария

  1. Да.. Идея просто супер) Открывающиеся возможности безграничны.. как же защититься самому от этой уязвимости?))

    1. Чаще обновляться (разработчики uTorrent уже выпустили соответствующее обновление) и следить за содержимым скачиваемого контента

  2. Хех идея знакома,я так подменяла одну из оригинальных библиотек на свою в Internet Explorer 7 для перехвата Post запросов.Подменная библиотека повторяет экспорт оригинальной с переходниками на реальные функции.Так же
    есть способы для FireFox и Оперы.Изьян в том,что нет верификации.

      1. Ты меня явно с кем то спутал.Никаких кандидатских у меня и в помине не было и к программированию я
        имею очень отдалённое и посредственное отношение.У мну совсем другая специальность.

    1. Если имеется в виду

      Safe DLL search mode is enabled by default starting with Windows XP with SP2.

      То могу сказать, что на 2 копиях XP SP3 лицензионных этот режим по-умолчанию выключен

  3. [QUOTE]То могу сказать, что на 2 копиях XP SP3 лицензионных этот режим по-умолчанию выключен[/QUOTE]

    Не могу утверждать, но на двух копиях не лицензионной XP SP3, данный параметр включен по умолчанию, по крайней мере ключ "SafeDllSearchMode" - отсутствует, что собственно и говорит, о том, что данный режим включен.

    Так же у меня не получилось запустить ни данный пример (используя Winamp v5.572 и v5.581):

    http://www.exploit-db.com/exploits/14789

    Ни пример с хабра:

    http://habrahabr.ru/company/eset/blog/102549/

    PS: Приложения на которых тестировались тестовые dll'ки - ни разу не запускались, да же после перезагрузки...
    PSS: Собственно, кто-то из комментирующих смог, запустить тестовые DLL, с параметрами по умолчанию, т.е. не правя никакие реестры?

  4. Блин, такие темы палишь, а при это шлешь спам на сраный, уже добитый контакт. Ты видел статсы подменщиков, например?

  5. То, что при твоих способностях на порядок выгоднее использовать подобные знания, нежели расписывать, как спамить контакт с чужих акков. Но тебе виднее, конечно ;)

  6. Но вообще из своего лоадера можно подгрузить свою dll к любому процессу? Например, с помощью того же удаленного потока можно заставить uTorrent загрузить нашу dll?

  7. Андеграунд не надоел? Самым крутым IT-шником ты не станешь, всегда найдётся лучше и больше. Может стоит попробовать создать свой перспективный проект?

    1. В чем тут андеграунд то? Разработка и поддержка проекта - скучнейшее занятие, да и не стремлюсь я стать программистом, так как учусь совершенно в другом направлении, а блог - это всего лишь хобби.

  8. при выполнении ф-ции
    CreateRemoteThread(hProcess, NULL, 0,
    (unsigned long (__stdcall *)(void *))p_code, 0, 0, &id);

    вылетает FireFox и завершается аварийно , с чем бороться
    , все ф-ции API выполняются без ошибок. проверял на GetLastError.

    Хотел попросить автора вместе с исходниками выкладывать хотя
    бы еще и bat-ники .
    Заранее спасибо

  9. спасибо за столь скоры ответ
    у меня 7-ка 32-х разрядная
    я изменил в
    CreateRemoteThread(hProcess, NULL, 0,
    (unsigned long (__stdcall *)(void *))p_code, 0, 0, &id);
    на
    CreateRemoteThread(hProcess, NULL, 0,
    (unsigned long (__stdcall *)(void *))p_code, 0, CREATE_SUSPENDED, &id);

    и пока молчит , значит , что-то не так в mem.DLL ?
    но попробую и ваш вариант

  10. а как можно трайсить ( TRACE ) асмовский код , я к примеру хочу свою либу написать , как мне ее проверить на работоспособность , не запускать же мне ее каждый раз из инжекта , чтобы видеть ошибку и не знать что делать
    заранее спасибо
    для быстрого обмена предлагаю аськами обменяться , надоедать сильно не буду
    обещаю
    391 569 069

  11. сегодня наткнулся на проблему , сообщение добавляет , а если хочешь удалить любое другое сообщение , то ФФ умирает

    1. Я с таким не сталкивался на XP, может косяк в коде, может от версии фф или ос зависит. Вообще можно просто detours воспользоваться и переписать на си, чтобы более менее исключить возможность косяков кода.

  12. вот написал компрессор для статьи , может кому-то понадобиться .
    Каими перезалей на страницу статьи , а то с файлообменника скоро удалят , я не думаю , что его скачают больше 1000 раз )))

  13. блин вообще ничего не понимаю
    1) написал свой асмовский код
    2) скомпресил его
    3) перевёл в hex с помошью Perl-a
    4) заменил tempbuf тем , что получилось в 3-ем пункте
    5) запустил 1-ую часть С++ dll inject
    6) ответ положительный, либа загружена , НО Process Explorer НЕ отображает либу в рабочем пространстве FireFox-a

    Все имена совпадают , все сходиться .
    Каими , не подскажешь ?
    Зарание спс . Извени чувак что задалбливаю

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

        MyFunc:
        push ebp
        mov ebp,esp

        ;__in SOCKET s, __in const char *buf, __in int len, __in int flags
        HOOK_ORIGINAL_CALL send,4

        pop ebp
        retn 4*4

  14. ведь можно взять и присоединить ну ВООБЩЕ пустую либу , ведь так ?
    пускай она просто весит в памяти ничего не делает , главное , что можно , но у меня вот и не получается
    П.С. извини Каими , я полный идиот , но писать просто больше некому (((

  15. да я понимаю , что трэйсить надо , только никак же не посмотришь .
    в OllyDBg ? там чёрт ногу сломает ((
    ладно буду пробовать
    больше доставать не буду , ... сегодня ))
    Спс чувак , мало кто откликается .

      1. я последний раз очень давно , что-то делал в Олли , и то было баловство это все .
        вот ты сказал про Stronggod , возьму на вооружение , я даже о таком не слыхал. да и умении отладки в Олли у меня на низчайшем уровне! ))

    1. В смысле? Почитай описание что собой представляет dll hijacking, дллку загрузит программа, подверженная данной уязвимости

  16. Очень интересная тема, но к сожалению не владею С++, пишу немного на java. После долгих попыток никак не получатся скомипилировать первую библиотеку. Вижуал Студио 2010 выдает следующие ошибки при компиляции (нумерация строк совпадает с приатаченным к статье main.cpp):

    c:\documents and settings\admin\мои документы\visual studio 2010\projects\kaimi\kaimi\dllmain.cpp(12): error C2059: синтаксическая ошибка: __stdcall
    c:\documents and settings\admin\мои документы\visual studio 2010\projects\kaimi\kaimi\dllmain.cpp(174): error C2065: fpRtlDecompressBuffer: необъявленный идентификатор
    c:\documents and settings\admin\мои документы\visual studio 2010\projects\kaimi\kaimi\dllmain.cpp(174): error C2146: синтаксическая ошибка: отсутствие ";" перед идентификатором "RtlDecompressBuffer"
    c:\documents and settings\admin\мои документы\visual studio 2010\projects\kaimi\kaimi\dllmain.cpp(174): error C2065: RtlDecompressBuffer: необъявленный идентификатор
    c:\documents and settings\admin\мои документы\visual studio 2010\projects\kaimi\kaimi\dllmain.cpp(174): error C2065: fpRtlDecompressBuffer: необъявленный идентификатор
    c:\documents and settings\admin\мои документы\visual studio 2010\projects\kaimi\kaimi\dllmain.cpp(174): error C2146: синтаксическая ошибка: отсутствие ";" перед идентификатором "GetProcAddress"
    c:\documents and settings\admin\мои документы\visual studio 2010\projects\kaimi\kaimi\dllmain.cpp(179): error C2065: NTSTATUS: необъявленный идентификатор
    c:\documents and settings\admin\мои документы\visual studio 2010\projects\kaimi\kaimi\dllmain.cpp(179): error C2146: синтаксическая ошибка: отсутствие ";" перед идентификатором "status"
    c:\documents and settings\admin\мои документы\visual studio 2010\projects\kaimi\kaimi\dllmain.cpp(179): error C2065: status: необъявленный идентификатор
    c:\documents and settings\admin\мои документы\visual studio 2010\projects\kaimi\kaimi\dllmain.cpp(180): error C3861: RtlDecompressBuffer: идентификатор не найден
    c:\documents and settings\admin\мои документы\visual studio 2010\projects\kaimi\kaimi\dllmain.cpp(191): error C2065: status: необъявленный идентификатор

      1. Скомпилировать удалось, но появилась другая проблема. Твоя сишная библиотека работает нормально, но вот если заменить внедренную в нее асмовскую библиотеку то rtlCompressBuffer возвращает ошибку. При чем я пытаюсь вставить твою же mem.asm
        Конкретнее:
        1. Компилирую mem.asm в mem.dll
        2. Сжимаю mem.dll (пробовал сжимать и прогой Arcka и этим кодом http://www.rohitab.com/discuss/index.php?showtopic=35293)
        3. Полученный бинарный файл конвертирую в hex твоим перл-скриптом
        4. Полученный hex вставляю вместо tempbuf
        5. rtlCompressBuffer возвращает "0xC0000242
        STATUS_BAD_COMPRESSION_BUFFER"
        Если вернуть исходный hex то все ок. В чем может быть проблема? Может какие-то специфические параметры сжатия?

        1. Размер буфера для распакованных данных увеличь попробуй. Там по-хорошему распаковку надо было бы немного по-другому реализовать.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *