مهم‌ترین اسرار حفظ شده ProjectDiscovery

مهم‌ترین اسرار حفظ شده ProjectDiscovery

گشتی در ابزارهای عمومی و کمتر شناخته شده ProjectDiscovery و نحوۀ استفاده از آن ها

مقدمه:

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

اگر در صنعت امنیت تهاجمی یا باگ بانتی فعال باشید، احتمالاً نام برخی از ابزار برجسته و مشهور آن ها همچون nuclei،  httpx، dnsx، naabu و subfinder را شنیده اید. این ها ابزار خارق العاده ای هستند که من هر روز از آن ها استفاده می کنم؛ با این حال، از زمان انتشار اولین نسخه از subfinder در سال 2018، این تیم به شدت در حال کار و تلاش بوده و مجموعه ای از ابزارهای مفید دیگر را نیز ارائه کرده اند که متاسفانه بسیاری از افراد از آن ها اطلاعی ندارند.

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

امروز می خواهیم گشتی بین ابزار زیر داشته باشیم:

ابزار MapCIDR:

برای شروع، کمی دربارۀ MapCIDR صحبت خواهیم کرد. اگر قبلاً دربارۀ prips شنیده باشید، این ابزار برایتان معنی دار خواهد بود. Prips به شما این اجازه را می دهد تا رِنجی از شبکه را به آدرس IP های جداگانه گسترش دهید. برای مثال، اگر شبکه ای با مسک /24 داشته باشید (برای مثال 24/192.168.0.1)، با اجرای دستور prips 192.168.0.1/24، لیستی از آدرس های IP مجزا را برای هر IP موجود در محدوده ارائه می دهد.

ابزار Mapcider وظیفۀ سنگین سابنتیگ (زیرشبکه سازی) را برایتان بر عهده می گیرد. اگر در حال انجام ریکان در محدودۀ وسیعی از شبکه هستید و قصد تقسیم بار بین دستگاه های متعددی را دارید (برای مثال با ابزاری همچون axiom)، ابزار معرفی شده در این بخش بسیار به دردتان خواهد خورد.

روش نصب:

برای همۀ ابزار معرفی شده در این مقاله، نیاز به تنظیم و پیکربندی Golang خواهید داشت. اگر بخواهید آن را به راحتی راه اندازی کنید، Axiom این پیکربندی را برایتان انجام خواهد داد.

اگر Golang ندارید، با استفاده از دستورات زیر می توانید آن را نصب کنید:

GO_URL="https://golang.org/dl/go1.17.linux-amd64.tar.gz"
wget -O /tmp/go.tar.gz "$GO_URL"; sudo tar -C /usr/local -xzf /tmp/go.tar.gz

پس از آماده شدن Go، خط زیر را اجرا نمایید:

go install -v github.com/projectdiscovery/mapcidr/cmd/mapcidr@latest

MapCIDR در عمل:

بیایید فرض را بر این بگذاریم که شما در حال باگ بانتی برای شرکت Apple هستید.

با مراجعه به آدرس  ipinfo.io/countries/us و اسکرول به بخش شرکت Apple، می توانید یک رِنج نمونه برای سر و کله زدن با آن بیابید. ما شبکۀ نه چندان مشهور 17.0.0.0/8 را انتخاب می کنیم که نزدیک به 16 میلیون آدرس را در خود جای داده است.

اسکن کردن این محدوده در nmap زمان نسبتاً زیادی طول خواهد کشید… از این رو، تقسیم این رِنج می تواند موثر واقع شده و شاید بهتر باشد با 254 آدرس به طور همزمان کار کنید.

اگر دستور mapcider -h را اجرا کنیم، می توانیم یک دید کلی از گزینه های موجود داشته باشیم. همانطور که می بینید برای یک سابنتینگ ساده، این ابزار امکانات متعددی را برایمان فراهم می نماید.

اسرار حفظ شده ProjectDiscovery

شما هرگونه بخواهید می توانید با این ابزار کار کنید، از پایپ کردن یک لیست از stdout به ابزار گرفته تا مشخص کردن محتوای این لیست به صورت inline. علاوه بر این، این ابزار سوئیچ های کوچکی همچون -skip-base و -skip-broadcast دارد که آدرس های منتهی به .0 و .255 را حذف می کند، چرا که این آدرس ها معمولاً قابل استفاده نیستند.

تقسیم بندی بر اساس تعداد هاست ها:

در مثال زیر، ما کل رِنج شبکه با مسک /8 را به زیر شبکه هایی با 256 هاست تقسیم می کنیم:

echo 17.0.0.0/8 | mapcidr -sbh 256

یا می توانید این مورد را به صورت inline مشخص نمایید:

mapcidr -cidr 17.0.0.0/8 -sbh 256 -o 24.txt

تقسیم بندی یکسان بین هاست ها:

ما می توانیم عملیات مشابهی را نیز انجام دهیم، برای مثال حالتی را متصور شوید که در آن می خواهیم محدودۀ شبکۀ خود را به 12 روش تقسیم بندی کنیم، مثلاً 12 نمونۀ axiom داریم و قصد داریم این 12 بخش را تا جای ممکن به صورت مساوی تقسیم بندی نماییم؛ برای این کار می توانیم به این صورت عمل کنیم:

mapcidr -cidr 17.0.0.0/8 -sbc 12 -o split.txt

اسرار حفظ شده ProjectDiscovery

تجمیع IP ها به سابنت ها:

و در نهایت، می توانیم رِنج ها را به IPها و برعکس تقسیم کنیم.

در صورتی که هیچ آرگیومنتی برای mapcidr مشخص نکنیم، ورودی ما به صورت خودکار به آدرس های IP مجزا تقسیم می شود، درست شبیه همان کاری که دوست قدیمی ما Prips برایمان انجام می داد.

echo 17.0.0.0/24 | mapcidr -o ips.txt

همچنین حالتی را تصور کنید که لیست IPها به ما داده شده و قصد داریم این آدرس ها را به CIDR مربوطه برگردانیم:

cat ips.txt | mapcidr -a

  و همانطور که در تصویر فوق می بینید، موفق به تجمیع آدرس ها به محدودۀ مربوطه شدیم. در صورتی که آدرس IPهایتان قطعی نیستند، می توانید از فلگ -aggregate-approx به منظور تخمین و حدس محدودۀ مربوطه استفاده نمایید. به عنوان مثال:

cat ips.txt | mapcidr -aa

آخرین قابلیت و گزینه ای که اخیراً به این ابزار اضافه شده، گزینۀ فیلتر است. با استفاده از گزینه های -f4 و -f6، می توانید اطمینان حاصل کنید که IPv4 و IPv6 به ترتیب از ورودی فیلتر شده اند.

ابزار Proxify:

در صورتی که قبلاً از پروکسی Burpsuite استفاده کرده باشید، این ابزار برایتان آشنا خواهد بود. Proxify به شما این اجازه را می دهد تا به سرعت یک پروکسی HTTP یا SOCKS راه اندازی کنید و به این طریق بتوانید به راحتی درخواست ها را تغییر دهید.

امکان لاگ گیری بخش مهمی از جریان کاری این ابزار بوده و اطمینان از حفظ داده های آزمایشی با استفاده از این ابزار می تواند بسیار ارزشمند باشد، چرا که بعدها در صورت نیاز می توانید لاگ های آزمایشی خود را بازرسی کرده یا در اختیار مشتری قرار دهید. این ابزار قابلیت های اکسپورت بی شماری را همچون elasticsearch و kafka export پوشش می دهد. از دیگر قابلیت های چشمگیر این ابزار می توان به پشتیبانی از TLS MITM، پخش مجدد ترافیک در Burp، یک DNS سرور تعبیه شدۀ بومی و پشتیبانی از مطابقت و جایگزینی (match & replace) اشاره داشت.

طریقه نصب:

نصب این ابزار با استفاده از دستور نصب یک خطی استاندارد go بسیار ساده است:

go install -v github.com/projectdiscovery/proxify/cmd/proxify@latest

سناریوی لاگ گیری پایه:

همانند اکثر ابزارهای ProjectDiscovery، اجرای سناریوی پایه به راحتی اجرای ابزار است.

این دستور، اجرای proxify را بر روی پورت های پیشفرض (http:8888 و socks5:10080) آغاز می نماید. این پورت ها بسیار خوب و مناسب هستند چرا که با پورت های پیشفرض مورد استفاده توسط ابزارهایی نظیر burpsuite تداخلی نخواهند داشت:

proxify -o logs

در ادامه مرورگر یا سایر ابزار خود را به منظور استفاده از این آدرس ها به عنوان پروکسی تنظیم نمایید. می توانید این کار را به راحتی با  استفاده از curl و فلگ -x انجام دهید.

حال اگر نگاهی به دایرکتوری لاگ ها داشته باشیم، خواهیم دید که تمامی درخواست هایمان لاگ شده اند! به همین راحتی!

نگاشت DNS سفارشی:

ممکن است برخی اوقات نیاز داشته باشید که دامینی را به یک آدرس IP سفارشی نگاشت کنید. در گذشته، برای انجام این کار یا باید Burpsuite استفاده می کردید، فایل hostهای خود را ویرایش می کردید یا این که یک سرور DNS سفارشی راه اندازی می نمودید. با استفاده از Proxify و دستور زیر به راحتی می توانید این کار را انجام دهید:

proxify -dns-mapping "hello.local:127.0.0.1”

پس از انجام این کار، هر درخواستی که از پروکسی عبور کند، به طور اتوماتیک hello.local را به آدرس IPای که ما مشخص کرده ایم، ریزالو خواهد کرد. و این مسئله عالی است، مگر نه؟

نکته: اگر ابزار شما از این ویژگی پشتیبانی می کند، کادر مشخص کنندۀ «عبور درخواست های DNS از HTTP proxy» را علامت بزنید. برخی ابزار فقط از DNS محلی استفاده کرده و ممکن است برای ریزالو کردن قطعی به یک فلگ نیاز داشته باشند.

مطابقت و جایگزینی (match & replace) با استفاده از DSL:

می توان گفت قدرتمندترین ویژگی این ابزار، قابلیت مطابقت و جایگزینی (match & replace) آن است.

من در گذشته در مواجه با اپلیکیشن هایی که به صورت پراکنده عملیات ریدایرکت را انجام می دادند، به خوبی از این قابلیت در ابزارهای دیگر استفاده کرده ام. من متوجه شدم که اگر رولی (قانونی) ایجاد کنم که همۀ هدرهای مربوط به لوکیشن (مکان) را مسدود کند، موفق به مشاهدۀ اطلاعات حساسی در اپلیکیشن خواهم شد.

این امر با استفاده از Proxify به سادگی قابل انجام است:

proxify -resp-mrd "replace(response, 'Location', '')”

و وقتی به عنوان نمونه روی سایت google.com، از دستور curl استفاده کنیم، هدر Location حذف خواهد شد.

ابزار Simplehttpserver:

احتمالاً ابزار Simplehttpserver برایتان بسیار آشنا به نظر برسد؛ علت این امر آن است که این ابزار الهام گرفته از سرور HTTP داخلی و نه چندان مشهوری است که در کنار پایتون ارائه می گردد.

با توجه به این که این ابزار به صورت باینری انتشار یافته، می تواند برای تیم های قرمز (ردتیم ها) و تست نفوذگران بسیار مفید واقع گردد. موقعیت های بسیاری وجود دارد که ممکن است در آن نیاز به واکشی داده یا ایجاد یک سرور HTTP موقت برای جایدهی به ابزار خود داشته باشید.

طریقۀ نصب:

برای نصب ابزار مذکور از این دستور تک خطی go استفاده نمایید:

go install -v github.com/projectdiscovery/simplehttpserver/cmd/simplehttpserver@latest

روش استفادۀ ساده و اولیه:

استفاده از simplehttpserver بسیار ساده است! تنها کافی است به سادگی آن را در هر دایرکتوری که می خواهید فایل هایش را به اشتراک بگذارید اجرا کنید. با انجام این کار، ابزار مذکور یک سرور http ساده ایجاد می نماید که دایرکتوری لیستینگ در آن فعال بوده و محتوای دایرکتوری در آن لیست شده است.

simplehttpserver -path /home/op/b/simplehttpserver

در مثال زیر، من فایل متنی ساده ای تحت عنوان helloworld.txt دارم که با اجرای دستور curl به همراه آن، محتوای فایل برایم قابل مشاهده خواهد بود. این روش برای هر نوع فایلی کار کرده و محتوای فایل مربوطه را در اختیار ما قرار خواهد داد.

آپلودها:

این که امکان دانلود فایل را داشته باشیم بسیار عالی است، اما در مورد آپلود فایل چطور؟ این روزها بیشتر سیستم های مدرن،  curl را از قبل به صورت نصب شده یا با کمی تغییرات بر روی خود موجود دارند. همین مسئله، استخراج داده را بسیار آسان تر می کند.

#اجرای ابزار simplehttpserver را به همراه فلگ آپلود شروع کنید:

simplehttpserver -upload

#فایل موردنظر خود را آپلود کنید:

curl —upload-file file.zip http://127.0.0.1:8000

احراز هویت پایه و اولیه:

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

می توانید با استفاده از دستور زیر، سرور خود را با مکانیزم احراز هویت پایه‏ای HTTP امن کنید:

simplehttpserver -basic-auth "username:password”

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

سرور TCP ساده:

توانایی واقعی ابزار معرفی شده در اینجا خود را نشان می دهد. ابزار Simplehttpserver با استفاده از این قابلیت، فراتر از یک سرور HTTP معمولی عمل کرده و به یک سرور TCP کامل با امکان پشتیبانی از پاسخ های سفارشی تبدیل می گردد.

با استفاده از این قابلیت، توانایی انجام هر کاری، از اجرای یک وب سرور ساده گرفته تا اجرای یک سرور SMTP یا حتی سرور تلنت، برایتان فراهم خواهد بود.

نکته: حواستان باشد که حتماً فلگ -tcp را وارد کنید! در صورتی که از فلگ rules بدون فلگ -tcp استفاده نمایید، فلگ rules استفاده نخواهد شد. متاسفانه من مرتکب این اشتباه شده و نزدیک به یک ساعت زمینگیر شدم ☹

سرور HTTP:

سرور Telnet:

شاید دلتان بخواهد کاری کمی فانتزی تر انجام دهید، مثلابخواهید ً برای یک CTF فلگی را مخفی کنید! یا این که سروری سفارشی برای دستگاه IOTای که قصد نفوذ کردن به آن را دارید، ایجاد نمایید.

علاوه بر این، ابزار Simplehttpserver می تواند با استفاده از فلگ tcp، داده های باینری لازم برای پروتکل هایی همچون ldap را ارائه نماید. برای این کار، مستندات موجود در این لینک به دردتان خواهد خورد.

ابزار Uncover:

Uncover ابزاری مفید برای جستجوی سرویس های ریکان پسیو همچون Shodan، Censys و Fofa محسوب می شود. این ابزار چندین فلگ مفید از جمله قابلیت جستجو از طریق شرکت را دارد و همچون سایر ابزار Projectdiscover به منظور ایجاد یک جریان کاری ریکان سریع، می تواند با سایر ابزار به صورت زنجیره وار کار کند.

طریقۀ نصب:

go install -v github.com/projectdiscovery/uncover/cmd/uncover@latest

نخستین کاری که می بایست انجام دهید، به دست آوردن کلید Shodan APIتان است. این کلید را داخل ~/.config/uncover/provider-config.yaml قرار داده و وارد میادین و مسابقات هانت شوید!

با استفاده از فلگ -e سرویس دهندۀ خود را مشخص نمایید. در این مقاله، من فقط از Shodan استفاده خواهم کرد، هرچند که به طریق زیر می توانید سرویس دهنده های موردنظر خود را مشخص نمایید:

uncover -q 'query' -e shodan,fofa,censys

پیدا کردن چیزها بر روی اینترنت:

روش استفادۀ سنتی و سرگرم کننده از Shodan، استفاده از این ابزار برای پیدا کردن چیزهای موردعلاقه بر روی اینترنت است. ابزار Uncover لیستی از آدرس های IP و پورت ها ایجاد کرده، و در مرحلۀ بعدی از طریق دادن این لیست به httpx، لیستی از URLهای موجود بر روی این آدرس ها را به عنوان خروجی به شما ارائه می دهد. به منظور سرگرمی بیشتر می توانید نتیجه را به ابزار Nuclei نیز منتقل نمایید.

uncover -q 'Jira'
uncover -q 'Jira' | httpx -silent

امکان فیلتر کردن از طریق شرکت / با استفاده از SSL:

از آنجایی که بیشتر شرکت ها از گواهینامه های SSL یکسان استفاده می کنند که ویژگی های متمایزکننده ای نظیر اسامی متداول (Common Names) دارند، برخی اوقات از این طریق می توانید دارایی هایی را پیدا کنید که یا فراموش شده اند یا رکورد DNS فعالی ندارند.

uncover -q 'ssl:"Uber Technologies, Inc."' | httpx -silent

امکان اسکن پسیو پورت با استفاده از Shodan InternetDB:

با معرفی Shodan InternetDB، امکان اسکن پسیو پورت هم اکنون میسر است. به این منظور:

echo "51.83.59.99/24" | uncover

اگر می خواهید خلاق تر عمل کنید، می توانید با ترکیب زنجیره وار DNSX با Subfinder کارهای جالبی انجام دهید. با استفاده از این روش، ابتدا دامین ها پیمایش شده، ساب دامین ها ریزالو گشته و به صورت پسیو اسکن پورت بر روی آن ها انجام خواهد گرفت؛ در ادامه می توان خروجی را در اختیار httpx قرار داد:

subfinder -d company.com | dnsx -resp-only | uncover

ابزار Notify:

ابزار Notify به سرویس دهندۀ انتخابی شما، خواه Slack باشد خواه Telegram یا Discord، متصل می شود. Notify این اطمینان را ایجاد می نماید که هیچ هشداری را از دست ندهید و همچنین امکان اتصال به اسکریپت های bashتان را آسان تر می نماید.

روش نصب:                                                                           

go install -v github.com/projectdiscovery/notify/cmd/notify@latest

پیکربندی:

به منظور پیکربندی ابزار Notify، فایل پیکربندی YAML موجود در مسیر $HOME/.config/notify/config.yaml را ویرایش نمایید. در ادامه، نمونه ای از فایل پیکربندی را با هم مشاهده می کنیم.

نحوۀ استفاده:

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

من به شخصه عاشق گرفتن حلقه های مداوم و انتقال آن به Notify با استفاده از ابزار anew متعلق به tomnomnom هستم. این مورد با استفاده از سرویس دهندۀ پیشفرضی که تنظیم کرده اید، در رابطه با رکوردهای DNSای که اخیرا پدیدار شده اند، به شما هشدار خواهد داد.

subfinder -d example.com | dnsx -json | anew dns.json | notify

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

subfinder -d example.com | dnsx -json | anew dns.json | notify

روشی که من به شخصه از آن استفاده می کنم، ارسال پیام های اورژانسی به تلگرام است که بر روی گوشی من نصب شده است. در چنین مواردی مستقیماً پیام به من انتقال یافته و قادر به دریافت نوتیفیکیشن ها هستم. در مورد Slack، نوتیفیکیشن ها را غیرفعال کرده ام، اما در صورتی که وارد برنامه شوم، قادر به مشاهدۀ فعالیت های در حال رخ دادن خواهم بود. با استفاده از این روش، می توانید سطوح مختلف فوریت را داخل اسکریپت های خود تعریف نمایید.

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

به عنوان یک مثال خوب می توان به استفاده از لیست ساب دامین ها اشاره داشت که اگر از چنین لیستی استفاده نکنید، به ازای هر خط جدید، یک نوتیفیکیشن دریافت خواهید نمود. این مسئله هنگامی آزاردهنده تر خواهد بود که notification ها را فعال کرده باشید:

subfinder -d hackerone.com | notify -bulk -provider discord,slack

با استفاده از فلگ -provider، می توانید در فایل کانفیگ چندین سرویس دهندۀ مختلف را با استفاده از ID اختصاصیشان مشخص نمایید. سرویس دهنده های موردپشتیبانی به شرح زیر هستند:

  • Slack, Discord, Telegram, Pushover, Email

ابزار Cloudlist:

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

روش نصب:

go install -v github.com/projectdiscovery/cloudlist/cmd/cloudlist@latest

پس از نصب، می توانید از طریق ویرایش فایل واقع در مسیر ~/.config/cloudlist/provider-config.yaml سرویس دهنده های انتخابی خود را در ابزار Cloudlist تنظیم نمایید. ساده ترین مثال برای این امر از طریق ارائۀ کلیدهای DigitalOcean خواهد بود.

روش استفاده:

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

داخل فایل پیکربندی، می توانید سرویس دهنده ها را از طریق IDشان مشخص نمایید؛ در ادامه با استفاده از فلگ -providers می توانید سرویس دهنده هایی را که می خواهید دارایی های مرتبط با آن ها را مشاهده کنید، مشخص نمایید.

به عنوان مثال:

cloudlist -providers do,aws,gcp

این قابلیت می تواند برای تیم های آبی (بلو تیم) بسیار مفید باشد. در ادامه می توانید این ابزار را به ترکیبی زنجیره ای و آرایه ای از سایر ابزار تبدیل نموده و از آن برای جستجوی آسیب پذیری استفاده نمایید.

cloudlist | httpx | nuclei

ابزار Cloudlist از سرویس دهنده های مختلفی پشتیبانی می کند که از جملۀ آن ها می توان به موارد زیر اشاره داشت:

  • AWS (Amazon web services)
  • EC2
  • Route53
  • GCP (Google Cloud Platform)
  • Cloud
  • DO (DigitalOcean)
  • Instances
  • SCW (Scaleway)
  • Instances
  • Fastly
  • Services
  • Heroku
  • Applications
  • Linode
  • Instances
  • Azure
  • Virtual Machines
  • Namecheap
  • Domain List
  • Alibaba Cloud
  • ECS Instances
  • Cloudflare
  • DNS
  • Hashistack
  • Nomad
  • Consul
  • Terraform
  • Hetzner Cloud
  • Instances

نتیجه گیری:

 به عنوان نتیجه گیری، ProjectDiscovery علاوه بر ابزارهای محبوب و شناخته شدۀ خود، ابزار متنوع دیگری نیز دارد. با استفاده از این ابزار، به مزایای زیادی در جریان کاری هانت خود دست یافته و زندگی بسیار راحت تری خواهید داشت. تک به تک ابزارهای ذکر شده در این مقاله به صورت 100 درصدی توسط Golang نوشته شده و می توانند بر روی هر سیستم عامل پشتیبانی کننده از باینری از جمله ویندوز، مک و لینوکس استفاده شوند.

در صورتی که محتوای این مقاله برایتان مفید بود یا چیزی از آن یاد گرفتید، لطفاً آن را به اشتراک بگذارید؛ به امید اینکه این مقاله برای سایر افراد نیز مفید و ارزشمند واقع شود 😊

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

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