Ao resolver alguns desafios do CTF on-line, deparei-me com uma situação em que precisava forçar força bruta em um servidor. Este é o código que escrevi:
#!/bin/bash
for i in {0..9}{0..9}{0..9}{0..9}
do
echo "Now trying code.."
echo $i
echo "a fixed string" $i | nc localhost *port here* >> /tmp/me/dump.txt
done
Isso foi incrivelmente, dolorosamente lento . Eu precisava tentar combinações de 1000 a 9999 e isso levou cerca de 5 segundos para cada 10 tentativas. Então, seguindo um conselho, coloquei um '&' no final desta linha:
echo "a fixed string" $i | nc localhost *port here* >> /tmp/me/dump.txt &
E, tentou centenas de combinações em segundos. Fiquei muito surpreso. Alguém poderia me explicar a lógica? O que o '&' fez?
bash
shell-script
command-line
aprendizX
fonte
fonte
&
faz com que o comando seja executado em segundo plano, isso é tudo. Não tornou mais rápido nem nada. Leia o manual do shell que você estiver usando (presumo que o bash).for i in {1000..9999}
wait
no final, no entanto.nc -z localhost 1000-2000
?Respostas:
Adicionar
&
gera um processo em segundo plano.Se você escrever
a; b
, ele executará o comandoa
, aguarde o término e execute o comandob
, em sequência.Se você escrever
a & b
, ele apareceráa
como um processo em segundo plano. Não esperará que termine e começará a funcionarb
imediatamente. Ele executará os dois ao mesmo tempo.Você pode ver o que ele faz experimentando no shell. Se você
X
instalou,xterm
é uma boa maneira de ver o que acontece: digitandofará com que outra janela do terminal seja aberta e a primeira aguardará até você fechá-la. Somente quando você o fechar, você recuperará sua concha. Se você digitar
então ele será executado em segundo plano e você recuperará seu shell imediatamente, enquanto a
xterm
janela também permanecerá aberta.Então se você escreve
ele faz a conexão, envia a string, armazena o que sai no arquivo e só então passa para o próximo.
Adicionando o
&
faz não esperar. Terminará executando todos os dez mil deles mais ou menos simultaneamente.Seu script parece "terminar" mais rapidamente, porque provavelmente não terminou realmente nesse período. Acabou de fazer dez mil trabalhos em segundo plano e depois encerrou o primeiro.
Isso também significa que, no seu caso, ele tentará abrir dez mil conexões mais ou menos ao mesmo tempo. Dependendo do que a outra extremidade pode suportar, algumas delas podem falhar. Não apenas isso, mas não há garantia de que eles irão funcionar em ordem, na verdade eles quase certamente não, então o que realmente vai acabar
/tmp/me/dump.txt
é o palpite de alguém.Você verificou se a saída estava correta?
fonte
$ cat dump.txt | sort | uniq -u
..e a linha que contém a senha correta foi revelada para mim.nc
o buffer de gravação do servidor . Se não fosse esse o caso, as respostas do servidor provavelmente teriam sido intercaladas. Ou seja, se você tivesse um buffer de gravação de 1 byte e as respostas fossem1111
e2222
, provavelmente teria visto algo como, em11221212
vez de um, ordenadamente separado1111 2222
.O comando nc (netcat) é oneroso, em termos de tempo. Ele precisa se conectar ao servidor remoto, enviar os dados, aguardar uma resposta e devolvê-los.
Usando & você está basicamente bifurcando esse comando em um processo em segundo plano (é chamado de "trabalho"). Por si só, isso não o faz correr mais rápido. Mas isso significa que seu loop não está mais bloqueado e já pode fazer a próxima iteração (com a próxima nc).
Então, basicamente, sua aceleração é causada por fazer todas essas conexões remotas em paralelo, caso contrário, elas teriam que esperar a conclusão da anterior.
Btw, dependendo do seu terminal, os comandos echo também podem tornar seu loop mais lento (às vezes eles precisam esperar até que haja espaço no buffer de gravação).
fonte