개요
이번 장에서는 시스템의 자원을 활용하는 취약한 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 |
'기술보안 > Web' 카테고리의 다른 글
SQLI 보안 솔루션 및 입력 값 검증 우회 기법 (0) | 2022.03.30 |
---|---|
LFI, RFI 취약점 설명 및 실습 (0) | 2022.03.29 |
[ActiveX] 1장. ActiveX란? (0) | 2022.02.28 |
Server-side JavaScript Injection (0) | 2022.02.28 |
Heavy Query Time based Sqli(ORACLE) (0) | 2022.02.28 |