Bitka kóderek: ja proti tomu chlapcovi s VNC

V na tomto blogu bolo zverejnených množstvo programátorských histórií. Rád si spomínam na svoje staré hlúposti. Nuž, tu je ešte jeden taký príbeh.

Prvýkrát som sa začal zaujímať o počítače, najmä programovanie, keď mi bolo asi 11 rokov. Na začiatku strednej školyosom väčšinu svojho voľného času trávil so svojím C64 a písal v Basicu, a potom strihal zlý kód nožnicami. Nesrandujem, nožnicami.

Po škole (vo veku asi 16 rokov) britské deti zvyčajne idú na vysokú školu, kde si vyberú na štúdium tri alebo štyri predmety, než sa dostanú na univerzitu. Vzhľadom na svoju lásku k béžovej krabici a magnetofónu doma, som usúdil, že štúdium "informatiky" na vysokej škole je správna voľba.

Kurz ma bavil viac, ako som očakával; tam som sa po prvýkrát stretol s Pascalom a Delphi.

V prestávkach medzi vyučovaním mohli študenti pracovať na akomkoľvek voľnom počítači v počítačovej miestnosti. Predstavte si: obrovská miestnosť, odhadom pre sto ľudí, s radmi stolov zaplnených počítačmi, - akými sú tie, kde monitor stojí na systémovej jednotke. Neustále hučanie ventilátorov, myšacie guličky hučia po stoloch bez prestania. Vo vzduchu zvláštny zápach, akoby 50-100 hormóny produkujúcich tínedžerov pravidelne striedal na ochladenie stovky procesorov Pentium III.

Napriek rizikám pre zdravie som si užíval sedieť za počítačom, keď sa naskytla voľná minútka.

V miestnosti bol administrátor, nízky muž stredného veku, ktorého si vybrali na túto rolu kvôli jeho neodolateľnej túžbe stať sa zlým diktátorom. Predpokladám. Dalo by sa povedať, že na svojich povinnostiach dbal - chlapec naozaj miloval svoju prácu. Mal za úlohu dozerať na poriadok, aby nikto nepoužíval študijný počítač na niečo nevhodné.

A dodnes mám pocit, že odmena administrátora priamo závisela od počtu študentov, ktorých chytí a vypudí z počítačovej miestnosti. Som takmer presvedčený, že tento chlapec predčasne splatil svoju hypotéku.

Sedel v zadnom rohu počítačovej miestnosti za rohovým stolom. A s istotou sa dalo predpokladať, že jeho plodné monitory našli spôsob ako sa rozmnožovať s ohromne krátkym obdobím tehotenstva — bolo ich naozaj veľa. Zostávalo len hádať, či naozaj stíhal sledovať všetky. Samozrejme, žartujem… spomínal som, že k práci pristupoval veľmi vážne?

V tom čase počítačová sieť fungovala pod Windows 2000. Čoskoro som zistil, že pri každom prihlásení sa spustil skript, ktorý zahŕňal spustenie servera VNC s administrátorským účtom pre vzdialený prístup k desktopu. Kedykoľvek si tento chlapec chcel dať pozor na vás, pripojil sa priamo k vášmu počítaču a pozoroval vás. Bolo to strašidelné a ak si to teraz spätne uvedomujem, pravdepodobne aj nelegálne.

Po ostrení na Basic a C64 som teraz písal v C a dokonca aj trochu v C++. V tom čase ma veľmi zaujal jazyk D, ktorý opravoval niektoré nedostatky C++, aspoň to som si vtedy myslel.

Zvyčajne som chodil do počítačovej miestnosti, aby som si prečítal niečo nové o D alebo sa pohral s kompilátorom Digital Mars D. Niekedy som sa odklonil od myšlienok na skvelú budúcnosť D a písal som kód v C pre hackovanie iných Win32 programov prostredníctvom ich deskriptorov okien.

V starých dobrých časoch programovania na Win32 bol vyhľadanie deskriptoru okna najjednoduchším spôsobom, ako hacknúť iné programy. Je zrejmé, že všetky programy s grafickým rozhraním v systéme Windows mali okno, aj keď nebolo zobrazené na obrazovke. Napísaním programu na extrakciu deskriptoru iného procesu (v podstate odkazu naň) ste mu mohli posielať správy. To umožnilo vykonávať niektoré základné operácie, ako skryť/zobraziť okno programu, ako aj naozaj úžasné veci, ako napríklad prinútiť proces načítať ľubovoľnú DLL do svojho pamäťového priestoru a začať vykonávanie kódu. Po injekcii DLL začalo to najzaujímavejšie.

V prvých jeden a pol mesiaci ma tento detektív veľmi netrápil, pripojil sa k VNC serveru na mojom počítači len raz alebo dvakrát. Ale jeden konkrétny sedenie pravdepodobne prebudilo jeho záujem. Písal som nejaký kód v C na skrytie okien Minesweeper (bez ich zatvorenia), aby sa dalo jednoduchšie hrať v triede, a všimol som si, že biela ikona VNC v systémovej lište sa stala čiernou. To znamenalo, že ma teraz pozoruje.

Pokračoval som v kódovaní ako zvyčajne, snažiac sa ho ignorovať. Medzitým sa počítač začal výrazne sekať, snažiac sa preniesť maximálnu snímkovú frekvenciu na jeden z bezpočetných monitorov v rohu miestnosti. Windows takmer prestal reagovať, keď moje zúfalstvo prepuklo, odhlásil som sa a skoncoval s tým na dnes.

Počas nasledujúcich návštev v počítačovej miestnosti sa Colombo skoro každý raz prejavil živý záujem o to, čím sa zaoberám. Približne po štvrtýkrát som sa rozhodol: s tým treba niečo spraviť.

Pripúšťam, že rozumný, racionálny človek by sa mohol tento problém priamo predložiť jemu alebo jeho šéfovi. Avšak vždy som sa poddal pokušeniu a rýchlo som sa presvedčil, aby som zvolil úplne inú stratégiu.

— Nič bez tohto VNC servera nespravíš! — pokojne a rozhodne som si povedal niekoľkokrát.

Treba zabiť VNC.

Začal som vstupovať do počítačovej miestnosti s veľkými skupinami študentov a posadil sa čo najďalej od rohu s monitormi. Nejaký čas to fungovalo a dalo mi to trochu času na preverenie nápadov.

Môj prvý pokus, myslím, že sa zhodnete, bol celkom slabý. Kliknutím pravým tlačidlom myši na ikonu VNC v systémovej lište som videl menu s magickými písmenami E-X-I-T. Bohužiaľ, písmená boli napísané sivým kontúrovým textom. Správca zakázal položku menu 'Odhlásiť' cez editor skupinových politik. Pokúsil som sa zabiť proces v Správcovi úloh, ale, samozrejme, bol pre mňa neviditeľný, pretože pracoval pod iným, privilegovanejším účtom. Nič nevyšlo.

VNC server beží na porte TCP 5900, spomenul som si. Môj ďalší plán bol odoslať na tento port poškodené pakety, aby som ho zablokoval.

Aspoň pár dní som analyzoval protokol, posielajúc na port 5900 rôzne formy správne štruktúrovaného žvástu a dúfajúc, že sa to pokazí. Nakoniec to tiež nefungovalo.

Už som začal myslieť, že sa tejto veci nezbavím, keď ma náhle osvietilo: tam predsa musí byť okno! Treba ho zobraziť. Možno tam bude pekné, šťavnaté tlačidlo „Vypnúť“, ktoré by som mohol skvele využiť!

Spustil som svoj takmer dokonalý kód C na vyhľadávanie deskriptora hlavného okna iného procesu - a naozaj som našiel VNC. Cítil som sa povzbudený, keď prsty napísali WM_SHOWWINDOW. Skúste uhádnuť, čo som videl pred sebou?

Nič!

Teraz ma to začalo zaujímať... malo to okno, ale ignorovalo moje správy. Dvakrát som skontroloval svoj kód, aby som sa uistil, že funguje. Testoval som ho na niekoľkých iných procesoch a fungoval skvele. Skúšal som posielať do okna VNC iné správy, a predsa nič.

A vtedy ma opäť osvietilo!

Vďaka veľmi hrubej knihy Charlesa Petzolda som dôkladne skúmal, ako procesy Win32 fungujú v systéme. Každá aplikácia Win32 má okno, ako aj „frontu správ“. Správy vznikajúce interakciou s používateľom, ako aj správy zaslané samotným Windows, prichádzajú do fronty a samotná aplikácia sa rozhoduje, ako ich spracovať.

Samo o sebe to nie je príliš zaujímavé. Ale keď som si uvedomil, že dostatočne veľká nevybavená fronta správ slúži ako heuristika na zasahovanie do zamrznutého procesu zo strany manažéra procesov Windows, spotil som sa čistým serotonínom.

Bez sekundy váhania som sa vrátil k svojmu kódu C, pripravený poslať do hlavného okna VNC ešte jednu správu WM_SHOWWINDOW. V cykle. Večnom. Takže, množstvo správ WM_SHOWWINDOW, ktoré, ako som teraz vedel, bude VNC pokúšať sa úplne ignorovať… na vlastné riziko.

Skompiloval som a spustil 4 kB najoslobodenejšieho kódu v mojom živote. Približne po troch sekundách Windows oznámil, že proces vncserver.exe neodpovedá a ponúkol mi niečo, čomu som jednoducho nedokázal odolať:

Chcete ukončiť tento proces?

Do pekla, ÁNO!

Dovoľte mi priznať, že zvyšok dňa som bol neznesiteľne spokojný so sebou.

Po niekoľkých hodinách strávených premýšľaním o svojej novej super sile, som sa rozhodol, ako ju využijem. Proste zabiť reláciu priamo pred jeho očami bolo príliš jednoduché. Mal som lepší nápad – úplne zmiznúť.

Po bojového krstenia s programovaním socketov pochopil som, že môžem napísať kód, ktorý urobí dve veci. Najprv zaberie nedávno oslobodený port TCP 5900, ktorý bol predtým obsadený nevedomým procesom servera VNC. Potom vytvorí nové TCP pripojenie s VNC serverom určeného stroja. Kód jednoducho preposiela všetky dáta medzi dvoma socketmi, a Kolombo bude myslieť, že sa pripája ku mne, keď v skutočnosti sa pripojí k úplne inému VNC serveru.

Môj kód bude fungovať ako tajný most medzi mnou a akoukoľvek inou chudobnou dušou podľa môjho výberu. Bolo to úžasné.

Ihneď som začal písať svoj falošný VNC most. Kolombo sa ku mne niekoľkokrát pripojilo, ale ja som pokračoval v programovaní pred jeho očami. Dospel som k záveru, že nemá ani tušenia o mojich aktivitách, hoci som písal zjavné veci, ako sú čísla portov a komentáre ako // Прощай, жуткий шпион VNC.

Po pár dňoch som nemohol donútiť kód fungovať správne. Čo je ešte horšie, nepretržite som pracoval s čiernou ikonkou VNC v systémovej lište. Kým bol pripojený, nemohol som uvoľniť port, aby som si skontroloval svoj kód.

Keby som vtedy vedel o netcat!

Napokon, nervy nevydržali, stále som bol netrpezlivý 17-ročný chlapec. Znova som sledoval, ako sa biela ikona servera VNC mení na čiernu, a vybuchol som, otvoril pôvodný kód, ktorý vypľul front správ, a spustil ho pred jeho očami. Dokonca som počkal pár sekúnd predtým, než som stlačil End Process, jednoducho aby som sa uistil, že to videl.

Ak stlačenie tohto tlačidla ešte úplne nepresvedčilo, že to stálo za to, jeho skok z pevnosti monitorov, aby sa rýchlo priblížil ku mne a vyviedol ma z miestnosti, určite stálo za to.

Nakoniec mi zakázali prístup do siete na dve týždne. Spravodlivý trest, pomyslel som si. Približne o tri týždne sa server VNC vytratil z bootovacích skriptov a nikde sa už neobjavil. Nikdy som nezistil, či moj incident hral nejakú úlohu v tom alebo nie, ale úplne to zničilo môj plán na rozprávkové obohatenie predajom svojej VNC zbrane utláčaným študentom v počítačových miestnostiach vysokých škôl po celej krajine.

Zdroj: habr.com

Kúpte si spoľahlivý hosting pre webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Kúpte si spoľahlivý hosting pre webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster