الحمد لله، فخور بتحقيقي المركز الأول في منصة مكافآت الثغرات للربع الرابع لعام 2024،
كأكثر باحث اكتشافًا للثغرات، وأيضًا أكثر باحث اكتشافًا للثغرات الحرجة
شكرا @BugBountySA@SAFCSP على دعمهم لرفع الكفاءات الوطنية 🇸🇦
كيف قدرنا نكتشف ثغرة؟
🔴Secondary Context Leads to Full Company Takeover
كيف قدرنا نوصل انا و لا
🔺 تحكم كامل على اكثر من 3,000 الاف شركة وجميع الفروع المسجلة
🔺جميع بصمات وهويات الموظفين والمستخدمين
🔺 وصول وتحكم كامل على جميع حسابات المستخدمين
🔺اضافة بيانات حساسة الى قاعدة البيانات
🔺وصول الى جميع الدومينز الداخلية
🔺 وكيف قدرنا نتخطى الثغرات السابقة من خلال التكنيك هذا
نسمي بالله ونبدا
خلونا بالبداية نشرح كيف قدرنا نكتشف الثغره قبل كل شيء عشان تكون الصورة واضحة
اثناء فحصنا للموقع قدرت اني اسبب خطأ من خلال تلاعبي بال Request وطلع لي Error غريب بال Response مثل مانلاحظ
مثل مانلاحظ ان ال path بال Response مختلف تماما عن ال path الي موجود بال Request
من اول نظرة عرفنا انه هذا ال path الي يتم استعماله ك Backend API فالعملية الي تصير نفس كذا
اول سؤال جاء ببالي هل ممكن اني اوصل الى ال Backend API ؟
طيب عمر قبل سؤالك ذا وش الفايده اذا وصلت الى ال backend API؟
بكل اختصار دايما ال Backend API يكون عباره عن Internal domain
بمعنى اذا قدرت توصل له يمديك توصل الى مسارات وبيانات واشياء مره كثيره وهذا الي راح نشوفه بالمقالة (;
في اول محاولتنا الى ��لوصول الى ال Backend API حاولنا انه نسوي traversal بمعنى انه نحاول نخلي ال Backend يوصله path محدد
ولكن للأسف كان فيه WAF يمنعنا من انه نسوي Path traversal
وهنا حاولنا ندور تخطي بأكثر من طريقة ولكن للأسف كان ال WAF يمنعنا
كملت عملية البحث وقلت خل اشيك على ال JS Files شفت بال JS files ال domain معرف (الي فيه WAF)
ولكن لقيت ايضا API domain اخر معرف وقررنا نشيك عليه
بعد ماشيكت عليه طلع نفسه نفس ال API الأساسي ولكن ماكان فيه أي WAF!
على طولت رحت اجرب اني اسوي Path traversal
تكملة ⬇️
كيف قدرت أكتشف ثغرة؟
🔴Exploiting IDOR Through Timestamp Generation and Timing Gaps
مساكم الله بالخير اليووم عدنا لكم اليوم بمقاله ممتعه ومشوقه لأن فيها عدة افكار مثل ماراح نشوف
فنسمي بالله ونبدا
التطبيق كان عباره عن موقع يقدم خدمات الكترونيه جوالات بطائق الكترونيه والخ
اول شيء خل نفهم عملية الشراء
اذا جيت تشري منتج معين وتميت عمليه الدفع request يطلع من ال front-end API لل Backend API ويتحقق من الدفع بعديين يرجع لك قيمه “requestID”
والقيمه هذي هي الي تعرف الطلب حقك بال server-side ويتم الأعتماد عليها بشكل كامل
بعد العمليه هذي تبقى اخر عمليه والي هي انشاء الطلب او ارسال اطلب للايميل اذا كانت بطاقه رقميه
بس خل نشوف ال request عشان نفهم اكثر
طيب هنا نلاحظ كم شيء اول شي ال endpoint فيها hash value
والشي الثاني ال requestId الي عرفنا فكرته بال server-side
اول شي نبي نعرفه هل فيه تحقق من ال hash value الي بالمسار مع ال requesId" parmater" ?
يعني هل يتم التحقق من قيمه الهاش مع ال requestId parameter لازم مطابقين لبعض او لا ?
فالي سويته رحت شريت طلب ثاني بجهاز ثاني واخذت قيمه ال requestId" parameter" وجربته بحسابي الاول
وبالفعل مثل ماتوقعت ماكان فيه validation او تحقق من قيمه الهاش مع ال requestId" parameter" وامورنا الى ال��ن بالسليم
ودام مافيه اي نوع من التحقق حنا قادرين ناخذ اي طلب (اذا جبنا) قيمه ال requestId parameter وحط لي كم خط على كلمه اذاااا جبنا
# Unlock the ReqID Value
بس عمر شلون بتجيب قيمه ال requestId ?
سوال جميل ومن هنا نبدا بالثقيل
طيب اول شي ال requestId عباره عن 13 رقم لذلك شبه مستحيل انه نجيبه خصوصا ان عامل الوقت عندنا مهم لازم نسوي ال request قبل لايسويه المستخدم الاساسي
عشان كذا بديت احاول اشوف اي طريقه اجيب فيها قيمه ال requestId بحثثت وبحثت لين اكتشتف بالاساس القيمه عباره عن timestamp لكن بال millisecond
ودامه عباره عن timestamp حنا قادرين انه نرجعه الى هيئه تاريخ والعكس صحيح
طيب عمر مافهمت وش الي تبي توصله الحين؟
بما ان عباره timestamp وقادرين نحوله الي تاريخ والعكس صحيح
والتاريخ قابل للتبنئ بمعنى اليوم التاريخ 9 ماراح تسوي timestamp ليوم 8
اما بالنسبه للساعه هنا قادرين انه نستهدف ساعه معينه مثلا الساعه 3 وتقدر تخليه متغير لكن لتبسيط تطبيق الثغره ثبت ساعه معينه
اما بالنسبه للدقايق والثواني هنا مستحيل انك تستهدف دقيقه او ثانيه معينه لأن شبه مستحيل تستهدفهم عشان كذا هذولي الي راح تكون متغيره
حلوووين الحين عرفنا بنيه ال requestId وفكرته وكيف يصير
# Generate Timestamps
الحين خل ننتقل للجزئية الثانيه بانه كيف نسوي القيمه هذي؟
سويت سكربت ياخذ تاريخ ووقت معين ويسوي list timestamp الى نص ساعه قدام او لساعات قدام (بالمستقبل) حسب المده الي ابغاه لكن اهم شي تكون بالمستقبل
وفكرته راح ياخذ اليوم والسنه والشهر وراح تكون ثابته اما بالنسبه للوقت هنا الي راح نتلاعب فيه
او هنا بالسكربت هذا خليته ياخذ timestamp ويسوي timestamps الى اوقات مستقبليه لساعه او نص ساعه قدام
حلوييين الحين جبنا ال timestamps وعرفنا فكرته والحين جاء وقت انه نستعمله لل requestId" parameter"
مساكم الله بالخيير
تم اكتمال دورة الـ CBBH بشكل كامل
نبذة بسيطة عن الـ CBBH دورة مخصصة للبق باونتي او إكتشاف الثغرات راح تاخذك من الأساس الى مستوى ممتاز في طرق إكتشاف الثغرات وطرق تخطياتها للمواقع
وطبعا ركزت بالدورة اني اعطيك الزبدة واهم الأشياء والأساليب الي راح تفيدك باكتشاف الثغرات من دون حشو محتوى وكلام فاضي
والحمد لله هذي بعض اراء المشتركين بالدورة
https://t.co/WQ66OIPQyd
وايضا بمناسبة اليوم الوطني نازل كود خصم لفترة محدودة SAUDI15
ولتفاصيل أكثر عن الدورة
https://t.co/QEblYrxv4d
حياكم الله جميعا يوم الأربعاء,
راح اتكلم عن ثغرة ال Cache Poisoning & Deception واكييد راح تكون فيه تكنيكات حلوة ومميزة لل caching attacks مثل
Delimiter Misuse
Path Normalization
and much more!
لاتفوتكم الورشة!
كيف قدرت اكتشف ثغرة
🔴From JavaScript Analysis To UUID Pattern Exploration Revealed a Critical IDOR!
مسائكم الله بالخير, عدنا بعد انقطاع لفترة طويلة بس مثل مايقولون من طول الغيبات جاب الغنايم
اليوم عندنا بعض الطرق الممتعة الي استغليته مع بعض الى تحقيق ثغره ممتعة وخطيرة
بس قبل نبدا خل ناخذة فكرة بسيطة عن الموقع عبارة عن جهة حكومية تقدم خدمات للمستخدمين وتعتبر خدمات حساسة
طبعا حرصا على هوية الجهه عدلت على السناريو بعض الشيء
نسمي بالله ونبدا
من هنا نبدا بنفس هذا الموقع من خلال تحليلي لملف��ت الجافا سكربت قدرت اني اكتشف على بعض الثغرات بما ان الموقع مبني على "React" ف اغلب ال endpoints راح تكون موجودة لنا في ال Clinet Side
بعد ماكتشتف احد الثغرات بال JS Files حاولت اني اجمع ملفات جافا سكرت اخرى قدر الأمكان بعدة طرق بأستعمال الطرق الشائعة لكن للأسف ماكان فية أي نتيجة
معلومة بسيطة في حال انك فتحت اي موقع وشيكت على ال Dev tools وشفت ملفات الجافا سكربت الي قاعد يصير له load او تحميل بالمتفصح حقك
راح تشوف بعض النتائج ولكن هذي مو كل ملفات الجافا سكربت لأن قاعد يصير تحميل لملفات الجافا سكربت الي انت تحتاجه لذلك فية احتمالية كبيرة تكون فيه ملفات مو واضحة لك مثلا لل admin function او ملفات اخرى لكن ماقعد يصير له load بالمتصفح حقك
ولأني كنت متأكد انه فية ملفات اخرى مو واضحة لي
بدييت احاول استخرج ملفات الجافا سكربت قدر الأمكان
بعد ماحاولت اجيبهم بالطرق الشائعة ولا وحده منهم ضبطت
فكرت شوي ولاحظت ان اغلب ملفات الجافا سكربت تتبع نمط معين بتسمية الملفات والملفات تعبر عن طبيعة الخدمات بالموقع مثل
users.js
customer.js
static.js
الاغلب يعرف فكرة تخميين المسارات او بما يسمى ال Fuzzing
لكن عمرك فكرتك انك تسوي Fuzzing او تخمين على ملفات الجافا سكربت؟
فهذا الي سويته اول ماشفت نمط تسمية الملفات قلت بسس بديت اجمع اغلب او ال words او الكلمات المحتملة الي ممكن تكون ك js file حسب طبيعة الموقع جمعت كلمااات كثيرة والحين جاء الوقت اني اسوي wordlist من خلالهم
بالأستعانة مع اعز الأخوياء Chat GPT واداة تسمى RSMangler قدرت اني اسوي wordlist فيها انماط محتملة ان تكون بالموقع
بدييت بعملية التخميين ومثل مانلاحظ اني حصلت على ملف جافا سكربت جديد اسمه Report.js
فتحت الملف وبدييت احلله ومن خلال تحليلي له قدرت اني اكتشف endpoint متواجدة بال Client side ولكن كانت تسمح لي اعدل على احد الوثائق الحكومية الخاصة لي انا عبر احد ال API Request
الحيين انتهينا من اول جزء وهو javascript analyzing خل نروح للخطوة الي
# Breaking UUID To achieve IDOR!
ومن هنا تبدا المتعة (;
اول ماحدثت البيانات من خلال المسار الي جبته من ال jsfile والتقطت ال��لب لاحظت كم شيء
نلاحظ انه قاعد يرسل request to the API وفية اكثر من براميترز لكن فيه براميترين الي شدو انتباهي RequestId الي بال path و ال "id" بال json body
طبعا هنا عرفت انه قاعد يعرف طلب المستخدم من خلال احد هذي البرايمترز مع انه عبارة عن UUID الا اني كنت ابي اتاكد اذا جبت UUID اخر هل اقدر اعدل وثائقة بمعنى هل فية Access cotnrol او لا ؟
فسويت حساب ثاني وجبت قيمة ال UUID له وجربت احدثه من خلال حسابي الأول وبالفعل قدرت اني احدثه وهنا تعبتر IDOR
لكن بما انه نحتاج ال UUID ماراح تنقبل بما ان (اغلب) ال UUIDS تكون غير قابلة للتخمين
بس ماوقفت هنا حاولت اني اعرف بنية ال UUID بما ان احيانا يكون فيه بعض ال Misconfiguration او الأخطاء بال UUIDs
سويت اكثر من وثيقة او طلب واستخرجت كل قيم ال UUIDs للطلبات المختلفة وهنا فرحت لأني شفت كل ال UUIDs تتبع pattren او نمط معين مثل:
f6b168b5-A805-ef11-A832-005056066af7
13a6d3c4-Ab05-ef11-A832-005056066af7
972a6aad-Ab05-ee11-A832-005056066af7
b542816d-Ab05-ef11-A832-005056066af7
مثل مانلاحظ ان كل ال UUIDs تتبع نفس النمط بأستثناء اول جزء وهو الي يكون متغير هنا ماصدقت قلت ممكن ان ال UUID يتبع نمط معين لانه من حسابي فالي سويته رحت لحسابي الثانية وسويت اكثر من طلب وبالفعل طلع ان ال UUID يتبع نمط معين لكل الحسابات!
والحين قادر اني احدث جميع الوثائق الحكومية لأي شخص بمجرد اني اجيب اول جزء من قيمة ال UUID!
وطبعا ماكان فية Rate limit لل API لذلك راح تكون العملية سهلة
والى هنا وصلنا للنهاية اتمنى ان شرحي كان واضح
واذا استمتعت لاتحرمنا من التكبيسات Like & Repost
الحمد الله، اليوم انتهينا من دورة
الـ” practical bug hunting” المقدمة من @BugBountySA
ثلاث أيام كانت ممتعة جدا، شعور لايوصف أبدا بعد ماتفيد عدد حضور كبير، اسمتعت جدا بتقديم الدورة واتمنى إنه نالت على اعجابكم 🙏
كل الشكر الى @SAFCSP@BugBountySA على تقديم هذي الفرصة
#PBH_BugBountySA
5 أيام تفصلنا عن دورتنا القادمة⏳
اكتشفوا أساسيات صيد الثغرات في دورة Practical Bug Hunting🔍
#مكافآت_الثغرات
🗓| 30 يوليو - 01 أغسطس
⏱| 8:00م - 9:00م
سجّل الآن:
https://t.co/wzXhNlocZM
سعيد بأنني سأقدم دورة "Practical Bug Hunting" في @BugBountySA
الدورة بتكون لمدة 3 أيام، وبنتطرق فيها أساسيات الـ Bug Bounty بالإضافة إلى بعض المواضيع ��لأخرى.
لاتفوتكم الفرصة!
الحمد الله، تم أكتمال دورة الـ CBBH بنسبة 80%
نبذة بسيطة عن الدورة :
الدورة تم الشرح فيها منهج الـ CBBH بشكل كامل وهي عبارة عن دورة موجهة للأشخاص المهتمين في دخول مجال الـ Bug Bounty او إكتشاف الثغرات للمواقع، سواء مع خلفية بسيطة او بدون خلفية مسبقة.
المميز بالدورة راح ياخذك من أساسيات المواقع الى أكتشاف الثغرات وطرق تخطياتة ومن ثم طريقة كتابة التقرير بشكل احترافي، وأيضا المميز مركزين على التطبيق العملي بشكل اكبر، والجميل بالـ CBBH لاباتهم العملية الي فيها واقعية بشكل كبير ومقاربة للواقع نوعا ما
طبعا مع تسجيلك للدورة راح يكون فية قروب بالتلقرام يتم المناقشة فية بحيث اذا كان شخص عندة اي أستفسار، راح نقدر نجاوبة بأذن الله
بالاضافة إلى، أن راح يتم إضافة قسم بالدورة قريبا خارج نطاق الـ CBBH للفائدة، بمسمى case study وفكرتة راح اشرح ونحلل فيه أشهر الثغرات الي تم إكتشافة لمواقع bug bounty بالواقع وبشرح مفصل وكل ثغرة راح نحلل فيها عدة تقارير، وهذا الشيء راح يفيدك جدا بالتفكير وطرق إكتشاف الثغرات في المواقع الحقيقة
بالنهاية اذا كان عندك أستفسار حول الدورة يتواصل على الخاص أو يتواصل مع حساب الاكادمية @CyberTx_sa وراح نفيدة بأذن الله
ولتفاصيل أكثر هذا رابط المقدمة:
https://t.co/QEblYrxv4d
انضم لدورة Bug Bounty Hunting 🚀! تعلّم أساليب احترافية واكتسب مهارات عملية في اكتشاف الثغرات🐞🔍
سجل الآن!
https://t.co/DxSHLzxjF7
#CyberTx#سايبرتكس#BugBounty
كيف قدرت القى ثغرة؟
🔴CSRF Bypass Combined with IDOR To Complete Account Takeover!
مساكم الله بالخير جميعا
نستكمل سلسلة ال Chain
واليوم عدنا لكم ب chian جميل
🔴CSRF Bypass + IDOR To Account Take Over
اولا نظرة سريعة عالموقع
راح اشرح طبيعة الموقع بشكل عام
نقدر نعتبر الموقع يقدم خدمات مثل التسوق, وطبيعة الموقع فيه خدمات حساسة
بديت افحص الموقع وبالبداية ركزت على اي شيء فيه authentication مثل تغيير الأيميل والخ
بدييت بال update email function
واول شيء عيني طاحت عليه ال user_id parameter بال Request body to update email
كأي بق هنتر, حاولت اغيره البراميتر لرقم حساب ثاني ولكن للأسف كان يرجع Response 401 unauthorized مب بذي السهولة (:
حاولت اني اتخطى التحقق بطرق منها
🔹بأني اغير ال Request method get, put, delete, patch,etc
🔹جربت Parameter Pollution مثل
?user_id=<attacker_id>&user_id=<victm_id>
🔹جربت باني اضيف special characters مثل
0a% %20 %1c %09 %00
بعد محاولات ولا وحده ضبطت للأسف
من هنا نسيت فكرت ال IDOR وكملت فحص
---------------------------------
بعد محاولات بال update email function لاحظت شيء والي هو ان ال csrf_token قيمته تتغير مع كل Request
ف هنا بديت ادور بال client side js files اذا فيه خورزاميه معينه يتكون فيه التوكن
ونفس الكلام للأسف ماحصلت شيء
---------------------------------
لكن ماوقفت هنا كملت افحص ال CSRF token باني اسوي له bypass
جربت اني احذف براميتير التوكن كامل
sحاولت اخلي قيمة ال paramreer فاضية csrf=0
or via array csrf[]=0
Sجربت Content-Type change
جربت POST to GET Request Method
ولكن نفس الشيء ولا وحده ضبطت للأسف
وقفت؟ لا
---------------------------------
بعديين جت فكره براسي باني اسوي Generate ل CSRF token جديد ولكن مااستعمله
بمعنى راح اسوي update email واخذ قيمة التوكن واسوي drop request
فال CSRF Token راح يبقى جديد
ف اخذت التوكن و��ويت CSRF script وخليت التوكن فيه
ورحت جربته بحسابي الثاني
واول شيء لاحظته ان ال error الي كان يرجع لي قبل تغير!
بدال مايرجع لي Invalid token لل CSRF token
رجع لي Response 401 unauthorized وهنا شد انتباهي ان ال Error مماثل الى ERROR ال IDOR
والحيين عرفت انه bypass ال CSRF ضبط
---------------------------------
بس ماخلصنا, المشكلة بال user_id parameter لازم يكون مطابق الى user_id الضحية\المستخدم
فالحين كل الي احتاجه بأني اجيب ال user_id للمستخدم
وال user_id عباره عن ارقام بس ف سهل التخمين
طبعا الحين عندي اكثر من طريقة بأني اجيب ال user_id
وبنفس الموقع انا محصل ثغرات منها
Stored XSS
ف يمدي من خلال ال stored xss اسوي script بسيط يسوي fetch لل user_id
ولكن هذي مشكلتة تتطلب تفاعل خفيف من المستخدم بالتالي راح تقلل الخطورة من الثغره وبالتالي مكأفاة اقل
فالحل اني سويت script بنفس ال CSRF script
يجرب اكثر من user_id بنفس الوقت
ومثل ماقلت ال userid سهل التخمين
فالحين نسوي Recap عالخفيف للي راح اسويه
1-راح اسوي update email واخذ قيمة ال csrf token واتأكد ان اسوي drop request بحيث يكون ال Token يبقى valid
2- راح اخذ قيمة ال CSRF Token واسوي له CSRF Script
3- بنفس السكربت سويت سكربت يخمن ال user_id
جربت السكربت بحسابي الثاني وفعلا قدرت اغير الأيميل الى ايميل لي!
ف قدرت اتخطى ال CSRF و التحقق من الuser_id بنفس الوقت!!
فالحين بمجرد اني اروح اسوي Reset passowrd واحط ايميلي الي غيرته للمستخدم راح اخذ Full Account Take over !
وبالنهاية تذكر وجودة حماية =! لايوجد تخطي (:
واتمنى شرحي كان واضح
واذا استفدت لاتنسى انك تسوي Like & Retweet
وتشارك رأيك بالكومنتات
Learn about how a weak token expiry and chain of rate limit bypass can lead to your account being taken over.
https://t.co/LAS2PKTMNa
#cybersecurity#BugBounty#bugbountytips
كيف قدرت احصل ثغرة
🔴Chain of Rate Limit Bypass and Weak Token Expiry Leads To Account Take Over
مسااكم الله بالخير جميعا
عدنا لكم ب Chain خفيف لطيف
بحاول اشرح الزبدة بأختصار
وبسم الله نبدا
- فالبداية خل نفهم عملية طلب استعادة كلمة المرور بالموقع
- عملية عادية المستخدم يحط ايميلة وراح يوصل رابط على ايميلة نفس كذا
/TARGET.COM/redirect?action=reset_password&lang=EN&code=CODEHERE
- ف اول شي ممكن نلاحظه ان الموقع يعتمد على قيمة براميتر واحد بشكل كامل “CODE”
- وقيمة البرايمتير هذا قابلة للتخمين ولكن تحتاج وقت
فالحين نجي للخطوة الي بعدة والي هي هل التوكن ينتهي او يصير له Expire ؟
- شيء لازم نعرفة ان قيمة البرايمتير هذا قابلة للتخمين ولكن تحتاج وقت
- خليت الأيميل مافتحته ورجعت له بعد يوم وفعلا ماكان التوكن ينتهي وقدرت اسوي استعادة لكلمة المرور
- لكن الحين يتبقى النقطة الحاسمة نشوف اذا كان فية Rate Limit او لا بحيث نسوي brute force للتوكن ونسوي Reset password على طول
ولكن وللأسف كان فية Rate Limit
- الى هنا كان يمدي ابلغ الثغره ك Token Not Expired بس الخطورة راح تكون منخفضة
- بس ماوقفت هنا حاولت اني القى تكنيك اتخطى فيه ال Rate Limit
- وبعد محاولات عديدة لاحظت ان الموقع يسوي بلوك على ال IP فقط
- وقدرت اتخطاه بأني استعمل extension بالبيرب اسمه “IP ROTATE” مثل الي موضحة بالصورة
- وفكرته بأختصار انه تشبك على سيرفرات AWS ومع كل ريكوست يتغير ال IP
- ومثل ماعرفنا ان التوكن ماينتهي وقدرت اسوي اعادة لكلمة المرور وبالتالي قدرت اوصله الى Account Take Over
بالنهاية اتمنى شرحي كان واضح
واذا استفدت لاتنسى انك تسوي Like & Retweet وتكتب رأيك
ومع دخول العشر الأواخر لاتنسونا من دعواتكم ❤️