Как собрать файл у кого-то…

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

  • Нарисуйте набор пузырьков заданного пользователем размера и не оставляйте пробелов между ними.
  • Создайте инструмент, который извлечет файл с чьего-либо рабочего стола (и с помощью социальной инженерии заставьте его открыть его).
  • Безопасный чат-клиент

Я выбрал второй вариант просто потому, что он лучше всего соответствовал моему набору навыков и казался достаточно сложным для трехдневного проекта. В третьем мне казалось, что я могу взять существующий чат-клиент и просто применить к нему немного RSA, чтобы сделать его безопасным. А первый показался скучным. Итак, давайте погрузимся.

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

Поэтому я решил, что отправлю решение проблемы с пузырем, так как он уже ждал от меня письма. Но тогда просто пусть этот код запустит моего агента по сбору платежей. Я мог бы написать свой агент на C++, а затем использовать подпроцесс Python и rundll32 для запуска DLL. Это казалось идеальным:

  1. Хотя Python довольно мощный, никто не считает его «опасным» файловым форматом. Если вы видите файл vbs, вы предполагаете, что это вирус. Скрипт на питоне? Что угодно, просто запустите его. Его легко открыть исходный код, так что все должно быть в порядке.
  2. Я мог бы кодировать свою dll в base 64, скинуть ее на диск и запустить.
  3. Если бы я поместил в решение достаточно файлов Python, то не было бы очевидно, что происходит.

Отлично, так что я могу написать это как DLL.

Я написал DLL на C++ с сильно объектно-ориентированной моделью. На моей основной работе мы много занимаемся разработкой на C++ в стиле C (то, что один из моих коллег лаконично назвал C+). Для этого нет реальной причины, кроме того факта, что все так поступали. Я настаивал на том, чтобы мы переключились, но я подумал, что это был отличный опыт, чтобы сначала прыгнуть с головой, чтобы немного попрактиковаться.

Мне также нужен был способ «всегда наверху», чтобы я мог собирать свою коллекцию. Проверенный и надежный метод — просто использовать IRC в качестве сервера управления и контроля. Хотя, если честно, из-за нехватки времени я не смог получить реального командования и контроля. Наверное, лучше, что я был ограничен во времени, иначе я мог бы построить имплантат, который мог бы справиться с задачей.

В конце концов, я устанавливаю соединение с IRC, а затем запускаю «опрос» (который просто ищет ~/Desktop/flag.txt и отправляет его обратно). Жестко закодировано. Некрасиво, но это сработало в моем тестировании.

Вторая часть этого заключалась в том, чтобы «социально спроектировать» цель для запуска имплантата. Вся эта часть была добавлена ​​в последнюю минуту (буквально 11-й час, так как хотели к полуночи, а я начал эту часть в 23:00). Я уже почти решился на вызов пузыря, но использовал subprocess.call(‘rundll32 mydll.dll,#1’) в качестве метода запуска DLL. Это блокирующий вызов, и хотя у меня есть способы запустить функцию как отдельный процесс в Python, это действительно подошло ко времени. Итак, я написал кое-что, похожее на скрипт рисования (с черепахой), поместил кучу файлов Django в структуру каталогов, чтобы она выглядела законной, и поместил мою dll, закодированную в base64, в файл (на несколько папок).

Частью социальной инженерии было электронное письмо, в котором, по сути, извинялись за то, что у него не было больше времени, чтобы поработать над ним, и что оно должно работать. При запуске пишет ошибку и зависает. На данный момент мне просто нужно, чтобы скрипт Python работал около 10 секунд, чтобы установить соединение с IRC. Согласно журналам IRC, которые я получил сегодня вечером, он дал ему поработать около двух минут, чего было более чем достаточно, чтобы получить мою коллекцию!

После этого я смог поговорить со своей целью и обнаружил, что все работает довольно хорошо, за исключением двух вещей:

  • Моя электронная почта не совсем обманула его. Он сказал, что это была одна из лучших попыток, которые он видел для этого испытания, но в целом он довольно подозрительный. Ну что ж.
  • Я не линковал статически все необходимые библиотеки. Хотя, учитывая, что я не проводил тестирования вне своего ящика для разработчиков (опять же, время), я считаю это довольно большой победой.

Так мило.

Вещи, на которые у меня не было времени:

  • Настойчивость — вероятно, не нужна, потому что это просто разбить и захватить, но я собирался забросить ее в Аппинит.
  • Разрешение ему получать задачи — подключитесь к IRC-серверу и попросите бота дать ему динамическую задачу. Это в какой-то степени потребовало бы написания протокола и было излишним. Легко пропустить в этот период.
  • Защитное программирование — в основном я проверял возвращаемые значения. Главным образом. Там было что улучшать.

Вскоре я опубликую это на Github (сейчас у меня проблемы), но вот zip-код с кодом: https://www.dropbox.com/s/5ecn7jkxbh791fh/FileCollection.zip?dl=0