Consejos prácticos, ejemplos y túneles SSH

Consejos prácticos, ejemplos y túneles SSH
Ejemplos practicos SSH, que llevará tus habilidades como administrador de sistemas remoto a un nuevo nivel. Los comandos y consejos ayudarán no solo a usar SSH, pero también navegar por la red de forma más competente.

Conociendo algunos trucos ssh útil para cualquier administrador de sistemas, ingeniero de redes o especialista en seguridad.

Ejemplos prácticos de SSH

  1. Proxy de calcetines SSH
  2. Túnel SSH (reenvío de puertos)
  3. Túnel SSH al tercer host
  4. Túnel SSH inverso
  5. Proxy inverso SSH
  6. Instalación de VPN sobre SSH
  7. Copiar una 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 GUI remotas con reenvío SSH X11
  12. Copia remota de archivos usando rsync y SSH
  13. SSH sobre la red Tor
  14. SSH a instancia EC2
  15. Editar archivos de texto usando VIM a través de ssh/scp
  16. Montar SSH remoto como carpeta local con SSHFS
  17. Multiplexación SSH con ControlPath
  18. Transmita video a través de SSH usando VLC y SFTP
  19. Autenticación de dos factores
  20. Saltar hosts con SSH y -J
  21. Bloquear intentos de fuerza bruta SSH usando iptables
  22. SSH Escape para cambiar el reenvío de puertos

Lo básico primero

Analizando la línea de comando SSH

El siguiente ejemplo utiliza parámetros comunes que se encuentran a menudo al conectarse a un servidor remoto. SSH.

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

  • -v: La salida de depuración es especialmente útil al analizar problemas de autenticación. Se puede utilizar varias veces para mostrar información adicional.
  • - p 22: puerto de conexión a un servidor SSH remoto. No es necesario especificar 22, porque este es el valor predeterminado, pero si el protocolo está en algún otro puerto, lo especificamos usando el parámetro -p. El puerto de escucha se especifica en el archivo. sshd_config en el formato Port 2222.
  • -C: Compresión para conexión. Si tiene una conexión lenta o ve 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, el valor predeterminado será el nombre de usuario de la cuenta en la que ha iniciado sesión actualmente (~$whoami). El usuario también se puede especificar usando el parámetro -l.
  • remoteserver: nombre del host al que conectarse ssh, puede ser un nombre de dominio completo, una dirección IP o cualquier host en el archivo de hosts local. Para conectarse a un host que admita IPv4 e IPv6, puede agregar el parámetro a la línea de comando -4 o -6 para una adecuada resolución.

Todos los parámetros anteriores son opcionales excepto 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. Valor por defecto ~/.ssh/config, pero se puede definir como un parámetro para una opción -F.

Host *
     Port 2222

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

Hay dos entradas de host en el archivo de configuración ssh de ejemplo anterior. El primero significa todos los hosts, todos usando el parámetro de configuración Puerto 2222. El segundo dice que para el host servidor remoto Se debe utilizar un nombre de usuario, puerto, FQDN y IdentityFile diferentes.

Un archivo de configuración puede ahorrar mucho tiempo de escritura al permitir que la configuración avanzada se aplique automáticamente 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 conexión ssh cifrada. Consulte a continuación un ejemplo del uso estándar de los comandos scp y sftp. Tenga en cuenta que muchas de las opciones de ssh también se aplican a estos comandos.

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

En este ejemplo el archivo mipic.png copiado a servidor remoto a la carpeta /medios/datos y renombrado a mipic_2.png.

No se olvide de la diferencia en el parámetro del puerto. Aquí es donde mucha gente queda atrapada cuando lanzan scp desde la línea de comando. Aquí está el parámetro del puerto. -PY no -p, ¡como en un cliente ssh! Lo olvidarás, pero no te preocupes, todo el mundo olvida.

Para aquellos que están familiarizados con la consola. ftp, muchos de los comandos son similares en sftp. Tu puedes hacer empuje, poner и lscomo el corazón desea.

sftp neo@remoteserver

Ejemplos practicos

En muchos de estos ejemplos, los resultados se pueden lograr utilizando diferentes métodos. Como en todos nuestros libros de texto y ejemplos, se da preferencia a ejemplos prácticos que simplemente hacen su trabajo.

1. Proxy de calcetines SSH

La función SSH Proxy es la número 1 por una buena razón. Es más poderoso de lo que muchos creen y le brinda acceso a cualquier sistema al que tenga acceso el servidor remoto, utilizando prácticamente cualquier aplicación. Un cliente ssh puede canalizar el tráfico a través de un proxy SOCKS con un simple comando. Es importante comprender que el tráfico a sistemas remotos provendrá de un servidor remoto, esto 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 un 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 en todas las interfaces, incluidas ethernet o wifi, esto permitirá que otras aplicaciones (navegadores, etc.) en nuestra red se conecten al servicio proxy a través del proxy ssh Socks.

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 | Básico | Configuración de la red. Especifique la dirección IP y el puerto para conectarse.

Consejos prácticos, ejemplos y túneles SSH

Tenga en cuenta la opción en la parte inferior del formulario para que las solicitudes de DNS de su navegador también pasen por un proxy SOCKS. Si está utilizando un servidor proxy para cifrar el tráfico web en su red local, probablemente desee seleccionar esta opción para que las solicitudes de DNS se canalicen a través de la conexión SSH.

Activando el proxy de calcetines en Chrome

Al iniciar Chrome con ciertos parámetros de línea de comando se habilitará el proxy de calcetines, además de canalizar las solicitudes de DNS desde el navegador. Confía pero comprueba. Usar tcpdump para comprobar que las consultas DNS ya no son visibles.

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

Usar otras aplicaciones con un proxy

Tenga en cuenta que muchas otras aplicaciones también pueden utilizar proxies de calcetines. El navegador web es simplemente el más popular de todos. Algunas aplicaciones tienen opciones de configuración para habilitar un servidor proxy. Otros necesitan un poco de ayuda con un programa de ayuda. Por ejemplo, cadenas de proxy le permite ejecutar un proxy de calcetines Microsoft RDP, etc.

localhost:~$ proxychains rdesktop $RemoteWindowsServer

Los parámetros de configuración del proxy de Socks se establecen en el archivo de configuración de proxychains.

Sugerencia: ¿si utiliza un escritorio remoto desde Linux en Windows? prueba el cliente FreeRDP. Esta es una implementación más moderna que rdesktop, con una experiencia mucho más fluida.

Opción de usar SSH a través del proxy de calcetines

Estás sentado en una cafetería o en un hotel y te ves obligado a utilizar una conexión WiFi poco fiable. Lanzamos un proxy ssh localmente desde una computadora portátil e instalamos un túnel ssh en la red doméstica en un Rasberry Pi local. Usando un navegador u otras aplicaciones configuradas para un proxy de calcetines, podemos acceder a cualquier servicio de red en nuestra red doméstica o acceder a Internet a través de nuestra conexión doméstica. Todo lo que hay entre su computadora portátil y su servidor doméstico (a través de Wi-Fi e Internet hasta su hogar) está encriptado en un 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

Veamos el parámetro. -L. Puede considerarse como el lado local de la escucha. Entonces, en el ejemplo anterior, el puerto 9999 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 el escalón. El siguiente ejemplo comunica puertos de escucha con otros hosts en 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 del servidor web, pero podría 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, redirigimos un túnel desde un servidor remoto a un servidor web que se ejecuta en 10.10.10.10. Tráfico desde el servidor remoto a 10.10.10.10 ya no está en el túnel SSH. El servidor web en 10.10.10.10 considerará el servidor remoto como la fuente de las solicitudes web.

4. Túnel SSH inverso

Aquí configuraremos un 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

Esta sesión SSH establece una conexión desde el puerto 1999 en el servidor remoto al puerto 902 en nuestro cliente local.

5. Proxy inverso SSH

En este caso, estamos configurando un proxy de calcetines en nuestra conexión ssh, pero el proxy escucha en el extremo remoto del servidor. Las conexiones a este proxy remoto ahora aparecen desde el túnel como tráfico de nuestro host local.

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 el funcionamiento de las opciones SSH remotas, consulte con netstat, a qué otras interfaces está conectado el puerto de escucha. Aunque indicamos 0.0.0.0 en los ejemplos, pero si el valor Puertos de enlace в sshd_config ajustado a no, entonces el oyente estará vinculado únicamente 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 ser accesibles a redes que no son de confianza (como Internet). Esto puede suponer un grave riesgo para la seguridad, así que asegúrese de comprender quién es el oyente y a qué tiene acceso.

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

Un término común entre los especialistas en métodos de ataque (pentesters, etc.) es "un punto de apoyo en la red". Una vez que se establece una conexión en un sistema, ese sistema se convierte en la puerta de entrada para un mayor acceso a la red. Un punto de apoyo que le permite moverse en amplitud.

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

Al utilizar esta opción VPN más avanzada, la conexión se reduce a nivel 3. Luego 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 configurar estos parámetros en sshd_config. Dado que estamos realizando cambios en las interfaces de los sistemas cliente y remoto, Necesita derechos de root en ambos lados..

PermitRootLogin yes
PermitTunnel yes

Luego estableceremos una conexión ssh usando el 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 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 и ping 10.10.10.10).

Puede enrutar cualquier subred a través de un host del otro lado.

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

En el lado remoto debes 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 en la capa de red 3. Eso sí que es una victoria.

Si ocurre algún problema, use tcpdump и pingpara determinar la causa. Como estamos jugando en la capa 3, nuestros paquetes icmp pasarán por este túnel.

7. Copie la clave SSH (ssh-copy-id)

Hay varias formas de hacer esto, pero este comando ahorra tiempo al no copiar archivos manualmente. Simplemente copia ~/.ssh/id_rsa.pub (o la clave predeterminada) de su sistema a ~/.ssh/authorized_keys en un servidor remoto.

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

8. Ejecución remota de comandos (no interactiva)

El equipo ssh Se puede vincular a otros comandos para obtener una interfaz común y fácil de usar. Simplemente agregue el comando que desea ejecutar en el host remoto como último parámetro entre comillas.

localhost:~$ ssh remoteserver "cat /var/log/nginx/access.log" | grep badstuff.php

En este ejemplo grep ejecutado 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 ejecutarlo. 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 los nuestros ejemplos de tcpdump. Úselo para capturar paquetes de forma remota y mostrar los resultados directamente en la GUI local de Wireshark.

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

10. Copiar una carpeta local a un servidor remoto a través de SSH

Un buen truco que comprime una carpeta usando bzip2 (esta es la opción -j en el comando tar), y luego recupera la secuencia bzip2 por otro lado, creando una carpeta duplicada en el servidor remoto.

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

11. Aplicaciones GUI remotas con reenvío SSH X11

Si X está instalado en el cliente y en el servidor remoto, entonces puede ejecutar de forma remota un comando GUI con una ventana en su escritorio local. Esta función existe desde hace mucho tiempo, pero sigue siendo muy útil. Inicie un navegador web remoto o incluso la consola VMWawre Workstation como lo hago en este ejemplo.

localhost:~$ ssh -X remoteserver vmware

Cadena requerida X11Forwarding yes en archivo sshd_config.

12. Copia remota de archivos usando rsync y SSH

rsync mucho más conveniente scp, si necesita copias de seguridad periódicas de un directorio, una gran cantidad de archivos o archivos muy grandes. Existe una función para recuperarse de una falla en la transferencia y copiar solo los archivos modificados, lo que ahorra tráfico y tiempo.

Este ejemplo utiliza compresión. gzip (-z) y modo de archivo (-a), que permite la copia recursiva.

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

13. SSH a través de la red Tor

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

localhost:~$ torsocks ssh myuntracableuser@remoteserver

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

14. SSH a instancia EC2

Para conectarse a una instancia EC2, necesita una clave privada. 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 colóquela en su propia carpeta. ~/.ssh/.

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

Parámetro -i simplemente le dice al cliente ssh que use esta clave. Archivo ~/.ssh/config Ideal para configurar automáticamente el uso de claves al conectarse a un host ec2.

Host my-ec2-public
   Hostname ec2???.compute-1.amazonaws.com
   User ubuntu
   IdentityFile ~/.ssh/my-ec2-key.pem

15. Editar archivos de texto usando VIM a través de ssh/scp

para todos los amantes vim Este consejo le ahorrará algo de tiempo. Mediante el uso vim Los archivos se editan a través de scp con un solo comando. Este método simplemente crea el archivo localmente en /tmpy luego lo copia nuevamente una vez que lo guardamos vim.

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

Nota: el formato es ligeramente diferente al habitual. scp. Después del host tenemos doble //. Esta es una referencia de ruta absoluta. Una barra inclinada indicará una ruta relativa a su carpeta de inicio users.

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

Si ve este error, verifique dos veces el formato del comando. Esto suele significar un error de sintaxis.

16. Montar un SSH remoto como una carpeta local con SSHFS

Por medio de sshfs - cliente del 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

Instale el paquete en Ubuntu y Debian sshfsy luego simplemente monte la ubicación remota en nuestro sistema.

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

17. Multiplexación SSH con ControlPath

De forma predeterminada, si existe una conexión a un servidor remoto usando ssh segunda conexión usando ssh o scp establece una nueva sesión con autenticación adicional. Opción ControlPath permite que la sesión existente se utilice para todas las conexiones posteriores. Esto acelerará significativamente el proceso: el efecto se nota incluso en una red local, y más aún cuando se conecta 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 si hay nuevas conexiones para ver si hay una sesión activa ssh. 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 podrá volver a conectarse al socket existente. Para obtener más información, consulte la ayuda. ssh_config man.

18. Transmita video a través de SSH usando VLC y SFTP

Incluso los usuarios más antiguos ssh и vlc (Video Lan Client) no siempre conoce esta conveniente opción cuando realmente necesita ver un video a través de la red. En la configuración de Archivo | Flujo de red abierta programa vlc puedes ingresar la ubicación como sftp://. Si se requiere una contraseña, aparecerá un mensaje.

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

19. Autenticación de dos factores

Se aplica la misma autenticación de dos factores que su cuenta bancaria o cuenta de Google al servicio SSH.

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

Vea nuestra guía de 8 minutos para usando Google Authenticator y SSH.

20. Saltar de host con ssh y -J

Si la segmentación de la red significa que tiene que saltar a través de varios hosts ssh para llegar a la red de destino final, el atajo -J le ahorrará tiempo.

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

Lo principal que hay que entender aquí es que esto no es lo mismo que el comando ssh host1entonces user@host1:~$ ssh host2 etc. La opción -J utiliza inteligentemente el reenvío para forzar a localhost a establecer una sesión con el siguiente host de la cadena. Entonces, en el ejemplo anterior, nuestro localhost está autenticado en host4. Es decir, se utilizan nuestras claves de localhost y la sesión de localhost a host4 está completamente encriptada.

Para tal posibilidad en ssh_config especificar la opción de configuración ProxyJump. Si tiene que pasar por varios hosts con regularidad, la automatización a través de la configuración le ahorrará mucho tiempo.

21. Bloquee los intentos de fuerza bruta SSH usando iptables

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

Con iptables También puede bloquear fácilmente los intentos de conectarse a un puerto al alcanzar un cierto umbral. Una manera fácil de hacer esto es usar OSSEC, porque no solo bloquea SSH, sino que también realiza muchas otras medidas de detección de intrusiones basadas en nombres de host (HIDS).

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

Y nuestro último ejemplo ssh diseñado para cambiar el reenvío de puertos sobre la marcha dentro de una sesión existente ssh. Imagínese este escenario. Estás en lo profundo de la red; tal vez saltó a más de media docena de hosts y necesita un puerto local en la estación de trabajo que se reenvía a Microsoft SMB de un antiguo sistema Windows 2003 (¿alguien recuerda ms08-67?).

Haciendo clic enter, intenta entrar en la consola ~C. Esta es una secuencia de control de sesión que permite realizar cambios en una conexión 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.

Aquí puede ver que hemos reenviado nuestro puerto local 1445 a un host de Windows 2003 que encontramos en la red interna. Ahora solo corre msfconsole, y podrá continuar (suponiendo que planee utilizar este host).

Terminación

Estos ejemplos, consejos y comandos. ssh debería dar un punto de partida; Más información sobre cada uno de los comandos y capacidades está disponible en las páginas de manual (man ssh, man ssh_config, man sshd_config).

Siempre me ha fascinado la capacidad de acceder a sistemas y ejecutar comandos en cualquier parte del mundo. Desarrollando tus habilidades con herramientas como ssh Serás más efectivo en cualquier juego que juegues.

Fuente: habr.com

Añadir un comentario