Study/WebHacking

[ํŒŒ์ด์ฌ] pickle module (Deserialize ์ทจ์•ฝ์ )

mnzy๐ŸŒฑ 2024. 7. 13. 19:55

1. Serialization & Deserialization

ํŒŒ์ด์ฌ์˜ pickle ๋ชจ๋“ˆ์€ ๊ฐ์ฒด ๊ตฌ์กฐ์˜ ์ง๋ ฌํ™”(serialization)์™€ ์—ญ์ง๋ ฌํ™”(deserialization)๋ฅผ ์œ„ํ•œ ๋ฐ”์ด๋„ˆ๋ฆฌ ํ”„๋กœํ† ์ฝœ์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•œ๋‹ค. ์‰ฝ๊ฒŒ ๋งํ•ด, pickle ๋ชจ๋“ˆ์€ ํŒŒ์ด์ฌ ๊ฐ์ฒด๋ฅผ ์ €์žฅํ•˜๊ฑฐ๋‚˜ ์ „์†กํ•˜๊ธฐ ์œ„ํ•ด ๋ณ€ํ™˜ํ•˜๊ณ , ๋‹ค์‹œ ๊ทธ ๊ฐ์ฒด๋กœ ๋ณต์›ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ๋„๊ตฌ์ด๋‹ค.

  • serialization : ํŒŒ์ด์ฌ ๊ฐ์ฒด ๊ณ„์ธต ๊ตฌ์กฐ -> ๋ฐ”์ดํŠธ ์ŠคํŠธ๋ฆผ = pickling
  • deserialize : ๋ฐ”์ดํŠธ ์ŠคํŠธ๋ฆผ -> ํŒŒ์ด์ฌ ๊ฐ์ฒด ๊ณ„์ธต ๊ตฌ์กฐ  = unpickling

์ฆ‰, ์ง๋ ฌํ™”๋ฅผ ํ•˜๋Š” ์ด์œ ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ํŒŒ์ผ/DB์— ์ €์žฅํ•˜๊ฑฐ๋‚˜ ๋˜๋Š” ์„ธ์…˜์— ๊ฑธ์ณ ํ”„๋กœ๊ทธ๋žจ์„ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๊ฑฐ๋‚˜, ๋„คํŠธ์›Œํฌ๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์ „๊ณตํ•˜๊ธฐ ์œ„ํ•ด์„œ์ด๋‹ค. 

 

2. Pickle ๋ชจ๋“ˆ

pickle ๋ชจ๋“ˆ์˜ ์ธํ„ฐํŽ˜์ด์Šค

    • pickle.dump(obj, file)
      • ๊ฐ์ฒด obj๋ฅผ ํ”ผํด๋ง(pickling)ํ•˜์—ฌ ์—ด๋ฆฐ ํŒŒ์ผ ๊ฐ์ฒด file์— ์“ด๋‹ค.
      • ์ฆ‰, ๊ฐ์ฒด๋ฅผ ํŒŒ์ผ๋กœ ์ €์žฅํ•œ๋‹ค.
    • pickle.dumps(obj) 
      • ๊ฐ์ฒด obj๋ฅผ ํ”ผํด๋งํ•˜์—ฌ ํŒŒ์ผ์— ์“ฐ๋Š” ๋Œ€์‹  ๋ฐ”์ดํŠธ ๊ฐ์ฒด(bytes)๋กœ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
      • ์ฆ‰, ๊ฐ์ฒด๋ฅผ ๋ฉ”๋ชจ๋ฆฌ ๋‚ด์—์„œ ๋ฐ”์ด๋„ˆ๋ฆฌ ๋ฐ์ดํ„ฐ๋กœ ๋ณ€ํ™˜ํ•œ๋‹ค.
    • pickle.load(file)
      • ์—ด๋ฆฐ ํŒŒ์ผ ๊ฐ์ฒด file์—์„œ ํ”ผํด๋ง๋œ ํ‘œํ˜„์„ ์ฝ๊ณ , ๊ทธ ์•ˆ์— ์ง€์ •๋œ ๊ฐ์ฒด ๊ณ„์ธต ๊ตฌ์กฐ๋ฅผ ์žฌ๊ตฌ์„ฑํ•˜์—ฌ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
      • ์ฆ‰, ํŒŒ์ผ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์–ด ์›๋ž˜ ๊ฐ์ฒด๋กœ ๋ณต์›ํ•œ๋‹ค.
    • pickle.loads(data)
      • ํ”ผํด๋œ ๋ฐ์ดํ„ฐ(data)๋ฅผ ์ฝ์–ด ์›๋ž˜ ๊ฐ์ฒด ๊ณ„์ธต ๊ตฌ์กฐ๋กœ ๋ณต์›ํ•œ๋‹ค
      • ์ฆ‰, ๋ฉ”๋ชจ๋ฆฌ ๋‚ด์—์„œ ๋ฐ”์ด๋„ˆ๋ฆฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์–ด ์›๋ž˜ ๊ฐ์ฒด๋กœ ๋ณต์›ํ•œ๋‹ค.

ํ”ผํด๋ง ๋œ ๊ฒฐ๊ณผ๋Š” pickletools๋กœ ๋””์Šค์–ด์…ˆ๋ธ”ํ•˜์—ฌ ๊ตฌ์กฐ๋ฅผ ์‰ฝ๊ฒŒ ํŒŒ์•…ํ•ด๋ณผ ์ˆ˜ ์žˆ๋‹ค.

    • 0: \x80 PROTO 4 -> ํ”„๋กœํ† ์ฝœ ๋ฒ„์ „ 4(ํŒŒ์ด์ฌ ๋ฒ„์ „)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ง๋ ฌํ™”๋˜์—ˆ์Œ์„ ๋‚˜ํƒ€๋ƒ„
      • \x80๋Š” PROTO opcode์ด๊ณ , 4๋Š” ํ”„๋กœํ† ์ฝœ ๋ฒ„์ „
    • 2: FRAME 8 -> ๋‹ค์Œ์— ์˜ค๋Š” 8๋ฐ”์ดํŠธ๊ฐ€ ํ•˜๋‚˜์˜ ํ”„๋ ˆ์ž„์„ ํ˜•์„ฑํ•จ
      • ์ด๋Š” ๋ฐ์ดํ„ฐ ์ŠคํŠธ๋ฆผ์˜ ๋‚˜๋จธ์ง€ ๋ถ€๋ถ„์„ ํฌํ•จํ•˜๋Š” ํ”„๋ ˆ์ž„์˜ ์‹œ์ž‘์„ ํ‘œ์‹œํ•œ๋‹ค.
      • 11: \x8c SHORT_BINUNICODE ‘mnzy’ -> ์งง์€ ์œ ๋‹ˆ์ฝ”๋“œ ๋ฌธ์ž์—ด์„ ๋‚˜ํƒ€๋ƒ„.
        •  \x8c๋Š” SHORT_BINUNICODE opcode์ด๊ณ , 'mnzy'๋Š” ์ง๋ ฌํ™”๋œ ์œ ๋‹ˆ์ฝ”๋“œ ๋ฌธ์ž์—ด์ด๋‹ค.
        • ์ด opcode๋Š” 255๋ฐ”์ดํŠธ ์ดํ•˜์˜ ์œ ๋‹ˆ์ฝ”๋“œ ๋ฌธ์ž์—ด์„ ํšจ์œจ์ ์œผ๋กœ ์ง๋ ฌํ™”ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋œ๋‹ค.
    • 17: \x94 MEMOIZE (as 0) ->  ์ง๋ ฌํ™”๋œ ๊ฐ์ฒด๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์˜ ํŠน์ • ์œ„์น˜(0๋ฒˆ ์ธ๋ฑ์Šค)์— ์ €์žฅํ•œ๋‹ค.
      • ์ด๋Š” ์ดํ›„์— ํ•ด๋‹น ๊ฐ์ฒด๋ฅผ ๋‹ค์‹œ ์‚ฌ์šฉํ•  ๋•Œ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ๊ฐ€์ ธ์˜ค๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋œ๋‹ค.
    • 18: . STOP -> ์ง๋ ฌํ™” ๋ฐ์ดํ„ฐ์˜ ๋์„ ๋‚˜ํƒ€๋‚ธ๋‹ค.
      • ์ด๋Š” ์ง๋ ฌํ™”๋œ ๋ฐ์ดํ„ฐ ์ŠคํŠธ๋ฆผ์˜ ๋์„ ํ‘œ์‹œํ•œ๋‹ค.

 

3. Deserialize ์ทจ์•ฝ์ 

pickle ๋ชจ๋“ˆ์€ ๋‹ค์–‘ํ•œ ๋ฉ”์„œ๋“œ๋ฅผ ์ง€์›ํ•˜๋Š”๋ฐ, ์ด ์ค‘ object.__reduce__() ๋ฉ”์„œ๋“œ์—์„œ ์ทจ์•ฝ์ ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

__reduce__() ๋ฉ”์„œ๋“œ
  •  __reduce__() ๋ฉ”์„œ๋“œ๋Š” ํŒŒ์ด์ฌ ๊ฐ์ฒด ๊ณ„์ธต ๊ตฌ์กฐ๋ฅผ ์—ญ์ง๋ ฌํ™”(unpickling)ํ•  ๋•Œ ๊ฐ์ฒด๋ฅผ ์žฌ๊ตฌ์„ฑํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ํŠœํ”Œ์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฉ”์„œ๋“œ์ด๋‹ค.์ด๋Š” ๊ฐ์ฒด๋ฅผ ์–ด๋–ป๊ฒŒ ์žฌ๊ตฌ์„ฑํ• ์ง€์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

 

pickling๋œ ๋ฐ”์ดํŠธ ์ŠคํŠธ๋ฆผ์„ unpickleํ•  ๋•Œ, pickle ๋ชจ๋“ˆ์€ ๋จผ์ € original object์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“ค๊ณ  ๋‚˜์„œ ๊ทธ ์ธ์Šคํ„ด์Šค๋ฅผ ์˜ฌ๋ฐ”๋ฅธ ๋ฐ์ดํ„ฐ๋กœ ์ฑ„์šด๋‹ค.

์ด๋ฅผ ์œ„ํ•ด์„œ ๋ฐ”์ดํŠธ ์ŠคํŠธ๋ฆผ์—๋Š” original object ์ธ์Šคํ„ด์Šค์— ํŠน์ •๋œ ๋ฐ์ดํ„ฐ๋งŒ์„ ํฌํ•จํ•œ๋‹ค. 

์ด๋•Œ, unpickle์„ ์„ฑ๊ณต์ ์œผ๋กœ ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๊ฐ์ฒด๋ฅผ ์–ด๋–ป๊ฒŒ ์žฌ๊ตฌ์„ฑํ• ์ง€๋ฅผ ์ •์˜ํ•˜๋Š” ๋ช…๋ น ํ”ผ์—ฐ์‚ฐ์ž(operations)์™€ ๋ช…๋ น์–ด๋“ค์ด ํฌํ•จ๋˜์–ด ์žˆ์–ด์•ผ ํ•˜๋Š”๋ฐ, ์ด ๋ช…๋ น ํ”ผ์—ฐ์‚ฐ์ž์™€ ๋ช…๋ น์–ด๋“ค์€ __reduce__() ๋ฉ”์„œ๋“œ์—์„œ ๋ฐ˜ํ™˜๋˜๋Š” ์ •๋ณด๋“ค์ด๋‹ค. 

 

__ruduce__() ๋ฉ”์„œ๋“œ์˜ ๋ฆฌํ„ด๊ฐ’์€ ๋ณดํ†ต 2๊ฐœ์˜ ์ธ์ž๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. (unpickleํ•  ๋•Œ ์‚ฌ์šฉํ•  ์ •๋ณด)

  • ํ˜ธ์ถœ ๊ฐ€๋Šฅํ•œ ๊ฐ์ฒด
  • ํ˜ธ์ถœ ๊ฐ€๋Šฅํ•œ ๊ฐ์ฒด์— ๋Œ€ํ•œ ์ธ์ž. ํ˜ธ์ถœ ๊ฐ€๋Šฅํ•œ ๊ฐ์ฒด๊ฐ€ ์ธ์ž๋ฅผ ๋ฐ›์•„๋“ค์ด์ง€ ์•Š์œผ๋ฉด ๋นˆ ํŠœํ”Œ์„ ์ œ๊ณตํ•ด์•ผ ํ•œ๋‹ค. 

์ด๋•Œ, __ruduce__() ๋ฉ”์„œ๋“œ์—์„œ ํ˜ธ์ถœ ๊ฐ€๋Šฅํ•œ ๊ฐ์ฒด์— eval ๋˜๋Š” os์™€ ๊ฐ™์ด ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ํด๋ž˜์Šค๋ฅผ ์ž„์˜๋กœ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด, 

์ด๋กœ ์ธํ•ด RCE์™€ ๊ฐ™์€ ๋ณด์•ˆ ์ทจ์•ฝ์ ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

์˜ˆ์ œ

(1) ExploitClass ํด๋ž˜์Šค์˜ __reduce__() ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด os.system ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๊ณ , ์ธ์ˆ˜๋กœ echo "This is a RCE vulnerability!" ๋ช…๋ น์„ ์ „๋‹ฌํ•œ๋‹ค. __reduce__()๋Š” ๊ฐ์ฒด๋ฅผ ์ง๋ ฌํ™”ํ•  ๋•Œ ํ˜ธ์ถœ๋œ๋‹ค. 

(2) ExploitClass ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ์ด๋ฅผ pickle.dumps() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด ์ง๋ ฌํ™”ํ•œ๋‹ค. ์ง๋ ฌํ™”๋œ ๋ฐ”์ดํŠธ ์ŠคํŠธ๋ฆผ์ด serialized_exploit_obj์— ์ €์žฅ๋œ๋‹ค. 

(3) pickle.loads() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด ์ง๋ ฌํ™”๋œ ๊ฐ์ฒด๋ฅผ ์—ญ์ง๋ ฌํ™”ํ•œ๋‹ค. ์ด ๊ณผ์ •์—์„œ __reduce__() ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋˜๊ณ , os.system('echo "This is an RCE vulnerability!"')์ด ์‹คํ–‰๋œ๋‹ค.

5. ๊ฒฐ๊ณผ์ ์œผ๋กœ, "This is a RCE vulnerability!" ๋ฉ”์‹œ์ง€๊ฐ€ ์ถœ๋ ฅ๋œ๋‹ค.

import pickle
import pickletools
import os

class ExploitClass:
    def __reduce__(self):
        # os.system์„ ์‚ฌ์šฉํ•˜์—ฌ ์ž„์˜์˜ ๋ช…๋ น์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
        return (os.system, ('echo "This is a RCE vulnerability!"',))

# ๊ฐ์ฒด ์ƒ์„ฑ ๋ฐ ์ง๋ ฌํ™”
exploit_obj = ExploitClass()
serialized_exploit_obj = pickle.dumps(exploit_obj)
print("Serialized exploit object:", serialized_exploit_obj)
pickletools.dis(serialized_exploit_obj)


# ๊ฐ์ฒด ์—ญ์ง๋ ฌํ™” (์•…์˜์ ์ธ ๋ช…๋ น ์‹คํ–‰)
pickle.loads(serialized_exploit_obj)

 

์ฆ‰, pickle์ด ๊ฐ์ฒด๋ฅผ ์žฌ๊ตฌ์„ฑํ•  ๋•Œ, __reduce__() ๋ฉ”์„œ๋“œ์—์„œ ๋ฐ˜ํ™˜๋œ ์ฒซ ๋ฒˆ์งธ ์š”์†Œ(os.system)๋ฅผ ํ˜ธ์ถœํ•˜๊ณ , ๋‘ ๋ฒˆ์งธ ์š”์†Œ ('echo "This is an RCE vulnerability!"',) ๋ฅผ ๊ทธ ์ธ์ˆ˜๋กœ ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ๊ทธ ๊ฒฐ๊ณผ ์ž„์˜์˜ ๋ช…๋ น์–ด๊ฐ€ ์‹คํ–‰๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

[์ฐธ๊ณ ]

https://rootable.tistory.com/entry/python-deserialize-vulnerability-in-pickle-modulehttps://docs.python.org/ko/3/library/pickle.html

https://hoppipolla0507.tistory.com/22