
إرسال رسائل ومرفقات تصيد إلى مستخدمي Microsoft Teams
...
:-++++++=-.
.=+++++++++++-
.++++++++++++++= :------: :-:--.
:+++++++++++++++. .---------- #= .-+.
:+++++++++++++++. -----------: :#= :#.
:--------------------------=++++++++- .------------ .=+ ++
----------------------------+++++*+-. :+=-----===: -+-.+:
:---------------------------++++=-. .=+++++=-. .=+:.
:------=%%%%%%%%%%%%--------:... .:::.. -*=-:
:------=****#@@#****--------=++++++++++++++-----------. -#++-
:----------:+@@+:-----------+++++++++++++++=----------- -#++-
:-----------+@@*------------+++++++++++++++=-----------. -*+*-
:-----------+@@*------------+++++++++++++++=-----------. . -*++-
:-----------+@@*------------+++++++++++++++=-----------. -- -*++-
:-----------+@@*------------+++++++++++++++=-----------. . == -*++- .=
:-----------+@@+------------+++++++++++++++=-----------. .+ -= :+==- .*
:---------------------------+++++++++++++++=-----------. =* -= -+=+= .::
----------------------------+++++++++++++++=----------- ** -+ -+=++. .*=
.:-------------------------=+++++++++++++++=---------=: #+ := ++-:*= ==
-++++++++++++++++++++++++++=-------=+=: :#= .:. *=: -*- ==
.=+++++++++++++++++++++++++*+++++++=-. -#- ::++= :+=. .==
:++++++++++++++++++++++++=:.:::::. -*: .=+-. .=+-. -+:
.=+*+++++++++++++++++++- -+- .:-=. .-====----:-==:
.-+**+++++++++++**+-. .++: .-=-: .:-====-:.
:-=++******+=-: .=+===--.
..:::.. ...
_____ ______ _ _ _
|_ _| | ___ \| | (_) | |
| | ___ __ _ _ __ ___ ___ | |_/ /| |__ _ ___ | |__ ___ _ __
| | / _ \ / _` || '_ ` _ \ / __|| __/ | '_ \ | |/ __|| '_ \ / _ \| '__|
| || __/| (_| || | | | | |\__ \| | | | | || |\__ \| | | || __/| |
\_ \___| \__,_||_| |_| |_||___/\_| |_| |_||_||___/|_| |_| \___||_|
v1.2 developed by @Octoberfest73 (https://github.com/Octoberfest7)
TeamsPhisher هو برنامج مكتوب بلغة Python3 يسهل تسليم رسائل ومرفقات التصيد إلى مستخدمي Microsoft Teams الذين تسمح مؤسساتهم بالاتصالات الخارجية.
ليس من الممكن عادةً إرسال الملفات إلى مستخدمي Teams خارج المؤسسة. قام كل من Max Corbridge (@CorbridgeMax) و Tom Ellson (@tde_sec) من JUMPSEC مؤخرًا بالكشف عن طريقة لتجاوز هذا القيد من خلال التلاعب بطلبات Teams الويب لتغيير مستلم رسالة تحتوي على ملف مرفق.
يدمج TeamsPhisher هذه التقنية بالإضافة إلى بعض التقنيات السابقة التي كشف عنها Andrea Santese (@Medu554).
كما يعتمد بشكل كبير على TeamsEnum، وهو عمل رائع من Bastian Kanbach (@bka) من SSE، لجزء المصادقة من سير الهجوم بالإضافة إلى بعض وظائف المساعدة العامة.
يسعى TeamsPhisher إلى الاستفادة من أفضل ما في هذه المشاريع وإنتاج وسيلة قوية وقابلة للتخصيص وفعالة لعمليات الفريق الأحمر المرخصة لاستخدام Microsoft Teams في سيناريوهات التصيد للوصول.
انظر نهاية ملف README هذا للحصول على توصيات التخفيف.
أعطِ TeamsPhisher مرفقًا ورسالة وقائمة بمستخدمي Teams المستهدفين. سيقوم بتحميل المرفق إلى Sharepoint الخاص بالمرسل، ثم يتكرر عبر قائمة الأهداف.
سيقوم TeamsPhisher أولاً بتعداد المستخدم المستهدف والتأكد من أن المستخدم موجود ويمكنه استقبال الرسائل الخارجية. ثم سينشئ محادثة جديدة مع المستخدم المستهدف. لاحظ أن هذه من الناحية الفنية محادثة "جماعية" لأن TeamsPhisher يضمن عنوان البريد الإلكتروني للهدف مرتين؛ هذه خدعة أنيقة من @Medu554 ستتجاوز شاشة الترحيب "شخص خارج مؤسستك أرسل لك رسالة، هل أنت متأكد أنك تريد رؤيتها" التي قد تجعل أهدافنا يتوقفون. (v1.2) ملاحظة: تم إصلاح تجاوز شاشة الترحيب هذه، ولكن إضافة المستخدم الهدف إلى محادثة جماعية لا تزال ذات صلة بتجاوز شاشة الترحيب الحالي.
مع إنشاء المحادثة الجديدة بين مرسلنا والهدف، سيتم إرسال الرسالة المحددة إلى المستخدم مع رابط للمرفق في Sharepoint.
بمجرد إرسال هذه الرسالة الأولية، سيتم إزالة المستخدم الهدف من المحادثة الجماعية المنشأة. هذا يزيل قدرة المرسل على إرسال المزيد من الرسائل للهدف، ولكنه أيضًا يزيل شاشة "هذا الشخص من خارج مؤسستك" ويجعل النجاح أكثر احتمالاً. تم نشر هذا التجاوز الحالي بواسطة @pfiatde في إحدى مدوناته العديدة حول Teams والسلوك غير المقصود وتم دمجه في TeamsPhisher بواسطة Steve Nelson (@stevesec128) و Alex Martirosyan (@almartiros) من DenSecure.
قم بتشغيل TeamsPhisher فعليًا. أرسل رسائل التصيد إلى الأهداف.
الأمر:

Targets.txt:

Message.txt:

مخرجات TeamsPhisher:

عرض المرسل:

عرض الهدف:

الملف المرفق:

قم بتشغيل TeamsPhisher في وضع المعاينة للتحقق من قائمة الأهداف، ومعاينة "الأسماء الودية" (إذا تمكن TeamsPhisher من حلها باستخدام المفتاح --personalize)، وإرسال رسالة اختبار إلى حساب المرسل الخاص بك للتحقق من أن كل شيء يبدو كما تريد.
مخرجات TeamsPhisher:

عرض المرسل:

يتطلب TeamsPhisher أن يكون لدى المستخدمين حساب Microsoft Business (بدلاً من الحساب الشخصي مثل @hotmail، @outlook، إلخ) مع ترخيص Teams و Sharepoint صالح.
هذا يعني أنك ستحتاج إلى مستأجر AAD ومستخدم واحد على الأقل مع ترخيص مطابق. في وقت النشر، تتوفر بعض التراخيص التجريبية المجانية في مركز تراخيص AAD التي تفي بمتطلبات هذه الأداة.
ستحتاج إلى تسجيل الدخول إلى Sharepoint الشخصي للمستخدم الذي سترسل الرسائل به مرة واحدة على الأقل قبل استخدام الحساب مع TeamsPhisher. يجب أن يكون هذا شيئًا مثل tenantname-my.sharepoint.com/personal/myusername_mytenantname_onmicrosoft_com أو tenantname-my.sharepoint.com/personal/myusername_mytenantname_mycustomdomain_tld.
من حيث المتطلبات المحلية، أوصي بالتحديث إلى أحدث إصدار من Python3. ستحتاج أيضًا إلى مكتبة المصادقة من Microsoft:``` pip3 install msal
# الاستخدام```
usage: teamsphisher.py [-h] -u USERNAME -p PASSWORD -a ATTACHMENT -m MESSAGE (-e EMAIL | -l LIST) [--greeting GREETING] [--securelink] [--personalize]
[--preview] [--delay DELAY] [--nogreeting] [--log] [--sharepoint SHAREPOINT]
options:
-h, --help show this help message and exit
-u USERNAME, --username USERNAME
Username for authentication
-p PASSWORD, --password PASSWORD
Password for authentication
-a ATTACHMENT, --attachment ATTACHMENT
Full path to the attachment to send to targets.
-m MESSAGE, --message MESSAGE
A file containing a message to send with attached file.
-e EMAIL, --targetemail EMAIL
Single target email address
-s SHAREPOINT, --sharepoint SHAREPOINT
Manually specify sharepoint name (e.g. mytenant.sharepoint.com would be --sharepoint mytenant)
-l LIST, --list LIST Full path to a file containing target emails. One per line.
--greeting GREETING Override default greeting with a custom one. Use double quotes if including spaces!
--securelink Send link to file only viewable by the individual target recipient.
--personalize Try and use targets names in greeting when sending messages.
--preview Run in preview mode. See personalized names for targets and send test message to sender's Teams.
--delay DELAY Delay in [s] between each attempt. Default: 0
--nogreeting Do not use built in greeting or personalized names, only send message specified with --message
--log Write TeamsPhisher output to logfile
اسم المستخدم لحساب Microsoft الذي سترسل الرسائل منه (مثل [email protected])
كلمة المرور للحساب المذكور. إذا كانت تحتوي على أحرف خاصة، فقد يكون من المفيد وضعها بين علامتي اقتباس مفردة.
الملف الذي ترغب في إرساله إلى المستخدمين المستهدفين. سيتم تحميل هذا الملف إلى موقع sharepoint الخاص بالمرسل وسيتم مشاركة رابط عبر Teams.
ملف يحتوي على النص الذي يجب أن يرافق المرفق ويتم إرساله إلى المستهدفين
إما بريد إلكتروني مستهدف واحد (مثل [email protected]) أو ملف يحتوي على قائمة رسائل البريد الإلكتروني المستهدفة، سطر واحد لكل مستلم.
قم بتحديد اسم موقع sharepoint الذي سيتم تحميل المرفق إليه يدويًا. من المحتمل أن يكون هذا ضروريًا إذا كان المستأجر الخاص بالمرسل يستخدم اسم نطاق مخصص (على سبيل المثال، لا يتبع اصطلاح xxx.onmicrosoft.com). قم بتحديد الاسم الفريد فقط، على سبيل المثال، إذا كان موقع sharepoint الخاص بك هو mytest.sharepoint.com، فاستخدم --sharepoint mytest
تجاوز التحية الافتراضية لـ TeamPhisher ("مرحبًا، ") بتحية مخصصة يتم إضافتها قبل الرسالة المحددة بواسطة --message. على سبيل المثال، "مساء الخير، " أو "فريق المبيعات، "
افتراضيًا، يمكن لأي شخص لديه الرابط مشاهدة رابط sharepoint المرسل إلى المستهدفين؛ استخدم --securelink بحيث يكون ملف sharepoint مرئيًا فقط للمستهدف الذي استلمه. قد يساعد في حماية برامجك الضارة من فريق الأزرق.
سيحاول TeamsPhisher التعرف على الاسم الأول لكل مستخدم مستهدف واستخدامه مع التحية. على سبيل المثال، سيتلقى [email protected] رسالة تبدأ بـ "مرحبًا Tom، ". هذا ليس مثاليًا ويعتمد على تنسيق رسائل البريد الإلكتروني المستهدفة؛ استخدم --preview لترى ما إذا كان هذا مناسبًا لقائمتك المستهدفة أم لا.
سيتم تشغيل TeamsPhisher في وضع المعاينة. لن يرسل هذا أي رسائل إلى المستخدمين المستهدفين، ولكنه سيعرض الاسم "الودود" الذي سيتم استخدامه بواسطة مفتاح --personalize. بالإضافة إلى ذلك، سيتم إرسال رسالة اختبارية تمثل ما سيتلقاه المستهدفون مع الإعدادات الحالية إلى Teams المرسل؛ قم بتسجيل الدخول وشاهد كيف تبدو رسالتك وقم بالتعديل حسب الحاجة.
حدد تأخيرًا قدره x ثانية بين الرسائل الموجهة للمستهدفين. يمكن أن يساعد في مشكلات الحد من المعدل المحتملة.
تعطيل التحية المدمجة التي يستخدمها TeamsPhisher. يقوم أيضًا بتعطيل ميزة --personalize. استخدم هذا الخيار إذا كنت تقوم بتضمين تحيتك داخل الرسالة المحددة بواسطة --message.
كتابة مخرجات TeamsPhisher إلى ملف سجل (سيتم الكتابة إلى دليل المستخدم الرئيسي).
python3 teamsphisher.py -u [email protected] -p 'xxxxxxxxxxxx' -l /root/targets.txt -a /root/attachment.zip -m /root/message.txt --log
سيقوم هذا الأمر بجلب رموز الوصول لحساب testuser وتحميل المرفق '/root/attachment.zip' إلى Sharepoint الخاص بـ testuser.
ثم سيقوم بإنشاء محادثة Teams فريدة لكل هدف مدرج داخل '/root/targets.txt' وإرسال الرسالة المحددة داخل '/root/message.txt' لهم بالإضافة إلى رابط للمرفق داخل Sharepoint.
سيتم تسجيل جميع المخرجات الطرفية من TeamsPhisher في ملف يتم إخراجه داخل الدليل الرئيسي للمستخدم.```
python3 teamsphisher.py -u [email protected] -p 'xxxxxxxxxxxx' -l /root/targets.txt -a /root/attachment.zip -m /root/message.txt --greeting "Good afternoon" --personalize --securelink
سيقوم هذا الأمر بجلب رموز الوصول لحساب testuser وتحميل المرفق '/root/attachment.zip' إلى Sharepoint الخاص بـ testuser.
ثم سيقوم بإنشاء مؤشر ترابط Teams فريد مع كل هدف مدرج داخل '/root/targets.txt' وإرسال الرسالة المحددة داخل '/root/message.txt' بالإضافة إلى رابط المرفق داخل Sharepoint.
ستكون الرسالة مسبوقة بالتحية "Good afternoon ،".
سيحاول TeamsPhisher استخدام أسماء "ودية" في التحية. الآن ستكون التحية "Good afternoon ،".
كل رابط SharePoint يتم إرساله فريد وصالح فقط لذلك الهدف المحدد.
سيقوم TeamsPhisher بتحديد الحسابات التي لا يمكن إرسال رسائل إليها من المؤسسات الخارجية، والحسابات غير الموجودة، والحسابات التي لديها خطة اشتراك غير متوافقة مع هذا المتجه الهجومي:

بفضل كود من مشروع TeamsEnum، يدعم TeamsPhisher تسجيل الدخول بحسابات مرسل تستخدم MFA:

استخدام المفتاح --securelink سيؤدي إلى مطالبة الأهداف بالمصادقة لعرض المرفق في SharePoint. يمكنك أن تقرر ما إذا كان هذا يضيف خطوات إضافية كثيرة، أو يضيف 'شرعية' عن طريق إرسالهم عبر وظيفة تسجيل الدخول الحقيقية من Microsoft.


من خلال تعديل TeamsPhisher.py يمكنك تغيير بعض المتغيرات العامة لاستخدامها في عمليات التشغيل اللاحقة:```
Greeting = "Hi"
useragent = "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko)"
## التخصيص والأسماء "الودية"
ستحاول إشارة `--personalize` حل اسم "ودي" لكل هدف؛ تقوم بذلك عن طريق النظر إلى البيانات التي تُرجعها دالة `enumUser` والتحقق أولاً من حقل "displayName".
إذا كان حقل displayName يحتوي على مسافة (مثل "Tom Jones")، فسيقوم TeamsPhisher بتقسيم النص عند المسافة وأخذ الجزء الأول كاسم "ودي".
إذا لم تكن هناك مسافة في حقل displayName (على سبيل المثال، قد تضع بعض المؤسسات UPN في حقل displayName مثل [email protected])، فسيحاول TeamsPhisher تحليل UPN نفسه.
مع مثال UPN مثل [email protected]، سيقوم TeamsPhisher بتقسيم النص عند الحرف '@'، ثم في الجزء الأول يقسم عند الحرف '.' ويأخذ الجزء الأول. سينتج عن ذلك اسم "ودي" مثل "Tom" في هذه الحالة.
هذا هو مدى ما سيفعله TeamsPhisher لمحاولة التعرف على الأسماء "الودية". الأهداف مثل "[email protected]" و"[email protected]" لن تحصل على أسماء "ودية" محددة إذا كانت حقول displayName الخاصة بها لا تتوافق مع قاعدة التحليل الموضحة أعلاه.
# التخفيف
يمكن للمؤسسات تقليل المخاطر التي تشكلها هذه الثغرة من خلال إدارة الخيارات المتعلقة بالوصول الخارجي عبر مركز إدارة Microsoft Teams تحت المستخدمون -> الوصول الخارجي.

توفر Microsoft مرونة للمؤسسات لاختيار أفضل الصلاحيات التي تناسب احتياجاتها، بما في ذلك الحظر الشامل بالإضافة إلى القائمة البيضاء لمستأجرين خارجيين محددين فقط للاتصالات.

# سجل التغييرات
## الإصدار 1.2
تم دمج طلب سحب من فريق DenSecure يتضمن تجاوزًا لشاشة الترحيب للمستخدمين الخارجيين (يعمل اعتبارًا من 2/7/24).
التغيير في سير عمل TeamsPhisher هو لحسن الحطف بسيط جدًا وسهل الدمج. بعد إنشاء محادثة جماعية مع المستخدم الهدف وإرسال الرسالة، يتم تقديم طلب إضافي لإزالة المستخدم الهدف من المحادثة الجماعية. يؤدي هذا إلى استلام المستخدم للرسالة بدون شاشة ترحيب للمستخدمين الخارجيين.
تم تحديث ملف README بمعلومات أكثر حداثة بخصوص التقنية المستخدمة حاليًا بواسطة TeamsPhisher.
## الإصدار 1.1.2
تم إصلاح خطأ كان المستخدمون يبلغون عنه بخصوص رفع المرفق إلى SharePoint؛ نشأ هذا الخطأ من اصطلاحات التسمية/إعادة التسمية التي تحدث عندما يستخدم المستخدمون نطاقًا مخصصًا مع مستأجرهم.
تمت إضافة فحص تحقق لضمان أنه إذا كان المستخدمون يستخدمون نطاقًا غير @domain.onmicrosoft.com، فيجب عليهم أيضًا استخدام المفتاح -s لتحديد موقع SharePoint الخاص بهم يدويًا لتجنب المشكلات.
تم تحديث قسم الإعداد ليشمل تسجيل الدخول إلى SharePoint مرة واحدة على الأقل قبل استخدام TeamsPhisher، حيث حدد أحد المستخدمين أن عدم تسجيل الدخول مسبقًا باستخدام الحساب قد يتسبب في فشل TeamsPhisher.
تمت إضافة المعلمة &top=999 إلى طلب الويب getSenderInfo لزيادة عدد المستخدمين المستردين لكل صفحة وتقليل عدد الطلبات المطلوبة للعثور على مستخدمنا.
### التراجع عن التغيير المتعلق بتحليل النقاط '.' في أسماء المستخدمين عند تجميع عنوان URI لـ SharePoint
قام الإصدار 1.1 بتغيير طريقة تحليل أسماء المستخدمين التي تحتوي على الحرف '.' لأغراض إنشاء عناوين URI المطلوبة لـ SharePoint. كانت هناك عدة مشكلات متميزة وحددت هذا خطأً كسبب لإحداها. تم التراجع عن هذا التغيير. النتيجة هي أن اسم المستخدم مثل [email protected] سيكون له الآن عنوان URI لـ SharePoint مُجمّع كـ "tom_jones_mytest_onmicrosoft_com" بدلاً من "tom.jones_mytest_onmicrosoft_com".
## الإصدار 1.1.1
إصلاحات طفيفة
## الإصدار 1.1
تم القيام بعدة التزامات لمعالجة مشكلات صغيرة مختلفة دون زيادة رقم الإصدار؛ آسف على الإهمال.
يجلب الإصدار 1.1 بعض التغييرات التي تهدف إلى معالجة بعض المشكلات الشائعة التي واجهها المستخدمون.
### الوسيط -s, --sharepoint
تمت إضافة هذا الوسيط الاختياري ليتمكن المستخدمون من تحديد اسم جذر SharePoint يدويًا. نشأت مشكلة شائعة عندما قام المستخدمون بتغيير اسم نطاق المستأجر الخاص بهم إلى اسم مخصص؛ على سبيل المثال، بدلاً من أن يكون اسم المستخدم [email protected]، قد يصبح [email protected]. قام الإصدار الأصلي من TeamsPhisher بتجميع عنوان SharePoint ومسارات URI المطلوبة عن طريق تحليل اسم المستخدم الرئيسي (UPN) للمُرسل من معلومات المستخدم الخاصة به. عندما يتم تغيير نطاق المستأجر إلى نطاق مخصص، تتغير UPNs الخاصة بالمستخدمين لتعكس ذلك. ومع ذلك، سيبقى عنوان SharePoint للمستأجر دائمًا كما هو/ما كان عليه عند إنشاء المستأجر في الأصل.
لم أتمكن من العثور على طريقة جيدة لحل عنوان SharePoint الحالي للمستأجر؛ يمكن القيام بذلك بسهولة باستخدام Graph API، لكن تنفيذ Graph في هذه الأداة سيتطلب الكثير من الإعداد من جانب المستخدمين لاستخدام TeamsPhisher. اخترت توفير خيار تحديد اسم SharePoint يدويًا كإصلاح أسهل.
### تحسين تحليل عنوان SharePoint وURI المطلوب عند عدم استخدام الخيار اليدوي
كان هناك تقرير من مستخدم لم يستخدم نطاقًا مخصصًا مع مستأجره وكان لا يزال يتلقى خطأ 404 غير موجود بخصوص SharePoint. أعتقد أن هذا كان بسبب احتواء اسم المستخدم الخاص به على حرف '.'، على سبيل المثال [email protected]. كان الإصدار السابق من TeamsPhisher يحتوي على وظيفة بحث واستبدال أبسط لـ UPN الخاص بالمستخدم من أجل تجميع عناوين URI المطلوبة لـ SharePoint، الآن الإصدار 1.1 يستهدف بشكل خاص الأحرف '.' التي تحتاج إلى الاستبدال وسيترك الأحرف '.' الأخرى في حقل اسم المستخدم دون تغيير.
### الأحرف الخاصة (مثل 'ö') داخل نص الرسالة لم تعد تسبب خطأ في الخادم
كان هذا إصلاحًا بسيطًا جدًا استغرق وقتًا طويلاً لتتبعه. تمت إضافة ترميز utf-8 إلى طلب POST الخاص بـ sendFile. يمكن الآن استخدام الأحرف الخاصة في الرسائل.
### تنظيف بسيط للكود
تم إصلاح بعض التعليقات وإعادة ترتيب بعض الخطوات في main للتحقق الآن من وجود الملفات المطلوبة قبل محاولة المصادقة.
## الإصدار 1.0 - الإصدار الأولي
# الشكر والتقدير
1. Max Corbridge (@CorbridgeMax) وTom Ellson (@tde_sec) من JUMPSEC لهذه [المقالة](https://labs.jumpsec.com/advisory-idor-in-microsoft-teams-allows-for-external-tenants-to-introduce-malware/). شكر خاص لـ Max لاستجابته الكبيرة واستعداده للدردشة بشكل خاص حول بحثه.
2. Andrea Santese (@Medu554) لهذا [البحث](https://posts.inthecyber.com/leveraging-microsoft-teams-for-initial-access-42beb07f12c4). شكر خاص آخر لاستجابته واستعداده لمناقشة عمله بشكل خاص.
3. Bastian Kanbach (@_bka_) من SSE لأداة [TeamsEnum](https://github.com/sse-secure-systems/TeamsEnum). كان هذا المشروع نقطة انطلاق لاسترداد رموز Bearer والمصادقة عبر طرق مختلفة. كنت قد استخدمت Graph API لهذه الأغراض، لكن مشروعه (وهذا المشروع) يستخدم نقاط النهاية العادية، لذلك كان رائعًا وجود شخص قد خاض بالفعل هذه التجربة ولديه دوال موثوقة لتحقيق ذلك.
4. @pfiatde الذي لديه [سلسلة متعددة الأجزاء حول التصيد عبر Teams](https://badoption.eu/blog/2024/01/12/teams5.html). تمت الإشارة إلى مدوناته أثناء التطوير الأصلي لـ TeamsPhisher، والإصدار الحالي من الأداة يستخدم تجاوزًا جديدًا لشاشة الترحيب من بحوث لاحقة قام بنشرها.
5. Steve Nelson (@stevesec128) وAlex Martirosyan (@almartiros) من DenSecure لتحديثهم لـ TeamsPhisher (2/7/24) الذي قام بدمج تجاوز شاشة الترحيب الذي لا يزال يعمل من @pfiatde.
6. [هذا الموقع لإنشاء نص ASCII](https://patorjk.com/software/taag/#p=display&f=Graffiti&t=Type%20Something%20)
7. [هذا المشروع المجنون لتحويل الصور إلى فن ASCII](https://github.com/TheZoraiz/ascii-image-converter)