hacktricks/network-services-pentesting/11211-memcache
2024-05-02 15:18:24 +00:00
..
memcache-commands.md Translated ['binary-exploitation/rop-return-oriented-programing/ret2lib/ 2024-05-02 15:18:24 +00:00
README.md Translated ['network-services-pentesting/11211-memcache/README.md', 'net 2024-02-09 09:15:30 +00:00

11211 - Memcacheのペンテスト

**htARTEHackTricks AWS Red Team Expert**でAWSハッキングをゼロからヒーローまで学ぶ こちら

HackTricksをサポートする他の方法:

プロトコル情報

wikipediaから:

Memcached(発音: mem-cashed、mem-cash-deeは、一般的な分散メモリキャッシングシステムです。データとオブジェクトをRAMにキャッシュして外部データソースデータベースやAPIなどを読み取る回数を減らすことで、動的なデータベース駆動型のウェブサイトの高速化によく使用されます。

MemcachedはSASLをサポートしていますが、ほとんどのインスタンスは認証なしで公開されています。

デフォルトポート: 11211

PORT      STATE SERVICE
11211/tcp open  unknown

列挙

手動

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

Memcacheキーのダンプ

Memcacheの世界では、データをスラブで整理するプロトコルであるmemcacheには、格納されたデータを調査するための特定のコマンドが存在しますが、注目すべき制約があります。

  1. キーはスラブクラスごとにダンプすることができます。これは、コンテンツサイズが類似しているキーをグループ化します。
  2. 1つのスラブクラスごとに1ページの制限があり、これは1MBのデータに相当します。
  3. この機能は非公式であり、コミュニティフォーラムで議論されているように、いつでも廃止される可能性があります。

潜在的にギガバイトのデータから1MBしかダンプできないという制限は特に重要です。ただし、この機能は、特定のニーズに応じてキーの使用パターンに関する洞察を提供することができます。メカニクスにあまり興味がない人のためには、ツールセクションを訪れると、包括的なダンプのためのユーティリティが見つかります。また、memcachedセットアップとの直接対話のためにtelnetを使用するプロセスが以下に概説されています。

動作原理

Memcacheのメモリ構成は重要です。メモリキャッシュを"-vv"オプションで初期化すると、生成されるスラブクラスが表示されます。

$ 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
[...]

以下の出力は、アクティブなスラブタイプ、利用されているチャンク、および操作統計を示し、読み取りおよび書き込み操作の効率に関する洞察を提供します。

もう1つの便利なコマンド、「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

ダンピングツール

表はこちらから。

プログラミング言語 ツール 機能
PHP シンプルなスクリプト キー名を表示します。
Perl シンプルなスクリプト キーと値を表示します。
Ruby シンプルなスクリプト キー名を表示します。
Perl memdump CPANモジュール内のツール Memcached-libmemcached ached/)
PHP memcache.php キーをダンプすることも可能なMemcacheモニタリングGUI
libmemcached peep あなたのmemcachedプロセスをフリーズさせます!!! 本番環境で使用する際は注意してください。それでも、1MBの制限を回避し、本当にすべてのキーをダンプすることができます。

トラブルシューティング

1MBデータ制限

memcached 1.4以前では、デフォルトの最大スラブサイズのため、1MBを超えるオブジェクトを保存することはできません。

タイムアウトを30日を超える値に設定しないでください

許可された最大値よりも大きなタイムアウトでキーを「set」または「add」しようとすると、memcachedは値をUnixタイムスタンプとして扱うため、期待通りの結果が得られない可能性があります。また、タイムスタンプが過去の場合は何も行いません。コマンドは静かに失敗します。

したがって、最大の有効期限を使用したい場合は2592000を指定してください。例

set my_key 0 2592000 1
1

オーバーフロー時のキーの消失

ドキュメントには64ビットを超える値を「incr」を使用してオーバーフローさせると値が消えると記載されています。再度「add」/「set」を使用して作成する必要があります。

レプリケーション

memcached自体はレプリケーションをサポートしていません。本当に必要な場合は、以下のようなサードパーティーのソリューションを使用する必要があります

  • repcached: マルチマスター非同期レプリケーションmemcached 1.2パッチセット)
  • Couchbase memcached interface: CouchBaseをmemcachedの代替として使用
  • yrmcds: memcached互換のマスター・スレーブキー値ストア
  • twemproxy別名nutcracker: memcachedサポート付きのプロキシ

コマンドチートシート

{% content-ref url="memcache-commands.md" %} memcache-commands.md {% endcontent-ref %}

Shodan

  • port:11211 "STAT pid"
  • "STAT pid"

参考文献

ゼロからヒーローまでのAWSハッキングを学ぶ htARTEHackTricks AWS Red Team Expert

HackTricksをサポートする他の方法