# 11211 - Memcache 펜테스팅 {{#include ../../banners/hacktricks-training.md}} ## 프로토콜 정보 From [wikipedia](https://en.wikipedia.org/wiki/Memcached): > **Memcached** (발음: mem-cashed, mem-cash-dee)는 일반 목적의 분산 [메모리 캐싱](https://en.wikipedia.org/wiki/Memory_caching) 시스템입니다. 데이터와 객체를 RAM에 캐시하여 외부 데이터 소스(예: 데이터베이스 또는 API)를 읽어야 하는 횟수를 줄임으로써 동적 데이터베이스 기반 웹사이트의 속도를 높이는 데 자주 사용됩니다. Memcached는 SASL을 지원하지만, 대부분의 인스턴스는 **인증 없이 노출되어 있습니다**. **기본 포트:** 11211 ``` PORT STATE SERVICE 11211/tcp open unknown ``` ## Enumeration ### Manual memcache 인스턴스에 저장된 모든 정보를 유출하려면 다음을 수행해야 합니다: 1. **활성 항목**이 있는 **슬랩** 찾기 2. 이전에 감지된 슬랩의 **키 이름** 가져오기 3. **키 이름**을 사용하여 **저장된 데이터** 유출하기 이 서비스는 단지 **캐시**라는 점을 기억하세요, 그래서 **데이터가 나타나고 사라질 수 있습니다**. ```bash echo "version" | nc -vn -w 1 11211 #Get version echo "stats" | nc -vn -w 1 11211 #Get status echo "stats slabs" | nc -vn -w 1 11211 #Get slabs echo "stats items" | nc -vn -w 1 11211 #Get items of slabs with info echo "stats cachedump 0" | nc -vn -w 1 11211 #Get key names (the 0 is for unlimited output size) echo "get " | nc -vn -w 1 11211 #Get saved info #This php will just dump the keys, you need to use "get later" sudo apt-get install php-memcached php -r '$c = new Memcached(); $c->addServer("localhost", 11211); var_dump( $c->getAllKeys() );' ``` ### 수동2 ```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 #Get info inside the item(s) ``` ### 자동화 ```bash nmap -n -sV --script memcached-info -p 11211 #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 키 덤프하기** memcache 영역에서는 데이터를 슬랩으로 정리하는 프로토콜로, 저장된 데이터를 검사하기 위한 특정 명령이 존재하지만, 주목할 만한 제약이 있습니다: 1. 키는 슬랩 클래스별로만 덤프할 수 있으며, 유사한 콘텐츠 크기의 키를 그룹화합니다. 2. 슬랩 클래스당 한 페이지의 제한이 있으며, 이는 1MB의 데이터에 해당합니다. 3. 이 기능은 비공식적이며 언제든지 중단될 수 있습니다. 이는 [커뮤니티 포럼](https://groups.google.com/forum/?fromgroups=#!topic/memcached/1-T8I-RVGKM)에서 논의되었습니다. 잠재적으로 기가바이트의 데이터에서 1MB만 덤프할 수 있다는 제한은 특히 중요합니다. 그러나 이 기능은 특정 요구에 따라 키 사용 패턴에 대한 통찰을 제공할 수 있습니다. 메커니즘에 덜 관심이 있는 경우, [도구 섹션](https://lzone.de/cheat-sheet/memcached#tools)을 방문하면 포괄적인 덤프를 위한 유틸리티를 확인할 수 있습니다. 또는 memcached 설정과의 직접 상호작용을 위한 telnet 사용 과정은 아래에 설명되어 있습니다. ### **작동 방식** Memcache의 메모리 조직은 중요합니다. "-vv" 옵션으로 memcache를 시작하면 생성되는 슬랩 클래스를 확인할 수 있습니다. ```bash $ memcached -vv slab class 1: chunk size 96 perslab 10922 [...] ``` 현재 존재하는 모든 슬랩을 표시하려면 다음 명령을 사용합니다: ```bash stats slabs ``` memcached 1.4.13에 단일 키를 추가하면 슬랩 클래스가 어떻게 채워지고 관리되는지를 보여줍니다. 예를 들어: ```bash set mykey 0 60 1 1 STORED ``` "stats slabs" 명령을 키 추가 후 실행하면 슬랩 활용에 대한 자세한 통계를 제공합니다: ```bash stats slabs [...] ``` 이 출력은 활성 슬랩 유형, 사용된 청크 및 운영 통계를 보여주며, 읽기 및 쓰기 작업의 효율성에 대한 통찰을 제공합니다. 또 다른 유용한 명령어인 "stats items"는 퇴출, 메모리 제약 및 항목 생애 주기에 대한 데이터를 제공합니다: ```bash stats items [...] ``` 이 통계는 애플리케이션 캐싱 동작에 대한 교육적인 가정을 가능하게 하며, 여기에는 다양한 콘텐츠 크기에 대한 캐시 효율성, 메모리 할당 및 대형 객체 캐싱 용량이 포함됩니다. ### **키 덤프하기** 버전 1.4.31 이전에서는 키가 슬랩 클래스별로 덤프됩니다: ```bash stats cachedump ``` 예를 들어, 클래스 #1에서 키를 덤프하려면: ```bash stats cachedump 1 1000 ITEM mykey [1 b; 1350677968 s] END ``` 이 방법은 슬랩 클래스를 반복하여 키 값을 추출하고 선택적으로 덤프합니다. ### **MEMCACHE 키 덤프 (VER 1.4.31+)** memcache 버전 1.4.31 이상에서는 프로덕션 환경에서 키를 덤프하기 위한 새로운 안전한 방법이 도입되었으며, 이는 [릴리스 노트](https://github.com/memcached/memcached/wiki/ReleaseNotes1431)에서 자세히 설명된 비차단 모드를 활용합니다. 이 접근 방식은 방대한 출력을 생성하므로 효율성을 위해 'nc' 명령을 사용하는 것이 권장됩니다. 예시로는: ```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 ``` ### **DUMPING TOOLS** Table [from here](https://lzone.de/blog). | Programming Languages | Tools | Functionality | | | | --------------------- | --------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------- | ------- | | PHP | [simple script](http://snipt.org/xtP) | 키 이름을 출력합니다. | | | | Perl | [simple script](https://wiki.jasig.org/download/attachments/13572172/memcached-clean.pl?version=1&modificationDate=1229693957401) | 키와 값을 출력합니다. | | | | Ruby | [simple script](https://gist.github.com/1365005) | 키 이름을 출력합니다. | | | | Perl | [memdump](https://search.cpan.org/~dmaki/Memcached-libmemcached-0.4202/src/libmemcached/docs/memdump.pod) | 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/) | 키 덤프도 가능한 Memcache 모니터링 GUI | | | | libmemcached | [peep](http://blog.evanweaver.com/2009/04/20/peeping-into-memcached/) | **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](http://repcached.lab.klab.org/): 다중 마스터 비동기 복제 (memcached 1.2 패치 세트) - [Couchbase memcached interface](http://www.couchbase.com/memcached): CouchBase를 memcached 드롭인으로 사용 - [yrmcds](https://cybozu.github.io/yrmcds/): memcached 호환 마스터-슬레이브 키 값 저장소 - [twemproxy](https://github.com/twitter/twemproxy) (aka nutcracker): memcached 지원 프록시 ### Commands Cheat-Sheet {{#ref}} memcache-commands.md {{#endref}} ### **Shodan** - `port:11211 "STAT pid"` - `"STAT pid"` ## References - [https://lzone.de/cheat-sheet/memcached](https://lzone.de/cheat-sheet/memcached) {{#include ../../banners/hacktricks-training.md}}