(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:
/dev/shm
?)
#!/bin/bash
some-program --key-file=<(getkey)
/dev/fd/X
/proc/<procid von some-program>/fd/X
abbildenps
& co das Passwort einfach auslesen kannMan 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