Tunnelling 3 / 4 (SSH Tunnelling)

Libor Bešenyi  /  31. 01. 2007, 00:00

Ukážeme si, ako sa dá služba prepašovať v SSH do vnútra aj vonku.

SSH Tunnelling, alebo ako pašovať službu v službe

            SSH je program, ktorý nahrádza známi program telnet. Je to preto, lebo telnet nedokáže prenášať údaje šifrovane a ak by niekto odchytával komunikáciu (typický útok MITM – Man in the Middle) a človek sa autorizoval na nejakú službu, login a heslo by boli v textovej podobe odosielane cez sieť a teda ľahko čitateľné.

            Preto vznikla služba SSH, ktorá pracuje na porte 22. Ma nahrádzať nielen telnet, ale aj napríklad rlogin, teda dá sa povedať, že sa jedná o šifrovaný príkazový riadok, ktorým sa dá ovládať vzdialený počítač. Tento popis vyplýva aj z názvu „Secure shell“.

            Keďže sa jedná o bezpečnú formu komunikácie, takmer všetky brány ju majú otvorenú. Ak sa pozrieme na prvý obrázok predchádzajúcej kapitoly o tunelovaní po demonštračnom príklade bude jasné, ako takýto „útok“ zrealizovať:

PuTTY

            V prvom rade si musíme downloadnúť program PuTTY napríklad z tohto miesta:

 

the.earth.li/~sgtatham/putty/latest/x86/putty.exe

 

Pozn.: Linuxáci majú zaintegrované pomôcky pre prácu s SSH v bežnej výbave a keďže tie pracujú cez príkazový riadok, majú omnoho väčšiu škálu funkcionality.

 

Predstavme si, že máme blokovaný prístup ku nejakým službám vo vnútri našej siete. Často sa stáva, že sú to DC++ porty. My sa však pozrieme na nejakú službu, za ktorú by ma nemuseli stíhať administrátori sietí za ktorými sedím :) Ale kto pochopí základom, dokáže tunelovať takmer všetko (len pozor na dvojkanálové FTP).

 

Príklad: Internátna brána nás nemá veľmi v láske a firewall ma nastavený tak, aby si nikto nemohol sťahovať poštu z protokolu POP3. Nebaví nás však webové rozhranie „Horde“ a tak sa snažíme vykorčuľovať z tejto šlamastiky. Keďže sa kapitola venuje SSH tunnellingu, je logické, že brána nebrzdí SSH komunikáciu. Tá je však prístupná na každej rozumnej sietí, pretože je šifrovaná a tak sa nejaví ako nebezpečenstvo pre vnútornú sieť. Ďalej potrebujeme počítač „vonku“, na ktorom máme spusteného SSH démona (áno, bude to pravdepodobne server s Unix like systémom). Takéto kontá bežne študenti dostávajú na školách, alebo dokonca priamo na Internátnych sieťach. Ak nie, šikovný človek požiada svojho kamaráta, ktorý spravuje nejaký server, aby mu to konto vytvoril. Tak, či onak, ku takémuto kontu nie je problém získať prístup.

Pri SSH protokole sa prihlasujeme klasickou autentifikáciu (login + heslo). Keďže sa jedná o nový protokol, bolo doň zaintegrovaných aj pár „bonusových“ funkcií. Medzi ne patrí aj práca s certifikátmi, teda dá sa autorizovať aj pomocou nami vygenerovaného certifikačného kľúča, ktorý si vzájomne so serverom vymeníme. Po prvom prihlásení si „nás“ server zapamätá a pri ďalších sa server bude správať priateľský a pustí nás do svojich útrob bez zbytočných rečí. Zapnime si PuTTY a začnime konečne pracovať. Privíta známe okno (PuTTY bude asi naším častým spoločníkom):


PuTTY
zväčšiť


Okno je rozdelené na dve vertikálne časti. Na ľavo máme možnosť nastavovania rôznych funkcií, ktoré si vo voľnom čase naštudujeme sami... Dnes nás bude zaujímať pole SessionSSH/Tunnels. Ak chceme vyskúšať naše konto, zadáme názov servera do poľa Host Name (or IP address) v pravej časti okna položky Session. Protokol necháme nastavený na SSH a prípadne zmeníme port, ak naše konto pracuje na inom, ako implicitnom porte 22. Klikneme na tlačidlo Open v dolnej ľavej časti obrazovky.

            Zobrazí sa spomínané hlásenie o výmene certifikačných kľúčov (neskôr pri konfigurácií poštového klienta pri zahájení presmerovaného sťahovania taktiež nabehne okno o tom, že preberáme certifikát). Každý server, má pridelený svoj kľúč a tak sa nás služba spýta, či chceme komunikovať práve s ním a nie s niekým, kto sa nám „podvrhol“ po ceste. Odklikneme hlásenie (ktoré sa už nebude zobrazovať pri ďalšom prihlásení ku tomuto serveru), autentifikujeme sa a sme pripravení pracovať s SSH. Ak všetko funguje ako na dolnom obrázku, začíname tunelovať!


Príkazový riadok SSH
Zväčšiť


Prenášame zakázanú službu z Internetu do vnútra LAN

            Vráťme sa ku nášmu demonštračnému problému so „zlým“ adminom a zakázanou službou vonku na Internete POP3. Musíme mať predstavu, ako ju prepašovať do vnútra. SSH umožňuje elegantné riešenie, ktoré sa najlepšie vyčíta z obrázka:


Pašovanie služby do vnútra LAN
Zväčšiť


            Možno sa to zdá komplikované, ale je to triviálne. Server, na ktorom máme konto, (ten, čo je „vonku“ na Internete), proste poštu ktorú chceme vyzdvihnúť vyzdvihne sám, pošle ju cez SSH port 22 a tento port urobí akísi „obraz“ vonkajšej služby na lokálnom počítači! Vytvoríme teda zdanie, že port, ktorý je na poštovom servery sa bude javiť akoby bol nainštalovaný priamo na našom stroji!

            Ale ako to spraviť? Ešte jednoduchšie... Spustíme si PuTTY a prepneme sa v ľavej časti okna do položky tunel. Ako Source port (už v pravej časti) uvedieme číslo 110, bude to číslo, ktoré sa bude vytvárať na našej strane – teda na tomto čísle sa bude javiť služba poštového servera ako „vlastná“. Do poľa Destination zadáme adresu nášho poštového klienta (buď IP, alebo podľa DNS viď prvú kapitolu). Za adresou napíšeme ešte dvojbodku a číslo portu, ktorý chceme presmerovať do vnútra. POP3 je ako vieme na porte 110. Takže celý riadok môže vyzerať takto: devnet.sk:110. Stlačíme tlačidlo Add a takto sme pridali informáciu o tomto forwardovaní, ktoré sa nám zobrazilo v listboxe nad miestom, kde sme vypĺňali polia:


PuTTY
Zväčšiť


Vráťme sa do okna Session a zahájme reláciu (sedenie), ako sme si to skúšali na začiatku práce s programom. Musím však upozorniť, že ak sme uložili reláciu a spustíme práve tú, vynuluje sa záznam o forwardovaní, ktorý sme práve nastavili, lebo sme celú reláciu neuložili s týmto nastavením! Takže pre istotu, znova zadajme názov servera, kde máme SSH konto. Prihlásime sa ako pred tým, s tým, že pokiaľ necháme otvorené okno (zapnutú reláciu), máme vytvorený tunel, o ktorom na prvý pohľad nevieme! Tiež by som upozornil, že ak dlhšie pracujeme s otvorený shellom, môže sa stať, že sa relácia zruší, pretože pri nečinnosti (zdanlivej) na konzole, sa vykoná „time out“.

            Teraz by to chcelo dôkaz, že? OK (nezabúdajme, že spojenie SSH musíme nechať otvorené). Ešte sme si nepovedali o systémovom príkaze netstat. Tak je na čase. Určite aj vás neraz zaujímalo, aké porty sú práve otvorené práve na našom lokálnom stroji. Vieme, že keď komunikujeme so svetom, otvárame aj mi port, cez ktorý vysielame požiadavky na port servera. Teda by sa dalo povedať, že sa jedná o „klientsky“ port. Šupni sa do príkazového riadku a napíšme príkaz netstat –a a dostaneme výpis portov, podobný tomuto:

 

Microsoft Windows XP [Verzia 5.1.2600]

(C) Copyright 1985-2001 Microsoft Corp.

 

C:Documents and Settingsroot>netstat -a

 

Aktívne pripojenia

 

Protokol Miestna adresa         Cudzia adresa          Stav

  TCP    server:epmap           server:0               LISTENING

  TCP    server:microsoft-ds    server:0               LISTENING

  TCP    server:1027            server:0               LISTENING

  TCP    server:1035            server:0               LISTENING

  TCP    server:3306            server:0               LISTENING

  TCP    server:44334           server:0               LISTENING

  TCP    server:44501           server:0               LISTENING

  TCP    server:pop3            server:0               LISTENING

  TCP    server:1025            localhost:44334        ESTABLISHED

  TCP    server:1027            localhost:1029         ESTABLISHED

  TCP    server:1029            localhost:1027         ESTABLISHED

  TCP    server:1030            server:0               LISTENING

  TCP    server:1033            localhost:44334        ESTABLISHED

  TCP    server:1035            localhost:1037         ESTABLISHED

  TCP    server:1037            localhost:1035         ESTABLISHED

  TCP    server:1047            localhost:3306         ESTABLISHED

  TCP    server:3306            localhost:1047         ESTABLISHED

  TCP    server:4693            localhost:4694         ESTABLISHED

  TCP    server:4694            localhost:4693         ESTABLISHED

  TCP    server:10110           server:0               LISTENING

  TCP    server:44334           localhost:1025         ESTABLISHED

  TCP    server:44334           localhost:1033         ESTABLISHED

  TCP    server:netbios-ssn     server:0               LISTENING

  TCP    server:5016            XXX  CLOSE_WAIT

  TCP    server:5129            XXX:22  ESTABLISHED

 

  TCP    server:netbios-ssn     server:0               LISTENING

  UDP    server:microsoft-ds    *:*

  UDP    server:isakmp          *:*

  UDP    server:1026            *:*

  UDP    server:1028            *:*

  UDP    server:1032            *:*

  UDP    server:1034            *:*

  UDP    server:1036            *:*

  UDP    server:3850            *:*

  UDP    server:4500            *:*

  UDP    server:4847            *:*

  UDP    server:4850            *:*

  UDP    server:44334           *:*

  UDP    server:ntp             *:*

  UDP    server:1900            *:*

  UDP    server:ntp             *:*

  UDP    server:netbios-ns      *:*

  UDP    server:netbios-dgm     *:*

  UDP    server:1900            *:*

  UDP    server:ntp             *:*

  UDP    server:netbios-ns      *:*

  UDP    server:netbios-dgm     *:*

  UDP    server:1900            *:*

 

C:Documents and Settingsroot>

 

            Vidíme v tejto spleti informácií dôkaz o lokálnom rozbehaní POP3? Myslím, že áno (čiernym zvýraznené písmo bez kurzívy). Pre niekoho tento výpis však nemusí byť dôkazom. Tak dobre, skúsme sa telnetnúť na lokálny port 110 (telnet localhost 110) a uvidíme zázrak:

 

+OK Hello there.

 

            Ozval sa POP3 protokol z nášho počítača, ktorý je len obrazom toho „reálneho“ na poštovom servery. Alebo ešte lepší dôkaz, pošlime si na naše e-mailové konto mail z nejakého iného účtu a nakonfigurujme si e-mailového klienta tak, že mail server označíme náš počítač (localhost alebo 127.0.0.1). Vyplňme všetko čo potrebujeme, adresu, login, prípadne heslo, uložme konfiguráciu a hurá, stlačme tlačidlo na príjem pošty. Tá skutočne príde!


Konfigurácia pašovanej POP3 na e-mailovom kliente
Zväčšiť


To však nie je až také bežné, aby sa blokovalo POP3. Ale permanentne sa stáva, že je blokované odosielanie pošty na SMTP. Postup už vieme, ako na to. Vytvoríme si tunel, kde Source port bude číslo SMTP portu na našom stroji, teda 25 a do Destination vpíšeme poštový server, dvojbodka, 25. Pridáme forwardovaný port (Add). Zahájime spojenie Session/Host name (or IP address) so strojom, kde máme SSH konto a v klientovi si prestavíme SMTP Server (Outgoing) na 127.0.0.1 alebo localhost. Ak funguje POP3 a len takto prestavíme SMTP, máme plnohodnotnú poštovú komunikáciu a administrátor sa môže aj potrhať. A má to ešte jednu výhodu – celá komunikácia je šifrovaná!

V prípade, že sme zablokovaný na oboch portoch, pre PuTTY to nie je žiaden problém (resp. pre SSH). Nastavíme SMTP, pridáme medzi forwardovacie porty a potom znova vypíšeme hlavičku, ale už pre POP3 a znova pridáme. V PuTTY to bude vyzerať asi takto:


Pašovanie viacerých služieb cez PuTTY
Zväčšiť


A klienta nakonfigurujeme napríklad takto:

Konfigurácia e-mailového klienta pre forwardovanie všetkých služieb
Zväčšiť


            Ako môžeme postrehnú, zatiaľ sme preniesli zakázanú službu z internetu do vnútra siete. Nabudúce si ukážeme, ako prenesieme službu z vnútra, na Internet vonku.

PuTTY v príkazovom riadku (Linux aj Windows)

            Na začiatku sme si povedali, že v Linuxe je priamo program pre prácu s SSH integrovaný. Ovláda sa, ako ináč, cez príkazový riadok a po pravde, je lepší ako GUI nadstavba PuTTY, pretože je, myslím prehľadnejšie písať ako klikať. Jedná sa o príkaz SSH so svojimi prepínačmi. Obdobne existuje aj jeho ekvivalent pre Windows a je to program PLinke (link: the.earth.li/~sgtatham/putty/latest/x86/plink.exe ).

            Takže keď si chceme vyskúšať prácu aj my, Windowsáci, pozrime sa na to (pre Linux to bude ekvivalentný zápis, len namiesto plink sa bude písať ssh). Tak, šup do príkazového riadku, tak, aby sme mali v ceste plink (teda napríklad ísť tam, kde sme ho stiahli, alebo ho nakopírovať do adresára Windows, aby sme nemuseli ku nemu stále písať cestu).

            Syntax je jednoduchá. Ak chceme vytvárať lokálny port (ako v celom článku), napíšeme prepínač –L, potom nasleduje port, ktorý bude obrazom portu, ktorý chceme forwardovať na našom stroji, dvojbodka, stroj z ktorého chceme port forwardovať, dvojbodka, port tohto stroja, a nakoniec SSH klient, na ktorý sa prihlasujeme:

            Takže napríklad ekvivalentný zápis forwardovania POP3 protokolu je takýto:

 

Microsoft Windows XP [Verzia 5.1.2600]

(C) Copyright 1985-2001 Microsoft Corp.

 

D:!Temp!!>plink -L 110:devnet.sk:110 liborbes@213.160.X.X

Using username "liborbes".

Using keyboard-interactive authentication.

Password:

Last login: Wed Feb  1 12:40:08 2006 from xxx

 

$_

Prenášame zakázanú službu z LAN do Internetu

            Ako bolo naznačené, existuje aj možnosť tzv. reverzného prenášania služieb z vnútra sietí na SSH. Funguje to v princípe podobne ako lokálna služba ale port sa prenesie na stranu servera, kde máme spustené konto SSH.


Forwardovanie portu z vnútra siete vonku
Zväčšiť



            Pracuje to ako vidíme na podobnom princípe ako prenos služby do vnútra siete. Teraz si však mi, vytvoríme službu, ktorú chceme tunelovať na svojom stroji, napríklad server Apache (web), ktorý ponecháme na čísle portu 80 (implicitné číslo). Potom vytvoríme SSH tunel so serverom SSH, ktorému povieme, aby načúval na svojom vyššom porte a prepojil to s naším portom vo vnútri.

            V PuTTY si jednoducho vytvoríme tunel taký, že do políčka Source port zadáme číslo portu, na ktorom bude načúvať SSH server (napr. 42000) a do Destination napíšeme, aby bol obrazom z nášho počítača na porte 80 (napr. localhost:80). Teraz však musíme prepnúť typ tunelu z predchádzajúceho Local na Remote. Po pridaní to môže vyzerať v PuTTY takto:


PuTTY a forwardovanie z LAN do sveta
Zväčšiť


            A pokúsime sa nakonektovať na server. Teraz, keď na Internete zadáme do prehliadača v mieste URL adresu [SSH server]:42000 tak sa zobrazí stránka, ktorú máme vo vnútri na lokálnej sieti. Ale pozor, môže nastať problém...

            Ekvivalentný zápis v príkazovom riadku je (v Linuxe už vieme, že musíme nahradiť príkaz plink za príkaz ssh):

 

Plink –R 42000:localhost:80 [SSH server]

 

            Skúsme sa teda natelnetovať na túto službu na porte 42000:

 

D:!Temp!!>telnet 213.160.X.X 42000

Connecting To 213.160.190.230...Could not open connection to the host, on port 4

2000: Connect failed

 

D:!Temp!!>

 

            Ak sa nám to nepodarí, je dosť možné, že máme zakázané vytvárať premosťovacie porty. Z tohto hľadiska je to pomerne jasné, pretože nemáme čo zasahovať do štruktúry sietí, ak nám nepatrí, lebo iné je premostiť službu do vnútra a iné zavesiť niečo z vnútra... Pozrime sa, či je to pravda!

Nalogujme sa klasicky do nášho SSH konta a pozrime sa na konfiguráciu SSH démona, na ktorom máme konto (ak máme na to práva).

            Ako príkaz na zobrazenie súboru použijeme aj z DOS-u známi more (aby sme mohli rovno stránkovať, ak výpis bude dlhší ako okno terminálu), ja použijem príkaz cat, čo je ekvivalentom ku DOS-áckemu type, pre celkový výpis. Kto nepracoval v Linuxe, tak musím pripomenúť, že platia tam rovnaké pravidlá ako v cmd, teda ak by sme chceli tento výpis hodiť do súboru, použijeme cat s presmerovaním (zobáčik) > a meno súboru. Konfiguračný súbor sa nachádza najčastejšie v Linuxe (a aj v BSD) v adresári etc/SSH v súbore sshd_config.

 

$ cat /etc/ssh/sshd_config

#       $OpenBSD: sshd_config,v 1.72 2005/07/25 11:59:40 markus Exp $

#       $FreeBSD: src/crypto/openssh/sshd_config,v 1.42.2.1 2005/09/11 16:50:35 des Exp $                                                                                                                                                       # This is the sshd server system-wide configuration file.  See

# sshd_config(5) for more information.

#AllowTcpForwarding yes                                                        

#GatewayPorts no

#X11Forwarding yes

#X11DisplayOffset 10

 

            Vyhľadajme v konfigurácií riadok s informáciou GatewayPorts. Ak je zakázaná, nemáme právo vytvárať na tomto SSH konte „remote“ porty. Táto služba je však zakázaná implicitne, teda po nahodení SSH démona na servery sa automaticky blokuje. Pozrime sa, aké práva nám administrátor pridelil. Ak zaúraduje šťastena, máme prístup ku tomuto súboru na zápis.

 

$cd /etc/shh

$ls –l

total 148

-rw-r--r--  1 root  wheel  132839 Nov  3 09:12 moduli

-rw-r--r--  1 root  wheel    1411 Nov  3 09:12 ssh_config

-rw-------  1 root  wheel    1192 Dec  1 12:02 ssh_host_dsa_key

-rw-r--r--  1 root  wheel    1127 Dec  1 12:02 ssh_host_dsa_key.pub

-rw-------  1 root  wheel     540 Dec  1 12:02 ssh_host_key

-rw-r--r--  1 root  wheel     344 Dec  1 12:02 ssh_host_key.pub

-rw-------  1 root  wheel    1679 Dec  1 12:02 ssh_host_rsa_key

-rw-r--r--  1 root  wheel     407 Dec  1 12:02 ssh_host_rsa_key.pub

-rw-r--r--  1 root  wheel    3042 Nov  3 09:12 sshd_config

$_

 

                Príkaz ls slúži podobne ako sme zvyknutí z DOS-u na príkaz dir. S tým, že musíme zadať prepínač –l, aby sme dostali výpis súborov aj s ich právami. Tie sa nachádzajú v prvom stĺpčeku. Nadobúdajú hodnotu r (read, len na čítanie), w (write zápis), x (executable, spustenie súboru – vykonanie) prípadne – (empty - máš smolu). Vidíme, že sú tu zobrazené tri podskupiny, zľava doprava si ich odkrokujme. Prvý znak znamená, že sa jedná o súbor, nasleduje trojica, ktorá určuje práva pre vlastníka súboru (administrátor). Potom trojica pre skupiny (do ktorej patríme) a prípadne ešte aj práva pre jednotlivca (teda mi). Z demonštračného výpisu je jasné, že práva na zápis nemáme, súbor môžeme len čítať. Ak by sme však mali práva rw-, zmeníme si riadok GatewayPorts z no na yes napríklad cez textový editor Vi.

            Napíšeme vi sshd_config a stlačíme klávesu „i“, čím program uvedieme do režimu insert (vkladacieho, editovacieho). Nájdeme príslušný riadok, odstránime znak #  (ak sa na začiatku nachádza) a zmeníme hodnotu na yes. Teraz vyskočíme z režimu písania takto: SHIFT+Z+Z (teda držíme SHIFT a dvakrát stlačíme klávesu „z“). A tunel môžeme zopakovať a isto bude fungovať.

 

Hmm, ale ak sme nemali šťastie s právami, možno sa ukáže v inej podobe, pretože SSH vo verzii 1 nepodporoval GatewayPorts! V PuTTY sa teraz prenesme do položky SSH v ľavej časti okna a nastavme protokol SSH (Preferred SSH protocol version) na 1 only. Znova nakonfigurujme „remote“ tunel a pripojme sa:


SSH1
Zväčšiť

            Ak však server nepodporuje SSH vo verzii jedna, hold, máme smolu. Síce nie úplnú, lebo je tu stále možnosť programom netcat si cestu vonku prebiť. Totiž tento forward port sa na serveri vytvoril, ale nie je viditeľný vonku. Ak z konta, na ktorom sme ho forwardovali skúsime konekt na port z lokalhostu, službu máme! Ale tieto veci sú už mimo rozsah tohto dokumentu.

Neprehliadnite: