6379 - Pentesting Redis
経験豊富なハッカーやバグバウンティハンターとコミュニケーションを取るためにHackenProof Discordサーバーに参加しましょう!
ハッキングの洞察 ハッキングのスリルとチャレンジに深く入り込むコンテンツに参加する
リアルタイムハックニュース リアルタイムのニュースと洞察を通じて、ハッキングの世界のペースに遅れずについていく
最新のアナウンス 最新のバグバウンティの開始や重要なプラットフォームのアップデートについての情報を入手する
**Discordに参加して、今日からトップハッカーと協力を始めましょう!
基本情報
ドキュメントによると、Redisはオープンソース(BSDライセンス)、インメモリデータ構造ストアとして使用されるデータベース、キャッシュ、メッセージブローカーです。
デフォルトでは、Redisはプレーンテキストベースのプロトコルを使用しますが、ssl/tlsも実装できることに注意する必要があります。ここでRedisをssl/tlsで実行する方法を学びます。
デフォルトポート: 6379
自動列挙
いくつかの自動化ツールが、Redisインスタンスから情報を取得するのに役立つことがあります:
マニュアル列挙
バナー
Redisはテキストベースのプロトコルです。ソケットにコマンドを送信するだけで、返される値は読み取れます。また、Redisはssl/tlsを使用して実行することもできます(しかし、これは非常に珍しいです)。
通常のRedisインスタンスでは、nc
を使用して接続するか、redis-cli
を使用することもできます:
最初に試すことができるコマンドは**info
**です。これはRedisインスタンスの情報を出力するか、以下のような情報が返される可能性があります:
Redis 認証
デフォルトでは、Redis には資格情報がなくアクセスできます。ただし、パスワードのみ、またはユーザー名 + パスワードをサポートするように構成することができます。
requirepass
パラメータを使用して redis.conf ファイルにパスワードを設定することが可能です。また、サービスが再起動するまで一時的に接続して実行することもできます: config set requirepass p@ss$12E45
。
また、redis.conf ファイル内の masteruser
パラメータでユーザー名を構成することもできます。
パスワードのみが構成されている場合、使用されるユーザー名は "default" です。 また、Redis がパスワードのみかユーザー名+パスワードで構成されているかを外部から見つける方法はありません。
このようなケースでは、Redis とやり取りするために有効な資格情報を見つける必要があります。それを総当たり攻撃してみることができます。 有効な資格情報を見つけた場合は、接続を確立した後にセッションに認証する必要があります。
有効な資格情報 は次のように応答されます: +OK
認証された列挙
Redisサーバーが匿名接続を許可している場合、または有効な資格情報を取得している場合、次のコマンドを使用してサービスの列挙プロセスを開始できます:
その他のRedisコマンドはこちらで見つけることができ、こちらでも見つけることができます。
RedisインスタンスのRedisコマンドは、redis.confファイルで名前を変更したり削除したりすることができます。例えば、次の行はFLUSHDBコマンドを削除します:
よりセキュアにRedisサービスを設定する詳細はこちら:https://www.digitalocean.com/community/tutorials/how-to-install-and-secure-redis-on-ubuntu-18-04
また、実行されたRedisコマンドをリアルタイムで監視することもできます。コマンドは**monitor
です。または、slowlog get 25
で上位25件の遅いクエリ**を取得できます。
さらに興味深い情報を見つけるには、こちらを参照してください:https://lzone.de/cheat-sheet/Redis
データベースのダンプ
Redis内ではデータベースは0から始まる番号です。コマンドinfo
の出力の中で使用されているかどうかを見つけることができます。これは"Keyspace"のセクションにあります:
または、すべてのキースペース(データベース)を取得することもできます:
その例では、データベース0と1が使用されています。データベース0には4つのキーが含まれ、データベース1には1つのキーが含まれています。デフォルトでは、Redisはデータベース0を使用します。例えばデータベース1をダンプするには、次のようにします:
エラー-WRONGTYPE Operation against a key holding the wrong kind of value
が表示された場合、GET <KEY>
を実行しているときは、キーが文字列や整数以外のものであり、それを表示するためには特別な演算子が必要です。
キーのタイプを知るには、TYPE
コマンドを使用します。以下はリストとハッシュキーの例です。
npmを使用してデータベースをダンプする redis-dump またはPython redis-utils
HackenProof Discord サーバーに参加して、経験豊富なハッカーやバグバウンティハンターとコミュニケーションを取りましょう!
ハッキングの洞察 ハッキングのスリルとチャレンジに深く入り込むコンテンツに参加
リアルタイムハックニュース リアルタイムのニュースと洞察を通じて、ハッキングの世界を追いかける
最新のお知らせ 最新のバグバウンティの開始や重要なプラットフォームのアップデートに関する情報を入手
Discord に参加して、今日からトップハッカーと協力を始めましょう!
Redis RCE
インタラクティブシェル
redis-rogue-server はRedis(<=5.0.5)で自動的にインタラクティブシェルまたはリバースシェルを取得できます。
PHP Webshell
情報はこちらから。ウェブサイトフォルダーのパスを知っている必要があります。
テンプレートWebshell
前のセクションと同様に、テンプレートエンジンによって解釈されるいくつかのHTMLテンプレートファイルを上書きしてシェルを取得することもできます。
たとえば、次のこの解説を参照してください。攻撃者はnunjucksテンプレートエンジンによって解釈されるHTMLにrevシェルをインジェクトしました。
複数のテンプレートエンジンがテンプレートをメモリにキャッシュするため、それらを上書きしても新しいものは実行されません。この場合、開発者が自動リロードを有効にしたままにしているか、サービスにDoSを実行する必要があります(そしてそれが自動的に再起動されることを期待する必要があります)。
SSH
例はこちら
config get dir
の結果は他の手動の攻撃コマンドの後に変更される可能性があることに注意してください。Redisにログインした直後にこれを実行することをお勧めします。config get dir
の出力には、redisユーザーのホーム(通常は_/var/lib/redis_または_/home/redis/.ssh_)が見つかり、これを知ることでauthenticated_users
ファイルを書き込んでssh経由でredisユーザーとしてアクセスできる場所がわかります。書き込み権限を持つ他の有効なユーザーのホームを知っている場合は、それも悪用できます:
PCでsshの公開鍵と秘密鍵のペアを生成します:
ssh-keygen -t rsa
公開鍵をファイルに書き込みます:
(echo -e "\n\n"; cat ~/id_rsa.pub; echo -e "\n\n") > spaced_key.txt
ファイルをRedisにインポートします:
cat spaced_key.txt | redis-cli -h 10.85.0.52 -x set ssh_key
公開鍵をRedisサーバーのauthorized_keysファイルに保存します:
最後に、プライベートキーを使用してredisサーバーにsshで接続できます:ssh -i id_rsa redis@10.85.0.52
このテクニックはこちらで自動化されています: https://github.com/Avinash-acid/Redis-Server-Exploit
Crontab
最後の例はUbuntu向けですが、Centos向けのコマンドは次のようになります:redis-cli -h 10.85.0.52 config set dir /var/spool/cron/
この方法はビットコインを稼ぐためにも使用できます:yam
Redisモジュールの読み込み
https://github.com/n0b0dyCN/RedisModules-ExecuteCommandの指示に従い、任意のコマンドを実行するRedisモジュールをコンパイルできます。
次に、コンパイルされたモジュールをアップロードする方法が必要です。
ランタイムでアップロードされたモジュールを
MODULE LOAD /path/to/mymodule.so
で読み込みます。正しく読み込まれたかを確認するために読み込まれたモジュールをリストします:
MODULE LIST
コマンドを実行します:
必要に応じてモジュールをアンロードします:
MODULE UNLOAD mymodule
LUAサンドボックス回避
こちらで、RedisはLuaコードをサンドボックス化して実行するためにEVALコマンドを使用していることがわかります。リンク先の投稿では、dofile関数を使用してこれを悪用する方法が示されていますが、おそらくこれはもはや可能ではありません。とにかく、Luaサンドボックスをバイパスできれば、システム上で任意のコマンドを実行できます。同じ投稿から、DoSを引き起こすいくつかのオプションも確認できます。
Luaサンドボックスから脱出するためのいくつかのCVE:
マスタースレーブモジュール
マスターレディスでは、すべての操作が自動的にスレーブレディスに同期されるため、脆弱性のあるレディスをスレーブレディスと見なし、自分自身が制御するマスターレディスに接続し、自分自身のレディスにコマンドを入力できます。
RedisへのSSRF
Redisにクリアテキストリクエストを送信できる場合、Redisと通信できます。Redisはリクエストを行ごとに読み取り、理解できない行にはエラーで応答するだけです。
したがって、ウェブサイトでSSRF vulnを見つけ、いくつかのヘッダー(おそらくCRLF vulnを使用)やPOSTパラメータを制御できる場合、Redisに任意のコマンドを送信できます。
例: Gitlab SSRF + CRLFからシェルへ
Gitlab11.4.7では、SSRF脆弱性とCRLFが発見されました。SSRF脆弱性は、新しいプロジェクトを作成する際のURL機能からプロジェクトをインポートで見つかり、[0:0:0:0:0:ffff:127.0.0.1](これにより127.0.0.1にアクセス)の形式で任意のIPにアクセスでき、CRLF vulnはURLに**%0D%0A**文字を追加することで悪用されました。
したがって、これらの脆弱性を悪用して、gitlabからキューを管理するRedisインスタンスにアクセスし、それらのキューを悪用してコードを実行することが可能でした。Redisキューの悪用ペイロードは次のとおりです:
そして、whoami
を実行し、出力をnc
を介して送り返すために、SSRFとCRLFを悪用したURLエンコードリクエストは次のとおりです:
何らかの理由で(情報提供元のhttps://liveoverflow.com/gitlab-11-4-7-remote-code-execution-real-world-ctf-2018/の著者によると)この攻撃はgit
スキームではなくhttp
スキームで動作しませんでした。
HackenProof Discord サーバーに参加して、経験豊富なハッカーやバグバウンティハンターとコミュニケーションを取りましょう!
ハッキングの洞察 ハッキングのスリルとチャレンジに深く入り込むコンテンツに参加しましょう
リアルタイムハックニュース リアルタイムのニュースと洞察を通じて、ハッキングの世界を追いかけましょう
最新のアナウンスメント 最新のバグバウンティの開始や重要なプラットフォームのアップデートについて情報を得ましょう
Discord に参加して、今日からトップハッカーと協力しましょう!
Last updated