نوید شیرمحمدی
نوید شیرمحمدی
خواندن ۵ دقیقه·۲ سال پیش

هکاتون 1402: چالش DH Talk

معرفی هکاتون

فروردین امسال (1402) کوئرا یک مسابقه مسابقه فتح پرچم (یا همون CTF) برگزار کرد با نام هکاتون. ثبت‌نام مسابقه تا 23ام اسفندماه 1401 ادامه داشت و شما میتونستید پس از پرداخت هزینه نسبتا سنگین (480)، برای مسابقه و 18 ساعت آموزش (نه چندان با کیفیت) اقدام کنید. در بخش معرفی رویداد این مطالب نوشته شده بود:

رویداد هکاتون امنیت، چهارمین هکاتون برنامه‌نویسی کوئرا است که با موضوع امنیت و در چارچوب طرح شهید بابایی بنیاد ملی نخبگان برگزار می‌شود.
این رویداد شامل یک بخش آموزشی و یک بخش رقابتی است. در ابتدا، موضوعات جذاب و کاربردی حوزه امنیت در ۳ روز و با همراهی اساتید برتر این حوزه برگزار می‌شود و شما مجموعا ۱۸ ساعت آموزش می‌بینید. بعد از آموزش به تیم‌های ۲ الی ۴ نفره تقسیم می‌شوید و در یک مسابقه چالشی به رقابت می‌پردازید. بعد از مسابقه راه‌حل تیم‌ها داوری می‌شود و نفرات برتر مشمول دریافت امتیاز نخبگی بنیاد و همینطور برنده جایزه نقدی مسابقه می‌شوند. علاوه بر این نفرات برتر برای استخدام به شرکت‌های مطرح معرفی خواهند شد. برای مشاهده مراحل و زمان‌بندی رویداد روی این لینک کلیک کنید.
? به تمام شرکت‌کنندگان، گواهی شرکت در رویداد اهدا خواهد شد اما فقط نفرات برتر مسابقه و بعد از داوری راه‌حل‌ها، مشمول دریافت امتیاز نخبگی بنیاد می‌شوند.
⚠️ شرکت در رویداد به صورت فردی است اما پیش از مسابقه، شرکت‌کنندگان به تیم‌های ۲ الی ۴ نفره تقسیم می‌شوند تا به صورت تیمی به رقابت بپردازند. اگر از ابتدا تیم شما مشخص است و دوست دارید با تیم خود در این رویداد شرکت کنید لطفا به صورت جدا جدا ثبت‌نام خود را تکمیل کنید و بعد از ثبت‌نام به ما اطلاع دهید که می‌خواهید در یک تیم باشید.

برای برگزاری رویداد از پلتفرم CTFd استفاده شده بود و تیم کوئرا چند روز قبل از مسابقه، با هدف آشنایی بچه‌ها با پلتفرم یک کوییز آزمایشی (و بدون تاثیر در نتایج مسابقه) قرار داد. سوالات این کوییز از رویداد‌هایی مثل picoctf و uutctf انتخاب شده بودند و به عنوان دست گرمی کمک بزرگی محسوب میشد. در پرانتز این هم بگم که سوالات مسابقه با اختلاف....باااا اختلااااف، سخت‌تر و جذاب‌تر بودند.


و اما چالش DH Talk

امتیاز: 100

متن سوال:

Two people are taked over the network using DH.
Can you see what are they saying?

توجه: غلط گرامری از متن خود سواله :)
در این سوال یک فایل pcap از مکالمه دو نفر روی شبکه به ما داده شده که لینکش را میذارم. اگر محتوای فایل را بررسی کنیم میبینیم که دو نفر قصد دارند از الگوریتم دیفی-هلمن برای ارسال پیام استفاده کنند و در بین پیام‌هاشون یکی از دو طرف کلید خصوصی خودش را به اشتباه ارسال میکنه. قبل از گفتن راه حل درباره الگوریتم دیفی-هلمن کمی توضیح میدم.

دیفی-هلمن (مخفف DH) یک الگوریتم تبادل کلید (key exchange) محسوب میشه که به دو نفر اجازه میده به صورت امن روی یک کانال عمومی (مثل شبکه اینترنت) به یک کلید مشترک برای تبادل پیام برسند. مراحی اصلی این الگوریتم به این صورتند:

  • یه عدد اول بزرگ داریم به نام p که همه میدونند چی هستند (حتی کسی که می‌خواد رمز را بشکنه) و یک عدد کوچکتر بنام g که از p کوچیکتره . میتونه هر چیزی باشه. به g میگن مولد چون اگر p بار با خودش جمع بشه تمام اعداد بین 0 تا p-1 را در پیمانه p تولید میکنه (جبر پیمانه‌ای).
  • افرادی که میخوان پیام رد و بدل کنند، هر کدوم یک عدد دلخواه بین 0 تا p-1 انتخاب میکنند. مثلا آلیس a و باب هم b را انتخاب میکنه. این اعداد میتونند هر عددی باشند.
  • آلیس میاد و g^a (بخون g به توان a) را حساب می‌کنه و روی شبکه عمومی میفرسته برای باب. باب هم g^b را حساب میکنه و میفرسته برای آلیس. دقت کنید که g^a و g^b را همه میتونند ببیند. نکته اینجاست که محاسبه‌ی a و b از روی g^a و g^b یک مساله سخته (درس رمزنگاری ارشد کامپیوتر) بنابراین کسایی که g^a و g^b را میبینند نمی‌تونند a و b را پیدا کنند.
  • آلیس که a را داشت و g^b را از باب گرفته، خیلی ساده g^b را به توان a میرسونه و میرسه به g^(ab) که کلید مشترکه. باب هم به صورت مشابه با داشتن b و g^a به همین کلید مشترک میرسه. روی این مورد هم تاکید میکنم که با داشتن g^a و g^b نمیشه به g^(ab) رسید (یه مساله سخت دیگه در رمزنگاری).
  • این کلید مشترک (g^ab) میتونه در الگوریتم‌هایی مثل AES برای رمزگذاری پیام استفاده بشه.

این هم بگم که معمولا g^a را با A نمایش میدن و g^b را با B. همینطور به کلید مشترک (g^ab) میگن secret و با s نمایشش میدن.

راه حل

اگر فایل pcap را با استفاده از wireshark بررسی کنیم میشه پیام‌های رد و بدل شده روی شبکه را دید. با این حال برای این کار ترجیح مید اول از CyberChef استفاده کنم. اگر فایل pcap را به CyberChef بدیم و فیلتر string را اعمال کنیم، تمام اطلاعات مورد نیاز به صورت زیر بهمون نمایش داده میشه:

متن خروجی:

Are you ready for a key exchange
Yep.
P: 22953686867719691230002707821868552601124472329079
G: 11
My chosen number: 65321321
Oh, no! You shoudn't send your chosen number.
No problem.
My public key: 22765143677454692215350940273371681210671460017738
Got the shared key
Yes.
Send your message.
YVTJGc2RHVmtYMThyZU5jSGlNbTVEQmRhdlFjcFdUYk1EUmF2TVNabUJRVEFIUzJQRWp6dndTTHJ2MXVXUFJNSQpES2xzRHFyUGZOelVZZUxLd3l0d3lBPT0K
How can I read it
BbSi
cat in.txt
base64 -d
openssl aes-256-cbc -d -a -pbkdf2 -k our_shared_key
Bb61
Thanks!

با توجه به پیام‌های بالا و بررسی فرستنده پیام‌ها در wireshark میشه گفت:

p = 22953686867719691230002707821868552601124472329079
g = 11
a = 65321321
B = g^b = 22765143677454692215350940273371681210671460017738

اگر در wireshark فایل pcap را برسی کنیم متوجه دو مورد خیلی مهم میشیم:

  • متن رمز شده YVTJGc2RHVm... نیست بلکه VTJGc2RHVm... است.
  • برای رمز‌گشایی باید از دستور زیر استفاده کرد:
cat in.txt | base64 -d | openssl aes-256-cbc -d -a -pbkdf2 -k <کلید مشترک>

در نهایت با داده‌های بالا و استفاده از سایت dCode میشه کلید مشترک‌ را حساب کرد (بله، با پایتون هم میشه ولی انصافا این سایت خیلی خفنه):

کلید مشترک 16477643432539305193820212134537114955092883848262 است. کافیه پیام رمز شده را در فایل in.txt ذخیره کنیم و با دستور زیر متن اصلی را بازیابی کنیم:

cat in.txt | base64 -d | openssl aes-256-cbc -d -a -pbkdf2 -k 16477643432539305193820212134537114955092883848262

جواب: queraCTF{D1FfIe_HeLlMaN_WA$_N0T_T0O_HarD}

هکاتونctfquerawriteuphackaton
شاید از این پست‌ها خوشتان بیاید