Как отправить двоичные данные в netcat на уже установленное соединение?

2242
user887437

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

echo -e '\x80' | nc host port 

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

nc 192.168.1.115 12345 

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

aaaaaaaaaabbbbbbbbbbccccccccccc 

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

0x80 0xF4 0x12 

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

2
Я думал, вы могли бы использовать `echo -e '\ x80 \ xF4 \ x12' | xclip -i` в другом терминале, затем вставьте его в терминал `nc`, но настройки ввода терминала мешают, и я не знаю, как их устанавливает` nc`, и не могу найти настройки, которые будут работать с ` стты ...; кот | xxd; stty sane`. AFH 6 лет назад 1
Было бы полезно узнать больше о том, что вы пытаетесь отправить и как - файлы / ввод с клавиатуры / и т.д. ... Можете ли вы привести пример того, что пульт ожидает получить? Attie 6 лет назад 0

4 ответа на вопрос

5
Kamil Maciorowski

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

Создайте временную 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 (зная его путь) из другого. Таким образом, вы можете легко контролировать его состояние. Приспособьте это решение к вашим потребностям.

Я так много искал, спасибо! bitcell 5 лет назад 0
1
A.B

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

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 
Ваш ответ использует тот же подход, что и мой, он появился, когда я писал (да, написание и тестирование хорошего ответа занимает у меня так много времени). В моем ответе упоминаются некоторые проблемы, которыми вы пренебрегаете (например, правильная обработка временных файлов, условия гонки), поэтому я оставил их в покое. Тем не менее +1 для вас. Kamil Maciorowski 6 лет назад 0
На самом деле я не заботился о безопасности и лучшем удобстве использования. Вы сделали готовый ответ. A.B 6 лет назад 0
0
AFH

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

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

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

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
Attie

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

$ ( 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... поэтому здесь я набрал (включая Returns - EOT должен появиться в начале строки):

aaabbbccc ^D 80f412 ^D