در این پست میخواییم یه نگاهی به Silent SMS ها بندازیم و اینکه چطوری یه محققی تونسته با استفاده از اونا، موقعیت مکانی یه کاربر LTE رو شناسایی کنه.
قبل از اینکه وارد بحث بشیم، ابزارها و دستگاههایی که در این تحقیق استفاده شده رو در زیر مشاهده میکنید :
OnePlus2 (روت شده) : این دستگاه بعنوان مودمی استفاده میشه که مهاجم میخواد باهاش Silent SMS ارسال کنه.
گوشی قربانی: هر مدلی میتونه باشه، فقط اگه اندرویدی باشه بهتره چون ابزارهایی مانند Network Signal Guru عملکرد بهتر و راحتتری دارن.
USRP B210 : یه Software-Defined Radio (SDR) که برای رهگیری ترافیک LTE استفاده میشه.
LTESniffer: یه برنامه متن باز که همراه با USRP ، برای رهگیری ترافیک LTE در downlink استفاده میشه.
سیم کارت : دو تا سیم کارت مورد نیازه یکی برای گوشی قربانی و یکی هم برای گوشی مهاجم.
Ubuntu 20.04 : سیستم عامل مورد استفاده ی مهاجم.
در ادامه به بررسی Silent SMS می پردازیم، تا یه دیدی نسبت بهش داشته باشیم ، تا بدونیم قراره چطوری ازش برای شناسایی موقعیت کاربر LTE استفاده کنیم.
آشنایی با Silent SMS ها:
قبل از اینکه بدونیم silent SMS چیه، نیاز هستش که یکمی در خصوص موارد فنی در پیامکها بدونیم.
پروژه 3rd Generation Partnership Project (3GPP) یه سازمان استاندارد سازی هستش که پروتکل های ارتباطی رو برای مخابرات سیار توسعه میده. این سازمان استانداردهای مختلفی رو توسعه داده از جمله : GPRS و EGPRS و HSPA و LTE و … .
یکی از استانداردهایی که این سازمان توسعه داده، GSM 03.40 یا 3GPP TS 23.040 هستش که یه استاندارد در زمینه ارتباطات سیار هستش که فرمت Transfer Protocol Data Units (TPDU) رو در Short Message Transfer Protocol (SM-TP) ،که در شبکه GSM برای انتقال پیامک استفاده میشه، توصیف میکنه.
پروتکل TPDU در این استاندارد ،یه پروتکلی هستش که برای انتقال پیامها بین ایستگاه سیار [Mobile Station (MS)] و مرکز سوئیچینگ سیار [Mobile Switching Centre (MSC)] از طریق Short Message Relay Protocol (SM-RP) استفاده میشه، و بین MSC و Short Message Service Centre (SMSC) بعنوان یه پارامتر در بسته های Mobile Application Part (MAP) ارسال میشه. چیزی که اینجا برای ما مهمه اینکه یه پروتکل انتقال هستش.
GSM 03.40 شش نوع پیام بین MS و مرکز پیام [SMS Center (SC)] تعریف کرده که بهشون انواع TPDU میگیم که فرمت متفاوتی دارن (یسری فیلدهاشون متفاوته). جدول زیر این 6 نوع رو نشون میده :
TP-MTI | direction | message type |
---|---|---|
0 0 | MS → SC | SMS-DELIVER-REPORT |
0 0 | SC → MS | SMS-DELIVER |
0 1 | MS → SC | SMS-SUBMIT |
0 1 | SC → MS | SMS-SUBMIT-REPORT |
1 0 | MS → SC | SMS-COMMAND |
1 0 | SC → MS | SMS-STATUS-REPORT |
1 1 | any | Reserved |
برای درک این نوع ها ، وقتی یه پیامی از موبایلی ارسال میشه، در ابتدا در SMSC ذخیره میشه و در ادامه از اونجا به دستگاه مقصد ارسال میشه. طبق استاندارد 3GPP TS 23.040، نوع پیامی که از دستگاه فرستنده به SMSC ارسال میشه از نوع SMS-SUBMIT هستش و پیامی که از SMSC به گوشی گیرنده ارسال میشه، از نوع SMS-DELIVER هستش.
چیزی که اینجا برای ما مهمه ، SMS-SUBMIT هستش، چون قراره یه پیامکی رو ارسال کنیم. شکل زیر ساختار این نوع رو نشون میده ، که برای ما جای فیلدها و مقادیرش مهمه.
در شکل بالا :
- TP-MTI برای مشخص کردن نوع پیام استفاده میشه.
- TP-MR : یه عدد صحیح بین 0 تا 255 هست که پارامتریه که SMS-SUBMIT رو شناسائی میکنه. یه شماره توالی از همه فریم های SMS-SUBMIT
- TP-DA : شماره تلفن مقصد
- TP-PID : پروتکل لایه بالاتر رو مشخص میکنه که مهمترین فیلد برای ماست.
- TP-UD : متن پیام کاربر
- TP-MTI : نوع پیام رو مشخص میکنه اگه 00 باشه یعنی SMS-DELIVER و اگه 01 باشه یعنی SMS-SUBMIT
silent SMS یه نوع پیامک هستش که در گوشی هدف نمایش داده نمیشه و صدایی هم تولید نمیکنه، برای همین بهش silent SMS میگن و عمدتا برای عیب یابی و … در شبکه ارسال میشه. این نوع پیامکها در استاندارد 3GPP TS 23.040 ، با عنوان Type 0 در TP-PID مشخص شدن. الگوی بیت های اون در TP-PID بصورت 01000000 تعریف شده که هگزش میشه 40 .
در شکل زیر ، دو نوع پیامک معمولی و silent SMS رو مشاهده میکنید:
در ادامه مستندات اومده که ، Mobile Equipment (ME) باید دریافت این نوع پیامک تایید کنه، اما محتوای اون رو دور بندازه. این یعنی اینکه ME پیام رو دریافت میکنه، اما اونو در حافظه یا سیم کارت ذخیره نمیکنه و اعلان و صدا هم به کاربر نشون نمیده.
ارسال Silent SMS :
برای اینکه بتونیم silent SMS رو ارسال کنیم باید اونو بسازیم و برای ساختنش میخواییم یه SMS-SUBMIT با الگوی 01000000 بسازیم. برای این منظور میتونید از سرویس های آنلاین انکدر/دیکدر PDU ، مثلا این سایت، استفاده کنید. این سرویس یه پیام استاندارد ایجاد میکنه، برای اینکه بتونیم silent SMS بسازیم، باید TP-PID رو برابر 01000000 کنیم. ( مقدار هگز 01000000 برابر 40 هستش).
الان پیاممون رو ساختیم و نوبت ارسالش هست. برای ارسال SMS PDU ، هیچ API اندرویدی وجود نداره. برای همین از یه دستگاه اندرویدی روت شده بعنوان مودم استفاده میکنیم تا بتونیم silent SMS ارسال کنیم.
برای ارسال محقق از دستور AT که برای مدیریت عملکرد مودم هست، استفاده کرده و دستگاه اندرویدی رو بعنوان یه مودم USB در نظر گرفته. بسته به مدل دستگاه، رابط مودم USB میتونه موجود باشه یا نباشه. اغلب گوشی های سامسونگ و LG این قابلیت رو دارن مثلا Samsung Galaxy S10 (Android 11) این قابلیت رو بدون روت ارائه میده، فقط برای فعال کردن قابلیت دستور AT اونو باید فعال کنید. [Developer options > 3GPP AT]
دستگاهی که محقق استفاده کرده ،گوشی OnePlus2 روت شده هستش. با ADB بهش وصل شده و در ابتدا دستور زیر رو ارسال کرده تا مطمئن بشه که مودم برای اتصال آماده هستش :
1 |
echo -e "AT\r" > /dev/smd0 |
پاسخ های دریافتی از مودم رو از طریقی Shellای که دستور زیر رو روش اجرا کرده دریافت میکنه :
1 |
cat /dev/sdm0 |
در ادامه دستورات زیر رو زده که بهمراه توضیخاتشون مشاهده میکنید :
1 2 3 4 5 6 |
AT+CMGF=0 //Set PDU mode AT+CMGS=19 //Send message, 19 octets (excluding the two initial zeros) > 0011000C919333143244650000FF05F4F29C1E02 //Actual message (fake number) ^Z //^Z acts as an "enter" |
برای اینکه بدونیم گوشی قربانی Silent SMS رو دریافت کرده، گوشی رو به سیستم متصل کرده و با QCsuper بررسیش میکنیم. همونطور که در شکل زیر میبینید، Silent SMS به درستی دریافت شده.
ویدیو زیر هم یه نمونه از نحوه ارسال پیامک معمولی و Silent SMS رو نشون میده :
نحوه شناسایی مکان یه کاربر LTE:
خب در این مرحله میخواییم مکان کاربر LTE رو شناسایی کنیم. فرض کنید مهاجم شماره تلفن قربانی رو داره و حداقل اطلاعاتی در خصوص مکانهایی که قربانی عمدتا در اونا هست رو داره. مهاجم میخواد بدونه که قربانی آیا در مکان ایکس هست یا نه.
برای اینکار مهاجم میتونه از یه SDR برای اسنیف اتصالات downlink [ اتصال یک طرفه از سرور (مانند شبکه سیار) به دستگاه کاربر (مانند موبایل)] استفاده و همزمان Silent SMS رو به قربانی ارسال کنه بدون اینکه قربانی متوجه اش بشه و یه الگوی قابل تشخیص هم ایجاد کنه. بعدش با تجزیه و تحلیل الگوی مشخص در بسته های ارسال شده، مشخص کنه که قربانی در اون مکان هست یا نه.
برای انجام این کار، مهاجم در ابتدا اسکریپت زیر رو ایجاد میکنه :
1 2 3 4 5 6 7 8 9 |
echo -e "AT\r" > /dev/smd0 for i in {1..10} do echo -e "AT+CMGS=19\r" > /dev/smd0 echo -e "0011000C919333143244650000FF05F4F29C1E02" > /dev/smd0 echo -e "^Z" > /dev/smd0 sleep 2 done |
این اسکریپت 10 تا پیام ارسال میکنه که بین هر پیام 2 ثانیه تاخیر داریم. در حقیقت این الگوی قابل تشخیص مهاجم هستش. چون بین ترافیک ارسالی ، یجوری باید بدونیم چی ارسال میکنیم و دریافت میکنیم.
در ادامه مهاجم USRP B210 رو متصل میکنه و از LTEsniffer برای اسنیف ترافیک LTE downlink از Base Station (BS) استفاده میکنه.
همونطور که قبلا گفتیم، مهاجم میخواد مکان شناخته شده قبلی که قربانی در اون حضور داره رو شناسایی کنه. این یعنی اینکه فرکانس BS که منطقه رو پوشش میده بدست بیاره. برای این منظور میتونید از اپ Network Signal Guru ، که برای تست کیفیت صوتی و داده و فناوریهایی مانند LTE ، GSM ، GPRS و … ارائه شده، استفاده کنید. با این ابزار اطلاعاتی در خصوص ترافیک LTE بدست میارید.
مهاجم با اسنیف ترافیک LTE با استفاده از LTEsniffer برای یه مدت زمانی، یه فایل pcap بدست میاره که حاوی Downlink Control Information (DCIs) و Radio Network Temporary Identifiers (RNTIs) برای همه دستگاههای کاربر هستش.
با بررسی این فایل و الگوی قابل تشخیص، مهاجم میتونه بفهمه که آیا قربانی در اون مکان هست یا نه. در شکل بالا میبینید که قربانی بعد از ساعت 17:20 بسته های مطابق با الگوی قابل تشخیص ما دریافت کرده.
نکته اینکه ، با RNTI بدست اومده ، میشه حملات دیگه رو هم انجام داد.
تشخیص Silent SMS :
در تکنیکی که در این مقاله مورد بحث قرار گرفت، مشاهده میکنیم که عمده تکنیک روی Silent SMS هستش. Silent SMSها اغلب برای عیب یابی شبکه و … استفاده میشه اما برای خودشون مسائل امنیتی هم دارن مثلا میشه حملات DoS باهاشون انجام داد.
در ادامه بررسی میکنیم که چطوری Silent SMSها رو شناسایی کنیم.
اندروید بعد از دریافت چنین پیامکهایی، اونارو لاگ میکنه. یه پروژه ای هست بنام AIMSICD که در اون روشی برای شناسائی Silent SMSها از روی لاگ اندروید معرفی شده.
اگه SMS-DELIVER دریافتی یه پیامک خاص باشه، اندروید مدیریت اونو به GsmInboundSmsHandler.disappatchMessageRadioSpecific میسپاره. بخشی از کد برای این عمل رو در زیر میبینید :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
protected int dispatchMessageRadioSpecific(SmsMessageBase smsb, @SmsSource int smsSource) { SmsMessage sms = (SmsMessage) smsb; if (sms.isTypeZero()) { // Some carriers will send visual voicemail SMS as type zero. int destPort = -1; SmsHeader smsHeader = sms.getUserDataHeader(); if (smsHeader != null && smsHeader.portAddrs != null) { // The message was sent to a port. destPort = smsHeader.portAddrs.destPort; } VisualVoicemailSmsFilter .filter(mContext, new byte[][]{sms.getPdu()}, SmsConstants.FORMAT_3GPP, destPort, mPhone.getSubId()); // As per 3GPP TS 23.040 9.2.3.9, Type Zero messages should not be // Displayed/Stored/Notified. They should only be acknowledged. log("Received short message type 0, Don't display or store it. Send Ack"); addSmsTypeZeroToMetrics(smsSource); return Intents.RESULT_SMS_HANDLED; } |
توو کامنت اول گفته شده که برخی از اپراتورها پست های صوتی تصویری (visual voicemail) رو بعنوان پیام type 0 ارسال میکنن ، بنابراین اندروید 12 در ابتدا SMS PDU دریافتی رو به پروسس visual voicemail ارسال میکنه و در ادامه یه لاگ از نوع debug-level ثبت میکنه که نشون میده پیام type 0 دریافت شده.
در ویدیو پایین لاگ های اندروید رو مشاهده میکنید. پنجره بالایی مربوط به Galaxy S10 هستش که بعنوان مهاجم در نظر بگیرید و پنجره پایین مربوط به Pixel 4a هستش که قربانی فرض کنید. با ارسال دستور زیر به Pixel 4a میتونید لاگ مربوط به پیام type 0 رو که به رنگ قرمز هست، مشاهده کنید.
1 |
adb logcat -b radio GsmInboundSmsHandler:D *:S -v brief |
منابع