Consejos prácticos, ejemplos y túneles SSH


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


  1. Calcetines SSH proxy
  2. Túnel SSH (reenvío de puertos)
  3. Túnel SSH al tercer host
  4. SSH túnel inverso
  5. Proxy inverso SSH
  6. Instalar VPN sobre SSH
  7. Copiar clave SSH (ssh-copy-id)
  8. Ejecución remota de comandos (no interactiva)
  9. Captura y visualización remota de paquetes en Wireshark
  10. Copiar una carpeta local a un servidor remoto a través de SSH
  11. Aplicaciones remotas de la GUI de reenvío SSH X11
  12. Copia remota de archivos usando rsync y SSH
  13. SSH sobre la red Tor
  14. Instancia de SSH a EC2
  15. Edición de archivos de texto usando VIM a través de ssh / scp
  16. Montaje de SSH remoto como una carpeta local con SSHFS
  17. Multiplexación SSH con ControlPath
  18. Transmisión de video SSH usando VLC y SFTP
  19. Autenticación de dos factores
  20. Host Jumping con SSH y -J
  21. Bloqueo de intentos de fuerza bruta SSH con iptables
  22. 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:~# ssh -v -w any root@remoteserver 

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:~# ip addr add 10.10.10.2/32 peer 10.10.10.10 dev tun0 localhost:~# ip tun0 up 

Lado del servidor SSH:

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

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:~# route add -net 10.10.10.0 netmask 255.255.255.0 dev tun0 

En el lado remoto, debe habilitar ip_forward e 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 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 msfconsoley puede continuar (suponiendo que planea usar este host).

Finalización


Estos ejemplos, consejos y comandos sshdeberí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 sshtú será más efectivo en cualquier juego que juegues.

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


All Articles