mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
175 lines
11 KiB
Markdown
175 lines
11 KiB
Markdown
# 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 <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
|
|
```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)
|
|
```
|
|
### 자동화
|
|
```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
|
|
```
|
|
## **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 <slab class> <number of items to dump>
|
|
```
|
|
예를 들어, 클래스 #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 <a href="#troubleshooting" id="troubleshooting"></a>
|
|
|
|
### 1MB Data Limit <a href="#1mb-data-limit" id="1mb-data-limit"></a>
|
|
|
|
memcached 1.4 이전에는 기본 최대 슬랩 크기로 인해 1MB보다 큰 객체를 저장할 수 없습니다.
|
|
|
|
### Never Set a Timeout > 30 Days! <a href="#never-set-a-timeout--30-days" id="never-set-a-timeout--30-days"></a>
|
|
|
|
허용된 최대값보다 큰 타임아웃으로 키를 “설정”하거나 “추가”하려고 하면 memcached가 값을 Unix 타임스탬프로 처리하기 때문에 예상한 대로 되지 않을 수 있습니다. 또한 타임스탬프가 과거에 있으면 아무 작업도 수행하지 않습니다. 명령이 조용히 실패합니다.
|
|
|
|
따라서 최대 수명을 사용하려면 2592000을 지정하세요. 예:
|
|
```
|
|
set my_key 0 2592000 1
|
|
1
|
|
```
|
|
### Disappearing Keys on Overflow <a href="#disappearing-keys-on-overflow" id="disappearing-keys-on-overflow"></a>
|
|
|
|
문서에서는 “incr”를 사용하여 64비트 값이 오버플로우될 때 값이 사라진다고 언급하고 있습니다. 다시 “add”/”set”을 사용하여 생성해야 합니다.
|
|
|
|
### Replication <a href="#replication" id="replication"></a>
|
|
|
|
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}}
|