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