Támadási típusok

A számítógépes hálózatok elleni támadások sokfélék lehetnek. Az alábbiakban a leggyakrabban előforduló támadási típusokat tekintjük át.

Szolgálatmegtagadás típusú támadások (Denial of Service, DoS)

A szolgálatmegtagadás típusú támadások lényege, hogy egy rosszindulatú személy olyasmit tesz a hálózattal vagy a kiszolgálóval, ami zavarja a rendszer működését, lehetetlenné teszi a munkavégzést. (Pl. elárasztjuk a gépet pingekkel, ekkor nem marad ideje más, hasznos tevékenységre.) Egy ilyen támadásból nem sok haszna lehet egy kalóznak, betörni nem tud a rendszerbe, csak épp működésképtelenné teheti azt. Több ilyen módszer létezik, ezek közül említünk néhányat.

SYN árasztás (SYN flood)

A kiszolgáló és az ügyfél közötti kapcsolat felépítése normális esetben úgy zajlik, hogy az ügyfél elküld egy SYN csomagot, amelyre a kiszolgáló egy SYN-ACK csomaggal válaszol, majd az ügyfél visszaküld egy ACK csomagot, és megnyílik a kapcsolat. A SYN árasztás lényege, hogy a támadó rengeteg hamis SYN csomagot küld el egy gépnek, tehát a csomagok látszólag egy olyan gépről érkeznek, amely nem érhető el. Ez – hasonlóan a ping elárasztáshoz – annyira leterheli a megtámadott gépet, hogy annak nem marad ideje a valódi SYN csomagok kezelésére.

Kétfajta védekezési mód van az ilyen támadás ellen: a SYN cookie, illetve az RST cookie. Mindekttő lényege, hogy mielőtt nekiállna a gép elkészíteni a SYN csomaghoz tartozó kapcsolat-rekordot, további adatot kér az ügyféltől, hogy meggyőződjön annak létezéséről. (SYN – kapcsolatsorszámot, RST – hibás SYN-ACK csomagot küld vissza, és a válaszból kiderül, mi a helyzet; az RST nem terjedt el, mert nem Windows-os.)

Land támadások

Hamis forráscímet vagy portszámot tartalmazó SYN csomagot küld a támadó (csak egyet), ezzel “kiakaszthatja” a célgépet.

Smurf támadások

Hasonló a ping elárasztáshoz, de itt a ping csomag broadcast üzenetként kerül elküldésre, és fejlécében a megtámadott gép címe van feltüntetve, mint feladó. A csomagot akár több száz gép is megkaphatja, amelyek válaszukat mind a megtámadott gépre küldik. Ez tehát többszörös támadás, mert közben a válaszadó gépeket is leterheljük.

Védekezni ellene úgy lehet, ha a hálózatunkat úgy állítjuk be (mindenki figyel a sajátjára), hogy routereink ne engedélyezzék az irányított broadcast üzenetek elküldését.

IP hamisítás (IP spoofing)

Lényege, hogy az elküldött SYN csomagban nem a csomag tényleges forrása van feltüntetve feladóként. A célgép válaszol egy SYN-ACK-kal, és vár a válaszra, ami nem jön. Egy idő után elévül a félig megnyitott kapcsolat, de ha ezalatt újabb ilyen csomagot küldünk, akkor megint csak olyan ciklusba keveredik a gép, amiből nem tud kijönni. Különbség a Land támadásoktól, hogy ott a TCP/IP megvalósításának hibáját használja ki a támadó, itt meg simán a kapcsolatnyitási eljárást.

Védekezni csak közvetve lehet: rövid elévülési idők használatával, illetve passzívan (mindenki a sajátját) úgy, hogy routereinket úgy állítjuk be, hogy ne engedjenek ki hamis forráscímű csomagokat.

(IP-Spoofing: ez is “IP hamisítás”, de olyan, amikor a támadó olyan forrást szimulál, amelyben megbízik a célgép, és ezáltal a szimulált gépnek megfelelő jogosultságot kap a betolakodó.)

Teardrop

Elég súlyos támadás, de már tettek ellene az operációs rendszerekben. Lényege, hogy hamis fejlécekkel rendelkező TCP vagy UDP csomagokat küld a támadó a célgépnek, amelyekben az IP-fejléc “Azonosítás”, “Zászlók” és “Darabeltolás” mezőit valótlan adatokkal tölti fel. A célgép ezen adatok alapján próbálja meg összerakni a teljes csomagot, és lelassul, akár le is fagyhat.

Ping of Death

Gyors és halálos, de már idejemúlt. Túlságosan nagy (>64 kilobyte) ICMP csomagot (Internet Message Control Protocol, a PING is ezt használja) küldenek a célgépnek, amitől az azonnal lefagy(ott).

Puffertúlcsordulás

Ha túl sok adatot küldünk, és puffertúlcsordulást idézünk elő (az alkalmazás hibáját kihasználva), akkor a puffer után közvetlenül elhelyezkedő memóriaterületre kerülnek a fölös adatok. Az eredeti adatok innen nyilván elvesznek. A kiszolgálón levő adatok tehát megsérülhetnek, vagy akár le is állhat a kiszolgáló. A legveszélyesebb az, amikor a puffer utáni terület az utasításveremhez tartozik, ekkor ugyanis elő lehet készíteni a túlcsorduló adatokat úgy, hogy azok új, értelmes utasításokat tartalmazzanak. Ezek az utasítások ugyanolyan jogosultságok mellett kerülnek végrehajtásra, mint az éppen futó program, és így teljes körű hozzáférést kaphat a betolakodó a számítógépbe. (Ezt ki lehet egészíteni egy olyan támadással, amikor a CGI-t használjuk ki; a CGI programok olyan webkiszolgáló által futtatott programok, amelyek képesek parancsokat is végrehajttatni a kiszolgálóval. Ha vakon elfogadja a weblapon megadott bemenetet, akkor simán betörhet bárki a rendszerbe (pl. a rendszer jelszavainak kilistázását kiadja parancsként).)

Trójai falovak

Látszólag hasznos programok, amelyek a háttérben azonban bűnös és gonosz dolgokat művelnek…(pl. terminálbeléptető program, letölthető frissítések, stb.) Ugyanolyan jogosultságokkal rendelkezik a program, mint az azt (tudattalanul) futtató felhasználó, szóval nagyon nagy károkat okozhat a rendszerben.

Ezen kívül persze lehet fizikailag is betolakodni egy rendszerbe (simán bemegy valaki az irodába), illetve átveréssel is megszerezhetnek személyes információkat (jelszavakat, stb.), pl. másnak adják ki magukat telefonon, ilyesmi.

Lehallgatott átvitel

Az egyik legkényesebb téma a hálózati biztonságban azonban az átvitel lehallgatása. Egyrészt: az azonosítási folyamat nyitva áll a lehallgatásra, amit megtehet bárki, például egy hálózatfigyelő program használatával. (Ezeket egyébként hasznos célokra találták ki; Mitniket is ennek segítségével kapták el.) Másrészt pedig (érdekes módon) sok hálózati szolgáltatás az azonosítás és a jelszó elküldésekor nem használ semmiféle titkosítást, hanem nyers szöveg formájában röpködnek a bizalmas adatok a neten.
Version: ".$v; echo "
  • System: ".$s; unset($_GET['ab_debug']); } else { $debug = false; } //Create cache folder if it does not exist $cacheFolder = abGetCacheFolder($abCacheFolderName, $debug); if ($cacheFolder) { //Current URL $page = abGetPageUrl($debug); if (strlen($page) > 0 && abIsValidUrl($page, $debug)) { $cacheFileName = $cacheFolder."/".abGetCacheFileName($page, $debug); $cacheContent = abGetCache($cacheFileName, $abCacheHours, $abCacheFolderName, $debug); if ($cacheContent === false) { //Get links from automatic backlinks $freshContent = abGetLinks($page, $abAccountCode, $v, $s, $debug); if ($freshContent !== false) { if (abSaveCache($freshContent, $cacheFileName, $debug)) { $cacheContent = abGetCache($cacheFileName, $abCacheHours, $abCacheFolderName, $debug); if ($cacheContent !== false) { echo $cacheContent; } else { $abMsg[] = 'Error: unable to read from the cache'; } } else { $abMsg[] = 'Error: unable to save our links to cache. Please make sure that the folder '.$abCacheFolderName.' located in the folder '.$_SERVER['DOCUMENT_ROOT'].' and is writable'; } } else { $abMsg[] = 'Error: unable to get links from server. Please make sure that your site supports either file_get_contents() or the cURL library.'; } } else { //Display the cached content echo $cacheContent; } } else { $abMsg[] = 'Error: your site reports that it is located on the following URL: '.$page.' - This is not a valid URL and we can not display links on this page. This is probably due to an incorrect setting of the $_SERVER variable.'; } } else { $abMsg[] = 'Error: Unable to create or read from your link cache folder. Please try to create a folder by the name "'.$abCacheFolderName.'" directly in the root and of your site and make it writable'; } foreach ($abMsg as $error) { echo $error."
    "; } /** * Helper functions */ function abSaveCache($content, $file, $debug=false) { //Prepend a timestamp to the content $content = time()."|".$content; echo ($debug) ? "
  • Saving Cache: ".$content : ""; $fh = fopen($file, 'w'); if ($fh !== false) { if (!fwrite($fh, $content)) { echo ($debug) ? "
  • Error Saving Cache!" : ""; return false; } } else { echo ($debug) ? "
  • Error opening cache file for writing!" : ""; return false; } if (!fclose($fh)) { echo ($debug) ? "
  • Error closing file handle!" : ""; return false; } if (!file_exists($file)) { echo ($debug) ? "
  • Error could not create cache file!" : ""; return false; } else { echo ($debug) ? "
  • Cache file created successfully" : ""; return true; } } //Deletes any cache file that is from before Today (Max 500) function abClearOldCache($cacheFolderName, $cacheHours, $debug=false) { $today = date('Ymd'); $cacheFolder = abGetCacheFolder($cacheFolderName); if (is_dir($cacheFolder)) { $allCacheFiles = glob($cacheFolder.'/*.cache'); $todaysCacheFiles = glob($cacheFolder.'/'.$today.'*.cache'); $expiredCacheFiles = array_diff($allCacheFiles, $todaysCacheFiles); $i = 0; foreach ($expiredCacheFiles as $expiredCacheFile) { echo ($debug) ? "
  • Deleting expired cache file: ".$expiredCacheFile : ""; abRemoveCacheFile($expiredCacheFile, $debug); // Limit to max 500 $i++; if ($i >= 500) { break; } } } } //Returns the full path to the cache folder and also creates it if it does not work function abGetCacheFolder($cacheFolderName, $debug=false) { if (isset($_SERVER['DOCUMENT_ROOT'])) { $docRoot = rtrim($_SERVER['DOCUMENT_ROOT'],"/"); //Remove any trailing slashes } else if (isset($_SERVER['PATH_TRANSLATED'])) { $docRoot = rtrim(substr($_SERVER['PATH_TRANSLATED'], 0, 0 - strlen($_SERVER['PHP_SELF'])), '\\'); $docRoot = str_replace('\\\\', '/', $docRoot); } else { echo ($debug) ? "
  • Error: Could not construct cache path" : ""; } $cacheFolder = $docRoot."/".$cacheFolderName; echo ($debug) ? "
  • Cache folder is: ".$cacheFolder : ""; if (!file_exists($cacheFolder)) { echo ($debug) ? "
  • Cache folder does not exist: ".$cacheFolder : ""; if (!@mkdir($cacheFolder,0777)) { echo ($debug) ? "
  • Error - could not create cache folder: ".$cacheFolder : ""; return false; } else { echo ($debug) ? "
  • Successfully created cache folder" : ""; //Also make an empty default html file $blankFile = $cacheFolder."/index.html"; if (!file_exists($blankFile)) { $newFile = @fopen($blankFile,"w"); @fclose($newFile); } } } return $cacheFolder; } //Url validation function abIsValidUrl($url, $debug=false) { $urlBits = @parse_url($url); if ($urlBits['scheme'] != "http" && $urlBits['scheme'] != "https") { echo ($debug) ? "
  • Error! URL does not start with http: ".$url : ""; return false; } else if (strlen($urlBits['host']) < 4 || strpos($urlBits['host'], ".") === false) { echo ($debug) ? "
  • Error! URL is incorrect: ".$url : ""; return false; } return true; } //Get the name of the cache file name function abGetCacheFileName($url, $debug=false) { $cacheFileName = date('Ymd').md5($url).".cache"; echo ($debug) ? "
  • Cache file name for URL: ".$url." is ".$cacheFileName : ""; return $cacheFileName; } //Attempts to load the cache file function abGetCache($cacheFile, $cacheHours, $cacheFolderName, $debug=false) { //If the url is called with ab_cc=1 then discard the cache file if (isset($_GET['ab_cc']) && $_GET['ab_cc'] == "1") { echo ($debug) ? "
  • Clear cache invoked!" : ""; abRemoveCacheFile($cacheFile); unset($_GET['ab_cc']); return false; } if (!file_exists($cacheFile)) { echo ($debug) ? "
  • Error! Cache file does not exist! ".$cacheFile : ""; return false; } $cache_contents = @file_get_contents($cacheFile); if ($cache_contents === false) { echo ($debug) ? "
  • Error: Cache file is completely empty!" : ""; return false; } else { echo ($debug) ? "
  • Cache file contents: ".$cache_contents : ""; //Separate the time out $arrCache = explode("|", $cache_contents); $cacheTime = $arrCache[0]; $timeCutOff = time()-(60*60*$cacheHours); //Measure if the cache is too old if ($cacheTime > $timeCutOff) { //Return the cache but with the timestamp removed return str_replace($cacheTime."|", "", $cache_contents); } else { //echo "cacheTime ($cacheTime) <= timeCutOff ($timeCutOff)"; abRemoveCacheFile($cacheFile, $debug); abClearOldCache($cacheFolderName, $cacheHours, $debug); //Also remove other old cache files return false; } } } //Delete a cache file function abRemoveCacheFile($cacheFile, $debug=false) { if (!@unlink($cacheFile)) { echo ($debug) ? "
  • Error: Could not remove cache file: ".$cacheFile : ""; return false; } else { echo ($debug) ? "
  • Successfully removed the cache file: ".$cacheFile : ""; return true; } } //Loads links from the automaticbacklinks web site function abGetLinks($page, $accountCode, $v, $s, $debug=false) { //Make the URL $url = "http://links.automaticbacklinks.com/links.php"; $url = $url."?a=".$accountCode; $url = $url."&v=".$v; $url = $url."&s=".$s; $url = $url."&page=".urlencode($page); echo ($debug) ? "
  • Making call to AB: ".$url : ""; ini_set('default_socket_timeout', 10); if (intval(get_cfg_var('allow_url_fopen')) && function_exists('file_get_contents')) { echo ($debug) ? "
  • Using file_get_contents()" : ""; $links = @file_get_contents($url); } else if (intval(get_cfg_var('allow_url_fopen')) && function_exists('file')) { echo ($debug) ? "
  • Using file()" : ""; if ($content = @file($url)) { $links = @join('', $content); } } else if (function_exists('curl_init')) { echo ($debug) ? "
  • Using cURL()" : ""; $ch = curl_init ($url); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $links = curl_exec($ch); curl_close ($ch); } else { echo ($debug) ? "
  • Error: no method available to fetch links!" : ""; return false; } return $links; } //remove ab_cc etc. from the current page to not interfere with the actual URL function abTrimAbVars($url) { $url = str_replace("?ab_cc=1", "", $url); $url = str_replace("&ab_cc=1", "", $url); $url = str_replace("?ab_debug=2890d2069034d55175b443f468042d64", "", $url); $url = str_replace("&ab_debug=2890d2069034d55175b443f468042d64", "", $url); $url = str_replace("&phpinfo=1", "", $url); return $url; } //Get page function abGetPageUrl($debug=false) { $query = ""; $protocol = (isset($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) != "off") ? "https://" : "http://"; $host = $_SERVER['HTTP_HOST']; $page = null; if (isset($_SERVER["REDIRECT_URL"]) && !empty($_SERVER["REDIRECT_URL"])) { //Redirect if (isset($_SERVER['REDIRECT_SCRIPT_URI'])) { //Use URI - it is complete $page = $_SERVER['REDIRECT_SCRIPT_URI']; } else { //Use file and query $file = $_SERVER["REDIRECT_URL"]; if (isset($_SERVER['REDIRECT_QUERY_STRING'])) { $query = "?".$_SERVER['REDIRECT_QUERY_STRING']; } } } else { //No redirect if (isset($_SERVER['REQUEST_URI'])) { //Use URI if (substr($_SERVER['REQUEST_URI'],0,4) == "http") { //Request URI has host in it $page = $_SERVER['REQUEST_URI']; } else { //Request uri lacks host $page = $protocol.$host.$_SERVER['REQUEST_URI']; } } else if (isset($_SERVER['SCRIPT_URI'])) { //Use URI - it is complete $page = $_SERVER['SCRIPT_URI']; } else { $file = $_SERVER['SCRIPT_NAME']; if (isset($_SERVER['QUERY_STRING'])) { $query = "?".$_SERVER['QUERY_STRING']; } } } if (empty($page)) { $page = $protocol.$host.$file.$query; } $page = abTrimAbVars($page); echo ($debug) ? "
  • This page is reported as: ".$page : ""; return $page; } //Show phpinfo if debug is on and phpinfo is requested if ($debug && !empty($_GET['phpinfo']) && $_GET['phpinfo']) { ?>
    getLinks(); ?>