개요

이번 장에서는 시스템의 자원을 활용하는 취약한 ActiveX 프로그램을 개발하는 과정을 소개한다.

Visual Studio 2022 를 이용해 개발하였으며, 쉽게 따라할 수 있도록 캡처파일 및 설명이 많이 첨부되어 있다.

개발과정이 궁금하지 않다면 맨 아래에서 ActiveX가 브라우저에서 어떻게 호출되는지 정도만 참고하면 된다

 

ActiveX 개발 요구사항

1. print("msg")

 - 입력 값을 메시지 박스로 출력하는 브라우저에서 호출 가능한 함수를 만들 것

2. ExcuteCommand("path", "option")

 - 피카츄 배구.exe를 실행하는 브라우저에서 호출 가능한 함수를 만들 것

 

ActiveX 개발환경 준비

1. Visual Studio 2022 다운로드

 

2. VS 워크로드에서 MFC ActiveX 프로젝트 개발을 지원하는 모듈 설치

 - C++를 사용한 데스크톱 개발

   > MSVC v143 - VS 2022 C++ x64/x86 빌드 도구(최신)

   > 최신 v143 빌드 도구용 C++ ATL(x86 및 x64)

 

ActiveX 개발과정

1. (필수) 관리자 권한으로 비주얼 스튜디오를 실행한 후, MFC ActiveX 컨트롤 프로젝트를 생성한다.

   ※ 프로젝트를 빌드할 때, 클래스ID 값을 레지스트리에 등록해주는데 이 작업을 위해 관리자 권한이 필요하다.

 

2. 정상적으로 프로젝트가 생성되었다면 다음과 같이 클래스와 소스코드가 제공된다.

   가장 먼저 생성된 파일 중, VulnActiveX.idl 파일에서 클래스 ID를 확인한다. 
   이 ID는 브라우저에서 ActiveX Control을 호출할 때, 꼭 필요하므로 잘 기억하도록 하자.

UUID : 2dac5409-0183-468c-8864-24b8257d6d4a

 

3-1. 개발 요구사항에 있는 print() 함수를 작성해보자.

      클래스 뷰의 CVulnActiveXCtrl을 마우스 오른쪽으로 클릭한 뒤 print() 함수를 추가해보자.

 

3-2. 브라우저에서 print() 함수가 호출되면 전달되는 인자 값으로 MessageBox()를 실행하는 코드를 작성해준다.

 

4. 이제 개발 요구사항에 있는 ExcuteCommand() 함수를 작성해보자. 

      해당 함수를 ActiveX Control에서 내부적으로 처리하기 위해, 두 가지 함수를 작성한다.

      함수 생성 방법은 위 3번을 참고하면 된다.

      1) ExecuteParamPath("path") : 브라우저로부터 실행 경로를 받는 함수

      2) ExecuteParamOption("option") : 브라우저로부터 옵션을 받아, 실행 경로와 함께 시스템명령을 실행하는 함수

 

5. 작성한 print(), ExecuteParamPath(), ExecuteParamOption() 함수를 외부에서 호출할 수 있도록 매핑시켜준다.

 

6. 이로써 코드 작성은 모두 끝났다. 이제 빌드하기 전에 프로젝트 플랫폼 설정을 확인해주자.

 

6. 이제 프로젝트를 빌드해주자. 정상적으로 빌드된다면 아래 [출력]에서 성공했다는 메세지가 출력된다.

 

6. 빌드가 성공하면 ~\[프로젝트명]\Debug 폴더에 아래와 같이 4개의 파일들이 생성된다.

 

7. ActiveX Control(OCX)는 개발완료했으니 이제 해당 함수들을 호출할 test.html을 작성해보자.

<html>
<body>
<object classid="CLSID:0e6f377f-0d8d-4d07-873c-f57481ed9f58""
 width="0" height="0" id="SION">
</object>

<script type="text/javascript">

function ExecuteCommand(path, option){
document.SION.ExecuteParamPath(path);
document.SION.ExecuteParamOption(option);
};

document.SION.print("Hello World!!");

ExecuteCommand("\"C:\\Program Files (x86)\\Pikachu.exe\"","");

</script>
</body>
</html>

 

ActiveX를 호출하는 test.html 분석

1. 간단하게 코드를 분석해보자.

   <object> 태그를 통해 CLSID가 "0e6f377f~"인(2번 참고) ActiveX Control을 호출하고 id를 "SION"으로 명명한다.

<object classid="CLSID:0e6f377f-0d8d-4d07-873c-f57481ed9f58""
 width="0" height="0" id="SION">
</object>

 

2. 스크립트 태그 내부에서 ActiveX Control의 내부 함수인 ExecuteParamPath(path), ExecuteParamOption(option)를

   호출될 수 있도록 하는 실행경로와 옵션을 인자로 하는 ExecuteCommand(path, option) 함수를 정의한다.

<script>
function ExecuteCommand(path, option){
document.SION.ExecuteParamPath(path);
document.SION.ExecuteParamOption(option);};
</script>

      

3. ActiveX Control의 내부 함수인 print("Hello World!!")를 호출하여 해당 인자 값을 msgbox로 출력하는 구문이다.

<script>
document.SION.print("Hello World!!");
</script>

 

4. (2)의 자바스크립트 함수 ExecuteCommand() 에 피카츄 배구 실행파일의 경로와 실행옵션(없음)을 전달하여 해당

   프로그램을 실행시키는 구문이다.

<script>
ExecuteCommand("\"C:\\Program Files (x86)\\Pikachu.exe\"","");
</script>

 

ActiveX 호출 테스트

1. ~\[프로젝트명]\Debug 폴더에 작성한 test.html을 Internet Explorer로 실행한다.

 

2. test.html이 실행되면 ActiveX 컨트롤에 대한 알림 메시지 창에서 "예"를 클릭한다.

 

3. 브라우저에서 호출한 print("Hello World!!") 함수가 동작하며 msgbox를 통해 메시지박스가 생성됨을 볼 수 있다. 다시 확인 버튼을 누른다.

 

4. 브라우저에서 호출한 ExecuteCommand("\"C:\\Program Files (x86)\\Pikachu.exe\"","") 함수가 동작하며 피카추

   배구 프로그램이 실행된다.

※ 테스트 참고사항 : 프로젝트 파일을 로컬 PC에서 Visual Studio(관리자 권한)로 재빌드하지 않으면 OCX의 레지스트리가 등록되지 않아 ActiveX가 브라우저에서 연동되지 않으므로, CMD(관리자 권한) 창에서 아래 명령어로 수동 등록해야한다.

(관리자 권한 CMD) > regsvr32 "ocx 절대경로"

예시) C:\Users\PSO>regsvr32 C:\Users\PSO\source\repos\VulnActiveX\Debug\VulnActiveX.ocx
복사했습니다!