11211 - Memcache Pentesting
Reading time: 7 minutes
tip
AWS Hacking'i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking'i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE)
Azure Hacking'i öğrenin ve pratik yapın:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks'i Destekleyin
- abonelik planlarını kontrol edin!
- 💬 Discord grubuna veya telegram grubuna katılın ya da Twitter'da bizi takip edin 🐦 @hacktricks_live.**
- Hacking ipuçlarını paylaşmak için HackTricks ve HackTricks Cloud github reposuna PR gönderin.
Protokol Bilgisi
From wikipedia:
Memcached (telaffuz: mem-cashed, mem-cash-dee) genel amaçlı dağıtık bellek önbellekleme sistemidir. Genellikle, verileri ve nesneleri RAM'de önbelleğe alarak dinamik veritabanı destekli web sitelerinin hızını artırmak için kullanılır; bu, harici bir veri kaynağının (örneğin bir veritabanı veya API) okunma sayısını azaltır.
Memcached SASL'yi desteklese de, çoğu örnek kimlik doğrulama olmadan açığa çıkar.
Varsayılan port: 11211
PORT STATE SERVICE
11211/tcp open unknown
Enumeration
Manual
Bir memcache örneğinde kaydedilmiş tüm bilgileri dışarı aktarmak için şunları yapmalısınız:
- Aktif öğeler ile slab'ları bulun
- Daha önce tespit edilen slab'ların anahtar adlarını alın
- Anahtar adlarını alarak kaydedilmiş veriyi dışarı aktarın
Bu hizmetin sadece bir önbellek olduğunu unutmayın, bu nedenle veri görünebilir ve kaybolabilir.
echo "version" | nc -vn -w 1 <IP> 11211 #Get version
echo "stats" | nc -vn -w 1 <IP> 11211 #Get status
echo "stats slabs" | nc -vn -w 1 <IP> 11211 #Get slabs
echo "stats items" | nc -vn -w 1 <IP> 11211 #Get items of slabs with info
echo "stats cachedump <number> 0" | nc -vn -w 1 <IP> 11211 #Get key names (the 0 is for unlimited output size)
echo "get <item_name>" | nc -vn -w 1 <IP> 11211 #Get saved info
#This php will just dump the keys, you need to use "get <item_name> later"
sudo apt-get install php-memcached
php -r '$c = new Memcached(); $c->addServer("localhost", 11211); var_dump( $c->getAllKeys() );'
Manual2
sudo apt install libmemcached-tools
memcstat --servers=127.0.0.1 #Get stats
memcdump --servers=127.0.0.1 #Get all items
memccat --servers=127.0.0.1 <item1> <item2> <item3> #Get info inside the item(s)
Otomatik
nmap -n -sV --script memcached-info -p 11211 <IP> #Just gather info
msf > use auxiliary/gather/memcached_extractor #Extracts saved data
msf > use auxiliary/scanner/memcached/memcached_amp #Check is UDP DDoS amplification attack is possible
Memcache Anahtarlarını Dökme
Memcache alanında, verileri slab'lar aracılığıyla düzenlemeye yardımcı olan bir protokolde, depolanan verileri incelemek için belirli komutlar bulunmaktadır, ancak dikkate değer kısıtlamalarla:
- Anahtarlar yalnızca slab sınıfına göre dökülebilir, benzer içerik boyutuna sahip anahtarları gruplar.
- Her slab sınıfı için bir sayfa limiti vardır, bu da 1MB veri eşdeğerdir.
- Bu özellik resmi değildir ve topluluk forumlarında tartışıldığı gibi herhangi bir zamanda sona erdirilebilir.
Potansiyel olarak gigabaytlarca veriden yalnızca 1MB dökme kısıtlaması özellikle önemlidir. Ancak, bu işlevsellik belirli ihtiyaçlara bağlı olarak anahtar kullanım desenleri hakkında içgörüler sunabilir. Mekaniklerle daha az ilgilenenler için, araçlar bölümüne bir ziyaret, kapsamlı dökme için yardımcı programları ortaya koymaktadır. Alternatif olarak, memcached kurulumlarıyla doğrudan etkileşim için telnet kullanma süreci aşağıda açıklanmıştır.
Nasıl Çalışır
Memcache'in bellek organizasyonu çok önemlidir. Memcache'i "-vv" seçeneğiyle başlatmak, ürettiği slab sınıflarını ortaya çıkarır, aşağıda gösterildiği gibi:
$ memcached -vv
slab class 1: chunk size 96 perslab 10922
[...]
Tüm mevcut slab'leri görüntülemek için aşağıdaki komut kullanılır:
stats slabs
Bir anahtarın memcached 1.4.13'e eklenmesi, slab sınıflarının nasıl doldurulduğunu ve yönetildiğini gösterir. Örneğin:
set mykey 0 60 1
1
STORED
"stats slabs" komutunu anahtar eklemeden sonra çalıştırmak, slab kullanımına dair ayrıntılı istatistikler sağlar:
stats slabs
[...]
Bu çıktı, aktif slab türlerini, kullanılan parçaları ve operasyonel istatistikleri ortaya koyarak, okuma ve yazma işlemlerinin verimliliği hakkında bilgiler sunar.
Başka bir yararlı komut, "stats items", tahliyeler, bellek kısıtlamaları ve öğe yaşam döngüleri hakkında veri sağlar:
stats items
[...]
Bu istatistikler, farklı içerik boyutları için önbellek verimliliği, bellek tahsisi ve büyük nesneleri önbelleğe alma kapasitesi de dahil olmak üzere uygulama önbellekleme davranışı hakkında eğitimli varsayımlar yapmaya olanak tanır.
Anahtarları Dökme
1.4.31'den önceki sürümler için, anahtarlar slab sınıfı tarafından şu şekilde dökülür:
stats cachedump <slab class> <number of items to dump>
Örneğin, sınıf #1'de bir anahtarı dökmek için:
stats cachedump 1 1000
ITEM mykey [1 b; 1350677968 s]
END
Bu yöntem, slab sınıfları üzerinde döngü yaparak anahtar değerlerini çıkarır ve isteğe bağlı olarak döker.
MEMCACHE ANAHTARLARINI DÖKME (VER 1.4.31+)
Memcache sürüm 1.4.31 ve üzeri ile, üretim ortamında anahtarları dökmek için yeni, daha güvenli bir yöntem tanıtılmıştır; bu yöntem, sürüm notlarında detaylandırıldığı gibi, engellemeyen mod kullanmaktadır. Bu yaklaşım geniş bir çıktı üretir, bu nedenle verimlilik için 'nc' komutunun kullanılması önerilir. Örnekler şunlardır:
echo 'lru_crawler metadump all' | nc 127.0.0.1 11211 | head -1
echo 'lru_crawler metadump all' | nc 127.0.0.1 11211 | grep ee6ba58566e234ccbbce13f9a24f9a28
DUMPING TOOLS
Table from here.
Programming Languages | Tools | Functionality | ||
---|---|---|---|---|
PHP | simple script | Anahtar adlarını yazdırır. | ||
Perl | simple script | Anahtarları ve değerleri yazdırır. | ||
Ruby | simple script | Anahtar adlarını yazdırır. | ||
Perl | memdump | CPAN modülündeki araç | Memcached-libmemcached | ached/) |
PHP | memcache.php | Anahtarları dökme imkanı sunan Memcache İzleme GUI'si | ||
libmemcached | peep | Memcached işleminizi dondurur!!! Üretimde kullanırken dikkatli olun. Yine de bunu kullanarak 1MB sınırlamasını aşabilir ve gerçekten tüm anahtarları dökebilirsiniz. |
Troubleshooting
1MB Data Limit
Memcached 1.4'ten önce, varsayılan maksimum slab boyutu nedeniyle 1MB'den büyük nesneleri depolayamazsınız.
Never Set a Timeout > 30 Days!
Eğer izin verilen maksimumdan daha büyük bir zaman aşımı ile bir anahtar “set” veya “add” etmeye çalışırsanız, memcached değeri bir Unix zaman damgası olarak değerlendireceği için beklediğiniz sonucu alamayabilirsiniz. Ayrıca, zaman damgası geçmişte ise hiçbir şey yapmaz. Komutunuz sessizce başarısız olur.
Bu nedenle, maksimum ömrü kullanmak istiyorsanız 2592000 olarak belirtin. Örnek:
set my_key 0 2592000 1
1
Taşma Durumunda Kaybolan Anahtarlar
Belgelerde, “incr” kullanarak 64bit bir değerin taşmasının değerin kaybolmasına neden olduğu belirtiliyor. Değerin tekrar “add”/”set” ile oluşturulması gerekiyor.
Çoğaltma
memcached kendisi çoğaltmayı desteklemez. Eğer gerçekten buna ihtiyacınız varsa, 3. parti çözümler kullanmalısınız:
- repcached: Çoklu-master asenkron çoğaltma (memcached 1.2 yamanması)
- Couchbase memcached arayüzü: CouchBase'i memcached yerine kullanın
- yrmcds: memcached uyumlu Master-Slave anahtar-değer deposu
- twemproxy (aka nutcracker): memcached desteği olan proxy
Komutlar Hızlı Referans
Shodan
port:11211 "STAT pid"
"STAT pid"
Referanslar
tip
AWS Hacking'i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking'i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE)
Azure Hacking'i öğrenin ve pratik yapın:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks'i Destekleyin
- abonelik planlarını kontrol edin!
- 💬 Discord grubuna veya telegram grubuna katılın ya da Twitter'da bizi takip edin 🐦 @hacktricks_live.**
- Hacking ipuçlarını paylaşmak için HackTricks ve HackTricks Cloud github reposuna PR gönderin.