Контакты

Для связи с нами можно использовать:
irc://irc.chatnet.ru:#gfs
icq://546460
email://cobalt[@]gfs-team.ru

Все материалы предоставлены только с ознакомительной целью
ГлавнаяСтатьиПереводыЗлостная криптография, часть первая
© перевод Cobalt 30.11.2007 статья не оптимизирована

Представляем вашему вниманию перевод статьи Фредерика Рэйнела "Злостная криптография, 
часть первая". Оригинал статьи на английском расположен тут

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

Первая часть вводит читателя в базовые понятия криптографии и предлагает примеры
злономеренного ее использования на примере SuckIt rookit и возможных SSH червей.
Также рассматриваются шифрованные вирусы, которые меняют свой код (полиморфизм и
метаморфизм), чтобы избежать обнаружения.

 Во второй части будут рассмотренны самые последние способы скрытия вирусов от обнару-
жения. Обсуждение зашифрованных вирусов использующих полиморфизм и метаморфизм, будет
завершено рассмотрением не поддающегося обнаружению вируса Bradley, который
использует шифрование. На примере Skype будет рассмотрена прикладная
криптография с закрытым протоколом, которую может использовать нападающий.

Введение в криптологию и вирусологию

Криптология - наука состоящая из двух частей:

  * Криптография посвещена созданию алгоритмов обеспечивающих конфеденциальность,
    идентификацию, целостность и так далее. Она обычно основана на некотором виде
    шифра часто называемом ключем и/или специальными математическими функциями (как
    например необратимые математические функции)
    
  * Криптоанализ - попытка проектировать алгоритмы по обходу конфеденциаль-
    ности, идентификации, целосности и так далее. Он обычно основан на сложных
    математических теориях, но для достижения техже целей могут использоваться и 
    определенные уловки.
    
Из вышеописанного разделения, видно, что криптография используется для защиты
данных, вто время как криптоанализ - как наступательное оружее. Однако когда кто-то
пишет или говорит "crypto", в наших умах сразу возникает слово "защита".

В тоже время, когда кто-то говорит о вирусологии, мы сразу же думаем о злостных
атаках. Однакоже вирусология тоже состоит из двух дисциплин, одна из которых
является наступательной, а другая оборонительной:

  * Вирус - самораспространяющаяся программа, которая размножается вставляя
    (возможно измененные) копии себя в другие программы или документы. Это считается
    атакой из-за встраивания и мобильности вируса и из-за применения антивирусных
    мер (меры направленные против обнаружения антивирусами)
  
  * Антивирус - программа которая пытается выявить, обезвредить и удалить
    компьютерные вирусы и другое злонамеренное програмное обеспечение. Они обычно
    базируются на основе сопоставления (подписи) с образцом и анализа злонамеренного
    кода (эвристики).
    
Криптографию используют производители антивирусов для того чтобы как можно надежнее
гарантировать конфеденциальность базы данных подписей, или автоматических обнавлений
их программ. Но точно также ее используют и авторы вирусов, чтобы гарантировать
конфеденциальность вирусного кода и избежать анализа эврестичискими методами (спо-
льзую смену кода, подобную полиморфизму и метоморфизму, известными как бронированные
вирусы)

Криптовирусология

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

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

Современный взгляд на базовую модель

Эту базовую модель можно рассматривать согласно предназначаемым целям:

  * Автор вируса создает ключ RSA
          - публичный ключ находиться в теле вируса
          - частный ключ находиться у автора
  * Вирус при распространении и выполнении действий использует публичный ключ.
    Например шифрует данные (жесткие диски, файлы, электронную почту, еще что-нибудь)
    открытым ключем.
  * Автор требует заплатить ему за отсылку састного ключа.
  
Вот ряд недавних примеров такого подхода -  GpCode и Krotten. К счастью такой 
подход имеет некоторые слабые стороны. Например анонимность. Как автор получит
деньги оставшись при этом анонимным? Это вечное человеческое желание копить деньги.
Затем есть проблемма повторного использование: а что если очередная жертва 
опубликует ключ? Одним из подходов могла бы стать отправка шифрованных данных
жертвы автору вируса, и последующая отсылка их обратно. Но это означало бы что
злоумышленник имеет данные в чистом виде, и жертва может пойти на риск потерять
данные которые известны другим.

Гибридный криптовирус

Теперь давайте рассмотрим гибридную модель криптовируса, в которой используется как
синхронное так и асинхронное шифрование:

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

Как мог бы заметить читатель, обычным вопросом для автора криптовируса былбы:
как я могу использовать описанные технологии в вирусологии? Мы будем здесь
пробовать изменить и расширеть эту идею используя два более конкретных вопроса
которыми может задаться автор криптовируса:

  * Как мы можем улучшить приведенный тактический фактор с применением шифрования?
  * Как можно злономеренно использовать криптографию?
  
Для того чтобы бороться с описанными угрозами, мы должны понимать используемые в
них идеи и подходы. Мы сосредоточимся на трех важных целях авторов криптовирусов. 
Первая цель - сбор информации, механизм которого в том, чтобы обнаружить 
действительные цели для заражения и управления распространением вируса.
Вторая цель автора криптовируса - задержать анализ, те задержать поиск пути
заражения и даже предотвратить понимание, чтобы только автор мог войти в свой код.
И последнее не маловажная но не такоая заметная цель - предотвратить обнаружение,
ведь не быть обнаруженным - значет не быть пойманным.

Тема точности

Как ранее заявлялось, криптография встречается повсюду. Например некоторые сетевые
протоколы второго уровня основаны на шифровании (WEP, WPA/TKIP и многи едругие),
некторые протоколы верхнего уровня (IPSec, SSH, SSL, Kerberos, PGP, и так далее). 
Они используются для многих целей от идентификации (с паролями используя pre-shared
ключи, обмен ключами, знаки) до шифрования (с применением AES, DES, 3DES, IDEA,
RC4 и многих других алгоритмов шифрования).

Однако независимо от того какой вид шифрования используется, можно быть уверенным
в одном, что если с одной стороны применяется шифрование, то оно применяется и с
другой. Кроме того между этими концами, часто используется (слабый?) пароль или
доверительные отношения. И помните, что криптографические протоколы довольно
сложны, и зачастую ставят много условий, которые не выполняются в практической
их реализации. Так давайте же будем использовать все эти "особенности" чтобы
применять полученные знания в криптовирусологии.

В этой части статьи мы посмотрим как авторы криптовирусов применяют шифрование, 
чтобы с куда большей точностью обнаружить цели чем некоторые более старые
вирусы применявшиеся в прошлом (как например в том случае когда они генерировали
32-х битный код похожий на IP)

Краткое описание SuckIt

SuckIt rootkit не будет подробно рассмотрен тут, ибо это уже сделано в предыдущей
статье. Так давайте же остановимся более подробно на его криптографической части.
Независимо от версии руткита его проверка подлинности изначально неверна. Поэтому 
когда найден один бинарный SuckIt, он может быть использован для проникновения в 
сеть зараженных машин и понимания действий злоумышленника.

Это возможно потому что аутентификация SuckIt основана на сравнении двух хэшей.
Нам не нужно восстанавливать исходный образ - достаточно иметь сами хэши.И так,
нам необходимо изменить программу таким образом, чтобы она отправляла хеш на 
сервер, ничего не справшивая: повторять это можно столько сколько мы захотим.

Следущая проблема - найти где повторение. Впервую очередь необходимо смотреть 
где атакующий входт. Это обычно компрометированный компьюетер, на котором он 
может использовать клиентскую программу с темже паролем. Злоумышленник - 
такойже человек как и все пользователи, он не может помнить огромного количества
паролей. Таким образом, большинство атакующих очень часто используют один и тотже
пароль для всех сетей зараженных SuckIt. Второй интересный момент - найти 
злоумышленника управляющего атакой. В секретном уровне руткита скрыт файл .sniffer.
И если аттакующий использовал клиента SuckIt на компрометированном компьютере,
то он содержит описание трафика... и конечно хэши.

Структура принципов построения SSH червей

SSH - довольно известный протокол, основанный на многих криптографических 
протоколах, его используют многие (если не все) администраторы Интернет. Он
проектировался, чтобы позволять безопасно регестрироваться на удаленном сервере
и выполнять команды. Применяются много систем аутентификации клиента: пароль, 
вызов/ответ, kerberos, открытое шифрование, список можно продолжать до бесконеч-
ности. Сервер идентифицирует асинхронный ключ. SSH также предоставляет много
больше интересных возможностей: TCP прокси, защищенный FTP, перенаправление 
агентов и тд.

Давайте представим, что нападающий создал бы SSH червя основанного на всех этих
особенностях. Конечно, как делает каждый червь, этот может использовать
эксплойт для SSH сервера. Хотя это и самый очевидный способ проникновения, но
не единственный. Поэтому если червь может использовать такой эксплоит - хорошо,
но это не обязательно.

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

Первый вопрос на который нам требуется ответить это как червь будет распростра-
яться от первого зараженного хоста SSH? Ответ состоит из двух частей: вопервых,
нам надо найти интересные цели, а вовторых, определить пути по которым на них
проникать.

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

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

  * Посмотреть какие хосты известны пользователю. Все хосты и их публичные ключи
    на которые заходил пользователь сохраняются в файле ~/.ssh/known_hosts. Однако
    самая последняя версия OPENSSH для обеспечения сохранности информации хранит
    вместо имени машины, ее айпиадрес.
  * Посмотреть файл ~/.ssh/config (если он существует) и перейти в ControlPath
    директорию.
  * Посмотреть текущие сетевые соединения
  * Посмотреть историю команд: grep ssh ~/.bash_history
  
Также можно поискать и входящие линии. Мы можем посмотреть файл, содержащий
ключи авторизованных пользователей ~/.ssh/authorized. С рутовыми привилегиями
мы также можем прослушивать (снифать) сеть и изучать по логам входящие соединения.

Теперь, когда нами определены цели для атаки, необходимо подумать о том, как наш
червь будет на них распространяться. Как писалось выше, он может использовать
простой exploit SSH для этой цели, но мы также говорили о том, что существуют и
другие пути.

Наверно самый простой путь - взять ssh-агента пользователя:

>> export SSH_AUTH_SOCK=/tmp/ssh-DEADBEEF/agent.1337
>> export SSH_AGENT_PID=1007

Недавно в SSH появиласть интересная особенность, которая требует довольно малых
усилий со стороны атакующего. Сейчас возможно объединять несколько сессий SSH в
одном TCP соединении. Так вы логинетесь один раз на сервере, и все последующие
соединения используют эту связь. Эта особенность настраивается каждым 
пользователем:

~/.ssh/config
Host   GetinMeForFree
    ControlMaster auto
    ControlPath ~/.ssh/currents/%r@%h:%p
    
Так если соединение к хосту GetinMeForFree уже существует, то червю не требуется
выполнять какие-либо еще действия чтобы соединиться с этой целью.

Червь также может воспользоваться доверием пользователей к шифрованию и украсть их
"неломаемые" ключи и пароли. Достаточно чтобы он пользовался keylogger, strace.
Например заменить алиасом bash команду в ~/.bashrc:

connect(3,    sa_family=AF_INET, sin_port=htons(22), 
     sin_addr=inet_addr("192.168.0.103"),  16)
write(5,  "Password:",  9)  =9
read(5, "b", 1)  =1
read(5, "e", 1)  =1
read(5, "e", 1) =1
read(5, "r", 1)  =1
read(5,  "\n",  1)  =1

Это также работает и для получения фразы частного ключа, обычно хранящегося в
~/.ssh/id_[dsa|rsa].

Другой трюк уже использовала предыдущая программа: встроить мощьный брутфорс 
паролей. И в настоящее время это очень распространенная аттака на SSH. Если вы
смотрели свои файлы жруналов, вы несомненно видели:

Feb 9 23:25:14 localhost sshd[14236]: Failed password for root from 
80.95.161.86 port 58645 ssh2
Feb 9 23:25:17 localhost sshd[14238]: Failed password for invalid user 
admin from 80.95.161.86 port 58806 ssh2
Feb 9 23:25:23 localhost sshd[14313]: Failed password for invalid user 
guest from 80.95.161.86 port 59243 ssh2
Feb 9 23:25:26 localhost sshd[14351]: Failed password for invalid user 
webmaster from 80.95.161.86 port 59445 ssh2
Feb 9 23:25:29 localhost sshd[14364]: Failed password for invalid user 
oracle from 80.95.161.86 port 59445 ssh2

Червь также может использовать слабые стороны других приложений, особенно если это
может помочь в инжектинге и перезаписи файлов на удаленной стороне. Он может
послать свой собственный публичный ключ на цель в файл ~/.ssh/authorized, и тому
ничего не останеться кроме как соединиться с ним.

Web приложения - очень подходящая для этого цель, ибо большинство из них позволяют
нам писать файлы на жертве. Однако для иллюстрации мы возмем в качестве примера
давно известную старую багу в Oracle, которая, кажется, то что нужно для нашего
червя.

В предыдущих версиях Oracle был компонент под названием TNS Listener, который
принимал прямые соединения и команды без аутентификации. Те идея заключается в том
чтобы подсоединиться к компоненту, изменить лог файл на ~/.ssh/authorized и послать
ошибочную команду (например ключ), которая запишеться в новый логфайл... вот и все!

>>tnscmd -h 192.168.0.103 -p 1521 --rawcmd "(DESCRIPTION=(CONNECT_DATA=(CID=
      (PROGRAM=)(HOST=)(USER=))(COMMAND=log_file)(ARGUMENTS=4)(SERVICE=LISTENER)
      (VERSION=1)(VALUE=/home/ora92/.ssh/authorized_keys)))"
>>tnscmd   -h 192.168.0.103 -p  1521 --rawcmd  "(CONNECT_DATA=
      ((ssh-dss AAAAB3NzaC1kc3D...Ckuu4=raynal@poisonivy.gotham"

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

Эффективность такого червя достаточно мала, потому как не так много SSH серверов
вокруг, а следовательно мала и область для распространения. Но вообразите себе
систему с такими уязвимостями и огромным количеством пользователей....

Тема времени: бронированные вирусы

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

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

К сожалению, теже методы используются и во вредоносном ПО (ВП). Давайте же подведем
итог жизненнлму циклу вредоносных программ.

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

Во избежание подобной "проблеммы", автор ВПО должен задержать, или даже
предотвратить анализ своего кода. Вирус который использует методы задержки и 
предотвращения анализа своего кода, называется бронированным вирусом.

Первый известный бронированный вирус назывался Whale и действовал где-то в
сентябре 1990г. Он комбинировал несколько методов:

  * Полиморфизм: как исходники, так и бинарники были зашифрованы (около 30
    сложных версий)
  * Невидимость: перехват прерываний, в том числе отладочных, хуки Whale, а также
    располагался в области памяти превышающей известный максимум того времени для
    MS DOS.
  * Бронирование: код менялся в зависимости от архитектуры (8088 или 8086),содержал
    много путанницы (бесполезный код, идентичные условия, избыточный код, и так 
    далее) и имел то, что называется анти-отладка (если обнаружено действие отладки, 
    блокировалась клавиатура и Whale убивал себя)
 
Если эти методики применить сегодня, почти семнадцать лет спустя, можно вообразить
что произойдет когда такой кусок кода достигнет антивирусных компаний.

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

Итог первой части

В этой части были определены понятия входящие в криптовирусологию и мы попробовали
понять методы используемые авторами криптовирусов. Было обсуждено два примера:
слабые стороны SuckIt rookit и заготовки для будущего SSH червя.

В следующий раз, в части два, мы рассмотрим некоторые из самых последних уловок
вирусов для избежания обнаружения и анализа. Обсуждение бронированных вирусов
будет завершено рассмотрением червя Bradley, вируса использующего шифрование и не 
поддающегося анализу. Skype будет нами использован в качестве приложения со
встроенным шифрованием и закрытым протоколом, которое может использовать
нападающий. До следующего раза.

© Фредерик Рэйнел 2006-05-08



© перевод Cobalt 30.11.2007 статья не оптимизирована

e-Commerce Partners Network
Inspektor написал:

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

Ник:

Текст:
P Br B I Qute



Код: обновить
Последние комментарии
20.09.2017 08:47:03 Avito777jeax написал:
<b>Пополение баланса Авито (Avito) за 50%</b> | <b>Телеграмм @a1garant</b> <b>Здравствуйте,...
Предупреждение
20.09.2017 08:20:25 Avito777jeax написал:
<b>Пополение баланса Авито (Avito) за 50%</b> | <b>Телеграмм @a1garant</b> <b>Мое...
Новая статья
20.09.2017 08:15:19 Avito777jeax написал:
<b>Пополение баланса Авито (Avito) за 50%</b> | <b>Телеграмм @a1garant</b> <b>Приветствую...
Новый релиз
Реклама

Тут должна была быть ваша реклама, но мы потеряли глиняную табличку с ее текстом. SapeId: 665044

Rambler's Top100