• Курсы Академии Кодебай, стартующие в мае - июне, от команды The Codeby

    1. Цифровая криминалистика и реагирование на инциденты
    2. ОС Linux (DFIR) Старт: 16 мая
    3. Анализ фишинговых атак Старт: 16 мая Устройства для тестирования на проникновение Старт: 16 мая

    Скидки до 10%

    Полный список ближайших курсов ...

Статья Exim Local / Remote Command Execution - или "дружелюбный" почтовый агент

Доброго времени суток форумчане. Сегодня я хотел бы рассказать про свежий баг который используют большинство хакерских группировок.

Да, все мои статьи посвящены удалённому выполнению кода, но скоро я начну писать статьи на разнообразные темы.

30749


Поехали!

Как вы поняли уязвимость может использоваться как локально так и удалённо некий такой бонус хакерам)
На данный момент уязвимо очень много серверов:

30748


Локальная эксплуатация:
Уязвимый код находится в deliver_message():
Код:
6122 #ifndef DISABLE_EVENT
6123       if (process_recipients != RECIP_ACCEPT)
6124         {
6125         uschar * save_local =  deliver_localpart;
6126         const uschar * save_domain = deliver_domain;
6127
6128         deliver_localpart = expand_string(
6129                       string_sprintf("${local_part:%s}", new->address));
6130         deliver_domain =    expand_string(
6131                       string_sprintf("${domain:%s}", new->address));
6132
6133         (void) event_raise(event_action,
6134                       US"msg:fail:internal", new->message);
6135
6136         deliver_localpart = save_local;
6137         deliver_domain =    save_domain;
6138         }
6139 #endif
Потому что expand_string() распознает ${run{<command> <args>}}" элемент расширения, и потому что новый - > адрес является получателем почты что доставляется. Локальный злоумышленник может просто отправить письмо в "${run.{..}}@localhost "(где "localhost" является одним из Exim local_domains) и выполнять произвольные команды, как root (по умолчанию deliver_drop_privilege имеет значение false)

Удалённая эксплуатация:

Наш метод локальной эксплуатации не работает удаленно, потому что ACL" verify = recipient " (Access-Control List) в Exim по умолчанию конфигурация требует локальной части адреса получателя (часть, которая предшествует знаку@), чтобы быть именем локального пользователя.

В конечном итоге разработан сложный метод удаленной эксплуатации Exim. В своей конфигурации по умолчанию, но мы сначала определили различные нестандартные конфигурации, которые легко использовать удаленно.

- Если ACL "verify = recipient" был удален вручную администратором (возможно, чтобы предотвратить перечисление имени пользователя через RCPT), тогда наш метод локальной эксплуатации также работает удаленно.

- Если Exim был настроен для распознавания тегов в локальной части через адрес получателя (например, через " local_part_suffix = +*: - * ), то затем удаленный злоумышленник может просто повторно использовать наш метод локальной эксплуатации с помощью RCPT в " balrog+${run{...}}@localhost "(где BALROG имя локального пользователя).

- Если Exim был настроен на ретрансляцию почты в удаленный домен вторичный MX (почтовый обмен), то удаленный злоумышленник может просто использовать наш метод локальной эксплуатации с RCPT до " ${run{...}}@khazad.dum"
(где " khazad.dum " является одним из relay_to_domains Exim). Действительно, ACL" verify = recipient " может проверять только доменную часть удаленного адреса (часть, которая следует за знаком@), а не локальную часть.

Вот такие методы эксплуатации вы можете организовать. Так же у меня есть скрипт который пропатчит ваш сервер на Debian/Ubuntu/Centos
Bash:
#!/bin/bash
rhrelease=/etc/redhat-release
echo "First we will update the Exim, so no new malware could be uploaded"
if [[ -f "$rhrelease" ]]; then
        echo "Centos is installed on server"
    if [[ ! -z  $(rpm -qa | grep exim) ]]; then
            if [[ "$(cat /etc/redhat-release | tr -dc '0-9.'|cut -d \. -f1)" -gt "6" ]]; then

                    echo "Centos 7. Trying to update Exim and reintall curl"
                    yum install -y -q -e 0 exim  >/dev/null 2>&1
            yum reinstall -y -q -e 0 curl >/dev/null 2>&1
            else
                    echo "Centos 6 now has Exim 4.92 in mainline repo too"
                    yum install -y -q -e 0 exim  >/dev/null 2>&1
            yum reinstall -y -q -e 0 curl >/dev/null 2>&1
            fi
    else
        echo "No exim installed. We should stop"
        exit 1
    fi
        else
    if [[ ! -z $(dpkg -l | grep exim) ]]; then
        echo "All Debian-based distro should already get the update. Updating"
            apt-get update >/dev/null 2>&1
            apt-get --yes --force-yes install exim4 exim4-config exim4-daemon-heavy >/dev/null 2>&1
        apt-get --yes --force-yes install --reinstall curl >/dev/null 2>&1
    else
        echo "No exim installed. We should stop"
        exit 1
    fi
fi

if [[ ! -z `grep -Rls tor2web /etc` ]]; then
        echo "Removing Virus, will cause a reboot"
        service crond stop >/dev/null 2>&1
        service cron stop >/dev/null 2>&1
        kill -9 `pgrep kthrotlds` >/dev/null 2>&1
        killall -9 curl wget sh >/dev/null 2>&1
        killall -9 curl wget sh >/dev/null 2>&1
        killall -9 curl wget sh >/dev/null 2>&1
        killall -9 curl wget sh >/dev/null 2>&1
        exipick -i | xargs exim -Mrm >/dev/null 2>&1
        chattr -i   /etc/cron.daily/cronlog /etc/cron.d/root  /etc/cron.d/.cronbus /etc/cron.hourly/cronlog /etc/cron.monthly/cronlog /var/spool/cron/root /var/spool/cron/crontabs/root /etc/cron.d/root /etc/crontab /root/.cache/ /root/.cache/a /usr/local/bin/nptd /root/.cache/.kswapd /usr/bin/\[kthrotlds\] /root/.ssh/authorized_keys /.cache/* /.cache/.sysud /.cache/.a /.cache/.favicon.ico /.cache/.kswapd /.cache/.ntp >/dev/null 2>&1
        rm -rf    /etc/cron.daily/cronlog /etc/cron.d/root  /etc/cron.d/.cronbus /etc/cron.hourly/cronlog /etc/cron.monthly/cronlog /var/spool/cron/root /var/spool/cron/crontabs/root /etc/cron.d/root /etc/crontab /root/.cache/ /usr/local/bin/npt /usr/local/bin/nptd /usr/bin/\[kthrotlds\] /.cache >/dev/null 2>&1
        sed -i -e '/bin\/npt/d' /etc/rc.local >/dev/null 2>&1
        sed -i -e '/user@localhost/d' ~/.ssh/authorized_keys >/dev/null 2>&1
        service crond start >/dev/null 2>&1
        service cron start >/dev/null 2>&1
        exipick -i | xargs exim -Mrm
        echo "fixed"
        reboot
else
        echo "No virus spotted"
fi
Спасибо за прочтение моей статьи!
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!