안녕하세요. 오늘은 Command Injection에 대해서 공부해보겠습니다.
Injection은 웹해킹을 공부하셨다면 익숙한 단어일텐데, Injection 기법이란 프로그램에 악의적인 데이터를 삽입하여, 이를 시스템 명령어나 코드 등으로 실행되게 하는 기법을 말합니다.
이 중, 사용자의 명령을 시스템 명령어로 실행되게 하는 것을 Command injection이라고 부릅니다.
저희가 여태껏 ROP나 다른 익스플로잇을 공부할 때 system함수를 통한 익스플로잇을 작성했습니다.
저희가 익스플로잇을 하려는 코드가 자체적으로 입력을 받아 system함수를 호출하는 경우, 셸 프로그램에서 지원하는 메타 문자를 통해서 익스플로잇이 가능합니다.
| ; (세미콜론) | 명령어 구분 |
| & (엠퍼센트) | 앞의 명령어를 실행 뒤 뒤 명령어 실행 |
| && (더블 엠퍼센트) | 앞의 명령어의 성공 유부와 관계 없이 뒤에 있는 명령어 실행 |
| | (버티컬 바) | 앞에 입력된 명령어의 실행 결과를 뒤 명령어의 입력으로 |
이러한 연산자들을 사용하면 하나의 문장으로 여러 개의 명령어를 연속적으로 실행할 수 있습니다.
이를테면 ping[user-input]을 실행할 때, 악의적인 사용자가 user-input의 인자로 a; bin/sh를 적용하면 셸에서는
ping a;
bin/sh
로 전달이 되면서 쉘이 실행되는 구조입니다.
드림핵에서 제공되는 코드를 살펴보겠습니다.
아래 코드는 사용자가 입력한 IP를 ping의 인자로 전달하여 특정 IP의 서버가 동작하는지 확인하는 용도입니다.
// Name: cmdi.c
// Compile: gcc -o cmdi cmdi.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
const int kMaxIpLen = 36;
const int kMaxCmdLen = 256;
int main() {
char ip[kMaxIpLen];
char cmd[kMaxCmdLen];
memset(ip, '\0', kMaxIpLen);
memset(cmd, '\0', kMaxCmdLen);
strcpy(cmd, "ping -c 2 ");
printf("Health Check\n");
printf("IP: ");
fgets(ip, kMaxIpLen, stdin);
strncat(cmd, ip, kMaxCmdLen);
printf("Execute: %s\n",cmd);
system(cmd);
return 0;
}
여기서 cmd에 ip주소값을 입력할 때, 검증을 하지 않아서 취약점이 발생합니다.

먼저 정상적으로 IP를 입력한 경우입니다.

이번엔 입력으로 ;와 함께 /bin/sh를 입력하면 셸이 획득되는 모습을 볼 수 있습니다.
커맨드 인젝션 문제를 하나 풀어봤는데 어렵진 않아서 write-up을 따로 작성하지 않고 링크로 첨부하겠습니다.
https://dreamhack.io/wargame/challenges/117
cmd_center
DescriptionIP를 확인할 필요가 없습니다! 혹시 다른 명령어는 못쓰나요?다른 명령어를 사용했다면 플래그를 획득하세요!Referenceshttps://dreamhack.io/learn/2/1#3https://dreamhack.io/learn/2/14#3
dreamhack.io
어렵지 않으니 한번 풀어보시기를 권장드립니다.
이상으로 간단하게 포스팅을 마치겠습니다
읽어주셔서 감사합니다
'취약점분석 > Pwnable' 카테고리의 다른 글
| 리눅스 패스워드 크래킹 실습 (John the Ripper ) (0) | 2025.10.16 |
|---|---|
| [Pwnable] UAF (Use-After-Free) (0) | 2025.10.12 |
| [Pwnable] Out of bounds write-up ( OOB ) (0) | 2025.10.05 |
| [Pwnable] oneshot write-up (one_gadget) (0) | 2025.10.04 |
| [Pwnable] RELRO (RELocation Read Only) (0) | 2025.10.04 |