13 KiB
11211 - Memcache 펜테스팅
{% hint style="success" %}
AWS 해킹 배우기 및 연습하기:HackTricks Training AWS Red Team Expert (ARTE)
GCP 해킹 배우기 및 연습하기: HackTricks Training GCP Red Team Expert (GRTE)
HackTricks 지원하기
- 구독 계획 확인하기!
- **💬 Discord 그룹 또는 텔레그램 그룹에 참여하거나 Twitter 🐦 @hacktricks_live를 팔로우하세요.
- 해킹 트릭을 공유하려면 HackTricks 및 HackTricks Cloud 깃허브 리포지토리에 PR을 제출하세요.
프로토콜 정보
wikipedia에서:
Memcached (발음: mem-cashed, mem-cash-dee)는 일반 목적의 분산 메모리 캐싱 시스템입니다. 데이터와 객체를 RAM에 캐싱하여 외부 데이터 소스(예: 데이터베이스 또는 API)를 읽어야 하는 횟수를 줄임으로써 동적 데이터베이스 기반 웹사이트의 속도를 높이는 데 자주 사용됩니다.
Memcached는 SASL을 지원하지만, 대부분의 인스턴스는 인증 없이 노출되어 있습니다.
기본 포트: 11211
PORT STATE SERVICE
11211/tcp open unknown
Enumeration
Manual
memcache 인스턴스에 저장된 모든 정보를 추출하려면 다음을 수행해야 합니다:
- 활성 항목이 있는 슬랩 찾기
- 이전에 감지된 슬랩의 키 이름 가져오기
- 키 이름을 가져와서 저장된 데이터를 추출하기
이 서비스는 단지 캐시라는 점을 기억하세요, 그래서 데이터가 나타나고 사라질 수 있습니다.
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 영역에서, 데이터를 슬랩으로 조직하는 데 도움을 주는 프로토콜로, 저장된 데이터를 검사하기 위한 특정 명령이 존재하지만, 주목할 만한 제약이 있습니다:
- 키는 슬랩 클래스별로만 덤프할 수 있으며, 유사한 콘텐츠 크기의 키를 그룹화합니다.
- 슬랩 클래스당 한 페이지의 제한이 있으며, 이는 1MB의 데이터에 해당합니다.
- 이 기능은 비공식적이며, 언제든지 중단될 수 있습니다. 이는 커뮤니티 포럼에서 논의되었습니다.
잠재적으로 기가바이트의 데이터에서 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 Languages | Tools | Functionality | ||
---|---|---|---|---|
PHP | simple script | 키 이름을 출력합니다. | ||
Perl | simple script | 키와 값을 출력합니다. | ||
Ruby | simple script | 키 이름을 출력합니다. | ||
Perl | memdump | CPAN 모듈의 도구 | Memcached-libmemcached | ached/) |
PHP | memcache.php | 키 덤프를 허용하는 Memcache 모니터링 GUI | ||
libmemcached | peep | 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
{% content-ref url="memcache-commands.md" %} memcache-commands.md {% endcontent-ref %}
Shodan
port:11211 "STAT pid"
"STAT pid"
References
{% hint style="success" %}
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Support HackTricks
- Check the subscription plans!
- Join the 💬 Discord group or the telegram group or follow us on Twitter 🐦 @hacktricks_live.
- Share hacking tricks by submitting PRs to the HackTricks and HackTricks Cloud github repos.