macOS Electron Applications Injection
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Electron이 무엇인지 모른다면 여기에서 많은 정보를 찾을 수 있습니다. 하지만 지금은 Electron이 node를 실행한다는 것만 알면 됩니다. 그리고 node에는 지정된 파일 외에 다른 코드를 실행하도록 사용할 수 있는 매개변수와 환경 변수가 있습니다.
이 기술들은 다음에 논의될 것이지만, 최근 Electron은 이를 방지하기 위해 여러 보안 플래그를 추가했습니다. 이것이 바로 Electron Fuses이며, 이는 macOS에서 Electron 앱이 임의의 코드를 로드하는 것을 방지하는 데 사용됩니다:
RunAsNode
: 비활성화되면 코드 주입을 위해 환경 변수 **ELECTRON_RUN_AS_NODE
**의 사용을 방지합니다.
EnableNodeCliInspectArguments
: 비활성화되면 --inspect
, --inspect-brk
와 같은 매개변수가 존중되지 않습니다. 이를 통해 코드 주입을 피할 수 있습니다.
EnableEmbeddedAsarIntegrityValidation
: 활성화되면 로드된 asar
파일이 macOS에 의해 검증됩니다. 이 파일의 내용을 수정하여 코드 주입을 방지합니다.
OnlyLoadAppFromAsar
: 이 옵션이 활성화되면 다음 순서로 로드하는 대신: app.asar
, app
및 마지막으로 default_app.asar
. 오직 app.asar만 확인하고 사용하므로, embeddedAsarIntegrityValidation
퓨즈와 결합될 때 검증되지 않은 코드를 로드하는 것이 불가능합니다.
LoadBrowserProcessSpecificV8Snapshot
: 활성화되면 브라우저 프로세스는 V8 스냅샷을 위해 browser_v8_context_snapshot.bin
이라는 파일을 사용합니다.
코드 주입을 방지하지 않는 또 다른 흥미로운 퓨즈는:
EnableCookieEncryption: 활성화되면 디스크의 쿠키 저장소가 OS 수준의 암호화 키를 사용하여 암호화됩니다.
응용 프로그램에서 이 플래그를 확인할 수 있습니다:
문서에서 언급한 바와 같이, Electron 퓨즈의 구성은 Electron 바이너리 내부에 설정되어 있으며, 그 안에는 문자열 **dL7pKGdnNz796PbbjQWNKmHXBZaB9tsX
**가 포함되어 있습니다.
macOS 애플리케이션에서는 일반적으로 application.app/Contents/Frameworks/Electron Framework.framework/Electron Framework
에 위치합니다.
You could load this file in https://hexed.it/ and search for the previous string. After this string you can see in ASCII a number "0" or "1" indicating if each fuse is disabled or enabled. Just modify the hex code (0x30
is 0
and 0x31
is 1
) to fuse 값을 수정.
Note that if you try to 덮어쓰기 the Electron Framework
이진 파일 inside an application with these bytes modified, the app won't run.
There could be 외부 JS/HTML 파일 that an Electron App is using, so an attacker could inject code in these files whose signature won't be checked and execute arbitrary code in the context of the app.
However, at the moment there are 2 limitations:
The kTCCServiceSystemPolicyAppBundles
permission is 필요 to modify an App, so by default this is no longer possible.
The compiled asap
file usually has the fuses embeddedAsarIntegrityValidation
and
onlyLoadAppFromAsar
enabled
Making this attack path more complicated (or impossible).
Note that it's possible to bypass the requirement of kTCCServiceSystemPolicyAppBundles
by copying the application to another directory (like /tmp
), renaming the folder app.app/Contents
to app.app/NotCon
, 수정 the asar file with your 악성 code, renaming it back to app.app/Contents
and executing it.
You can unpack the code from the asar file with:
그리고 수정한 후 다시 패킹합니다:
ELECTRON_RUN_AS_NODE
문서에 따르면, 이 환경 변수가 설정되면 프로세스가 일반 Node.js 프로세스로 시작됩니다.
만약 fuse **RunAsNode
**가 비활성화되면 env var **ELECTRON_RUN_AS_NODE
**는 무시되며, 이 방법은 작동하지 않습니다.
여기에서 제안된 대로, 이 env 변수를 plist에서 악용하여 지속성을 유지할 수 있습니다:
NODE_OPTIONS
페이로드를 다른 파일에 저장하고 실행할 수 있습니다:
fuse **EnableNodeOptionsEnvironmentVariable
**가 비활성화된 경우, 앱은 env var NODE_OPTIONS를 무시하고 시작되며, env 변수 **ELECTRON_RUN_AS_NODE
**가 설정되지 않는 한 무시됩니다. 또한 fuse **RunAsNode
**가 비활성화된 경우에도 무시됩니다.
**ELECTRON_RUN_AS_NODE
**를 설정하지 않으면 다음과 같은 오류가 발생합니다: Most NODE_OPTIONs are not supported in packaged apps. See documentation for more details.
이 env 변수를 plist에서 악용하여 지속성을 유지하기 위해 다음 키를 추가할 수 있습니다:
이것에 따르면, --inspect
, --inspect-brk
및 **--remote-debugging-port
**와 같은 플래그로 Electron 애플리케이션을 실행하면 디버그 포트가 열리게 되어 이를 연결할 수 있습니다(예: chrome://inspect
의 Chrome에서) 그리고 코드를 주입할 수 있거나 심지어 새로운 프로세스를 시작할 수 있습니다.
예를 들어:
만약 퓨즈 **EnableNodeCliInspectArguments
**가 비활성화되어 있다면, 앱은 노드 매개변수(예: --inspect
)를 무시하고 실행되며, 환경 변수 **ELECTRON_RUN_AS_NODE
**가 설정되지 않는 한 무시됩니다. 또한 퓨즈 **RunAsNode
**가 비활성화되어 있으면 이 변수도 무시됩니다.
그러나 여전히 **electron 매개변수 --remote-debugging-port=9229
**를 사용할 수 있지만, 이전 페이로드는 다른 프로세스를 실행하는 데 작동하지 않을 것입니다.
매개변수 **--remote-debugging-port=9222
**를 사용하면 Electron 앱에서 히스토리(GET 명령어 사용)나 브라우저의 쿠키와 같은 정보를 훔칠 수 있습니다(브라우저 내부에서 복호화되며, 이를 제공하는 json 엔드포인트가 있습니다).
이 방법에 대한 자세한 내용은 여기와 여기에서 확인할 수 있으며, 자동 도구 WhiteChocolateMacademiaNut 또는 다음과 같은 간단한 스크립트를 사용할 수 있습니다:
In 이 블로그 포스트, 이 디버깅이 악용되어 헤드리스 크롬이 임의의 파일을 임의의 위치에 다운로드하게 됩니다.
이 env 변수를 plist에서 악용하여 지속성을 유지하기 위해 다음 키를 추가할 수 있습니다:
macOS의 TCC 데몬은 실행된 애플리케이션의 버전을 확인하지 않습니다. 따라서 이전 기술로 Electron 애플리케이션에 코드를 주입할 수 없다면, APP의 이전 버전을 다운로드하고 그 위에 코드를 주입할 수 있습니다. 그러면 여전히 TCC 권한을 받을 수 있습니다(Trust Cache가 이를 방지하지 않는 한).
이전 기술을 사용하면 Electron 애플리케이션의 프로세스 내에서 JS 코드를 실행할 수 있습니다. 그러나 자식 프로세스는 부모 애플리케이션과 동일한 샌드박스 프로필에서 실행되며 TCC 권한을 상속받습니다. 따라서 예를 들어 카메라나 마이크에 접근하기 위해 권한을 악용하고 싶다면, 프로세스에서 다른 바이너리를 실행하면 됩니다.
도구 electroniz3r는 취약한 Electron 애플리케이션을 쉽게 찾아서 그 위에 코드를 주입하는 데 사용할 수 있습니다. 이 도구는 --inspect
기술을 사용하려고 시도합니다:
직접 컴파일해야 하며 다음과 같이 사용할 수 있습니다:
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)