취약점분석/Pwnable

[Pwnable] Command Injection

poiri3r 2025. 10. 6. 08:27

안녕하세요. 오늘은 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

어렵지 않으니 한번 풀어보시기를 권장드립니다.

이상으로 간단하게 포스팅을 마치겠습니다

읽어주셔서 감사합니다