Diskussion:Online Passwörter

Aus Linupedia.org
Wechseln zu: Navigation, Suche

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