Consejos prácticos, ejemplos y túneles SSH

Consejos prácticos, ejemplos y túneles SSH
Ejemplos prácticos SSH, que llevarán tus habilidades de administrador de sistemas remotos a un nuevo nivel. Los comandos y consejos te ayudarán no solo a utilizarlos SSH, sino a moverte más inteligentemente 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. Proxy SOCKS SSH
  2. Túnel SSH (redirección de puertos)
  3. Túnel SSH hacia un tercer host
  4. Túnel SSH inverso
  5. Proxy inverso SSH
  6. Instalación de VPN sobre SSH
  7. Copia de clave SSH (ssh-copy-id)
  8. Ejecución remota de comandos (no interactivo)
  9. Intercepción remota de paquetes y visualización en Wireshark
  10. Copia de una carpeta local a un servidor remoto a través de SSH
  11. Aplicaciones GUI remotas con redirección SSH X11
  12. Copia remota de archivos usando rsync y SSH
  13. SSH a través de la red Tor
  14. SSH a una instancia EC2
  15. Edición de archivos de texto usando VIM a través de ssh/scp
  16. Montaje remoto de SSH como carpeta local con SSHFS
  17. Multiplexión SSH con ControlPath
  18. Streaming de video por SSH con VLC y SFTP
  19. Autenticación de dos factores
  20. Salto entre hosts con SSH y -J
  21. Bloqueo de intentos de fuerza bruta SSH con iptables
  22. Escape SSH para cambiar la redirección de puertos

Ante todo, los fundamentos

Análisis de la línea de comandos SSH

En el siguiente ejemplo, se utilizan parámetros comunes que a menudo se presentan al conectarse a un servidor remoto SSH.

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

  • -v: la salida de la información de depuración es especialmente útil para analizar problemas de autenticación. Se puede utilizar varias veces para generar información adicional.
  • - p 22: puerto para conectarse al servidor remoto SSH. No es necesario especificar 22, ya que este es el valor predeterminado, pero si el protocolo está en un puerto diferente, debe indicarse mediante el parámetro -p. El puerto de escucha se indica en el archivo sshd_config en el formato Port 2222.
  • -C: compresión para la conexión. Si tienes un canal lento o visualizas mucho texto, esto puede acelerar la comunicación.
  • neo@: la cadena antes del símbolo @ indica el nombre de usuario para la autenticación en el servidor remoto. Si no se especifica, se utilizará el nombre de usuario de la cuenta que se ha iniciado sesión actualmente (~$ whoami). También se puede indicar el usuario mediante el parámetro -l.
  • remoteserver: nombre del host al que se conecta ssh, puede ser un nombre de dominio completo, una dirección IP o cualquier host en un archivo hosts local. Para conectarse a un host que admite tanto IPv4 como IPv6, se puede agregar el parámetro en la línea de comandos -4 o -6 para una resolución correcta.

Todos los parámetros mencionados son opcionales, excepto remoteserver.

El uso del 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 ~/.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

En el archivo de configuración ssh de ejemplo anterior, hay dos entradas de host. La primera indica todos los hosts, para quienes se aplica el parámetro de configuración Port 2222. La segunda indica que para el host remoteserver se debe usar otro nombre de usuario, puerto, FQDN e IdentityFile.

El archivo de configuración puede ahorrar mucho tiempo en la entrada de caracteres, permitiendo aplicar automáticamente configuraciones avanzadas al conectarse a hosts específicos.

Copiar archivos a través de SSH usando SCP

El cliente SSH viene con otras dos herramientas muy útiles para copiar archivos a través de una conexión ssh cifrada. A continuación, se muestra un ejemplo de uso estándar de los comandos scp y sftp. Tenga en cuenta que muchos parámetros para ssh también se aplican en estos comandos.

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

En este ejemplo, el archivo mypic.png fue copiado a remoteserver a la carpeta /media/data y renombrado a mypic_2.png.

No olvide la diferencia en el parámetro de puerto. Aquí es donde muchos fallan al ejecutar scp desde la línea de comandos. Aquí el parámetro de puerto -P, y no -p, como en el cliente ssh! Lo olvidarás, pero no te preocupes, todos olvidan.

Para aquellos que están familiarizados con el ftp, muchos de los comandos son similares en sftp. Puedes hacer push, put y Muestra el contenido del directorio. Si no se proporciona una ruta, se muestra el contenido del directorio actual., como desees.

sftp neo@remoteserver

Ejemplos prácticos

En muchos de estos ejemplos, se pueden lograr resultados de diferentes maneras. Al igual que en todos nuestros tutoriales y ejemplos, se prefiere los ejemplos prácticos que simplemente cumplen su función.

1. Proxy SSH socks

La función SSH Proxy número 1 tiene una razón válida. Es más potente de lo que muchos suponen y te brinda acceso a cualquier sistema al que tenga acceso el servidor remoto, utilizando prácticamente cualquier aplicación. Un cliente SSH puede tunelizar tráfico a través de un servidor proxy SOCKS con un simple comando. Es importante entender que el tráfico hacia sistemas remotos provendrá del servidor remoto, como se registrará en los logs 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í estamos ejecutando un proxy SOCKS en el puerto TCP 8888, el segundo comando verifica que el puerto esté activo y en modo escucha. 127.0.0.1 indica que el servicio está funcionando solo en localhost. Podemos aplicar un comando ligeramente diferente para escuchar en todas las interfaces, incluyendo ethernet o wifi, lo que permitirá que otras aplicaciones (como navegadores, etc.) en nuestra red se conecten al servicio proxy a través del proxy SOCKS SSH.

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

Ahora podemos configurar el navegador para conectarse al proxy SOCKS. En Firefox, elige Configuración | General | Configuración de red. Indica la dirección IP y el puerto para la conexión.

Consejos prácticos, ejemplos y túneles SSH

Presta atención a la opción en la parte inferior del formulario para que las consultas DNS del navegador también pasen a través del proxy SOCKS. Si usas un servidor proxy para cifrar el tráfico web en la red local, seguramente querrás seleccionar esta opción para que las consultas DNS sean tunelizadas a través de la conexión SSH.

Activar el proxy SOCKS en Chrome

Iniciar Chrome con ciertos parámetros de línea de comandos activa el proxy SOCKS, así como el tunelizado de consultas DNS desde el navegador. Confía, pero verifica. Utiliza tcpdump para comprobar que las consultas DNS ya no son visibles.

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

Usando otras aplicaciones con el proxy

Ten en cuenta que muchas otras aplicaciones también pueden utilizar un proxy SOCKS. El navegador web es solo una de las más populares. Algunas aplicaciones tienen opciones de configuración para activar el servidor proxy. A otras les puede ayudar una herramienta auxiliar. Por ejemplo, proxychains permite ejecutar Microsoft RDP y otros a través de un proxy SOCKS.

localhost:~$ proxychains rdesktop $RemoteWindowsServer

Las opciones de configuración del proxy SOCKS se establecen en el archivo de configuración de proxychains.

Consejo: si usas escritorio remoto desde Linux a Windows, prueba el cliente FreeRDPEs una implementación más moderna que rdesktop, con una interacción mucho más fluida.

Uso de SSH a través de un proxy socks

Estás en una cafetería o en un hotel y debes utilizar un WiFi bastante poco fiable. Desde la laptop, iniciamos un proxy SSH localmente y establecemos un túnel SSH hacia la red doméstica en un Raspberry Pi local. Usando un navegador o aplicaciones configuradas para un proxy socks, podemos acceder a cualquier servicio de red en nuestra red doméstica o salir a internet a través de la conexión de casa. Todo entre tu laptop y el servidor doméstico (a través de Wi-Fi e internet hasta casa) está cifrado en el túnel SSH.

2. Túnel SSH (redirección de puertos)

En su forma más simple, un túnel SSH simplemente abre un puerto en tu 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

Analicemos el parámetro -L. Se puede ver como el lado local de escucha. Así, en el ejemplo anterior, el puerto 9999 se escucha en el lado de localhost y se redirige a través del puerto 80 en remoteserver. ¡Ten en cuenta que 127.0.0.1 se refiere a localhost en el servidor remoto!

Subamos un peldaño. En el siguiente ejemplo, los puertos de escucha se vinculan a otros nodos de la red local.

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

En estos ejemplos nos conectamos a un puerto en el servidor web, pero podría ser un servidor proxy o cualquier otro servicio TCP.

3. Túnel SSH a un host externo

Podemos usar los mismos parámetros para conectar un túnel desde un servidor remoto a otro servicio que se ejecute en un tercer sistema.

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

En este ejemplo, redirigimos el túnel desde remoteserver a un servidor web que está corriendo en 10.10.10.10. El tráfico desde remoteserver hacia 10.10.10.10 ya no está en el túnel SSH. El servidor web en 10.10.10.10 considerará a remoteserver como la fuente de las solicitudes web.

4. Túnel SSH inverso

Aquí configuramos un puerto de escucha en el servidor remoto que se conectará de regreso a un puerto local en nuestro localhost (o en 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 remoteserver al puerto 902 en nuestro cliente local.

5. Proxy SSH inverso

En este caso, configuramos un proxy socks en nuestra conexión SSH, sin embargo, el proxy escucha en el extremo remoto del servidor. Las conexiones a este proxy remoto ahora aparecen a través del túnel como tráfico desde nuestro localhost.

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

Solución de problemas con túneles SSH remotos

Si tiene problemas con las opciones remotas de SSH, verifique mediante netstat, a qué otras interfaces está conectado el puerto de escucha. Aunque en los ejemplos mencionamos 0.0.0.0, si el valor GatewayPorts en sshd_config está configurado en no, entonces el listener estará vinculado solo a localhost (127.0.0.1).

Advertencia de seguridad

Tenga en cuenta que al abrir túneles y proxies socks, los recursos de red internos pueden estar disponibles para redes poco confiables (¡como Internet!). Esto puede ser una grave amenaza de seguridad, así que asegúrese de entender lo que representa un listener y a qué tiene acceso.

6. Configuración de VPN a través de SSH

Un término común entre los especialistas en métodos de ataque (pentesters y otros) es "punto de apoyo en la red". Después de establecer una conexión en un sistema, este sistema se convierte en una puerta de enlace para un acceso adicional a la red. Un punto de apoyo que permite avanzar horizontalmente.

Para tal punto de apoyo, podemos usar un proxy SSH y proxychains, sin embargo, hay ciertas limitaciones. Por ejemplo, no podremos trabajar directamente con sockets, por lo que no podremos escanear puertos dentro de la red a través de Nmap SYN.

Al utilizar esta variante más avanzada de VPN, la conexión se reduce a nivel 3. Luego, simplemente podemos dirigir el tráfico a través del túnel utilizando el enrutamiento de red estándar.

El método utiliza ssh, iptables, interfaces tun y enrutamiento.

Primero hay que configurar estos parámetros en sshd_config. Dado que estamos realizando cambios en las interfaces tanto del sistema remoto como del cliente, necesitamos permisos de root en ambas partes.

PermitRootLogin yes
PermitTunnel yes

Luego establecemos la conexión SSH, utilizando un parámetro que solicita la inicialización de 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 añadirá 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 (ruta -n y ping 10.10.10.10).

Puedes enrutar cualquier subred a través de un host en el otro lado.

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

En el lado remoto, es necesario activar ip_forward y 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 a través de un túnel SSH en el nivel de red 3. Esto ya es una victoria.

Si surgen problemas, usa tcpdump y ping, para establecer la causa. Dado que estamos operando en el nivel 3, nuestros paquetes ICMP atravesarán este túnel.

7. Copiar 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 por defecto) de tu sistema en ~/.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 enlazar con otros comandos para una interfaz conveniente. Solo agrega el comando que deseas 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 se ejecuta en el sistema local después de que el log se descargó por el canal SSH. Si el archivo es grande, es más conveniente ejecutarlo grep en el lado remoto, simplemente encerrando ambos comandos en 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 remota de paquetes y visualización en Wireshark

Tomé uno de nuestros ejemplos de tcpdump. Úsalo para capturar paquetes de forma remota y mostrar el resultado directamente en la GUI de Wireshark local.

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

10. Copiar una carpeta local a un servidor remoto por SSH

Un bonito truco que comprime la carpeta usando bzip2 (este es el parámetro -j en el comando tar), y luego extrae el flujo 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 GUI remotas con reenvío SSH X11

Si en el cliente y el servidor remoto hay ‘X’, puedes ejecutar comandos GUI de forma remota, mostrando las ventanas en tu escritorio local. Esta función existe desde hace mucho tiempo, pero sigue siendo muy útil. Ejecuta un navegador web remoto o incluso la consola de VMware Workstation, como hago en este ejemplo.

localhost:~$ ssh -X remoteserver vmware

Se requiere una cadena X11Forwarding yes en el archivo sshd_config.

12. Copia remota de archivos usando rsync y SSH

rsync es mucho más conveniente scp, si se necesita una copia de seguridad periódica de un directorio, de gran cantidad de archivos o de archivos muy grandes. Hay una función de recuperación en caso de fallo de transmisión y copia solo de los archivos modificados, lo que ahorra tráfico y tiempo.

En este ejemplo se utiliza compresión gzip (-z) y el modo de archivo (-a), que incluye la copia recursiva.

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

13. SSH a través de la red Tor

La red anónima Tor puede tunelizar el tráfico SSH usando el comando torsocks. El siguiente comando canalizará el proxy ssh a través de Tor.

localhost:~$ torsocks ssh myuntracableuser@remoteserver

Torsocks utilizará el puerto 9050 en localhost para el proxy. Como siempre al usar Tor, es necesario verificar seriamente qué tráfico se está tunelizando y otros problemas de seguridad operativa (opsec). ¿A dónde van tus consultas DNS?

14. SSH a una instancia EC2

Para conectarte a una instancia EC2, necesitarás una clave privada. Descárgala (extensión .pem) desde el panel de control de Amazon EC2 y cambia los permisos (chmod 400 my-ec2-ssh-key.pem). Guarda la clave en un lugar seguro o colócala en tu carpeta ~/ .ssh /.

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

Parámetro , el intervalo entre el envío de paquetes. simplemente indica al cliente ssh que use esta clave. El archivo ~/.ssh/config es ideal para la configuración automática del uso de la clave al conectarse 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 te ahorrará algo de tiempo. Con vim los archivos se editan por scp en un solo comando. Este método simplemente crea un archivo localmente en /tmp, y luego lo copia de vuelta en cuanto lo hemos guardado de vim.

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

Nota: el formato es un poco diferente al habitual scp. Después del host hay un doble //. Esto es un enlace al camino absoluto. Una barra significa un camino relativo a la carpeta de inicio usuarios.

**advertencia** (netrw) no puede determinar el método (formato: protocolo://[usuario@]hostname[:puerto]/[ruta])

Si ves este error, revisa dos veces el formato del comando. Normalmente significa un error de sintaxis.

16. Montando SSH remoto como una carpeta local con SSHFS

Usando sshfs — cliente de sistema de archivos ssh — podemos conectar un directorio local a una ubicación remota con todas las interacciones de archivos en una sesión cifrada ssh.

localhost:~$ apt install sshfs

En Ubuntu y Debian instalaremos el paquete sshfs, y luego simplemente montaremos la ubicación remota en nuestro sistema.

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

17. Multiplexión SSH con ControlPath

Por defecto, al haber una conexión existente a un servidor remoto a través de ssh una segunda conexión a través de ssh o scp se establece una nueva sesión con autenticación adicional. La opción ControlPath permite usar la sesión existente para todas las siguientes conexiones. Esto acelera significativamente el proceso: el efecto se nota incluso en una red local, y mucho más al conectarse a recursos remotos.

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

ControlPath especifica el socket para verificar nuevas conexiones en busca de una sesión activa ssh. La última opción significa que incluso después de salir de la consola, la sesión existente se mantendrá abierta durante 10 minutos, por lo que durante ese tiempo podrás volver a conectarte a través del socket existente. Para más información, consulta la ayuda ssh_config man.

18. Video en streaming por SSH con VLC y SFTP

Incluso los usuarios antiguos de ssh y vlc (Video Lan Client) no siempre conocen esta útil opción cuando realmente necesitan ver un video a través de la red. En la configuración File | Open Network Stream del programa vlc se puede introducir la ubicación como sftp://. Si se requiere contraseña, aparecerá un aviso.

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

19. Autenticación de dos factores

La misma autenticación de dos factores que se usa para tu cuenta bancaria o cuenta de Google se aplica al servicio SSH.

Por supuesto, ssh originalmente tiene la función de autenticación de dos factores, que incluye una contraseña y una clave SSH. La ventaja de un token físico o de la aplicación Google Authenticator es que generalmente es un dispositivo físico diferente.

Consulta nuestra guía de 8 minutos sobre el uso de Google Authenticator y SSH.

20. Saltos de host con ssh y -J

Si debido a la segmentación de la red necesitas pasar por varios hosts ssh para llegar a la red de destino, el atajo -J te ahorrará tiempo.

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

Aquí lo principal es entender que esto no es similar al comando ssh host1, luego user@host1:~$ ssh host2 Y así sucesivamente. El parámetro -J utiliza astutamente 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, utilizamos nuestras claves de localhost, y la sesión desde localhost hasta host4 está completamente cifrada.

Para tal funcionalidad en ssh_config especifica la opción de configuración ProxyJump. Si a menudo tienes que saltar entre varios hosts, automatizar a través de la configuración ahorrará mucho tiempo.

21. Bloqueo de intentos de fuerza bruta de SSH con iptables

Cualquiera que haya administrado un servicio SSH y revisado los registros, sabe la cantidad de intentos de fuerza bruta que ocurren cada hora, cada día. Una forma rápida de reducir el ruido en los registros es mover SSH a un puerto no estándar. Realiza cambios en el archivo sshd_config con el parámetro de configuración Port##.

Con iptables también se pueden bloquear fácilmente los intentos de conexión al puerto al alcanzar un cierto umbral. Una forma sencilla de hacerlo es utilizar OSSEC, ya que no solo bloquea SSH, sino que realiza una serie de otras medidas de detección de intrusiones basadas en el nombre del host (HIDS).

22. Escape SSH para modificar el reenvío de puertos

Y nuestro último ejemplo ssh está destinado a modificar el reenvío de puertos sobre la marcha dentro de una sesión existente ssh. Imagina un escenario así. Estás profundamente dentro de la red; tal vez has saltado a través de media docena de hosts y necesitas un puerto local en tu estación de trabajo que esté redirigido a Microsoft SMB de un viejo sistema Windows 2003 (¿alguien recuerda ms08-67?).

Al presionar enter, intenta introducir en la consola ~C. Esta es una secuencia de control en la sesión que permite hacer modificaciones en la conexión existente.

localhost:~$ ~C
ssh> -h
Comandos:
      -L[bind_address:]port:host:hostport    Solicitar reenvío local
      -R[bind_address:]port:host:hostport    Solicitar reenvío remoto
      -D[bind_address:]port                  Solicitar reenvío dinámico
      -KL[bind_address:]port                 Cancelar reenvío local
      -KR[bind_address:]port                 Cancelar reenvío remoto
      -KD[bind_address:]port                 Cancelar reenvío dinámico
ssh> -L 1445:remote-win2k3:445
Redirigiendo puerto.

Aquí puedes ver que hemos redirigido nuestro puerto local 1445 al host Windows 2003, que descubrimos en la red interna. Ahora simplemente ejecuta msfconsole, y puedes proceder (suponiendo que planeas utilizar este host).

Conclusión

Estos ejemplos, consejos y comandos ssh deben ofrecer un punto de partida; información adicional sobre cada uno de los equipos y capacidades está disponible en las páginas de referencia (man ssh, man ssh_config, man sshd_config).

Siempre me ha fascinado la posibilidad de acceder a sistemas y ejecutar comandos desde cualquier parte del mundo. Al desarrollar tus habilidades con herramientas como ssh te volverás más efectivo en cualquier juego que juegues.

Fuente: habr.com

Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS 🔥 Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS | ProHoster