Tunnelling 4 / 4 (HTTP)

Libor Bešenyi  /  06. 02. 2007, 00:00

Dneska si ukážeme, ako sa dá využiť HTTP na pašovanie príkazov dvoch zariadení.

Programujeme HTTP tunel

Teraz sa vráťme ku problému s trójskym koňom. Ako dostávať správy od klienta mimo LAN, keď serverová časť (časť obete, ktorá vykonáva príkazy – slúži – je otrokom – z latinčiny servo – teda server) „sedí“ za bránou s NAT protokolom?

Tu si pomôžeme inou službou, napríklad http. Ak na strane obeti je povolené prezerať stránky, tak celá aplikácia sa bude ovládať z textu, ktorý si prečíta na stránke. Tento text sa zasa bude meniť podľa toho, ako si to „želá“ klient. Takže keď sa pozrieme na obrázok v 2. kapitole o tunelovaní zistíme, že útočník vlastne ovláda redirektor, teda server, ktorý zasa ovláda klienta.

Čo potrebujeme, aby nám to fungovalo? Znalosti z nejakého vyššieho jazyka a webového jazyka napr. Perl, PHP, teda podľa potreby, čo máme „po ruke“ na redirektore. Náš program bude úplne primitívny a dokáže len jedinú vec – poslať príkaz obeti na otvorenie ľubovoľného programu (v ceste).

Ak nemáme po ruke žiaden server, nezúfajme. Celú komunikáciu si môžeme nasimulovať na jednom PC! Najprv si stiahneme a nainštalujeme PHP serever s webovým serverom Apache. Najlepšie je nájsť nejaký balíček, ktorý sa rýchlo a jednoducho inštaluje a so všetkým, čo potrebujeme (PHP Home alebo niečo podobné).

Teraz už len stačí spustiť server Apache (C:/Apache/Apache.exe) a ak chceme prácu skončiť len program vypneme. Na overenie, či program vlastne pracuje správe sa pozrieme tak, že spustíme prehliadač stránok a zadáme našu IP, teda localhost a uvidíme, nejakú stránku, ktorá sa spúšťa z nášho PC – teda sme si vytvorili vlastný webový server – to je práve Apache. PHP je modul tohoto programu. Ak chceme vyskúšať prácu aj s PHP, stránky, ktoré sa spúšťajú sú implicitne v adresári Apache/HTDOCS. Vymažeme obsah celého adresára a vložíme tam súbor index.php s takýmto obsahom:

<?PHP
  echo "PHP na tomto stroji fici";
?>
          Ak znova vyskúšame localhost v internetovom prehliadači, tak uvidíme text PHP na tomto stroji fici.

Ako by mal vyzerať náš skript? No, mal by vedieť zapisovať text do súboru, vedieť ho vymazať a vypísať jeho obsah. Je to preto, že útočník vyšle správu tomuto skriptu, už nie ako: „Otvor mechaniku“, ale „Povedz obeti, nech otvorí mechaniku“. Teda skript si zapíše dôležitý údaj „Otvor mechaniku“ do súboru s príkazmi a v určitých intervalov sa bude program nainštalovaný v obetiach prihlasovať na rovnaký skript typu: „Nie je tu pre mňa nejaký príkaz?“ a skript mu vypíše súbor s príkazom (príkazmi), ktoré má vykonať. Skript vytvoríme tak, aby mohla obeť aj vracať nejaký text a útočník bude pracovať podobne, v určitých intervaloch sa bude pýtať skriptu, či obeť mu niečo neposlala.

Skript teda bude musieť vedieť pracovať s dvoma súbormi s rovnakými funkciami. Teda si napíšeme obidve funkcie, aby sme nemali zbytočne dlhý zdroják.

Pozor:  Aplikácie nie sú výplodom Hi-Tech možností a sú plné chýb a použitých metód, ktoré sa neodporúčajú pri programovaní z hľadiska bezpečnosti apod. To však pre tento seriál nie je podstatné – najdôležitejšie je jednoducho demonštrovať funkcionalitu!


PHP kód
Zobraziť


Ako bude náš program pristupovať k tomuto skriptu? Môžeme sa pozrieť! Takže, otvoríme si prehliadač a zadáme locahost (tento skript teraz pomenujme index.php). Nič sa nedeje? Aj áno, aj nie. Skript nedostal príkaz nič vykonať a tak vykonáva len predposledný príkaz, teda sa snaží vypísať súbor output.txt. Ten však neexistuje a tak nič nevidíme. Ako dávať príkazy cez prehliadač nášmu skriptu? Cez premennú OP (querry) (všimnime si, keď vynecháme funkcie na začiatku, jadro programu je také, že zisťuje, či obsah premennej OP sa rovná erasebuffer, addbufer, buffer, eraseoutput, addoutput, showoutput. Tak príkaz addbuffer podľa zdrojového kódu pridá obsah ďalšej premennej S do súboru operacie.txt a vymaže súbor output.txt, pretože sa už očakáva prípadný nový výstup, keďže bol pridaný nový príkaz).
            Pre prácu s premennými v prehliadači existuje pomerne jednoduchý spôsob. Každý si určite všimol pri niektorých stránkach, ako sa z jednoduchého dotazu na stránku zmení obsah na šialený reťazec. Takže jednoduché pravidlo[1]:

[niečo].[niekde]/[skript]?[premenná1]=[obsah1]&[premenná2]=

[obsah2]&...

             Vieme, že pridať príkaz musíme vykonať cez dve premenné: OPS. Takže napíšme niečo ako na obrázku:


Test webovej služby

Zobraziť


Keď sa pozrieme do adresára C:/Apache/htdocs okrem index.php sa tam objavil aj súbor operacie.txt s reťazcom z premennej S. Ak to zopakujeme, pribudne ďalší riadok...

Test PHP
Zobraziť


Takto vyskúšajme príkazy na mazanie, vypisovanie obsahu apod. Teraz už len stačí napísať primitívnu webovú aplikáciu, ktorá dokáže vyslať takýto dotaz, prijať kód vygenerovanej stránky (pri výpise), spracovať ho. Použijeme mne najbližšie prostredie Delphi a knižnice Indy pre prácu s http (ja som upravil existujúce demo HTTPClient z Delphi 6 pre naše potreby).

            Programy so zdrojovými kódmi nájdeme tu. Ak chceme vedieť, či to funguje na jednom počítači, musíme mať dobrú fantáziu a veriť hornému výkladu, že to fakt takto funguje ;-). Spustíme Apache, pozrieme, či existuje náš skript na „svojom“ mieste, spustíme program klient.exe a aj server.exe. Čo sa týka „reči“, ktorá sa pašuje týmto spôsobom, je na každom z nás. Ja som zvolil jediný príkaz (toto už je na samotných aplikáciách, pozri zdrojové kódy): exec:[program], teda namiesto zátvoriek dosadíme názov programu v ceste a server ho na svojom PC spustí (spúšťam kalkulačku – príkazom exec:calc, ktorý napíšem klientovi):

Test PHP aplikácie

Zobraziť

A aby neboli ukrátení tí, ktorí to chcú vyskúšať v praxi ako sa „má“, tak tu je postup. Uploadujme na svoj webový server súbor index.php. Teda napríklad:

liborbes.devnet.sk/Utoky/tunnel/index.php

 

            Na počítač vo vnútri nejakej sieti spustíme serverovú časť. Druhý počítač (môže byť aj v tej istej sieti, ale na takúto prácu sa efektívnejšie hodí aplikácia z kapitoly o Sociálnom inžinierstve a škodlivých programoch) nech je tiež pripojený do Internetu. Do oboch aplikácií v časti URL napíšeme liborbes.devnet.sk/Utoky/tunnel a vyskúšame komunikáciu tak, že v klientovi napíšeme inkriminovaný riadok na spústenie kalkulačky (prípadne cmd na spustenie shell) a za pár sekúnd sa fakt spustí daný program vo vnútri chránenej siete!

            Programy sú veľmi primitívne a hlúpe. Ale slúžia ako príklad veľmi pekne, pretože sú nenáročné na zdrojový kód. Preto sú však náchylné na chyby ako nesynchronizovaný vstup do súboru apod. To však nie je problematikou tohto dokumentu.

            Ináč, keď si všimneme architektúru tohto programu, dalo by sa povedať, že sa jedná o aplikáciu klient – server. Aj tenký klient a tak najideálnejší názov sa javí ako: klient – tenký server J.

            Celý tento krátky seriál si môžete stiahnuť v celku na tomto mieste.

Pozn.: Keď som po čase prechádzal zdrojové kódy, tak som sa musel pousmiať, preto prosím, ich berte len ako demonštračné kúsky, ale neučte sa z nich ;-)


Pozn. redakcie: Tento seriál pôvodne vyšiel na Devnet.sk


[1] Pozor, existujú aj neviditeľné polia, ktoré sa posielajú, no nezobrazujú sa v URL. To ale nepatrí do tohto článku

Neprehliadnite: