11211 - Pentesting Memcache

Reading time: 7 minutes

tip

Ucz się i ćwicz AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i ćwicz GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Wsparcie HackTricks

Informacje o protokole

Z wikipedia:

Memcached (wymowa: mem-cashed, mem-cash-dee) to ogólny, rozproszony system cache'owania pamięci. 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.

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 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. 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.

Języki programowaniaNarzędziaFunkcjonalność
PHPprosty skryptWyświetla nazwy kluczy.
Perlprosty skryptWyświetla klucze i wartości
Rubyprosty skryptWyświetla nazwy kluczy.
PerlmemdumpNarzędzie w module CPANMemcached-libmemcachedached/)
PHPmemcache.phpGUI do monitorowania Memcache, która również pozwala na zrzut kluczy
libmemcachedpeepZamraż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

Limit danych 1MB

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!

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

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

memcached sam w sobie nie obsługuje replikacji. Jeśli naprawdę jej potrzebujesz, musisz użyć rozwiązań firm trzecich:

  • repcached: Replikacja multi-master asynchroniczna (zestaw poprawek memcached 1.2)
  • Couchbase memcached interface: Użyj CouchBase jako zamiennika memcached
  • yrmcds: Zgodny z memcached magazyn kluczy i wartości Master-Slave
  • 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

tip

Ucz się i ćwicz AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i ćwicz GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Wsparcie HackTricks