
Esempi pratici , che porteranno le tue capacità di amministratore di sistema remoto a un nuovo livello. Comandi e suggerimenti aiuteranno non solo a utilizzare SSH, ma anche a muoversi più consapevolmente nella rete.
Conoscere alcuni trucchi ssh è utile per qualsiasi amministratore di sistema, ingegnere di rete o specialista della sicurezza.
Esempi pratici di SSH
Iniziamo dalle basi
Analisi della riga di comando SSH
Nell'esempio seguente vengono utilizzati parametri comuni, frequentemente riscontrati durante la connessione a un server remoto SSH.
localhost:~$ ssh -v -p 22 -C neo@remoteserver-v: l'output delle informazioni di debug è particolarmente utile per analizzare i problemi di autenticazione. Può essere usato più volte per fornire ulteriori informazioni.- p 22: porta per connettersi a un server remoto SSH. 22 non è necessario specificarlo, poiché è il valore predefinito, ma se il protocollo è su un'altra porta, lo indichiamo con il parametro-p. La porta di ascolto è specificata nel filesshd_confignel formatoPort 2222.-C: compressione per la connessione. Se hai una connessione lenta o stai visualizzando molto testo, questo potrebbe accelerare la comunicazione.neo@: la stringa prima del simbolo @ indica il nome utente per l'autenticazione sul server remoto. Se non lo indichi, verrà utilizzato per impostazione predefinita il nome utente dell'account con cui sei attualmente connesso (~$ whoami). Puoi anche specificare l'utente con il parametro-l.remoteserver: nome host a cui ci si connettessh, può essere un nome di dominio completo, un indirizzo IP o qualsiasi host nel file hosts locale. Per connettersi a un host che supporta sia IPv4 che IPv6, è possibile aggiungere alla riga di comando un parametro-4o-6per una risoluzione corretta.
Tutti i parametri sopra elencati sono facoltativi, tranne remoteserver.
Utilizzo del file di configurazione
Anche se molti sono familiari con il file sshd_config, esiste anche un file di configurazione per il comando ssh. Il valore predefinito ~/.ssh/config, ma può essere impostato come parametro per l'opzione -F.
Host *
Port 2222
Host remoteserver
HostName remoteserver.thematrix.io
User neo
Port 2112
IdentityFile /home/test/.ssh/remoteserver.private_keyNel file di configurazione ssh di esempio sopra, ci sono due record host. Il primo indica tutti gli host, per tutti si applica il parametro di configurazione Port 2222. Il secondo indica che per l'host remoteserver dovrebbe essere utilizzato un nome utente, una porta, un FQDN e un IdentityFile diversi.
Il file di configurazione può risparmiare molto tempo nella digitazione dei caratteri, permettendo di applicare automaticamente configurazioni avanzate durante la connessione a host specifici.
Copiare file tramite SSH usando SCP
Il client SSH viene fornito con altri due strumenti molto comodi per copiare file attraverso una connessione ssh crittografata. Di seguito è riportato un esempio dell'uso standard dei comandi scp e sftp. Si noti che molti parametri per ssh si applicano anche a questi comandi.
localhost:~$ scp mypic.png neo@remoteserver:/media/data/mypic_2.pngIn questo esempio il file mypic.png è stato copiato in remoteserver nella cartella /media/data ed è stato rinominato in mypic_2.png.
Non dimenticare la differenza nel parametro della porta. Su questo ci cascano molti che avviano scp dalla riga di comando. Qui il parametro della porta -P, e non -p, proprio come nel client ssh! Dimenticherai, ma non preoccuparti, tutti dimenticano.
Per coloro che sono familiari con la console ftp, molti dei comandi sono simili in supportano anch'essi il parametro. Puoi fare push, put e ls, come desideri.
sftp neo@remoteserverEsempi pratici
In molti di questi esempi è possibile ottenere il risultato con metodi diversi. Come in tutti i nostri e esempi, si dà la preferenza a esempi pratici che fanno semplicemente il loro lavoro.
1. Proxy socks SSH
La funzione SSH Proxy numero 1 per un motivo valido. È più potente di quanto molti pensino e ti dà accesso a qualsiasi sistema a cui ha accesso il server remoto, utilizzando praticamente qualsiasi applicazione. Il client ssh può tunnelare il traffico attraverso un server proxy SOCKS con un semplice comando. È importante capire che il traffico verso sistemi remoti proviene dal server remoto, come verrà indicato nei log del server 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/sshQui stiamo avviando un proxy SOCKS sulla porta TCP 8888, il secondo comando controlla che la porta sia attiva in ascolto. 127.0.0.1 indica che il servizio sta funzionando solo su localhost. Possiamo utilizzare un comando leggermente diverso per ascoltare tutte le interfacce, inclusi ethernet o wifi, il che consentirà ad altre applicazioni (browser, ecc.) nella nostra rete di connettersi al servizio proxy tramite il proxy SOCKS ssh.
localhost:~$ ssh -D 0.0.0.0:8888 user@remoteserverOra possiamo configurare il browser per connettersi al proxy SOCKS. In Firefox seleziona Impostazioni | Generale | Impostazioni di rete. Specifica l'indirizzo IP e la porta per la connessione.

Fai attenzione all'opzione in fondo al modulo affinché le richieste DNS del browser passino anche attraverso il proxy SOCKS. Se utilizzi un server proxy per crittografare il traffico web nella rete locale, vorrai sicuramente selezionare questa opzione affinché le richieste DNS vengano tunnelizzate attraverso la connessione SSH.
Attivazione del proxy SOCKS in Chrome
Avviare Chrome con specifici parametri della riga di comando attiva il proxy SOCKS, così come il tunneling delle richieste DNS dal browser. Fidati, ma verifica. Usa per controllare che le richieste DNS non siano più visibili.
localhost:~$ google-chrome --proxy-server="socks5://192.168.1.10:8888"Utilizzare altre applicazioni con il proxy
Ricorda che molte altre applicazioni possono utilizzare il proxy SOCKS. Il browser web è semplicemente il più popolare tra essi. Alcune applicazioni hanno opzioni di configurazione per attivare il server proxy. Altre necessitano di un piccolo aiuto tramite un programma ausiliario. Ad esempio, consente di avviare tramite proxy SOCKS Microsoft RDP e altro.
localhost:~$ proxychains rdesktop $RemoteWindowsServerLe opzioni di configurazione del proxy SOCKS vengono definite nel file di configurazione di proxychains.
Suggerimento: se utilizzi desktop remoto da Linux a Windows? Prova il client . Questa è un'implementazione più moderna rispetto a
rdesktop, con un'interazione molto più fluida.
Uso di SSH tramite un proxy socks
Se ti trovi in un caffè o in un hotel e sei costretto a usare un WiFi piuttosto inaffidabile. Avviamo localmente un proxy ssh dal laptop e stabilizziamo un tunnel ssh nella rete domestica su un Raspberry Pi locale. Utilizzando il browser o altre applicazioni configurate per il proxy socks, possiamo accedere a qualsiasi servizio di rete nella nostra rete domestica o navigare in Internet tramite la connessione domestica. Tutto tra il tuo laptop e il server domestico (via Wi-Fi e Internet fino a casa) è crittografato nel tunnel SSH.
2. Tunnel SSH (port forwarding)
Nella sua forma più semplice, un tunnel SSH apre semplicemente una porta nel tuo sistema locale, che si connette a un'altra porta all'altro capo del tunnel.
localhost:~$ ssh -L 9999:127.0.0.1:80 user@remoteserver Analizziamo il parametro -L. Può essere visto come il lato di ascolto locale. Pertanto, nell'esempio sopra, la porta 9999 viene ascoltata sul lato localhost e viene inoltrata tramite la porta 80 su remoteserver. Nota che 127.0.0.1 si riferisce al localhost sul server remoto!
Facciamo un passo avanti. Nell'esempio seguente, le porte di ascolto vengono collegate ad altri nodi della rete locale.
localhost:~$ ssh -L 0.0.0.0:9999:127.0.0.1:80 user@remoteserverIn questi esempi ci connettiamo a una porta su un server web, ma potrebbe essere un server proxy o qualsiasi altro servizio TCP.
3. Tunnel SSH verso un host esterno
Possiamo utilizzare gli stessi parametri per connettere un tunnel da un server remoto a un altro servizio in esecuzione su un terzo sistema.
localhost:~$ ssh -L 0.0.0.0:9999:10.10.10.10:80 user@remoteserverIn questo esempio, inoltriamo il tunnel da remoteserver al server web in esecuzione su 10.10.10.10. Il traffico da remoteserver a 10.10.10.10 non è più in un tunnel SSH. Il server web su 10.10.10.10 considererà remoteserver come origine delle richieste web.
4. Tunnel SSH inverso
Qui configuriamo una porta di ascolto sul server remoto, che si connetterà nuovamente a una porta locale sul nostro localhost (o su un altro sistema).
localhost:~$ ssh -v -R 0.0.0.0:1999:127.0.0.1:902 192.168.1.100 user@remoteserverIn questa sessione SSH viene stabilita una connessione dalla porta 1999 su remoteserver alla porta 902 sul nostro client locale.
5. Proxy inverso SSH
In questo caso, impostiamo un proxy socks sulla nostra connessione ssh, tuttavia il proxy ascolta all'estremità remota del server. Le connessioni a questo proxy remoto ora appaiono dal tunnel come traffico dal nostro localhost.
localhost:~$ ssh -v -R 0.0.0.0:1999 192.168.1.100 user@remoteserverRisoluzione dei problemi con i tunnel SSH remoti
Se riscontri problemi con le opzioni SSH remote, controlla usando netstat, a quali altre interfacce è connessa la porta in ascolto. Anche se nei nostri esempi abbiamo indicato 0.0.0.0, se il valore GatewayPorts in sshd_config è impostato su no, allora il listener sarà vincolato solo a localhost (127.0.0.1).
Avviso di sicurezza
Tieni presente che l'apertura di tunnel e proxy socks può consentire l'accesso a risorse di rete interne da reti non sicure (ad esempio, Internet!). Questo può rappresentare una seria minaccia alla sicurezza, quindi assicurati di capire cosa rappresenta il listener e a cosa ha accesso.
6. Installazione di VPN su SSH
Un termine comune tra gli specialisti di metodi d'attacco (pentester e simili) è "punto d'appoggio in rete". Dopo aver stabilito una connessione in un sistema, quel sistema diventa un gateway per ulteriori accessi alla rete. Un punto d'appoggio che consente di muoversi in larghezza.
Per un tale punto d'appoggio, possiamo utilizzare un proxy SSH e proxychains, ma ci sono alcune limitazioni. Ad esempio, non sarà possibile lavorare direttamente con i socket, quindi non potremo eseguire la scansione delle porte all'interno della rete attraverso SYN.
Utilizzando questa opzione VPN più avanzata, la connessione scende a livello 3. Poi possiamo semplicemente indirizzare il traffico attraverso il tunnel, usando la normale routizzazione di rete.
Il metodo utilizza ssh, iptables, interfacce tun e routizzazione.
Prima di tutto, dobbiamo impostare questi parametri in sshd_config. Poiché stiamo apportando modifiche alle interfacce sia del sistema remoto che di quello client, abbiamo bisogno dei diritti di root da entrambe le parti.
PermitRootLogin yes
PermitTunnel yesPoi stabiliremo la connessione ssh, utilizzando un parametro che richiede l'inizializzazione dei dispositivi tun.
localhost:~# ssh -v -w any root@remoteserver Ora dovremmo avere un dispositivo tun quando mostriamo le interfacce (# ip a). Il passo successivo aggiungerà indirizzi IP alle interfacce tunnel.
Lato client SSH:
localhost:~# ip addr add 10.10.10.2/32 peer 10.10.10.10 dev tun0
localhost:~# ip tun0 upLato server SSH:
remoteserver:~# ip addr add 10.10.10.10/32 peer 10.10.10.2 dev tun0
remoteserver:~# ip tun0 up Ora abbiamo un percorso diretto verso un altro host (route -n e ping 10.10.10.10).
È possibile instradare qualsiasi sottorete tramite un host dall'altro lato.
localhost:~# route add -net 10.10.10.0 netmask 255.255.255.0 dev tun0 Dall'altra parte deve essere abilitato 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 MASQUERADEBoom! VPN tramite tunnel SSH a livello 3. Questa è davvero una vittoria.
Se ci sono problemi, usa e ping, per identificare la causa. Poiché stiamo operando a livello 3, i nostri pacchetti icmp passeranno attraverso questo tunnel.
7. Copia della chiave SSH (ssh-copy-id)
Ci sono diversi modi per farlo, ma questo comando fa risparmiare tempo evitando di copiare i file manualmente. Copia semplicemente ~/.ssh/id_rsa.pub (o la chiave predefinita) dal tuo sistema in ~/.ssh/authorized_keys sul server remoto.
localhost:~$ ssh-copy-id user@remoteserver
8. Esecuzione remota di comandi (non interattivo)
Il comando ssh può essere combinato con altri comandi per un'interfaccia comoda. Aggiungi semplicemente il comando che desideri eseguire sull'host remoto come ultimo parametro tra virgolette.
localhost:~$ ssh remoteserver "cat /var/log/nginx/access.log" | grep badstuff.php In questo esempio grep viene eseguito sul sistema locale dopo che il log è stato scaricato tramite il canale ssh. Se il file è grande, è più comodo eseguire grep dall'altra parte, racchiudendo entrambe le comandi tra virgolette doppie.
Un altro esempio esegue la stessa funzione di ssh-copy-id dal esempio 7.
localhost:~$ cat ~/.ssh/id_rsa.pub | ssh remoteserver 'cat >> .ssh/authorized_keys'
9. Acquisizione remota di pacchetti e visualizzazione in Wireshark
Ho preso uno dei nostri . Usalo per acquisire pacchetti da remoto con il risultato direttamente nell'interfaccia grafica di Wireshark locale.
:~$ ssh root@remoteserver 'tcpdump -c 1000 -nn -w - not port 22' | wireshark -k -i -
10. Copia di una cartella locale su un server remoto tramite SSH
Un bel trucco che comprime la cartella utilizzando bzip2 (questo è il parametro -j nel comando tar), e poi estrae lo stream bzip2 dall'altra parte, creando un duplicato della cartella sul server remoto.
localhost:~$ tar -cvj /datafolder | ssh remoteserver "tar -xj -C /datafolder"
11. Applicazioni GUI remote con inoltro SSH X11
Se sul client e sul server remoto sono installati gli "X", puoi eseguire comandi GUI da remoto, visualizzando la finestra sul tuo desktop locale. Questa funzione esiste da tempo, ma è ancora molto utile. Esegui un browser web remoto o anche la console di VMware Workstation, come faccio in questo esempio.
localhost:~$ ssh -X remoteserver vmware È richiesta una stringa X11Forwarding yes nel file sshd_config.
12. Copia remota di file utilizzando rsync e SSH
rsync è molto più comodo scp, se è necessaria una copia di sicurezza periodica di una directory, un gran numero di file o file molto grandi. Qui c'è una funzione di ripristino dopo un'interruzione del trasferimento e copia solo dei file modificati, che salva traffico e tempo.
In questo esempio viene utilizzata la compressione gzip (-z) e la modalità archivio (-a), che include la copia ricorsiva.
:~$ rsync -az /home/testuser/data remoteserver:backup/
13. SSH attraverso la rete Tor
La rete anonima Tor può tunnelizzare il traffico SSH con il comando torsocks. Il comando seguente passerà un proxy ssh attraverso Tor.
localhost:~$ torsocks ssh myuntracableuser@remoteserverutilizzerà per il proxy la porta 9050 su localhost. Come sempre quando si utilizza Tor, è necessario controllare attentamente quale traffico viene tunnelizzato e altri problemi di sicurezza operativa (opsec). Dove vanno le tue richieste DNS?
14. SSH a un'istanza EC2
Per connettersi a un'istanza EC2 è necessaria una chiave privata. Scaricala (con estensione .pem) dalla console di gestione di Amazon EC2 e modifica le autorizzazioni (chmod 400 my-ec2-ssh-key.pem). Conserva la chiave in un luogo sicuro o inseriscila nella tua cartella ~/ .ssh /.
localhost:~$ ssh -i ~/ .ssh /my-ec2-key.pem ubuntu@my-ec2-public Parametro -i indica semplicemente al client ssh di utilizzare questa chiave. Il file ~/.ssh/config è perfetto per configurazioni automatiche che utilizzano la chiave per connettersi all'host ec2.
Host my-ec2-public
Hostname ec2???.compute-1.amazonaws.com
User ubuntu
IdentityFile ~/ .ssh /my-ec2-key.pem
15. Modifica di file di testo con VIM tramite ssh/scp
Per tutti gli amanti vim questo consiglio farà risparmiare un po' di tempo. Con vim i file possono essere modificati tramite scp con un solo comando. Questo metodo crea semplicemente un file localmente in /tmp, e poi lo copia di nuovo non appena lo abbiamo salvato da vim.
localhost:~$ vim scp://user@remoteserver//etc/hosts Nota: il formato è leggermente diverso dal normale scp. Dopo l'host abbiamo una doppia //. Questo è un riferimento al percorso assoluto. Uno slash significherà un percorso relativo alla cartella home users.
**warning** (netrw) cannot determine method (format: protocol://[user@]hostname[:port]/[path])Se vedi questo errore, controlla due volte il formato del comando. Di solito significa un errore di sintassi.
16. Montare SSH remoto come cartella locale con SSHFS
Utilizzando sshfs — client del filesystem ssh — possiamo collegare una directory locale a una posizione remota con tutte le interazioni dei file in una sessione crittografata ssh.
localhost:~$ apt install sshfs Su Ubuntu e Debian installiamo il pacchetto sshfs, e poi semplicemente montiamo la posizione remota sul nostro sistema.
localhost:~$ sshfs user@remoteserver:/media/data ~/data/
17. Multiplexing SSH con ControlPath
Per impostazione predefinita, se esiste una connessione attiva a un server remoto tramite ssh la seconda connessione tramite ssh o scp stabilisce una nuova sessione con autenticazione aggiuntiva. L'opzione ControlPath consente di utilizzare la sessione esistente per tutte le successive connessioni. Ciò accelera notevolmente il processo: l'effetto è visibile anche in una rete locale, tanto più quando ci si collega a risorse remote.
Host remoteserver
HostName remoteserver.example.org
ControlMaster auto
ControlPath ~/.ssh/control/%r@%h:%p
ControlPersist 10m Il ControlPath indica il socket da utilizzare per verificare le nuove connessioni alla ricerca di una sessione attiva ssh. L'ultima opzione significa che anche dopo aver lasciato la console, la sessione esistente rimarrà aperta per 10 minuti, in modo da poter riconnettersi tramite il socket esistente in quel periodo. Per ulteriori informazioni, consultare la guida ssh_config man.
18. Streaming video via SSH con VLC e SFTP
Anche gli utenti di vecchia data ssh e vlc (Video Lan Client) non sempre conoscono questa comoda opzione, quando è necessario guardare un video in rete. Nelle impostazioni File | Apri flusso di rete programmi vlc puoi inserire la posizione come sftp://. Se è richiesta una password, verrà visualizzata una richiesta.
sftp://remoteserver//media/uploads/myvideo.mkv
19. Autenticazione a due fattori
La stessa autenticazione a due fattori che hai per il tuo conto bancario o l'account Google si applica al servizio SSH.
Certo, ssh inizialmente ha una funzione di autenticazione a due fattori, che comprende una password e una chiave SSH. Il vantaggio di un token hardware o dell'app Google Authenticator è che generalmente si tratta di un altro dispositivo fisico.
Vedi la nostra guida di 8 minuti su .
20. Salti tra host con ssh e -J
Se a causa della segmentazione della rete è necessario passare attraverso più host ssh per arrivare alla rete di destinazione finale, l'abbreviazione -J ti farà risparmiare tempo.
localhost:~$ ssh -J host1,host2,host3 user@host4.internal Qui è importante capire che non è equivalente al comando ssh host1, quindi user@host1:~$ ssh host2 e così via. Il parametro -J sfrutta astutamente il forwarding per far sì che localhost stabilisca una sessione con l'host successivo nella catena. Così, nell'esempio di cui sopra, il nostro localhost si autentica su host4. In altre parole, utilizziamo le nostre chiavi localhost e la sessione da localhost a host4 è completamente crittografata.
Per questa funzionalità in ssh_config specifica l'opzione di configurazione ProxyJump. Se devi passare frequentemente attraverso più host, automatizzare tramite la configurazione ti farà risparmiare un sacco di tempo.
21. Blocco dei tentativi di brute force SSH con iptables
Chiunque abbia gestito un servizio SSH e controllato i log sa quante tentativi di brute force avvengono ogni ora, ogni giorno. Un modo rapido per ridurre il rumore nei log è spostare SSH su una porta non standard. Apporta modifiche al file sshd_config utilizzando il parametro di configurazione Port##.
Utilizzando iptables è anch'esso facilmente bloccabile quando si raggiunge una certa soglia. Un modo semplice per farlo è usare , poiché non solo blocca SSH, ma implementa una serie di misure di rilevamento delle intrusioni basate sul nome dell'host (HIDS).
22. SSH Escape per modificare il port forwarding
E il nostro ultimo esempio ssh è progettato per modificare il port forwarding al volo all'interno di una sessione esistente ssh. Immagina questo scenario. Sei in profondità in una rete; forse hai saltato attraverso una mezza dozzina di host e hai bisogno di una porta locale sulla tua workstation reindirizzata a Microsoft SMB di un vecchio sistema Windows 2003 (qualcuno ricorda ms08-67?).
Premendo enter, prova a digitare nella console ~C. Questa è una sequenza di controllo nella sessione che permette di apportare modifiche alla connessione esistente.
localhost:~$ ~C
ssh> -h
Comandi:
-L[bind_address:]port:host:hostport Richiesta di forwarding locale
-R[bind_address:]port:host:hostport Richiesta di forwarding remoto
-D[bind_address:]port Richiesta di forwarding dinamico
-KL[bind_address:]port Annulla forwarding locale
-KR[bind_address:]port Annulla forwarding remoto
-KD[bind_address:]port Annulla forwarding dinamico
ssh> -L 1445:remote-win2k3:445
Porta in forwarding. Qui puoi vedere che abbiamo reindirizzato la nostra porta locale 1445 all'host Windows 2003 che abbiamo trovato nella rete interna. Ora basta avviare msfconsole, e si può andare avanti (supponendo che tu stia pianificando di utilizzare questo host).
Conclusione
Questi esempi, consigli e comandi ssh devi fornire un punto di partenza; ulteriori informazioni su ciascuna delle squadre e le opportunità sono disponibili nelle pagine di riferimento (man ssh, man ssh_config, man sshd_config).
Sono sempre stato affascinato dalla possibilità di accedere ai sistemi e di eseguire comandi da qualsiasi parte del mondo. Sviluppando le mie abilità con strumenti come ssh diventerai più efficace in qualsiasi gioco tu stia giocando.
Fonte: habr.com
