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
- Proxy de meias SSH
- Túnel SSH (encaminhamento de porta)
- Túnel SSH para o terceiro host
- Túnel reverso SSH
- Proxy reverso SSH
- Instalando VPN sobre SSH
- Copiar chave SSH (ssh-copy-id)
- Execução de comando remoto (não interativo)
- Captura e visualização remotas de pacotes no Wireshark
- Copiando uma pasta local para um servidor remoto via SSH
- Aplicativos GUI de encaminhamento SSH X11 remoto
- Cópia remota de arquivos usando rsync e SSH
- SSH na rede Tor
- Instância SSH para EC2
- Editando arquivos de texto usando o VIM via ssh / scp
- Montando SSH remoto como uma pasta local com SSHFS
- Multiplexação SSH com ControlPath
- Streaming de vídeo SSH usando VLC e SFTP
- Autenticação de dois fatores
- Salto de host com SSH e -J
- Bloqueando tentativas de força bruta SSH com iptables
- 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:~
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:~
Lado do servidor SSH:
remoteserver:~
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:~
No lado remoto, você deve ativar o
ip_forward
e o
iptables
.
remoteserver:~
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á- msfconsole
lo e você pode seguir em frente (supondo que planeja usar este host).Conclusão
Esses exemplos, dicas e comandos ssh
devem 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 ssh
você se tornará mais eficaz em qualquer jogo que você jogar.