11211 - Pentesting Memcache

HackTricks 지원하기

프로토콜 정보

wikipedia에서:

Memcached (발음: mem-cashed, mem-cash-dee)는 일반 목적의 분산 메모리 캐싱 시스템입니다. 데이터와 객체를 RAM에 캐싱하여 외부 데이터 소스(예: 데이터베이스 또는 API)를 읽어야 하는 횟수를 줄임으로써 동적 데이터베이스 기반 웹사이트의 속도를 높이는 데 자주 사용됩니다.

Memcached는 SASL을 지원하지만, 대부분의 인스턴스는 인증 없이 노출되어 있습니다.

기본 포트: 11211

PORT      STATE SERVICE
11211/tcp open  unknown

Enumeration

Manual

memcache 인스턴스에 저장된 모든 정보를 추출하려면 다음을 수행해야 합니다:

  1. 활성 항목이 있는 슬랩 찾기

  2. 이전에 감지된 슬랩의 키 이름 가져오기

  3. 키 이름을 가져와서 저장된 데이터를 추출하기

이 서비스는 단지 캐시라는 점을 기억하세요, 그래서 데이터가 나타나고 사라질 수 있습니다.

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() );'

매뉴얼2

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)

자동화

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

Dumping Memcache Keys

memcache 영역에서, 데이터를 슬랩으로 조직하는 데 도움을 주는 프로토콜로, 저장된 데이터를 검사하기 위한 특정 명령이 존재하지만, 주목할 만한 제약이 있습니다:

  1. 키는 슬랩 클래스별로만 덤프할 수 있으며, 유사한 콘텐츠 크기의 키를 그룹화합니다.

  2. 슬랩 클래스당 한 페이지의 제한이 있으며, 이는 1MB의 데이터에 해당합니다.

  3. 이 기능은 비공식적이며, 언제든지 중단될 수 있습니다. 이는 커뮤니티 포럼에서 논의되었습니다.

잠재적으로 기가바이트의 데이터에서 1MB만 덤프할 수 있다는 제한은 특히 중요합니다. 그러나 이 기능은 특정 요구 사항에 따라 키 사용 패턴에 대한 통찰력을 제공할 수 있습니다. 메커니즘에 덜 관심이 있는 경우, 도구 섹션을 방문하면 포괄적인 덤프를 위한 유틸리티를 확인할 수 있습니다. 또는, memcached 설정과의 직접 상호작용을 위한 telnet 사용 과정은 아래에 설명되어 있습니다.

How it Works

memcache의 메모리 조직은 중요합니다. "-vv" 옵션으로 memcache를 시작하면 생성된 슬랩 클래스를 확인할 수 있습니다.

$ memcached -vv
slab class   1: chunk size        96 perslab   10922
[...]

현재 존재하는 모든 슬랩을 표시하려면 다음 명령을 사용합니다:

stats slabs

memcached 1.4.13에 단일 키를 추가하는 것은 슬랩 클래스가 어떻게 채워지고 관리되는지를 보여줍니다. 예를 들어:

set mykey 0 60 1
1
STORED

"stats slabs" 명령을 키 추가 후 실행하면 슬랩 활용에 대한 자세한 통계를 제공합니다:

stats slabs
[...]

이 출력은 활성 슬랩 유형, 사용된 청크 및 운영 통계를 보여주며, 읽기 및 쓰기 작업의 효율성에 대한 통찰력을 제공합니다.

또 다른 유용한 명령어인 "stats items"는 퇴출, 메모리 제약 및 항목 생애 주기에 대한 데이터를 제공합니다:

stats items
[...]

이 통계는 다양한 콘텐츠 크기에 대한 캐시 효율성, 메모리 할당 및 대형 객체 캐싱 용량을 포함하여 애플리케이션 캐싱 동작에 대한 교육된 가정을 가능하게 합니다.

키 덤프하기

1.4.31 이전 버전에서는 키가 슬랩 클래스별로 덤프됩니다:

stats cachedump <slab class> <number of items to dump>

예를 들어, 클래스 #1에서 키를 덤프하려면:

stats cachedump 1 1000
ITEM mykey [1 b; 1350677968 s]
END

이 방법은 슬랩 클래스를 반복하여 키 값을 추출하고 선택적으로 덤프합니다.

MEMCACHE 키 덤프 (VER 1.4.31+)

memcache 버전 1.4.31 이상에서는 프로덕션 환경에서 키를 덤프하기 위한 새로운 안전한 방법이 도입되었으며, 이는 릴리스 노트에서 자세히 설명된 비차단 모드를 활용합니다. 이 접근 방식은 방대한 출력을 생성하므로 효율성을 위해 'nc' 명령을 사용하는 것이 권장됩니다. 예시로는:

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 LanguagesToolsFunctionality

PHP

키 이름을 출력합니다.

Perl

키와 값을 출력합니다.

Ruby

키 이름을 출력합니다.

Perl

CPAN 모듈의 도구

ached/)

PHP

키 덤프를 허용하는 Memcache 모니터링 GUI

libmemcached

memcached 프로세스를 중단시킵니다!!! 프로덕션에서 사용할 때 주의하세요. 여전히 사용하면 1MB 제한을 우회하고 모든 키를 덤프할 수 있습니다.

Troubleshooting

1MB Data Limit

memcached 1.4 이전에는 기본 최대 슬랩 크기로 인해 1MB보다 큰 객체를 저장할 수 없습니다.

Never Set a Timeout > 30 Days!

허용된 최대값보다 큰 타임아웃으로 키를 “설정”하거나 “추가”하려고 하면 memcached가 값을 Unix 타임스탬프로 처리하기 때문에 예상한 대로 되지 않을 수 있습니다. 또한 타임스탬프가 과거에 있으면 아무 작업도 수행하지 않습니다. 명령이 조용히 실패합니다.

따라서 최대 수명을 사용하려면 2592000을 지정하세요. 예:

set my_key 0 2592000 1
1

Disappearing Keys on Overflow

문서에서는 “incr”를 사용하여 64비트 값이 오버플로우되면 값이 사라진다고 언급하고 있습니다. 다시 “add”/”set”을 사용하여 생성해야 합니다.

Replication

memcached 자체는 복제를 지원하지 않습니다. 정말 필요하다면 3rd party 솔루션을 사용해야 합니다:

  • repcached: 다중 마스터 비동기 복제 (memcached 1.2 패치 세트)

  • Couchbase memcached interface: CouchBase를 memcached 드롭인으로 사용

  • yrmcds: memcached 호환 마스터-슬레이브 키 값 저장소

  • twemproxy (aka nutcracker): memcached 지원 프록시

Commands Cheat-Sheet

Memcache Commands

Shodan

  • port:11211 "STAT pid"

  • "STAT pid"

References

Support HackTricks

Last updated