Как работает эта команда? mkfifo /tmp/f; cat /tmp/f | /bin/sh -i 2>&1 | nc -l 1234 > /tmp/f

Как работает эта команда? mkfifo /tmp/f; cat /tmp/f | /bin/sh -i 2>&1 | nc -l 1234 > /tmp/f

Сегодня я читал ncman-страницу и наткнулся на эту команду. Я знаю, что:

  • mkfifo /tmp/fсоздает именованный канал в/tmp/ф.

  • cat /tmp/fпечатает все, что записано в этот именованный канал, а вывод cat /tmp/fпередается по каналу/bin/sh

  • /bin/shработает в интерактивном режиме, а stderr перенаправляется в stdout.
  • `затем вывод передается в nc, который прослушивает порт 1234
  • и вывод в конечном итоге снова перенаправляется в именованный канал.

при запуске подключение к удаленному серверу на этом порту, т.е. 1234, открывает приглашение оболочки, и клиент может выполнять произвольные команды. Но как это работает таким образом?

решение1

Такая команда использует преимущества перенаправления ввода-вывода и интерактивного режима sh, который включен по умолчанию при подключении к TTY.

Обратите внимание, что cat остается открытым в FIFO. Это ваша первая подсказка. Когда sh запускается, все, что он делает, это направляет свой stdout и strerr в TTY. Вместо этого sh не подключен к TTY. Обычно sh автоматически переходит в интерактивный режим при подключении к TTY, но поскольку это не так, добавляется опция -i. Это означает, что он продолжит принимать входные данные для новых команд. Вывод этих команд направляется в stdin nc, а вывод nc (который представляет собой команды, поступающие по сети) перенаправляется в FIFO.

По сути, FIFO используется как именованный канал для замыкания кольца перенаправления.

Вы можете думать об этом проще, как о sh и nc, которые перенаправляют друг друга в цикле. Остальная часть команды — просто пустая трата времени.

Связанный контент