Chaveiros de exportação


Respostas:


18

É exatamente assim que eu fiz isso há muitos anos, é a atualização de script para o Yosemite 10.11.5 - mas ainda não a testei.

  1. Um script que salva cada item no Keychain em texto:

    security dump-keychain -d login.keychain > keychain.txt
    
  2. Um segundo item AppleScript que clica no botão "Permitir" que o primeiro script dispara ao ler o item no KeyChain.

    [Edit: July 2016] Isso foi atualizado para a nota 10.11.5, já que alguns relataram travar o Mac com atraso de 0,2. Limitei o script para processar apenas 200 resultados por vez, portanto, se você tiver 1050 itens de chaveiro , você precisará executar esse script 6 vezes no ScriptEditor, além de permitir que o ScriptEditor seja ativado na seção Acessibilidade nas preferências de segurança em:

    tell application "System Events"
        set maxAttemptsToClick to 200
        repeat while exists (processes where name is "SecurityAgent")
            if maxAttemptsToClick = 0 then exit repeat
            set maxAttemptsToClick to maxAttemptsToClick - 1
            tell process "SecurityAgent"
                try
                    click button 2 of window 1
                on error
                    keystroke " "
            end try
        end tell
        delay 0.2
      end repeat
    end tell
    

A atualização de link / yosemite acima também possui uma etapa de conversão de ruby ​​do arquivo de texto para CSV. Boa sorte!

ShreevatsaR ressalta nos comentários que essa conversão ruby ​​cobre apenas "senhas da Internet" e não "senhas de aplicativos". Isso ocorre porque o objetivo do script é exportar as "senhas da internet" para o aplicativo 1Password.

E aqui está uma pergunta e uma resposta de estouro de pilha nas mesmas linhas

O System.keychain está aqui:

security dump-keychain -d /Library/Keychains/System.keychain > systemkeychain.txt

Para permitir que o AppleScript interaja com a caixa de diálogo, Preferências do Sistema -> Preferências de Segurança e Privacidade -> Guia Privacidade, a Opção de Acessibilidade deve ter o "Script Editor.app" ativado Preferências do sistema -> Preferências de segurança e privacidade -> Guia Privacidade, opção de acessibilidade destacada


muito obrigado! Está funcionando bem. Só não sei por que não consigo exportar meu System.keychain. Mas a maioria das chaves também existe no login.keychain.
— Maïeul

Consulte a atualização para o caminho do item de chaveiro, mas pode solicitar nome de usuário e senha para cada item, que pode ser o script Permitir que pode ser modificado para fornecer.
— MichaelStoner

Pensa. Não tenho competência em AppleScript. Eu tenho poucas senhas neste chaveiro, então digitarei minha senha principal muitas vezes.
— Maïeul

Se você não obtiver saída, tente executar o comando no mesmo diretório que o chaveiro.
— Rok Strniša

6
O AppleScript não funcionou para mim no OS X 10.10.3 Yosemite, afirmando "Os eventos do sistema obtiveram um erro: não é possível obter o grupo 1 da janela 1 do processo \" SecurityAgent \ ". Índice inválido".
— Marcel Waldvogel

8

Eu escrevi um script python que converte o despejo de chaves em um arquivo do Excel e pensei em compartilhá-lo com você. Eu escolho o Excel em vez de CSV ou TSV, porque muitas pessoas o instalam e ele simplesmente funciona clicando duas vezes no arquivo. Obviamente, você pode modificar o script para imprimir qualquer outro formato. Eu fiz isso no OS X 10.11 El Capitan, mas também deve funcionar em sistemas operacionais mais antigos.

  1. Como não gosto de armazenar minhas senhas em texto simples no disco rígido, criei um contêiner criptografado usando o aplicativo Utilitário de Disco. Simplesmente abra o Utilitário de Disco (pressione cmd+ Space, digite "disco"). No aplicativo, pressione cmd+ Npara obter uma nova imagem, altere o nome para SEC, altere a criptografia para AES de 256 bits e salve-a na SEC em um diretório de sua escolha. Em seguida, monte o volume clicando duas vezes no arquivo (ou usando o Utilitário de Disco).

  2. Crie um novo arquivo chamado keychain.py no contêiner seguro e cole o código abaixo.

  3. Agora abra o Terminal.app e altere o diretório para o volume criptografado montado: cd /Volumes/SEC

  4. Precisamos do gerenciador de pacotes python para instalar o módulo do Excel (você será solicitado a fornecer sua senha): sudo easy_install pip

  5. Precisamos instalar o módulo Python Excel: sudo pip install xlwt

  6. Agora exporte as senhas usando uma das outras respostas para esta pergunta. Acabei de fazer security dump-keychain -d > keychain.txte o spam clicou no botão Permitir enquanto segurava o mouse com a outra mão.

  7. A última etapa é converter o arquivo txt em uma planilha do Excel legível usando o script python: python keychain.py keychain.txt keychain.xls

.

#!/usr/bin/env python

import sys
import os
import re
import xlwt

# Regex to match both generic and internet passwords from a keychain dump
regex = re.compile(
    r"""
    keychain:\s"(?P<kchn>[^"]+)"\n                  # absolute path and file of keychain
    version:\s(\d\d\d)\n                            # version
    class:\s"(?P<clss>(genp|inet))"\n               # generic password or internet password
    attributes:\n
    (\s*?0x00000007\s<blob>=(?P<name>[^\n]+)\n)?    # name
    (\s*?0x00000008\s<blob>=(?P<hex8>[^\n]+)\n)?    # ? only used at certificates
    (\s*?"acct"<blob>=(?P<acct>[^\n]+)\n)?          # account
    (\s*?"atyp"<blob>=(?P<atyp>[^\n]+)\n)?          # account type ("form"), sometimes int
    (\s*?"cdat"<timedate>=[^"]*(?P<cdat>[^\n]+)\n)? # datetime created
    (\s*?"crtr"<uint32>=(?P<crtr>[^\n]+)\n)?        # vendor key with four chars like "aapl"
    (\s*?"cusi"<sint32>=(?P<cusi>[^\n]+)\n)?        # ? always null
    (\s*?"desc"<blob>=(?P<desc>[^\n]+)\n)?          # description
    (\s*?"gena"<blob>=(?P<gena>[^\n]+)\n)?          # ? always null except one rare cases
    (\s*?"icmt"<blob>=(?P<icmt>[^\n]+)\n)?          # ? some sort of description
    (\s*?"invi"<sint32>=(?P<invi>[^\n]+)\n)?        # ? always null
    (\s*?"mdat"<timedate>=[^"]*(?P<mdat>[^\n]+)\n)? # datetime last modified
    (\s*?"nega"<sint32>=(?P<nega>[^\n]+)\n)?        # ? always null
    (\s*?"path"<blob>=(?P<path>[^\n]+)\n)?          # path
    (\s*?"port"<uint32>=(?P<port>[^\n]+)\n)?        # port number in hex
    (\s*?"prot"<blob>=(?P<prot>[^\n]+)\n)?          # ? always null
    (\s*?"ptcl"<uint32>=(?P<ptcl>[^\n]+)\n)?        # protocol but is blob ("http", "https")
    (\s*?"scrp"<sint32>=(?P<scrp>[^\n]+)\n)?        # ? always null except one rare cases
    (\s*?"sdmn"<blob>=(?P<sdmn>[^\n]+)\n)?          # used for htaccess AuthName
    (\s*?"srvr"<blob>=(?P<srvr>[^\n]+)\n)?          # server
    (\s*?"svce"<blob>=(?P<svce>[^\n]+)\n)?          # ? some sort of description
    (\s*?"type"<uint32>=(?P<type>[^\n]+)\n)?        # some blob: "iprf", "note"
    data:\n
    "(?P<data>[^"]*)"                               # password
    """, re.MULTILINE | re.VERBOSE)

# Dictionary used by the clean function (Apple is not always right about the
# types of the field)
field2type = { 
    "name": "blob",
    "hex8": "blob",
    "acct": "blob",
    "atyp": "simple",
    "cdat": "timedate",
    "crtr": "uint32",
    "cusi": "sint32",
    "desc": "blob", 
    "gena": "blob",
    "icmt": "blob",
    "invi": "sint32",
    "mdat": "timedate",
    "nega": "sint32",
    "path": "blob",
    "port": "uint32",
    "prot": "blob",
    "ptcl": "blob",
    "scrp": "sint32",
    "sdmn": "blob",
    "srvr": "blob", 
    "svce": "blob",
    "type": "blob",
    "data": "simple",
    "kchn": "simple",
    "clss": "simple"
}

def clean(field, match):
    value = match.group(field)
    if not value or value == "<NULL>":
        # print null values as empty strings
        return ""
    if field2type[field] == "blob":
        # strip " at beginning and end
        return value[1:-1]
    elif field2type[field] == "timedate":
        # convert timedate to the iso standard
        value = value[1:-1]
        return value[0:4] + "-" + value[4:6] + "-" + value[6:8] + "T" + \
            value[8:10] + ":" + value[10:12] + ":" + value[12:14] + "Z" + value[16:19]
    elif field2type[field] == "uint32":
        # if it really is a hex int, convert it to decimal
        value = value.strip()
        if re.match("^0x[0-9a-fA-F]+$", value):
            return int(value, 16)
        else:
            return value
    else:
        # do nothing, just print it as it is
        return value

def print_help():
    print "Usage: python keychain.py INPUTFILE OUTPUTFILE"
    print "Example: python keychain.py keychain.txt keychain.xls"
    print "  where keychain.txt was created by `security dump-keychain -d > keychain.txt`"
    print "  When dumping the keychain, you have to click 'Allow' for each entry in your"
    print "  keychain. Position you mouse over the button and go clicking like crazy."




print "Keychain 0.1: convert an Apple Keychain dump to an Excel (XLS) spreadsheet."

# Check for correct parameters
if len(sys.argv) != 3:
    print_help()
    sys.exit(1)
elif len(sys.argv) == 3:
    if not os.path.isfile(sys.argv[1]):
        print "Error: no such file '{0}'".format(sys.argv[1])
        print_help()
        exit(1)

# Read keychain file
buffer = open(sys.argv[1], "r").read()
print "Read {0} bytes from '{1}'".format(len(buffer), sys.argv[1])

# Create excel workbook and header
wb = xlwt.Workbook()
ws = wb.add_sheet("Keychain")
ws.write(0, 0, "Name")
ws.write(0, 1, "Account")
ws.write(0, 2, "Password")
ws.write(0, 3, "Protocol")
ws.write(0, 4, "Server")
ws.write(0, 5, "Port")
ws.write(0, 6, "Path")
ws.write(0, 7, "Description")
ws.write(0, 8, "Created")
ws.write(0, 9, "Modified")
ws.write(0, 10, "AuthName")
ws.write(0, 11, "AccountType")
ws.write(0, 12, "Type")
ws.write(0, 13, "Keychain")

# Find passwords and add them to the excel spreadsheet
i = 1
for match in regex.finditer(buffer):
    ws.write(i, 0, clean("name", match))
    ws.write(i, 1, clean("acct", match))
    ws.write(i, 2, clean("data", match))
    ws.write(i, 3, clean("ptcl", match))
    ws.write(i, 4, clean("srvr", match))
    ws.write(i, 5, clean("port", match))
    ws.write(i, 6, clean("path", match))
    ws.write(i, 7, clean("desc", match))
    ws.write(i, 8, clean("cdat", match))
    ws.write(i, 9, clean("mdat", match))
    ws.write(i, 10, clean("sdmn", match))
    ws.write(i, 11, clean("atyp", match))
    ws.write(i, 12, clean("clss", match))
    ws.write(i, 13, clean("kchn", match))
    i += 1
wb.save(sys.argv[2])

print "Saved {0} passwords to '{1}'".format(i-1, sys.argv[2])

Uau, isso parece realmente completo. Vou tentar, embora ainda precise de uma solução para as notas seguras e as senhas de aplicativos ... :(
— Porém

Encontrado este excelente break-down de notas seguras: stackoverflow.com/questions/22370552/...
— hepcat72

Agora só preciso descobrir como criar uma exportação de um rtfd que inclua uma imagem incorporada. Tenho algumas anotações com senhas em maiúsculas.
— hepcat72

Impressionante Além disso, mais um e THX
— ehime

5

No OSX 10.10.3, há uma nova maneira de aceitar automaticamente (eu tive problemas durante um caminho de atualização)

Funções Bash (adicionados a qualquer .profileou .bash_rcarquivos)

## At the terminal when you start getting the prompts, type `Accepts` and press enter
function Accepts () {
osascript <<EOF
  tell application "System Events"
    repeat while exists (processes where name is "SecurityAgent")
      tell process "SecurityAgent" to click button "Allow" of window 1
      delay 0.2
    end repeat
  end tell
EOF
}

## At the terminal when you start getting the prompts, type `Accepts YourUsername YourPassword` and press enter
function AcceptWithCreds () {
username="$1"
password="$2"

[ -z "${password}" ] && return 1

osascript 2>/dev/null <<EOF
    set appName to "${username}"
    set appPass to "${password}"
    tell application "System Events"
        repeat while exists (processes where name is "SecurityAgent")
            tell process "SecurityAgent"
                if exists (text field 1 of window 1) then
                    set value of text field 1 of window 1 to appName
                    set value of text field 2 of window 1 to appPass
                end if
            end tell
      tell process "SecurityAgent" to click button "Allow" of window 1
            delay 0.2
        end repeat
    end tell
EOF
echo 'Finished...'
}

E use este script para despejar seu chaveiro ( sudo ./dump.sh)

#!/bin/bash
# Run above script in another window

security dump-keychain -d login.keychain > keychain-login.txt
security dump-keychain -d /Library/Keychains/System.keychain > keychain-system.txt

Isso é ótimo! Quando o executei, cheguei execution error: System Events got an error: osascript is not allowed assistive access.à linha de comando. A maneira mais fácil de lidar com isso foi colar o código AppleScript no aplicativo Script Editor e executá-lo a partir daí.
— Evan

Não AppleScripts trabalhando em 10.10.5
— oarfish

11
Isso funcionou para mim no OS X El Capitan 10.11.6. Certifique-se de não copiar o último caractere (backtick) do script. O osascript is not allowed assistive accesserro pode ser evitado permitindo que o seu aplicativo Terminal em Preferências do Sistema => Segurança e Privacidade => Acessibilidade.
— neon1

Isso não funciona no Mojave. AcceptWithCreds simplesmente termina, sem fazer nada.
— oarfish

4

A resposta do @ MichaelStoner é um bom começo, mas falha no OS X 10.10.3 Yosemite, com seu relatório de código AppleScript System Events got an error: Can’t get group 1 of window 1 of process "SecurityAgent". Invalid index.

Depois de brincar um pouco, a seguinte solução funcionou para mim:

tell application "System Events"
    repeat while exists (processes where name is "SecurityAgent")
        tell process "SecurityAgent"
            keystroke " "
        end tell
        delay 1
    end repeat
end tell

Você terá que clicar na caixa de diálogo "Permitir" depois de iniciar isso. Esse código vai demorar um pouco, mas eu aconselho a não diminuir o atraso ("atraso 0,2" me forçou a desligar o meu Mac). Apenas pegue uma xícara de café.


11
O espaço -> teclas "" só funciona se você tiver Preferências do Sistema -> Preferências de teclado -> guia Atalhos, opção de fundo "Full Acesso Teclado" e, em seguida, selecionou "Todos os controles"
— MichaelStoner

3

A função de Exportação de Chaveiro é para ITENS, não para todo o chaveiro. Também não permitirá que você exporte a maioria dos itens - é quando você verá a função Exportar acinzentada.

Para copiar as chaves de um mac para outro, use o aplicativo Assistente de Migração .

Ou faça isso manualmente, copiando o arquivo de chaveiro localizado na pasta ~ / Library / Keychains /.

Abra o aplicativo Keychain Access no novo computador e escolha File> Add Keychain….


11
Obrigado, mas eu disse "a um outro sistema operacional" ... eu quero deixar OS X ...
— Maïeul

Obrigado pela edição e clareza. O outro sistema operacional era enganador. Então você quer como um arquivo de texto (CSV)?
— Ruskes

11
sim, um arquivo CSV, enquanto ser ok ...
— Maïeul

1

O securitybinário recuperará itens do chaveiro na linha de comando, para que você possa script isso em python para despejar o conteúdo sistematicamente. Realmente depende de qual formato você deseja que os dados e como os utilizará daqui para frente.

Copiar / colar também é uma opção decente se você sabe quanto tempo deseja implementar uma nova solução e se precisa aprender / procurar um programa ou biblioteca existente que despeje o conteúdo no formato escolhido.

O menu de itens de exportação é para exportação de chave pública e / ou privada para a qual existem formatos de arquivo padrão do setor para codificar e proteger os dados conforme apropriado quando armazenados no sistema de arquivos para troca e transporte. Essa função está documentada brevemente na ajuda do Assistente de chaveiro.


Não há outra maneira senão roteirizar isso? Ok, eu vou olhar para este binário, mas ... a tantos necessidade básica, apenas para ter algo como um CSV ...
— Maïeul

11
Se você pode editar sua postagem para especificar qual sistema operacional novo e que cvs é o formato que você gosta, eu provavelmente teria mais algumas idéias para você. Como solicitado, é muito vago ...
— bmike

0

Existe uma ferramenta chamada KeychaindumpPro https://hackforums.net/showthread.php?tid=5803486 .

Para extrair frase-senha / conta / pagamento / nota segura / chave pública / chave privada / chave simétrica / certificado e assim por diante do chaveiro em silêncio.


2
Você não deve inserir links que exijam que um usuário crie uma conta para visualizar o conteúdo. Seria melhor se você reformulasse o conteúdo do link.
— David Anderson
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.