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.