시스템 해킹실습 - 2. Command Injection 명령어 삽입

2024. 7. 17. 22:04Information Security 정보보안/Vulnerability Analysis 취약점 분석

728x90

배울내용: 

시스템 해킹

단위공격 기술

Command Injection 발생 원리

Command Injection 실습 

Command Injection  방지 방법

메모리 취약점

커멘드 인젝션 이란? 

백틱 인젝션

 

 

 

사진 출처 : https://infosecwriteups.com/command-injection-by-changing-the-logo-2d730887ab6c

 

 

취약점 종류중 논리취약점중 하나인 Command Injection ! 

커멘드 인젝션 ,  Command Injection 이란것에 대해 알아보자

 

 

 

Command Injection 이란?

사용자의 입력값을 system, exec 와 같은 실행 함수의 인자로 사용할떄, 입력 값에 대한 적절한 검증을 수행하지 않아 발생. 웹에서 발생하는 Command Injection 공격과 근본적으로 동일

 

 

의미

공격자가 임의의 시스템 명령어를 실행할수 있는 취약점

 

 

 

 

추세

현업자에 말에 따르면 Command Injection 이 막기 간단하지만 하지만 여기저기 종종 발견된다고 한다 

 

 

 

 

 

 

입력값 및 실행 결과 

 

 

 

 

 

 

코드작성

 

 

 

이렇게 command_injection.c 라는 파일로 작성이 되고  같은 파일위치에

 

flag 라는 파일이 있고 flag 안에는 "HELLO_COMMAND_INJECTION" 이있다. 

 

vi flag 후 아래처럼 입력

 

 

 

 


command_injection.c 를 컴파일 해주면 초록색으로 나오는데 

 

 

 

gcc -c command_injection.c -o command_injection 으로 하면 위에 보이는 초록색 파일이 만들어지고

./command_injection  으로 실행이 된다

 

 

 

그러면 ls 또는 whoami 만 실행이 되고 나머지 pwd 나 특수문자를 써서 command injection 을 시도하려고하면

아래처럼 걸러진다

 

 

 

 

 

 

당연히 아까 봤던 Filter 함수에서 조건을 다시보면 이해가 된다 

 

 

 

특수문자 $ , & , ; , | 등 4개를 못쓰고 또한 ls 또는 whoami 가 먼저 나온뒤에 command 를실행시키지 않는이상

return 값을 True (1) 로 받기가 어려워보인다.

 

 

 

 

 

 

우선 서버를 실행해 한번 command injection 을 시도해보자

 



socat tcp-listen:8888,fork,reuseaddr exec:./command_injection,stderr

 

위와 같이 입력해준다 

 

socat은 데이터 흐름을 소켓 간에 전송하는 데 사용되는 다목적 네트워크 도구로 사용법은 아래와 같다. 

  1. tcp-listen:8888: socat이 TCP 연결을 수신 대기하도록 설정. 여기서 8888은 수신 대기할 포트 번호. 이는 클라이언트가 TCP 포트 8888에 연결할 수 있음을 의미한다.
  2. fork: socat이 새 클라이언트 연결을 수신할 때마다 자식 프로세스를 포크(fork)하여 별도의 프로세스에서 연결을 처리하도록 한다. 이는 동시에 여러 클라이언트 연결을 처리할 수 있게 한다.
  3. reuseaddr: 이 옵션은 서버 소켓의 SO_REUSEADDR 옵션을 설정하여, 소켓이 바인딩된 후에라도 즉시 다시 사용할 수 있도록 한다. 이는 서버를 재시작할 때 유용하다.
  4. exec:./command_injection: 새로운 연결이 수신될 때마다 ./command_injection 명령을 실행한다. 이 명령의 표준 입력 및 출력이 클라이언트의 연결에 연결된다.
  5. stderr: exec된 명령의 표준 오류 스트림이 클라이언트의 연결에 연결된다. 이는 명령의 표준 출력뿐만 아니라 오류 메시지도 클라이언트가 받을 수 있도록 한다.

 

위와같이 서버를 열었으면 새로운 프롬프트창을 열고 아래와 같이 입력해준다 

 

nc localhost 8888

 

 

 

위 명령어는 netcat(또는 nc) 도구를 사용하여 로컬 호스트의 8888 포트에 연결하는 것이다.

  • nc: netcat 도구를 실행합니다. netcat은 네트워크 연결을 설정하고 데이터를 전송하는 데 사용되는 유틸리티다.
  • localhost: 연결할 대상 호스트를 지정 , 여기서는 로컬 컴퓨터를 의미하는 localhost다.
  • 8888: 연결할 대상 포트 번호를 지정, 여기서는 8888 포트다.

 

 

 

 

 

 

하기전에 gdb command_injection 으로 GDB로도 dissass main 을 통해서 자세히 볼수있다 

 

 

 

 

 

 

 

창을 2개 켜놓고 왼쪽에는 어셈블러를  한쪽에는 소스코드를 동시에 놔두어 쉽게 이해할수있다

현재 Command Injection 은 굳이 GDB를 이용해서 알필요는 없지만 앞으로 GDB 없이는 해결할수가없으니 

한개한개 켜놓고 어떻게 굴러가는지 break Point (b *main+0) 을 걸어서 시작한다음(r)  한단계씩(ni, si) 진행해보면서 코드의 흐름을 이해하는게 좋다 

 

 

 

 

 

그동안 다른 Command Injection 을보면 ls 나 whoami 뒤에 " ; " 를 넣고 다음실행할 명령어를 넣으면 그 뒤에 명령어도 실행이 됬지만 Filter로 "; " 와 그외 3개의 필터가 더 막아지면서 어떻게 할수가 없다

 

그러나 자세히보면 && 도 못쓰고 $ 이것도 그리고 | 이것도 못쓰는데 한가지 더쓸수가있다

바로 백틱 이다 

 

  "`"는 보통 "백틱(backtick)" 또는 "그레이브 액센트(grave accent)"라고 불리는데 

주로 프로그래밍 언어에서 코드 블록을 감싸거나 특정한 문자열을 나타내는 데 사용된다 .

 

 

그러면 백틱을 이용해서 해보면 된다

 

 

그러면 아까 flag 라는파일을 열어봐야하니 cat flag 만 넣어주면되는데 

 

ls; `cat flag`

 

위와 같이 입력해보면

 

 

 

 

바로 'HELLO_COMMAND_INJECTION' 이라고 안에 있던 내용이 나오는걸 볼수있다 

 

 

728x90