بررسی روشهای بازیابی فایلها از فایل سیستم های ext3 و ext4

شاید برای خیلی ها تون پیش اومده باشه که به اشتباه یک فایل یا حتی پوشه رو از فایل سیستم های ext3 و یا ext4 حذف کرده باشین ( منظورم از حذف با استفاده از دستور rm هست) و بعد هم به مطالبی بر خورده باشین که این کار ممکن نیست و کلا بی خیال ماجرا شده باشین! تو این پست می خوام دلیل به ظاهر غیرممکن بودن این قضیه و کنارش روشهایی برای ممکن کردنش و همینطور ابزارهایی رو که از این روشها استفاده می کنن بهتون معرفی کنم.

اول از همه یه توضیحی در مورد این فایل سیستم ها و ساختارشون می گم تا ادامه مطلب براتون واضح تر بشه.

شکل بالا ساختار کلی فایل سیستم های ext2/3/4 رو نشون می ده. همونطور که می بینید کل فایل سیستم به بخش هایی به اسم block group تقسیم می شه. اون قسمت اول یعنی boot block هم برای پارتیشن بوت سکتور رزرو شده و ext بهش کاری نداره. همونطور که می بینید هر block group به بخش های مختلفی تقسیم می شه. علت این تقسیم بندی اینه که فایلها کمتر تکه تکه بشن، چون کرنل همیشه سعی می کنه block هایی رو که متعلق به یه فایل هستن تو یه block group نگه داری کنه. یکی از بخش های موجود تو هر گروه Data block ها هستن که محتوای فایل تو اونها نگه داری می شه. تعداد این block ها ثابته و اگه اندازه فایل به اندازه کافی کوچیک باشه کل فایل تو یه block group نگه داری می شه ولی اگه اندازه اش بزرگتر از حدی باشه که تو یه block group جا بشه block  ها در مکان دیگه ای قرار می گیرن و آدرسشون تو آخرین block از data blocks قرار می گیره. که به این نوع block ها می گن indirect block. یکی دیگه از بخش ها inode table هست که کارش نگه داری metadata های مربوط به هر فایل هست، مثل نوع فایل و مجوزهاش، انداز فایل، مالک فایل، زمانهای آخرین دسترسی و آخرین تغییر و حذف فایل، تعداد data block ها و آدرسشون و …. برای دیدن شماره inode مربوط به یه فایل می تونین از دستور ls -i filename استفاده کنین. بخش های دیگه رو هم توضیح نمی دم ولی اگه خیلی مشتاق به دونستن اینکه هر کدوم چی کار می کنن و ساختارشون چطوریه هستین، می تونین فصل ۱۸ کتاب understanding the linux kernel 3rd edition رو بخونین. البته این کتاب بیشتر در مورد فایل سیستم ext2 و در آخر فصل از ext3 گفته که البته ساختار کلی همونه ولی برای به روز بودن و متوجه شدن تغییرات می تونین یا کد کرنل رو بخونین یا تو سایتهای مختلف در موردش جستجو کنید که البته خیلی چیز خاصی پیدا نخواهید کرد. برای خوندن کد کرنل و مشاهده تغییرات موجود تو ورژنهای مختلفش و یا جستجوی تابع یا ساختار خاصی از اون هم می تونین از سایت http://lxr.linux.no استفاده کنید.

شکل بالا هم ساختار یه دایرکتوری رو نشون می ده. یکی از نکاتی که شایدم زیاد شنیده باشین اینه که توی لینوکس به همه چیز به عنوان یه فایل نگاه می شه و تفاوتشون اینه که از data block ها به شیوه های مختلف استفاده می کنن. بنابراین دایرکتوری هم به عنوان یه فایل در نظر گرفته می شه ولی از data block ها برای ذخیره نام فایلهایی که توش قرار گرفتن همراه با شماره inode متناظرشون استفاده می کنه. گزینه های rec_len و name_len و file_type هم به ترتیب طول اطلاعات موجود تو ردیف مورد نظر، طول فایل و نوع فایل رو مشخص می کنند. مثلا نوع ۲ یعنی فایل از نوع دایرکتوری هست. به عنوان نمونه تو شکل بالا inode شماره ۲۱ متعلق به . یعنی نام دایرکتوری جاری هست. طول کل ردیف ۱۲،  طول نام فایل ۱ و نوع فایل از نوع ۲ یعنی دایرکتوری هست.

خاصیت journaling:

از فایل سیستم ext3 به بعد این خاصیت به فایل سیستم های ext اضافه شد ( البته فایل سیستم های زیادی این خاصیت رو دارن ) که به این صورته که فایل سیستم فضایی به اسم  journal رو در نظر می گیره که metadata ها قبل از به روز شدن تو اون قرار می گیرن و بنابراین در حالتی که سیستم کرش کنه یا مشکلی براش پیش بیاد به جای اینکه سیستم عامل کل metadata ها رو بخونه وساختارشون رو بررسی کنه فقط سراغ journal می ره و اون رو یا بررسی می کنه و یا metadata ها رو جایگزین می کنه و بنابراین فرآیند بازیابی خیلی سریعتر می شه. ساختارهای metadata ها هم می تونن مثل entry های دایرکتوری و یا مثل خود inode باشن و نکته دیگه ای هم که وجود داره اینه که اگه حتی یکی از اطلاعات موجود تو این ساختار هم تغییر کنه ( مثلا زمان آخرین دسترسی ) کل اون ساختار تو journal ذخیره می شه نه فقط اون داده ای که تغییر کرده و تو این حالت مثلا کل inode ذخیره می شه.

فرآیند حذف:

وقتی که یه فایل رو از سیستم حذف می کنید فرآیند های زیادی تو فایل سیستم رخ می ده که اینجا نیاز به توضیح دادن همه اش نیست و اگه مشتاق به دونستنش باشین باز هم می تونین به همون کتابی که معرفی کردم مراجعه کنید. اما به زبون ساده و کاملا غیرفنی می شه گفت در حالت کلی سیستم عامل هر کدوم از data block ها، inode و entry  دایرکتوری رو به عنوان فضای اختصاص داده نشده علامت می زنه و در نظر می گیره. مثلا در مورد entry دایرکتوری inode متناظر اون entry رو صفر می کنه  و طول رکورد entry قبلی رو با entry حذف شده  جمع می کنه و به عنوان طول جدید قرار می ده تا entry حذف شده نادیده گرفته بشه. که البته تو شکل هم در مورد oldfile entry که یه entry حذف شده اس می تونین این قضیه رو ببینین. توی این حالت عمل بازیابی خیلی راحته چون آدرس data block ها بعد از حذف فایل هنوز هم تو inode موجود هستن و خیلی راحت می شه با ابزارهایی مثل debugfs یا e2undel مجددا ساختار فایل رو درست کرد و به حالت اول برگردوند. اما این قضیه فقط در مورد فایل سیستم ext2 درسته. در مورد ex3 و ex4 موقع عمل حذف کار اضافه ای که صورت می گیره اینه که به دلیل اینکه این فایل سیستم ها بعد از کرش بتونن به درستی به کارشون ادامه بدن و مشکلی تو کارکردشون پیش نیاد، بعد از آزاد کردن data block ها متغیرهایی که آدرس اونها و همچنین اندازه فایل رو مشخص می کنن تو inode صفر می شن و بنابراین هر رابطه ای که بین inode و datablock های متناظرش قرار داره قطع می شه و دقیقا علت اینکه می گن بازیابی از این فایل سیستم ها ممکن نیست همینه.

اما از اونجا که به هر حال هر غیرممکنی رو با یه سری روش های هکری می شه ممکن کرد و ما مخصوصا تو دنیای متن باز از این هکرها کم نداریم، ایده های جالبی رو که تو این زمینه دادن و ابزارهایی رو که از این ایده ها استفاده می کنن معرفی می کنم.

یکی از ایده های موجود استفاده از journal هست. همونطوری که قبلا گفتم وقتی که حتی یکی از اطلاعات موجود در inode یک فایل تغییر کنه کل اون inode به طور کامل در journal نوشته می شه. یکی از این اطلاعات تاریخ آخرین دسترسی هست. بنابراین اگه اندازه پارتیشن نسبت به journal خیلی بزرگ نباشه و همینطور به فایلی که حذفش کردیم اخیرا دسترسی داشتیم می تونیم امید به بازیابی اون داشته باشیم. این ایده رو کارلو وود توسعه دهده ext3grep داده. این ابزار کار اصلی که انجام می ده اینه که journal رو برای پیدا کردن کپی های قدیمی از inode مورد نظر جستجو می کنه و در صورت پیدا کردنش با استفاده از فیلد اشاره گر به data block های  مربوطه، inode اونا رو پیدا می کنه و یه کپی از فایل مورد نظر رو تو سیستم ذخیره می کنه. البته این ابزار فقط مخصوص فایل سیستم ext3 هست و رو ext4 دیگه جواب نمی ده.

برای بازیابی از فایل سیستم ext4 ابزار دیگه ای به extundelete وجود داره. این ابزار ایده اولیش رو از ext3gerp گرفته و مثل اون با جستجو در journal دنبال inode مورد نظر می گرده و در کنار این کار سعی می کنه entry های دایرکتوری که همونطور که تو شکل هم معلومه و گفتم معمولا پاک نمی شن و سر جاشون باقی می مونن رو با اون inode مورد نظر match کنه تا اسم فایل مورد نظر رو هم پیدا کنه و اگر هم پیداش نکرد یه دور هم journal رو برای پیدا کردن entry مورد نظر جستجو می کنه تا بالاخره بتونه اسم فایل رو پیدا کنه که این قسمت دوم یعنی جستجو در journal برای پیدا کردن نام دایرکتوری درext3gerep تا جایی که من می دونم انجام نمی شه و تنها سعی می کنه با جستجو در entry های دایرکتوری نام فایل رو پیدا کنه. این ابزار با اینکه ایده اصلی ext3grep رو گرفته ولی به دلایل مختلف در اکثر مواقع استفاده از اون نسبت به ext3grep ارجح تره. از جمله اینکه همونطور که گفتم علاوه بر فایل سیستم ext3 فایل سیستم ext4 رو هم پشتیبانی می کنه و یا به دلیل اینکه از کتابخونه ext2fs استفاده می کنه خیلی از مشخصه های ext3/4 به طور اتوماتیک توش ساپورت می شن و یا چون بعد از بررسی journal می تونه عمل بازیابی رو انجام بده سرعتش برای فضاهای زیاد نسبت به ext3grep خیلی بالاتره. ext3grep بعد از بررسی journal باید کل فضایی رو که بهش برای بازیابی دادیم بررسی کنه و بعد عمل بازیابی رو شروع می کنه بنابراین فقط برای فضاهای کم استفاده از اون بهینه تره. البته اینم اضافه کنم که آپشن های موجود تو ext3grep از extundelete بیشترن و امکان بررسی به صورت دستی علاوه بر بررسی به صورت اتوماتیک توش وجود داره و کلا دست آدم برای دست و پنجه نرم کردن با فایل سیستم بیشتر توش بازه.

ایده بعدی استفاده از header و footer موجود در انواع فایل هاست. همونطور که می دونین ( یا اگه نمی دونین الان دیگه متوجه می شین ) بعضی از انواع فایلها با یه سری مقادیر در چند بایت اول header شون شروع می شن و با یه سری مقادیر در چند بایت آخر footer شون به پایان می رسن. مثلا یک فایل JPEG با 0xffd8 شروع می شه و با 0xffd9 به پایان می رسه. بنابراین می شه یه فضایی رو مشخص کرد و تو اون فضا block هایی با این مقادیر رو جستجو کرد و فضای بین این دو block رو به عنوان فایل در نظر گرفت. برای کوچکتر کردن فضا هم می شه  از debugfs و Sleuth Kit استفاده کرد. به این صورت که inode حذف شده رو پیدا کرد و تو block group مربوط به اون دنبال block های اختصاص یافته نشده گشت و بررسی رو فقط رو اونا انجام داد. البته این روش مشکلات زیادی داره. اول اینکه همه فایلها ممکنه header یا footer خاصی نداشته باشن و یا header یا footer های مختلفی داشته باشن. مثلا یک فایل MPEG هم ممکنه با 0x000001ba آغاز بشه و با 0x000001b9 به پایان برسه و هم با 0x000001b3 شروع بشه و با 0x000001b7 به پایان برسه و بنابراین باید تمام شرایط موجود رو در نظر گرفت. ابزارهایی مثل photorec و foremost و همینطور آپشن search از ext3grep و خیلی از ابزارهای تجاری از این روش استفاده می کنند.

ایده بعدی یه جورایی brute force کردن فایل سیستم با استفاده از ابزار grep هست. همونطور که می دونین با استفاده از ابزار grep می شه یک الگو یا یک متن خاص رو در خطوط مختلف یک یا چند فایل جستجو کرد. بنابراین اگه حتی از وجود یک الگو یا عبارت خاص در فایل حذف شده اتون خبر داشته باشین می تونین اون رو با روشی که در ادامه توضیح خواهم داد بازیابی کنید.

فرآیندی که بعد از حذف یک یا چند فایل از سیستم باید انجام بدین:

قبل از گفتن هر چیزی اینو باید بگم که بازیابی نه فقط از این فایل سیستم ها بلکه از هر فایل سیستمی نیازمند این هست که اطلاعات جدیدی روی اطلاعات قبلی نوشته نشده باشند و بنابراین اگه واقعا چنین مشکلی براتون پیش اومد هیچ کاری انجام ندین و سیستم رو یا با یه دیسک زنده راه اندازی کنید و یا اگه سیستم عامل دیگه ای دارین از طریق اون سیستم رو بوت کنید و یا اگه اون پارتیشن، پارتیشن روت سیستم نیست ( مثلا پارتیشن home ) اون رو umount کنید  و یا اگر پارتیشن روت هست اون رو به صورت ro یا همون read only مجددا mount کنید و بعد فرآیند بازیابی رو انجام بدین این نکته رو هم در نظر داشته باشین که بعد از حذف فایل حتی اگه شما دستی هم رو فایل سیستم چیزی ننویسید ممکنه یه سری از پروسس های در حال اجرا (مثلا پروسس هایی که در کنار کارشون وقایع مورد نظر رو هم در سیستم ثبت می کنن) بیان و از سر بدشانسی شما رو همون بلاک هایی که حذف کردین اطلاعات جدید رو بنویسن بنابراین کارهایی رو که گفتم به محض حذف ناخواسته فایل انجام بدین.

بعد از انجام اعمال فوق می تونین یک پشتیبان از فایل سیستم مورد نظرتون به این صورت بگیرین و تست ها رو روی اون انجام بدین. البته بعد از اینکه این بلا سرتون اومد کلا درس عبرت می گیرین که همیشه یه پشتیبان از سیستمتون تهیه کنین!

dd if=/dev/partition of=backup

البته قبل از umount کردن پارتیشن یا بقیه کارهایی که گفتم یه بررسی بکنین که آیا فایل مورد نظرتون توسط یه برنامه دیگه در حال اجراست و آیا  شما در حین اجرا به طور تصادفی حذفش کردین یا نه و اگه اینطوری بود روندی رو که می گم  تست کنید و اگه جواب نداد که البته معمولا باید جواب بده، مراحل بعدی رو دنبال کنید. مثلا من یه فایل موسیقی به نام ocarina.mp3 که در مسیر home/zahra/ وجود داره و در حال پخش شدن هم هست رو حذف می کنم. اول از همه اطلاعات شماره پروسس ( PID )  و توصیف کننده فایل ( fd ) مربوط به اون رو از طریق دستور زیر به دست میارم:

zahra@belendax ~ $ lsof | grep /home/zahra/implora.mp3
vlc       4451      zahra   13r      REG        8,6   3697716  830396 /home/zahra/implora.mp3 (deleted)

که این خروجی نشون می ده این فایل در حال حاضر داره توسط vlc و با شماره پروسس ۴۴۵۱ و توصیف کننده فایل ۱۳ اجرا می شه. پس خیلی راحت فایل رو از مسیر مربوط به پروسسش یه جای دیگه کپی می کنم. مثلا:

zahra@belendax ~ $ cp /proc/4451/fd/13 /home/zahra/implora2.mp3

در صورتی که این روش جواب نداد یا اصلا فایلی که حذف کردین توسط هیچ برنامه خاصی اجرا نمی شد عمل umount کردن و یا بقیه اعمالی که گفتم رو انجام بدین و مراحل زیر رو دنبال کنید:

قدم اول استفاده از نرم افزار extundelete هست. اول از همه این نرم افزار رو از اینجا دانلود کنید و بعد اون رو از حالت فشرده خارج کنید و کامپایل و نصب کنید. با اجرای

extundelete –help

می تونین آپشن های مختلفی رو که این ابزار برای بازیابی استفاده می کنه مشاهده کنید. مثلا

extundelete /dev/partition –restore-file /path/of/file

فایلی رو که تو مسیر مورد نظر اون پارتیشن وجود داشته و حذف شده بازیابی می کنه.

درصورتی که extundelete موفق به انجام این کار نشد و فایل سیستم شما ext3 بود می تونین ext3grep رو هم امتحان کنید. ( البته “معمولا” وقتی اون جواب نده اینم جواب نمی ده). به هر حال این نرم افزار رو هم می تونید از اینجا دانلود کنید. این رو هم به همون صورت از حالت فشرده خارج و بعد کامپایل کنید. برای این هم به همون صورت با اجرای

ext3grep –help

می تونین آپشن های مختلفش رو ببینید. در مورد نحوه استفاده هم فکر می کنم توسعه دهنده این پروژه خیلی کامل و قشنگ طریقه استفاده ازش رو ذکر کرده و من اینجا نیاز به توضیح اضافه ای نمی بینم.

اگر این روش هم جواب نداد و فرمت فایلی که حذف کردین رو می دونستین و در ضمن این فرمت توسط ابزارهایی که گفتم( foremost و …) پشتیبانی می شد یا حداقل خودتون می دونستین که فرمت مورد نظرتون با چی شروع می شه و به پایان می رسه می تونین از اون ابزارها استفاده کنین. فقط قبلش بهتره که فضای مورد جستجو توسط این ابزارها رو تا حد ممکن کوچیک کنید تا وقت زیادی ازتون تلف نشه. همونطور که گفتم data block ها سعی می کنند که با inode مورد نظرشون در یک block group ذخیره بشن. ( البته در حالتی که indirect block نداشته باشیم ) ، برای همین می تونیم به جای کل فایل سیستم فقط block group مربوطه رو جستجو کنیم و همینطور در این block group هم تنها باید block هایی رو در نظر بگیریم که آزاد یا تخصیص نیافته هستند.  برای انجام این اعمال می تونیم از debugfs یا TSK استفاده کنیم. روش کار رو با استفاده از یک مثال نشون می دم. به عنوان مثال من یک فایل به اسم server.jpg رو در مسیر home/zahra/ از پارتیشن dev/sda7/ حذف می کنم و بعد برای بازیابی دستورات رو به این صورت وارد می کنم. اول از همه debugfs رو اجرا می کنم:

belendax zahra # debugfs /dev/sda7
debugfs 1.41.9 (22-Aug-2009)
debugfs:

بعد به مسیر مورد نظر می رم:

debugfs:  cd /home/zahra
debugfs:

بعد با استفاده از فرمان ls -d فایلهای موجود و حذف شده رو در پوشه جاری می بینم:

51094  (52) .bash_history   <51095> (28) server.jpg
58120  (24) killer.c    58793  (16) Music

دقت کنید که من فقط یه قسمت از خروجی رو لیست کردم. فایلهای حذف شده شماره inode اشون بین علامتهای <> هست که همونطور که مشاهده می کنید فایل server.jpg که من حذف کردم جز فایلهای حذف شده نشون داده و شماره inode اش برابر با ۵۱۰۹۵ هست. با استفاده از این شماره inode می تونیم با زدن دستور زیر شماره block group مربوطه رو به دست بیاریم:

debugfs:  imap <51095>
Inode 51095 is part of block group 6
located at block 196731, offset 0×0600
debugfs:

که خروجی به ما میگه این inode تو block group شماره ۶ هست. حالا باید محدوده block های موجود تو این گروه رو مشخص کنیم. برای همین اول باید متوجه بشیم که تو هر گروه چند تا block وجود داره. این مقدار معمولا ۳۲۷۶۸ تاست ولی خوب برای اطمینان دستور زیر رو بزنید و دنبال مقدار Blocks per group بگردین:

debugfs:  stats

Blocks per group:         32768

خوب حالا می تونیم محدوده بلاک های گروه ۶ رو محاسبه کنیم. که این محدوده از ۱۹۶۶۰۸(۶*۳۲۷۶۸) تا ۲۲۹۳۷۵(۱-۷*۳۲۷۶۸) هست. حالا فرمان quit رو می زنیم تا از debugfs خارج بشیم. برای به دست آوردن block های آزاد از ابزار blkls که در TSK  موجود هست استفاده می کنیم:

blkls /dev/sda7 196608-229375 > test.jpg

حالا می تونیم فایل test.jpg رو به عنوان ورودی به ابزارهایی که گفتم بدیم تا فایل JPEG موجود رو بتونن ازش استخراج کنن.

در صورتی که این روش هم جواب نداد می ریم سراغ ایده آخر. یعنی جستجوی یک الگو یا عبارت در فایل باینری. این روش رو هم با ذکر یک مثال توضیح می دم:

مثلا من یک فایل از نوع متنی داشتم که حذفش کردم و می دونم که توش عبارت “this is a test” وجود داشته. اول از همه فایل سیستم مورد نظرم رو umount می کنم و بعد دستور زیر رو تو کنسول وارد می کنم:

grep –binary-files=text -10 “this is a test” /dev/sda7 > recover

با آپشن binary-files نوع فایلم رو که یک فایل متنی بوده مشخص کردم. آپشن 10 یعنی ۱۰ خط قبل و ۱۰ خط بعد از الگوی مورد نظر رو تو فایل خروجی که همون recover هست بریز. dev/sad7/ هم پارتیشنی هست که این بررسی رو روش انجام دادم. این روش بسته به فضای فایل سیستم یه مقدار وقت می بره. اما اگه چیزجدیدی رو اون بلاک ها نوشته نشده باشه حتما جواب می گیرین و کلا ربطی به نوع فایل سیستمی که ازش استفاده می کنین نداره.

اگه بعد از طی کردن تمام این روشها بازم جواب نگرفتین اگه خیلی سمج هستین دنبال یه ایده جدید بگردین اگرم که نه کلا بی خیال ماجرا بشین و برای آینده یادتون باشه که یه پشتیبانی دوره ای خودکار از سیستمتون تهیه کنید!

تبصره ۱: اگه کلا زدین پارتیشن رو پروندین می تونین از ابزار testdisk برای به دست آوردن partition table قبلی استفاده کنید.

تبصره ۲: علت اینکه آن دو فایل برای دانلود روی سرور اینجانب قرار داده شده، راحتی کار ایرانیان گرامی می باشد! چون یکی از آنها در sf  و دیگری در google code  می باشد و خدا را شکر این دو دوست گرامی در صدر دوستان دیگر با هدف خیری که جز رسیدن ما به استقلال چیز دیگری نمی باشد، ما را تحریم نموده اند!

تبصره ۳: تمام برنامه هایی که اسم بردم ebuild اشون واسه جنتو نوشته شده و تو portage یافت می شن! اینو فقط محض این گفتم که بدونین تو portage نیست در جهان هم یافت می شه و کلا Gentoo Rocks!

منابع:

Understanding The Linux Kernel 3rd edition

http://www.xs4all.nl/~carlo17/howto/undelete_ext3.html

http://extundelete.sourceforge.net/

http://linux.sys-con.com/node/117909/

ادامه مطلب

, , ,

روز روشن و دزدی؟!!!

دیروز تو شرکت موقع باز کردن جیمیل به خطای معتبر نبودن certificate بر خوردم، چند نفر دیگه از بچه های شرکت هم همین مشکل رو داشتن. اول فکر کردم یکی تو خود شرکت داره اذیت می کنه و ترافیک رو man in the middle می کنه ولی بعد فهمیدم که اینطور نیست. حتی فکرم سمت مخابرات هم رفت چون شنیده بودم که دستگاهاشو خریدن، اما مشکل از اونجا هم نبود چون همه ISP ها این مشکل رو نداشتن و فقط و فقط یک ISP این مشکل رو داشت اونم داتک بود. یعنی واقعا اصلا فکرشو نمی کردم خود ISP که ظاهرا باید امین کاربراش باشه بخواد این کارو انجام بده و بخواد باهاش یوزر و پسوورد کاربراش رو بدزده! بذارین یه کم بیشتر توضیج بدم. به این کاری که داتک انجام داد می گن: SSL Man-In-The-Middle Attack ( Monkey-In-The_Middle ) .

حمله Man-In-The-Middle چیست؟

به زبون ساده man in the middle  یه نوع حمله اس که توی اون نفوذگر بین قربانی ها قرار می گیره و خودش رو جای طرف مقابل جا می زنه و پیغام ها رو بینشون رد و بدل می کنه. البته در عین حال که خودشو جای طرف مقابل جا می زنه باید اون چیزهایی رو هم که دو طرف تقاضا کردن بهشون بده تا بتونه حمله اشو با موفقیت انجام بده!

فرض کنید شما می خواید به دوستتون  یه پیغام بفرستین و یکی هم به اسم نفوذگر بین شما وجود داره که شما از وجودش خبر ندارین. برای اینکه محرمانگی حفظ بشه و کسی نتونه این وسط این پیغام رو بخونه از یه جفت کلید عمومی و خصوصی استفاده می کنین. به این صورت که اول از دوستتون کلید عمومیش رو تقاضا می کنین. نفوذگر این تقاضا رو عینا به دوستتون منتقل می کنه. ولی از اون طرف وقتی کلید عمومی دوستتون را ازش گرفت عوضش کلید عمومی خودش رو به شما می ده و از این به بعد شما هر پیغامی رو رمز کنید در واقع با کلید عمومی نفوذگر رمز می شه و بنابراین می تونه تمام پیغام ها رو باز کنه و بخونه و همینطور می تونه اون رو تغییر بده و با کلید عمومی دوستتون رمزش کنه و براش بفرسته.

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

۱- ssl certificate توسط یه جای معتبر مثل verisign ساین شده باشده.

۲- موقع ساختن هر certificate یه تاریخ انقضا بهش داده می شه که اون تاریخ نباید منقضی شده باشه.

۳- اسم عمومی certificate یا همون CN با نام دامنه باید مطابقت داشته باشه.

بنابراین وقتی که مرورگر خطای مربوط به certificate رو می ده باید یه جورایی این وسط شک کرد که ممکنه یه نفوذگر این وسط وجود داشته باشه. البته همیشه هم اینطور نیست چون خیلی جاها از جمله خود من معمولا certificate رو به صورت self-signed می سازیم و حاضر نیستیم یه پولی واسه ساین کردنش بدیم بنابراین همیشه این خطا به این معنی نیست که واقعا کسی این وسط باشه. ولی خوب وقتی این خطا رو برای جیمیل یا آمازون یا هر سایت بزرگ و معتبر دیگه ای می بینید شک نکنید که یکی این وسط هست! کاری که دیروز داتک انجام داد این بود که  به جز پسورد جیمیل و یاهو پسورد حساب بانکی و هر سایت دیگه ای که از ssl استفاده می کرد دزدید و هیچ کسی هم هیچ کاری نکرد! واقعا نمی فهمم اینا به چه حقی به خودشون اجازه می دن اینطوری به حریم خصوصی مردم تجاوز کنن؟!!!

توصیه من به شما اینه که اولا همیشه برای وبگردی از vpn یا ساکس پروکسی استفاده کنید که تمام ارتباطاتتون به صورت رمز شده باشه. ثانیا وقتی به خطای certificate برمی خورین حتما به details اون دقت کنین، مثلا از همون بخش details به subject نگاه کنین که واقعا بفهمین مال کیه. هر چند که اونم خیلی قابل اطمینان نیست چون خیلی راحت می شه یه certificate با مشخصات مورد نظر ساخت ولی خوب می تونین تو این موارد details مربوط به certificate چند تا سایت رو نگاه کنین که احیانا یکی نباشد. ثالثا اگه isp تون داتک هست حتما یه شکایت نامه تنظیم کنید و برید ازش شکایت کنید تا دیگه به خودش اجازه نده که از این کارا بکنه!

پی نوشت: برای تست حملات MItM می تونین از sslstrip + arpspoof یا webmitm+ssldump+arpspoof رو شبکه داخلی خودتون استفاده کنین تا ببینین چقدر راحت با این روش می شه یوزر و پسوورد ها رو دزدید!


ادامه مطلب

,

نصب pptp در N900

سلام. بالاخره بعد از مدتها وقت کردم وبلاگمو که کم کم داشت خاک می خورد به روز کنم! خوب عوض حرفای کلیشه ای و دلایل همیشگی بریم سر اصل مطلب!

چند وقت پیش بالاخره دل رو به دریا زدم و رفتم گوشی N900 رو که از همون اولش که به بازار اومده بود تصمیم گرفته بودم بخرم، خردیم! گوشی فوق العاده ایه و امکانات بی نظیری داره. حالا اگه وقت شد یه پست هم راجع به بررسی تخصصیش می زنم. این پست رو فقط به طریقه نصب pptp تو N900 اختصاص می دم.

اول از همه باید بگم N900 خودش به تنهایی openvpn و vpnc ( کلاینت vpn سازگار با محصولات سیسکو ) رو ساپورت می کنه و خیلی راحت می شه از تو app manager نصبشون کرد و ازشون استفاده کرد. ولی در مورد pptp حتی ماژولهای مورد نیازش هم تو کرنلش کامپایل نشده، برای همین باید همه رو بگیریم و دستی لود کنیم. خوب پس برای نصب pptp به جز بسته pptp-linux یکی نیاز به ماژولهای لازم دارین، یکی پکیج ( ppp ( point-to-point protocol   که یه بسته پیش نیاز برای pptp-linux هست و یکی هم پکیج iproute که برای تغییر مسیر بسته ها و رد شدن کل ترافیک از طریق vpn بهش احتیاج دارین. سه تا بسته اول رو می تونین از اینجا دانلود کنید:

ماژولهای کرنل

بسته ppp

بسته pptp-linux

بعد از دانلود بسته ها ترمینال رو باز کنید و به مسیری که بسته را رو اونجا ریختین برین. بعد با زدن این دستور یا هر روش دیگه ای که می خواین روت بشین:

$ sudo gainroot

بسته iproute رو با وارد کردن این دستور نصب کنید:

#apt-get install iproute

بعد فایل مربوط به ماژولها رو از حالت فشرده خارج کنید:

# tar -zxvf modules-2.6.28-200903102-pptp.tar.gz

بعدش ماژولها رو سر جاشون کپی کنید که بتونین لودشون کنین:

# cp ./drivers/net/ppp_async.ko ./drivers/net/ppp_generic.ko ./drivers/net/ppp_mppe.ko ./drivers/net/slhc.ko ./crypto/sha1_generic.ko /lib/modules/2.6.28-omap1/

بعدم به اون مسیر برین و ماژولها رو به ترتیبی که گفتم لود کنین:

# cd /lib/modules/2.6.28-omap1/‍

# depmod -a

# insmod slhc.ko

# insmod ppp_generic.ko

# insmod ppp_async.ko

# insmod sha1_generic.ko

# insmod ppp_mppe.ko

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

# dpkg -i ppp_2.4.4rel-osso4_armel.deb

# dpkg -i pptp-linux_1.7.2-1_armel.deb

خوب الان باید با pptpsetup مشخصات اکانت vpn رو اضافه کنید فقط قبلش باید تابع    Check_MPPE_in_pppd رو ویرایش کنید که همیشه مقدار ۱ رو برگردونه. واسه این کار فایل /usr/sbin/pptpsetup  رو با یه ویرایشگر باز کنید و به خط ۱۹۲ برید و خطوطی رو که تو اون تابع نشون دادم کامنت کنید.

sub Check_MPPE_in_pppd {

# my $command = q/stringswhich pppd|grep -i mppe|wc --

# my $answer =$command;

# if ($answer &gt; 0) {

# ok!

return 1;

# } else {

# return 0;

# }

}

و حالا اکانتتون را اضافه کنید:

pptpsetup --create tunnelname --server server --username username --password password

حالا با یه ویرایشگر فایل /etc/ppp/peers/tunnelname رو باز کنید و خطوطی رو که گفتم برای فورس کردن mppe و اینکه کل ترافیکتون از طریق این vpn رد بشه و یه سری کار کوچیک دیگه، به آخر فایل اضافه کنید.

require-mppe-128

noipdefault

usepeerdns

defaultroute

replacedefaultroute

persist

خوب دیگه تموم شد! حالا  با وارد کردن دستوری که گفتم هر موقع که خواستین می تونین به vpn وصل شین:

# pppd call tunnelname

برای قطع ارتباطتون هم فقط لازمه که پروسسش رو kill کنید:

# killall pppd

منبع: http://talk.maemo.org/showthread.php?t=36172&page=2

ادامه مطلب

, ,

معرفی و راهنمای استفاده از busybox

Busybox چیست:

Busybox یه پکیج نرم افزاریه که یه ورژن سبک از تمام ابزارهای مرسوم یونیکس رو تو خودش جمع آوری کرده. نسخه اولیه‌اش در سال ۱۹۹۶ توسط بروس پرنس با این هدف که یه لینوکس قابل راه اندازی که بتونه رو یه فلاپی جا بشه و به عنوان یه دیسک نصب و نجات استفاده بشه؛ خلق شد. اما این سایز کوچیکش باعث شد که برای دستگاههای امبدد هم ابزار ایده آلی باشه. چون یکی از مشکلاتی که تو دستگاههای امبدد وجود داره کمبود منابع هست؛ بنابراین این دستگاهها نیاز به ابزارهایی دارن که تا حد ممکن منابع کمتری مصرف کننیکی از دلایل کم حجم بودن busybox هم اینه که  اون ابزارهای مختلف رو یه جا جمع کرده و چون هر کدوم از این ابزارها المان های مختلفی رو به اشتراک می ذارن کد مربوط به اون المان به جای اینکه برای هر کدوم از ابزارها تکرار بشه فقط یه جا اومده و با بقیه ابزارها به اشتراک گذاشته شده. مثل دستورات cp و rm که هر کدوم آرگومانی به اسم -r می گیرن که کار کپی یا حذف رو برای یه دایرکتوری انجام می ده. این خصوصیتش باعث شده که بتونه حدود ۳.۵ مگابایت ابزار رو تو فضایی حدود ۲۰۰ کیلوبایت جمع آوری کنه. البته نکته دیگه ای که وجود داره اینه که تو busybox تمام آرگومانهای یک کامند به صورت کامل وجود ندارن و به خاطر کم حجم شدن یه سری آرگومانها حذف شدن که می تونین با دستور ./busybox command –help اونا رو ببینین. به busybox چاقوی ارتش سویس هم می گن که این چاقو که اولین بار تو ارتش سویس ازش استفاده شد یه چاقوی چند کاره اس که یه سری ابزار دیگه رو در خودش داره. در‌واقع busybox هم چون ابزارهای مختلف یونیکس رو تو خودش داره این لقب رو بهش دادن.

طریقه نصب busybox:

busybox معمولاً تو مخازن توزیع‌های مختلف پیدا می شه و خیلی راحت می شه نصبش کرد؛ اما من اینجا طریقه دانلود و کانفیگ سورس و نصب از طریق سورس رو می گم. خوب شروع می کنیم!

اول از همه آخرین ورژن busybox یعنی ۱.۱۵.۲ رو دانلود می کنیم:

$ wget http://www.busybox.net/downloads/busybox-1.15.2.tar.gz

و بعد اون رو از حالت فشرد خارج می کنیم:

$ tar xvzf busybox-1.15.2.tar.gz

بعد از اون وارد دایرکتوری ساخته شده می شیم:

$ cd busybox-1.15.2/

بعد وارد مرحله بیلد کردن می شیم. تو این مرحله آپشن های مختلفی واسه بیلد کردن داریم که از طریق دستور make help همه اونا رو می تونین ببینین. مثلا اگه بزنیم make defconfig پیکربندی پیش فرض خود busybox  رو انجام  می ده یا اگه می خواین به صورت دستی خودتون busybox رو کانفیگ کنین می زنین make menuconfig که یه محیط  ncurses بیس مثل محیط کرنل لینوکس براتون میاره که بخش اول اون مربوط به تنظیمات خود busybox می شه  و بخش بعدیش مربوط به اپلت هایی که استفاده می کنه که می تونین هر کدوم از اپلت هایی رو که به دردتون می خوره انتخاب کنید و بعد از تموم شدن کار دستور make  رو وارد کنین.

menuconfig

اگه می خواین تمام کانفیگ ها فعال بشن همون اول دستور make allyesconfig و اگه می خواین هیچ کدوم فعال نباشن دستور make allnoconfig رو وارد می کنین. خلاصه همونطور که گفتم آپشن های مختلف رو می تونین از طریق make help ببینید و هر کدوم رو که خواستین اجرا کنین. اگرم دستگاه امبددی دارین و می خواین busybox رو برای اون کراس کامپایل کنین با دستور make CROSS_COMPILE=<crosscompiler>- می تونین این کارو انجام بدین. مثلا:

$ make CROSS_COMPILE=arm-linux-uclibcgnueabi-

خوب پس تا الان دستورات زیر رو وارد کردیم:

$ make menuconfig

$ make

که برای ما یه busybox باینری ساختن. حالا باید برای busybox یه محیطی بسازیم که شامل یه سری سیمبلیک لینک باشه که کامندهای استاندارد لینوکس رو به اون busybox باینری که ساختیم هدایت کنن. این کار رو با این دستور انجام می دیم:

$ make install

حالا با وارد کردن دستور ./busybox <command> می تونیم دستور مورد نظرمون رو اجرا کنیم. مثلا:

$ ./busybox pwd

/home/zahra/Downloads/busybox-1.15.2

به صورت پیش فرض یه دایرکتوری به اسم _install داخل دایرکتوری busybox ساخته می شه که شما می تونین وقتی یه initrd واسه دستگاه امبددتون می سازین اونو مستقیما به اونجا منتقل کنین.

طریقه اضافه کردن دستورات جدید به busybox:

یکی از سوالاتی که ممکنه برای یه کاربر busybox به وجود بیاد اینه که چطور می تونه یه دستور جدید رو به busybox اضافه کنه و تو دستگاهش از اون استفاده کنه. در واقع این کار هم کار بسیار ساده ایه.‍ اول از همه کد برنامه اتون رو می نویسین و تغییرات زیر رو توش می دین. مثلا ما از کد ساده زیر استفاده می کنیم و اسمشو test.c می ذاریم:

#include "libbb.h"
int test_main(int argc, char **argv)
{
int i;
printf("%s called\n",argv[0]);
return 0;
}

همونطور که می بینید تنها تغییری که تو کد نسبت به حالت معمولی دادیم اینه که کتابخونه libbb.h رو include کردیم و به جای main از test_main استفاده کردیم و به طور کلی به جای تابع main تو کد command_main رو می نویسیم که به جای command باید اسم اون دستور رو وارد کنیم که در اینجا اسمش test هست. این کد رو باید تو یکی از پوشه های مربوطه ذخیره کنیم و تو هر پوشه که ذخیره کردیم برای کانفیگ busybox باید به اون بخش بریم. من اونو تو پوشه miscutils و همونطور که گفتم به اسم test.c ذخیره می کنم. تو مرحله بعد باید فایل Kbuild که تو همون پوشه miscutils وجود داره رو ویرایش کنیم که باید یه خط به نام   lib-$(CONFIG_TEST)     += test.o رو بعد از  خط  lib-$(CONFIG_TASKSET)     += taskset.o اضافه کنیم. حواستون باشه که از این مرحله به بعد هر خطی رو که به فایلها اضافه می کنین باید به ترتیب حروف الفبا باشه وگرنه ممکنه دستورتون کار نکنه. بعد از اون سراغ فایل Config.in که مجددا تو همون پوشه اس می ریم و این خطوط رو بهش اضافه می کنیم:

config TEST
bool "test"
default n
help
test is a new command.

در واقع این اطلاعات مربوط به همون صفحه کانفیگ busybox هستن که وقتی دستور make menuconfig رو می زنین اونا رو مشاهده می کنین. بعد از اون باید به پوشه include  برین و خط زیر رو به فایل applets.h اضافه کنین:

IF_TEST(APPLET(test, _BB_DIR_USR_BIN, _BB_SUID_DROP))

بعدش تو همون پوشه باید فایل usage.h رو ویرایش کنین و این خطوط رو بهش اضافه کنین:

#define test_trivial_usage NOUSAGE_STR
#define test_full_usage ""

تو مرحله آخر هم دستور make menuconfig رو برای اضافه کردن کانفیگ کامند اضافه شده می زنین و از تو صفحه اصلی کانفیگ وارد منویMiscellaneous  Utilities می شین و test رو انتخاب و فعال می کنین. بعد که از صفحه کانفیگ خارج شدین دستورات make و make install رو وارد می کنین و بعدشم والسلام!

حالا می خوایم دستوری رو که وارد کردیم تست کنیم:

$ ./busybox test

test called

خوب اینم از اضافه کردن دستور جدید!  به همین راحتی می تونین ابزارهای جدیدی رو که کدش رو می نویسین یا دارین خیلی راحت به busybox اضافه کنید و ازش استفاده لازم رو ببرین!

منابع:

http://www.busybox.net/FAQ.html

http://www.ibm.com/developerworks/library/l-busybox/

http://en.wikipedia.org/wiki/BusyBox

ادامه مطلب

, , ,

ارائه های جشن های اوبونتو و پارسیکس

چند وقت پیش تو جشن اوبونتو درباره امبدد اوبونتو یا همون اوبونتو توکار و هفته متعاقب اون تو جشن پارسیکس در مورد امبدد لینوکس سمینارهایی داشتم و چون مخاطب ها اکثرا کاربران تازه کار بودن مجبور شدم ارائه ها رو خیلی ساده و کاربردی بگم که هم به دلیل این مساله و هم به دلیل فرصت خیلی کمی ( یک روز ) که واسه آماده کردن ارائه ها داشتم نتونستم مطالب رو اون طور که باید دسته بندی کنم. با این حال ارائه ها رو اینجا می ذارم که هرکس خواست دانلود کنه و البته سعی می کنم در مورد بخشهای مختلفشون بعدها مطالبی بنویسم.

امبدد اوبونتو با فرمت PDF

امبدد اوبونتو با فرمت ODP

امبدد لینوکس با فرمت PDF

امبدد لینوکس با فرمت ODP

ادامه مطلب

, , ,

استارت!

سلام! شاید این دهمین باری باشه که یه بلاگ می زنم و یه سری مطلب توش می نویسم و البته بعد هم پاکش می کنم! در واقع تا چند وقت پیش دیگه قصدی واسه وبلاگ زدن نداشتم تا اینکه تو جشن های اوبونتو و پارسیکس با این سوالات مواجه شدم که آیا جایی هست که شما مستنداتتون رو بذارین؟! البته دانسته های من واقعا چیزی نیستن ولی از اونجایی که می گن قطره قطره جمع گردد وانگهی دریا شود و از اون ور هم که پیامبر می فرمایند زکات علم نشر اونه و از اون یکی طرف هم به دلیل احساس دینی که به دنیای نرم افزار آزاد می کنم تصمیم گرفتم که مجددا وبلاگ نویسی رو آغاز کنم. سعی می کنم اکثر مطالب مربوط به لینوکس و کلا نرم افزار آزاد باشه ولی خوب از اونجایی که روح من در یک بعد نمی گنجه مسلما موضوعات جانبی هم تو این بلاگ مطرح خواهند شد!
پرحرفی نمی کنم فقط امیدوارم uptime این بلاگ مثل بقیه بلاگهایی که تا حالا داشتم نباشه و همینطور بتونم به وسیله اون کمکی به کسی بکنم و دینم رو ادا کنم!

ادامه مطلب