O comando SSH poderá auxiliar a resolver muitos problemas no dia a dia de um usuário comum ou administrador de sistemas, sendo possível utilizar nos mais diversos sistemas operacionais, tais como, Linux, UNIX, macOS e Windows. Neste post, mostraremos 22 dicas utilizando o SSH.
O primeiro passo é definir o que é Secure SHell. O SSH (Secure SHell) é um protocolo que permite a você acessar virtualmente o servidor como se você estivesse em um terminal. A diferença entre o telnet e o SSH está na segurança. Toda a transmissão de dados no SSH é criptografada, impedindo que hacker consiga capturar as informações trafegadas, incluindo login e senha.
Quando você conecta via terminal remoto com seu servidor, você está controlando aquele servidor a partir de seu sistema operacional. Qualquer comando que você digitar é executado no servidor (e não no seu PC) e você o opera conforme os parâmetros de comandos do servidor.
Guia completo com 22 dicas utilizando o SSH para auxiliar o seu trabalho:
- SSH Socks Proxy
- Tunelamento (encaminhamento de porta)
- Encaminhamento de túnel SSH para host remoto secundário
- Túnel Reverso
- Proxy Reverso
- Estabeleça uma VPN sobre SSH
- Copie sua chave SSH (ssh-copy-id)
- Execute o comando remotamente (não interativo)
- Captura remota de pacotes e exibição no Wireshark
- Copiar pasta local para o servidor remoto
- Aplicativos GUI remotos com encaminhamento SSH x11
- Copie arquivos remotamente com rsync e SSH
- SSH na rede Tor
- Instância SSH para EC2
- Edite arquivos de texto com o VIM sobre ssh / scp
- Monte o local SSH remoto como pasta local com o SSHFS
- SSH Multiplex usando o ControlPath
- Stream de vídeo sobre SSH usando VLC + SFTP
- Autenticação de dois fatores
- Saltando através de hosts de salto com -J
- Bloquear tentativas de força bruta com iptables
- Modifique o encaminhamento de porta em uma sessão com ~ C
1. Tráfego de proxy sobre SSH usando SOCKS
O recurso Proxy SSH foi colocado no número 1 por um bom motivo. É mais poderoso do que muitos imaginam, fornecendo acesso a qualquer sistema que o servidor remoto possa acessar, usando qualquer aplicativo. O cliente ssh pode encapsular o tráfego pela conexão usando um servidor proxy SOCKS. Uma coisa importante a entender é que o tráfego para os sistemas remotos terá uma fonte do servidor remoto. Por exemplo, em um arquivo de log do servidor da web.
ssh -D 8888 usuario@servidor
netstat -pan | grep 8888
tcp 0 0 127.0.0.1:8888 0.0.0.0:* LISTEN 23880/ssh
Aqui, iniciamos o servidor proxy em execução na porta TCP 8888, o segundo comando verifica se a porta está escutando. O 127.0.0.1 indica que o serviço está sendo executado apenas no localhost. Podemos usar um comando diferente para escutar em todas as interfaces, incluindo Ethernet ou Wi-Fi, isso permitirá que outros aplicativos em nossa rede se conectem ao serviço de proxy socks ssh.
ssh -D 0.0.0.0:8888 usuario@servidor servidorremoto
Agora podemos configurar nosso navegador para conectar-se ao proxy. No Firefox, selecione preferências | geral | configurações de rede. Adicione o endereço IP e a porta para a conexão.
Observe a opção na parte inferior do formulário para forçar as solicitações de DNS do navegador para também passarem pelo proxy. Se você estiver usando o proxy para criptografar o tráfego da Web na rede local, terá que selecionar esta opção para que as solicitações de DNS também sejam tunelizadas pela conexão SSH.
Ativar proxy no Chrome
O uso de um parâmetro de linha de comando ao iniciar o Chrome usará o proxy socks e também encapsulará solicitações DNS do navegador sobre o proxy socks5. Mas, sempre verifique, use o dump tcp (dump tcp, não a porta 22) para confirmar que as solicitações de DNS não estão mais visíveis.
google-chrome --proxy-server = "socks5: //192.168.1.10: 8888"
Usando outros aplicativos com o Proxy
Lembre-se de que existem muitos outros aplicativos que podem utilizar um proxy. Um navegador da web é o mais popular. Alguns aplicativos terão opções de configuração para uso do proxy. Outros podem precisar de um programa auxiliar. Um exemplo disso é proxychains. Usando esta ferramenta, podemos, por exemplo, usar o Microsoft RDP sobre o proxy.
proxychains rdesktop$ ServidorWindowsRemoto
As opções de configuração para o proxy são definidas no arquivo de configuração proxychains.
2. Tunelamento (encaminhamento de porta)
Na sua forma mais simples, um túnel SSH abre uma porta no sistema local que se conecta a outra porta na outra extremidade do túnel.
ssh -L 9999: 127.0.0.1:80 usuario@servidorremoto
Vamos entender o parâmetro -L. Pense em -L como o lado de escuta local. Assim, em nosso exemplo acima, a porta 9999 está escutando em localhost e a outra porta até a porta 80 em nosso servidor remoto, note que a 127.0.0.1 refere-se ao localhost no servidor remoto! Neste exemplo a seguir, a porta que está pronta e ativa, e pode ser conectada a partir de outros hosts na rede local.
ssh -L 0.0.0.0:9999:127.0.0.1:80 usuario@servidorremoto
Nestes exemplos, a porta que estamos conectando é um servidor da Web. Também pode ser um servidor proxy ou qualquer outro serviço TCP.
3. Encaminhamento de túnel SSH para host remoto secundário
Podemos usar as mesmas opções acima para que o túnel se conecte a outro serviço em execução em um sistema secundário a partir do servidor remoto.
ssh -L 0.0.0.0:9999:192.168.1.10:80 usuario@servidorremoto
Neste exemplo, estamos encaminhando o túnel do servidor remoto para o servidor Web em execução em 192.168.1.10. O tráfego do servidor remoto -> 192.168.1.10 não está mais no túnel ssh. O servidor da Web em 192.168.1.10 verá o servidor remoto como a fonte das solicitações da Web.
4. Túnel Reverso com SSH
Nesse cenário, queremos configurar uma porta de escuta no servidor remoto que se conectará novamente a uma porta local em nosso host local (ou outro sistema).
ssh -v -R 0.0.0.0:1999:127.0.0.1:902 192.168.1.100 usuario@servidorremoto
Com esta sessão ssh estabelecida, uma conexão com a porta remota do servidor 1999 será encaminhada para a porta 902 em nosso cliente local.
5. Proxy Reverso com SSH
Nesse caso, estamos estabelecendo um proxy SOCKS com nossa conexão ssh, no entanto, o proxy está escutando no servidor remoto. Com as conexões com esse proxy de meias remotas, agora emergindo do túnel como tráfego originário de nosso host local.
ssh -v -R 0.0.0.0:1999 192.168.1.10 usuario@servidorremoto
Solução de problemas de túneis SSH remotos
Se estiver com problemas para que as opções SSH remotas funcionem, verifique com netstat se a porta também está conectada. Mesmo que tenhamos especificado 0.0.0.0 nos exemplos acima, se GatewayPorts estiver definido como no sshd_config, ele ligará apenas ao localhost (127.0.0.1).
Aviso de segurança
Observe que, ao abrir túneis e socks proxies, você pode estar expondo os recursos internos da rede a redes não confiáveis.
6. Estabeleça uma VPN sobre SSH
Após estabelecer uma conexão em um sistema, esse sistema se torna um ponto de gateway para acesso adicional à rede. Isso é conhecido como rotação e permite o movimento lateral através da rede.
Podemos usar o proxy SSH para isso e o proxychains, no entanto, existem algumas limitações. Por exemplo, não podemos usar sockets brutos, portanto, as verificações do Nmap SYN não podem ser usadas para verificar a porta da rede interna.
Usando esta opção de VPN mais avançada, movemos a conectividade para a camada 3. Em seguida, podemos rotear o tráfego pelo túnel usando o roteamento de rede padrão. Esta técnica utiliza ssh, iptables, tun interfaces e roteamento.
Primeiro, precisamos dessas opções definidas no sshd_config. Como estamos fazendo alterações na interface no sistema remoto e no sistema cliente, precisaremos de privilégios de root em ambos os lados.
PermitRootLogin yes
PermitTunnel yes
Em seguida, estabeleceremos nossa conexão ssh usando o parâmetro que solicita a inicialização do tun dos dispositivos.
ssh -v -w qualquer root@servidorremoto
Agora você deve ter um dispositivo tun ao mostrar interfaces (# ip a). O próximo passo é adicionar endereços IP às interfaces do túnel.
Lado do Cliente SSH:
ip addr add 10.10.10.2/32 10.10.10.10 dev tun0
ip tun0 up
Lado do servidor SSH:
ip addr add 10.10.10.10/32 ponto 10.10.10.2 dev tun0
ip tun0 up
Agora devemos ter uma rota direta para o outro host (route -ne ping 10.10.10.10). Agora é possível rotear qualquer sub-rede através do host do outro lado.
route add -net 10.10.10.0 máscara de rede 255.255.255.0 dev tun0
No lado remoto, precisamos ativar ip_forwarde iptables.
echo 1> /proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -s 10.10.10.2 -o enp7s0 -j MASQUERADE
Qualquer problema, tente dump tcp e ping, então veja onde está bloqueando. Como estamos utilizando na camada 3, nossos pacotes icmp devem estar através desse túnel.
7. Copie sua chave SSH (ssh-copy-id)
Existem várias maneiras de conseguir isso, no entanto, este comando é um atalho que economiza tempo. O que isso realmente faz? Este comando replica o que você também pode fazer manualmente. Copiar a chave ~/.ssh/id_rsa.pub(ou a padrão) do seu sistema e adicioná-la a um ~/.ssh/authorized_keysarquivo no servidor remoto.
ssh-copy-id usuario@servidorremoto
8. Execute o comando remotamente (não interativo)
O comando SSH pode ser anexado a outros comandos para uso comum. Adicione o comando que você deseja executar no host remoto como um parâmetro final entre aspas.
ssh servidorremoto "cat /var/log/nginx/access.log" | grep badstuff.php
Neste exemplo, o comando grep está sendo executado no sistema local após o envio do arquivo de log pela sessão ssh. Se o arquivo for grande, seria mais eficiente executar o comando grep no lado remoto, colocando o caminho entre aspas duplas. Outro exemplo executa a mesma função que o ssh-copy-id.
cat ~/.ssh /id_rsa.pub | ssh remoteserver 'cat >> .ssh/allowed_keys'
9. Captura remota de pacotes e exibição no Wireshark
Peguei este em nossos exemplos de dump tcp. Use-o para uma captura remota de pacotes, com os resultados diretamente na GUI local do Wireshark.
ssh root @ remoteserver 'tcpdump -c 1000 -nn -w - não porta 22' | wireshark -k -i -
10. Copiar pasta local para o servidor remoto
Um truque interessante que comprime uma pasta usando bzip2 (que é o -j no comando tar) e extrai o bzip2fluxo, criando uma duplicata da pasta no servidor remoto.
tar -cvj /pasta de dados | ssh remoteserver "tar -xj -C /pasta de dados"
Copia pasta remota para o arquivo tar local. Para se for o inverso que você deseja, copie uma pasta remota para um arquivo local. Útil para backups rápidos de recursos remotos.
ssh user @ remoteserver "tar -jcf - /caminho/para/backup"> dir.tar.bz2
11. Aplicativos GUI remotos com encaminhamento SSH x11
Se o cliente e o servidor remoto tiverem o X instalado. É possível executar um comando da GUI remotamente, com a janela aparecendo na área de trabalho local. Esse recurso existe desde o início dos tempos, mas ainda pode ser muito útil. Execute um navegador da Web remoto ou até o console do VMWawre Workstation, como eu faço neste exemplo.
ssh -X remoteserver vmware
Requer: X11Forwarding yesno sshd_config.
12. Copie arquivos remotamente com rsync e SSH
O uso do programa rsync possui muitas vantagens scp: se periodicamente for necessário fazer backup de um diretório, inúmeros arquivos ou arquivos muito grandes deverá ser usado. Ele tem a capacidade de se recuperar de transferências com falha e apenas copiar diferenças entre dois locais, economizando largura de banda e tempo. O exemplo aqui usa o modo de compactação gzip (-z) e archive (-a) que inclui cópia recursiva.
rsync -az /home/usuario/data servidorremoto: backup/
13. Acesso à rede Tor
A Tor pode encapsular o tráfego SSH usando o comando torsocks. O comando a seguir fará proxy da conexão ssh através da rede Tor.
torsocks ssh usuario@servidorremoto
O Torsocks usará a porta 9050 do host local para o tráfego proxy. Como sempre é preciso ter em mente que o tráfego está sendo tunelizado.
14. Instância SSH para EC2
Ao usar o SSH para conectar-se à sua instância do EC2 na Amazon, você precisará usar uma chave privada. Faça o download da chave (extensão .pem) no painel de controle do Amazon EC2 e altere as permissões (chmod 400 my-ec2-ssh-key.pem. Mantenha essa chave em algum lugar seguro ou coloque-a na sua ~/.ssh/pasta.
ssh -i ~/.ssh/EC2-key.pem ubuntu@my-ec2-public
O parâmetro -i diz ao cliente ssh para usar esta chave. Este seria um exemplo ideal de como usar o ~/.ssh/configpara configurar o uso da chave automaticamente ao conectar-se ao host ec2.
15. Edite arquivos de texto com o VIM sobre ssh / scp
Para todos os usuário do vim, você pode economizar algum tempo. Usando vim, podemos editar arquivos scp com um único comando. O uso desse método cria um arquivo no /tmp no sistema local e o copia novamente assim que escrevermos o arquivo vim.
vim scp: //usuário@servidorremoto//etc/hosts
Observe que o formato é um pouco diferente do normal scp. Após o anfitrião, temos um duplo //. Isso faz referência ao caminho absoluto. Uma única barra terá um caminho que é relativo ao diretório inicial dos usuários.
(netrw) não pode determinar o método (formato: protocolo: // [usuário@]nome do host [:porta]/[caminho]). Se você ver esse erro, verifique o formato do seu comando. Isso geralmente significa que há um erro de sintaxe.
16. Monte o local SSH remoto como pasta local com o SSHFS
Usando sshfs- um cliente ssh do sistema de arquivos, podemos montar um diretório local em um local remoto, com toda a interação do arquivo ocorrendo durante a sessão ssh criptografada.
apt install sshfs
No sistema baseado no Ubuntu e Debian, instalamos o pacote sshfse montamos o local remoto.
sshfs usuario@servidorremoto:/media/data ~/data /
17. SSH Multiplex usando ControlPath
Por padrão, quando você possui uma conexão existente com um servidor remoto ssh, uma segunda conexão usa ssh ou estabelece scp uma nova sessão com a sobrecarga de autenticação. Usando as opções ControlPath, podemos usar a sessão existente para todas as conexões subsequentes. Isso irá acelerar tudo. Porém, é mais perceptível em uma rede local, e bem mais quando se conecta a recursos remotos.
Servidor remoto do host
HostName remoteserver.example.org
ControlMaster auto
ControlPath ~/.ssh/control/%r@%h:% p
ControlPersist 10m
ControlPath indica um socket verificado por novas conexões para verificar se existe uma sessão ssh existente que possa ser usada. A opção ControlPersist acima significa que, mesmo após a saída do terminal, a sessão existente permanecerá aberta por 10 minutos; portanto, se você se reconectar dentro desse período, usaria o socket existente. Veja a página man ssh_config para mais informações.
18. Stream de vídeo sobre SSH usando VLC + SFTP
Os usuários de longa data sshe vlc(Video Lan Client) talvez nem saibam dessa opção útil para quando você precisa assistir a vídeos pela rede. Usando a opção vlc para Arquivo, um fluxo de rede aberto pode ser inserido como um sftp://local. Um prompt será exibido para detalhes da autenticação, se a senha for necessária.
sftp://remoteserver//media/uploads/myvideo.mkv
19. Autenticação de dois fatores
A maioria dos leitores entenderá o valor do uso da autenticação de dois fatores; os mesmos benefícios que se aplicam à sua conta bancária ou à Conta do Google podem ser aplicados ao seu serviço SSH. É claro que o SecureShell vem com uma forma de capacidade de dois fatores incluída, sendo uma senha e uma chave SSH. Uma vantagem de usar um token baseado em hardware ou o Google Authenticator App é o fato de geralmente serem provenientes de um segundo dispositivo físico.
20. Alternando através de hosts com -J
Quando a segmentação de rede significa que você está alternando entre vários hosts ssh para chegar a uma rede ou host de destino final, esse atalho de host para alternar pode ser o que você precisa.
Requer o OpenSSH versão 7.3 ou superior.
ssh -J host1, host2, host3 usuá[email protected]
Uma coisa importante a entender aqui é que isso não é o mesmo de ssh host1 então user@host1:~$ ssh host2, o parâmetro jump -J usa truques de encaminhamento para que o host local esteja estabelecendo a sessão com o próximo host da cadeia. Portanto, nosso host local está se autenticando com o host4 no exemplo acima; ou seja, nossas chaves de host local são usadas e a sessão de host local para host4 é criptografada de ponta a ponta.
Para usar essa capacidade, use no ssh_config a opção de configuração ProxyJump. Se você precisar alternar regularmente vários hosts; use o arquivo de configuração e seu alias para host4 e economizará muito tempo.
21. Bloquear tentativas de força bruta com iptables
Qualquer pessoa que tenha gerenciado um serviço SSH na Internet e visualizado os logs estará ciente da quantidade de tentativas de força bruta caso ocorrem a cada hora de cada dia. Uma maneira imediata de reduzir o ruído em seus logs é mover o SSH para uma porta diferente da tradicional 22. Faça a alteração no arquivo sshd_config usando a opção de configuração da porta ##.
O uso iptables também pode bloquear tentativas de conexão à porta a partir de fontes que atingem um determinado limite. Uma maneira de fazer isso é usar o OSSEC, pois isso não apenas bloqueia a porta 22, mas também executa várias outras funções de detecção de intrusão (HIDS) baseadas em host.
22. Modifique o encaminhamento de porta em uma sessão com ~ C
Em nosso exemplo final, é para modificar o encaminhamento de porta em tempo real em uma sessão ssh existente. Imagine este cenário de exemplo. Você conhece profundamente uma rede, talvez você tenha alternado meia dúzia de hosts e precise de uma porta local em sua estação de trabalho encaminhada para o Microsoft SMB no antigo sistema Windows 2003.
Depois de fazer as alternâncias, pressione enter e digite ~C no seu terminal. Essa é uma sequência de controle dentro da sessão que permite fazer alterações na conexão existente.
~C
ssh> -h
Comandos:
- -L [bind_address:] port: host: hostport Solicita o encaminhamento local
- -R [bind_address:] port: host: hostport Solicita o encaminhamento remoto
- -D [bind_address:] port Solicita encaminhamento dinâmico
- -KL [bind_address:] port Cancela o encaminhamento local
- -KR [bind_address:] port Cancelar encaminhamento remoto
- -KD [bind_address:] port Cancela o encaminhamento dinâmico
- ssh> -L 1445: remote-win2k3: 445
Porta de encaminhamento.
Você pode ver aqui que encaminhamos nossa porta local 1445 para o host do Windows 2003 que encontramos na rede interna. Agora inicie console msf e estamos prontos (assumindo que você planejava explorar esse host).