Иногда обстоятельства оказываются сильнее нас... как и произошло с нашим проектом.
Мы работали 7 дней в волну негатива и работали бы дальше, если бы нас не взломали и не забрали все деньги с кошельков.
Когда это произошло, наш техник решил выяснить в чем же причина, как так могли взломать, авторизироваться в админке и выполнять все что хочешь.
Далее привожу текст от его имени:
После взлома я прикинул сразу два варианта:
1) Взломщик узнал пароль где-то вне хостинга Genius Guard.
2) Взломали сам ГК или хостинг Genius Guard.
Если вы замечали, то при логине в ГК как пользователя, так и админа, логин и пароль передаются в GET запросе, абсолютно открытыми.
Я заметил это сразу, задолго до взлома, и смекнул что эти данные записываются в лог доступа к веб-серверу, так называемый access-log.
В него я сразу и полез, посмотреть запросы и проверить догадки. К этому времени у меня уже были 2 IP адреса взломщика, которые пришли на
e-mail администратора ГК при логине.
Эти адреса 217.118.83.143 и 67.21.75.194. Первый по WHOIS выдал Москву, второй USA (скорее всего это VPN).
Я скачал логи доступа к себе на машину и командами
cat access-log | grep 217.118.83.143 > 217.118.83.143.txt
cat access-log | grep 217.118.83.143 > 67.21.75.194.txt
выделил запросы с этих адресов.
Обнаружилась очень интересная вещь. Сами транзакции были примерно в 19:34 по времени сервера (UTC).
Привожу данные с логов, возможно это поможет вам или другим админам.
217.118.83.143 - - [29/Dec/2012:19:24:49 +0000] "GET /?a=do_login&follow=&username=admin&password=~LebDe6%3FI6%25i HTTP/1.1" 200 149 "-" "Mozilla/5.0 (Windows NT 5.1; rv:17.0) Gecko/20100101 Firefox/17.0"
Привожу как есть, без изменений, так как пароль на админку все равно уже сменен. Запись лога говорит о том, что в 19:24 по времени сервера взломщик спокойно авторизировался, зная пароль администратора. Значит сам взлом (процесс получения пароля админа) произошел раньше, и я сделал выборку из лога по отпечатку браузера "Mozilla/5.0 (Windows NT 5.1; rv:17.0) Gecko/20100101 Firefox/17.0", а также выборку по подсети взломщика 217.118.x.x
И данные нашлись... просматривая лог я обнаружил интересную и необычную запись:
217.118.83.248 - - [29/Dec/2012:14:35:30 +0000] "GET /index.php HTTP/1.1" 200 3485 "http://dreamfinancialgroup.com/fonts/vers.pl" "Mozilla/5.0 (Windows NT 5.1; rv:17.0) Gecko/20100101 Firefox/17.0"
Это означает что был вызван index.php, а в качестве Location запроса указан
http://dreamfinancialgroup.com/fonts/vers.pl, к слову это Perl-скрипт, и его уже не оказалось по тому адресу. Заметьте что адрес 217.118.83.248 совпадает с подсетью взломщика.
И тут первый вариант "Взломщик узнал пароль где-то вне хостинга." отпал сам собой, так как явно видно, что был запуск какого-то скрипта. Посмотрев nslookup dreamfinancialgroup.com я увидел IP адрес хоста 69.197.20.36, который находится в той же подсети класса C, что и IP нашего сайта 69.197.20.26. Я сделал косвенный вывод что сайты расположены на одном физическом сервере, и значит Perl скрипт мог считать лог доступа к веб-серверу, ведь достаточно знать домен, а имя пользователя это 8 первых символов (или меньше) без знаков (так генерирует имена cPanel), только буквы-цифры.
Я попробовал загрузить php-shell, и это окончилось неудачей, так как на сервере настроены ограничения по запуску php скриптов, типа open_basedir, shell_exec и прочих. Тут до меня дошло, почему вызывали именно Perl-скрипт. Я загрузил Perl-shell и попробовал считать логи доступа аккаунта dreamfin (8 первых символов), и это окончилось неудачей, так как логи доступа и многие папки принадлежащие другим пользователям стоят с парвами 700 или 711, что не разрешает чтение другому пользователю или другой группе. В Cpanel, в случае установки su_php (или аналогичных) все права, в том числе права на public_html принадлежат конкретному пользователю с одноименной группой, например dreamfin/dreamfin. Вариант чтения логов веб-сервера отпал, так как другой пользователь не имеет к ним доступа.
Но как-то же пароль узнали? Значит есть другой файл доступный для чтения, подумал я, и открыл каталог своего пользователя, внимательно просмотрев права на каждый файл и каталог. Интересное обнаружилось в папке tmp аккаунта. Там сохраняются данные программ статистики типа webalizer, analog, etc. Только в папке analog нашелся файл 12.html со статистической выкладкой по доступу к хосту. Этот файл с правами 644 !!! значит его может считать ЛЮБОЙ пользователь системы. Я открыл свой файл 12.html и посмотрел записи в нем... как ни странно, но я нашел долбанный запрос от ГК, с паролем админа. Он попал в файл статистики. Собственно на этом тайна получения пароля админа раскрыта. Любой пользователь хостинга может загрузить Perl-shell, или специально написанный Perl-скрипт (вспоминайте
http://dreamfinancialgroup.com/fonts/vers.pl), выставить ему права выполнения и в путь, читать файлы статистики других юзеров, делая поиск строки "username=admin&password".
Но как взломщик получает имена пользователей и домены на конкретном сервере? Просматривая форум на свежие сайты на хостинге Genius Guard? Возможно. Я пошел другим путем.
Системные файлы /etc/passwd (содержит список юзеров сервера) и файл /etc/domainips (содержит связи IP-домен, и соответственно домены сайтов, которые хостятся на сервере) на хосте (да и вообще в cPanel) с правами 644, опять же любой юзер может считать их, получив список доменов, и сделав из них имена пользователей (или просто считав имена пользователей из passwd), далее РЕГУЛЯРНО просматривая файлы статистики (программно конечно) и делая поиск строки "username=admin&password". Как только результат получен, можно идти в админку нужного хоста и делать там все что угодно.
К моему удивлению, количество доменов на этом сервере protected1.geniusguard.com составляет 99 (буквально), на момент чтения этого файла. Домены включают также домен geniusguard.com, и можно сделать вывод, что другого сервера у них нет. То есть арендовали сервер у Staminus, и продают его по 50 и выше долларов хайпам на ГК и другим проектам (Ваган привет). Кроме того, что это минимум некрасиво, это не безопасно как видите. Вероятность найти данные админа у какого-то проекта, когда сайтов есть сотня сайтов на сервере, достаточно высокая, поэтому не удивляйтесь, что на Genius Guard будут продолжаться взломы ГК.
Да, и кроме этого, хайпы как вы знаете часто подвержены ДДОС атакам. Какова вероятность что будут ддосить один из 100 хайпов на сервере? Правильно, высокая. Значит другие сайты в момент ДДОСа будут либо дико тормозить, либо вовсе не будут доступны. Вывод: Genius Guard в топку, однозначно.
Проблема получения пароля админа существует также на любом виртуальном хостинге, где хостятся ГК (ну как бы популярность хоста, что-ли), и где установлена программа статистики analog. Возможно koddos, но я не проверял, нет аккаунта.
Теперь далее,
просматривая файл-выборку по МАСКЕ IP взломщика я обнаружил интересные записи:
217.118.83.151 - - [29/Dec/2012:12:21:14 +0000] "GET /index.php?a=do_login&follow=&username=Elena82&password=ghbdtn HTTP/1.1" 200 2017 "https://agrolineinv.com/index.php" "Opera/9.80 (Android 2.2.1; Linux; Opera Mobi/ADR-1212030820) Presto/2.11.355 Version/12.10"
217.118.83.151 - - [29/Dec/2012:12:21:15 +0000] "GET /usertpl/js/tms_presets.js HTTP/1.1" 200 2234 "https://agrolineinv.com/index.php?a=do_login&follow=&username=Elena82&password=ghbdtn" "Opera/9.80 (Android 2.2.1; Linux; Opera Mobi/ADR-1212030820) Presto/2.11.355 Version/12.10"
217.118.83.151 - - [29/Dec/2012:12:21:19 +0000] "GET /?a=account HTTP/1.1" 200 2560 "https://agrolineinv.com/index.php?a=do_login&follow=&username=Elena82&password=ghbdtn" "Opera/9.80 (Android 2.2.1; Linux; Opera Mobi/ADR-1212030820) Presto/2.11.355 Version/12.10"
217.118.83.151 - - [29/Dec/2012:12:21:36 +0000] "GET /?a=referals HTTP/1.1" 200 2221 "https://agrolineinv.com/?a=account" "Opera/9.80 (Android 2.2.1; Linux; Opera Mobi/ADR-1212030820) Presto/2.11.355 Version/12.10"
217.118.83.248 - - [29/Dec/2012:14:35:30 +0000] "GET /index.php HTTP/1.1" 200 3485 "http://dreamfinancialgroup.com/fonts/vers.pl" "Mozilla/5.0 (Windows NT 5.1; rv:17.0) Gecko/20100101 Firefox/17.0"
217.118.83.248 - - [29/Dec/2012:14:35:30 +0000] "GET /usertpl/css/reset.css HTTP/1.1" 200 508 "https://agrolineinv.com/index.php" "Mozilla/5.0 (Windows NT 5.1; rv:17.0) Gecko/20100101 Firefox/17.0"
217.118.83.248 - - [29/Dec/2012:14:35:31 +0000] "GET /usertpl/css/grid.css HTTP/1.1" 200 1383 "https://agrolineinv.com/index.php" "Mozilla/5.0 (Windows NT 5.1; rv:17.0) Gecko/20100101 Firefox/17.0"
... (здесь запросы картинок и т.д.)
217.118.83.248 - - [29/Dec/2012:14:36:15 +0000] "GET /?a=do_login&follow=&username=admin&password=~LebDe6%3FI6%25i HTTP/1.1" 200 149 "-" "Mozilla/5.0 (Windows NT 5.1; rv:17.0) Gecko/20100101 Firefox/17.0"
217.118.83.248 - - [29/Dec/2012:14:36:16 +0000] "GET /favicon.ico HTTP/1.1" 404 389 "-" "Mozilla/5.0 (Windows NT 5.1; rv:17.0) Gecko/20100101 Firefox/17.0"
Взломщик через минуту после запуска скрипта уже заходил в админку, зная пароль админа.
Обратите внимания на IP-адреса и на параметры запросов, а также на отпечатки браузеров. В 12:21 был доступ с адреса 217.118.83.151, с мобильного браузера Opera на андроиде. В параметрах username=Elena82&password=ghbdtn. Ничего не напоминает?
Это та маша-лена, которая в баньку постоянно летает. Далее в 14:35 был доступ со стационарного компа с Firefox (вызов скрипта) с адреса 217.118.83.248.
Как вы может быть понимаете, Elena82 и взломщик находились в одной подсети примерно в одно и тоже время. Если посмотреть WHOIS адресов, то обнаружится записи:
inetnum: 217.118.80.0 - 217.118.83.255
netname: BEEWLAN1
descr: JSC "VimpelCom" WLAN1 Moscow
Это wifi-файл сеть провайдера Beeline, возможно в каком-то интернет кафе, или кафе с wifi. Это не прямое, а косвенное доказательство, но других пользователей кроме Elena82 и взломщика с этими адресами в логе не зафиксировано...
------
Теперь пара слов о том, как воруют деньги, или как это происходило в нашем случае. Я не привожу записи из лога, а привожу уже расшифровку.
1. Взломщик попадает в админку, делает анализ данных, а именно наличие пользователей с депо, которое уже начислились и не выведено.
2. В нашем случае было ожидание до вечера, видимо разработка тактики, или просто не было времени у взломщика.
3. Взломщик зашел вечером, поменял пароли у двух пользователей (daniel, jazzz) у которых были деньги на аккаунтах. Это наши пользователи, мы закидывали деньги в проект, через депо чтобы поддержать его.
4. Взломщик заходит в аккаунты (через соседний браузер, Chrome) и делает запросы на вывод средств, далее подтверждает их в админке. Здесь есть важный момент, которые относится как к безопасности, так и к удобству.
У нас вопреки рекомендациям ГК про shared-хостинги были узазаны данные доступа к API для автоплатежей. Но если их не указывать, то нужно сотню раз в день заходить в админку, делать выводы и указывать данные по платежным системам. Еще более неудобно, если платежных систем несколько и из-за каждых двух баксов, нужно проделывать кучу операций.
5. Взломщик вывел 72$ с нашего либерти через API. Я не понял как, так как операции в транзакциях ГК нет, и в истории либерти данная транзакция без указания Memo. Но скорее всего скопировали данные доступа к API, и вызывали их через php-скрипт на своем аккаунте, так как защита доступа к IP у либерти настроена на самый главный IP системы, и одинаковый для всех аккаунтов сервера.
6. Поменял адрес e-mail адрес админа чтобы получать информацию и иметь возможность зачислять бонусы на аккаунты.
7. Поменял кошельки в настройках ГК, чтобы новые платежи от пользователей принимать уже себе...
-------
Собственно все, делайте выводы сами.