Dicas práticas, exemplos e túneis SSH


Exemplos práticos de SSH que levarão suas habilidades de administrador de sistema remoto para o próximo nível. Comandos e dicas ajudarão não apenas a usar o SSH , mas também a navegar com mais competência na rede.

Conhecer alguns truques ssh é útil para qualquer administrador de sistemas, engenheiro de rede ou especialista em segurança.

Exemplos práticos de SSH


  1. Proxy de meias SSH
  2. Túnel SSH (encaminhamento de porta)
  3. Túnel SSH para o terceiro host
  4. Túnel reverso SSH
  5. Proxy reverso SSH
  6. Instalando VPN sobre SSH
  7. Copiar chave SSH (ssh-copy-id)
  8. Execução de comando remoto (não interativo)
  9. Captura e visualização remotas de pacotes no Wireshark
  10. Copiando uma pasta local para um servidor remoto via SSH
  11. Aplicativos GUI de encaminhamento SSH X11 remoto
  12. Cópia remota de arquivos usando rsync e SSH
  13. SSH na rede Tor
  14. Instância SSH para EC2
  15. Editando arquivos de texto usando o VIM via ssh / scp
  16. Montando SSH remoto como uma pasta local com SSHFS
  17. Multiplexação SSH com ControlPath
  18. Streaming de vídeo SSH usando VLC e SFTP
  19. Autenticação de dois fatores
  20. Salto de host com SSH e -J
  21. Bloqueando tentativas de força bruta SSH com iptables
  22. Escape SSH para alterar o encaminhamento de porta

Noções básicas primeiro


Análise de linha de comando SSH


O exemplo a seguir usa os parâmetros usuais frequentemente encontrados ao conectar-se a um servidor SSH remoto.

 localhost:~$ ssh -v -p 22 -C neo@remoteserver 

  • -v : a saída de depuração é especialmente útil ao analisar problemas de autenticação. Você pode usá-lo várias vezes para exibir informações adicionais.
  • - p 22 : porta para conectar-se a um servidor SSH remoto. 22 não é necessário especificar, porque esse é o valor padrão, mas se o protocolo estiver em outra porta, nós o especificaremos usando o parâmetro -p . A porta de sshd_config é especificada no arquivo sshd_config no formato Port 2222 .
  • -C : compactação para a conexão. Se você tem um feed lento ou visualiza muito texto, isso pode acelerar a conexão.
  • neo@ : a linha antes do símbolo @ indica o nome de usuário para autenticação no servidor remoto. Se você não especificar, por padrão, o nome de usuário da conta em que você está conectado no momento será usado (~ $ whoami). O usuário também pode ser especificado com a opção -l .
  • remoteserver : o nome do host ao qual o ssh conecta, pode ser um nome de domínio totalmente qualificado, endereço IP ou qualquer host no arquivo de hosts locais. Para conectar-se a um host compatível com IPv4 e IPv6, você pode adicionar a opção -4 ou -6 à linha de comando para obter uma resolução adequada.

Todas as opções acima são opcionais, exceto remoteserver .

Usando arquivo de configuração


Embora muitos estejam familiarizados com o arquivo sshd_config , também há um arquivo de configuração do cliente para o comando ssh . O valor padrão é ~/.ssh/config , mas pode ser definido como um parâmetro para a opção -F .

 Host * Port 2222 Host remoteserver HostName remoteserver.thematrix.io User neo Port 2112 IdentityFile /home/test/.ssh/remoteserver.private_key 

O arquivo de configuração ssh de exemplo acima possui duas entradas de host. O primeiro indica todos os hosts, o parâmetro de configuração da Porta 2222 é usado para todos.O segundo diz que, para o host do servidor de controle remoto , use um nome de usuário, porta, FQDN e IdentityFile diferentes.

Um arquivo de configuração pode economizar muito tempo digitando caracteres, permitindo aplicar automaticamente a configuração avançada ao conectar-se a hosts específicos.

Copiar arquivos por SSH usando o SCP


O cliente SSH vem com duas outras ferramentas muito convenientes para copiar arquivos em uma conexão ssh criptografada . Veja abaixo um exemplo de uso padrão dos comandos scp e sftp. Observe que muitas das opções do ssh também se aplicam a esses comandos.

 localhost:~$ scp mypic.png neo@remoteserver:/media/data/mypic_2.png 

Neste exemplo, o arquivo mypic.png é copiado para o servidor de controle remoto na pasta / media / data e renomeado para mypic_2.png .

Não se esqueça da diferença no parâmetro port. Isso ocorre com muitos que executam o scp na linha de comando. Aqui o parâmetro da porta é -P , não -p , como no cliente ssh! Você esquecerá, mas não se preocupe, todos esquecerão.

Para aqueles familiarizados com o ftp console, muitos dos comandos são semelhantes no sftp . Você pode empurrar , colocar e sl como seu coração deseja.

 sftp neo@remoteserver 

Exemplos práticos


Em muitos desses exemplos, o resultado pode ser alcançado por vários métodos. Como em todos os nossos livros e exemplos, é dada preferência a exemplos práticos que simplesmente fazem seu trabalho.

1. proxy meias SSH


Proxy SSH no número 1 por um bom motivo. É mais poderoso do que muitos pensam e fornece acesso a qualquer sistema ao qual um servidor remoto tenha acesso, usando quase qualquer aplicativo. O cliente ssh pode encapsular o tráfego através do proxy SOCKS com um comando simples. É importante entender que o tráfego para sistemas remotos virá de um servidor remoto, conforme será indicado nos logs do servidor da web.

 localhost:~$ ssh -D 8888 user@remoteserver localhost:~$ netstat -pan | grep 8888 tcp 0 0 127.0.0.1:8888 0.0.0.0:* LISTEN 23880/ssh 

Aqui, executamos o proxy socks na porta TCP 8888, o segundo comando verifica se a porta está ativa no modo de escuta. 127.0.0.1 indica que o serviço é executado apenas no host local. Podemos usar um comando ligeiramente diferente para ouvir todas as interfaces, incluindo ethernet ou wifi, isso permitirá que outros aplicativos (navegadores, etc.) em nossa rede se conectem ao serviço de proxy via ssh socks proxy.

 localhost:~$ ssh -D 0.0.0.0:8888 user@remoteserver 

Agora podemos configurar o navegador para conectar-se ao proxy de meias. No Firefox, selecione Configurações | Destaques | Configurações de rede Especifique o endereço IP e a porta para conectar.



Preste atenção na opção na parte inferior do formulário para que as consultas DNS do navegador também passem pelos proxies do SOCKS. Se você usa um servidor proxy para criptografar o tráfego da web na rede local, provavelmente deseja selecionar esta opção para que as consultas DNS sejam encapsuladas por meio de uma conexão SSH.

Ativação de proxy de meias no Chrome


A execução do Chrome com certas opções de linha de comando ativa os proxies de meias, bem como encapsula as consultas DNS do navegador. Confie, mas verifique. Use tcpdump para verificar se as consultas DNS não estão mais visíveis.

 localhost:~$ google-chrome --proxy-server="socks5://192.168.1.10:8888" 

Usando outros aplicativos proxy


Lembre-se de que muitos outros aplicativos também podem usar proxies de meias. Um navegador da web é simplesmente o mais popular deles. Alguns aplicativos têm opções de configuração para ativar um servidor proxy. Outros precisam de uma pequena ajuda com o programa auxiliar. Por exemplo, proxychains permite executar o Microsoft RDP, etc. por meio de socks-proxies.

 localhost:~$ proxychains rdesktop $RemoteWindowsServer 

Os parâmetros de configuração do proxy socks são definidos no arquivo de configuração proxychains.

Dica: se você usa a área de trabalho remota do Linux no Windows? Experimente o cliente FreeRDP . Essa é uma implementação mais moderna que o rdesktop , com uma interação muito mais suave.

Opção SSH através do proxy de meias


Você está sentado em um café ou hotel - e é forçado a usar Wi-Fi não confiável. No laptop, inicie localmente o proxy ssh e instale o túnel ssh na rede doméstica no Rasberry Pi local. Usando um navegador ou outros aplicativos configurados para proxies de meias, podemos acessar quaisquer serviços de rede em nossa rede doméstica ou acessar a Internet através de uma conexão doméstica. Tudo entre o seu laptop e o servidor doméstico (via Wi-Fi e Internet na sua casa) é criptografado no túnel SSH.

2. Túnel SSH (encaminhamento de porta)


Na sua forma mais simples, um túnel SSH simplesmente abre uma porta no sistema local que se conecta a outra porta na outra extremidade do túnel.

 localhost:~$ ssh -L 9999:127.0.0.1:80 user@remoteserver 

Vamos examinar a opção -L . Pode ser representado como o lado local da escuta. Assim, no exemplo acima, a porta 9999 é escutada no lado do host local e é encaminhada pela porta 80 para o servidor de controle remoto. Por favor note que 127.0.0.1 refere-se ao host local no servidor remoto!

Vamos subir um passo. No exemplo a seguir, as portas de atendimento se comunicam com outros nós na rede local.

 localhost:~$ ssh -L 0.0.0.0:9999:127.0.0.1:80 user@remoteserver 

Nestes exemplos, nos conectamos à porta no servidor web, mas pode ser um servidor proxy ou qualquer outro serviço TCP.

3. Túnel SSH para um host de terceiros


Podemos usar os mesmos parâmetros para conectar um túnel de um servidor remoto a outro serviço em execução em um terceiro sistema.

 localhost:~$ ssh -L 0.0.0.0:9999:10.10.10.10:80 user@remoteserver 

Neste exemplo, estamos redirecionando o túnel do remoteserver para um servidor Web em execução em 10.10.10.10. O tráfego com servidor de controle remoto até 10.10.10.10 não está mais no túnel SSH . Em 10.10.10.10, o servidor da web considerará o remoteserver como a fonte de solicitações da web.

4. Túnel SSH reverso


Aqui, configuramos a porta de atendimento no servidor remoto, que será conectada novamente à porta local em nosso host local (ou outro sistema).

 localhost:~$ ssh -v -R 0.0.0.0:1999:127.0.0.1:902 192.168.1.100 user@remoteserver 

Nesta sessão SSH, é estabelecida uma conexão da porta 1999 no servidor de controle remoto para a porta 902 em nosso cliente local.

5. Proxy SSH Reverso


Nesse caso, instalamos o proxy socks em nossa conexão ssh, no entanto, o proxy escuta na extremidade remota do servidor. As conexões com esse proxy remoto agora aparecem no túnel como tráfego de nosso host local.

 localhost:~$ ssh -v -R 0.0.0.0:1999 192.168.1.100 user@remoteserver 

Solução de problemas de túneis SSH remotos


Se você tiver problemas com as opções SSH remotas, verifique com o netstat quais outras interfaces a porta de atendimento está conectada. Embora tenhamos especificado 0.0.0.0 nos exemplos, mas se o valor GatewayPorts em sshd_config estiver definido como no , o ouvinte será vinculado apenas ao localhost (127.0.0.1).

Aviso de segurança


Observe que, ao abrir túneis e proxies de meias, os recursos internos da rede podem estar disponíveis para redes não confiáveis ​​(por exemplo, a Internet!). Isso pode ser um sério risco à segurança, portanto, entenda o que é o ouvinte e o que ele tem acesso.

6. Instalando VPN sobre SSH


O termo geral entre especialistas em métodos de ataque (pentesters etc.) é "o ponto de apoio da rede". Após estabelecer uma conexão em um sistema, esse sistema se torna um gateway para acesso adicional à rede. O ponto de apoio que permite mover em largura.

Para esse ponto de apoio, podemos usar proxies e proxychains SSH, no entanto, existem algumas limitações. Por exemplo, você não poderá trabalhar diretamente com soquetes; portanto, não será possível verificar portas dentro da rede via Nmap SYN .

Usando esta opção de VPN mais avançada, a conexão cai para o nível 3 . Em seguida, podemos simplesmente rotear o tráfego pelo túnel usando o roteamento de rede padrão.

O método usa ssh , iptables , tun interfaces e roteamento.

Primeiro, você precisa definir esses parâmetros em sshd_config . Como estamos fazendo alterações nas interfaces dos sistemas remoto e cliente, precisamos de privilégios de root nos dois lados .

 PermitRootLogin yes PermitTunnel yes 

Em seguida, estabeleça uma conexão ssh usando um parâmetro que solicite a inicialização dos dispositivos tun.

 localhost:~# ssh -v -w any root@remoteserver 

Agora devemos ter um dispositivo tun ao mostrar interfaces ( # ip a ). A próxima etapa adicionará endereços IP às interfaces do túnel.

Lado do Cliente SSH:

 localhost:~# ip addr add 10.10.10.2/32 peer 10.10.10.10 dev tun0 localhost:~# ip tun0 up 

Lado do servidor SSH:

 remoteserver:~# ip addr add 10.10.10.10/32 peer 10.10.10.2 dev tun0 remoteserver:~# ip tun0 up 

Agora temos uma rota direta para outro host ( route -n e ping 10.10.10.10 ).

Você pode rotear qualquer sub-rede pelo host do outro lado.

 localhost:~# route add -net 10.10.10.0 netmask 255.255.255.0 dev tun0 

No lado remoto, você deve ativar o ip_forward e o iptables .

 remoteserver:~# echo 1 > /proc/sys/net/ipv4/ip_forward remoteserver:~# iptables -t nat -A POSTROUTING -s 10.10.10.2 -o enp7s0 -j MASQUERADE 

Boom! Túnel VPN sobre SSH na camada de rede 3 . Isso já é uma vitória.

Se você encontrar algum problema, use tcpdump e ping para determinar a causa. Como jogamos no nível 3, nossos pacotes icmp passarão por esse túnel.

7. Copiando a chave SSH (ssh-copy-id)


Existem várias maneiras, mas esse comando economiza tempo para não copiar arquivos manualmente. Ele simplesmente copia ~ / .ssh / id_rsa.pub (ou a chave padrão) do seu sistema para ~/.ssh/authorized_keys no servidor remoto.

 localhost:~$ ssh-copy-id user@remoteserver 

8. Execução de comando remoto (não interativo)


O comando ssh pode ser associado a outros comandos da interface amigável ao usuário. Basta adicionar o comando que você deseja executar no host remoto como o último parâmetro entre aspas.

 localhost:~$ ssh remoteserver "cat /var/log/nginx/access.log" | grep badstuff.php 

Neste exemplo, o grep é executado no sistema local após o download do log pelo canal ssh. Se o arquivo for grande, é mais conveniente executar o grep no lado remoto, simplesmente colocando os dois comandos entre aspas duplas.

Outro exemplo executa a mesma função que ssh-copy-id do exemplo 7.

 localhost:~$ cat ~/.ssh/id_rsa.pub | ssh remoteserver 'cat >> .ssh/authorized_keys' 

9. Captura remota de pacotes e visualização no Wireshark


Eu peguei um dos nossos exemplos de tcpdump . Use-o para interceptar remotamente pacotes com o resultado diretamente na GUI do Wireshark local.

 :~$ ssh root@remoteserver 'tcpdump -c 1000 -nn -w - not port 22' | wireshark -k -i - 

10. Copiando uma pasta local para um servidor remoto via SSH


Um belo truque que comprime uma pasta usando bzip2 (esta é a opção -j no comando tar ) e extrai o fluxo bzip2 do outro lado, criando uma duplicata da pasta no servidor remoto.

 localhost:~$ tar -cvj /datafolder | ssh remoteserver "tar -xj -C /datafolder" 

11. Aplicativos da GUI de encaminhamento SSH X11 remoto


Se o cliente e o servidor remoto tiverem o X instalado, você poderá executar remotamente o comando da GUI, com uma janela na área de trabalho local. Esse recurso existe há muito tempo, mas ainda é muito útil. Inicie um navegador da Web remoto ou até o console da Estação de Trabalho VMWawre, como eu faço neste exemplo.

 localhost:~$ ssh -X remoteserver vmware 

Requer a linha X11Forwarding yes no arquivo sshd_config .

12. Cópia remota de arquivos usando rsync e SSH


rsync é muito mais conveniente que o scp se você precisar fazer backup periódico de um diretório, um grande número de arquivos ou arquivos muito grandes. Há uma função para se recuperar de uma falha de transmissão e copiar apenas arquivos modificados, o que economiza tráfego e tempo.

Este exemplo usa a compressão gzip (-z) e o modo de arquivamento (-a), que permite a cópia recursiva.

 :~$ rsync -az /home/testuser/data remoteserver:backup/ 

13. SSH na rede Tor


Uma rede Tor anônima pode encapsular o tráfego SSH usando o torsocks . O comando a seguir lançará um proxy ssh através do Tor.

 localhost:~$ torsocks ssh myuntracableuser@remoteserver 

O Torsocks usará a porta 9050 para proxy no host local. Como sempre, ao usar o Tor, você precisa verificar seriamente qual tráfego está sendo encapsulado e outros problemas de segurança operacional (opsec). Para onde estão indo suas consultas DNS?

14. Instância SSH para EC2


É necessária uma chave privada para conectar-se a uma instância do EC2. Faça o download (extensão .pem) no painel de controle do Amazon EC2 e altere as permissões ( chmod 400 my-ec2-ssh-key.pem ). Mantenha a chave em um local seguro ou coloque-a na sua pasta ~/.ssh/ .

 localhost:~$ ssh -i ~/.ssh/my-ec2-key.pem ubuntu@my-ec2-public 

A opção -i simplesmente diz ao cliente ssh para usar essa opção. O ~/.ssh/config é ideal para configurar automaticamente o uso de chaves ao conectar-se ao host ec2.

 Host my-ec2-public Hostname ec2???.compute-1.amazonaws.com User ubuntu IdentityFile ~/.ssh/my-ec2-key.pem 

15. Editando arquivos de texto usando o VIM via ssh / scp


Para todos os amantes do vim , essa dica economizará um pouco de tempo. Usando o vim arquivos são editados usando o scp com um único comando. Este método simplesmente cria o arquivo localmente em /tmp e o copia novamente assim que o salvamos do vim .

 localhost:~$ vim scp://user@remoteserver//etc/hosts 

Nota: o formato é um pouco diferente do scp normal. Após o host, temos double // . Este é um link para o caminho absoluto. Uma barra significa o caminho relativo à pasta pessoal dos users .

 **warning** (netrw) cannot determine method (format: protocol://[user@]hostname[:port]/[path]) 

Se você vir esse erro, verifique duas vezes o formato do comando. Isso geralmente significa um erro de sintaxe.

16. Montando o SSH remoto como uma pasta local com o SSHFS


Usando o sshfs , o cliente do sistema de arquivos ssh , podemos conectar o diretório local a um local remoto com todas as interações de arquivos em uma sessão ssh criptografada.

 localhost:~$ apt install sshfs 

Instalamos o pacote sshfs no Ubuntu e Debian e montamos o local remoto em nosso sistema.

 localhost:~$ sshfs user@remoteserver:/media/data ~/data/ 

17. Multiplexação SSH com ControlPath


Por padrão, se você possui uma conexão existente com o servidor remoto usando ssh segunda conexão usando ssh ou scp estabelece uma nova sessão com autenticação adicional. A opção ControlPath permite usar uma sessão existente para todas as conexões subseqüentes. Isso acelerará significativamente o processo: o efeito é perceptível até na rede local e, mais ainda, quando conectado a recursos remotos.

 Host remoteserver HostName remoteserver.example.org ControlMaster auto ControlPath ~/.ssh/control/%r@%h:%p ControlPersist 10m 

O ControlPath diz ao soquete para verificar novas conexões para uma sessão ssh ativa. A última opção significa que, mesmo após sair do console, a sessão existente permanecerá aberta por 10 minutos; portanto, durante esse período, você poderá reconectar-se ao soquete existente. Veja a ajuda do ssh_config man para mais informações.

18. Streaming de vídeo sobre SSH usando VLC e SFTP


Mesmo usuários antigos de ssh e vlc (Video Lan Client) nem sempre conhecem essa opção conveniente quando você realmente precisa assistir a vídeos na rede. Nas configurações Arquivo | O programa Open Network Stream vlc pode inserir o local como sftp:// . Se uma senha for necessária, um prompt será exibido.

 sftp://remoteserver//media/uploads/myvideo.mkv 

19. Autenticação de dois fatores


A mesma autenticação de dois fatores que sua conta bancária ou conta do Google se aplica ao serviço SSH.

Obviamente, o ssh inicialmente possui uma função de autenticação de dois fatores, o que significa a senha e a chave SSH. A vantagem de um token de hardware ou aplicativo do Google Authenticator é que ele geralmente é um dispositivo físico diferente.

Consulte o nosso guia de 8 minutos sobre o uso do Google Authenticator e SSH .

20. Host pulando com ssh e -J


Se, devido à segmentação da rede, você precisar atravessar vários hosts ssh para alcançar a rede de destino final, o atalho -J economizará tempo.

 localhost:~$ ssh -J host1,host2,host3 user@host4.internal 

O principal a entender aqui é que isso não é análogo ao ssh host1 , então user@host1:~$ ssh host2 , etc. O parâmetro -J usa astuciosamente o encaminhamento para que o host local estabeleça uma sessão com o próximo host da cadeia. Assim, no exemplo acima, nosso host local se autentica no host4. Ou seja, nossas chaves do host local são usadas e a sessão do host local ao host4 é totalmente criptografada.

Para fazer isso, especifique a opção de configuração proxyJump em ssh_config . Se você precisar passar por vários hosts regularmente, a automação através da configuração economizará muito tempo.

21. Bloqueando tentativas de força bruta SSH usando iptables


Qualquer pessoa que executou o serviço SSH e examinou os logs sabe do número de tentativas de força bruta que ocorrem a cada hora todos os dias. Uma maneira rápida de reduzir o ruído nos logs é migrar o SSH para uma porta não padrão. Faça alterações no arquivo sshd_config usando o parâmetro de configuração da porta ## .

Usando o iptables , você também pode bloquear facilmente as tentativas de conexão com uma porta após atingir um determinado limite.Uma maneira fácil de fazer isso é usar o OSSEC , pois ele não apenas bloqueia o SSH, mas executa várias outras medidas de detecção de intrusão (HIDS) baseadas em host.

22. SSH Escape para alterar o encaminhamento de porta


E nosso último exemplo sshé para alterar o encaminhamento de porta em tempo real em uma sessão existente ssh. Imagine esse cenário. Você está profundamente online; você pode ter pulado mais de meia dúzia de hosts e precisa de uma porta local na estação de trabalho que seja redirecionada para o Microsoft SMB do antigo sistema Windows 2003 (alguém se lembra do ms08-67?).

Ao clicar enter, tente digitar no console ~C. Esta é uma sequência de controle em uma sessão que permite fazer alterações em uma conexão existente.

 localhost:~$ ~C ssh> -h Commands: -L[bind_address:]port:host:hostport Request local forward -R[bind_address:]port:host:hostport Request remote forward -D[bind_address:]port Request dynamic forward -KL[bind_address:]port Cancel local forward -KR[bind_address:]port Cancel remote forward -KD[bind_address:]port Cancel dynamic forward ssh> -L 1445:remote-win2k3:445 Forwarding port. 

Aqui você pode ver que redirecionamos nossa porta local 1445 para o host do Windows 2003 que encontramos na rede interna. Agora basta executá- msfconsolelo e você pode seguir em frente (supondo que planeja usar este host).

Conclusão


Esses exemplos, dicas e comandos sshdevem fornecer um ponto de partida; Mais informações sobre cada um dos comandos e recursos disponíveis nas páginas de ajuda ( man ssh, man ssh_config, man sshd_config).

Sempre fui fascinado pela capacidade de acessar sistemas e executar comandos em qualquer lugar do mundo. O desenvolvimento de suas habilidades no trabalho com ferramentas como sshvocê se tornará mais eficaz em qualquer jogo que você jogar.

Source: https://habr.com/ru/post/pt435546/


All Articles