Доброго времени суток форумчане. Сегодня я хотел бы рассказать про свежий баг который используют большинство хакерских группировок.
Да, все мои статьи посвящены удалённому выполнению кода, но скоро я начну писать статьи на разнообразные темы.
Поехали!
Как вы поняли уязвимость может использоваться как локально так и удалённо некий такой бонус хакерам)
На данный момент уязвимо очень много серверов:
Локальная эксплуатация:
Уязвимый код находится в deliver_message():
Потому что 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
Спасибо за прочтение моей статьи!
Да, все мои статьи посвящены удалённому выполнению кода, но скоро я начну писать статьи на разнообразные темы.
Поехали!
Как вы поняли уязвимость может использоваться как локально так и удалённо некий такой бонус хакерам)
На данный момент уязвимо очень много серверов:
Локальная эксплуатация:
Уязвимый код находится в 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
Удалённая эксплуатация:
Наш метод локальной эксплуатации не работает удаленно, потому что 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