On Github phryneas / vortrag-nerdend-kryptotoken
(mit möglichst viel bash)
echo asd > test gpg -r B76C94DD -e -a test rm test cat test.asc #-----BEGIN PGP MESSAGE----- #Version: GnuPG v2 # #hQEMA0lF8LJU85UOAQf+NyIekK8CIw7U12Dlq8Xt7xTPJCamBTN6aYOtXYsbqJ1F # [...] #=iwpb #-----END PGP MESSAGE----- gpg -q -o test -d test.asc cat test #asd
echo test | gpg -r B76C94DD -e -a #-----BEGIN PGP MESSAGE----- #Version: GnuPG v2 # #hQEMA0lF8LJU85UOAQf+NyIekK8CIw7U12Dlq8Xt7xTPJCamBTN6aYOtXYsbqJ1F # [...] #=iwpb #-----END PGP MESSAGE----- cat <<EOF | gpg -q -d -----BEGIN PGP MESSAGE----- [...] -----END PGP MESSAGE----- EOF #test
# zum schnellen testen: Schlüssel erzeugen openssl genpkey -algorithm RSA -out private.key -pkeyopt rsa_keygen_bits:2048 openssl rsa -pubout -in private.key -out public.pem # verschlüsseln echo asd > test openssl pkeyutl -encrypt -in test -pubin -inkey public.pem -out test.ssl rm test # entschlüsseln openssl pkeyutl -decrypt -in test.ssl -inkey private.key -out test
# bei einer Smartcard liegt vermutlich ein Zertifikat vor # wir brauchen einen public key openssl x509 -pubkey -noout -in cert.crt > public.pem # verschlüsseln echo asd > test openssl pkeyutl -encrypt -in test -pubin -inkey public.pem -out test.ssl rm test # entschlüsseln - OpenSC to the rescue! pkcs15-crypt --decipher --pkcs1 --input test.ssl --output test
Man nehme Software, die keine physikalischen Token unterstützt und fummelt sich was zurecht, damit es trotzdem klappt.
...definieren wir uns eine Funktion, die das Passwort entschlüsselt und auf STDOUT ausspuckt
#!/bin/bash function getkey(){ gpg -q -d test.asc }
irgendwie sowas in der Art.
zum Testen empfehle ich aber
#!/bin/bash function getkey(){ echo asd }
Herausforderung:
#!/bin/bash some-program --key-file=<(getkey)
Man schreibt sich eine library, die man in das Programm injected, die einen auf STDIN nach dem Passwort fragt (oder die irgendwie anders an das Passwort kommt) und dann intern die originale main-Methode mit dem richtigen Passwort aufruft. Gestartet wird auf der Kommandozeile mit einem Fake-Passwort.
aufgerufen wird es dann auf der Kommandozeile so:
LD_PRELOAD=$PWD/injectpassword.so some-program fake-password
das wäre der Beispielcode:
#define _GNU_SOURCE #include <dlfcn.h> #include <unistd.h> static int (*real_main) (int, char * *, char * *); static int my_main(int argc, char * * argv, char * * env) { char *pass = getpass(argv[argc - 1]); if (pass == NULL) return 1; argv[argc - 1] = pass; return real_main(argc, argv, env); } int __libc_start_main( int (*main) (int, char * *, char * *), int argc, char * * ubp_av, void (*init) (void), void (*fini) (void), void (*rtld_fini) (void), void (* stack_end) ) { int (*next)( int (*main) (int, char * *, char * *), int argc, char * * ubp_av, void (*init) (void), void (*fini) (void), void (*rtld_fini) (void), void (* stack_end) ) = dlsym(RTLD_NEXT, "__libc_start_main"); real_main = main; return next(my_main, argc, ubp_av, init, fini, rtld_fini, stack_end); }
aber ernsthaft: simply don't do it.
expect to the rescue!
#!/usr/bin/expect eval spawn some-program expect "please enter password" send "Frikandelle\r" interact
und mit einem Passwort, dass wir per command injection bekommen:
#!/usr/bin/expect set passwordfile [lindex $argv 0] set fp [open $passwordfile r] set password [read $fp] close $fp eval spawn ./some-program expect "please enter password" send $password interact
( getpass; echo #für ein Newline ) | xdotool type \ --window $(xdotool search --name "Passwortabfrage" --sync | head -n 1) \ - #von SDTIN