Mohsen Tahmasebi
Mohsen Tahmasebi
خواندن ۸ دقیقه·۳ سال پیش

توهم حریم خصوصی: دور زدن و ذخیره عکس های زمان دار و سکرت در تلگرام و واتس اپ



نکته: متاسفانه به دلیل سوءاستفاده های احتمالی از دادن جزئیات دقیق فنی معذروم و صرفا هدفم از این پست اثبات امن نبودن مطلق عکس های زمان دار و سکرت در پیام رسان ها هست.

احتمالا برای شما هم پیش اومده که بخواید عکس یا فیلم خصوصی رو برای کسی ارسال کنید و نخواید طرف مقابلتون بتونه اون رو سیو کنه. پیام رسان هایی مثل تلگرام و واتس اپ با عرضه قابلیت های مثل timed media و view once message این امکان رو به کاربر میدن تا یک پیام یا عکس/فیلم رو به طور محرمانه و محدود شده برای طرف مقابل ارسال کنه تا قابل سیو کردن نباشه، و این شده مبنای اعتماد خیلی ها برای ارسال عکس های خصوصی خودشون...

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

نه! اصلا امن نیستن!

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

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

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

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

دستکاری برنامه

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

روش دوم یا همون ساخت یک نسخه دستکاری شده، در واقع Patching نام داره. ما در این روش برنامه رو disassemble میکنیم به سورس SMALI که میتونید به دید اسمبلی برای بایت کد های Dalvik/ART (همون جاوا ران تایم اندروید) نگاهش کنید که فرمت نسبتا low level داره. و بعد با خوندن سورس های decompile شده جاوای برنامه و بررسی ساختار کارش و خوندن کد های SMALI میریم و یک بخش هایی از سورس SMALI رو تغییر میدیم تا برنامه طبق میل ما کار کنه و بعد هم سورس SMALI رو دوباره تبدیل میکنیم به DEX و فایل نصبی اندروید یا همون APK...

البته اوضاع وقتی بدتر میشه که بدونید تمام این فرایند نسبتا پیچیده برای برنامه های closed source هست و برای برنامه ای مثل تلگرام که اوپن سورسه، بی نهایت آسون تره و شما میری سورس اصلی جاوا رو میاری میخونی و دستکاری میکنی و کامپایل...

نسخه دستکاری شده تلگرام

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

توضیحی ندارم :(
توضیحی ندارم :(

حالا کافیه بریم بگردیم کی و کجا داره عکس های تایم دار رو مدیریت میکنه و دستکاریش کنیم و برنامه رو کامپایل کنیم. فایل خروجی apk ما حالا عکس های سکرت رو محدود نمیکنه. تو گیف پایین نسخه خودمو تست کردم و نشون دادم (لود شدن گیف به خاطر حجمش ممکنه طول بکشه):

دور زدن عکس تایم دار تلگرام
دور زدن عکس تایم دار تلگرام

خیلی راحت و با تغییر ۴ خط کد نسخه دستکاری شدمون رو ساختیم!

نسخه دستکاری شده واتس اپ

مرحله سخت کار اینجاست. بر خلاف تلگرام، واتس اپ اوپن سورس نیست و ما باید همون فرایند پچ کردن که گفتم رو انجام بدیم. با بیست سی دقیقه گشتن داخل کد موفق شدم بخش مربوط به عکس های view once رو پیدا کنم، ده دقیقه هم صرف پچ کردن اون بخش شد.

متاسفانه دقیق تر از این نمیتونم وارد جزئیات اینکه کار به عهده کدوم بخش کد هست بشم (نزنید تو سر من که string.xml را چه به عملیات اجرایی)
متاسفانه دقیق تر از این نمیتونم وارد جزئیات اینکه کار به عهده کدوم بخش کد هست بشم (نزنید تو سر من که string.xml را چه به عملیات اجرایی)

کلا بعد از حدود چهل دقیقه اپ رو پک کردم و بردم برای تست که با این صحنه مواجه شدم:

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

برنامه SSL/TLS Pinning داشت اما به محض اینکه می فهمید ارتباط با اینترنت برقراره اما ارتباط خودش با سرور به دلیل خطای TLS برقرار نمیشه، دست به یک روش کاستوم ثانویه برای ارتباط با سرور میزد که باعث میشد ترافیک کپچر نشه اما برنامه کار کنه. به هر صورت موضوع مهمی نبود و برای جلو رفتن مجبور شدم به داینامیک آنالیز رو بیارم و با یک اسکریپت آماده فریدا SSL/TLS Pinning رو دور بزنم تا نتیجه زیر حاصل بشه:

هیچوقت نقاشیم خوب نبود
هیچوقت نقاشیم خوب نبود

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

ساختار کلی کد کلاینت واتس اپ که به شدت مبهم شده (تقریبا همه چیز در پکیج X هست)
ساختار کلی کد کلاینت واتس اپ که به شدت مبهم شده (تقریبا همه چیز در پکیج X هست)

نهایتا بعد از چندین ساعت بررسی سیستم رمزنگاری رکوئست و هوک کردن موارد مختلف برنامه با فریدا، نقاط دقیقی که وظیفه تهیه مشخصه های مربوط به نسخه نصب شده رو داشتن پیدا کردم، اما به دلیل استفاده چندگانه از اون متد ها داخل برنامه مجبور بودم کلاینت رو جوری پچ کنم که فقط در شرایطی که اون مشخصه های خاص درباره نسخه نصب شده واتس اپ دارن دریافت میشن از سیستم عامل، مقدار return تغییر پیدا کنه به مشخصه های یک نسخه اصلی واتس اپ (در واقع خودش رو بزنه جای نسخه اصلی واتس اپ).

بخشی از خروجی هوکر فریدا
بخشی از خروجی هوکر فریدا


بخشی از پچ اعمال شده برای دور زدن سیستم تشخیص پچ
بخشی از پچ اعمال شده برای دور زدن سیستم تشخیص پچ

و بالاخره تونستم لاگین کنم و تازه پچ اصلیم برای دور زدن view once رو آزمایش کنم که... (لود شدن گیف به خاطر حجمش ممکنه طول بکشه):

و فقط با شیش هفت ساعت کار و ۲۵ خط پچ بخش view once واتس اپ و integrity check دور زده شد و یک فایل apk دستکاری شده به دست اومد که به راحتی قابل نصب و استفاده است!

سخن پایانی

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

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

یک عکس، یک فیلم، به خیال باطل اینکه تو سکرت چت یا تایمر دار یا view once امنه ممکنه زندگی شما رو به باد بده. بهترین راهکار، رعایت اصول حریم خصوصی و ایمنی در مواردی هست که ارسال میکنید، فرض رو بر این بذارید که عکسی که میفرستید ذخیره میشه، دوباره فکر کنید چه چیزی رو ارسال میکنید.

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

امیدوارم از خوندن این پست لذت برده باشید، ممکنه یک ویدیو دمو کامل هم از این پروژه بذارم که توی توییترم (@moh53n) اطلاع رسانی خواهم کرد. موفق، سلامت و امن باشید!

تلگرامواتس اپهکسکرت چتحریم خصوصی
بلاگ انگلیسی: https://moh53n.medium.com
شاید از این پست‌ها خوشتان بیاید