
تصعيد الامتيازات المحلية في HP Support Assistant
ثغرة تصعيد صلاحيات محلية في مساعد HP عن طريق إساءة استخدام الروابط الصلبة (hard link)
الباحث: ManhNDd من Bkav
في واجهة مستخدم مساعد HP (HP Support Assistant GUI)، عند النقر على التحقق من التحديثات والرسائل (Check for updates and messages)، يقوم الخدمة HP Support Solution Framework بتشغيل بعض المهام، وتبدأ تشغيل HPSAObjUtil8.exe (يعمل بصلاحيات SYSTEM) الذي يغير صلاحيات جميع ملفات .xml في المجلد C:\ProgramData\Hewlett-Packard\HP Support Framework\Logs\Temp\HPSA. بالتفصيل، يمنح HPSAObjUtil8.exe تحكمًا كاملاً في هذه الملفات .xml لجميع المستخدمين. فيما يلي الكود الضعيف في HPSAObjUtil8:
public static void AddTempLogsPermission()
{
string path = Environment.GetEnvironmentVariable("ProgramData") + "\\Hewlett-Packard\\HP Support Framework\\Logs\\Temp\\HPSA";
if (Directory.Exists(path))
{
string[] files = Directory.GetFiles(path, "*.xml");
if (files != null && files.Length != 0)
{
foreach (string fileOrFolderName in files)
{
Patches._utils.AddFileSecurity(fileOrFolderName);
}
}
}
}
يمكن للمستخدم إنشاء رابط صلب (hardlink) باسم ???.xml في المجلد C:\ProgramData\Hewlett-Packard\HP Support Framework\Logs\Temp\HPSA، وتوجيهه إلى ملف ضحية من اختيارنا (كل ما نحتاجه هو صلاحية قراءة)، ثم السماح لـ HPSAObjUtil8 بتعديل صلاحيات الملف بحيث نحصل على صلاحيات كاملة عليه (قراءة/كتابة/حذف). لذلك تتيح لنا هذه الثغرة الحصول على صلاحيات كاملة على ملفات النظام => يمكننا استبدال DLL للنظام للحصول على صلاحيات النظام. بالمناسبة، درجة CVSS 3.0 للثغرة تحدد الصلاحيات المطلوبة (Privileges Required) كـ عالية (High). يجب أن تكون لا شيء (None)، لأنني اختبرت الثغرة بنجاح على مستخدم غير مدير (non-admin).
عن طريق عكس هندسة HPSF.exe و HPSupportSolutionsFrameworkService.exe، اكتشفت أن العميل HPSF.exe يتواصل مع الخدمة من خلال الواجهة HP.SupportFramework.ServiceManager.Interfaces.IServiceInterface (المعرفة في HP.SupportFramework.ServiceManager.dll). إذا استدعى العميل الطريقة IserviceInterface.RunAnalysis، ستبدأ الخدمة تشغيل HPSAObjUtil8 وتُفعّل الثغرة.
ServiceInterface.Instance.RunAnalysis("en-US", true);
لذا يجب عليك إنشاء عميل مزيف واستدعاء RunAnalysis. ومع ذلك، تتحقق الخدمة من هوية العميل قبل معالجة الطلب:
{
Process processById = Process.GetProcessById(\u0002);
string text = \u000E.\u0001(processById);
if (processById.MainModule.FileName.ToLowerInvariant() != text.ToLowerInvariant())
{
if (DebugLog.IsDebug)
{
DebugLog.LogDebugMessage("Invalid File detected: " + text, DebugLog.IndentType.None);
}
return false;
}
Process parent = processById.GetParent();
bool flag = true;
int num = 0;
while (parent != null && flag && num <= 5)
{
bool flag2;
flag = \u000E.\u0001(parent, out flag2);
if (!flag || flag2)
{
break;
}
num++;
parent = parent.GetParent();
}
return flag;
}
دعنا نتحايل على التحقق من هوية العميل:
الآن تحتاج إلى إيجاد ملف تنفيذي يمكن أن يكون هدفًا للرابط الصلب (hardlink). يجب أن يكون EXE أو DLL يتم تشغيله تلقائيًا كـ SYSTEM بعد فترة، بحيث عند استبداله تحصل على صلاحيات SYSTEM. أرى أنه عند استدعاء RunAnalysis، تبدأ HPSupportSolutionsFrameworkService العديد من العمليات كـ SYSTEM. يمكنك استبدال هذه العمليات بملفك التنفيذي. ومع ذلك، تتحقق الخدمة من توقيعات هذه الملفات EXE قبل تشغيلها، لذا لا يمكنك إنشاء EXE مزيفة، ولكن يمكنك الاعتماد على DLLs التي تُحمّل بواسطة هذه الملفات EXE. هناك العديد من DLLs التي تم تحميلها بالفعل في مكان ما، والعديد من DLLs الخاصة بـ .NET يتم التحقق من توقيعها قبل التحميل، لذا لا يمكنك استخدامها. لحسن الحظ، لا تزال هناك بعض DLLs قابلة للاستخدام:
حاولت تعديل hputils64.dll ونجحت. قمت بإنشاء رابط صلب لـ hputils64.dll. عند استدعاء RunAnalysis، يُغير HPSAObjUtil8 صلاحيات hputils64.dll، ثم بعد بضع ثوانٍ يبدأ Detect_BatteryFailure.exe (بصلاحيات LOCAL SYSTEM) ويُحمّل hputils64.dll. قبل تحميل hputils64، يمكنك استبداله، بحيث يُحمّل Detect_BatteryFailure.exe DLL الخبيث الخاص بك وتحصل في النهاية على صلاحيات SYSTEM.
لكتابة الاستغلال، أنشأت:
فيما يلي خطوات الاستغلال في PrivHP4.py:
لاختبار الإثبات (PoC)، فقط استنسخ المستودع وقم بتشغيل PrivHP4.py.