11211 - Memcacheのペンテスト
Reading time: 12 minutes
tip
AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE)
Azureハッキングを学び、実践する:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricksをサポートする
- サブスクリプションプランを確認してください!
- **💬 Discordグループまたはテレグラムグループに参加するか、Twitter 🐦 @hacktricks_liveをフォローしてください。
- HackTricksおよびHackTricks CloudのGitHubリポジトリにPRを提出してハッキングトリックを共有してください。
プロトコル情報
ウィキペディアから:
Memcached(発音: mem-cashed, mem-cash-dee)は、一般的な分散型のメモリキャッシングシステムです。データとオブジェクトをRAMにキャッシュすることで、外部データソース(データベースやAPIなど)を読み取る回数を減らし、動的なデータベース駆動のウェブサイトの速度を向上させるためにしばしば使用されます。
MemcachedはSASLをサポートしていますが、ほとんどのインスタンスは認証なしで公開されています。
デフォルトポート: 11211
PORT STATE SERVICE
11211/tcp open unknown
列挙
手動
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
Memcacheキーのダンプ
memcacheの領域では、データをスラブによって整理するのを助けるプロトコルであり、保存されたデータを検査するための特定のコマンドが存在しますが、顕著な制約があります:
- キーはスラブクラスごとにのみダンプでき、同様のコンテンツサイズのキーをグループ化します。
- スラブクラスごとに1ページの制限があり、これは1MBのデータに相当します。
- この機能は公式ではなく、いつでも中止される可能性があるため、コミュニティフォーラムで議論されています。
数ギガバイトのデータから1MBしかダンプできないという制限は特に重要です。しかし、この機能は特定のニーズに応じてキーの使用パターンに関する洞察を提供することができます。メカニクスにあまり興味がない方は、ツールセクションを訪れると、包括的なダンプのためのユーティリティが見つかります。あるいは、memcachedセットアップとの直接的な対話のためにtelnetを使用するプロセスは以下に示されています。
動作の仕組み
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
ダンプツール
Table from here.
プログラミング言語 | ツール | 機能 | ||
---|---|---|---|---|
PHP | simple script | キー名を表示します。 | ||
Perl | simple script | キーと値を表示します。 | ||
Ruby | simple script | キー名を表示します。 | ||
Perl | memdump | CPANモジュールのツール | Memcached-libmemcached | ached/) |
PHP | memcache.php | キーのダンプも可能なMemcacheモニタリングGUI | ||
libmemcached | peep | memcachedプロセスをフリーズさせます!!! 本番環境で使用する際は注意してください。それでも使用することで1MBの制限を回避し、すべてのキーをダンプできます。 |
トラブルシューティング
1MBデータ制限
memcached 1.4以前では、デフォルトの最大スラブサイズのため、1MBを超えるオブジェクトを保存できないことに注意してください。
タイムアウトを30日以上に設定しないでください!
許可された最大値を超えるタイムアウトでキーを「設定」または「追加」しようとすると、memcachedはその値をUnixタイムスタンプとして扱うため、期待通りの結果が得られない場合があります。また、タイムスタンプが過去の場合、何も行われません。コマンドは静かに失敗します。
したがって、最大の寿命を使用したい場合は、2592000を指定してください。例:
set my_key 0 2592000 1
1
オーバーフロー時の消失キー
ドキュメントには、64ビットのオーバーフロー値を「incr」を使用してラップすると値が消えると記載されています。再度「add」/「set」を使用して作成する必要があります。
レプリケーション
memcached自体はレプリケーションをサポートしていません。どうしても必要な場合は、サードパーティのソリューションを使用する必要があります:
- repcached: マルチマスター非同期レプリケーション(memcached 1.2パッチセット)
- Couchbase memcachedインターフェース: CouchBaseをmemcachedのドロップインとして使用
- yrmcds: memcached互換のマスター-スレーブキー値ストア
- twemproxy (別名nutcracker): memcachedサポートのプロキシ
コマンドチートシート
Shodan
port:11211 "STAT pid"
"STAT pid"
参考文献
tip
AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE)
Azureハッキングを学び、実践する:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricksをサポートする
- サブスクリプションプランを確認してください!
- **💬 Discordグループまたはテレグラムグループに参加するか、Twitter 🐦 @hacktricks_liveをフォローしてください。
- HackTricksおよびHackTricks CloudのGitHubリポジトリにPRを提出してハッキングトリックを共有してください。