Dicas práticas, exemplos e túneis SSH

Dicas práticas, exemplos e túneis SSH
Exemplos práticos SSH, o que levará suas habilidades como administrador de sistema remoto a um novo nível. Comandos e dicas vão ajudar não só a usar SSH, mas também navegar na rede com mais competência.

Conhecendo alguns truques ssh útil para qualquer administrador de sistema, 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 terceiro host
  4. Túnel SSH reverso
  5. Proxy reverso SSH
  6. Instalando VPN sobre SSH
  7. Copiando uma chave SSH (ssh-copy-id)
  8. Execução remota de comandos (não interativo)
  9. Captura e visualização remota de pacotes no Wireshark
  10. Copiando uma pasta local para um servidor remoto via SSH
  11. Aplicativos GUI remotos com encaminhamento SSH X11
  12. Cópia remota de arquivos usando rsync e SSH
  13. SSH sobre rede Tor
  14. SSH para instância EC2
  15. Editando arquivos de texto usando VIM via ssh/scp
  16. Monte SSH remoto como pasta local com SSHFS
  17. Multiplexando SSH com ControlPath
  18. Transmita vídeo por SSH usando VLC e SFTP
  19. Autenticação de dois fatores
  20. Saltando hosts com SSH e -J
  21. Bloqueando tentativas de força bruta SSH usando iptables
  22. SSH Escape para alterar o encaminhamento de porta

Primeiro o básico

Analisando a linha de comando SSH

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

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

  • -v: a saída de depuração é especialmente útil ao analisar problemas de autenticação. Pode ser usado várias vezes para exibir informações adicionais.
  • - p 22: porta de conexão para um servidor SSH remoto. 22 não precisa ser especificado, pois este é o valor padrão, mas se o protocolo estiver em alguma outra porta, então o especificamos usando o parâmetro -p. A porta de escuta é especificada no arquivo sshd_config em formato Port 2222.
  • -C: Compressão para conexão. Se você tiver uma conexão lenta ou visualizar muito texto, isso poderá 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 especificá-lo, o padrão será o nome de usuário da conta na qual você está conectado no momento (~$whoami). O usuário também pode ser especificado usando o parâmetro -l.
  • remoteserver: nome do host ao qual se conectar ssh, pode ser um nome de domínio totalmente qualificado, um endereço IP ou qualquer host no arquivo de hosts locais. Para se conectar a um host que suporte IPv4 e IPv6, você pode adicionar o parâmetro à linha de comando -4 ou -6 para resolução adequada.

Todos os parâmetros acima são opcionais, exceto remoteserver.

Usando o arquivo de configuração

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

Host *
     Port 2222

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

Existem duas entradas de host no arquivo de configuração ssh de exemplo acima. O primeiro significa todos os hosts, todos usando o parâmetro de configuração Porta 2222. O segundo diz que para o host servidor remoto um nome de usuário, porta, FQDN e IdentityFile diferentes devem ser usados.

Um arquivo de configuração pode economizar muito tempo de digitação, permitindo que configurações avançadas sejam aplicadas automaticamente ao conectar-se a hosts específicos.

Copiando arquivos via SSH usando SCP

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

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

Neste exemplo o arquivo minhaimagem.png copiado para servidor remoto para a pasta /mídia/dados e renomeado para minhapic_2.png.

Não se esqueça da diferença no parâmetro port. É aqui que muitas pessoas são pegas quando lançam scp na linha de comando. Aqui está o parâmetro da porta -PE não -p, assim como em um cliente ssh! Você vai esquecer, mas não se preocupe, todo mundo esquece.

Para quem está familiarizado com console ftp, muitos dos comandos são semelhantes em sftp... Você pode fazer empurrar, colocar и lscomo o coração deseja.

sftp neo@remoteserver

Exemplos práticos

Em muitos destes exemplos, os resultados podem ser alcançados utilizando diferentes métodos. Como em todos os nossos livros didáticos e exemplos, é dada preferência a exemplos práticos que simplesmente fazem o seu trabalho.

1. Proxy de meias SSH

O recurso SSH Proxy é o número 1 por um bom motivo. É mais poderoso do que muitos imaginam e dá acesso a qualquer sistema ao qual o servidor remoto tenha acesso, usando praticamente qualquer aplicativo. Um cliente ssh pode encapsular o tráfego através de um proxy SOCKS com um comando simples. É importante entender que o tráfego para sistemas remotos virá de um servidor remoto, isso será indicado nos logs do servidor 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 um proxy meias 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 em localhost. Podemos usar um comando ligeiramente diferente para escutar em todas as interfaces, incluindo ethernet ou wifi, isso permitirá que outros aplicativos (navegadores, etc.) em nossa rede se conectem ao serviço de proxy através do proxy ssh Socks.

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

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

Dicas práticas, exemplos e túneis SSH

Observe a opção na parte inferior do formulário para que as solicitações de DNS do seu navegador também passem por um proxy SOCKS. Se você estiver usando um servidor proxy para criptografar o tráfego da web em sua rede local, provavelmente desejará selecionar esta opção para que as solicitações DNS sejam encapsuladas por meio da conexão SSH.

Ativando proxy de meias no Chrome

Iniciar o Chrome com determinados parâmetros de linha de comando ativará o proxy meias, bem como encapsulará solicitações de DNS do navegador. Confie, mas verifique. Usar 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 com um proxy

Tenha em mente que muitos outros aplicativos também podem usar proxies de meias. O navegador da web é simplesmente o mais popular de todos. Alguns aplicativos possuem opções de configuração para ativar um servidor proxy. Outros precisam de uma ajudinha com um programa auxiliar. Por exemplo, cadeias de proxy permite que você execute um proxy de meias Microsoft RDP, etc.

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. Esta é uma implementação mais moderna do que rdesktop, com uma experiência muito mais suave.

Opção para usar SSH via proxy meias

Você está sentado em um café ou hotel - e é forçado a usar um WiFi pouco confiável. Lançamos um proxy ssh localmente a partir de um laptop e instalamos um túnel ssh na rede doméstica em um Rasberry Pi local. Usando um navegador ou outros aplicativos configurados para um proxy Socks, podemos acessar qualquer serviço de rede em nossa rede doméstica ou acessar a Internet por meio de nossa conexão doméstica. Tudo entre o seu laptop e o seu servidor doméstico (via Wi-Fi e internet para sua casa) é criptografado em um túnel SSH.

2. Túnel SSH (encaminhamento de porta)

Na sua forma mais simples, um túnel SSH simplesmente abre uma porta no seu 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

Vejamos o parâmetro -L. Pode ser pensado como o lado local da escuta. Portanto, no exemplo acima, a porta 9999 está escutando no lado do host local e encaminhada pela porta 80 para o servidor remoto. Observe que 127.0.0.1 refere-se ao localhost no servidor remoto!

Vamos subir o degrau. O exemplo a seguir comunica portas de escuta com outros hosts na rede local.

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

Nestes exemplos estamos nos conectando a uma 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 um túnel do servidor remoto para um servidor web rodando em 10.10.10.10. Tráfego do servidor remoto para 10.10.10.10 não está mais no túnel SSH. O servidor web em 10.10.10.10 considerará o servidor remoto como a fonte das solicitações web.

4. Túnel SSH reverso

Aqui iremos configurar uma porta de escuta no servidor remoto que se conectará de volta à 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

Esta sessão SSH estabelece uma conexão da porta 1999 no servidor remoto até a porta 902 em nosso cliente local.

5. Proxy reverso SSH

Nesse caso, estamos configurando um proxy meias em nossa conexão ssh, mas o proxy está escutando 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 com túneis SSH remotos

Se você tiver problemas com o funcionamento das opções de SSH remoto, verifique com netstat, a quais outras interfaces a porta de escuta está conectada. Embora tenhamos indicado 0.0.0.0 nos exemplos, mas se o valor Portas de gateway в sshd_config definido como não, 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 da rede interna podem ficar acessíveis a redes não confiáveis ​​(como a Internet!). Isso pode ser um sério risco à segurança, portanto, certifique-se de entender o que é o ouvinte e a que ele tem acesso.

6. Instalando VPN via SSH

Um termo comum entre especialistas em métodos de ataque (pentesters, etc.) é “um ponto de apoio na rede”. Depois que uma conexão é estabelecida em um sistema, esse sistema se torna o gateway para acesso adicional à rede. Um ponto de apoio que permite que você se mova em amplitude.

Para tal, podemos usar um proxy SSH e cadeias de proxy, no entanto, existem algumas limitações. Por exemplo, não será possível trabalhar diretamente com soquetes, portanto não poderemos escanear portas dentro da rede via Nmap SYN.

Usando esta opção VPN mais avançada, a conexão é reduzida a Nível 3. Podemos então simplesmente rotear o tráfego através do túnel usando 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, precisa de direitos de root em ambos os lados.

PermitRootLogin yes
PermitTunnel yes

Em seguida estabeleceremos uma conexão ssh utilizando o parâmetro que solicita a inicialização dos dispositivos tun.

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

Devemos agora 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 и ping 10.10.10.10).

Você pode rotear qualquer sub-rede através de um host do outro lado.

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

No lado remoto você deve habilitar ip_forward и 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! VPN sobre túnel SSH na camada de rede 3. Agora isso é uma vitória.

Se ocorrer algum problema, use tcpdump и pingpara determinar a causa. Como estamos jogando na camada 3, nossos pacotes icmp passarão por esse túnel.

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

Existem várias maneiras de fazer isso, mas este comando economiza tempo ao não copiar os arquivos manualmente. Ele simplesmente copia ~/.ssh/id_rsa.pub (ou a chave padrão) do seu sistema para ~/.ssh/authorized_keys em um servidor remoto.

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

8. Execução remota de comandos (não interativo)

equipe ssh Pode ser vinculado a outros comandos para uma interface comum e amigável. Basta adicionar o comando que 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 grep executado no sistema local após o download do log via canal ssh. Se o arquivo for grande, é mais conveniente executar grep no lado remoto simplesmente colocando ambos os 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 e visualização remota de pacotes no Wireshark

Eu peguei um dos nossos exemplos de tcpdump. Use-o para capturar pacotes remotamente e exibir os resultados diretamente na GUI local do Wireshark.

:~$ 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 bom truque que compacta uma pasta usando bzip2 (esta é a opção -j no comando tar) e, em seguida, recupera o fluxo bzip2 por outro lado, criando uma pasta duplicada no servidor remoto.

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

11. Aplicativos GUI remotos com encaminhamento SSH X11

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

localhost:~$ ssh -X remoteserver vmware

Sequência obrigatória X11Forwarding yes no arquivo sshd_config.

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

rsync muito mais conveniente scp, se precisar de backups periódicos de um diretório, de um grande número de arquivos ou de arquivos muito grandes. Existe uma função de recuperação de falha de transferência e cópia apenas dos arquivos alterados, o que economiza tráfego e tempo.

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

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

13. SSH pela rede Tor

A rede Tor anônima pode encapsular o tráfego SSH usando o comando torsocks. O comando a seguir passará o proxy ssh através do Tor.

localhost:~$ torsocks ssh myuntracableuser@remoteserver

Torsocks usará a porta 9050 no localhost para proxy. 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 vão suas consultas de DNS?

14. SSH para instância EC2

Para se conectar a uma instância EC2, você precisa de uma chave privada. Baixe-o (extensão .pem) no painel de controle do Amazon EC2 e altere as permissões (chmod 400 my-ec2-ssh-key.pem). Guarde a chave em um local seguro ou coloque-a em sua própria pasta ~/.ssh/.

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

Parâmetro -i simplesmente diz ao cliente ssh para usar esta chave. Arquivo ~/.ssh/config Ideal para configurar automaticamente o uso de chaves ao conectar-se a um 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 VIM via ssh/scp

Para todos os amantes vim Essa dica vai economizar algum tempo. Usando vim os arquivos são editados via scp com um comando. Este método simplesmente cria o arquivo localmente em /tmpe depois copia-o de volta assim que o salvamos de vim.

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

Nota: o formato é um pouco diferente do habitual scp. Depois do anfitrião temos o dobro //. Esta é uma referência de caminho absoluta. Uma barra indicará um caminho relativo à sua pasta pessoal users.

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

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

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

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

localhost:~$ apt install sshfs

Instale o pacote no Ubuntu e Debian sshfse simplesmente monte o local remoto em nosso sistema.

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

17. Multiplexação SSH com ControlPath

Por padrão, se houver uma conexão existente com um servidor remoto usando ssh segunda conexão usando ssh ou scp estabelece uma nova sessão com autenticação adicional. Opção ControlPath permite que a sessão existente seja usada para todas as conexões subsequentes. Isso irá acelerar significativamente o processo: o efeito é perceptível mesmo em uma rede local, e ainda mais quando conectado a recursos remotos.

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

ControlPath especifica o soquete para verificar novas conexões para ver se há uma sessão ativa ssh. A última opção significa que mesmo depois de sair do console, a sessão existente permanecerá aberta por 10 minutos, portanto durante esse tempo você poderá reconectar-se no soquete existente. Para obter mais informações, consulte a ajuda. ssh_config man.

18. Transmita vídeo por SSH usando VLC e SFTP

Mesmo usuários antigos ssh и vlc (Video Lan Client) nem sempre conhece esta opção conveniente quando você realmente precisa assistir a um vídeo pela rede. Nas configurações Arquivo | Fluxo de rede aberto programa vlc você pode inserir o local como sftp://. Se uma senha for necessária, um prompt aparecerá.

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

19. Autenticação de dois fatores

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

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

Veja nosso guia de 8 minutos para usando Google Authenticator e SSH.

20. Saltando hosts com ssh e -J

Se a segmentação da rede significa que você precisa passar por vários hosts ssh para chegar à rede de destino final, o atalho -J economizará seu tempo.

localhost:~$ ssh -J host1,host2,host3 [email protected]

A principal coisa a entender aqui é que isso não é o mesmo que o comando ssh host1em seguida user@host1:~$ ssh host2 etc. A opção -J usa habilmente o encaminhamento para forçar o host local a estabelecer uma sessão com o próximo host na cadeia. Portanto, no exemplo acima, nosso localhost é autenticado no host4. Ou seja, nossas chaves localhost são usadas e a sessão de localhost para host4 é completamente criptografada.

Para tal possibilidade em ssh_config especifique a opção de configuração Proxy Jump. Se você precisar passar regularmente por vários hosts, a automação por meio da configuração economizará muito tempo.

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

Qualquer pessoa que tenha gerenciado um serviço SSH e analisado os logs sabe o número de tentativas de força bruta que ocorrem a cada hora de cada dia. Uma maneira rápida de reduzir o ruído nos logs é mover o SSH para uma porta não padrão. Faça alterações no arquivo sshd_config via parâmetro de configuração Porta##.

Com iptables Você também pode bloquear facilmente tentativas de conexão a uma porta ao atingir um determinado limite. Uma maneira fácil de fazer isso é usar OSSEC, porque ele não apenas bloqueia o SSH, mas também executa várias outras medidas de detecção de intrusões baseadas em nome de host (HIDS).

22. SSH Escape para alterar o encaminhamento de porta

E nosso último exemplo ssh projetado para alterar o encaminhamento de porta dinamicamente dentro de uma sessão existente ssh. Imagine este cenário. Você está profundamente envolvido na rede; talvez tenha pulado mais de meia dúzia de hosts e precise de uma porta local na estação de trabalho que seja encaminhada para o Microsoft SMB de um antigo sistema Windows 2003 (alguém se lembra do ms08-67?).

Clicando enter, tente entrar no console ~C. Esta é uma sequência de controle de 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 encaminhamos nossa porta local 1445 para um host Windows 2003 que encontramos na rede interna. Agora é só correr msfconsole, e você pode seguir em frente (supondo que planeje usar este host).

Realização

Esses exemplos, dicas e comandos ssh deverá dar um ponto de partida; Mais informações sobre cada um dos comandos e capacidades estão disponíveis nas páginas man (man ssh, man ssh_config, man sshd_config).

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

Fonte: habr.com

Adicionar um comentário