Реализовать MITM-атаку на Windows куда сложнее, чем на Linux, потому что нет нормальной возможности пересылать транзитные пакеты. Мы сделаем так, чтобы шлюзом был минималистичный Linux, поднятый как виртуальная машина. При этом сетевые интерфейсы будут объединены в мост, что даст возможность гостевой ОС получить полноценный L2-доступ в тот же сетевой сегмент, что и скомпрометированной Windows. А поможет нам в этом VirtualBox.

Представь, что тебе удалось пробить сетевой периметр и получить доступ к серверу, который работает на Windows. Но что дальше? Нужно двигаться по инфраструктуре — от DMZ до контроллера домена или до технологической сети и управления турбинами!

Или что мы уже давно в локальной сети, но захватить контроль над каким-либо сервером не получается — все обновления установлены и нет никаких зацепок, кроме скомпрометированных машин в ее VLAN.

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

У доступа L2 есть ряд дополнительных преимуществ. Мы можем проводить:

  • MITM-атаки, эксплуатируя слабости протокола Ethernet (arpspoof);
  • атаки на NetBIOS (responder);
  • атаки на IPv6 (mitm6).

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

Так уж сложилось, что большинство хостов в локальных сетях работают на Windows. И так уж сложилось, что Windows, мягко говоря, не лучшая платформа для атак. Здесь нельзя полноценно реализовать IP forwarding, поэтому атака подобного рода грозит тем, что будет парализована работа всего сетевого сегмента.

Другие способы провернуть тоже непросто. Например, можно было бы настроить OpenVPN и сетевой мост, но настройка моста из командной строки в Windows реализована плохо, и, изменив настройки, скорее всего, ты безвозвратно потеряешь доступ.

 

Реализация

Разумеется, для полноценной постэксплуатации потребуются административные полномочия.

В качестве виртуальной машины, в которой мы будем запускать Linux на скомпрометированном хосте, я предлагаю использовать VirtualBox, поскольку она:

  • может быть установлена в тихом режиме;
  • поставляется с крайне функциональным CLI-инструментом VBoxManage;
  • может работать на старом железе без аппаратной виртуализации;
  • позволяет запустить виртуальную машину в фоне.

На первый взгляд такое решение может показаться немного громоздким, но, с другой стороны, у него есть свои плюсы:

  • такой подход никак не палится антивирусом, ведь мы используем только легитимное ПО;
  • не требуется ничего делать через графический интерфейс, достаточно psexec, webshell или netcat;
  • будет работать на всех Windows от XP/2003 до 10/2019;
  • метод достаточно чист в плане следов — все действия происходят в файловой системе виртуальной машины.

Главным же минусом будет необходимость копировать около 500 Мбайт файлов. Но зачастую это не особенно большая проблема.

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

 

Делаем гостевую систему

В качестве гостевой ОС есть смысл рассматривать два варианта:

  • Kali Linux с полноценным набором хакерского софта;
  • минималистичный дистрибутив с OpenVPN, который будет играть роль шлюза.

С первым вариантом все просто — скачал и запустил. В Kali почти наверняка будет весь необходимый арсенал.

Но мы вместо того, чтобы закидывать в эту виртуалку весь любимый софт, соберем свою с чистого листа и превратим в шлюз, который предоставит нам комфортный L2-доступ к атакованному хосту из любой точки мира.

Так мы сэкономим 1–2 Гбайт места, так как весь ][-софт будет запускаться с машины атакующего, да и антивирус в таком случае ничего не увидит.

Чтобы сделать дистрибутив минималистичным, потребуется создать его, что называется, from scratch. Наиболее переносимым вариантом будет 32-битная система.

Создаем образ, который впоследствии будем наполнять:

truncate -s 1G linux.img

Мы указали размер образа с запасом в 1 Гбайт, в дальнейшем формат VDI сожмет пустоты.

Создаем разметку диска — один логический раздел:

$ fdisk linux.img Command (m for help):n Command (m for help):p Partition number (1-4, default 1): First sector (2048-2097151, default 2048): Last sector, +/-sectors or +/-size{K,M,G,T,P} (2048-2097151, default 2097151): Command (m for help):w Command (m for help):q

Создаем файловую систему и монтируем готовый раздел:

sudo losetup -o $[2048*512] /dev/loop0 linux.img
sudo mkfs.ext4 /dev/loop0
sudo mount /dev/loop0 /mnt/

Скачиваем минимальный набор user-space:

sudo debootstrap --arch=i386 --variant=minbase stable /mnt/ http://http.us.debian.org/debian

Теперь осталось собрать ядро:

cd /usr/src/linux-5.5.1/

Создаем дефолтную конфигурацию ядра:

make ARCH=i386 defconfig

Также нам потребуется несколько дополнительных модулей:

make ARCH=i386 menuconfig
  • Сперва самое главное — поддержка сетевого моста (bridge): Networking support → Networking options → 802.1d Ethernet Bridging.
  • Поддержка виртуальных интерфейсов (tun) тоже потребуется: Device Drivers → Network device support → Network core driver support → Universal TUN/TAP device driver support.
  • Помимо OpenVPN, туннель можно построить и через GRE (опционально): Networking support → Networking options → TCP/IP networking → The IPv6 protocol → IPv6: GRE tunnel.
  • Для построения PPP-туннелей в одну команду (тоже опционально): Device Drivers → Network device support → PPP (point-to-point protocol) support.

Собираем ядро:

make ARCH=i386 prepare
make ARCH=i386 scripts
make ARCH=i386 bzImage

Собираем модули:

make ARCH=i386 modules

После того как все собралось, копируем ядро и модули:

make INSTALL_PATH=/mnt/boot install
make INSTALL_MOD_PATH=/mnt/ modules_install

Остался RAM-диск. Его, если хост-система 64-битная, лучше собрать на 32-битной системе. Только что скачанное через debootstrap окружение идеально подходит для этого:

chroot /mnt/
mkinitramfs -k -o /boot/initrd.img-5.5.0 5.5.0
apt remove initramfs-tools-core && apt autoremove
exit

Продолжение доступно только участникам

Вариант 1. Присоединись к сообществу «Xakep.ru», чтобы читать все материалы на сайте

Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее

Вариант 2. Открой один материал

Заинтересовала статья, но нет возможности стать членом клуба «Xakep.ru»? Тогда этот вариант для тебя! Обрати внимание: этот способ подходит только для статей, опубликованных более двух месяцев назад.


10 комментариев

  1. Аватар

    mitrofanzzz

    17.06.2020 в 16:22

    Очень занятная реализация. Спасибо. Надо будет опробовать!

  2. Аватар

    Saulg

    19.06.2020 в 21:44

    А линк на готовую систему ?

    • s0i37

      s0i37

      22.06.2020 в 13:36

      Линк дать увы не могу. По причине приватных ключей и прочей конфиденциальной инфы которая может быть там найдена.

  3. Аватар

    Валерий Блонский

    27.06.2020 в 21:43

    А Intercepter-NG чем не унрдил?

  4. Аватар

    lvv1227

    09.08.2020 в 12:34

    Попытался пройти по инструкциям в статье (у меня стоит Ununtu 16, 64 bit).
    Ошибка при выполнении sudo debootstrap —arch=i386 —variant=minbase stable /mnt/ http://http.us.debian.org/debian

    I: Configuring mount…
    I: Configuring sysvinit-utils…
    I: Configuring libc-bin…
    I: Unpacking the base system…
    W: Failure while installing base packages. This will be re-attempted up to five times.
    W: See /mnt/debootstrap/debootstrap.log for details

    В логах
    Setting up mount (2.33.1-0.1) …
    Setting up sysvinit-utils (2.93-8) …
    Processing triggers for libc-bin (2.28-10) …
    dpkg: error: —unpack needs at least one package archive file argument

    Type dpkg —help for help about installing and deinstalling packages [*];
    Use ‘apt’ or ‘aptitude’ for user-friendly package management;
    Type dpkg -Dhelp for a list of dpkg debug flag values;
    Type dpkg —force-help for a list of forcing options;
    Type dpkg-deb —help for help about manipulating *.deb files;

    Побороть не смог.

    Стал искать обходные пути.
    У меня сработало только
    sudo debootstrap —include linux-image-amd64 —arch amd64 stable /mnt/ http://ftp.us.debian.org/debian

    Но даже здесь не было сорцов ядра для компиляции. Доставил их через apt-get install linux-source,
    но скомпилировать не смог, не видит каких-то заголовков в openssl.

    Удалось запустить виртуалку с уже готовым ядром и ramfs, для этого прописал
    echo «pts/0» >> /etc/securetty
    systemctl set-default multi-user.target
    echo «/dev/sda1 / ext4 defaults,discard 0 0» > /etc/fstab

    Но это не так интересно, размер виртуалки больше 2 Гб

    Подскажите, пожалуйста, по следующим вопросам:
    — какую систему на хосте нужно использовать, чтобы все сработало
    — как побороть ошибку установки debootstrap
    — как закачать сорцы ядра после этого (по умолчанию они не ставятся)
    — нужна ли дополнительная настройка системы, не указанная в статье (например, корректировка /etc/fstab, конфигурация сетевых интерфейсов и пр)

    • s0i37

      s0i37

      14.08.2020 в 21:05

      Здравствуйте.
      -Я использовал kali rolling 2019.4, это по сути Debian.
      -Попробовал на Ubuntu 20.04.1, сработало. Единственное, возможно вам нужно предварительно добавить архитектуру i386: dpkg —add-architecture i386 ; apt update
      -Исходные коды ядра не скачиваются вместе с debootstrap. Их нужно взять с https://www.kernel.org/ и собрать на своей основной ОС, после чего скопировать ядро, рамдиск в образ.
      -Доп настройка системы вся указана в статье, но не исключаю что какая то мелочь могла быть упущена.

  5. Аватар

    lvv1227

    17.08.2020 в 23:08

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

    — зачем нужен vpn, в котором мы связываем сетевой интерфейс внутри виртуальной машины (который переводим в promiscous режим) с tap0, когда тот же самый доступ к интерфейсу внутри виртуальной машины можно получить через ssh?
    — не совсем понятно, как достучаться до сервера vpn на хосте без белого ip-адреса? Ведь обратный shell и эксфильтрация DNS здесь не помогут.

    • s0i37

      s0i37

      23.08.2020 в 19:21

      Думаю что можно связаться и через ssh:
      /etc/ssh/sshd_config:
      PermitRootLogin yes
      PermitTunnel ethernet
      sudo ssh root@vbox -o Tunnel=ethernet -w any:any

      Как достучаться до vpn. Тут уже pivoting и все по ситуации. Используйте форвардинг портов.

Оставить мнение