Como enviar dados binários no netcat para uma conexão já estabelecida?

2

Eu posso fazer o seguinte para enviar dados binários no netcat:

echo -e '\x80' | nc host port

Mas eu não quero fazer assim, o que eu quero é conectar a um servidor:

nc 192.168.1.115 12345

E envie um texto:

aaaaaaaaaabbbbbbbbbbccccccccccc

E, em seguida, envie alguns dados binários:

0x80 0xF4 0x12

Como posso fazer isso?

    
por user887437 25.03.2018 / 15:43

4 respostas

5

Nota: ao seguir esta solução, digite os comandos em uma única sessão de shell (ou use um único script), a menos que seja dito o contrário. Isso ocorre porque ele usa variáveis e descritores de arquivos, eles não estão diretamente disponíveis fora de sua sessão original.

Crie um fifo temporário. O caminho certo para criar um arquivo temporário é com mktemp . Infelizmente não pode criar fifos. Pode criar um diretório temporário embora:

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

Alternativamente, você pode criar um fifo nomeado à mão em algum local fixo ou ad-hoc. Depende de você.

Crie um processo em segundo plano que leia o fifo e passe os dados para um servidor:

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

Preste atenção se nc não sair prematuramente. Assumindo que não há problema com a conexão em si nem com o servidor, o comando de fundo acima permanecerá conectado até que você termine de enviar o primeiro grupo de dados através do fifo. Mas você quer que ele fique aberto e aceite várias gravações, então abra o fifo e não o feche (ainda):

exec 3> "$tmpf"

Agora você pode enviar o que quiser através do fifo e a conexão de fundo persiste:

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

Qualquer um desses comandos pode ser invocado com o caminho para o fifo, em vez de &3 , se você conhecer o caminho. Conhecendo o caminho, você pode escrever para o fifo da mesma ou de outra outra sessão da shell:

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

Ou você pode abrir um descritor em outra sessão de maneira semelhante à original. Seja qual for a forma como você escreve para o fifo, o nc irá passá-lo para o servidor remoto em uma única conexão.

Mas cuidado com as condições da corrida. Usar um único descritor dentro de uma única sessão de shell é uma boa maneira de evitá-los.

Depois de passar os dados necessários, termine o nc e feche o descritor na sessão original do shell:

kill $ncpid
exec 3>&-

Note que em algumas circunstâncias o único comando é suficiente para fazer o background nc exit; depende do que você fez e do que você ainda está fazendo com o fifo. Por esse motivo, optei por matar explicitamente o nc .

Remova o diretório temporário e seu conteúdo (ou seja, o fifo):

rm -r "$tmpd"

Nota final:

Não é necessário colocar nc em segundo plano. Você pode executá-lo em um terminal, escrever para o fifo (conhecendo seu caminho) de outro. Desta forma, você pode monitorar facilmente seu estado. Adapte esta solução às suas necessidades.

    
por 25.03.2018 / 19:21
1

Você pode obter ajuda de um pipe nomeado para fazer isso, com um pequeno truque:

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!

É importante abrir o fifo read-write (ou então ter outro processo neutro como sleep 9999 >/tmp/fifo mantendo-o aberto para escrita) senão o primeiro (final de) write terminará o loop de leitura do netcat. Daí o <> .

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  
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!
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  %pre%  %pre%  %pre%  %pre%  %pre%  %pre%  %pre%  %pre%  %pre%
0000060 003  %pre%   >  %pre% 001  %pre%  %pre%  %pre%   0   T  %pre%  %pre%  %pre%  %pre%  %pre%  %pre%
%pre% %pre% %pre% %pre% %pre% %pre% %pre% 0000060 003 %pre% > %pre% 001 %pre% %pre% %pre% 0 T %pre% %pre% %pre% %pre% %pre% %pre%
    
por 25.03.2018 / 17:33
0

O seguinte parece funcionar:

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

Isso permite que você inclua \xNN sequências de escape com seus dados normais, como em:

aaaaaaaaaabbbbbbbbbbccccccccccc\x80\xF4\x12

Lembre-se de dobrar todos os caracteres \ literais na sua entrada de texto. Observe que o uso de read -r e $REPLY em vez de uma variável interrompe a remoção de espaços em branco iniciais e finais.

Isso não adiciona uma nova linha ao final do buffer, então você precisa omitir a opção n do comando echo ou digitar \x0a onde você quer uma nova linha.

Não consigo configurar nc no momento, mas testei com:

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

Para testes, você pode usar od -ct x1 se não tiver xxd ; ou use od -c se você estiver feliz em ver caracteres binários em octal. Você pode omitir cat | do pipe: incluí-lo como possivelmente uma simulação melhor do uso de nc .

    
por 25.03.2018 / 17:31
0

Se você conhece os dois dados com antecedência, tente o seguinte:

$ ( 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

Se você quiser ter mais controle (use o teclado, etc ...), tente o seguinte:

$ ( 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

Nota: você precisa pressionar Ctrl + D para finalizar cada cat ... então aqui eu digitei (incluindo o Return s - EOT deve aparecer no início da linha):

aaabbbccc
^D
80f412
^D
    
por 25.03.2018 / 19:00