محققای NCCGroup یه تحقیقی روی کلاینت Cisco AnyConnect انجام دادن تا ببینن آیا میشه در فرایند تیم قرمز ازش برای تحویل و اجرای پیلود استفاده کرد یا نه. نتیجه این تحقیق مثبت بوده و یه ابزار هم براش توسعه دادن. در این پست به بررسی کوتاه این گزارش پرداختیم.
در کشورهای خارجی از VPN برای ارتباط امن استفاده میکنن. این امر بعد از شیوع کرونا بیشتر هم شد. چون افراد بصورت دورکاری فعالیت میکردن و از خونه با استفاده از یه VPN به شرکت وصل میشدن و کارشون رو انجام میدادن.
یکی از ابزارهایی که اتصال VPN رو برای ما فعال میکنه، Cisco AnyConnect هستش. این کلاینت روی سرویس vpnagent.exe متمرکز هستش و در طول سالها آسیب پذیری های مختلفی از نوع افزایش امتیاز در این کلاینت کشف و گزارش شده.
برای اینکه بتونیم در AnyConnect یه اتصال جدید ایجاد کنیم، در ابتدا پروسس vpnui.exe داریم که از ما درخواست آدرس سرور VPN رو داره.
بعد از وارد کردن آدرس و زدن connect یه TLS handshake انجام میشه. بعد از تکمیل این مرحله ، سرور یه پاسخ بصورت XML ارسال میکنه که توش در مورد نام VPN و نحوه احراز هویت توضیحاتی رو میده. مثلا درخواست زیر یه نمونه از این پاسخ XML هستش که نامش TEST-VPN هستش و نوع احراز هویت هم نام کاربری و پسورد هستش.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
<?xml version="1.0" encoding="UTF-8"?> <config-auth client="vpn" type="auth-request" aggregate-auth-version="2"> <opaque is-for="sg"> <tunnel-group>VPN</tunnel-group> <aggauth-handle>864640002</aggauth-handle> <auth-method>multiple-cert</auth-method> <auth-method>single-sign-on</auth-method> <group-alias>TEST-VPN</group-alias> <config-hash>1517719014268</config-hash> </opaque> <auth id="main"> <form> <input type="text" name="username" label="Username:"></input> <input type="password" name="password" label="Password:"></input> <select name="group_list" label="GROUP:"> <option selected="true">TEST-VPN</option> </select> </form> </auth> </config-auth> |
این پاسخ همونطور که گفتیم نوع احراز هویت رو مشخص میکنه. با توجه به پاسخ دو حالت اصلی داریم:
- یا اینکه درخواست نام کاربری و پسورد میشه که در نتیجه یه پنجره در vpnui.exe باز میشه و از ما نام کاربری و پسورد رو میخواد.
- یا احراز هویت از طریق SAML مبتنی بر وب هستش که از طریق acwebhelper.exe انجام میشه.
در این تحقیق نوع اول که XML بالا باعث نمایشش میشه رو بررسی کردن.
بعد از وارد کردن نام کاربری و پسورد، این اطلاعات از طریق یه درخواست POST به سرور فرستاده میشه. اگه احراز هویت با موفقیت انجام بشه، پاسخ حاوی اطلاعات زیر هستش:
- ارتقاء نرم افزاری اگه در دسترس باشه
- پروفایلی که باید توسط کلاینت VPN درخواست بشه
- یسری موارد شخصی سازی مانند لوگو، اسکرپیتهای بعد اتصال و …
یه نمونه از این پاسخ XML رو در زیر میبینید:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 |
<?xml version="1.0" encoding="UTF-8"?> <config-auth client="vpn" type="complete" aggregate-auth-version="2"> <session-id>101111</session-id> <session-token>AAAAAA@BBBBBB@CCCC@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD</session-token> <auth id="success"> <message id="0" param1="" param2=""></message> </auth> <capabilities> <crypto-supported>ssl-dhe</crypto-supported> </capabilities> <config client="vpn" type="private"> <vpn-base-config> <base-package-uri>/CACHE/stc/1</base-package-uri> <server-cert-hash>###SERVERCERT###</server-cert-hash> </vpn-base-config> <opaque is-for="vpn-client"><service-profile-manifest> <ServiceProfiles rev="1.0"> <Profile service-type="user"> <FileName></FileName> <FileExtension>xml</FileExtension> <Directory></Directory> <DeployDirectory></DeployDirectory> <Description>AnyConnect VPN Profile</Description> <DownloadRemoveEmpty>false</DownloadRemoveEmpty> </Profile> <---REMOVED---> </ServiceProfiles> </service-profile-manifest> <vpn-client-pkg-version> <pkgversion>4,9,04053</pkgversion> </vpn-client-pkg-version> <vpn-core-manifest> <vpn rev="1.0"> <file version="4.9.04053" id="VPNCore" is_core="yes" type="msi" action="install" os="win:6.1.7601"> <uri>binaries/anyconnect-win-4.9.04053-core-vpn-webdeploy-k9.msi</uri> <display-name>AnyConnect Secure Mobility Client</display-name> </file> <---REMOVED---> </vpn> </vpn-core-manifest> </opaque> <vpn-profile-manifest> <vpn rev="1.0"> <file type="profile" service-type="user"> <uri>/CACHE/stc/profiles/profile_test.xml</uri> <hash type="sha1">###PROFILEHASH###</hash> </file> </vpn> </vpn-profile-manifest> <vpn-customization-manifest> <vpn rev="1.0"> <file app="AnyConnect" platform="win" type="binary"> <filename>scripts_OnDisconnect.vbs</filename> <hash type="sha1">###VBSHASH###</hash> <file app="AnyConnect" platform="win" type="binary"> <filename>scripts_OnConnect.vbs</filename> <hash type="sha1">###VBSHASHTWO###</hash> </file> </file> </vpn> </vpn-customization-manifest> </config> </config-auth> |
اگه به انتهای XML نگاه کنیم، یه بخش سفارشی سازی هستش که فایل vbs رو نشون میده. در حقیقت این فایلهای vbs بعد از تحویل XML، دانلود میشن و بعد از اتصال موفق ،اجرا میشن. البته فقط VBS نیست و احتمالا میشه bat رو هم اجرا کرد اما مورد اصلی همون vbs هستش.
بعد از این مرحله از اتصال، در نهایت کلاینت یه درخواست پروفایل به سرور میفرسته و سرور این درخواست رو در قالب XML برمیگردونه. این XML هم شامل یسری اطلاعات از جمله اینکه چه ویژگیها و موارد امنیتی برای این اتصال باید لحاظ بشه ، هستش. این قسمت هم مهمه چرا که میتونه مثلا ویژگی اجرای اسکریپت برای یه کاربر فعال یا غیرفعال کنه.
این همه قصه گفتیم به این برسیم که سرور VPN عملا میتونه هر کد دلخواهی رو روی کلاینتها اجرا کنه و یه مسیر عالی برای دسترسی اولیه هستش.
نکته ای که هست برای اعمال این روش، نیاز هستش که مهاجم به سرور VPN دسترسی داشته باشه. اما محققا با استفاده از یه وب سرور قدیمی پایتونی تونستن به یه نقطه پایانی VPN برسن که هر اعتبارنامه ای که وارد میشه رو قبول میکنه، اونهارو لاگ میکنه و همچنین یه اسکریپت هم برای اجرا به کاربر احرازهویت شده میده. همه این ها رو هم در قالب یه ابزار بنام DroppedConnection ارائه دادن.
روش های دفاع:
در ادامه گزارش یسری روش شناسایی و پیشگیری از این حملات رو معرفی کردن از جمله :
اگه کاربرانتون فقط از یه نقطه پایانی VPN استفاده میکنن، گزینه تنظیم دستی جایگزین رو با قرار دادن تنظیمات زیر در پروفایل غیر فعال کنید:
1 |
<AllowManualHostInput>false</AllowManualHostInput> |
استفاده از پالیسی های سختگیرانه AppLocker برای جلوگیری از اجرای اسکریپتها. مثلا جلوگیری از اجرای wscript.exe . برای این کار میتونید فایلهای ناشناخته یا LOLBIN رو مسدود کنید.
پروسسهای زیر رو در فایروالها و محصولات امنیتی طوری تنظیم کنید که فقط به نقاط پایانی VPN مورد نظر وصل بشن:
1 2 3 4 |
vpnui.exe vpndownloder.exe acwebhelper.exe vpnagent.exe |