Всем привет. Статья перепечатана, но думаю будет полезна.
Чем опасен WM-клиент
Какую информацию собирает о нас система Web Money, можно ли ей доверять? Просидев за дизассемблером всю ночь напролет, пришел к весьма неутешительным выводам, которых придерживаются и другие пользователи. Как обезопасить себя и обеспечить максимальную анонимность?
Введение
Популярная платежная система Web-Money реализована в виде двух независимых программ: Keeper Classic и Keeper Light, каждая из которых имеет свои достоинства и недостатки. Keeper Classic представляет собой обычное Windows-приложение, требующее инсталляции на компьютер. Вот что об этом говорят некоторые пользователи: «Это — поделка от Web-Money, в которую неизвестно что зашито, может, и троян. И даже если его там нет, это творение небезупречно: пару раз ставил на несколько компов, так они стали хромать на обе ноги, вплоть до BSOD. На других же компах работа была нормальной. Следовательно, эта программа недоработана и ведет себя непредсказуемо".
Но прикладное приложение, которым пытается казаться Keeper Classic, не может вызывать BSOD, поскольку это прерогатива драйверов, работающих на уровне ядра. Значит, Keeper каким-то образом проникает в ядро, причем не совсем легальным путем (отсюда конфликты и BSOD). Во всяком случае, я не видел никакого запроса на установку драйверов при инсталляции, и никаких драйверов не появилось в каталоге WINNT\System32\Drivers, где им и положено быть, но… запуск утилиты R-Studio, восстанавливающей удаленные файлы, показал наличие созданного и тут же удаленного файла winio.sys, ссылка на который обнаружилась в компоненте Keeper'a: WMClient.dll. Судя по названию, этот драйвер открывает доступ к портам ввода/вывода с прикладного уровня, что создает нехилую дыру в системе безопасности, не говоря уже о том, что некорректное обращение с портами чревато не только голубыми экранами смерти, зависанием компьютера, но и потерей данных вместе с порчей оборудования.
Тут же, по соседству с «winio.sys», приютились текстовые строки: «\\.\PhysicalDrive%d», «\\.\Scsi%d:» и «SCSIDISK», недвусмысленно свидетельствующие в пользу того, что Keeper работает с жесткими дисками на низком уровне!
А дальше... дальше идет нечто совершенно невероятное:
Фрагмент WMClient.DLL, передающий жесткому диску ATA-команды
Код:
.text:100B7A31 push 557 ; nOutBufferSize
.text:100B7A36 lea eax, [ebp+OutBuffer]
.text:100B7A3C push eax ; lpOutBuffer
.text:100B7A3D push 3Ch ; nInBufferSize
.text:100B7A3F lea ecx, [ebp+OutBuffer]
.text:100B7A45 push ecx ; lpInBuffer
.text:100B7A46 push 4D008h ; IoControlCode(IOCTL_SCSI_PASS_THROUGH)
.text:100B7A4B mov edx, [ebp+hObject]
.text:100B7A4E push edx ; hDevice
.text:100B7A4F call dseviceIoControl
Диску посылается IOCTL-код IOCTL_SCSI_PASS_THROUGH, позволяющий передавать любую ATA-команду в обход операционной системе! ATA-команды — это наиболее низкоуровневые команды, на которых «разговаривает» диск, и с их помощью можно сделать все, что угодно. Малейшая неосторожность (или несовместимость) способна разрушить содержимое диска или уничтожить его «прошивку», что еще хуже. Девять из десяти, что эта процедура используется для чтения показаний SMART, однако не исключено, что Keeper пишет на диск какую-то гадость. Мне было лень досконально изучать этот вопрос, поскольку в любом случае Keeper мутит.
Но это только цветочки. Если поставить Keeper на VMWare, то система Web-Money автоматически заблокирует электронный кошелек при первой же попытке оплаты, даже не уведомив тебя об этом! Если бы Keeper просто не работал под VM Ware, то и черт с ним. Может, они просто не совместимы… или VM Ware чего-то дурит (с ней это часто случается). Но он ведь работает только до первой транзакции, а это значит, что вместе с данными о самой транзакции Keeper скрытно передает некоторую персональную информацию: как минимум конфигурацию оборудования, и, возможно, что-то еще.
Не секрет, что многие используют Web-Many в основном для совершения анонимных платежей (расплата за взлом, перевод зарплаты, в обход налоговой и т. д.). Однако эта анонимность только кажущаяся, тем более что компания охотно предоставляет сыщикам всю информацию о своих клиентах, которую ей только удалось собрать, а собирает она многое...
Система Keeper Light работает только из-под браузера и построена на механизме сертификатов. Никакой дополнительной информации о пользователе она не собирает, и единственной ниточкой, за которую могут зацепиться сыщики, оказывается IP-адрес. Не слишком серьезная улика, к тому же всегда существует возможность спрятаться за анонимным Proxy или атаковать один из компьютеров и осуществлять все транзакции его «руками». К сожалению, по своим функциональным возможностям Keeper Light значительно отстает от Classic'а и к тому же пожирает намного больше трафика (что для медленных соединений весьма актуально). Но ставить Classic'а на свою основную машину я так и не рискнул. Почему — читайте ниже.
Хакерские инструменты
Итак, Keeper Classic лежит у нас в руках, точнее жужжит жестким диском, устанавливая какие-то компоненты, но какие именно не говорит! А еще кто-то вирусов нехорошими словами называет! Компьютерный вирус — это такая штука, которая скрыто делает на твоем компьютере действия, о которых ты даже не подразумеваешь, а если бы и подразумевал — навряд ли бы дал свое согласие.
Чтение технической документации и заумных лицензионных соглашений не дает никакой полезной информации, и трепанацией Keeper'а приходится заниматься самостоятельно. Как это можно осуществить? Самое простое – перехватить обмен Keeper'а с «базой», снифая трафик любым подходящим sniffer'ом, например, тем, что встроен в персональный брандмауэр SyGate Firewall, однако, если трафик зашифрован, его будет не так-то легко расшифровать!
Гораздо проще воспользоваться файловым монитором и монитором реестра Марка Руссиновича (оба можно найти на Windows Sysinternals: Documentation, downloads and additional resources), а также монитором шины Bus Hound от компании Perisoft (www.perisoft.com). Полезно также снять дамп с работающей программы любой утилитой по вкусу (например, PE-TOOLS) и поковыряться в нем на предмет интересных текстовых строк, MAC-адресов и прочих приватных данных. Самые опытные исследователи могут прибегнуть к тяжелой артиллерии — дизассемблеру IDA Pro, который покажет, чем на самом деле занимается Keeper при запуске и в процессе перевода денег. Естественно, полное дизассемблирование занимает слишком много времени, поэтому мы будем обращать внимание лишь на самые заметные, наименее замаскированные места, сразу же бросающиеся в глаза при анализе.
Внутри Keeper'а
Последняя версия Keeper'а проходила под номером 3.0.0.2 и занимала порядка ~1,9 Мб. После установке на диске в папке WebMoney образовалось множество файлов, среди которых были WebMoney.exe (пусковой файл, размером 183,024 байт, упакованный, по сообщению PEiD, протектором ASProtect 1.2x - 1.3x) и WWClient.dll (динамическая библиотека, реализующая основной функционал, размер — 3331,824 байт, не упакована).
Собственно говоря, WebMoney.exe можно сразу отбросить в сторону, не тратя силы на распаковку — все равно ничего интересного там нет. Но прежде нужно запустить монитор реестра и посмотреть, в какие ветви реестра лезет Keeper и не пытается ли он получить доступ к той информации, разглашать которую мы не хотим?
Даже невооруженным глазом видно, что сразу же после запуска Keeper ринулся определять имя чипа сетевой карты («AMD PCNET Family PCI Ethernet» в данном случае), имя машины («W2K»), и, если покопаться в дампе памяти, там можно обнаружить и MAC-адрес моей сетевой карты: 00-0C-29-F6-6C-3C (виртуальный, естественно). Кстати, чтобы узнать свой MAC-адрес, достаточно запустить штатную утилиту ipconfig c ключом /all (см. рис).
«Честные» программы не нуждаются в MAC-адресах и работают с сетью через TCP/IP-протоколы. Зачем же тогда Keeper'у потребовался наш MAC-адрес? А вот зачем! MAC-адрес уникален для каждой карты, и, хотя его теоретически возможно сменить на другой, даже без использования программатора, это считается веской уликой при расследовании преступления.
Значит, все-таки Keeper палит наш компьютер! И насколько глубоко? Берем в руки IDA Pro, загружаем WWClient.dll внутрь, и пока оно там дизассемблируется (а дизассемблироваться оно будет долго), достаем из заначки непочатую бутылку пива, затягиваемся сигаретой и думаем, думаем, думаем…
Лучше всего начинать анализ с поиска текстовых строк. Их легко найти в окне «Name Windows», вызываемом комбинацией клавиш <Shift-F4>. Тестовые ASCIIZ-строки начинаются с префикса «a». Действительно, здесь притаилось немало непуганой дичи:
Текстовые строки «pic_xxx», обнаруженные в Keeper'е
Код:
.rdata:1021ECB0 aPci_wmtid db 'pci_wmtid=',0 ; DATA XREF: sub_100901C0+C45o
.rdata:1021ECBC aPci_pursedest db '&pci_pursedest=',0 ; DATA XREF: sub_100901C0+CCCo
.rdata:1021ECCC aPci_pursesrc db '&pci_pursesrc=',0 ; DATA XREF: sub_100901C0+D53o
.rdata:1021ECDC aPci_amount db '&pci_amount=',0 ; DATA XREF: sub_100901C0+DDAo
.rdata:1021ECEC aPci_marker db '&pci_marker=',0 ; DATA XREF: sub_100901C0+E61o
.rdata:1021ECFC aPci_desc db '&pci_desc=',0 ; DATA XREF: sub_100901C0+EE8o
.rdata:1021ED08 aPci_datecrt db '&pci_datecrt=',0 ; DATA XREF: sub_100901C0+F6Fo
.rdata:1021ED18 aPci_modeTest db '&pci_mode=test',0 ; DATA XREF: sub_100901C0+FFFo
Семейство сток, гнездящихся вокруг слова «pci», наводит на мысль, что Keeper опрашивает PCI-шину для получения списка подключенных устройств. Сканер шины это действительно подтверждает, а в дампе памяти обнаруживаются идентификационные строки всех периферийных устройств.
Поскольку виртуальные машины, в частности VM Ware, несут на своем борту довольно специфический набор оборудования и выделяют MAC-адреса из фиксированного пула адресов, становится ясно, как система распознает факт наличия виртуальной машины. Она просто сравнивает конфигурацию пользовательского оборудования с конфигурацией виртуальной машины, и, если они совпадают, электронный кошелек закрывается без предупреждений. Причем сравнение происходит не на клиентской, а на серверной стороне! То есть Keeper не просто опрашивает PCI-шину, но еще и передает эти данные в сеть, где они, по всей видимости, заносятся в банк данных, представляющий огромный интерес для спецслужб различных стран.
Штатные средства VM Ware не позволяют менять ни MAC-адреса, ни конфигурацию оборудования (в новых версиях вроде бы сделаны некоторые шаги в этом направлении, но не слишком радикальные). К счастью, есть неофициальная заплатка, позволяющая менять все, что угодно: http://honeynet.rstack.org/tools/vmpatch.c. Эксперименты подтверждают: после изменения конфигурации Keeper перестает распознавать VM Ware, и электронный кошелек больше не «палится».
В текстовых строках можно ковыряться до бесконечности. Это настоящий Клондайк, раскрывающий зловредные намерения Keeper'а хуже любого предателя. На месте разработчиков я бы обязательно их зашифровал, а то как-то несерьезно получается.
Как вам нравится следующее? Keeper динамически создает драйвер citio.sys (на NT/W2K/XP)/citio.vxd (на 9x), тут же его загружает в память, а после удаляет:
Ссылки на неопознанный драйвер, обнаруженные в Keeper'e
Код:
.rdata:10222D5C aSystem32Driver db 'system32\drivers\citio.sys',0
.rdata:10222D78 aFileName db '\\.\citio',0
.rdata:10222D8C aSystemCitio_vx db 'system\citio.vxd',0
.rdata:10222DA0 a_Citio_vxd db '\\.\CITIO.VXD',0
Чем опасен WM-клиент
Какую информацию собирает о нас система Web Money, можно ли ей доверять? Просидев за дизассемблером всю ночь напролет, пришел к весьма неутешительным выводам, которых придерживаются и другие пользователи. Как обезопасить себя и обеспечить максимальную анонимность?
Введение
Популярная платежная система Web-Money реализована в виде двух независимых программ: Keeper Classic и Keeper Light, каждая из которых имеет свои достоинства и недостатки. Keeper Classic представляет собой обычное Windows-приложение, требующее инсталляции на компьютер. Вот что об этом говорят некоторые пользователи: «Это — поделка от Web-Money, в которую неизвестно что зашито, может, и троян. И даже если его там нет, это творение небезупречно: пару раз ставил на несколько компов, так они стали хромать на обе ноги, вплоть до BSOD. На других же компах работа была нормальной. Следовательно, эта программа недоработана и ведет себя непредсказуемо".
Но прикладное приложение, которым пытается казаться Keeper Classic, не может вызывать BSOD, поскольку это прерогатива драйверов, работающих на уровне ядра. Значит, Keeper каким-то образом проникает в ядро, причем не совсем легальным путем (отсюда конфликты и BSOD). Во всяком случае, я не видел никакого запроса на установку драйверов при инсталляции, и никаких драйверов не появилось в каталоге WINNT\System32\Drivers, где им и положено быть, но… запуск утилиты R-Studio, восстанавливающей удаленные файлы, показал наличие созданного и тут же удаленного файла winio.sys, ссылка на который обнаружилась в компоненте Keeper'a: WMClient.dll. Судя по названию, этот драйвер открывает доступ к портам ввода/вывода с прикладного уровня, что создает нехилую дыру в системе безопасности, не говоря уже о том, что некорректное обращение с портами чревато не только голубыми экранами смерти, зависанием компьютера, но и потерей данных вместе с порчей оборудования.
Тут же, по соседству с «winio.sys», приютились текстовые строки: «\\.\PhysicalDrive%d», «\\.\Scsi%d:» и «SCSIDISK», недвусмысленно свидетельствующие в пользу того, что Keeper работает с жесткими дисками на низком уровне!
А дальше... дальше идет нечто совершенно невероятное:
Фрагмент WMClient.DLL, передающий жесткому диску ATA-команды
Код:
.text:100B7A31 push 557 ; nOutBufferSize
.text:100B7A36 lea eax, [ebp+OutBuffer]
.text:100B7A3C push eax ; lpOutBuffer
.text:100B7A3D push 3Ch ; nInBufferSize
.text:100B7A3F lea ecx, [ebp+OutBuffer]
.text:100B7A45 push ecx ; lpInBuffer
.text:100B7A46 push 4D008h ; IoControlCode(IOCTL_SCSI_PASS_THROUGH)
.text:100B7A4B mov edx, [ebp+hObject]
.text:100B7A4E push edx ; hDevice
.text:100B7A4F call dseviceIoControl
Диску посылается IOCTL-код IOCTL_SCSI_PASS_THROUGH, позволяющий передавать любую ATA-команду в обход операционной системе! ATA-команды — это наиболее низкоуровневые команды, на которых «разговаривает» диск, и с их помощью можно сделать все, что угодно. Малейшая неосторожность (или несовместимость) способна разрушить содержимое диска или уничтожить его «прошивку», что еще хуже. Девять из десяти, что эта процедура используется для чтения показаний SMART, однако не исключено, что Keeper пишет на диск какую-то гадость. Мне было лень досконально изучать этот вопрос, поскольку в любом случае Keeper мутит.
Но это только цветочки. Если поставить Keeper на VMWare, то система Web-Money автоматически заблокирует электронный кошелек при первой же попытке оплаты, даже не уведомив тебя об этом! Если бы Keeper просто не работал под VM Ware, то и черт с ним. Может, они просто не совместимы… или VM Ware чего-то дурит (с ней это часто случается). Но он ведь работает только до первой транзакции, а это значит, что вместе с данными о самой транзакции Keeper скрытно передает некоторую персональную информацию: как минимум конфигурацию оборудования, и, возможно, что-то еще.
Не секрет, что многие используют Web-Many в основном для совершения анонимных платежей (расплата за взлом, перевод зарплаты, в обход налоговой и т. д.). Однако эта анонимность только кажущаяся, тем более что компания охотно предоставляет сыщикам всю информацию о своих клиентах, которую ей только удалось собрать, а собирает она многое...
Система Keeper Light работает только из-под браузера и построена на механизме сертификатов. Никакой дополнительной информации о пользователе она не собирает, и единственной ниточкой, за которую могут зацепиться сыщики, оказывается IP-адрес. Не слишком серьезная улика, к тому же всегда существует возможность спрятаться за анонимным Proxy или атаковать один из компьютеров и осуществлять все транзакции его «руками». К сожалению, по своим функциональным возможностям Keeper Light значительно отстает от Classic'а и к тому же пожирает намного больше трафика (что для медленных соединений весьма актуально). Но ставить Classic'а на свою основную машину я так и не рискнул. Почему — читайте ниже.
Хакерские инструменты
Итак, Keeper Classic лежит у нас в руках, точнее жужжит жестким диском, устанавливая какие-то компоненты, но какие именно не говорит! А еще кто-то вирусов нехорошими словами называет! Компьютерный вирус — это такая штука, которая скрыто делает на твоем компьютере действия, о которых ты даже не подразумеваешь, а если бы и подразумевал — навряд ли бы дал свое согласие.
Чтение технической документации и заумных лицензионных соглашений не дает никакой полезной информации, и трепанацией Keeper'а приходится заниматься самостоятельно. Как это можно осуществить? Самое простое – перехватить обмен Keeper'а с «базой», снифая трафик любым подходящим sniffer'ом, например, тем, что встроен в персональный брандмауэр SyGate Firewall, однако, если трафик зашифрован, его будет не так-то легко расшифровать!
Гораздо проще воспользоваться файловым монитором и монитором реестра Марка Руссиновича (оба можно найти на Windows Sysinternals: Documentation, downloads and additional resources), а также монитором шины Bus Hound от компании Perisoft (www.perisoft.com). Полезно также снять дамп с работающей программы любой утилитой по вкусу (например, PE-TOOLS) и поковыряться в нем на предмет интересных текстовых строк, MAC-адресов и прочих приватных данных. Самые опытные исследователи могут прибегнуть к тяжелой артиллерии — дизассемблеру IDA Pro, который покажет, чем на самом деле занимается Keeper при запуске и в процессе перевода денег. Естественно, полное дизассемблирование занимает слишком много времени, поэтому мы будем обращать внимание лишь на самые заметные, наименее замаскированные места, сразу же бросающиеся в глаза при анализе.
Внутри Keeper'а
Последняя версия Keeper'а проходила под номером 3.0.0.2 и занимала порядка ~1,9 Мб. После установке на диске в папке WebMoney образовалось множество файлов, среди которых были WebMoney.exe (пусковой файл, размером 183,024 байт, упакованный, по сообщению PEiD, протектором ASProtect 1.2x - 1.3x) и WWClient.dll (динамическая библиотека, реализующая основной функционал, размер — 3331,824 байт, не упакована).
Собственно говоря, WebMoney.exe можно сразу отбросить в сторону, не тратя силы на распаковку — все равно ничего интересного там нет. Но прежде нужно запустить монитор реестра и посмотреть, в какие ветви реестра лезет Keeper и не пытается ли он получить доступ к той информации, разглашать которую мы не хотим?
Даже невооруженным глазом видно, что сразу же после запуска Keeper ринулся определять имя чипа сетевой карты («AMD PCNET Family PCI Ethernet» в данном случае), имя машины («W2K»), и, если покопаться в дампе памяти, там можно обнаружить и MAC-адрес моей сетевой карты: 00-0C-29-F6-6C-3C (виртуальный, естественно). Кстати, чтобы узнать свой MAC-адрес, достаточно запустить штатную утилиту ipconfig c ключом /all (см. рис).
«Честные» программы не нуждаются в MAC-адресах и работают с сетью через TCP/IP-протоколы. Зачем же тогда Keeper'у потребовался наш MAC-адрес? А вот зачем! MAC-адрес уникален для каждой карты, и, хотя его теоретически возможно сменить на другой, даже без использования программатора, это считается веской уликой при расследовании преступления.
Значит, все-таки Keeper палит наш компьютер! И насколько глубоко? Берем в руки IDA Pro, загружаем WWClient.dll внутрь, и пока оно там дизассемблируется (а дизассемблироваться оно будет долго), достаем из заначки непочатую бутылку пива, затягиваемся сигаретой и думаем, думаем, думаем…
Лучше всего начинать анализ с поиска текстовых строк. Их легко найти в окне «Name Windows», вызываемом комбинацией клавиш <Shift-F4>. Тестовые ASCIIZ-строки начинаются с префикса «a». Действительно, здесь притаилось немало непуганой дичи:
Текстовые строки «pic_xxx», обнаруженные в Keeper'е
Код:
.rdata:1021ECB0 aPci_wmtid db 'pci_wmtid=',0 ; DATA XREF: sub_100901C0+C45o
.rdata:1021ECBC aPci_pursedest db '&pci_pursedest=',0 ; DATA XREF: sub_100901C0+CCCo
.rdata:1021ECCC aPci_pursesrc db '&pci_pursesrc=',0 ; DATA XREF: sub_100901C0+D53o
.rdata:1021ECDC aPci_amount db '&pci_amount=',0 ; DATA XREF: sub_100901C0+DDAo
.rdata:1021ECEC aPci_marker db '&pci_marker=',0 ; DATA XREF: sub_100901C0+E61o
.rdata:1021ECFC aPci_desc db '&pci_desc=',0 ; DATA XREF: sub_100901C0+EE8o
.rdata:1021ED08 aPci_datecrt db '&pci_datecrt=',0 ; DATA XREF: sub_100901C0+F6Fo
.rdata:1021ED18 aPci_modeTest db '&pci_mode=test',0 ; DATA XREF: sub_100901C0+FFFo
Семейство сток, гнездящихся вокруг слова «pci», наводит на мысль, что Keeper опрашивает PCI-шину для получения списка подключенных устройств. Сканер шины это действительно подтверждает, а в дампе памяти обнаруживаются идентификационные строки всех периферийных устройств.
Поскольку виртуальные машины, в частности VM Ware, несут на своем борту довольно специфический набор оборудования и выделяют MAC-адреса из фиксированного пула адресов, становится ясно, как система распознает факт наличия виртуальной машины. Она просто сравнивает конфигурацию пользовательского оборудования с конфигурацией виртуальной машины, и, если они совпадают, электронный кошелек закрывается без предупреждений. Причем сравнение происходит не на клиентской, а на серверной стороне! То есть Keeper не просто опрашивает PCI-шину, но еще и передает эти данные в сеть, где они, по всей видимости, заносятся в банк данных, представляющий огромный интерес для спецслужб различных стран.
Штатные средства VM Ware не позволяют менять ни MAC-адреса, ни конфигурацию оборудования (в новых версиях вроде бы сделаны некоторые шаги в этом направлении, но не слишком радикальные). К счастью, есть неофициальная заплатка, позволяющая менять все, что угодно: http://honeynet.rstack.org/tools/vmpatch.c. Эксперименты подтверждают: после изменения конфигурации Keeper перестает распознавать VM Ware, и электронный кошелек больше не «палится».
В текстовых строках можно ковыряться до бесконечности. Это настоящий Клондайк, раскрывающий зловредные намерения Keeper'а хуже любого предателя. На месте разработчиков я бы обязательно их зашифровал, а то как-то несерьезно получается.
Как вам нравится следующее? Keeper динамически создает драйвер citio.sys (на NT/W2K/XP)/citio.vxd (на 9x), тут же его загружает в память, а после удаляет:
Ссылки на неопознанный драйвер, обнаруженные в Keeper'e
Код:
.rdata:10222D5C aSystem32Driver db 'system32\drivers\citio.sys',0
.rdata:10222D78 aFileName db '\\.\citio',0
.rdata:10222D8C aSystemCitio_vx db 'system\citio.vxd',0
.rdata:10222DA0 a_Citio_vxd db '\\.\CITIO.VXD',0
Комментарий