mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
174 lines
11 KiB
Markdown
174 lines
11 KiB
Markdown
# 11211 - Pentesting Memcache
|
|
|
|
{{#include ../../banners/hacktricks-training.md}}
|
|
|
|
## Informacje o protokole
|
|
|
|
Z [wikipedia](https://en.wikipedia.org/wiki/Memcached):
|
|
|
|
> **Memcached** (wymowa: mem-cashed, mem-cash-dee) to ogólny, rozproszony system [cache'owania pamięci](https://en.wikipedia.org/wiki/Memory_caching). Często jest używany do przyspieszania dynamicznych stron internetowych opartych na bazach danych poprzez cache'owanie danych i obiektów w RAM, aby zredukować liczbę razy, kiedy zewnętrzne źródło danych (takie jak baza danych lub API) musi być odczytywane.
|
|
|
|
Chociaż Memcached obsługuje SASL, większość instancji jest **eksponowana bez uwierzytelnienia**.
|
|
|
|
**Domyślny port:** 11211
|
|
```
|
|
PORT STATE SERVICE
|
|
11211/tcp open unknown
|
|
```
|
|
## Enumeracja
|
|
|
|
### Ręcznie
|
|
|
|
Aby wyeksportować wszystkie informacje zapisane w instancji memcache, musisz:
|
|
|
|
1. Znaleźć **slaby** z **aktywnymi elementami**
|
|
2. Uzyskać **nazwy kluczy** z wcześniej wykrytych slabów
|
|
3. Wyeksportować **zapisane dane** poprzez **uzyskanie nazw kluczy**
|
|
|
|
Pamiętaj, że ta usługa to tylko **cache**, więc **dane mogą się pojawiać i znikać**.
|
|
```bash
|
|
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
|
|
```bash
|
|
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)
|
|
```
|
|
### Automatyczny
|
|
```bash
|
|
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
|
|
```
|
|
## **Zrzut kluczy Memcache**
|
|
|
|
W obszarze memcache, protokołu, który pomaga w organizacji danych według slabów, istnieją specyficzne polecenia do inspekcji przechowywanych danych, chociaż z zauważalnymi ograniczeniami:
|
|
|
|
1. Klucze mogą być zrzucane tylko według klasy slab, grupując klucze o podobnym rozmiarze zawartości.
|
|
2. Istnieje limit jednej strony na klasę slab, co odpowiada 1MB danych.
|
|
3. Ta funkcjonalność jest nieoficjalna i może zostać w każdej chwili wycofana, jak omówiono na [forum społecznościowym](https://groups.google.com/forum/?fromgroups=#!topic/memcached/1-T8I-RVGKM).
|
|
|
|
Ograniczenie do zrzutu tylko 1MB z potencjalnie gigabajtów danych jest szczególnie istotne. Niemniej jednak, ta funkcjonalność może nadal oferować wgląd w wzorce użycia kluczy, w zależności od specyficznych potrzeb. Dla tych, którzy mniej interesują się mechaniką, wizyta w [sekcji narzędzi](https://lzone.de/cheat-sheet/memcached#tools) ujawnia narzędzia do kompleksowego zrzutu. Alternatywnie, proces używania telnetu do bezpośredniej interakcji z konfiguracjami memcached jest opisany poniżej.
|
|
|
|
### **Jak to działa**
|
|
|
|
Organizacja pamięci memcache jest kluczowa. Inicjowanie memcache z opcją "-vv" ujawnia klasy slab, które generuje, jak pokazano poniżej:
|
|
```bash
|
|
$ memcached -vv
|
|
slab class 1: chunk size 96 perslab 10922
|
|
[...]
|
|
```
|
|
Aby wyświetlić wszystkie obecnie istniejące slabsy, używa się następującego polecenia:
|
|
```bash
|
|
stats slabs
|
|
```
|
|
Dodanie pojedynczego klucza do memcached 1.4.13 ilustruje, jak klasy slab są zapełniane i zarządzane. Na przykład:
|
|
```bash
|
|
set mykey 0 60 1
|
|
1
|
|
STORED
|
|
```
|
|
Wykonanie polecenia "stats slabs" po dodaniu klucza daje szczegółowe statystyki dotyczące wykorzystania slabów:
|
|
```bash
|
|
stats slabs
|
|
[...]
|
|
```
|
|
Ten wynik ujawnia aktywne typy slabów, wykorzystane kawałki oraz statystyki operacyjne, oferując wgląd w efektywność operacji odczytu i zapisu.
|
|
|
|
Inna przydatna komenda, "stats items", dostarcza dane na temat usunięć, ograniczeń pamięci oraz cykli życia elementów:
|
|
```bash
|
|
stats items
|
|
[...]
|
|
```
|
|
Te statystyki pozwalają na wyciąganie wykształconych wniosków na temat zachowania pamięci podręcznej aplikacji, w tym efektywności pamięci podręcznej dla różnych rozmiarów treści, alokacji pamięci i pojemności do buforowania dużych obiektów.
|
|
|
|
### **Dumping Keys**
|
|
|
|
Dla wersji przed 1.4.31, klucze są zrzucane według klasy slab za pomocą:
|
|
```bash
|
|
stats cachedump <slab class> <number of items to dump>
|
|
```
|
|
Na przykład, aby zrzucić klucz w klasie #1:
|
|
```bash
|
|
stats cachedump 1 1000
|
|
ITEM mykey [1 b; 1350677968 s]
|
|
END
|
|
```
|
|
Ta metoda iteruje po klasach slab, ekstraktując i opcjonalnie zrzucając wartości kluczy.
|
|
|
|
### **Zrzucanie KLUCZY MEMCACHE (WERSJA 1.4.31+)**
|
|
|
|
W wersji memcache 1.4.31 i nowszych wprowadzono nową, bezpieczniejszą metodę zrzucania kluczy w środowisku produkcyjnym, wykorzystując tryb non-blocking, jak opisano w [uwagach do wydania](https://github.com/memcached/memcached/wiki/ReleaseNotes1431). Podejście to generuje obszerne wyjście, stąd zalecenie użycia polecenia 'nc' dla efektywności. Przykłady obejmują:
|
|
```bash
|
|
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
|
|
```
|
|
### **NARZĘDZIA DO ZRZUTU**
|
|
|
|
Tabela [stąd](https://lzone.de/blog).
|
|
|
|
| Języki programowania | Narzędzia | Funkcjonalność | | |
|
|
| --------------------- | --------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------- | ------- |
|
|
| PHP | [prosty skrypt](http://snipt.org/xtP) | Wyświetla nazwy kluczy. | | |
|
|
| Perl | [prosty skrypt](https://wiki.jasig.org/download/attachments/13572172/memcached-clean.pl?version=1&modificationDate=1229693957401) | Wyświetla klucze i wartości | | |
|
|
| Ruby | [prosty skrypt](https://gist.github.com/1365005) | Wyświetla nazwy kluczy. | | |
|
|
| Perl | [memdump](https://search.cpan.org/~dmaki/Memcached-libmemcached-0.4202/src/libmemcached/docs/memdump.pod) | Narzędzie w module CPAN | [Memcached-libmemcached](https://search.cpan.org/~dmaki/Memcached-libmemc) | ached/) |
|
|
| PHP | [memcache.php](http://livebookmark.net/journal/2008/05/21/memcachephp-stats-like-apcphp/) | GUI do monitorowania Memcache, która również pozwala na zrzut kluczy | | |
|
|
| libmemcached | [peep](http://blog.evanweaver.com/2009/04/20/peeping-into-memcached/) | **Zamraża twój proces memcached!!!** Uważaj przy używaniu tego w produkcji. Mimo to, używając go, możesz obejść ograniczenie 1MB i naprawdę zrzucić **wszystkie** klucze. | | |
|
|
|
|
## Rozwiązywanie problemów <a href="#troubleshooting" id="troubleshooting"></a>
|
|
|
|
### Limit danych 1MB <a href="#1mb-data-limit" id="1mb-data-limit"></a>
|
|
|
|
Zauważ, że przed wersją memcached 1.4 nie możesz przechowywać obiektów większych niż 1MB z powodu domyślnego maksymalnego rozmiaru slab.
|
|
|
|
### Nigdy nie ustawiaj limitu czasu > 30 dni! <a href="#never-set-a-timeout--30-days" id="never-set-a-timeout--30-days"></a>
|
|
|
|
Jeśli spróbujesz „ustawić” lub „dodać” klucz z limitem czasu większym niż dozwolone maksimum, możesz nie otrzymać tego, czego oczekujesz, ponieważ memcached traktuje wartość jako znacznik czasu Unix. Jeśli znacznik czasu jest w przeszłości, nie zrobi nic. Twoje polecenie cicho się nie powiedzie.
|
|
|
|
Więc jeśli chcesz użyć maksymalnego czasu życia, określ 2592000. Przykład:
|
|
```
|
|
set my_key 0 2592000 1
|
|
1
|
|
```
|
|
### Znikające klucze przy przepełnieniu <a href="#disappearing-keys-on-overflow" id="disappearing-keys-on-overflow"></a>
|
|
|
|
Pomimo że dokumentacja mówi coś o tym, że przepełnienie wartości 64-bitowej przy użyciu „incr” powoduje zniknięcie wartości. Należy ją ponownie utworzyć przy użyciu „add”/„set”.
|
|
|
|
### Replikacja <a href="#replication" id="replication"></a>
|
|
|
|
memcached sam w sobie nie obsługuje replikacji. Jeśli naprawdę jej potrzebujesz, musisz użyć rozwiązań firm trzecich:
|
|
|
|
- [repcached](http://repcached.lab.klab.org/): Replikacja multi-master asynchroniczna (zestaw poprawek memcached 1.2)
|
|
- [Couchbase memcached interface](http://www.couchbase.com/memcached): Użyj CouchBase jako zamiennika memcached
|
|
- [yrmcds](https://cybozu.github.io/yrmcds/): Zgodny z memcached magazyn kluczy i wartości Master-Slave
|
|
- [twemproxy](https://github.com/twitter/twemproxy) (znany również jako nutcracker): proxy z obsługą memcached
|
|
|
|
### Arkusz skrótów poleceń
|
|
|
|
{{#ref}}
|
|
memcache-commands.md
|
|
{{#endref}}
|
|
|
|
### **Shodan**
|
|
|
|
- `port:11211 "STAT pid"`
|
|
- `"STAT pid"`
|
|
|
|
## Odniesienia
|
|
|
|
- [https://lzone.de/cheat-sheet/memcached](https://lzone.de/cheat-sheet/memcached)
|
|
|
|
{{#include ../../banners/hacktricks-training.md}}
|