نگاره‌هایی پیرامون امنیت، شبکه و رمزنگاری

12 مه 2023

به نام خدا

سلام خدمت دوستان عزیز. امیدوارم حالتون عالی باشه. در این پست قصد دارم بررسی بکنم که چطور به Admin panel یکی از سامانه های بزرگ که در یک برنامه پرایوت بود دسترسی پیدا کردم.

در ابتدا اشاره بکنم که scope برنامه به این صورت بود:

*.domain.tld

(در واقع تمامی ساب دامین ها در برنامه بانتی بود)

ریکان

خب بیاید در ابتدا از مرحله ریکان شروع بکنیم:

اولین کاری که برای ریکان انجام دادم subdomain discovery بود. برای این کار راه های مختلف و گسترده‌ای وجود داره. در ابتدا از ساده‌ترین راه، یعنی ابزار subfinder استفاده کردم. نتیجه این شکلی بود:

بعد از اون یک DNS Brute force انجام دادم که نتیجه به دست اومده بعد از حذف ساب دامین‌های قبلی که تکراری بود، به این شکل بود:

پس تو این مرحله دو تا ساب جدید پیدا کردیم که subfinder پیدا نکرد. این موارد را که انجام دادم، به 13 تا ساب دامین رسیدم.

خب اینجا طبق متودولوژی ریکانی که استفاده می کنم، تمامی ساب های پیدا شده را به ابزار dnsgen دادم تا ترکیباتی از ساب‌های به دست اومده را به من تحویل بده. حالا نوبت این بود که خروجی را به ابزار dnsx بدم. این کار را انجام دادم و خروجی نهایی بر حسب حذف موارد تکراری و ادغام با قبلی ها به این صورت شد:

همانطوری که دیدید دو تا ساب جدید پیدا شد که نام ترکیبی داشت. اولیش ظاهراً متعلق به پنل ادمین بود که تست هایی را برای دورزدنش انجام دادم ولی هیچ کدوم نتیجه‌ای نداد. رفتم سراغ دومی. چیزی که می تونستم از اسمش حدس بزنم این بود که با باز کردنش، با یک پنل کاربری مواجه میشم.پس مشتاقانه وارد این ساب دامین شدم و با چنین صفحه‌ای رو‌‌به‌رو شدم:

پس بهترین کاری که میتونم انجام بدم اینه که FUZZ بکنم. چند تا wordlist را از سبک تا سنگین انداختم روی تارگت و FUZZ کردم اما هیچی پیدا نشد!
بعد از اون از راه های دیگه مثل web archive هم این ساب را بررسی کردم ولی چیزی پیدا نشد.
دیگه کم کم داشتم از این ساب نا‌امید میشدم که به فکرم رسید با استفاده از خروجی ابزار Dnsgen هم یک فازی انجام بدم. پس مجددا فاز کردم:

بله!!! اینبار یک مسیر پیدا شد.
داخل این مسیر با یک صفحه لاگین مواجه شدم که ظاهرا با email و password میشد فرایند لاگین را انجام داد. اما هیچ قسمتی برای ثبت نام ندیدم. فقط دو صفحه وجود داشت که یکی برای لاگین و دیگری برای Reset password بود.
مجددا این مسیر را فاز کردم تا شاید یک مسیر برای ثبت نام پیدا بکنم:

خب اینبار خیلی راحت فاز جواب داد و یک مسیر برای ثبت نام پیدا کردم:

https://company-app.target.com/companycms/signup.php

فرآیند Signup با وارد کردن نام،ایمیل و شماره تلفن انجام میشد. اطلاعات را وارد کردم و پیغام موفقیت آمیز بودن ثبت نام نمایش داده شد. به صفحه ی لاگین برگشتم و اطلاعات را وارد کردم. مستقیما وارد صفحه‌ی وریفای ایمیل شدم و یک کد وریفای به ایمیلم ارسال شد. کد تایید را وارد کردم و ایمیلم تایید شد. بی صبرانه دوست داشتم ببینم که داخل این پنل چه فیچر هایی هست تا روی اونها کار بکنم.
اما به محض وریفای ایمیل، به صفحه‌ی وریفای شماره تلفن ریدایرکت شدم. متاسفانه هر چقدر که تلاش کردم هیچ کدی ارسال نمیشد. ظاهراً این فیچر از کار افتاده بود. ولی برای ورود به پنل هیچ راهی به جز وریفای شماره وجود نداشت!!!
شروع کردم به تست‌های مختلف برای دورزدن وریفای. از بروت فورس OTP گرفته تا response manipulation. اما از هیچ کدوم جوابی نگرفتم و نشد که نشد! خسته شدم و سیستم را خاموش کردم.
روز بعد مجدد برگشتم روی این قسمت و یک دفعه به ذهنم رسید که شاید بتونم با reset password، این محدودیت را دور بزنم. پس در صفحه‌ی مربوط به فراموشی رمز عبور، درخواست ایمیل بازیابی را فرستادم و یک ایمیل حاوی لینک تغییر رمزعبور حساب کاربری برام ارسال شد.رمز عبور را تغییر دادم و مجددا لاگین کردم.
بلهه! همانطور که انتظار داشتم وریفای اجباری شماره تلفن دور زده شد و به این صورت ما تا الان یک آسیب پذیری کشف کردیم.

اما این باگ تازه شروع کار بود.
پس ادامه دادم و رفتم با فیچر های مختلف پنل کار کردم. یکسری تست‌ها را هم زدم ولی چیزی پیدا نکردم. رسیدم به قسمت تیکت ها. اما بهتره که قبل از اون توضیح بدم که این پنل چی بود.
ببینید کمپانی های مختلف می‌تونستند با ثبت نام داخل این پنل از یکسری خدمات و امکانات برای سازمانشون بهره‌مند بشن. اما این ثبت نام مربوط به قبل تر بوده و زمانی که من روی برنامه کار می کردم با حذف صفحات لاگین و ثبت نام و ….. از UI، میخواستن جلوی این کار بگیرن که ما با فاز اینا را به دست آوردیم.
خب داخل قسمت تیکت ها، کمپانی میتونست در رابطه با سوال یا مشکلش به اپراتور، تیکت بزنه. فرآیند سامانه اینطور بود که اپراتور آنلاین به صورت خودکار به عنوان پاسخ دهنده تیکت درج میشد. برای مثال: اپراتور شماره 3

پس من برای بررسی یکسری از تست ها مثل idor و xss یک تیکت ایجاد کردم. ولی هر چقدر که بالا پایین کردم هیچ آسیب پذیری ای پیدا نکردم. مسیر تیکت به این شکل بود:

https://company-app.target.com/companycms/tickets/7536

همانطور که میدونید یکی از تست‌های مربوط به بایپس idor، اضافه کردن اکستنشن json هست. خب من به ذهنم رسید که id تیکت شخص دیگه‌ای را با اضافه کردن این اکستنشن باز بکنم تا شاید idor بخوره:

https://company-app.target.com/companycms/tickets/7531.json

ولی این تست هم جواب نداد و خطای قبلی را داد. برگشتم روی تیکت خودم و این بار این اکستنشن را به انتهای تیکت خودم اضافه کردم تا واکنش اپلیکیشن را بررسی بکنم:

https://company-app.target.com/companycms/tickets/7536.json

واقعا جالب بود!
اطلاعات زیادی از حساب کاربری من در قالب json نمایش داده شد. کمی که اومدم پایین‌تر متوجه شدم اطلاعات شخص دیگه‌ای هم وجود داره!
متوجه شدم که اطلاعات اپراتور اینجا Leak میشه. اما این اطلاعات شامل چه چیز‌هایی بود؟

همانطوری که می‌بینید اطلاعات leak شده شامل id، ایمیل،…. و مهمتر از همه هش password اپراتور هست.

خب ممکنه الان براتون سوال پیش بیاد که چرا باید اطلاعات به صورت json برگرده و باعث leak شدن اطلاعات بیشتری بشه؟

علت این مورد کانفیگ اشتباه برنامه نویس بود. در این سامانه از فریمورک Cakephp استفاده میشد. در این فریمورک این قابلیت وجود دارد که سیستم به صورت اتوماتیک برای همه action ها نسخه json هم تولید بکنه که این مورد به عنوان فیچر برای دولوپر هست. اما اگر به اشتباه کانفیگ و فعال بشه می‌تونه همین مشکل را به وجود بیاره و صرفا با اضافه کردن اکستنشن json، دیتاهایی را در قالب json به ما نمایش بده.

خب اینجا کاری که احتمالا همه انجام میدن، تلاش برای پیدا کردن پسورد هش شده هست. این هش از نوع md5 بود. پس این هش را در دیتابیس های مختلف md5ها سرچ کردم. متاسفانه هیچ نتیجه‌ای پیدا نکردم.
یک چیز جدید یادم اومد. وقتی من یک تیکت ایجاد کردم، اپراتور 3 به عنوان پاسخ دهنده برای من انتخاب شد. خب من هش پسورد این اپراتور را چک کردم و بی فایده بود. حالا چی میشه که هش پسورد یک اپراتور دیگه را بررسی بکنیم؟ خب اومدم دو تا تیکت دیگه زدم تا شاید این دفعه اپراتور دیگه‌ای برام انتخاب بشه ولی هر بار اپراتور شماره 3 به عنوان پاسخ دهنده درج میشد!

به نظرم اومد بهترین کار اینه که چند ساعت دیگه تست بکنم تا شاید این اپراتور تغییر بکنه. حدود 6 ساعت بعد مجدد برگشتم و تیکت زدم. همینطوری که میخواستم شد. اوپراتور دیگه‌ای به عنوان پاسخ دهنده انتخاب شد. حالا وقت لود کردن اطلاعات به صورت json و چک کردن هش پسورد بود. پس هش را داخل اولین دیتابیس سرچ کردم:

همانطوری که دیدید خیلی راحت پسورد اپراتور به دست اومد. خب حالا وقت ورود به پنل ادمین بود. تا اینجا email و password را داشتیم. پس وارد صفحه لاگین ادمین شدم و اطلاعات ورود را زدم. وقتی که شدیدا مشتاق این بودم که پنل ادمین را ببینم، در کمال ناباوری به خطای زیر برخوردم:

ظاهراً فقط با ip های لوکال قابل دسترسی هست. خب حالا برای بایپسش چه کاری بکنیم؟ خب فاز کردن Header بهترین راه هست. برای بایپس ip از هدر‌های زیر استفاده کردم:

X-Originating-IP: 127.0.0.1
X-Forwarded-For: 127.0.0.1
X-Forwarded: 127.0.0.1
Forwarded-For: 127.0.0.1
X-Remote-IP: 127.0.0.1
X-Remote-Addr: 127.0.0.1
X-ProxyUser-Ip: 127.0.0.1
X-Original-URL: 127.0.0.1
Client-IP: 127.0.0.1
True-Client-IP: 127.0.0.1
Cluster-Client-IP: 127.0.0.1
X-ProxyUser-Ip: 127.0.0.1

بله موفقیت آمیز بود!

کانتنت صفحه‌ی ادمین برام لود شد و به کلی فیچر دسترسی داشتم. ولی نقش من به عنوان اپراتور بود و اینجا پرمیژن دسترسی هم در همین بود. حالا فقط دنبال آپلودر می گشتم تا بتونم RCE بگیرم. داخل همون صفحه‌ی پاسخ به تیکت ها که من از طرف کاربر عادی، بخش upload را چک کرده بودم و آسیب پذیر نبود، از طرف اپراتور هم بخش آپلود فایل را چک کردم و Boommm!

خیلی راحت و بدون هیچ گونه بایپسی فایل php من آپلود شد و به راحتی اجرا شد و  عملا منو به RCE رسوند و در آخر هم بعد از کشف این RCE گزارش‌ها را نوشتم و برای برنامه ارسال کردم و این RCE به عنوان Critical تریاژ شد و بالاترین حد بانتی برنامه بهش تعلق گرفت.

خیلی ممنونم بابت اینکه من را تا پایان همراهی کردید. امیدوارم این نوشته مفید واقع شده باشد.
همچنین اگر دوست داشتید، خوشحال میشم من را در سوشال‌های مختلف دنبال بکنید.

instagram

twitter

2 پست نوشته شده
علی فیروزی هستم. علاقه‌ی شدیدی به دنیای امنیت و صفر و یک‌ها دارم.
دسته‌ها: باگ‌بانتی
  • به اشتراک بگذارید:
  1. میثم گفت:

    عالی بود خسته نباشید

  2. سید مجتبی گفت:

    رایت آپ قشنگی بود. اینکه پیگیر بودی اینقد نتیجش رو نشون داد

  3. k3nt گفت:

    سلام؛ خیلی عالی توضیح دادی، پرفکت!!!
    آرزوی موفقیت‌های بیشتر…

  4. امیر گفت:

    دمت گرم خیلی خوب و جامع توضیح دادی!!

  5. Javad گفت:

    سلام
    آفرین عالی بود کارت ، انشاءالله که همیشه موفق باشی
    یک سوال از شما دارم ، ببخشید شما چند سال است که هک و امنیت رو شروع کردید ؟

  6. sohi گفت:

    Awli pesar

  7. thecatfather گفت:

    خیلی هوشمندانه کارتو پیش بردی. لذت بردم.

  8. thecatfather گفت:

    از روی رسپانس هدرها تشخیص دادی که فریمورک کیک پی اچ پی داره؟

    • afssec گفت:

      سلام. نه اینجا چیز مشخصی نبود که از روی اون تشخیص بدیم. معمولا تشخیصش گاها به صورت تجربی هست و با یکسری تست کردن ها ممکنه بتونیم تشخیص بدیم که اینجا با همون تست json من تشخیص دادم. موفق باشی.

  9. Ryan گفت:

    کارت عالی
    ایول 👏

  10. moein گفت:

    عالی بود

  11. مهدی گفت:

    سلام واقعا عالی توضیح دادی. ان شا ا… همیشه در مسیر رشد و پیشرفت باشی و کارهای خوب بکنی و جلو پات بیفته

  12. علی گفت:

    من برام ی سوال هست این فلو رو چطور باید گزارش بنویسم یعنی از کجاش باید شروع کنیم به نوشتن از بخشی که پسورد اپراتور پیدا شد و رفتید شروع کردید به اپلود شل با اپراتور؟

  13. میعاد گفت:

    دست خوش👏🏻👏🏻👏🏻

  14. reza گفت:

    توی رایتاپ اشاره شده به DNS Brute force این یعنی همون پیدا کردن ساب دامنه ها؟ اگه اره چرا اسمش گذاشتین dns؟
    چرا مثلا subdomain brute forece نباشه اسمش؟ فرقش چیه کلا شایدم منه تازه وارد قاطی کردم برای همین سوال شده

  15. Mr.Tar گفت:

    عالی گود