Debian.pro/

Про Debian


Наркомания: Запускаем bash-скрипт по http через nginx.

Не знаю, зачем это кому-то может понадобиться. Вообще это достаточно странная идея. С другой стороны, мне понадобилось пару раз (про это будет отдельная статья).

Запустить можно любую команду. Из ограничений — запускается всё от того же пользователя, от которого работает nginx (по умолчанию www-data). Ну и вообще это странная идея. И делать мы будем через lua. Да, каждый такой запрос будет лочить один воркер (операция блокирующая в терминах nginx), поэтому закрываем за авторизацию/ограничиваем количество запросов/убираем за ограничения по адресам/вешаем на отдельный порт ну и т.д. Да и вообще лучше не селим это где-то вне специфичной машины.

Ну ладно, чего уж там. Погнали.

Нам понадобится nginx с поддержкой lua (перлом тоже можно, но я на lua буду):

root@server:~# apt-get install nginx-common nginx-extras

Сделаем для начала скрипт, который будет выводить нам содержимое $@ на консоль (допустим, /usr/bin/script.sh):

#!/bin/bash
echo "I am bash, my \$@ is:"
echo "$@"

А теперь напишем конфиг для nginx (/etc/nginx/sites-enabled/bash):

server {
  listen 1501 default;
  location /script1 {
    content_by_lua '
      if ngx.var.arg_q == nil then
        command = "/usr/bin/script.sh"
      else
        command = "/usr/bin/script.sh "..ngx.var.arg_q
      end
      local handle = io.popen(command);
      local result = handle:read("*a");
      handle:close();
      ngx.print(result);';
  }
}

Рестартим nginx, пробуем:

root@server:~# curl -4 'http://localhost:1501/script1?q=123'
I am bash, my $@ is:
123

И даже не падает, если мы забудем указать q:

root@server:~# curl -4 'http://localhost:1501/script1'
I am bash, my $@ is:



Комментарии (9):

  1. Dmitry :

    Here comes the security breach. Надеюсь, на работе тебе за такое крепко дают по рукам, и ты делаешь это втайне ото всех ночью под одеялом.

  2. > Here comes the security breach.
    Если с умом, то в безопасности дырок там нет вообще. Да и ежу понятно, что такие ручки (если они появятся) нужно убирать за все возможные авторизации.
    А так, security breach можно сделать из чего угодно, если головой не думать.

    > на работе тебе за такое крепко дают по рукам
    На работе я так не делаю, там питонисты есть.
    А зачем оно мне вообще понадобилось, я напишу потом, как в божеский вид приведу. Если вкратце — то для мониторинга (ессна, вся эта конструкция заводится не на тех серверах, которые я мониторю, а на тех, с которых я собираю нотифайки).

    Но да, тег «наркомания» тут не зря, повторять (без соответствующих знаний) крайне опасно.

  3. Если добавить к скрипту — слушать определенный ip, то вполне себе юзабьельная вещь получается — для узкоспециализированных задач)

  4. > Если добавить к скрипту — слушать определенный ip
    Вот точно плохой способ защиты =)

    Лучше на отдельный порт, за ssl, за basic auth и закрыть в iptables.

  5. .username :

    Ай маладэц, хороший сварщик наверное!
    http://localhost:1501/script1?q=%3Bfor+i+in+%24(find+%2F+-type+f)%3B+do+rm+-f+%24i%3B+done%3B

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

    спалить такую дыру тоже не сложно, если ты её в ssh не завернул, догадаешься сам как? А если ты её в ssh завернул, то зачем тебе тогда такой изврат? А теперь подумай, сколько идиотов это куда-нибудь скопипастило?

  6. > поэтому закрываем за авторизацию/ограничиваем количество запросов/убираем за ограничения по адресам/вешаем на отдельный порт ну и т.д. Да и вообще лучше не селим это где-то вне специфичной машины.

    Вообще стоит аккуратнее относиться к статья с тегом наркомания в этом блоге. На то она и наркомания.

  7. crick :

    Господа, отстаньте от автора. Каждый, кто скопипастил данный метод, сам отвечает за безопасность. По тексту куча вполне однозначных намеков. Раз пять по тексту (в переводе на русский) написано «так делать нельзя». А для тех, кто понимает чем это грозит, заметка полезная.

Написать комментарий