Хотелось бы развить мысль, упомянутую в статье «Follow the money: как группировка RTM стала прятать адреса C&C серверов в криптокошельке», которая упаковывала их в количество перечисленных за две транзакции сатоши на определенный криптоадрес. Вредонос, запросив у блокчейн-обозревателя данные переводов на такой адрес, путем несложных манипуляций выделял IP нового C&C сервера.
Опустим и осудим преступные намерения этой группировки и остановимся именно на принципах и процессе передачи команд элементам бот-сети (ЭБС).
ИМХО, данный способ имеет определенные недостатки – пропускная способность данного метода (в отношении количества информации на один перевод) мала, а любой, кто знает такой криптоадрес, может отправить на него определенную сумму, и засинкхоллить бот-сеть, заставив ее обращаться к «доверенному» для них серверу.
Однако скрытые команды ЭБС возможно отправлять не на отдельный, а с отдельного адреса А, априори доверенного для них. В этом случае никто (кроме лица, обладающего приватным ключом), не может провести такую операцию.
Набор команд возможно расширить путем отправки сумм на сгенерированные администратором бот-сети адреса, в названии которых закодирована/зашифрована необходимая управляющая информация.
При этом команда до 20 байт (буквы, цифры, спецсимволы) преобразуется (text to hex) в hex и далее – в валидный криптоадрес B. При этом сама команда может кодироваться/шифроваться.
Приведу фантазийный пример. Для наглядности (PoC) пользовался рядом доступных онлайн-сервисов.
1. С доверенного адреса А проводится перевод определенной суммы на сгенерированный валидный адрес B.
Пример генерации адреса B: необходимо отправить для ЭБС информацию о сервере 82.192.95.175, с которого возможно получить команду на обновление с сервера модуля #68, время активации / деактивации модуля, а также ключ шифрования (или адрес дополнительного блокчейн-обозревателя, команду на выполнение не позднее передаваемой даты, новый доверенный криптоадрес, ключ и т.д. и т.п. (ключ возможно зашить в ПА и передавать только при необходимости его смены, тем самым сохранив 7 байт поля команд)).
IP возможно преобразовать сотней способов, например 082.192.095.175 > 08.21.92.09.51.75 + 32 к каждому числу (избегаем нечитаемых символов ASCII).
Итого 40.53.124.41.83.107 = (5|)Sk представляем в ASCII (6 байт);
Команда 68 = D;
Время активации модуля – 601234 = в Unix time, где старший разряд 1 избыточен, передавать его не будем (он по умолчанию, т.к. изменение на 2 будет только в 2033 году), младшие три разряда также по умолчанию 000, т.к. особого значения не имеют, это +- 15 минут.
Время активации – 1601234000 = 27 сентября 2019 г. 19.13.20 GMT
Далее четыре цифры, до какого времени выполнять работу модуля – 0365 (дней) от времени активации.
То есть 6012340365 = 01665D088Dh = AAHpKn в ASCII. Также допустим, что прошлый ключ был Key0001.
Итого (5|)SkDAAHpKnKey0002 с использованием RC4 и ключом Key0001 дает в hex: DD F6 B8 16 2A B6 71 97 0F 9F A2 68 79 11 8C B6 31 DA FE 43.
Эту строку преобразуем hashtoaddress в legacy btc-адрес (можно в адреса других криптовалют dash, ltc, dogecoin и т.д., это не принципиально, алгоритмы формирования криптоадресов открыты, перевод будет дешевле и быстрее).
Получаем адрес B (legacy) – 1MEdtjmGtqaGPaoYAQn43dkZxiSrSD8gmD.
(напомню, что в нем спереди добавлен один «1» — байт-признак, в конце – контрольные 4 байта).
Этот ресурс дает возможность воочию увидеть пошаговый процесс преобразования (вставляем DDF6… в строку 3 (RIPEMD-160 Hash of 2)).
Однако, чтобы не выделяться из множества адресов уже ставшего стандартным segwit-формата, представим нашу строку как (смотрите здесь).
Адрес B (segwit) – bc1qmhmts932kecewrul5f58jyvvkcca4ljrrgmpcd
2. На данный адрес с доверенного A отправляем перевод в несколько сотен/тысяч сатоши. Сумма перевода также может нести информацию (например, доппроверку по согласованному признаку, командный символ на безусловное уничтожение/временное прекращение работы ботсети без необходимости чтения передаваемой в адресе команды и т.п.).
Отдельно обращу внимание, что при отправке надо учитывать, что адрес для сдачи должен быть тем же, что и адрес отправки, либо записывать ЭБС адрес для сдачи, как новый доверенный.
Транзакция подтверждается в среднем несколько минут (при условии оплаты достаточной суммы комиссии, плавающей в зависимости от нагрузки сети).
Стоимость перевода суммы в 1 тыс. сатоши составит 7 руб. (плюс комиссия 2-3 руб.). Повторюсь, что с другими криптовалютами это может быть быстрее и дешевле в десятки/сотни раз.
3. Со стороны ЭБС происходит периодичный опрос блокчейн-обозревателей (по API) из имеющегося списка (обозреватели представлены в широком ассортименте) о переводе с А.
При выявлении факта отправки новой транзакции с А (и ее подтверждении) информация, содержащаяся в адресе-получателе, на который был проведен перевод, дешифруется (декодируется) полученным ключом и принимается к исполнению.
Допустим, что доверенный адрес — bc1qsj0gm0r2c3hzq9yzfewl34yk2r760hy5za4x3q (segwit-формат).
По этому адресу последняя исходящая транзакция (прим. — уже не последняя, а эта) проходила на два адреса — bc1qmhmts932kecewrul5f58jyvvkcca4ljrrgmpcd и сдачи, аналогичному адресу отправки.
Перечисленная сумма – 666 сатоши – решим, что это условная команда на выполнение декодирования.
Декодируем наш адрес обратно в DDF6….
Преобразуем к виду (5|)SkD34,,+!Key0002 и дешифруем ключом Key0001 (ключ меняется на Key0002).
Скачиваем модуль с сервера (доступ на сервер может быть реализован с использованием того же ключа) и ожидаем даты запуска модуля.
Отмечу, что необходимо использовать как минимум несколько обозревателей (могут отключаться или ограничивать запросы из некоторых стран, как например bitflyer.jp, ограничивающий с российского и пускающий с японского IP).
Полученную информацию возможно проверять как минимум еще на одном/двух. Выбор обозревателей велик, только в типовом списке Electrum присутствует более десятка – blockchair.com, smartbit.com.au, bitupper.com, chain.so и мн. др.
Обратите внимание, что не все обозреватели поддерживают segwit-формат. Поэтому надо выбрать золотую середину, пользоваться доверенным адресом старого или нового форматов.
Пример отправки с доверенного адреса в старом формате 186A8D7vdAHpFWdSAFHzZGfi44pPcwtZNc на сгенерированный legacy-адрес в raw
и segwit-адрес
Применением различных блокчейн-обозревателей подчеркиваю их разнообразие.
Напомню, что скрытое сообщение в адресе из транзакции подделать, чтобы она была подтверждена, невозможно по определению.
Плюсы алгоритма
Особенности алгоритма
Полагаю, некоторые приведенные здесь моменты полезно учесть специалистам по ИБ.
Интересно было бы для повышения устойчивости бот-сети, кроме обозревателей, привлекать возможности полных нод или нод популярных кошельков типа электрума, а также организовать дуплексную связь за счет генерации необходимых транзакций на стороне ЭБС. Буду признателен мыслям на этот счет, а также обоснованной критике и предложениям.
автор: @ubongo
взято с хабра
Опустим и осудим преступные намерения этой группировки и остановимся именно на принципах и процессе передачи команд элементам бот-сети (ЭБС).
ИМХО, данный способ имеет определенные недостатки – пропускная способность данного метода (в отношении количества информации на один перевод) мала, а любой, кто знает такой криптоадрес, может отправить на него определенную сумму, и засинкхоллить бот-сеть, заставив ее обращаться к «доверенному» для них серверу.
Однако скрытые команды ЭБС возможно отправлять не на отдельный, а с отдельного адреса А, априори доверенного для них. В этом случае никто (кроме лица, обладающего приватным ключом), не может провести такую операцию.
Набор команд возможно расширить путем отправки сумм на сгенерированные администратором бот-сети адреса, в названии которых закодирована/зашифрована необходимая управляющая информация.
При этом команда до 20 байт (буквы, цифры, спецсимволы) преобразуется (text to hex) в hex и далее – в валидный криптоадрес B. При этом сама команда может кодироваться/шифроваться.
Приведу фантазийный пример. Для наглядности (PoC) пользовался рядом доступных онлайн-сервисов.
1. С доверенного адреса А проводится перевод определенной суммы на сгенерированный валидный адрес B.
Пример генерации адреса B: необходимо отправить для ЭБС информацию о сервере 82.192.95.175, с которого возможно получить команду на обновление с сервера модуля #68, время активации / деактивации модуля, а также ключ шифрования (или адрес дополнительного блокчейн-обозревателя, команду на выполнение не позднее передаваемой даты, новый доверенный криптоадрес, ключ и т.д. и т.п. (ключ возможно зашить в ПА и передавать только при необходимости его смены, тем самым сохранив 7 байт поля команд)).
IP возможно преобразовать сотней способов, например 082.192.095.175 > 08.21.92.09.51.75 + 32 к каждому числу (избегаем нечитаемых символов ASCII).
Итого 40.53.124.41.83.107 = (5|)Sk представляем в ASCII (6 байт);
Команда 68 = D;
Время активации модуля – 601234 = в Unix time, где старший разряд 1 избыточен, передавать его не будем (он по умолчанию, т.к. изменение на 2 будет только в 2033 году), младшие три разряда также по умолчанию 000, т.к. особого значения не имеют, это +- 15 минут.
Время активации – 1601234000 = 27 сентября 2019 г. 19.13.20 GMT
Далее четыре цифры, до какого времени выполнять работу модуля – 0365 (дней) от времени активации.
То есть 6012340365 = 01665D088Dh = AAHpKn в ASCII. Также допустим, что прошлый ключ был Key0001.
Итого (5|)SkDAAHpKnKey0002 с использованием RC4 и ключом Key0001 дает в hex: DD F6 B8 16 2A B6 71 97 0F 9F A2 68 79 11 8C B6 31 DA FE 43.
Эту строку преобразуем hashtoaddress в legacy btc-адрес (можно в адреса других криптовалют dash, ltc, dogecoin и т.д., это не принципиально, алгоритмы формирования криптоадресов открыты, перевод будет дешевле и быстрее).
Получаем адрес B (legacy) – 1MEdtjmGtqaGPaoYAQn43dkZxiSrSD8gmD.
(напомню, что в нем спереди добавлен один «1» — байт-признак, в конце – контрольные 4 байта).
Этот ресурс дает возможность воочию увидеть пошаговый процесс преобразования (вставляем DDF6… в строку 3 (RIPEMD-160 Hash of 2)).
Однако, чтобы не выделяться из множества адресов уже ставшего стандартным segwit-формата, представим нашу строку как (смотрите здесь).
Адрес B (segwit) – bc1qmhmts932kecewrul5f58jyvvkcca4ljrrgmpcd
2. На данный адрес с доверенного A отправляем перевод в несколько сотен/тысяч сатоши. Сумма перевода также может нести информацию (например, доппроверку по согласованному признаку, командный символ на безусловное уничтожение/временное прекращение работы ботсети без необходимости чтения передаваемой в адресе команды и т.п.).
Отдельно обращу внимание, что при отправке надо учитывать, что адрес для сдачи должен быть тем же, что и адрес отправки, либо записывать ЭБС адрес для сдачи, как новый доверенный.
Транзакция подтверждается в среднем несколько минут (при условии оплаты достаточной суммы комиссии, плавающей в зависимости от нагрузки сети).
Стоимость перевода суммы в 1 тыс. сатоши составит 7 руб. (плюс комиссия 2-3 руб.). Повторюсь, что с другими криптовалютами это может быть быстрее и дешевле в десятки/сотни раз.
3. Со стороны ЭБС происходит периодичный опрос блокчейн-обозревателей (по API) из имеющегося списка (обозреватели представлены в широком ассортименте) о переводе с А.
При выявлении факта отправки новой транзакции с А (и ее подтверждении) информация, содержащаяся в адресе-получателе, на который был проведен перевод, дешифруется (декодируется) полученным ключом и принимается к исполнению.
Допустим, что доверенный адрес — bc1qsj0gm0r2c3hzq9yzfewl34yk2r760hy5za4x3q (segwit-формат).
По этому адресу последняя исходящая транзакция (прим. — уже не последняя, а эта) проходила на два адреса — bc1qmhmts932kecewrul5f58jyvvkcca4ljrrgmpcd и сдачи, аналогичному адресу отправки.
Перечисленная сумма – 666 сатоши – решим, что это условная команда на выполнение декодирования.
Декодируем наш адрес обратно в DDF6….
Преобразуем к виду (5|)SkD34,,+!Key0002 и дешифруем ключом Key0001 (ключ меняется на Key0002).
Скачиваем модуль с сервера (доступ на сервер может быть реализован с использованием того же ключа) и ожидаем даты запуска модуля.
Отмечу, что необходимо использовать как минимум несколько обозревателей (могут отключаться или ограничивать запросы из некоторых стран, как например bitflyer.jp, ограничивающий с российского и пускающий с японского IP).
Полученную информацию возможно проверять как минимум еще на одном/двух. Выбор обозревателей велик, только в типовом списке Electrum присутствует более десятка – blockchair.com, smartbit.com.au, bitupper.com, chain.so и мн. др.
Обратите внимание, что не все обозреватели поддерживают segwit-формат. Поэтому надо выбрать золотую середину, пользоваться доверенным адресом старого или нового форматов.
Пример отправки с доверенного адреса в старом формате 186A8D7vdAHpFWdSAFHzZGfi44pPcwtZNc на сгенерированный legacy-адрес в raw
и segwit-адрес
Применением различных блокчейн-обозревателей подчеркиваю их разнообразие.
Напомню, что скрытое сообщение в адресе из транзакции подделать, чтобы она была подтверждена, невозможно по определению.
Плюсы алгоритма
- С2-сервер отсутствует, обращения идут к блокчейн-обозревателям.
- Команды для ЭБС являются безусловно доверенными.
- Средой передачи команд является блокчейн, что не позволяет заблокировать отправку/передачу команд.
- Блокчейн — крайне устойчивая система (это не касается волатильности криптовалют).
- Низкая стоимость обеспечения работы.
- Несложная реализация алгоритма (открытые исходные данные и код).
- Нет необходимости генерировать транзакции или скачивать блокчейн.
Особенности алгоритма
- Симплексная связь.
- Зависимость от стабильности функционирования обозревателей.
- Определенные (хоть и минимальные) финансовые затраты.
Полагаю, некоторые приведенные здесь моменты полезно учесть специалистам по ИБ.
Интересно было бы для повышения устойчивости бот-сети, кроме обозревателей, привлекать возможности полных нод или нод популярных кошельков типа электрума, а также организовать дуплексную связь за счет генерации необходимых транзакций на стороне ЭБС. Буду признателен мыслям на этот счет, а также обоснованной критике и предложениям.
автор: @ubongo
взято с хабра