Root Yetkilerini Elde Etmek İçin Yanlış Yapılandırılmış Cron İzinlerini İstismar Etmek
Linux yetki yükseltme konusunda bir diğer adım yanlış yapılandırılmış Cron izinlerini kontrol etmek ve bunları istismar etmek.
Linux yetki yükseltme ile ilgili önceki iki yazıya sırasıyla aşağıdaki linklerden ulaşılabilir:
1. Linux'ta yetki yükseltme (Privilege Escalation)
2. /etc/passwd ile Linux yetki yükseltme - Part II
Bu defa crontab ile nasıl yetki yükseltilebileceğine bakıyorum.
Öncelikle "cron" kavramları ile tanışalım:
1. Cron Nedir?
Cron, Yunanca "zaman" kelimesinin öneki olan "chron"dan geliyor. Cron, sistem önyüklemesi (system boot) sırasında çalışan bir arka alan süreci.
Daha açıklayıcı olması açısından ve kısaca süper kullanışlı bir iş planlayıcı da denilebilir. İşleri periyodik olarak çalışacak şekilde planlamanıza olanak tanır. Cron genellikle sistem yöneticisi görevlerini otomatikleştirmek için kullanılır ancak bireysel kullanıcılar da e-posta indirme, zararlı yazılım tarayıcıları çalıştırma ve web sitelerini güncelleme için kontrol etme gibi görevleri otomatikleştirmek için Cron'u kullanabilir.
2. Crontab Nedir?
Crontab ise "Cron Table" kelimelerinin birleşiminden oluşmuş ve belirli (belirtilen) zamanlarda çalıştırılacak cron girdilerinin zamanlamasını içeren bir dosya.
Crontab dosyasının yeri işletim sistemlerine göre değişiklik gösterebiliyor. Linux sistemlerinde ise sistem genelinde crontab'ın konumu /etc/ crontab. Cron, bu dosyadaki betikleri ve komutları çalıştırırken root olarak çalışacaktır.
Unix sistemlerde her kullanıcı için farklı crontab kopyası tutulur. Aşağıdaki komut ile mevcut kullanıcıya ait crontab dosyasını düzenlemek mümkün:
crontab -e
Ayrıca mevcut kullanıcıya ait crontab bilgilerine erişmek için de aşağıdaki komut kullanılabilecektir:
crontab -l
Özetle; Cron bir arka plan programı. İstenen komutları belirlenen tarih ve saatlerde çalıştıyor. Bu komutlar ister tek seferlik ister tekrar eden görevler olarak belirlenebiliyor. Cron deamon tarafından yürütülmesi için komutlar ve talimatları içeren bir crontab dosyası oluşturmak gerekiyor. Bu görevlere ise cron job(s) deniyor.
Hangi Cron job'ların aktif olduğu nasıl görülür?
cat /etc/crontab
Yukarıdaki komut kullanılarak ayarlanmış cron joblar görülebilir.
Pentest yaparken ya da CTF çözerken LinEnum ya da benzeri bir script herhangi bir sonuç vermiyorsa mutlaka kontrol edilmesi gereken yerlerden birtanesi burası.
Cron job formatını anlamak
Cron job'lar belirli bir formata sahiptir ve aynı söz dizimini izler.
Her satır, çalıştırılacak bir komutu ve çalıştırılması gereken zamanı belirtir.Bir cron job zafiyetini istismar etmek istiyorsak da bu formatı bilmek gerekir. (Aynı /etc/passwd'de olduğu gibi bkz: Part II)
Formatta kullanılan harf ve semboller aşağıdaki gibi:
# = ID
m = Minute - Dakika
h = Hour - Saat
dom = Day of the month - Ayın hangi günü
mon = Month - Ay
dow = Day of the week - Haftanın hangi günü
user = Komut hangi kullanıcı olarak çalıştırılacak
command = Hani komut çalıştırılacak
ÖRNEK:
45 19 * * * cd /Users/sinem/scripts/security; ./scan.shYukarıda yer alan cron job sisteme şunu söyler:
- Haftanın her günü (Wildcard / joker yani * işareti "tümü" anlamına gelir),
- Her ay,
- Ayın her günü,
- Saat 19
- Dakika 45'te
- cd /Users/sinem/scripts/security dizininde yer alan scan.sh shell'ini çalıştır.
Sistem çapında crontab'lerde kullanıcının komutu aşağıdaki şeklilede çalıştırması da belirtilebilir:
* * * * * <kullanıcıadı> <çalıştırılacak olan komut>
Örneğin komut aşağıdaki şekilde verildiğinde sisteme bu komutu root kullanıcısı ile çalıştırmasını söyleyecektir:
45 19 * * * root cd /Users/sinem/scripts/security; ./scan.sh
Cron ile Yetki Yükseltme Nasıl Yapılır?
Cron tarafından yürütülen bir komut dosyası, yetkili (sistem ayrıcalıkları) olmayan kullanıcılar tarafından düzenlenebilir durumda (w-writable) olduğunda, yetkisiz kullanıcılar, bu komut dosyasını düzenleyerek ve Cron tarafından root ayrıcalıkları altında çalıştırılmasını bekleyerek yetki yükseltebilir.
ÖRNEK:
Aşağıdaki satır /etc/crontab içerisinde yer alıyor.
Her akşam 7:45'de Cron maintenance.sh shell'ini çalıştıracak.
Bu betik /etc/crontab tarafından çağırıldığı için root yetkileri ile çalışacak.
Yukarıdaki betikte yer alan "maintenance.sh" shell'i her kullanıcı tarafından değiştirilebilir durumda bırakıldıysa ya da ele geçirmiş olduğumuz kullanıcı hesabı bu betik üzerinde değişiklik yapma yetkisine sahipse bu durumda maintenance.sh'a istediği komutları ekleyebilecek ve bu komutların root kullanıcısı olarak çalıştırılmasını sağlayabilecektir.
Sonuç olarak yetki yükseltmeyi de sağlayabilecektir.
Örneğin aşağıdaki komutu kullanarak kendi kullanıcımı Sudoer olarak ekleyip superuser yetkilerini alabilirim:
echo “sinem ALL=(ALL) NOPASSWD:ALL” >> /etc/sudoers
Ya da bir önceki linux yetki yükseltme yazısında (bkz: burası)görmüş olduğum /etc/passwd/ içerisine yeni bir root kullanıcısı ekleyebilirim.
echo “sinem::0:0:System Administrator:/root/root:/bin/bash” >> /etc/passwd
Yukarıda yer alan komutta "0” root kullanıcısının user ID'sidir (UID). Bu nedenle UID'si “0” olan bir kullanıcının eklenmesi bu kullanıcıya root yetkileri verecektir. Bu kullanıcının "sinem" kullanıcı adı ve boş bir şifresi olacaktır.