2

Я могу сделать следующее для отправки двоичных данных в netcat:

echo -e '\x80' | nc host port

Но я не хочу делать это так, я хочу подключиться к серверу:

nc 192.168.1.115 12345

А затем отправьте текст:

aaaaaaaaaabbbbbbbbbbccccccccccc

А затем отправьте некоторые двоичные данные:

0x80 0xF4 0x12

Как я могу это сделать?

4 ответа4

5

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

Создайте временную FIFO. Правильный способ создания временного файла - это mktemp . К сожалению, он не может создать пятерки. Он может создать временный каталог, хотя:

tmpd=`mktemp -d`
tmpf="$tmpd"/fifo
mkfifo "$tmpf"
printf "%s\n" "$tmpf"  # just to know the path to the fifo, it may be useful later

В качестве альтернативы вы можете создать именованный fifo вручную в каком-либо фиксированном или специальном месте. Тебе решать.

Создайте фоновый процесс, который будет читать fifo и передавать данные на сервер:

nc 192.168.1.115 12345 < "$tmpf" &
ncpid=$!  # PID may be useful later

Обратите внимание, если nc не выходит преждевременно. Предполагая, что нет проблем ни с самим соединением, ни с сервером, указанная выше фоновая команда будет оставаться на связи, пока вы не закончите посылать первый пакет данных через fifo. Но вы хотите, чтобы он оставался открытым и принимал несколько записей, поэтому откройте fifo и не закрывайте его (пока):

exec 3> "$tmpf"

Теперь вы можете отправлять все, что вам нравится, через fifo, и фоновое соединение сохраняется:

echo abcd      >&3  # sends text
echo -e '\x80' >&3  # sends "binary"
cat /etc/issue >&3  # sends file
cat            >&3  # type whatever you want, terminate with Ctrl+D

Любая из этих команд может быть вызвана с путем к fifo вместо &3 , если только вы знаете путь. Зная путь, вы можете написать в fifo из того же или другого сеанса оболочки:

cat > /path/to/the/fifo  # type whatever you want, terminate with Ctrl+D

Или вы можете открыть дескриптор в другом сеансе аналогично оригинальному. Независимо от того, как вы пишете в fifo, nc передает его на удаленный сервер по одному соединению.

Но остерегайтесь условий гонки. Использование одного дескриптора внутри одного сеанса оболочки - это хороший способ избежать их.

После того, как вы передадите все необходимые данные, завершите nc и закройте дескриптор в исходном сеансе оболочки:

kill $ncpid
exec 3>&-

Обратите внимание, что в некоторых случаях единственной последней команды достаточно, чтобы сделать фоновый nc выход; это зависит от того, что ты сделал и что ты все еще делаешь с fifo. По этой причине я решил убить nc явно.

Удалите временный каталог и его содержимое (например, fifo):

rm -r "$tmpd"

Конечная нота:

Нет необходимости ставить nc в фоновый режим. Вы можете запустить его в одном терминале, записать в fifo (зная его путь) из другого. Таким образом, вы можете легко контролировать его состояние. Приспособьте это решение к вашим потребностям.

1

Вы можете получить помощь из именованного канала, чтобы сделать это, с небольшим фокусом:

remote$ nc -v -n -l -p 8888 > /tmp/data
Listening on [0.0.0.0] (family 0, port 8888)
Connection from 10.0.3.1 47108 received!

local:1$ mkfifo /tmp/fifo
local:1$ nc -v -n <>/tmp/fifo 10.0.3.66 8888
Connection to 10.0.3.66 8888 port [tcp/*] succeeded!

Важно открыть чтение и запись fifo (или иметь другой нейтральный процесс, такой как sleep 9999 >/tmp/fifo оставляя его открытым для записи), иначе первая (конец) записи будет завершать цикл чтения netcat. Следовательно, <> .

local:2$ echo aaaaaaaaaabbbbbbbbbbccccccccccc > /tmp/fifo
local:2$ cat /bin/ls > /tmp/fifo # sends the binary contents of the file /bin/ls, which would probably garble the input or output
local:2$ cat > /tmp/fifo
Some more interactive text

(local:1$ )
^C

remote$ od -c /tmp/data|head -4
0000000   a   a   a   a   a   a   a   a   a   a   b   b   b   b   b   b
0000020   b   b   b   b   c   c   c   c   c   c   c   c   c   c   c  \n
0000040 177   E   L   F 002 001 001  \0  \0  \0  \0  \0  \0  \0  \0  \0
0000060 003  \0   >  \0 001  \0  \0  \0   0   T  \0  \0  \0  \0  \0  \0
0

Кажется, работает следующее:

while read -r; do echo -en "$REPLY" | nc ...; done

Это позволяет вам включать escape-последовательности \xNN с вашими обычными данными, как в:

aaaaaaaaaabbbbbbbbbbccccccccccc\x80\xF4\x12

Не забудьте удвоить любые буквальные символы \ в вашем текстовом вводе. Обратите внимание, что использование read -r и $REPLY вместо переменной останавливает удаление начальных и конечных пробелов.

Это не добавляет новую строку в конец буфера, поэтому вам нужно либо пропустить опцию n в команде echo либо набрать \x0a там, где вы хотите новую строку.

Я не могу настроить nc в настоящее время, но я проверил с:

while read -r; do echo -en "$REPLY" | cat | xxd; done

Для тестирования вы можете использовать od -ct x1 если у вас нет xxd ; или используйте od -c если вы счастливы видеть двоичные символы в восьмеричном виде. Вы можете опустить cat | из трубы: я включил его как возможно лучшую симуляцию использования nc .

0

Если вы заранее знаете две части данных, попробуйте следующее:

$ ( echo "aaabbbccc"; echo -en "\x80\xf4\x12" ) | hexdump -Cv
00000000  61 61 61 62 62 62 63 63  63 0a 80 f4 12           |aaabbbccc....|
0000000d

Если вы хотите иметь больше возможностей (использовать клавиатуру и т.д.), Попробуйте следующее:

$ ( cat; cat | xxd -r -p ) | hexdump -Cv
aaabbbccc
80f412
00000000  61 61 61 62 62 62 63 63  63 0a 80 f4 12           |aaabbbccc....|
0000000d

Примечание: вам нужно нажать Ctrl + D, чтобы завершить каждую cat ... поэтому здесь я набрал (включая Return s - EOT должен появиться в начале строки):

aaabbbccc
^D
80f412
^D

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .