23 KiB
11211 - Memcacheのペンテスト
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
- サイバーセキュリティ企業で働いていますか? HackTricksで会社を宣伝したいですか?または、PEASSの最新バージョンにアクセスしたり、HackTricksをPDFでダウンロードしたいですか?SUBSCRIPTION PLANSをチェックしてください!
- The PEASS Familyを見つけてください。独占的なNFTのコレクションです。
- 公式のPEASS&HackTricksのグッズを手に入れましょう。
- 💬 Discordグループまたはtelegramグループに参加するか、Twitterでフォローしてください🐦@carlospolopm。
- ハッキングのトリックを共有するには、PRを hacktricks repo と hacktricks-cloud repo に提出してください。
プロトコル情報
Memcached(発音:mem-cashed、mem-cash-dee)は、汎用の分散メモリキャッシュシステムです。データとオブジェクトをRAMにキャッシュして、外部データソース(データベースやAPIなど)の読み取り回数を減らすことで、動的なデータベース駆動型のウェブサイトの高速化によく使用されます。(wikipediaから)
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
このマニュアルでは、Memcachedサービスのペネトレーションテストについて説明します。
Memcachedとは?
Memcachedは、高速なキャッシュシステムであり、データベースやAPIなどのバックエンドサービスの負荷を軽減するために使用されます。Memcachedは、キーと値のペアをメモリ内に格納し、高速なデータの読み書きを可能にします。
Memcachedの脆弱性
Memcachedにはいくつかの脆弱性が存在します。以下にいくつかの一般的な脆弱性を示します。
-
デフォルトの設定では、Memcachedはネットワーク上のどのIPアドレスからでもアクセス可能です。これにより、悪意のあるユーザーがMemcachedにアクセスし、データを盗む可能性があります。
-
Memcachedはデフォルトで認証機能を持っていません。したがって、認証されていないユーザーがMemcachedにアクセスできる可能性があります。
-
MemcachedはデフォルトでUDPポート11211を使用します。UDPは信頼性が低く、パケットの改ざんやスプーフィングのリスクがあります。
Memcachedのペネトレーションテスト
Memcachedのペネトレーションテストでは、以下の手法を使用して脆弱性を特定します。
-
Memcachedのバージョン情報を取得するために、
stats
コマンドを使用します。 -
Memcachedに対してデータを送信し、その応答を監視することで、Memcachedの設定や構成を特定します。
-
Memcachedのデータをダンプするために、
stats cachedump
コマンドを使用します。 -
Memcachedのデータを改ざんするために、
set
コマンドを使用します。 -
Memcachedのデータを削除するために、
delete
コマンドを使用します。 -
Memcachedのサービスを停止するために、
shutdown
コマンドを使用します。
まとめ
Memcachedは高速なキャッシュシステムですが、デフォルトの設定ではセキュリティ上の脆弱性が存在します。ペネトレーションテストを実施することで、これらの脆弱性を特定し、適切な対策を講じることが重要です。
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)
自動
Memcached is an open-source, high-performance, distributed memory caching system. It is commonly used to speed up dynamic web applications by caching data and reducing the load on the database.
Memcached operates on a client-server model, where the client sends requests to the server to store or retrieve data. The server stores the data in memory, making it quickly accessible for future requests.
Memcached uses a simple protocol for communication, making it easy to interact with programmatically. It supports various data types, including strings, integers, and arrays.
When performing a penetration test on a system that uses Memcached, there are several techniques that can be used to exploit potential vulnerabilities. These include:
-
Memcached Injection: This technique involves injecting malicious commands into the Memcached server to execute arbitrary code or retrieve sensitive information.
-
Memcached Amplification: This technique involves sending a small request to the Memcached server, which in turn generates a large response. This can be used to launch a distributed denial-of-service (DDoS) attack by amplifying the traffic.
-
Memcached Reflection: This technique involves spoofing the source IP address and sending a request to the Memcached server, which then sends a response to the victim's IP address. This can be used to launch a DDoS attack by flooding the victim's network with traffic.
To protect against these attacks, it is important to secure the Memcached server by implementing proper access controls, such as firewall rules and authentication mechanisms. Additionally, it is recommended to keep the Memcached server updated with the latest security patches.
Overall, understanding the vulnerabilities and exploitation techniques associated with Memcached can help in identifying and mitigating potential risks in a system.
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キーのダンプ
もしもあなたのmemcachedのバージョンが1.4.31より上である場合は、キーをダンプするための高度な方法について次のセクションを読んでください。
memcacheプロトコルは、スラブ(特定のサイズ範囲のデータのカテゴリ)で組織されたデータを覗き見るためのコマンドを提供しています。ただし、いくつかの重要な制限があります:
- スラブクラスごとにキーをダンプすることしかできません(おおよそ同じコンテンツサイズを持つキー)
- スラブクラスごとに1ページしかダンプできません(1MBのデータ)
- これは非公式の機能であり、いつでも削除される可能性があります。
2番目の制限はおそらく最も厳しいものであり、数ギガバイトの1MBはほとんど何もありません。それでも、キーのサブセットの使用方法を確認するのに役立つ場合があります。ただし、これは使用ケースに依存するかもしれません。技術的な詳細に興味がない場合は、ツールセクションにスキップして、簡単にすべてをダンプできるツールについて学びます。または、以下のガイドに従って、telnetを使用してメモキャッシュのセットアップに対してコマンドを試してみてください。 動作原理 まず、memcacheがメモリをどのように組織しているかを知る必要があります。オプション「-vv」でmemcacheを起動すると、作成されるスラブクラスが表示されます。例えば、
$ memcached -vv
slab class 1: chunk size 96 perslab 10922
slab class 2: chunk size 120 perslab 8738
slab class 3: chunk size 152 perslab 6898
slab class 4: chunk size 192 perslab 5461
[...]
上記の設定では、memcacheは1MBのサイズの単一のスラブ(デフォルトで1MB)に121〜152バイトのデータを6898個保持します(6898*152)。現在存在するすべてのスラブを表示するには、次のコマンドを使用してください:
stats slabs
もしmemcached 1.4.13に空の状態で単一のキーを追加した場合、
set mykey 0 60 1
1
STORED
次に、「stats slabs」というコマンドの結果が表示されます。
stats slabs
STAT 1:chunk_size 96
STAT 1:chunks_per_page 10922
STAT 1:total_pages 1
STAT 1:total_chunks 10922
STAT 1:used_chunks 1
STAT 1:free_chunks 0
STAT 1:free_chunks_end 10921
STAT 1:mem_requested 71
STAT 1:get_hits 0
STAT 1:cmd_set 2
STAT 1:delete_hits 0
STAT 1:incr_hits 0
STAT 1:decr_hits 0
STAT 1:cas_hits 0
STAT 1:cas_badval 0
STAT 1:touch_hits 0
STAT active_slabs 1
STAT total_malloced 1048512
END
例では、アクティブなスラブタイプ#1が1つだけあることが示されています。私たちのキーはわずか1バイトの大きさであり、これは最小の可能なチャンクサイズに収まります。スラブの統計情報によると、現在スラブクラスのページは1つしか存在せず、チャンクも1つしか使用されていません。**最も重要なことは、各書き込み操作(set、incr、decr、cas、touch)とgetのためのカウンターが表示され、それらを使用してヒット率を判断できることです!**また、「stats items」を使用して、エビクションとメモリ不足のカウンターに関する興味深いカウンターの別のセットを取得することもできます。
stats items
STAT items:1:number 1
STAT items:1:age 4
STAT items:1:evicted 0
STAT items:1:evicted_nonzero 0
STAT items:1:evicted_time 0
STAT items:1:outofmemory 0
STAT items:1:tailrepairs 0
STAT items:1:reclaimed 0
STAT items:1:expired_unfetched 0
STAT items:1:evicted_unfetched 0
END
すでに推測できること... スラブクラスごとの統計情報を考慮すると、アプリケーションの動作について多くのことを推測することができます:
- 異なるコンテンツサイズに対するキャッシュの比率はどうですか?
- 大きなHTMLチャンクのキャッシュはどれくらい効果的ですか?
- 異なるコンテンツサイズにどれくらいのメモリを使用していますか?
- 単純な数値カウンターにどれくらいのメモリを使用していますか?
- セッションデータにどれくらいのメモリを使用していますか?
- 大きなHTMLチャンクにどれくらいのメモリを使用していますか?
- すべての大きなオブジェクトをキャッシュできますか?
もちろん、これらの質問に答えるためには、アプリケーションのキャッシュオブジェクトについて知る必要があります。では、キーをダンプする方法は? キーは、「stats cachedump」コマンドを使用してスラブクラスごとにダンプすることができます。
stats cachedump <slab class> <number of items to dump>
クラス#1で単一のキーをダンプするには、次のコマンドを実行します。
stats cachedump 1 1000
ITEM mykey [1 b; 1350677968 s]
END
「cachedump」は1行ごとに1つのアイテムを返します。中括弧内の最初の数字はバイト単位のサイズを示し、2番目の数字は作成時のタイムスタンプです。キー名がわかっている場合、その値をダンプすることもできます。
get mykey
VALUE mykey 0 1
1
END
これで終わりです:必要なすべてのスラブクラスを反復処理し、キー名を抽出し、必要な場合は内容をダンプします。
MEMCACHEキーのダンプ(バージョン1.4.31以上)
memcacheバージョン1.4.31以上では、メモリキーをノンブロッキングモードでダンプするための新しいコマンドがあります(https://github.com/memcached/memcached/wiki/ReleaseNotes1431を参照)。この方法は、本番環境で安全に実行できます。出力は一貫性がありませんが、キーとその正確な有効期限(EXP)および最終アクセス時刻(LA)を見つけるのに十分です。生成される出力が非常に大きいため、「nc」コマンドを使用することを推奨します。例:
echo 'lru_crawler metadump all' | nc 127.0.0.1 11211 | head -1
key=0dLLX%253Amemcache_test_key exp=1590718787 la=1590718487 cas=2238881166 fetch=yes
echo 'lru_crawler metadump all' | nc 127.0.0.1 11211 | grep ee6ba58566e234ccbbce13f9a24f9a28
key=VQRFX%253Aee6ba58566e234ccbbce13f9a24f9a28 exp=-1 la=1590386157 cas=1776204003 fetch=yes
key=0dLLX%253Aee6ba58566e234ccbbce13f9a24f9a28 exp=-1 la=1590712292 cas=2225524871 fetch=yes
EXP=-1はアイテムが期限切れにならないことを意味します。EXP=1590718787(2020年5月29日02:19:47 GMT)は、アイテムの期限が切れるべきUNIXタイムスタンプを保持します。LA=1590712292(2020年5月25日05:55:57 GMT)は、アイテムが最後にアクセスされたUNIXタイムスタンプを保持します。
ダンピングツール
印刷メモリキーをサポートするさまざまなダンピングツール(スクリプト)があります。
プログラミング言語 | ツール | 機能 | ||
---|---|---|---|---|
PHP | シンプルなスクリプト | キー名を印刷します。 | ||
Perl | シンプルなスクリプト | キーと値を印刷します。 | ||
Ruby | シンプルなスクリプト | キー名を印刷します。 | ||
Perl | memdump | CPANモジュールのツール | Memcached-libmemcached | ached/) |
PHP | memcache.php | キーをダンプすることも可能なMemcacheモニタリングGUI | ||
libmemcached | peep | メモリキャッシュプロセスを凍結します! 本番環境で使用する際は注意してください。それでも、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"
参考文献
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
- サイバーセキュリティ企業で働いていますか? HackTricksで会社を宣伝したいですか?または、PEASSの最新バージョンやHackTricksのPDFをダウンロードしたいですか?SUBSCRIPTION PLANSをチェックしてください!
- The PEASS Familyを発見しましょう、独占的なNFTのコレクションです
- 公式のPEASS&HackTricksのグッズを手に入れましょう
- 💬 Discordグループまたはtelegramグループに参加するか、Twitter 🐦@carlospolopmをフォローしてください。
- ハッキングのトリックを共有するには、hacktricks repo と hacktricks-cloud repo にPRを提出してください。