دسترسی مجاز - Linux


در دنیای آموزش برنامه نویسی تیم کوئرا به دنبال برگزاری دوره‌های مدرن آموزشی و با کیفیت بالا در قالب بوت‌کمپ است که اعضای با استعداد و دلسوز تیم همه تلاش خود را در جهت برگزاری هر چه بهتر این دوره می‌کنند.

برگزارکنندگان بوت‌کمپ نیازمند ذخیره اطلاعات شرکت کنندگان بوتکمپ در یک فایل به نام bootcamp_data هستند. اما با یک چالش مواجه شده اند آن‌ها می‌خواهند این فایل را به گونه ای تنظیم کنند که تنها اعضای گروه quera-bootcamp(دو عضو user1, user2) قابلیت خواندن، نوشتن آن را داشته باشند. دیگر افراد خارج از این گروه نباید به هیچ وجه به این فایل دسترسی داشته باشند. کاربر صاحب فایل و دایرکتوری user1 است.

یک دایرکتوری با اسم bootcamp در روت (/) بسازد بعد از ایجاد دایرکتوری فایل گفته شده را در این دایرکتوری بسازید و سپس به تیم بوت‌کمپ‌های کوئرا کمک کنید تنظیمات مورد نظر را اعمال کند.

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

توجه کنید🔗

  • شما می‌توانید هر تعداد دستوری که نیاز دارید را برای داوری ارسال کنید و محدودیتی در تعداد دستورات ندارید.
  • شما حق استفاده از هر دستوری به غیر از usermod و cd را دارید ولی توصیه می‌کنیم هیچ پایپ‌لاینی تشکیل ندهید.
  • نیازی به استفاده از sudo نیست.
  • نیازی به استفاده از آپشن --remove-all-files برای حذف یوزر نیست.

نحوه ارسال🔗

برای ارسال جواب می‌توانید دستورات خواسته شده را درون فایلی با نام solution.sh وارد کنید و آن را انتخاب و سپس ارسال کنید.

پرچم - Linux


در روزی از روزها، تیم بوت‌کمپ یک اینستنس لینوکسی دریافت کرد که مشکوک بود. اعضای تیم بعد از بررسی متوجه شدند که این فایل دستکاری شده است. اما از آنجایی که مشغول طراحی سوالات کانتست هستند از شما خواسته‌اند تا پیگیر ماجرا باشید. می‌توانید فایل را از اینجا دانلود کنید در این فایل فلگی قرار دارد و از شما می‌خواهیم که فلگ را پیدا کنید. دقت کنید که فرمت فلگ به شکل زیر است.

queraCTF{XXX}
Plain text

نکات مهم🔗

  • داوری سوالات بدون نمره منفی است.
  • توجه کنید که ارسال‌ شما در این سوال بعد از اتمام مسابقه داوری می‌شوند.

نحوه ارسال🔗

شما باید فلگ پیدا شده را در باکس قرار داده شده سابمیت کنید.

بلاکش کن! - Linux


پوریا که در تیم امنیت مشغول به کار است لیستی از آی‌پی‌های مختلف جهت تنظیم دسترسی کاربران تهیه کرده است. او اکنون از شما می‌خواهد اسکریپتی برای او بنویسید که با استفاده از آن بتواند عملیات مسدود یا آزاد سازی آی‌پی‌های مختلف را به راحتی انجام دهد.

جزئیات پروژه🔗

اسکریپت Ip_manager.sh را مطابق توضیحات زیر پیاده‌سازی کنید:

  • نحوه‌ی اجرای اسکریپت به‌صورت ./Ip_manager.sh command ip_list_filepath یا Ip_manager.sh command IP است. مثال:
./Ip_manager.sh block ./ip_lists/sample.txt
Plain text

و یا :

./Ip_manager.sh block 104.28.193.140
Plain text
  • اگر تعداد آرگومان‌های ورودی اسکریپت کمتر از ۲ تا بود، اسکریپت باید عبارت not enough arguments را چاپ کند و متوقف شود.

  • اگر مقدار command برابر با block یا unblock نبود، اسکریپت باید عبارت invalid command را چاپ کند و متوقف شود.

  • اگر فایلی که مسیر آن به‌عنوان آرگومان دوم وارد می‌شود وجود نداشت و یا آی‌پی وارد شده معتبر نبود، اسکریپت باید عبارت File does not exist or invalid IP را چاپ کند و متوقف شود.

  • اگر مقدار command برابر با block باشد و آدرس یک فایل وارد شود، اسکریپت باید لیست بازه‌های آی‌پی موجود در فایل را دریافت کند و درخواست‌های ورودی مربوط به این آی‌پی‌ها را به‌ازای همه‌ی پروتکل‌ها و پورت‌ها DROP کند. اگر rule مربوط به ACCEPT کردن این درخواست‌ها از قبل موجود بود، اسکریپت باید آن‌ها را حذف کند.

  • اگر مقدار command برابر با block باشد و یک آی‌پی وارد شود، اسکریپت باید درخواست‌های ورودی مربوط به این آی‌پی‌ را به‌ازای همه‌ی پروتکل‌ها و پورت‌ها DROP کند. اگر rule مربوط به ACCEPT کردن این درخواست‌ها از قبل موجود بود، اسکریپت باید آن‌ها را حذف کند.

  • اگر مقدار command برابر با unblock باشد و آدرس یک فایل وارد شود، اسکریپت باید لیست بازه‌های آی‌پی موجود در فایل را دریافت کند و درخواست‌های ورودی مربوط به این آی‌پی‌ها را به‌ازای همه‌ی پروتکل‌ها و پورت‌ها ACCEPT کند. اگر rule مربوط به DROP کردن این درخواست‌ها از قبل موجود بود، اسکریپت باید آن‌ها را حذف کند.

  • اگر مقدار command برابر با unblock باشد و و یک آی‌پی وارد شود، اسکریپت باید درخواست‌های ورودی مربوط به این آی‌پی‌ را به‌ازای همه‌ی پروتکل‌ها و پورت‌ها ACCEPT کند. اگر rule مربوط به DROP کردن این درخواست‌ها از قبل موجود بود، اسکریپت باید آن‌ها را حذف کند.

  • آی‌پی ورودی میتواند به صورت 104.28.193.140 یا یک بازه مانند 95.170.192.0/19 باشد.

    نکات🔗

  • عملیات مسدودسازی و آزادسازی درخواست‌ها باید با استفاده از iptables انجام شود.

  • داوری این سؤال کمی بیشتر از سایر سؤالات طول می‌کشد.

  • تضمین می‌شود که هیچ rule ای خارج از اسکریپت اضافه نمی‌شود.

    نحوه ارسال🔗

پس از پیاده‌سازی موارد خواسته‌شده، فایل Ip_manager.sh را آپلود کنید.

مافیای سیسیل - Linux


  • محدودیت زمان: ۱ ثانیه
  • محدودیت حافظه: ۲۵۶ مگابایت

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

در این جزیره جرم و جنایت حرف اول را می‌زند و قانون حاکم ناعدالتیست. باب و آلیس در این جزیره استخدام شده‌اند تا شرایط کنونی را سامان دهند، آنها می‌دانند که تمامی این ناامنی‌ها زیر سر خانواده لوچانو می‌باشد و قصد دارند تا به طور مخفیانه لیست سران این تشکیلات را بدست آورده و تحویل مقامات امنیتی ایتالیا بدهند.

باب و آلیس در این جزیره مأموریت سختی را بر عهده دارند و کوچک‌ترین اشتباه از سمت آنها می‌تواند به قیمت جانشان تمام شود.

به باب و آلیس در حل این پرونده کمک کنید، قبل از اینکه خورشید 8 بار غروب کند!

توضیح تصویر

باب و آلیس با آدرس 192.168.100.106 توانسته‌اند به کمک ابزار nmap سرور مافیا با آدرس 192.168.100.103 را scan کرده و port‌های باز آنها را شناسایی کنند. ترافیک scan سرور را می‌توانید از این لینک دانلود کنید. شما باید با تجزیه و تحلیل ترافیک موجود در فایل traffic.pcap شماره port‌های باز این سرور را بدست آورده و port‌های کوچک‌تر از 49410 را به صورت صعودی concat کنید تا به رشته هدف صعودی برسید. به طور مثال اگر شماره port‌های باز کوچک‌تر از 49410 سرور مورد نظر بر اساس فایل traffic.pcap اعداد 80، 400، 33، 2234 و 123 باشد، رشته هدف صعودی به صورت دنباله صعودی این اعداد است:

33801234002234
Plain text

همچنین طبق تعریف بالا می‌توان رشته هدف نزولی را نیز تعریف کرد که دنباله نزولی این اعداد است. به طور مثال رشته هدف نزولی اعداد فوق به صورت زیر می‌باشد:

22344001238033
Plain text

بعد از به دست آوردن رشته هدف صعودی و نزولی باید از این لینک dump پایگاه داده آنها را دانلود کنید. تمامی فایل‌های این پایگاه داده رمز شده است و شما باید فایلی که هم نام رشته هدف صعودی است را پیدا کرده و محتوای آن را رمزگشایی کنید تا به لیست مأموریت‌های سران این تشکیلات دست یابید!

بعد از رمزگشایی و بدست آوردن لیست مأموریت‌های سران تشکیلات، شما باید به کمک دستور awk محتویات بدست آمده را طوری مرتب کنید تا خروجی آن به صورت مجموعه دادگانی با سه ستون زیر باشد که بر اساس ستون Total Income به طور نزولی sort شده و در آخرین خط خروجی، رشته هدف نزولی بدست آمده از port‌های باز سرور چاپ شده باشد:

[Mafia Name] [Number Of Kills] [Total Income]
...
[Mafia Name] [Number Of Kills] [Total Income]
[Descending Target String]
Plain text
  • دقت کنید که هر سطر خروجی شما باید مربوط به یکی از سران تشکیلات باشد و هیچ دو سطری نباید Mafia Name مشابه داشته باشند.

به طور مثال پایگاه داده زیر یک نمونه خروجی معتبر است:

Mateo 10 21
Dante 12 18
22344001238033
Plain text
راهنمایی نمونه خروجی
  • خروجی فوق به این معناست که Mateo در مجموع تمامی مأموریت‌های خود تعداد 10 نفر را کشته و به ازای همه آن قتل‌ها 21 قطعه طلا بدست آورده است همچنین Dante نیز در مجموع تمامی مأموریت‌های خود تعداد 12 نفر را کشته و به ازای همه آن قتل‌ها 18 قطعه طلا بدست آورده است.
  • سطر‌های موجود در خروجی بر اساس ستون Mafia Name تکراری نیستند.
  • سطر‌های خروجی بر اساس ستون Total Income به صورت نزولی sort شده‌اند.
  • آخرین خط خروجی، رشته هدف نزولی بدست آمده از port‌های باز سرور چاپ شده است.

نحوه ارسال🔗

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

نکات مهم🔗

  • داوری سوالات بدون نمره منفی است.
  • توجه کنید که ارسال‌های شما در این سوال بعد از اتمام مسابقه داوری می‌شوند.

هتل کانتینِنتال - Python


  • محدودیت زمان: ۱ ثانیه
  • محدودیت حافظه: ۱۰۰ مگابایت

در شهر کانتیننتال، هتلی وجود دارد که به ریاست پیکلوویچ، همه خلافکار‌ها و آدم‌های خطرناک در آن ساکن هستند به طوری که اگر کسی بخواهد به آن وارد شود، اسم خود را به نگهبان داده و نگهبان با بررسی فراوان در لیست خود، به او اجازه ورود می‌دهد.

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

آن‌ها این کار را به این صورت در نظر می‌گیرند که از اسم رمزگذاری شده، زیررشته‌هایی به اندازه اسم واقعی می‌سازند و ارزش آن را محاسبه می‌کنند. ارزش هر زیر رشته برابر است با مجموع تکرار حروف آن. هرکدام که ارزش بالاتری داشت به احتمال بیشتری اسم واقعی است و آن‌ها به دنبال آن هستند. توجه کنید که به طرز عجیبی اسم واقعی افراد الکس حروف تکراری ندارد!

برنامه‌ای بنویسید که به خلافکارها کمک کند تا اسم نفوذی را پیدا کنند =)))))

ورودی🔗

ورودی شامل دو خط است که در خط اول اسم رمزنگاری شده به حروف کوچک انگلیسی (s) و در خط دوم طول اسم واقعی (n) می آید. 1s.length21051 \le s.length \le 2 * 10^5 1ns.length1 \le n \le s.length

خروجی🔗

خروجی برنامه شامل یک خط است که در آن تعداد زیررشته‌ها با بیشترین ارزش را برمی‌گرداند.

از آنجایی که جواب ممکن است خیلی بزرگ باشد باقی‌مانده آن را به 109+710^9 + 7 محاسبه کنید.

مثال🔗

ورودی نمونه ۱🔗

seas
2
Plain text

خروجی نمونه ۱🔗

4
Plain text

در این نمونه ارزش هر زیر رشته به صورت زیر محاسبه می‌شود:

  • f('s') = 2, f('e') = 1, f('a') = 1
  • seas => f('s') + f('e') = 3
  • seas => f('s') + f('a') = 3
  • seas=> f('e') + f('a') = 2
  • seas => f('e') + f('s') = 3
  • seas => f('a') + f('s') = 3

که در این نمونه بزرگترین ارزش برابر با ۳ است و تعداد زیررشته‌ها با این اندازه ۴ می‌باشد.

ورودی نمونه ۲🔗

leech
4
Plain text

خروجی نمونه ۲🔗

2
Plain text

در این نمونه ارزش هر زیر رشته به صورت زیر محاسبه می‌شود:

  • f('l') = 1, f('e') = 2, f('c') = 1, f('h') = 1
  • leech => f('l') + f('e') + f('c') + f('h') = 5
  • leech => f('l') + f('e') + f('c') + f('h') = 5

که در این نمونه بزرگترین ارزش برابر با ۵ است و تعداد زیررشته‌ها با این اندازه ۲ می‌باشد.

ریکاوری دیتا - Python


  • محدودیت زمان: ۱ ثانیه
  • محدودیت حافظه: ۲۵۶ مگابایت

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

extensionFromNameanswer.py
def data_recovery(data):
    pass
Python

خروجی تابع پایتونی شما باید یک لیست از فایل‌تایپ‌های پیدا شده باشد. تنها فایل‌های زیر برای ما اهمیت دارند. آن‌ها را پیدا کنید.

header1 = b'\x89PNG\r\n\x1a\n'      # PNG header
header2 = b'\xff\xd8\xff'           # JPEG header
header3 = b'\x42\x4d'               # BMP header
header4 = b'\x49\x49\x2a\x00'       # TIFF header
header5 = b'\x47\x49\x46\x38'       # GIF header
header6 = b'\x50\x4b\x03\x04'       # ZIP header
header7 = b'\x7fELF'                # ELF header
header8 = b'\x25\x50\x44\x46'       # PDF header
header9 = b'\x49\x44\x33'           # MP3 header
header10 = b'\xff\xfb'              # MPEG header
header11 = b'\x00\x00\x01\x00'      # PDDF header
header12 = b'\x00\x01\x00\x00'      # ICO header
Plain text

مثال🔗

ورودی🔗

b'\x89PNG\r\n\x1a\nBMII*\x00\xff\xd8\xff\xff\xd8\xff\x00\x00\x01\x00\x00'
Plain text

خروجی🔗

['PNG', 'JPEG', 'BMP', 'TIFF', 'PDDF', 'ICO']
Plain text