본문 바로가기
해킹 맛보기

명령어 삽입공격&레이스 컨디션

by paysmile 2016. 11. 22.

<<명령어 삽입 공격>>

 

명령어 삽입 공격은 기존의 명령어들을 재사용하거나 쉘 명령어들을 이용해 특정 기능을 수행할 때 발생할 수 있다.

 

기존의 소프트웨어나 소프트웨어를 구축했던 지식을 사용해 새로운 소프트웨어를 개발하는 일을 코드재사용 또는 소프트웨어 재사용이라고 한다.

짧은 코드, 탬플릿, 라이브러리, 크게는 프로그램 자체를 재사용해 시간을 단축한다.

 

어떠한 기능을 수행하는 코드를 만들 때 해당 기능을 수행하는 외부 프로그램을 사용하면 개발시간을 단축하고 결과물을 더 가공할 수 있다.

많은 프로그래밍언어들이 외부 프로그램을 수행하기 위한 방법으로 텍스트 기반 명령어 처리기를 이용한다.

 

명령어 처리기

C언어에서는 외부 프로그램을 수행할 수 있는 함수로 system() 함수를 제공한다. 이 함수는 운영체제의 기본명령어 처리기로, 인자로 들어온 문자열을 실행하고 그 결과를 출력한다. 예를 들면 system() 함수로 dir명령어를 실행함으로써 현재 디렉터리에 있는 파일목록을 표준출력하는 프로그램을 더 빠르게 작성 할 수 있다.

 

void printf_current_dir_with_system(void){

system(“dir /B”)

}

 

명령어 삽입 공격

이를 더 확장하면 주어진 디렉토리에 있는 파일 목록을 출력하는 프로그램을 만들 수 있다.

이 프로그램은 첫 번째 인자로 넘어온 폴더에 있는 파일 목록을 출력하는데

c:/book/ex4_2/디렉토리에 this is content 라는 파일 내용이 있다면

 

$ ./ex2 content.txt

this is file content

 

라는 명령어로 c:/book/ex4_2/의 목록을 읽을 수 있다. (ex2는 컴파일된 프로그램 이름)

-> content 라는 파일이있음

 

만약 공격자가 첫 번째 인자로 들어가는 파일명 뒤에

“. && echo oops”를 입력하면 sprint문으로 cmd.exe에 의해 수행되는 명령어는 “dir /B .&& echo oops” 가 된다. &&은 한 줄에서 여러 명령어를 사용하게 수행되므로

“dir /B”를 수행하고 “echo oops”를 수행한다

(echo명령은 화면상의 문자열이나 변수의 값을 그대로 출력하고 변수는 $기호로 시작한다.)

 

$ ./ex2 content.txt

this is file content

content.txt ex2 ex2.c

프로그램은 현재 목록에 있는 프로그램 뿐만 아니라 나아가 뒤에 붙어있는 echo명령을 추가로 실행해 화면에 결과를 보여준다. 이러한 공격을 명령어 삽입공격이라고 한다.

 

명령어 삽입 취약점이 발생하는 패턴

 

어떤 언어 이던간에 명령어 처리기를 통해 명령을 수행할 수 있는 함수가 있다면 발생할 가능성이 있음.

주요하게 봐야 할 함수들로는 밑의 표가 있다.

언어

구성

c/c++

운영체제 공통 : system(), popen(),excvp()

윈도우 전용 : ShellExecute, CreateProcess_wsyystem()

Perl

System(), exec(), backticks(‘), vertical bar operator(l),eval()

파이썬

exec,eval, os system, os.open..

자바

Class.forName(string name), class.newlnstance, Runtime.exec()

C#

system.Diagnostics.Process.Start()

 

명령어 삽입 공격에 사용되는 명령어 처리기 연산자

위의 예시에서 명령어 삽입 취약점을 공격하기 위해 &를 사용했는데 이 앰퍼새드는 윈도우에서 한줄에 여러 명령어를 수행하기 위한 특수기호 이다. 이러한 취약점의 존재를 인지한 개발자가 몇가지를 필터링 하는 경우가 있지만 이런 식의 필터링이 모두 효과적인 방법은 아니다. 따라서 명령어처리기에 특수하게 사용되는 여러 명령어를 실행 할 수 있는 연산자들을 알아야 한다.

 

 

<<레이스 컨디션>>

 

레이스 컨디션이란?

서로 다른 프로세스나 스레드가 같은 자원을 공유할 때, 실행 순서에 따라 결과가 달라질 수 있는 현상을 이용해 공격하는 기법이다.

운영체제에서 여러 프로그램을 동시에 수행하는 기능을 병행성이라고 하는데 이러한 병행성을 이용하면 프로그램을 빠르게 동작하게 할 수 있다. CPU의 개수별로 스레드를 만들어 각각의 부하를 1/(코어의 개수)로 줌으로서 기존의 부하를 줄일 수 있다. 또한 같은 메모리 변수를 사용함으로써 발생하는 부하는 계산과정의 중간 결과 값을 지역변수에 저장해서 연산이 끝났을 때 이를 반영하도록 하여 줄일 수 있다.

하지만 이러한 병행성을 사용할 때 여러 프로세스나 스레드가 수행되는 순서에 따라 수행결과가 달라지는 현상이 생기는데 이러한 현상을 레이스 컨디션이라고 한다. 이 현상의 근본적 원인은 두 스레드가 하나의 변수를 공유하는데 있다.

 

**레이스 컨디션 취약점

이러한 취약점을 고치기 위해 CPU에서 처리되는 명령을 여러 개로 만들지 않고 하나로 만드는 방법을 사용해도 문제가 생긴다. 원자성이라는 개념 때문인데 total_count_++C언어에서 하나의 연산이지만 이를 x86어셈블리로 컴파일한 기계어에서 는 다음과 같이 변한다.

total_count_++;

 

mov eax,dword prt ds:[01078130h]

add eax,1

mov dword prt ds:[01078130h],eax

 

따라서 프로그램을 이와 같이 수정해도 동일한 문제가 발생함을 알 수 있습니다.

'해킹 맛보기' 카테고리의 다른 글

메모리 오염 공격  (0) 2016.12.26
웹 해킹  (0) 2016.11.01
리버싱 스터디3  (0) 2016.10.11
리버싱 스터디2  (0) 2016.10.11
엔지니어링 스터디1  (0) 2016.10.11