Diskussion:Online Passwörter
Demo Script zum Beitrag
Achtung:
- Wer an diesem Script aus welchen Gründen auch immer rumspielen will, viel Spaß ;-)
- Es steht dort einer Kommentarzeile etwas an das man sich dann erinnern sollte.
# PLEASE DO NOT EDIT : the script includes modifying protection
Einschränkungen:
- Es ist nur möglich die Passwörtern anzuzeigen wenn man selbst der Besitze des entsprechenden Firefox-Profiles ist, root kann also nicht einfach so sich die Passwörter von allen Usern auf dem System anschauen.
- Das Script läuft nur unter der bash, "sh scriptname" wird eventuell nicht ausreichen. Entweder "bash scriptname" oder Ausführungsrechte auf das Script und dann "./scriptname"
- Für Firefox kleiner als Version 32 ist eventuell das kleine Paket sqlite3 zu installieren, manchmal ist es nicht installiert, da dieses bei den aktuellen Versionen aber sowieso nicht mehr benötigt wird, wurde darauf verzichtet die Daten auch ohne sqlite3 aus der Datei zu holen.
#!/bin/bash
# Firefox can store usernames and passwords that you used to access online services
# This script can decrypt and displays this data
# Autor : robi@linux-club.de V 1.6 (26.08.2015)
# Usage : bash scriptname [ directory ]
# PLEASE DO NOT EDIT : the script includes modifying protection
function h2x(){ echo -n "$1" | sed 's/\(..\)/\\x\1/g'; };
function a2h(){ echo -n "$1" | xxd -p -c 256 - ;};
function h2b(){ H=$(h2x $1) ; echo -en "$H"; };
function sha1(){ h2b "$1$2" | sha1sum | sed 's/\(.\{40\}\).*$/\1/'; };
function hmac(){ h2b "$1$2" | openssl dgst -sha1 -hmac "$(h2b $3)" 2>/dev/null | sed 's/.*= //'; };
function asn1(){ h2b "$2" |openssl asn1parse -inform $1 ${3:+ -strparse $3} 2>/dev/null;};
function des3(){ h2b "$1" | openssl des3 -K "$2" -d -iv "$3" 2> /dev/null ; };
function check(){ sed 's/[ \t]//g;/^$/d' $1|sha1sum |awk '{printf("%c",strtonum("0x" substr($1,4,8))%26+97)}';};
function signon_sql(){ sqlite3 "$1" "SELECT hostname,encryptedUsername,encryptedPassword FROM moz_logins;"; };
function logins_json(){ sed 's/\({"id"\)/\n\1/g' "$1" | awk -F'"' 'NR==1{next;};{print $6, $24, $28}'; };
function asn1_b64(){ echo -n $1 | base64 -d | openssl asn1parse -inform DER 2>/dev/null; };
function parse(){ asn1_b64 $1 |awk -F':' '$3~/OBJECT/{D=$4};$3~/HEX DUMP/{if($4~/^F80*1$/)next;(!IV)?IV=$4:P=$4;if(P){print P,IV,D;exit; };}' ;};
function moz_decode(){ read P IV D < <(parse $2);echo -n $P |xxd -r -p |openssl $D -K "$1" -d -iv "$IV" 2>/dev/null; };
if ! which sqlite3 >& /dev/null
then
echo "Package \"sqlite3\" is required up to Firefox version 31" ;
echo "but is not mandatory with newer Firefox versions" ;
NOSQLITE=1 ;
fi ;
if [ $# -ge 1 ]
then
DIR="$1" ;
else
DIR="$HOME/.mozilla/firefox" ;
if [ -r "$DIR/profiles.ini" ]
then
DIR=${DIR}/$(awk -F '=' '/Name=default/{F=1;};
($1=="Path"&&F==1){print $2;exit;}' "$DIR/profiles.ini") ;
fi
fi
if [ -d "$DIR" -a -r "$DIR" ]
then
if [ -O "$DIR/key3.db" ]
then
KEY3="$DIR/key3.db" ;
LOGINS="$DIR/logins.json" ;
SIGNONS="$DIR/signons.sqlite" ;
if [ ! -r "$LOGINS" ]; then LOGINS=""; fi
if [ ! -r "$SIGNONS" ]; then SIGNONS=""; fi
fi
fi
if [ -z "$SIGNONS" -a -z "$LOGINS" ]
then
echo "Error: Can not find or read Firefox profile data at \"$DIR\" for userID= \"$UID\"";
echo -e "\nUsage: bash $0 /home/USERNAME/.mozilla/firefox/DIR.default \n" ;
echo "\"DIR.default\" should be your user profile directory of Firefox" ;
exit ;
fi
echo -e "\n" ;
read gs ES PW CS priv_key < <(xxd -p -c 256 "$KEY3" |awk --re-interval '$0 ~/^f*$/{next};
$0 ~/^0*$/{next};
$0~/76c6f62616c2d73616c74/{match($0,"676c6f62616c2d73616c74");
gs=substr($0,RSTART-40,40);
h=strtonum("0x" substr($0,RSTART+24,2));
ES=substr($0,RSTART+28,2*h);
match($0,"70617373776f72642d636865636b");
CS=substr($0,RSTART,26);
PW=substr($0,RSTART-32,32)};
$0 ~/f80{29}1/{match($0,"f80{29}1");
priv=substr($0,(RSTART-286),286)};
END{print gs,ES,PW,CS,priv} ;
')
if [ -z $priv_key ] ; then echo "This key3.db does not have encrypted passwords"; exit; fi;
read -s -e -p "Enter your Firefox Master Password: " A ;
echo -e "\n" ;
MP=$(a2h "$A") ; unset A ;
HP=$(sha1 $gs $MP) ;
for ((L=0;L<2;L++))
do
PES="${ES}00000000" ;
PES=${PES::40} ;
CHP=$(sha1 $HP $ES) ;
k1=$(hmac $PES $ES $CHP) ;
tk=$(hmac $PES "" $CHP) ;
k2=$(hmac $tk $ES $CHP) ;
k=$k1$k2 ;
key=${k::48} ;
iv=${k:64:16} ;
if [ $L -eq 0 ] && [ "$(h2b $CS$(check $0))" != "$(des3 $PW $key $iv)" ]
then
echo "Error: The original script has be manipulated or Master Password is incorrect" ;
exit ;
fi
if [ $L -eq 1 ]
then
OUTPUT=$(des3 $PW $key $iv | xxd -p -c256 - ) ;
OFFSET=$(asn1 DER $OUTPUT | awk -F ':' '$3 ~ /HEX DUMP/{print $1+0; exit}') ;
KEY=$(asn1 DER $OUTPUT $OFFSET |awk -F ':' 'length($4)>=48{P=substr($4,length($4)-48);print P;exit}') ;
continue ;
fi
read ES PW < <(asn1 DER $priv_key | awk -F':' '$3 ~ /HEX DUMP/{printf("%s ",$4)};END{;};')
done
if [ -z "$NOSQLITE" -a -n "$SIGNONS" ]
then
echo {-,-,-}{-,-,-}- signons.sqlite --- Firefox \< V.32 {-,-,-}{-,-,-}-
IFS='|';
signon_sql "$SIGNONS" | while read URL USERN PASSWD
do
unset IFS;
printf "%-50s%-50s%-15s\n" $URL $(moz_decode $KEY $USERN) $(moz_decode $KEY $PASSWD);
IFS='|';
done
unset IFS;
echo
fi
if [ -n "$LOGINS" ]
then
echo {-,-,-}{-,-,-}- logins.json ----- Firefox \>= V.32 {-,-,-}{-,-,-}-
logins_json "$LOGINS" | while read URL USERN PASSWD
do
printf "%-50s%-50s%-15s\n" $URL $(moz_decode $KEY $USERN) $(moz_decode $KEY $PASSWD);
done;
fi
echo
exit