امنیت

کالبد شکافی یک ایمیل اسپم

دیروز دیدم که گوگل یه ایمیل دریافتی رو به عنوان اسپم شناخته. واسم جالب شد چک کنم ببینم چیه و چکار می خواد بکنه. ایمیل ظاهرا از طرف اپلیکیشن WhatsApp ارسال شده. این شد که تصمیم گرفتم کالبد شکافی یک ایمیل اسپم رو انجام بدم.

ایمیل اسپم

ایمیل اسپم

همونطور که در تصویر می بینید ارسال کننده service@informaticsfairview.com گفته شده و از طریق سرور server2.synermaxx.net. در قدم اول گوگل همچین ایمیل هایی رو با نگاه منفی بررسی می کنه چرا که ایمیل از سرور a ارسال شده ولی توی Header داره ادعا می کنه که از آدرسی در سرور b اومده.

اسپمر می تونست اون اعلام “via blah blah” رو که در تصویر می بینید با روش هایی حل بکنه ولی گویا طرف خیلی کاربلد نبوده.

متن ایمیل می گه شما یک پیام صوتی در واتزاپ دارید. یه دکمه گذاشته که کلیک کنیم تا پخش بشه. ببینیم پشت این کلید چه کدی قرار گرفته.

2

قیافه لینکی که کاربر بهش منتقل می شه به نظر عادی میاد. از کلمات voice و message استفاده شده و یه سری متغیر ارسالی. ولی چرا این لینک در سایت ferlosa.com قرارداره و نه سایتی مرتبط با واتزاپ؟

قبل از اینکه کد رو باز کنیم، می تونیم با استفاده از سرویس safe Browsing این سایت رو چک کنیم و ببینیم بدافزار یا تروجان روی خودش داره یا نه.

3

می بینیم که سایت تمیزه. لینک بالا رو در یه مرورگر جدا که در محیط ایزوله است باز می کنم. نتیجه نشون می ده که صفحه voice.php از روی سرور پاک شده. احتمالا ادمین سایت متوجه شده.

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

این اطلاعات جدول کاربرهاست که از طریق SQL Injection به دست آوردم (البته به جای پسورد ادمین ستاره استفاده کردم که لو نره) :

و این هم صفحه ورود به پنل مدیریت

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

درپایان:

این پست یه کار دم دستی بود و تمام جوانب رو پوشش نداد. در صورتیکه به سرور هک شده دسترسی داشته باشم می تونم اطلاعات بیشتری رو راجع به هکر که به دست بیارم.

ضعف برنامه نویسی در ارتباط با دیتابس حتما به این معنی نیست که هکر بتونه در خروجی صفحه نتیجه تزریق رو ببینه و در نتیجه با نشون ندادن خروجی ها از هک جلوگیری کرد. این اشتباهیه که در برخی برنامه ها دیدم. مثلا برنامه نویس گفته هر وقت مشکلی در تماس با دیتابیس بود صفحه رو نشون نده یا برو صفحه اول سایت رو نشون بده.
تزریق SQL می تونه با یه “گزاره منطقی” باشه و یا یک دستور که در لود شدن صفحه تاخیر ایجاد کنه. بهترین روش جلوگیری از SQL Injection بررسی ورودی ها و نیز استفاده از کلاس های PHP (و یا سایر زبان های برنامه نویسی) است که کار ارتباط با پایگاه داده رو به صورت تخصصی انجام می دن.

Standard
برنامه‌نویسی

جستجوی حرفه ای با گوگل

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

می خوایم فایل pdf یک کتاب رو پیدا کنیم؟ می خوایم بدون افتادن به دام سایت های قلابی یک فایل موزیک رو دانلود کنیم؟ باید بدونیم که چی رو سرچ کنیم و چطور.

موتور جستجوی گوگل یه سری option داره برای محدود کردن و بهینه کردن نتیجه جستجو. مثلا می تونید یه واژه رو در یک دامنه سرچ کنید و یا یک اسم رو با محدود کردن نوع فایل جستجو کنید.

من برای راحت کردن کارم از یک اسکریپت استفاده می کردم که سال هاست به روز نشده و بدون به روز شدن دیگه کار نمی کرد. من برای خودم یه تغییراتی توش دادم و استفاده می کردم.

Google

این اسکریپت رو آپلود می کنم که اگر کس دیگه ای هم خواست بتونه استفاده کنه. این کد رو با مجوز Creative Commons منتشر کردم و دستتون برای استفاده مجدد و تغییر بازه.

برای استفاده از این اسکریپت باید روی فایرفاکس و گوگل کروم افزونه Grease Monkey (ویا مشابه) رو نصب کنید و سپس به آدرس زیر رفته و دکمه Install رو کلیک کنید

برای استفاده هم با باز کردن این آدرس:

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

پیشنهاد می کنم آدرس گوگلی که گذاشتم رو صفحه خانگی (Homepage) بکنید که راحت تر باشید برای مراجعه.

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

Standard
امنیت

فاجعه ادوب

زمانی که ادوب اعلام کرد پسوردهای رمز شده لو رفته اند سوال پیش اومد که این پسوردها رمز شده بودند یا هش؟

اصطلاح رمز شده یا Encrypted زمانی استفاده می شه که امکان Decrypt هم باشه، ینی ادوب بتونه پسورد شما رو به صورت واضح بخونه در حالیکه روش امنی که باید برای نگهداری پسوردها استفاده بشه هش Hash کردنه که یک طرفه است و از نتیجه هش نمی شه به پسورد اصلی رسید. برای بالا بردن امنیت پسوردهای ذخیره شذه از salt هم استفاده می شه که یک رشته از کراکترهای تصادفیه که پیش از هش شدن به پسورد اضافه می شه. استفاده از salt باعث می شه که اگر دو کاربر از پسورد مشابهی استفاده کرده باشند، نتیجه هش شده برای اونها متفاوت می شه و درنتیجه در صورت دسترسی هکر به دیتابیس، پیداکردن پسورد مشکلتر می شه.

بذارید یه نگاهی به دیتابیس ادوب و پسوردهای کاربرها بندازیم. این بررسی بر روی ۱ میلیون ردیف اطلاعات انجام شده. این مجموعه به صورت خطی جدا شده: ضرایب ۱۰. لیست انتخابی یه چیزی شبیه تصویر زیر می شه.

abr-dump-500

و در تصویر زیر می بینید که اطلاعات هر ستون مربوط به چه فیلدی است.

abr-dump-annotated-500

این فیلدها برای بررسی ما غیر ضروری بود و حذف شدند: user ID, email addresses, username

فقط ستون های پسورد و یادآوری باقی موندن. همچنین پسوردها نیز با روش base64 رمزگشایی شدن و به نسخه هگزادسیمال تبدیل شدند. با این تبدیل طول پسوردها واضح تر شد:

abr-dump-reworked-500

سوال اینه که آیا ادوب راست گفت که پسوردها رمز شده بودند؟ می دونیم که نتیجه پسوردهای هش شده، طول یکسانی دارند و ربطی به تعداد کاراکترهای پسورد نداره. مقایسه طول پسوردهای ادوب نشون می ده که اونها هش نشده اند.

abr-pwd-lengths-graph-500

سوال بعدی اینه که حالا که پسوردها هش نشدن پس از چه روش رمزگذاری (Encryption) استفاده شده؟ روش هایی مثل RC4 یا Salsa-20 رو کنار بذاریم چون نتیجه رمزگذاری در این دو روش با طول پسوردها برابر می شه. در حالیکه در تصویر بالا می بینیم که پراکندگی طول پسوردهای رمز شده مخالف اینه.

Stream cipher که به طور معمول در پروتوکول های شبکه استفاده می شه به ما اجازه می ده که هر بار یک بایت از اطلاعات رو رمز کنیم بدون اینکه مجبور باشیم ورودی را به تعداد مشخصی بایت بلوک بندی کنیم.

با توجه به اینکه رمزها ضریبی از ۸ است مشخصا دنبال روش رمز گذاری می ریم که بلوک های ۸ بایتی (۶۴ بیت) رو رمز گذاری می کنه. در نتیجه به نظر میاد که با یک روش رمزگذاری DES (Data Encryption Standard) و یا نسخه مدرن ترش  ۳DES طرفیم. (این احتمالات رو کنار گذاشتیم: سایر روش های ۶۴ بیتی که یه زمانی استفاده می شدند و یا شیوه جدیدی ساخته خود ادوب)

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

سوال بعدی اینه که از چه مدی برای رمزگذاری (encryption mode) استفاده شده.

ابتدایی ترین مدی که برای رمزگذاری استفاده می شه “مد رمز گذاری بلوکی خام”ه که با اسم Electronic Code Book (ECB) شناخته می شه. در این حالت الگوهای متن اولیه در متن رمزگذاری شده قابل شناساییه. در مدهای دیگه این ضعف وجود نداره و الگوها رو غیر قابل شناسایی می کنند.

یکی از دلایلی که از ECB استفاده نمی شه اینه که نتیجه رمز گذاری یک پسورد ثابت با یک کلید ثابت و با این مد، نتیجه یکسانی رو به همراه داره. بذارید یه نمونه تصویری از این مشکل رو ببینیم.

فرض کنیم تصویر کلمه sophos رو با ترکیب رنگ RGB داشته باشیم (که هر پیکسل ۳ بایت داره) و اون رو به بلوک های ۸ بایتی تقسیم کنیم و با روش DES و مد ECB اون رو رمزگذاری کنیم. حال با فایل به دست اومده به عنوان یک تصویر RGB برخورد کنیم و اون رو نگاه کنیم، نتیجه زیر حاصل می شه

abr-sophos-ecb-500

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

اگر ادوب از این روش استفاده می کرد می بایست در کوتاه ترین پسورد شاهد ۱۶ بایت می بودیم. ۸ بایت برای nonce و ۸ بایت برای پسورد رمزگذاری شده. با توجه به اینکه ما رمزهای ۸ بایتی رو در جدول می بینیم پس از این شیوه استفاده نشده.

حتی اگر فرض کنیم از عدد دیگه ای مثل userid به عنوان nonce استفاده شده باشه، نباید شاهد رمزهای تکراری در دیتابیس باشیم چرا که احتمال تکرار یک رمز با بلوک های ۶۴ بیتی ۱ در ۲ به توان ۶۴ است (حدود ۲۰ میلیون میلیون میلیون). ما با ۱ میلیون داده طرفیم و این ینی هیچ رمز تکراری در این یک میلیون نباید باشه.

abr-block-repeats-500

تا اینجا فهمیدیم که ادوب از یک روش برگشت پذیر در رمزگذاری پسوردها استفاده کرده. همچنین از ساده ترین مد که منجر می شه به تکرار نتیجه رمزگذاری در صورت مشابه بودن پسوردها.

بازیابی پسورد

بذارید یه سوال دیگه بپرسیم. پسوردی که رمزگذاری شده اش ۱۱۰edf2294fb8bf4 است و در مجموعه انتخابی ۱.۶ درصد پسوردها رو شامل می شه، چیه؟

بهتره نگاهی به اتفاقات مشابه و آمار هک های دیگه بندازیم و از اون برای تحلیل این داده ها استفاده بکنیم. ۳ سال پیش که Gawker Media هک شد، لیست بیشترین پسوردهای استفاده شده مطابق تصویر زیر بود.

abr-gawker-breach-500

به غیر از کلمه lifehack که یکی از برندهای اون سایت بود، بقیه پسوردهای استفاده شده از کلماتی انتخاب شده که راحت به یاد می مونه و تایپ می شه. با دیدی که از این لیست داریم و نگاهی به ستون یادآوری پسورد می تونیم ۵ پسورد پرکاربرد در داده های لو رفته ادوب رو به دست بیاریم:

abr-top-5-adobe-5001

دقت کنید که پسوردهای ۸ کاراکتری ۱۲۳۴۵۶۷۸ و password در دو بلوک ذخیره شده اند که نشون میده متن رمز شده حداقل ۹ کاراکتر داشته. به احتمال بسیار زیاد روند این شکلیه که پسورد به اضافه یک بایت صفر(ASCII NUL)  می شه که نشون دهنده انتهای رشته در زبان C است و با اضافه شدن ۷ بایت NUL، متن تبدیل به ضریبی از بلوک های ۸ بایتی می شه. بنابراین می تونیم به این نتیجه برسیم که e2a311ba09ab4707 در بلوک دوم، نشون دهنده ۸ بایت صفرِ رمز شده است.

اگر پیش فرض های ما و نتایجی که بهش رسیدیم درست باشه و با توجه به اینکه بلوک e2a311ba09ab4707 در ۲۷ درصد از پسوردهای رمز شده تکرار شده، می تونیم بگیم که ۲۷ درصد پسوردهای کاربران ادوب دقیقا ۸ کاراکتر داره.

می بینید که با کمی تلاش تونستیم ۵ پسورد پرکاربرد ادوب رو به دست بیاریم که پسورد حدود ۲.۷۵ درصد کاربرها بوده و همچنین تونستیم بفهمیم که ۱/۳ پسوردهای کاربران دقیقا ۸ کاراکتر داره. می تونیم تصور کنیم که چه مقدار دیگه اطلاعات می شه از این “بزرگترین جدول کلمات متقاطع تاریخ” به دست آورد.

abr-xkcd-1286-500

منبع

Standard