
.lnk 취약점과 explorer.exe 및 USB 드라이브와 관련된 운영 체제 처리 메커니즘을 악용합니다.
바로가기(Shortcut) 1개 + 악성 payload가 포함된 .DLL 1개를 생성 => USB에 넣어 피해자에게 전송 => 피해자가 USB를 열면 => Payload가 자동으로 실행됩니다!
먼저 우리는 이 버그가 정확히 어디서 발생하는지 알아야 합니다! 이는 Plug-and-Play(플러그 앤 플레이) 기능 때문입니다. OS가 장치를 자동으로 감지하고, 리소스를 할당하며, 재부팅 없이 즉시 작동하도록 적절한 드라이버를 로드합니다. USB를 꽂고 Windows Explorer explorer.exe로 폴더를 열면, 운영체제는 사용자에게 해당하는 아이콘 이미지를 표시하기 위해 파일을 스캔합니다!
오래된 Windows 버전부터 Microsoft는 Control Panel 기능(본질적으로 .cpl 또는 .dll 파일)을 가리키는 바로가기(.lnk)가 유연하게 동적 아이콘을 표시할 수 있기를 원했습니다. 따라서 Windows의 핵심 인터페이스 관리 라이브러리인 shell32.dll에는 CPL_LoadCPLModule이라는 함수가 설계되었습니다.
맹목적인 LoadLibrary 사용: Control Panel Applet 구조 파일에서 아이콘을 가져오기 위해, 운영체제는 단순한 정적 이미지 파일을 읽지 않고 LoadLibraryW 함수를 사용하여 해당 동적 링크 라이브러리 전체를 explorer.exe 프로세스의 메모리 공간에 직접 로드합니다. 로드한 후에야 화면에 그릴 아이콘을 가져오기 위해 CPlApplet이라는 표준 내보내기 함수를 호출합니다.
LoadLibraryW가 실제로 위의 익스플로잇 체인과 관련이 있음을 증명하려면:
1/ 관리자 권한으로
x64dbg를 실행하세요2/
explorer.exe에 Attach(연결)하세요3/ 명령어
bp LoadLibraryW를 입력하세요4/ F9를 눌러
explorer.exe가 계속 실행되게 하세요5/ USB를 꽂으면 즉시
hit breakpoint가 발생합니다!
저는 익스플로잇 체인이 완전히 조용하다는 문제에 직면했습니다. 아무리 확인하고 디버그해 봐도 해결 방법을 찾을 수 없었습니다! 그 후 다른 사람의 PoC를 찾아 실행해 봤지만 역시 실패했습니다!
하지만 점심을 먹고 돌아와 다시 집중력과 침착함을 되찾은 후, 저는 질문을 던지기 시작했습니다. "이 녀석의 PoC는 왜 동작하는데 내 컴퓨터에서는 동작하지 않는 걸까?" 그래서 그 녀석의 .lnk와 .dll을 가볍게 리버스 엔지니어링해 보니 두 가지를 발견했습니다!
1 / 내 .dll이 그 녀석의 것보다 길었습니다! 하지만 그건 문제가 되지 않았습니다!
2 / .lnk를 HxD에 넣어 문자열(strings)을 읽어보니, 그 녀석은 상대 경로가 아닌 절대 경로를 사용한다는 것을 발견했습니다!
상대 경로: ../example.dll
절대 경로: O:/example.dll
좋습니다. 이제 해결 방법은 이렇습니다. USB를 피해자의 컴퓨터에 꽂으면 자동으로 어떤 드라이브 문자로 할당되는지 알아야 합니다. 그런 다음 절대 경로를 지정하면 성공할 것입니다. 제 Win7에서는 USB를 꽂으면 항상 F 드라이브로 인식되었기 때문에, 제 빌드 명령어는 다음과 같습니다:
python Make_PoC.py FakeGoogleChrome F:\Pwned.dll
이 버그는 메모리 오버플로우가 아닌 시스템 아키텍처 설계 결함(Logic/Architecture Flaw) 에 속하기 때문에, Microsoft는 Control Panel 처리 방식을 완전히 변경해야 했습니다:
.cpl 또는 .dll 파일에 Microsoft의 유효한 디지털 서명이 있거나 (System32 같은) 엄격하게 보호되는 시스템 디렉터리에 위치하도록 강제합니다. 이는 USB를 통한 "Binary Planting" 오류를 방지하기 위함입니다.explorer.exe [cite: 1058]에 직접 로드하는 대신, 새로운 Windows 버전은 Control Panel 애플릿을 격리된 중간 프로세스(예: dllhost.exe 또는 rundll32.exe)를 통해 실행합니다. DLL이 크래시되거나 악성 코드를 포함하더라도 해당 중간 프로세스만 중단될 뿐, 전체 사용자 인터페이스 시스템을 장악할 수는 없습니다.베트남 연구 자료
PoC
vul .lnk 빌드 도구