منبع اصلی نوشتار زیر در این لینک قرار دارد

نیم نگاهی به master password در فایرفاکس

سلام . در واقع توی این مقاله 3 مبحث رو با هم دنبال می کنیم :

1. آشنایی با master password در فایرفاکس

2. برنامه ای برای کرک master پسورد فایرفاکس

3. نحوه ی نوشتن اسکریپتی کوچیک برای کرک master پسورد فایرفاکس

1. آشنایی با master password در فایرفاکس :

یکی از ویژگی های فایرفاکس master password است که امکان پسورد گذاری روی پسورد های ذخیره شده در فایرفاکس را می دهد . به این صورت که برای دیدن پسورد های ذخیره شده بایستی ابتدا یک پسورد master را وارد کنیم تا به کل پسورد های ذخیره شده دسترسی داشته باشیم .

برای ریکاوری کردن پسورد master ابزار های بسیار خوب و با سرعتی بالا حتی در سیستم عامل ویندوز وجود دارد . اما ما در ادامه یک اسکریپت پایتون را معرفی می کنیم و در ادامه یک اسکریپ به زبان bash می نویسیم و به عنوان یک پچ از آن جهت پیدا کردن master پسورد فایرفاکس استفاده می کنیم .

2. برنامه ای برای کرک master پسورد فایرفاکس :

ابتدا لازم به ذکر است برای استفاده از اسکریپت زیر به فایل key3.db و signons.sqlite ( جهت خارج کردن پسورد ها و یوزرنیم ها و …  ) لازم است .

ابتدا اسکریپ پایتون زیر رو نگاه کنید :

https://github.com/lclevy/firepwd

اگر یک help از این اسکریپت بگیرید می بینید که به صورت زیر عمل می کند :

python firepwd.py -p "test_master_password" -d ./mozilla_db/

همان طور که مشاهده می کنید از سویچ p- برای مشخص کردن پسورد احتمالی استفاده می کنیم و  از سویچ d- برای مشخص کردن دایرکتوری ای که دو فایل key3.db و signons.sqlite درون آن قرار دارد استفاده کردیم .

توجه داشته باشید که mozilla_db مثال می باشد و ما می تونیم آدرس کامل این دو فایل از سیستم خودمون رو بدیم و یا این که دو فایل key3.db و signons.sqlite رو در دایرکتوری جاری کپی کنیم و در آخر به صورت زیر سویچ d- رو تعریف کنیم :

توجه داشته باشید که نقطه به معنی جای دایرکتوری ای که در آن هستیم است .

python firepwd.py -p "test_master_password" -d .

پس از اجرای اسکریپت در صورتی که پسورد درست باشید خروجی ای مبنی بر decrypting login/password pairs خواهید گرفت و اگر پسورد درست نباشد اروری مبنی بر password check error می گیرید .

 

02


خوب پس ما می تونیم با دستورات و برنامه های خود خط فرمان لینوکس , یک اسکریپت بسیار ساده و کوچیک به زبان bash تهیه کنیم که همین روند رو برای ما انجام بده .

یعنی پسورد های احتمالی ما رو از داخل یک فایل خوانده و در جلوی سویچ p- در برنامه جایگذاری کند .

 

3. نحوه ی نوشتن اسکریپتی کوچیک برای کرک master پسورد فایرفاکس :

تذکر : الگوریتم استفاده شده در این اسکریپت بسیار ضعیف بوده چرا که هدف آشنا کردن با اسکریپت نویسی با استفاده از دستورات لینوکس به زبان bash است نه صرفا ساخت برنامه ای با سرعتی بالا جهت کرک master password

 

مرحله ی اول :

در مرحله ی اول تعداد خطوط فایل پسورد لیست را پیدا می کنیم . یعنی تعداد پسورد ها را در داخل لیست خودمون مشخص می کنیم . ( در هر سطر یک پسورد )

برای این منظور از 2 دستور cat و wc استفاده می کنیم . به این صورت :

cat list.text | wc -l

خروجی دستور بالا یک عدد است , پس آن را به صورت زیر داخل یک متغیر می ریزیم :

lines=`cat list.text | wc -l`

 

مرحله ی دوم :

در این مرحله از یک حلقه به دفعات تعداد خطوط پسورد لیست خودمون استفاده می کنیم . مثلا اگه پسورد لیست ما حاوی 50  پسورد احتمالی باشه , یک حلقه با تعداد دفعات 50 بار خواهیم داشت .

یکی از فرم های استفاده از حلقه در bash به صورت زیر است :

for (( i = 1 ; i <= 50 ; i++ ))
do
done

که اعمالی که قرار است انجام دهیم در بین do و done قرار می گیرد . در مرحله ی اول تعداد خطوط یعنی همان تعداد دفعات تکرار حلقه را مشخص کردیم و آن را در داخل متغیری با نام lines ریختیم . پس برای استفاده از این متغیر به این صورت در داخل حلقه ی خودمون استفاده می کنیم :

for (( i = 1 ; i <= $lines ; i++ ))
do
done

 

مرحله ی سوم :

این قسمت در داخل حلقه قرار دارد و قرار است در این مرحله سطر به سطر پسورد لیست رو بخونیم و آن را داخل برنامه ی اصلی در جلوی سویچ p- قرار دهیم . برای این که سطر  به سطر فایل پسورد لیست رو بخونیم از 3 ابزار cat و head و tail به صورت مشترک استفاده می کنیم . به این صورت :

cat list.text | head -n $i | tail -n 1

نکته : با استفاده از دستور head , ابتدا فایل پسورد لیست رو می خونیم و برای مشخص کردن تعداد سطر های خوانده شده از سویچ n- استفاده می کنیم .

نکته : با استفاده از دستور tail , آخر فایل رو می خونیم که با استفاده از سویچ n- و مقدار 1 تعریف کردیم که همیشه آخرین سطر را بخواند

نکته : در داخل حلقه متغیری تعریف کردیم به نام i که از 1 تا مقدار خطوط پسورد لیست , شروع به شمارش می کند .

در آخر دستور بالا یک خروجی به ما می دهد , پس آن را داخل یک متغیر ذخیره می کنیم . یعنی :

tail=`cat list.text | head -n $i | tail -n 1`

 

مرحله ی چهارم :

این مرحله در واقع مهم ترین بخش است چرا که وظیفه ی تست پسورد های احتمالی را بر عهده دارد .

خب پس کافیست برنامه اصلی رو به فرم زیر اجرا کنیم !

./firepwd.py -p $tail -d mozilla_db/ | grep -o "pairs" ; echo error

در ابتدا برنامه رو اجرا کردیم سپس همان طور که گفته شد با سویچ p- پسورد رو مشخص می کنیم که پسورد احتمالی ما از داخل متغیر tail خوانده می شود و چون این عمل در داخل حلقه است , هر بار یک پسورد در داخل خود دارد .

در ادامه هم با استفاده از سویچ d- دایرکتوری ای که 2 فایل key3.db و signons.sqlite قرار دارند رو مشخص کردیم .

همان طور که قبلا گفته شد , در صورتی که پسورد درست باشد , برنامه خروجی ای مشخص برای ما چاپ می کند . در داخل این خروجی عبارت pairs یکتا و ثابت است پس در نتیجه با grep کردن این عبارت می تونیم پی به این که پسورد درست است یا نه ببریم .

توجه داشته باشید که از سویچ o- برای مشخص کردن این که دقیقا دنبال این عبارت بگردد و اگر وجود داشت چاپش کند , استفاده کردیم .

این نکته رو به یاد داشته باشید که در صورتی که پسورد درست نباشد , دستور grep فاقد خروجی است , (فرضا) این بعدا می تونه برای ما مشکل ساز بشه , پس برای حل این مشکل از echo استفاده کردیم . در آخر برای این که خروجی کارمون رو داخل یک متغیر ذخیره کنیم به این شکل عمل می کنیم :

firepwd=`./firepwd.py -p $tail -d mozilla_db/ | grep -o "pairs" ; echo error`

نکته : متغیر firepwd می تواند دو حالت زیر را داشته باشد :

الف : error

ب : pairs error

 

مرحله ی پنجم :

گفتیم که متغییر firepwd دو حالت می تونه داشته باشه , پس برای پالایش کردن این متغیر به صورت زیر عمل می کنیم :

cout=`echo $firepwd | head -c 5`

اگه متغیر firepwd حاوی عبارت error باشه که باز 5 کارکتر اول توسط دستور head جدا میشه و در داخل متغیر cout ریخته میشه .

اما اگه متغیر firepwd حاوی عبارت pairs error باشه , با استفاده از دستور head , پنچ کارکتر اول آن یعنی pairs خوانده شده و در داخل متغیر cout ریخته میشه .

پس در نهایت متغیر cout می تونه 2 حالت داشته باشه : الف) error ب) pairs

 

مرحله ششم :

خب حالا که به دو حالت error و pairs در اجرای اسکریپت پایتون اصلیمون رسیدیم , می تونیم با استفاده از شرط گذاری خروجی مناسبی برای اسکریپت در نظر بگیریم . یعنی :

if [ $cout = 'pairs' ]
then
  echo $i" [+] password : "$tail  ; exit
else
  echo $i" [-] "$tail

fi

همان طور که در شرط بالا مشخص است , اگر مقدار متغییر cout برابر با pairs باشه , برنامه خروجی ای مبنی بر بدست آمدن پسورد چاپ می کند و سپس از برنامه خارج می شود .

اما اگر این طور نبود برنامه خروجی ای مبنی بر پسورد احتمالی تست شده چاپ کرده و سپس به ابتدای حلقه باز می گردد تا همین روند ( 6 مرحله‌ ) از اول تکرار شود .

 

مرحله ی هفتم :

حالا کافیست دستوراتی که در هر مرحله گفتیم رو در قالب یک فایل متنی با پسوند sh ذخیره کنیم . یعنی :

#////////////////////////////////////////////////////////////////////////////////#
#!/bin/bash
# www.OSLearn.ir
# [email protected]
#////////////////////////////////////////////////////////////////////////////////#
#
# list.text : password list
# mozilla_db/ : key3.db and signons.sqlite directory
#
#////////////////////////////////////////////////////////////////////////////////#
reset
lines=`cat list.text | wc -l`
for (( i = 1 ; i <= $lines ; i++ ))
do

#////////////////////////////////////////////////////////////////////////////////#
tail=`cat list.text | head -n $i | tail -n 1`
firepwd=`./firepwd.py -p $tail -d mozilla_db/ | grep -o "pairs" ; echo error`
cout=`echo $firepwd | head -c 5`

#////////////////////////////////////////////////////////////////////////////////#
if [ $cout = 'pairs' ]
then
  echo $i" [+] password : "$tail  ; exit
else
  echo $i" [-] "$tail

fi
#////////////////////////////////////////////////////////////////////////////////#
done
#////////////////////////////////////////////////////////////////////////////////#

جهت اجرا کافیست پرمیشن اجرا به فایل بدیم برای این منظور از chmod +x استفاده می کنیم و در نهایت اسکریپت خودمون رو به شکل زیر اجرا می کنیم :

./Control.sh

 

01

نویسنده : E2MA3N

منبع : او اس لرن دات آی آر | http://OSLearn.ir



برچسب ها : ,