Ejemplos prácticos de
SSH que llevarán sus habilidades de administrador de sistema remoto al siguiente nivel. Los comandos y sugerencias ayudarán no solo a usar
SSH
, sino también a navegar de manera más competente en la red.
Conocer algunos trucos
ssh
es útil para cualquier administrador de sistemas, ingeniero de redes o especialista en seguridad.
Ejemplos prácticos de SSH
- Calcetines SSH proxy
- Túnel SSH (reenvío de puertos)
- Túnel SSH al tercer host
- SSH túnel inverso
- Proxy inverso SSH
- Instalar VPN sobre SSH
- Copiar clave SSH (ssh-copy-id)
- Ejecución remota de comandos (no interactiva)
- Captura y visualización remota de paquetes en Wireshark
- Copiar una carpeta local a un servidor remoto a través de SSH
- Aplicaciones remotas de la GUI de reenvío SSH X11
- Copia remota de archivos usando rsync y SSH
- SSH sobre la red Tor
- Instancia de SSH a EC2
- Edición de archivos de texto usando VIM a través de ssh / scp
- Montaje de SSH remoto como una carpeta local con SSHFS
- Multiplexación SSH con ControlPath
- Transmisión de video SSH usando VLC y SFTP
- Autenticación de dos factores
- Host Jumping con SSH y -J
- Bloqueo de intentos de fuerza bruta SSH con iptables
- SSH Escape para cambiar el reenvío de puertos
Lo básico primero
Análisis de línea de comando SSH
El siguiente ejemplo utiliza los parámetros habituales que a menudo se encuentran al conectarse a un servidor
SSH
remoto.
localhost:~$ ssh -v -p 22 -C neo@remoteserver
-v
: la salida de depuración es especialmente útil al analizar problemas de autenticación. Puede usarlo varias veces para mostrar información adicional.- p 22
: puerto para conectarse a un servidor SSH remoto. 22 no es necesario especificar, porque este es el valor predeterminado, pero si el protocolo está en algún otro puerto, lo especificamos utilizando el parámetro -p
. El puerto de escucha se especifica en el archivo sshd_config
en el formato Port 2222
.-C
: compresión para la conexión. Si tiene una alimentación lenta o está viendo mucho texto, esto puede acelerar la conexión.neo@
: la línea antes del símbolo @ indica el nombre de usuario para la autenticación en el servidor remoto. Si no lo especifica, se usará de manera predeterminada el nombre de usuario de la cuenta en la que está conectado actualmente (~ $ whoami). El usuario también se puede especificar con la opción -l
.remoteserver
: el nombre de host al que se conecta ssh
, puede ser un nombre de dominio totalmente calificado, una dirección IP o cualquier host en el archivo de hosts locales. Para conectarse a un host que admita IPv4 e IPv6, puede agregar la opción -4
o -6
a la línea de comando para obtener la resolución adecuada.
Todas las opciones anteriores son opcionales, excepto el
remoteserver
.
Usando el archivo de configuración
Aunque muchos están familiarizados con el archivo
sshd_config
, también hay un archivo de configuración del cliente para el comando
ssh
. El valor predeterminado es
~/.ssh/config
, pero se puede definir como un parámetro para la opción
-F
.
Host * Port 2222 Host remoteserver HostName remoteserver.thematrix.io User neo Port 2112 IdentityFile /home/test/.ssh/remoteserver.private_key
El archivo de configuración ssh de ejemplo anterior tiene dos entradas de host. El primero significa todos los hosts, el parámetro de configuración del Puerto 2222 se usa para todos. El segundo dice que para el host del
servidor remoto debe usar un nombre de usuario, puerto, FQDN e IdentityFile diferentes.
Un archivo de configuración puede ahorrar mucho tiempo escribiendo caracteres, lo que le permite aplicar automáticamente la configuración avanzada al conectarse a hosts específicos.
Copie archivos sobre SSH usando SCP
El cliente SSH viene con otras dos herramientas muy convenientes para copiar archivos a través de una
conexión ssh encriptada . Vea a continuación un ejemplo del uso estándar de los comandos scp y sftp. Tenga en cuenta que muchas de las opciones para ssh también se aplican a estos comandos.
localhost:~$ scp mypic.png neo@remoteserver:/media/data/mypic_2.png
En este ejemplo, el archivo
mypic.png se copia al
servidor remoto en la carpeta
/ media / data y se renombra a
mypic_2.png .
No te olvides de la diferencia en el parámetro del puerto. Esto se encuentra con muchos que ejecutan
scp
desde la línea de comando. ¡Aquí el parámetro del puerto es
-P
, no
-p
, como en el cliente ssh! Lo olvidarás, pero no te preocupes, todos lo olvidarán.
Para aquellos familiarizados con la consola
ftp
, muchos de los comandos son similares en
sftp
. Puedes hacer
push ,
put y
ls como tu corazón lo desee.
sftp neo@remoteserver
Ejemplos prácticos
En muchos de estos ejemplos, el resultado puede lograrse mediante varios métodos. Al igual que con todos nuestros
libros de texto y ejemplos, se da preferencia a ejemplos prácticos que simplemente hacen su trabajo.
1. proxy de calcetines SSH
Proxy SSH en el número 1 por una buena razón. Es más potente de lo que muchos suponen, y le da acceso a cualquier sistema al que un servidor remoto tenga acceso utilizando casi cualquier aplicación. El cliente ssh puede hacer un túnel del tráfico a través del proxy SOCKS con un simple comando. Es importante comprender que el tráfico a los sistemas remotos provendrá de un servidor remoto, como se indicará en los registros del 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
Aquí ejecutamos el proxy de calcetines en el puerto TCP 8888, el segundo comando verifica que el puerto esté activo en modo de escucha. 127.0.0.1 indica que el servicio se ejecuta solo en localhost. Podemos usar un comando ligeramente diferente para escuchar todas las interfaces, incluyendo ethernet o wifi, esto permitirá que otras aplicaciones (navegadores, etc.) en nuestra red se conecten al servicio de proxy a través de ssh socks proxy.
localhost:~$ ssh -D 0.0.0.0:8888 user@remoteserver
Ahora podemos configurar el navegador para conectarse al proxy de calcetines. En Firefox, seleccione
Configuración | Destacados | Configuraciones de red Especifique la dirección IP y el puerto para conectarse.

Preste atención a la opción en la parte inferior del formulario para que las consultas DNS del navegador también pasen por servidores proxy SOCKS. Si usa un servidor proxy para cifrar el tráfico web en la red local, entonces probablemente desee seleccionar esta opción para que las consultas DNS se tunelen a través de una conexión SSH.
Activación de proxy de calcetines en Chrome
La ejecución de Chrome con ciertas opciones de línea de comandos activa los proxy de calcetines, así como también las consultas de DNS del túnel desde el navegador. Confía, pero verifica. Use
tcpdump para verificar que las consultas DNS ya no sean visibles.
localhost:~$ google-chrome --proxy-server="socks5://192.168.1.10:8888"
Usar otras aplicaciones proxy
Tenga en cuenta que muchas otras aplicaciones también pueden usar proxies de calcetines. Un navegador web es simplemente el más popular de ellos. Algunas aplicaciones tienen opciones de configuración para activar un servidor proxy. Otros necesitan un poco de ayuda con el programa de ayuda. Por ejemplo,
proxychains le permite ejecutar Microsoft RDP, etc. a través de socks-proxies.
localhost:~$ proxychains rdesktop $RemoteWindowsServer
Los parámetros de configuración de proxy de calcetines se establecen en el archivo de configuración de proxychains.
Sugerencia: si usa un escritorio remoto desde Linux en Windows? Prueba el cliente FreeRDP . Esta es una implementación más moderna que rdesktop
, con una interacción mucho más fluida.
Opción SSH a través de proxy de calcetines
Estás sentado en una cafetería u hotel, y estás obligado a usar WiFi poco confiable. Desde la computadora portátil, inicie localmente el proxy ssh e instale el túnel ssh en la red doméstica en el Rasberry Pi local. Usando un navegador u otras aplicaciones configuradas para servidores proxy de calcetines, podemos acceder a cualquier servicio de red en nuestra red doméstica o acceder a Internet a través de una conexión doméstica. Todo entre su computadora portátil y el servidor de su hogar (a través de Wi-Fi e Internet a su hogar) está encriptado en el túnel SSH.
2. Túnel SSH (reenvío de puertos)
En su forma más simple, un túnel SSH simplemente abre un puerto en su sistema local que se conecta a otro puerto en el otro extremo del túnel.
localhost:~$ ssh -L 9999:127.0.0.1:80 user@remoteserver
Examinemos la opción
-L
. Se puede representar como el lado local de la escucha. Por lo tanto, en el ejemplo anterior, el puerto 9999 se escucha en el lado del host local y se reenvía a través del puerto 80 al servidor remoto. ¡Tenga en cuenta que 127.0.0.1 se refiere a localhost en el servidor remoto!
Subamos un paso. En el siguiente ejemplo, los puertos de escucha se comunican con otros nodos en la red local.
localhost:~$ ssh -L 0.0.0.0:9999:127.0.0.1:80 user@remoteserver
En estos ejemplos, nos conectamos al puerto en el servidor web, pero puede ser un servidor proxy o cualquier otro servicio TCP.
3. Túnel SSH a un host de terceros
Podemos usar los mismos parámetros para conectar un túnel desde un servidor remoto a otro servicio que se ejecuta en un tercer sistema.
localhost:~$ ssh -L 0.0.0.0:9999:10.10.10.10:80 user@remoteserver
En este ejemplo, estamos redirigiendo el túnel desde el servidor remoto a un servidor web que se ejecuta en 10.10.10.10. El tráfico con servidor remoto antes del 10.10.10.10
ya no está en el túnel SSH . El 10.10.10.10, el servidor web considerará el servidor remoto como la fuente de las solicitudes web.
4. Túnel SSH inverso
Aquí configuramos el puerto de escucha en el servidor remoto, que se conectará nuevamente al puerto local en nuestro host local (u otro sistema).
localhost:~$ ssh -v -R 0.0.0.0:1999:127.0.0.1:902 192.168.1.100 user@remoteserver
En esta sesión SSH, se establece una conexión desde el puerto 1999 en el servidor remoto al puerto 902 en nuestro cliente local.
5. Proxy SSH inverso
En este caso, instalamos el proxy de calcetines en nuestra conexión ssh, sin embargo, el proxy escucha en el extremo remoto del servidor. Las conexiones a este proxy remoto ahora aparecen desde el túnel como tráfico desde nuestro host local.
localhost:~$ ssh -v -R 0.0.0.0:1999 192.168.1.100 user@remoteserver
Solución de problemas de túneles remotos SSH
Si tiene problemas con las opciones SSH remotas, verifique con
netstat
qué otras interfaces está conectado el puerto de escucha. Aunque especificamos 0.0.0.0 en los ejemplos, pero si el valor de
GatewayPorts en
sshd_config se establece en
no , entonces el oyente solo estará vinculado a localhost (127.0.0.1).
Advertencia de seguridad
Tenga en cuenta que al abrir túneles y proxies de calcetines, los recursos de la red interna pueden estar disponibles para redes no confiables (por ejemplo, Internet). Esto puede ser un grave riesgo de seguridad, así que asegúrese de comprender qué es el oyente y a qué tiene acceso.
6. Instalar VPN sobre SSH
El término general entre los especialistas en métodos de ataque (pentesters, etc.) es "el punto de apoyo de la red". Después de establecer una conexión en un sistema, este sistema se convierte en una puerta de enlace para un mayor acceso a la red. El punto de apoyo que te permite moverte en amplitud.
Para tal punto de apoyo, podemos usar proxies SSH y
proxychains , sin embargo, hay algunas limitaciones. Por ejemplo, no podrá trabajar directamente con sockets, por lo que no podremos escanear puertos dentro de la red a través de
Nmap SYN
.
Usando esta opción VPN más avanzada, la conexión cae al
nivel 3 . Entonces podemos simplemente enrutar el tráfico a través del túnel utilizando el enrutamiento de red estándar.
El método utiliza
ssh
,
iptables
,
tun interfaces
y enrutamiento.
Primero debe establecer estos parámetros en
sshd_config
. Dado que estamos realizando cambios en las interfaces de los sistemas remotos y del cliente,
necesitamos privilegios de root en ambos lados .
PermitRootLogin yes PermitTunnel yes
Luego establezca una conexión ssh utilizando un parámetro que solicite la inicialización de los dispositivos tun.
localhost:~
Ahora deberíamos tener un dispositivo tun al mostrar las interfaces (
# ip a
). El siguiente paso agregará direcciones IP a las interfaces del túnel.
Lado del cliente SSH:
localhost:~
Lado del servidor SSH:
remoteserver:~
Ahora tenemos una ruta directa a otro host (
route -n
y
ping 10.10.10.10
).
Puede enrutar cualquier subred a través del host del otro lado.
localhost:~
En el lado remoto, debe habilitar
ip_forward
e
iptables
.
remoteserver:~
Boom!
VPN sobre túnel SSH en la capa de red 3 . Esto ya es una victoria.
Si encuentra algún problema, use
tcpdump y
ping
para determinar la causa. Como jugamos en el nivel 3, nuestros paquetes icmp pasarán por este túnel.
7. Copiando la clave SSH (ssh-copy-id)
Hay varias formas, pero este comando ahorra tiempo para no copiar archivos manualmente. Simplemente copia ~ / .ssh / id_rsa.pub (o la clave predeterminada) de su sistema a
~/.ssh/authorized_keys
en el servidor remoto.
localhost:~$ ssh-copy-id user@remoteserver
8. Ejecución remota de comandos (no interactiva)
El comando
ssh
se puede asociar con otros comandos para la interfaz fácil de usar habitual. Simplemente agregue el comando que desea ejecutar en el host remoto como el último parámetro entre comillas.
localhost:~$ ssh remoteserver "cat /var/log/nginx/access.log" | grep badstuff.php
En este ejemplo,
grep
ejecuta en el sistema local después de que el registro se haya descargado a través del canal ssh. Si el archivo es grande, es más conveniente ejecutar
grep
en el lado remoto, simplemente encerrando ambos comandos entre comillas dobles.
Otro ejemplo realiza la misma función que
ssh-copy-id
del ejemplo 7.
localhost:~$ cat ~/.ssh/id_rsa.pub | ssh remoteserver 'cat >> .ssh/authorized_keys'
9. Captura y visualización remota de paquetes en Wireshark
Tomé uno de nuestros
ejemplos de tcpdump . Úselo para interceptar paquetes de forma remota con el resultado directamente en la GUI del Wireshark local.
:~$ ssh root@remoteserver 'tcpdump -c 1000 -nn -w - not port 22' | wireshark -k -i -
10. Copiando una carpeta local a un servidor remoto a través de SSH
Un hermoso truco que comprime una carpeta usando
bzip2
(esta es la opción -j en el comando
tar
) y luego extrae la secuencia
bzip2
en el otro lado, creando un duplicado de la carpeta en el servidor remoto.
localhost:~$ tar -cvj /datafolder | ssh remoteserver "tar -xj -C /datafolder"
11. Aplicaciones remotas de la GUI de reenvío SSH X11
Si el cliente y el servidor remoto tienen X instalado, puede ejecutar remotamente el comando GUI, con una ventana en su escritorio local. Esta característica existe hace mucho tiempo, pero sigue siendo muy útil. Inicie un navegador web remoto o incluso la consola VMWawre Workstation, como hago en este ejemplo.
localhost:~$ ssh -X remoteserver vmware
Requiere la línea
X11Forwarding yes
en el archivo
sshd_config
.
12. Copia remota de archivos usando rsync y SSH
rsync
es mucho más conveniente que
scp
si necesita hacer una copia de seguridad periódica de un directorio, una gran cantidad de archivos o archivos muy grandes. Hay una función para recuperarse de una falla de transmisión y copiar solo archivos modificados, lo que ahorra tráfico y tiempo.
Este ejemplo utiliza la compresión
gzip
(-z) y el modo de archivo (-a), que permite la copia recursiva.
:~$ rsync -az /home/testuser/data remoteserver:backup/
13. SSH sobre la red Tor
Una red Tor anónima puede tunelizar el tráfico SSH usando el
torsocks
. El siguiente comando lanzará un proxy ssh a través de Tor.
localhost:~$ torsocks ssh myuntracableuser@remoteserver
Torsocks usará el puerto 9050 para proxy en localhost. Como siempre, al usar Tor, debe verificar seriamente qué tráfico se está tunelizando y otros problemas de seguridad operacional (opsec).
¿A dónde van tus consultas DNS?14. Instancia SSH a EC2
Se requiere una clave privada para conectarse a una instancia EC2. Descárguelo (extensión .pem) desde el panel de control de Amazon EC2 y cambie los permisos (
chmod 400 my-ec2-ssh-key.pem
). Guarde la clave en un lugar seguro o
~/.ssh/
en su carpeta
~/.ssh/
.
localhost:~$ ssh -i ~/.ssh/my-ec2-key.pem ubuntu@my-ec2-public
La
opción -i simplemente le dice al cliente ssh que use este modificador. El archivo
~/.ssh/config
es ideal para configurar automáticamente el uso de la clave cuando se conecta al host ec2.
Host my-ec2-public Hostname ec2???.compute-1.amazonaws.com User ubuntu IdentityFile ~/.ssh/my-ec2-key.pem
15. Edición de archivos de texto usando VIM a través de ssh / scp
Para todos los amantes de
vim
, este consejo les ahorrará un poco de tiempo. Usando
vim
archivos se editan usando scp con un solo comando. Este método simplemente crea el archivo localmente en
/tmp
y luego lo copia de nuevo una vez que lo guardamos de
vim
.
localhost:~$ vim scp://user@remoteserver//etc/hosts
Nota: el formato es ligeramente diferente del
scp
normal. Después del host, tenemos doble
//
. Este es un enlace a la ruta absoluta. Una barra oblicua significará la ruta relativa a la carpeta de inicio de los
users
.
**warning** (netrw) cannot determine method (format: protocol://[user@]hostname[:port]/[path])
Si ve este error, verifique dos veces el formato del comando. Esto generalmente significa un error de sintaxis.
16. Montaje de SSH remoto como una carpeta local con SSHFS
Usando
sshfs
, el cliente del sistema de archivos
ssh
, podemos conectar el directorio local a una ubicación remota con todas las interacciones de archivos en una sesión
ssh
encriptada.
localhost:~$ apt install sshfs
Instalamos el paquete
sshfs
en Ubuntu y Debian, y luego simplemente montamos la ubicación remota en nuestro sistema.
localhost:~$ sshfs user@remoteserver:/media/data ~/data/
17. Multiplexación SSH con ControlPath
De manera predeterminada, si tiene una conexión existente al servidor remoto mediante
ssh
segunda conexión mediante
ssh
o
scp
establece una nueva sesión con autenticación adicional. La opción
ControlPath
permite usar una sesión existente para todas las conexiones posteriores. Esto acelerará significativamente el proceso: el efecto es notable incluso en la red local, y aún más cuando está conectado a recursos remotos.
Host remoteserver HostName remoteserver.example.org ControlMaster auto ControlPath ~/.ssh/control/%r@%h:%p ControlPersist 10m
ControlPath le dice al socket que busque nuevas conexiones para una sesión
ssh
activa. La última opción significa que incluso después de salir de la consola, la sesión existente permanecerá abierta durante 10 minutos, por lo que durante este tiempo puede volver a conectarse al socket existente. Consulte la ayuda de
ssh_config man
para obtener más información.
18. Transmisión de video a través de SSH usando VLC y SFTP
Incluso los usuarios antiguos de
ssh
y
vlc
(Video Lan Client) no siempre conocen esta conveniente opción cuando realmente necesitan ver videos en la red. En la configuración
Archivo | El programa Open Network Stream vlc
puede ingresar la ubicación como
sftp://
. Si se requiere una contraseña, aparece un mensaje.
sftp://remoteserver//media/uploads/myvideo.mkv
19. Autenticación de dos factores
La misma autenticación de dos factores que su cuenta bancaria o cuenta de Google se aplica al servicio SSH.
Por supuesto,
ssh
inicialmente tiene una función de autenticación de dos factores, lo que significa la contraseña y la clave SSH. La ventaja de un token de hardware o una aplicación Google Authenticator es que generalmente es un dispositivo físico diferente.
Consulte nuestra guía de 8 minutos sobre el
uso de Google Authenticator y SSH .
20. Host saltando con ssh y -J
Si, debido a la segmentación de la red, tiene que cruzar varios hosts ssh para llegar a la red de destino final, el acceso directo -J le ahorrará tiempo.
localhost:~$ ssh -J host1,host2,host3 user@host4.internal
Lo principal que hay que entender aquí es que esto no es análogo al
ssh host1
, luego
user@host1:~$ ssh host2
, etc. El parámetro -J usa inteligentemente el reenvío para que localhost establezca una sesión con el siguiente host en la cadena. Por lo tanto, en el ejemplo anterior, nuestro localhost se autentica en host4. Es decir, se utilizan nuestras claves de localhost, y la sesión de localhost a host4 está totalmente encriptada.
Para hacer esto, especifique la opción de configuración
proxyJump en
ssh_config . Si regularmente tiene que pasar por varios hosts, la automatización a través de la configuración le ahorrará mucho tiempo.
21. Bloqueo de intentos de fuerza bruta SSH usando iptables
Cualquiera que haya ejecutado el servicio SSH y haya revisado los registros sabe sobre la cantidad de intentos de fuerza bruta que ocurren cada hora todos los días. Una forma rápida de reducir el ruido en los registros es migrar SSH a un puerto no estándar. Realice cambios en el archivo
sshd_config
utilizando el parámetro de configuración
Port ## .
Usando
iptables
, también puede bloquear fácilmente los intentos de conectarse a un puerto después de alcanzar un cierto umbral. —
OSSEC , SSH, (HIDS).
22. SSH Escape
ssh
ssh
. . ; , , Microsoft SMB Windows 2003 (- ms08-67?).
enter
,
~C
. , .
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.
Aquí puede ver que redirigimos nuestro puerto local 1445 al host de Windows 2003 que encontramos en la red interna. Ahora solo ejecútelo msfconsole
y puede continuar (suponiendo que planea usar este host).Finalización
Estos ejemplos, consejos y comandos ssh
deberían proporcionar un punto de partida; Más información acerca de cada uno de los comandos y funciones disponibles en las páginas de ayuda ( man ssh
, man ssh_config
, man sshd_config
).Siempre me ha fascinado la capacidad de acceder a los sistemas y ejecutar comandos en cualquier parte del mundo. Desarrollar tus habilidades para trabajar con herramientas como ssh
tú será más efectivo en cualquier juego que juegues.