mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-22 04:33:28 +00:00
Translated ['macos-hardening/macos-security-and-privilege-escalation/mac
This commit is contained in:
parent
c1578a6acd
commit
723669cdd2
4 changed files with 299 additions and 219 deletions
|
@ -1,19 +1,33 @@
|
|||
# macOS 앱 - 검사, 디버깅 및 Fuzzing
|
||||
# macOS Apps - 검사, 디버깅 및 Fuzzing
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 **제로부터 영웅이 되는 AWS 해킹을 배우세요**!</summary>
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>을 통해 **제로**부터 **히어로**로 **AWS 해킹** 배우기!</summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사가 HackTricks에 광고되길 원하거나 HackTricks를 PDF로 다운로드하길 원한다면** [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 얻으세요
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
|
||||
* **💬 [Discord 그룹](https://discord.gg/hRep4RUj7f)** 또는 [telegram 그룹](https://t.me/peass)에 **가입**하거나 **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)을 **팔로우**하세요.
|
||||
* **HackTricks** 및 **HackTricks Cloud** github 저장소에 PR을 제출하여 **해킹 트릭을 공유**하세요.
|
||||
- **회사를 HackTricks에서 광고**하거나 **PDF로 다운로드**하려면 [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
- [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com) 받기
|
||||
- [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하고, 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션을 만나보세요.
|
||||
- 💬 [**디스코드 그룹**](https://discord.gg/hRep4RUj7f)에 가입하거나 [**텔레그램 그룹**](https://t.me/peass)에 가입하거나 **트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)를 **팔로우**하세요.
|
||||
- **HackTricks** 및 **HackTricks Cloud** 깃허브 저장소에 PR을 제출하여 **해킹 트릭을 공유**하세요.
|
||||
|
||||
</details>
|
||||
|
||||
### [WhiteIntel](https://whiteintel.io)
|
||||
|
||||
<figure><img src="/.gitbook/assets/image (1224).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
[**WhiteIntel**](https://whiteintel.io)은 **다크 웹**을 활용한 검색 엔진으로, **회사**나 **고객**이 **스틸러 악성 소프트웨어**에 의해 **침해**당했는지 **무료**로 확인할 수 있는 기능을 제공합니다.
|
||||
|
||||
WhiteIntel의 주요 목표는 정보를 도난하는 악성 소프트웨어로 인한 계정 탈취 및 랜섬웨어 공격을 막는 것입니다.
|
||||
|
||||
그들의 웹사이트를 확인하고 **무료**로 엔진을 시도해 볼 수 있습니다:
|
||||
|
||||
{% embed url="https://whiteintel.io" %}
|
||||
|
||||
---
|
||||
|
||||
## 정적 분석
|
||||
|
||||
### otool
|
||||
|
@ -36,7 +50,7 @@ objdump --disassemble-symbols=_hello --x86-asm-syntax=intel toolsdemo #Disassemb
|
|||
|
||||
### jtool2
|
||||
|
||||
이 도구는 **codesign**, **otool**, **objdump**의 **대체**로 사용될 수 있으며 몇 가지 추가 기능을 제공합니다. [**여기에서 다운로드**](http://www.newosxbook.com/tools/jtool.html)하거나 `brew`로 설치할 수 있습니다.
|
||||
이 도구는 **codesign**, **otool**, **objdump**의 **대체**로 사용될 수 있으며 몇 가지 추가 기능을 제공합니다. [**여기에서 다운로드하세요**](http://www.newosxbook.com/tools/jtool.html) 또는 `brew`를 사용하여 설치하세요.
|
||||
```bash
|
||||
# Install
|
||||
brew install --cask jtool2
|
||||
|
@ -86,15 +100,17 @@ ldid -S/tmp/entl.xml <binary>
|
|||
```
|
||||
### SuspiciousPackage
|
||||
|
||||
[**SuspiciousPackage**](https://mothersruin.com/software/SuspiciousPackage/get.html)은 **.pkg** 파일(설치 프로그램)을 설치하기 전에 내부를 확인하는 데 유용한 도구입니다.\
|
||||
[**SuspiciousPackage**](https://mothersruin.com/software/SuspiciousPackage/get.html)은 **.pkg** 파일(설치 프로그램)을 검사하고 설치하기 전에 내부를 확인하는 데 유용한 도구입니다.\
|
||||
이러한 설치 프로그램에는 일반적으로 악성 소프트웨어 제작자가 악용하는 `preinstall` 및 `postinstall` bash 스크립트가 포함되어 있습니다.
|
||||
|
||||
### hdiutil
|
||||
|
||||
이 도구를 사용하면 Apple 디스크 이미지(**.dmg**) 파일을 실행하기 전에 내용을 확인할 수 있습니다:
|
||||
이 도구를 사용하면 Apple 디스크 이미지(**.dmg**) 파일을 **마운트**하여 실행하기 전에 내용을 검사할 수 있습니다:
|
||||
```bash
|
||||
hdiutil attach ~/Downloads/Firefox\ 58.0.2.dmg
|
||||
```
|
||||
`/Volumes`에 마운트됩니다.
|
||||
|
||||
### Objective-C
|
||||
|
||||
#### Metadata
|
||||
|
@ -107,7 +123,7 @@ Objective-C로 작성된 프로그램은 [Mach-O 바이너리](../macos-files-fo
|
|||
* 클래스 메소드
|
||||
* 클래스 인스턴스 변수
|
||||
|
||||
[class-dump](https://github.com/nygard/class-dump)를 사용하여 이 정보를 얻을 수 있습니다:
|
||||
[class-dump](https://github.com/nygard/class-dump)을 사용하여 이 정보를 얻을 수 있습니다:
|
||||
```bash
|
||||
class-dump Kindle.app
|
||||
```
|
||||
|
@ -115,15 +131,15 @@ class-dump Kindle.app
|
|||
|
||||
바이너리에서 Objective-C를 사용하는 함수가 호출될 때, 컴파일된 코드는 해당 함수를 호출하는 대신 **`objc_msgSend`**를 호출합니다. 이는 최종 함수를 호출할 것입니다:
|
||||
|
||||
![](<../../../.gitbook/assets/image (560).png>)
|
||||
![](<../../../.gitbook/assets/image (302).png>)
|
||||
|
||||
이 함수가 기대하는 매개변수는 다음과 같습니다:
|
||||
|
||||
- 첫 번째 매개변수인 (**self**)은 "메시지를 수신할 클래스의 **인스턴스를 가리키는 포인터**"입니다. 간단히 말하면, 메소드가 호출되는 객체입니다. 메소드가 클래스 메소드인 경우, 이것은 클래스 객체의 인스턴스(전체)일 것이며, 인스턴스 메소드의 경우 self는 클래스의 인스턴스로 객체화된 인스턴스를 가리킵니다.
|
||||
- 첫 번째 매개변수인 (**self**)은 "메시지를 수신할 클래스의 **인스턴스를 가리키는 포인터**"입니다. 간단히 말하면, 메소드가 호출되는 객체입니다. 메소드가 클래스 메소드인 경우, 이것은 클래스 객체의 인스턴스(전체)일 것이며, 인스턴스 메소드의 경우 self는 객체로서 클래스의 인스턴스를 가리킵니다.
|
||||
- 두 번째 매개변수인 (**op**)은 "메시지를 처리하는 메소드의 셀렉터"입니다. 간단히 말하면, 이것은 **메소드의 이름**입니다.
|
||||
- 나머지 매개변수는 메소드에서 필요로 하는 **값들**입니다 (op).
|
||||
- 나머지 매개변수는 메소드에서 **필요로 하는 값들**입니다 (op).
|
||||
|
||||
ARM64에서 **`lldb`**를 사용하여 이 정보를 쉽게 얻는 방법을 확인하세요:
|
||||
ARM64에서 **`lldb`**를 사용하여 이 정보를 쉽게 얻는 방법은 이 페이지에서 확인할 수 있습니다:
|
||||
|
||||
{% content-ref url="arm64-basic-assembly.md" %}
|
||||
[arm64-basic-assembly.md](arm64-basic-assembly.md)
|
||||
|
@ -131,7 +147,7 @@ ARM64에서 **`lldb`**를 사용하여 이 정보를 쉽게 얻는 방법을 확
|
|||
|
||||
x64:
|
||||
|
||||
| **인자** | **레지스터** | **(objc\_msgSend용) ** |
|
||||
| **인자** | **레지스터** | **(objc\_msgSend에 대해)** |
|
||||
| ----------------- | --------------------------------------------------------------- | ------------------------------------------------------ |
|
||||
| **1번째 인자** | **rdi** | **self: 메소드가 호출되는 객체** |
|
||||
| **2번째 인자** | **rsi** | **op: 메소드의 이름** |
|
||||
|
@ -145,7 +161,7 @@ x64:
|
|||
|
||||
Swift 바이너리의 경우, Objective-C 호환성이 있기 때문에 때로는 [class-dump](https://github.com/nygard/class-dump/)를 사용하여 선언을 추출할 수 있지만 항상 그렇지는 않습니다.
|
||||
|
||||
**`jtool -l`** 또는 **`otool -l`** 명령어를 사용하여 **`__swift5`** 접두어로 시작하는 여러 섹션을 찾을 수 있습니다:
|
||||
**`jtool -l`** 또는 **`otool -l`** 명령어를 사용하면 **`__swift5`** 접두어로 시작하는 여러 섹션을 찾을 수 있습니다:
|
||||
```bash
|
||||
jtool2 -l /Applications/Stocks.app/Contents/MacOS/Stocks
|
||||
LC 00: LC_SEGMENT_64 Mem: 0x000000000-0x100000000 __PAGEZERO
|
||||
|
@ -157,9 +173,9 @@ Mem: 0x100027064-0x1000274cc __TEXT.__swift5_fieldmd
|
|||
Mem: 0x1000274cc-0x100027608 __TEXT.__swift5_capture
|
||||
[...]
|
||||
```
|
||||
더 많은 정보를 [**이 블로그 포스트에서 찾을 수 있습니다**](https://knight.sc/reverse%20engineering/2019/07/17/swift-metadata.html).
|
||||
다음 블로그 포스트에서 이 섹션에 저장된 정보에 대한 자세한 내용을 찾을 수 있습니다.
|
||||
|
||||
또한, **Swift 이진 파일에는 심볼이 포함**될 수 있습니다(예: 라이브러리는 함수를 호출하기 위해 심볼을 저장해야 함). **심볼에는 일반적으로 함수 이름과 속성에 대한 정보가 포함**되어 있으며, 이들은 보통 지저분한 방식으로 표시되므로 매우 유용하며 "**디멩글러"**가 원래 이름을 가져올 수 있습니다:
|
||||
또한, **Swift 이진 파일에는 심볼이 포함**될 수 있습니다 (예: 라이브러리는 함수를 호출하기 위해 심볼을 저장해야 함). **일반적으로 심볼에는 함수 이름과 속성에 대한 정보**가 지저분한 방식으로 포함되어 있으므로 매우 유용하며 "**디멩글러"**가 원래 이름을 가져올 수 있습니다:
|
||||
```bash
|
||||
# Ghidra plugin
|
||||
https://github.com/ghidraninja/ghidra_scripts/blob/master/swift_demangler.py
|
||||
|
@ -176,46 +192,46 @@ swift demangle
|
|||
## 동적 분석
|
||||
|
||||
{% hint style="warning" %}
|
||||
바이너리를 디버깅하려면 **SIP를 비활성화**해야 합니다 (`csrutil disable` 또는 `csrutil enable --without debug`) 또는 바이너리를 임시 폴더로 복사하고 `codesign --remove-signature <binary-path>`로 서명을 **제거**하거나 바이너리의 디버깅을 허용합니다 (이 스크립트를 사용할 수 있습니다 [여기](https://gist.github.com/carlospolop/a66b8d72bb8f43913c4b5ae45672578b)).
|
||||
바이너리를 디버깅하려면 **SIP를 비활성화**해야 합니다 (`csrutil disable` 또는 `csrutil enable --without debug`) 또는 바이너리를 임시 폴더로 복사하고 `codesign --remove-signature <binary-path>`로 서명을 제거하거나 바이너리의 디버깅을 허용해야 합니다 (이 스크립트를 사용할 수 있습니다).
|
||||
{% endhint %}
|
||||
|
||||
{% hint style="warning" %}
|
||||
macOS에서 **시스템 바이너리** (예: `cloudconfigurationd`)를 **기기**하는 경우, **SIP를 비활성화**해야 합니다 (서명을 제거하는 것만으로는 작동하지 않음).
|
||||
macOS의 **시스템 바이너리** (예: `cloudconfigurationd`)를 **인스트루먼트**하려면 **SIP를 비활성화**해야 합니다 (서명을 제거하는 것만으로는 작동하지 않습니다).
|
||||
{% endhint %}
|
||||
|
||||
### 통합 로그
|
||||
|
||||
MacOS는 **어플리케이션을 실행**할 때 매우 유용한 로그를 생성합니다.
|
||||
MacOS는 **어플리케이션 실행 중 무엇을 하는지** 이해하는 데 유용한 많은 로그를 생성합니다.
|
||||
|
||||
또한, 일부 로그에는 `<private>` 태그가 포함되어 **사용자** 또는 **컴퓨터** **식별 가능한** 정보를 **숨기는**데, 이 정보를 공개하기 위해 **인증서를 설치**할 수 있습니다. [**여기**](https://superuser.com/questions/1532031/how-to-show-private-data-in-macos-unified-log)의 설명을 따르세요.
|
||||
또한, 일부 로그에는 `<private>` 태그가 포함되어 **사용자** 또는 **컴퓨터** **식별 가능한** 정보를 **숨기기** 위한 것입니다. 그러나 **이 정보를 공개하기 위해 인증서를 설치**할 수 있습니다. [**여기**](https://superuser.com/questions/1532031/how-to-show-private-data-in-macos-unified-log)의 설명을 따르세요.
|
||||
|
||||
### Hopper
|
||||
|
||||
#### 왼쪽 패널
|
||||
|
||||
Hopper의 왼쪽 패널에서는 이진 파일의 심볼 (**레이블**), 프로시저 및 함수 목록 (**Proc**) 및 문자열 (**Str**)을 볼 수 있습니다. 이들은 Mac-O 파일의 여러 부분에서 정의된 문자열 중 일부이며 (_cstring 또는_ `objc_methname`과 같은).
|
||||
Hopper의 왼쪽 패널에서는 이진 파일의 심볼 (**라벨**), 프로시저 및 함수 목록 (**Proc**) 및 문자열 (**Str**)을 볼 수 있습니다. 이들은 Mac-O 파일의 여러 부분에서 정의된 문자열 중 일부이지만 모든 문자열은 아닙니다 (예: _cstring 또는 `objc_methname`).
|
||||
|
||||
#### 가운데 패널
|
||||
|
||||
가운데 패널에서는 **디스어셈블리된 코드**를 볼 수 있습니다. 그리고 **원시** 디스어셈블리, **그래프**, **디컴파일** 및 **바이너리**로 볼 수 있습니다. 각각의 아이콘을 클릭하여:
|
||||
가운데 패널에서는 **어셈블리 코드**를 볼 수 있습니다. **원시** 어셈블리, **그래프**, **디컴파일** 및 **바이너리**로 볼 수 있습니다. 각 아이콘을 클릭하여 확인할 수 있습니다:
|
||||
|
||||
<figure><img src="../../../.gitbook/assets/image (2) (6).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../../../.gitbook/assets/image (340).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
코드 객체를 마우스 오른쪽 버튼으로 클릭하면 해당 객체에 대한 **참조/참조**를 볼 수 있거나 이름을 변경할 수 있습니다 (디컴파일된 의사 코드에서는 작동하지 않음):
|
||||
|
||||
<figure><img src="../../../.gitbook/assets/image (1) (1) (2).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../../../.gitbook/assets/image (1114).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
또한, **가운데 아래에서 파이썬 명령어를 작성**할 수 있습니다.
|
||||
|
||||
#### 오른쪽 패널
|
||||
|
||||
오른쪽 패널에서는 **탐색 기록** (현재 상황에 도달하는 방법을 알 수 있음), **호출 그래프** (이 함수를 호출하는 모든 함수 및 이 함수가 호출하는 모든 함수를 볼 수 있음) 및 **로컬 변수** 정보와 같은 흥미로운 정보를 볼 수 있습니다.
|
||||
오른쪽 패널에서는 **탐색 기록** (현재 상황에 도달한 방법을 알 수 있음), **호출 그래프** (이 함수를 호출하는 모든 함수 및 이 함수가 호출하는 모든 함수를 볼 수 있는 그래프) 및 **로컬 변수** 정보와 같은 흥미로운 정보를 볼 수 있습니다.
|
||||
|
||||
### dtrace
|
||||
|
||||
Dtrace는 사용자가 **매우 낮은 수준**에서 응용 프로그램에 액세스할 수 있도록 하며, 사용자가 **프로그램을 추적**하고 실행 흐름을 심지어 변경할 수 있는 방법을 제공합니다. Dtrace는 **커널 전체에 배치된** 프로브를 사용하며 시스템 호출의 시작과 끝과 같은 위치에 있습니다.
|
||||
Dtrace는 사용자가 **매우 낮은 수준**에서 응용 프로그램에 액세스할 수 있도록 하며 프로그램을 **추적**하고 실행 흐름을 변경할 수 있는 방법을 제공합니다. Dtrace는 **커널 전체에 배치된 프로브**를 사용하며 시스템 호출의 시작과 끝과 같은 위치에 있습니다.
|
||||
|
||||
DTrace는 각 시스템 호출에 대해 프로브를 생성하기 위해 **`dtrace_probe_create`** 함수를 사용합니다. 이러한 프로브는 각 시스템 호출의 **진입점과 종료점**에서 발생할 수 있습니다. DTrace와의 상호 작용은 루트 사용자에게만 제공되는 /dev/dtrace를 통해 이루어집니다.
|
||||
DTrace는 각 시스템 호출에 대해 프로브를 생성하기 위해 **`dtrace_probe_create`** 함수를 사용합니다. 이러한 프로브는 각 시스템 호출의 **진입점과 종료점**에서 발생할 수 있습니다. DTrace와의 상호 작용은 루트 사용자만 사용할 수 있는 /dev/dtrace를 통해 이루어집니다.
|
||||
|
||||
{% hint style="success" %}
|
||||
SIP 보호를 완전히 비활성화하지 않고 Dtrace를 활성화하려면 복구 모드에서 다음을 실행할 수 있습니다: `csrutil enable --without dtrace`
|
||||
|
@ -293,45 +309,45 @@ dtruss -c -p 1000 #get syscalls of PID 1000
|
|||
```
|
||||
### ktrace
|
||||
|
||||
심지어 **SIP가 활성화**된 상태에서도 이를 사용할 수 있습니다.
|
||||
**SIP가 활성화된 상태에서도** 사용할 수 있습니다.
|
||||
```bash
|
||||
ktrace trace -s -S -t c -c ls | grep "ls("
|
||||
```
|
||||
### ProcessMonitor
|
||||
|
||||
[**ProcessMonitor**](https://objective-see.com/products/utilities.html#ProcessMonitor)는 프로세스가 수행하는 프로세스 관련 작업을 확인하는 매우 유용한 도구입니다 (예: 프로세스가 생성하는 새 프로세스를 모니터링).
|
||||
[**ProcessMonitor**](https://objective-see.com/products/utilities.html#ProcessMonitor)은 프로세스가 수행하는 프로세스 관련 작업을 확인하는 매우 유용한 도구입니다 (예: 프로세스가 생성하는 새로운 프로세스를 모니터링).
|
||||
|
||||
### SpriteTree
|
||||
|
||||
[**SpriteTree**](https://themittenmac.com/tools/)는 프로세스 간 관계를 출력하는 도구입니다.\
|
||||
**`sudo eslogger fork exec rename create > cap.json`**과 같은 명령으로 맥을 모니터링해야 합니다 (이 명령을 실행하는 터미널은 FDA가 필요합니다). 그런 다음 이 도구에서 json을 로드하여 모든 관계를 볼 수 있습니다:
|
||||
**`sudo eslogger fork exec rename create > cap.json`**과 같은 명령을 사용하여 맥을 모니터링해야 합니다 (이 명령을 실행하는 터미널은 FDA가 필요합니다). 그런 다음 이 도구에서 json을 로드하여 모든 관계를 볼 수 있습니다:
|
||||
|
||||
<figure><img src="../../../.gitbook/assets/image (710).png" alt="" width="375"><figcaption></figcaption></figure>
|
||||
<figure><img src="../../../.gitbook/assets/image (1179).png" alt="" width="375"><figcaption></figcaption></figure>
|
||||
|
||||
### FileMonitor
|
||||
|
||||
[**FileMonitor**](https://objective-see.com/products/utilities.html#FileMonitor)는 파일 이벤트 (생성, 수정 및 삭제와 같은)를 모니터링하여 이러한 이벤트에 대한 자세한 정보를 제공합니다.
|
||||
[**FileMonitor**](https://objective-see.com/products/utilities.html#FileMonitor)는 파일 이벤트 (생성, 수정, 삭제와 같은)를 모니터링하여 이러한 이벤트에 대한 자세한 정보를 제공합니다.
|
||||
|
||||
### Crescendo
|
||||
|
||||
[**Crescendo**](https://github.com/SuprHackerSteve/Crescendo)는 Microsoft Sysinternal의 _Procmon_에서 Windows 사용자가 알 수 있는 외관을 가진 GUI 도구입니다. 이 도구를 사용하면 다양한 이벤트 유형의 녹화를 시작하고 중지할 수 있으며 파일, 프로세스, 네트워크 등과 같은 범주별로 이러한 이벤트를 필터링하고 json 형식으로 기록된 이벤트를 저장할 수 있습니다.
|
||||
[**Crescendo**](https://github.com/SuprHackerSteve/Crescendo)는 Microsoft Sysinternal의 _Procmon_에서 Windows 사용자가 알 수 있는 외관을 가진 GUI 도구입니다. 이 도구를 사용하면 다양한 이벤트 유형의 녹화를 시작하고 중지할 수 있으며 파일, 프로세스, 네트워크 등과 같은 범주별로 이러한 이벤트를 필터링할 수 있으며 녹화된 이벤트를 json 형식으로 저장할 수 있습니다.
|
||||
|
||||
### Apple Instruments
|
||||
|
||||
[**Apple Instruments**](https://developer.apple.com/library/archive/documentation/Performance/Conceptual/CellularBestPractices/Appendix/Appendix.html)은 Xcode의 개발자 도구의 일부입니다. 애플리케이션 성능을 모니터링하고 메모리 누수를 식별하며 파일 시스템 활동을 추적하는 데 사용됩니다.
|
||||
[**Apple Instruments**](https://developer.apple.com/library/archive/documentation/Performance/Conceptual/CellularBestPractices/Appendix/Appendix.html)은 Xcode의 개발자 도구의 일부로 사용되며 애플리케이션 성능을 모니터링하고 메모리 누수를 식별하며 파일 시스템 활동을 추적하는 데 사용됩니다.
|
||||
|
||||
![](<../../../.gitbook/assets/image (15).png>)
|
||||
![](<../../../.gitbook/assets/image (1135).png>)
|
||||
|
||||
### fs\_usage
|
||||
|
||||
프로세스가 수행하는 작업을 따를 수 있게 해줍니다:
|
||||
프로세스가 수행하는 작업을 따를 수 있게 합니다:
|
||||
```bash
|
||||
fs_usage -w -f filesys ls #This tracks filesystem actions of proccess names containing ls
|
||||
fs_usage -w -f network curl #This tracks network actions
|
||||
```
|
||||
### TaskExplorer
|
||||
|
||||
[**Taskexplorer**](https://objective-see.com/products/taskexplorer.html)는 이진 파일이 사용하는 **라이브러리**, 사용 중인 **파일** 및 **네트워크** 연결을 볼 수 있는 유용한 도구입니다.\
|
||||
[**Taskexplorer**](https://objective-see.com/products/taskexplorer.html)는 이진 파일이 사용하는 **라이브러리**, 사용 중인 **파일** 및 **네트워크** 연결을 확인하는 데 유용합니다.\
|
||||
또한 바이너리 프로세스를 **virustotal**에 대해 확인하고 해당 바이너리에 대한 정보를 표시합니다.
|
||||
|
||||
## PT\_DENY\_ATTACH <a href="#page-title" id="page-title"></a>
|
||||
|
@ -340,14 +356,14 @@ fs_usage -w -f network curl #This tracks network actions
|
|||
|
||||
### lldb
|
||||
|
||||
**lldb**는 **macOS** 이진 파일 **디버깅**을 위한 사실상의 도구입니다.
|
||||
**lldb**는 **macOS** 이진 파일 **디버깅**에 대한 사실상의 도구입니다.
|
||||
```bash
|
||||
lldb ./malware.bin
|
||||
lldb -p 1122
|
||||
lldb -n malware.bin
|
||||
lldb -n malware.bin --waitfor
|
||||
```
|
||||
**`.lldbinit`**이라는 파일을 홈 폴더에 만들고 다음 줄을 추가하여 lldb를 사용할 때 intel 플레이버를 설정할 수 있습니다:
|
||||
홈 폴더에 다음 라인을 포함하는 **`.lldbinit`**이라는 파일을 만들어 lldb를 사용할 때 intel 플레이버를 설정할 수 있습니다:
|
||||
```bash
|
||||
settings set target.x86-disassembly-flavor intel
|
||||
```
|
||||
|
@ -355,10 +371,10 @@ settings set target.x86-disassembly-flavor intel
|
|||
lldb 내에서 `process save-core`를 사용하여 프로세스 덤프
|
||||
{% endhint %}
|
||||
|
||||
<table data-header-hidden><thead><tr><th width="225"></th><th></th></tr></thead><tbody><tr><td><strong>(lldb) 명령어</strong></td><td><strong>설명</strong></td></tr><tr><td><strong>run (r)</strong></td><td>중단점이 만나거나 프로세스가 종료될 때까지 계속 실행을 시작합니다.</td></tr><tr><td><strong>continue (c)</strong></td><td>디버그된 프로세스의 실행을 계속합니다.</td></tr><tr><td><strong>nexti (n / ni)</strong></td><td>다음 명령을 실행합니다. 이 명령은 함수 호출을 건너뜁니다.</td></tr><tr><td><strong>stepi (s / si)</strong></td><td>다음 명령을 실행합니다. nexti 명령과 달리 이 명령은 함수 호출 내부로 진입합니다.</td></tr><tr><td><strong>finish (f)</strong></td><td>현재 함수("프레임")의 남은 명령을 실행하고 중지합니다.</td></tr><tr><td><strong>control + c</strong></td><td>실행을 일시 중지합니다. 프로세스가 실행(r)되거나 계속(c)된 경우 현재 실행 중인 위치에서 프로세스를 중지시킵니다.</td></tr><tr><td><strong>breakpoint (b)</strong></td><td><p>b main # main 함수 호출</p><p>b <binname>`main # 바이너리의 main 함수</p><p>b set -n main --shlib <lib_name> # 지정된 바이너리의 main 함수</p><p>b -[NSDictionary objectForKey:]</p><p>b -a 0x0000000100004bd9</p><p>br l # 중단점 목록</p><p>br e/dis <num> # 중단점 활성화/비활성화</p><p>breakpoint delete <num></p></td></tr><tr><td><strong>help</strong></td><td><p>help breakpoint # 중단점 명령어 도움말</p><p>help memory write # 메모리 쓰기 도움말</p></td></tr><tr><td><strong>reg</strong></td><td><p>reg read</p><p>reg read $rax</p><p>reg read $rax --format <a href="https://lldb.llvm.org/use/variable.html#type-format">format</a></p><p>reg write $rip 0x100035cc0</p></td></tr><tr><td><strong>x/s <reg/memory address></strong></td><td>메모리를 널 종료된 문자열로 표시합니다.</td></tr><tr><td><strong>x/i <reg/memory address></strong></td><td>어셈블리 명령으로 메모리를 표시합니다.</td></tr><tr><td><strong>x/b <reg/memory address></strong></td><td>바이트로 메모리를 표시합니다.</td></tr><tr><td><strong>print object (po)</strong></td><td><p>매개변수로 참조된 객체를 출력합니다.</p><p>po $raw</p><p><code>{</code></p><p><code>dnsChanger = {</code></p><p><code>"affiliate" = "";</code></p><p><code>"blacklist_dns" = ();</code></p><p>대부분의 Apple Objective-C API 또는 메서드는 객체를 반환하므로 "print object" (po) 명령을 통해 표시해야 합니다. 의미 있는 출력이 나오지 않으면 <code>x/b</code>를 사용하세요.</p></td></tr><tr><td><strong>memory</strong></td><td>memory read 0x000....<br>memory read $x0+0xf2a<br>memory write 0x100600000 -s 4 0x41414141 # 해당 주소에 AAAA 쓰기<br>memory write -f s $rip+0x11f+7 "AAAA" # 주소에 AAAA 쓰기</td></tr><tr><td><strong>disassembly</strong></td><td><p>dis # 현재 함수를 어셈블합니다</p><p>dis -n <funcname> # 함수 어셈블</p><p>dis -n <funcname> -b <basename> # 함수 어셈블<br>dis -c 6 # 6줄 어셈블</p><p>dis -c 0x100003764 -e 0x100003768 # 한 주소부터 다른 주소까지<br>dis -p -c 4 # 현재 주소에서 어셈블 시작</p></td></tr><tr><td><strong>parray</strong></td><td>parray 3 (char **)$x1 # x1 레지스터의 3개 구성 요소 배열 확인</td></tr></tbody></table>
|
||||
<table data-header-hidden><thead><tr><th width="225"></th><th></th></tr></thead><tbody><tr><td><strong>(lldb) 명령어</strong></td><td><strong>설명</strong></td></tr><tr><td><strong>run (r)</strong></td><td>중단점이 만나거나 프로세스가 종료될 때까지 계속 실행을 시작합니다.</td></tr><tr><td><strong>continue (c)</strong></td><td>디버깅 중인 프로세스의 실행을 계속합니다.</td></tr><tr><td><strong>nexti (n / ni)</strong></td><td>다음 명령을 실행합니다. 이 명령은 함수 호출을 건너뜁니다.</td></tr><tr><td><strong>stepi (s / si)</strong></td><td>다음 명령을 실행합니다. nexti 명령과 달리, 이 명령은 함수 호출 내부로 진입합니다.</td></tr><tr><td><strong>finish (f)</strong></td><td>현재 함수("프레임")의 남은 명령을 실행하고 중지합니다.</td></tr><tr><td><strong>control + c</strong></td><td>실행을 일시 중지합니다. 프로세스가 실행 중이거나 계속되고 있다면, 프로세스가 현재 실행 중인 위치에서 중지됩니다.</td></tr><tr><td><strong>breakpoint (b)</strong></td><td><p>b main # main 함수 호출</p><p>b <binname>`main # 바이너리의 main 함수</p><p>b set -n main --shlib <lib_name> # 지정된 바이너리의 main 함수</p><p>b -[NSDictionary objectForKey:]</p><p>b -a 0x0000000100004bd9</p><p>br l # 중단점 목록</p><p>br e/dis <num> # 중단점 활성화/비활성화</p><p>breakpoint delete <num></p></td></tr><tr><td><strong>help</strong></td><td><p>help breakpoint # 중단점 명령어 도움말</p><p>help memory write # 메모리 쓰기 도움말</p></td></tr><tr><td><strong>reg</strong></td><td><p>reg read</p><p>reg read $rax</p><p>reg read $rax --format <a href="https://lldb.llvm.org/use/variable.html#type-format">format</a></p><p>reg write $rip 0x100035cc0</p></td></tr><tr><td><strong>x/s <reg/memory address></strong></td><td>메모리를 널 종료된 문자열로 표시합니다.</td></tr><tr><td><strong>x/i <reg/memory address></strong></td><td>어셈블리 명령으로 메모리를 표시합니다.</td></tr><tr><td><strong>x/b <reg/memory address></strong></td><td>바이트로 메모리를 표시합니다.</td></tr><tr><td><strong>print object (po)</strong></td><td><p>매개변수로 참조된 객체를 출력합니다.</p><p>po $raw</p><p><code>{</code></p><p><code>dnsChanger = {</code></p><p><code>"affiliate" = "";</code></p><p><code>"blacklist_dns" = ();</code></p><p>대부분의 Apple Objective-C API 또는 메서드는 객체를 반환하므로 "print object" (po) 명령을 통해 표시해야 합니다. 의미 있는 출력이 나오지 않으면 <code>x/b</code>를 사용하세요.</p></td></tr><tr><td><strong>memory</strong></td><td>memory read 0x000....<br>memory read $x0+0xf2a<br>memory write 0x100600000 -s 4 0x41414141 # 해당 주소에 AAAA 쓰기<br>memory write -f s $rip+0x11f+7 "AAAA" # 주소에 AAAA 쓰기</td></tr><tr><td><strong>disassembly</strong></td><td><p>dis # 현재 함수의 어셈블리 코드 표시</p><p>dis -n <funcname> # 함수의 어셈블리 코드 표시</p><p>dis -n <funcname> -b <basename> # 함수의 어셈블리 코드 표시</p><p>dis -c 6 # 6줄 어셈블리 코드 표시</p><p>dis -c 0x100003764 -e 0x100003768 # 한 주소부터 다른 주소까지</p><p>dis -p -c 4 # 현재 주소부터 어셈블리 코드 표시 시작</p></td></tr><tr><td><strong>parray</strong></td><td>parray 3 (char **)$x1 # x1 레지스터의 3개 구성 요소 배열 확인</td></tr></tbody></table>
|
||||
|
||||
{% hint style="info" %}
|
||||
**`objc_sendMsg`** 함수를 호출할 때 **rsi** 레지스터는 널 종료된("C") 문자열로 **메서드 이름**을 보유합니다. lldb를 통해 이름을 출력하려면 다음을 수행합니다:
|
||||
**`objc_sendMsg`** 함수를 호출할 때, **rsi** 레지스터는 널 종료된 ("C") 문자열로 **메서드 이름**을 보유합니다. lldb를 통해 이름을 출력하려면:
|
||||
|
||||
`(lldb) x/s $rsi: 0x1000f1576: "startMiningWithPort:password:coreCount:slowMemory:currency:"`
|
||||
|
||||
|
@ -372,24 +388,24 @@ lldb 내에서 `process save-core`를 사용하여 프로세스 덤프
|
|||
|
||||
#### VM 탐지
|
||||
|
||||
* **`sysctl hw.model`** 명령은 **호스트가 MacOS**인 경우 "Mac"을 반환하고 VM인 경우 다른 값을 반환합니다.
|
||||
* **`sysctl hw.model`** 명령은 호스트가 MacOS인 경우 "Mac"을 반환하고 VM인 경우 다른 값을 반환합니다.
|
||||
* 일부 악성 코드는 **`hw.logicalcpu`** 및 **`hw.physicalcpu`** 값을 조작하여 VM인지 여부를 감지하려고 합니다.
|
||||
* 일부 악성 코드는 MAC 주소(00:50:56)를 기반으로 **VMware**인지 여부를 감지할 수 있습니다.
|
||||
* 일부 악성 코드는 MAC 주소(00:50:56)를 기반으로 기계가 VMware인지 여부를 감지할 수 있습니다.
|
||||
* 간단한 코드로 **프로세스가 디버깅되고 있는지** 확인할 수 있습니다:
|
||||
* `if(P_TRACED == (info.kp_proc.p_flag & P_TRACED)){ //process being debugged }`
|
||||
* **`ptrace`** 시스템 호출을 **`PT_DENY_ATTACH`** 플래그와 함께 호출할 수도 있습니다. 이렇게 하면 디버거가 첨부되고 추적되는 것을 방지합니다.
|
||||
* **`sysctl`** 또는 **`ptrace`** 함수가 **가져오기(imported)**되었는지 확인할 수 있습니다(그러나 악성 코드는 동적으로 가져올 수 있음)
|
||||
* **`sysctl`** 또는 **`ptrace`** 함수가 **가져오기(imported)**되었는지 확인할 수 있습니다(악성 코드가 동적으로 가져올 수도 있음)
|
||||
* 이 글에서 언급된 대로, “[Defeating Anti-Debug Techniques: macOS ptrace variants](https://alexomara.com/blog/defeating-anti-debug-techniques-macos-ptrace-variants/)” :\
|
||||
“_메시지 Process # exited with **status = 45 (0x0000002d)**는 일반적으로 디버그 대상이 **PT\_DENY\_ATTACH**를 사용하고 있음을 나타내는 신호입니다_”
|
||||
“_메시지 Process # exited with **status = 45 (0x0000002d)**는 일반적으로 디버그 대상이 **PT\_DENY\_ATTACH**를 사용하고 있음을 나타내는 신호입니다._”
|
||||
## Fuzzing
|
||||
|
||||
### [ReportCrash](https://ss64.com/osx/reportcrash.html)
|
||||
|
||||
ReportCrash **분석이 중단된 프로세스를 분석하고 충돌 보고서를 디스크에 저장**합니다. 충돌 보고서에는 충돌 원인을 진단하는 데 도움이 되는 정보가 포함되어 있습니다.\
|
||||
사용자별 launchd 컨텍스트에서 실행되는 응용 프로그램 및 기타 프로세스의 경우 ReportCrash는 LaunchAgent로 실행되어 사용자의 `~/Library/Logs/DiagnosticReports/`에 충돌 보고서를 저장합니다.\
|
||||
데몬, 시스템 launchd 컨텍스트에서 실행되는 기타 프로세스 및 다른 권한이 있는 프로세스의 경우 ReportCrash는 LaunchDaemon으로 실행되어 시스템의 `/Library/Logs/DiagnosticReports`에 충돌 보고서를 저장합니다.
|
||||
ReportCrash **는 충돌하는 프로세스를 분석하고 충돌 보고서를 디스크에 저장**합니다. 충돌 보고서에는 충돌 원인을 진단하는 데 **도움이 되는 정보**가 포함되어 있습니다.\
|
||||
응용 프로그램 및 다른 프로세스 **사용자별 launchd 컨텍스트에서 실행**되는 경우 ReportCrash는 LaunchAgent로 실행되어 사용자의 `~/Library/Logs/DiagnosticReports/`에 충돌 보고서를 저장합니다.\
|
||||
데몬, 시스템 launchd 컨텍스트에서 실행되는 다른 프로세스 및 다른 권한이 있는 프로세스의 경우 ReportCrash는 LaunchDaemon으로 실행되어 시스템의 `/Library/Logs/DiagnosticReports`에 충돌 보고서를 저장합니다.
|
||||
|
||||
Apple로 전송되는 충돌 보고서에 대해 걱정된다면 비활성화할 수 있습니다. 그렇지 않으면 충돌 보고서는 **서버가 어떻게 충돌했는지 파악하는 데 유용**할 수 있습니다.
|
||||
Apple로 **보내지는 충돌 보고서**에 대해 걱정된다면 비활성화할 수 있습니다. 그렇지 않으면 충돌 보고서는 **서버가 어떻게 충돌했는지 파악하는 데 유용**할 수 있습니다.
|
||||
```bash
|
||||
#To disable crash reporting:
|
||||
launchctl unload -w /System/Library/LaunchAgents/com.apple.ReportCrash.plist
|
||||
|
@ -399,9 +415,9 @@ sudo launchctl unload -w /System/Library/LaunchDaemons/com.apple.ReportCrash.Roo
|
|||
launchctl load -w /System/Library/LaunchAgents/com.apple.ReportCrash.plist
|
||||
sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.ReportCrash.Root.plist
|
||||
```
|
||||
### 슬립
|
||||
### 수면
|
||||
|
||||
MacOS에서 퍼징을 할 때 Mac이 슬립 모드로 들어가지 않도록하는 것이 중요합니다:
|
||||
MacOS에서 퍼징을 할 때 Mac이 잠들지 않도록하는 것이 중요합니다:
|
||||
|
||||
* systemsetup -setsleep Never
|
||||
* pmset, 시스템 환경 설정
|
||||
|
@ -420,7 +436,7 @@ sudo launchctl load -w /System/Library/LaunchDaemons/ssh.plist
|
|||
```
|
||||
### 내부 핸들러
|
||||
|
||||
**다음 페이지를 확인하세요** 지정된 scheme 또는 protocol을 처리하는 앱을 찾는 방법을 알아볼 수 있습니다:
|
||||
**다음 페이지를 확인하여** 지정된 scheme 또는 protocol을 처리하는 앱을 찾는 방법을 알아보세요:
|
||||
|
||||
{% content-ref url="../macos-file-extension-apps.md" %}
|
||||
[macos-file-extension-apps.md](../macos-file-extension-apps.md)
|
||||
|
@ -428,7 +444,7 @@ sudo launchctl load -w /System/Library/LaunchDaemons/ssh.plist
|
|||
|
||||
### 네트워크 프로세스 열거
|
||||
|
||||
네트워크 데이터를 관리하는 프로세스를 찾는 데 흥미로운 정보입니다:
|
||||
네트워크 데이터를 관리하는 프로세스를 찾는 것은 흥미로운 작업입니다:
|
||||
```bash
|
||||
dtrace -n 'syscall::recv*:entry { printf("-> %s (pid=%d)", execname, pid); }' >> recv.log
|
||||
#wait some time
|
||||
|
@ -451,7 +467,7 @@ lldb -o "target create `which some-binary`" -o "settings set target.env-vars DYL
|
|||
|
||||
#### [AFL++](https://github.com/AFLplusplus/AFLplusplus)
|
||||
|
||||
CLI 도구에 작동합니다.
|
||||
CLI 도구에 대해 작동합니다.
|
||||
|
||||
#### [Litefuzz](https://github.com/sec-tools/litefuzz)
|
||||
|
||||
|
@ -485,7 +501,7 @@ litefuzz -s -a tcp://localhost:5900 -i input/screenshared-session --reportcrash
|
|||
```
|
||||
{% endcode %}
|
||||
|
||||
### 더 많은 MacOS 정보에 대한 Fuzzing
|
||||
### 더 많은 MacOS Fuzzing 정보
|
||||
|
||||
* [https://www.youtube.com/watch?v=T5xfL9tEg44](https://www.youtube.com/watch?v=T5xfL9tEg44)
|
||||
* [https://github.com/bnagy/slides/blob/master/OSXScale.pdf](https://github.com/bnagy/slides/blob/master/OSXScale.pdf)
|
||||
|
@ -499,16 +515,29 @@ litefuzz -s -a tcp://localhost:5900 -i input/screenshared-session --reportcrash
|
|||
* [**https://taomm.org/vol1/analysis.html**](https://taomm.org/vol1/analysis.html)
|
||||
* [**The Art of Mac Malware: The Guide to Analyzing Malicious Software**](https://taomm.org/)
|
||||
|
||||
|
||||
### [WhiteIntel](https://whiteintel.io)
|
||||
|
||||
<figure><img src="/.gitbook/assets/image (1224).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
[**WhiteIntel**](https://whiteintel.io)은 **다크 웹**을 기반으로 한 검색 엔진으로, 회사나 그 고객이 **스틸러 악성 소프트웨어**에 의해 **침해**당했는지 무료로 확인할 수 있는 기능을 제공합니다.
|
||||
|
||||
WhiteIntel의 주요 목표는 정보 도난 악성 소프트웨어로 인한 계정 탈취 및 랜섬웨어 공격에 대항하는 것입니다.
|
||||
|
||||
그들의 웹사이트를 방문하여 엔진을 무료로 사용해 볼 수 있습니다:
|
||||
|
||||
{% embed url="https://whiteintel.io" %}
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>제로부터 영웅이 될 때까지 AWS 해킹 배우기</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>와 함께 **제로**부터 **히어로**까지 **AWS 해킹 배우기**</summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사가 HackTricks를 광고하거나 PDF로 다운로드하고 싶다면** [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* **회사를 HackTricks에 광고하거나 HackTricks를 PDF로 다운로드**하려면 [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 구입하세요
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
|
||||
* **💬 [**디스코드 그룹**](https://discord.gg/hRep4RUj7f)에 가입하거나 [**텔레그램 그룹**](https://t.me/peass)에 가입하거나** 트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**를 팔로우하세요.**
|
||||
* **HackTricks 및 HackTricks Cloud** 깃허브 저장소에 PR을 제출하여 **해킹 트릭을 공유하세요.**
|
||||
* **💬 [디스코드 그룹](https://discord.gg/hRep4RUj7f)** 또는 [텔레그램 그룹](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**를 팔로우**하세요.
|
||||
* **HackTricks** 및 **HackTricks Cloud** github 저장소에 PR을 제출하여 **해킹 요령을 공유**하세요.
|
||||
|
||||
</details>
|
||||
|
|
|
@ -2,103 +2,117 @@
|
|||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>에서 AWS 해킹을 처음부터 전문가까지 배워보세요<strong>!</strong></summary>
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team 전문가)로부터 AWS 해킹을 처음부터 전문가까지 배우세요!</strong></summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드**하려면 [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스웨그**](https://peass.creator-spring.com)를 얻으세요.
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요. 독점적인 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션입니다.
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)를 **팔로우**하세요.
|
||||
* **HackTricks**와 **HackTricks Cloud** github 저장소에 PR을 제출하여 **해킹 트릭을 공유**하세요.
|
||||
- **회사가 HackTricks에 광고되길 원하거나 HackTricks를 PDF로 다운로드하고 싶다면** [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
- [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 구매하세요
|
||||
- [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
|
||||
- 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)를 **팔로우**하세요.
|
||||
- **HackTricks** 및 **HackTricks Cloud** github 저장소에 PR을 제출하여 **해킹 요령을 공유**하세요.
|
||||
|
||||
</details>
|
||||
|
||||
### [WhiteIntel](https://whiteintel.io)
|
||||
|
||||
<figure><img src="/.gitbook/assets/image (1224).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
[**WhiteIntel**](https://whiteintel.io)은 **다크 웹**을 활용한 검색 엔진으로, 회사나 그 고객이 **스틸러 악성 코드**에 의해 **침해**당했는지 무료로 확인할 수 있는 기능을 제공합니다.
|
||||
|
||||
WhiteIntel의 주요 목표는 정보 도난 악성 코드로 인한 계정 탈취 및 랜섬웨어 공격을 방지하는 것입니다.
|
||||
|
||||
그들의 웹사이트를 방문하여 엔진을 **무료로** 시험해 볼 수 있습니다:
|
||||
|
||||
{% embed url="https://whiteintel.io" %}
|
||||
|
||||
---
|
||||
|
||||
## **기본 정보**
|
||||
|
||||
macOS의 **시스템 무결성 보호 (SIP)**는 가장 권한이 있는 사용자도 시스템의 핵심 폴더에 무단으로 변경을 가하는 것을 방지하기 위해 설계된 메커니즘입니다. 이 기능은 보호된 영역에서 파일을 추가, 수정 또는 삭제하는 것과 같은 작업을 제한하여 시스템의 무결성을 유지하는 데 중요한 역할을 합니다. SIP에 의해 보호되는 주요 폴더는 다음과 같습니다:
|
||||
macOS의 **시스템 무결성 보호(SIP)**는 가장 권한이 높은 사용자조차도 주요 시스템 폴더에 무단으로 변경을 가하는 것을 방지하기 위해 설계된 메커니즘입니다. 이 기능은 보호된 영역에서 파일을 추가, 수정 또는 삭제하는 것과 같은 작업을 제한함으로써 시스템의 무결성을 유지하는 데 중요한 역할을 합니다. SIP에 의해 보호되는 주요 폴더는 다음과 같습니다:
|
||||
|
||||
* **/System**
|
||||
* **/bin**
|
||||
* **/sbin**
|
||||
* **/usr**
|
||||
- **/System**
|
||||
- **/bin**
|
||||
- **/sbin**
|
||||
- **/usr**
|
||||
|
||||
SIP의 동작을 규정하는 규칙은 **`/System/Library/Sandbox/rootless.conf`**에 위치한 구성 파일에서 정의됩니다. 이 파일에서 별표 (*)로 접두사가 붙은 경로는 엄격한 SIP 제한의 예외로 표시됩니다.
|
||||
SIP의 동작을 규정하는 규칙은 **`/System/Library/Sandbox/rootless.conf`**에 위치한 구성 파일에서 정의됩니다. 이 파일에서 별표(\*)로 접두사가 붙은 경로는 엄격한 SIP 제한의 예외로 표시됩니다.
|
||||
|
||||
다음은 예시입니다:
|
||||
아래 예시를 살펴보세요:
|
||||
```javascript
|
||||
/usr
|
||||
* /usr/libexec/cups
|
||||
* /usr/local
|
||||
* /usr/share/man
|
||||
```
|
||||
이 코드 조각은 SIP가 일반적으로 **`/usr`** 디렉토리를 보호하지만, 특정 하위 디렉토리 (`/usr/libexec/cups`, `/usr/local`, `/usr/share/man`)는 경로 앞에 별표 (*)가 표시되어 수정이 허용된다는 것을 의미합니다.
|
||||
이 스니펫은 SIP가 일반적으로 **`/usr`** 디렉토리를 보호하지만, 특정 하위 디렉토리(``/usr/libexec/cups`, `/usr/local`, `/usr/share/man`)에서는 수정이 허용되며, 이는 해당 경로 앞에 별표(\*)가 표시됨을 나타냅니다.
|
||||
|
||||
SIP로 보호되는 디렉토리나 파일을 확인하려면 **`ls -lOd`** 명령을 사용하여 **`restricted`** 또는 **`sunlnk`** 플래그의 존재 여부를 확인할 수 있습니다. 예를 들어:
|
||||
SIP로 보호되는 디렉토리 또는 파일을 확인하려면 **`ls -lOd`** 명령을 사용하여 **`restricted`** 또는 **`sunlnk`** 플래그의 존재를 확인할 수 있습니다. 예를 들어:
|
||||
```bash
|
||||
ls -lOd /usr/libexec/cups
|
||||
drwxr-xr-x 11 root wheel sunlnk 352 May 13 00:29 /usr/libexec/cups
|
||||
```
|
||||
이 경우, **`sunlnk`** 플래그는 `/usr/libexec/cups` 디렉토리 자체가 **삭제될 수 없음**을 나타냅니다. 그러나 그 안에 있는 파일은 생성, 수정 또는 삭제될 수 있습니다.
|
||||
이 경우에 **`sunlnk`** 플래그는 `/usr/libexec/cups` 디렉토리 자체가 **삭제될 수 없음**을 나타냅니다. 그러나 그 내의 파일은 생성, 수정 또는 삭제할 수 있습니다.
|
||||
|
||||
반면에:
|
||||
한편:
|
||||
```bash
|
||||
ls -lOd /usr/libexec
|
||||
drwxr-xr-x 338 root wheel restricted 10816 May 13 00:29 /usr/libexec
|
||||
```
|
||||
여기서 **`restricted`** 플래그는 `/usr/libexec` 디렉토리가 SIP로 보호되고 있음을 나타냅니다. SIP로 보호된 디렉토리에서는 파일을 생성, 수정 또는 삭제할 수 없습니다.
|
||||
여기서 **`restricted`** 플래그는 `/usr/libexec` 디렉토리가 SIP로 보호된 것을 나타냅니다. SIP로 보호된 디렉토리에서는 파일을 생성, 수정 또는 삭제할 수 없습니다.
|
||||
|
||||
또한, 파일에 **`com.apple.rootless`** 확장 **속성**이 포함되어 있다면 해당 파일도 **SIP로 보호**됩니다.
|
||||
또한, 파일이 **`com.apple.rootless`** 확장 **속성**을 포함하는 경우 해당 파일도 **SIP로 보호**됩니다.
|
||||
|
||||
**SIP는 루트 권한으로 수행되는 다른 작업도 제한**합니다. 예를 들어:
|
||||
**SIP는 또한 다른 루트 작업을 제한**합니다:
|
||||
|
||||
* 신뢰할 수 없는 커널 확장을 로드하는 것
|
||||
* Apple 서명된 프로세스의 작업 포트 가져오기
|
||||
* 신뢰할 수 없는 커널 확장 기능 로드
|
||||
* Apple 서명된 프로세스에 대한 task-ports 가져오기
|
||||
* NVRAM 변수 수정
|
||||
* 커널 디버깅 허용
|
||||
|
||||
옵션은 nvram 변수로 유지되며, 비트 플래그로 표시됩니다(Intel의 경우 `csr-active-config`, ARM의 경우 부팅된 Device Tree에서 `lp-sip0`로 읽힘). XNU 소스 코드의 `csr.sh`에서 플래그를 찾을 수 있습니다:
|
||||
옵션은 비트플래그로 nvram 변수에 유지됩니다(Intel의 `csr-active-config` 및 ARM의 부팅된 Device Tree에서 `lp-sip0`를 읽습니다). `csr.sh`에서 XNU 소스 코드에서 플래그를 찾을 수 있습니다:
|
||||
|
||||
<figure><img src="../../../.gitbook/assets/image (720).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../../../.gitbook/assets/image (1189).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
### SIP 상태
|
||||
|
||||
다음 명령을 사용하여 시스템에서 SIP가 활성화되었는지 확인할 수 있습니다:
|
||||
다음 명령어로 시스템에서 SIP가 활성화되어 있는지 확인할 수 있습니다:
|
||||
```bash
|
||||
csrutil status
|
||||
```
|
||||
SIP를 비활성화해야 하는 경우, 컴퓨터를 복구 모드로 재시작해야 합니다 (시작 중에 Command+R을 누르세요). 그런 다음 다음 명령을 실행하세요:
|
||||
만약 SIP를 비활성화해야 한다면, 컴퓨터를 복구 모드로 재부팅해야 합니다 (부팅 중에 Command+R을 누름), 그리고 다음 명령어를 실행해야 합니다:
|
||||
```bash
|
||||
csrutil disable
|
||||
```
|
||||
SIP를 활성화한 상태로 디버깅 보호 기능을 제거하려면 다음을 수행할 수 있습니다:
|
||||
만약 SIP를 활성화한 채로 디버깅 보호를 제거하고 싶다면 다음을 사용할 수 있습니다:
|
||||
```bash
|
||||
csrutil enable --without debug
|
||||
```
|
||||
### 기타 제한 사항
|
||||
### 다른 제한 사항
|
||||
|
||||
- **사인되지 않은 커널 확장자**(kext)의 로딩을 금지하여 확인된 확장자만 시스템 커널과 상호 작용하도록 합니다.
|
||||
- macOS 시스템 프로세스의 **디버깅을 방지**하여 무단 접근 및 수정으로부터 핵심 시스템 구성 요소를 보호합니다.
|
||||
- dtrace와 같은 **도구가 시스템 프로세스를 검사하는 것을 방해**하여 시스템 운영의 무결성을 더욱 보호합니다.
|
||||
* **사인되지 않은 커널 익스텐션**(kext)의 로딩을 금지하여 확인된 익스텐션이 시스템 커널과 상호작용하도록 합니다.
|
||||
* macOS 시스템 프로세스의 **디버깅을 방지**하여 핵심 시스템 구성 요소가 무단 액세스와 수정으로부터 안전하게 보호됩니다.
|
||||
* **dtrace**와 같은 도구가 시스템 프로세스를 검사하는 것을 금지하여 시스템 작동의 무결성을 더욱 보호합니다.
|
||||
|
||||
**[이 발표에서 SIP 정보에 대해 자세히 알아보세요](https://www.slideshare.net/i0n1c/syscan360-stefan-esser-os-x-el-capitan-sinking-the-ship).**
|
||||
[**이 발표에서 SIP 정보에 대해 자세히 알아보기**](https://www.slideshare.net/i0n1c/syscan360-stefan-esser-os-x-el-capitan-sinking-the-ship)**.**
|
||||
|
||||
## SIP 우회
|
||||
|
||||
SIP 우회를 통해 공격자는 다음을 수행할 수 있습니다:
|
||||
SIP 우회는 공격자가 다음을 수행할 수 있게 합니다:
|
||||
|
||||
- **사용자 데이터에 접근**: 모든 사용자 계정에서 메일, 메시지 및 Safari 기록과 같은 민감한 사용자 데이터를 읽을 수 있습니다.
|
||||
- **TCC 우회**: TCC(투명성, 동의 및 제어) 데이터베이스를 직접 조작하여 웹캠, 마이크 및 기타 리소스에 무단 액세스 권한을 부여할 수 있습니다.
|
||||
- **지속성 확보**: SIP로 보호된 위치에 악성 소프트웨어를 배치하여 루트 권한으로도 제거할 수 없도록 만듭니다. 이는 악성 소프트웨어 제거 도구(MRT)를 조작할 수 있는 잠재력도 포함됩니다.
|
||||
- **커널 확장자 로딩**: 추가적인 보호 기능이 있지만, SIP 우회는 사인되지 않은 커널 확장자를 로딩하는 과정을 단순화합니다.
|
||||
* **사용자 데이터 액세스**: 모든 사용자 계정에서 메일, 메시지 및 Safari 기록과 같은 민감한 사용자 데이터를 읽을 수 있습니다.
|
||||
* **TCC 우회**: TCC(투명성, 동의 및 제어) 데이터베이스를 직접 조작하여 웹캠, 마이크 및 기타 리소스에 무단 액세스를 허용할 수 있습니다.
|
||||
* **영속성 확립**: SIP로 보호된 위치에 악성 코드를 배치하여 루트 권한으로도 제거할 수 없게 만듭니다. 이는 악성 코드 제거 도구(MRT)를 변조할 수 있는 잠재적인 가능성을 포함합니다.
|
||||
* **커널 익스텐션 로드**: 추가적인 보호장치가 있지만 SIP 우회는 사인되지 않은 커널 익스텐션을 로드하는 과정을 간단화합니다.
|
||||
|
||||
### 설치 프로그램 패키지
|
||||
### 설치 프로그램
|
||||
|
||||
**Apple의 인증서로 서명된 설치 프로그램 패키지**는 SIP의 보호 기능을 우회할 수 있습니다. 따라서 표준 개발자가 서명한 패키지도 SIP로 보호된 디렉터리를 수정하려고 시도하면 차단됩니다.
|
||||
**Apple의 인증서로 서명된 설치 프로그램**은 이러한 보호장치를 우회할 수 있습니다. 이는 표준 개발자가 서명한 패키지라도 SIP로 보호된 디렉토리를 수정하려고 시도하면 차단됩니다.
|
||||
|
||||
### SIP 파일이 존재하지 않을 경우
|
||||
### 존재하지 않는 SIP 파일
|
||||
|
||||
잠재적인 루프홀은 **`rootless.conf`에 지정된 파일이 현재 존재하지 않는 경우** 해당 파일을 생성할 수 있다는 것입니다. 악성 소프트웨어는 시스템에 **지속성을 확립**하기 위해 이를 악용할 수 있습니다. 예를 들어, 악성 프로그램은 `rootless.conf`에는 나열되어 있지만 실제로는 존재하지 않는 `/System/Library/LaunchDaemons`에 .plist 파일을 생성할 수 있습니다.
|
||||
잠재적인 구멍 중 하나는 **`rootless.conf`**에 파일이 지정되어 있지만 현재 존재하지 않는 경우, 해당 파일을 생성할 수 있습니다. 악성 코드는 시스템에 **영속성을 확립**하기 위해 이를 악용할 수 있습니다. 예를 들어, 악성 프로그램이 `/System/Library/LaunchDaemons`에 .plist 파일을 생성할 수 있습니다. 이 파일이 `rootless.conf`에 나열되어 있지만 존재하지 않은 경우입니다.
|
||||
|
||||
### com.apple.rootless.install.heritable
|
||||
|
||||
|
@ -108,80 +122,75 @@ SIP 우회를 통해 공격자는 다음을 수행할 수 있습니다:
|
|||
|
||||
#### Shrootless
|
||||
|
||||
[**이 블로그 게시물의 연구원들**](https://www.microsoft.com/en-us/security/blog/2021/10/28/microsoft-finds-new-macos-vulnerability-shrootless-that-could-bypass-system-integrity-protection/)은 macOS의 시스템 무결성 보호(SIP) 메커니즘인 'Shrootless' 취약점을 발견했습니다. 이 취약점은 **`system_installd`** 데몬을 중심으로 합니다. 이 데몬은 **`com.apple.rootless.install.heritable`**라는 권한을 가지고 있으며, 이를 통해 자식 프로세스 중 어느 것이든 SIP의 파일 시스템 제한을 우회할 수 있습니다.
|
||||
[**이 블로그 게시물의 연구원들**](https://www.microsoft.com/en-us/security/blog/2021/10/28/microsoft-finds-new-macos-vulnerability-shrootless-that-could-bypass-system-integrity-protection/)은 macOS의 시스템 무결성 보호(SIP) 메커니즘에서 'Shrootless' 취약점이라고 불리는 취약점을 발견했습니다. 이 취약점은 **`system_installd`** 데몬을 중심으로 하며, 이 데몬은 **`com.apple.rootless.install.heritable`** 권한을 가지고 있어 자식 프로세스 중 어느 것이든 SIP의 파일 시스템 제한을 우회할 수 있습니다.
|
||||
|
||||
**`system_installd`** 데몬은 **Apple**에서 서명한 패키지(.pkg 파일)를 설치합니다.
|
||||
**`system_installd`** 데몬은 **Apple**에서 서명된 패키지를 설치합니다.
|
||||
|
||||
연구원들은 Apple에서 서명한 패키지(.pkg 파일)를 설치하는 동안, 패키지에 포함된 **후속 설치 스크립트**를 **`system_installd`**가 실행한다는 것을 발견했습니다. 이 스크립트는 기본 쉘인 **`zsh`**에 의해 실행되며, 비대화식 모드에서도 **`/etc/zshenv`** 파일에서 명령을 자동으로 실행합니다. 이 동작은 공격자에 의해 악용될 수 있습니다. 악성 `/etc/zshenv` 파일을 생성하고 **`system_installd`가 `zsh`를 호출**할 때까지 기다린 다음, 장치에서 임의의 작업을 수행할 수 있습니다.
|
||||
연구원들은 Apple에서 서명된 패키지(.pkg 파일)를 설치하는 동안 **`system_installd`**가 패키지에 포함된 **post-install** 스크립트를 실행한다는 것을 발견했습니다. 이러한 스크립트는 기본 쉘인 **`zsh`**에 의해 실행되며, 이 쉘은 비대화식 모드에서도 **`/etc/zshenv`** 파일에서 명령을 자동으로 실행합니다. 이 동작은 공격자에 의해 악용될 수 있습니다: 악성 `/etc/zshenv` 파일을 생성하고 **`system_installd`가 `zsh`를 호출**할 때까지 기다리면 기기에서 임의의 작업을 수행할 수 있습니다.
|
||||
|
||||
또한, **`/etc/zshenv`는 SIP 우회뿐만 아니라 일반적인 공격 기술로 사용될 수 있다는 것**이 발견되었습니다. 각 사용자 프로필에는 `~/.zshenv` 파일이 있으며, 이 파일은 `/etc/zshenv`와 동일한 방식으로 작동하지만 루트 권한이 필요하지 않습니다. 이 파일은 `zsh`가 시작될 때마다 트리거되는 지속성 메커니즘으로 사용되거나 권한 상승 메커니즘으로 사용될 수 있습니다. 관리자 사용자가 `sudo -s` 또는 `sudo <command>`를 사용하여 루트로 상승하는 경우, `~/.zshenv` 파일이 트리거되어 실제로 루트로 상승됩니다.
|
||||
또한 **`/etc/zshenv`를 SIP 우회뿐만 아니라 일반적인 공격 기술로 사용할 수 있다는 것**이 발견되었습니다. 각 사용자 프로필에는 루트 권한이 필요하지 않은 `~/.zshenv` 파일이 있으며, 이 파일은 `zsh`가 시작될 때마다 트리거되거나 권한 상승 메커니즘으로 사용될 수 있습니다. 관리자 사용자가 `sudo -s` 또는 `sudo <command>`를 사용하여 루트로 상승하면 `~/.zshenv` 파일이 트리거되어 사실상 루트로 상승합니다.
|
||||
|
||||
#### [**CVE-2022-22583**](https://perception-point.io/blog/technical-analysis-cve-2022-22583/)
|
||||
|
||||
[**CVE-2022-22583**](https://perception-point.io/blog/technical-analysis-cve-2022-22583/)에서는 동일한 **`system_installd`** 프로세스가 여전히 악용될 수 있다는 것이 발견되었습니다. 이는 **`/tmp` 내부에 SIP로 보호된 임의의 이름을 가진 폴더에 후속 설치 스크립트를 넣는 것**이었습니다. 문제는 **`/tmp` 자체가 SIP로 보호되지 않기 때문에**, 가상 이미지를 마운트한 다음 **설치 프로그램**이 거기에 **후속 설치 스크립트**를 넣고 가상 이미지를 **언마운트**하고 **모든 폴더를 다시 생성**하고 **페이로드**가 포함된 **후속 설치 스크립트**를 추가할 수 있다는 것입니다.
|
||||
[**CVE-2022-22583**](https://perception-point.io/blog/technical-analysis-cve-2022-22583/)에서는 동일한 **`system_installd`** 프로세스가 여전히 악용될 수 있음이 발견되었습니다. 이는 **`post-install` 스크립트를 `/tmp` 내 SIP로 보호된 임의의 이름의 폴더에 넣었기 때문**입니다. **`/tmp` 자체는 SIP로 보호되지 않기 때문에** 가상 이미지를 마운트하고, 그런 다음 **installer**가 거기에 **post-install 스크립트를 넣고**, 가상 이미지를 언마운트하고, 모든 **폴더를 다시 생성**하고, **실행할 payload가 포함된 post-installation 스크립트를 추가**할 수 있었습니다.
|
||||
|
||||
#### [fsck\_cs 유틸리티](https://www.theregister.com/2016/03/30/apple\_os\_x\_rootless/)
|
||||
|
||||
**`fsck_cs`**가 **심볼릭 링크**를 따를 수 있는 능력 때문에 중요한 파일을 손상시키는 오류가 발견되었습니다. 구체적으로, 공격자는 _`/dev/diskX`_에서 파일 `/System/Library/Extensions/AppleKextExcludeList.kext/Contents/Info.plist`로의 링크를 만들었습니다. _`/dev/diskX`_에서 **`fsck_cs`**를 실행하면 `Info.plist`가 손상됩니다. 이 파일의 무결성은 운영 체제의 SIP(System Integrity Protection)에 매우 중요하며, 커널 확장자의 로딩을 제어합니다. 손상된 후에는 SIP의 커널 제외 기능이 손상됩니다.
|
||||
|
||||
이 취약점을 악용하기 위한 명령어는 다음과 같습니다:
|
||||
**`fsck_cs`**가 **심볼릭 링크**를 따르는 능력으로 인해 중요한 파일을 손상시키도록 속이는 취약점이 식별되었습니다. 구체적으로, 공격자는 _`/dev/diskX`_에서 파일 `/System/Library/Extensions/AppleKextExcludeList.kext/Contents/Info.plist`로의 링크를 작성했습니다. _`/dev/diskX`_에서 **`fsck_cs`**를 실행하면 `Info.plist`가 손상됩니다. 이 파일의 무결성은 커널 익스텐션의 로딩을 제어하는 SIP(System Integrity Protection)에 중요합니다. 한 번 손상되면 SIP의 커널 제외 관리 능력이 손상됩니다.
|
||||
```bash
|
||||
ln -s /System/Library/Extensions/AppleKextExcludeList.kext/Contents/Info.plist /dev/diskX
|
||||
fsck_cs /dev/diskX 1>&-
|
||||
touch /Library/Extensions/
|
||||
reboot
|
||||
```
|
||||
이 취약점의 악용은 심각한 영향을 가집니다. 일반적으로 커널 확장의 권한을 관리하는 `Info.plist` 파일이 효과가 없어집니다. 이는 `AppleHWAccess.kext`와 같은 특정 확장을 블랙리스트에 추가할 수 없음을 의미합니다. 따라서 SIP의 제어 메커니즘이 정상적으로 작동하지 않으면 이 확장이 로드되어 시스템의 RAM에 무단으로 읽기 및 쓰기 액세스 권한을 부여할 수 있습니다.
|
||||
이 취약점을 악용하면 심각한 결과가 초래됩니다. 일반적으로 커널 확장 프로그램의 권한을 관리하는 `Info.plist` 파일이 효과가 없어집니다. 이는 `AppleHWAccess.kext`와 같은 특정 확장 프로그램을 블랙리스트에 추가할 수 없게 되는 것을 포함합니다. 결과적으로 SIP의 제어 메커니즘이 제대로 작동하지 않으면 이 확장 프로그램이 로드되어 시스템 RAM에 대한 무단 읽기 및 쓰기 액세스가 부여될 수 있습니다.
|
||||
|
||||
#### [SIP 보호 폴더 위에 마운트](https://www.slideshare.net/i0n1c/syscan360-stefan-esser-os-x-el-capitan-sinking-the-ship)
|
||||
|
||||
#### [SIP 보호된 폴더 위에 마운트](https://www.slideshare.net/i0n1c/syscan360-stefan-esser-os-x-el-capitan-sinking-the-ship)
|
||||
|
||||
**SIP 보호된 폴더 위에 새 파일 시스템을 마운트하여 보호를 우회**하는 것이 가능했습니다.
|
||||
**SIP 보호 폴더 위에 새 파일 시스템을 마운트하여 보호를 우회**하는 것이 가능했습니다.
|
||||
```bash
|
||||
mkdir evil
|
||||
# Add contento to the folder
|
||||
hdiutil create -srcfolder evil evil.dmg
|
||||
hdiutil attach -mountpoint /System/Library/Snadbox/ evil.dmg
|
||||
```
|
||||
#### [Upgrader 우회 (2016)](https://objective-see.org/blog/blog\_0x14.html)
|
||||
#### [업그레이드 우회 (2016)](https://objective-see.org/blog/blog\_0x14.html)
|
||||
|
||||
시스템은 `Install macOS Sierra.app` 내에 포함된 설치 디스크 이미지를 이용하여 OS를 업그레이드하기 위해 `bless` 유틸리티를 사용하여 부팅됩니다. 사용된 명령은 다음과 같습니다:
|
||||
시스템은 `Install macOS Sierra.app` 내의 임베디드 설치 디스크 이미지에서 부팅하도록 설정되어 있어 OS를 업그레이드하기 위해 `bless` 유틸리티를 활용합니다. 사용된 명령어는 다음과 같습니다:
|
||||
```bash
|
||||
/usr/sbin/bless -setBoot -folder /Volumes/Macintosh HD/macOS Install Data -bootefi /Volumes/Macintosh HD/macOS Install Data/boot.efi -options config="\macOS Install Data\com.apple.Boot" -label macOS Installer
|
||||
```
|
||||
이 프로세스의 보안은 공격자가 부팅하기 전에 업그레이드 이미지 (`InstallESD.dmg`)를 변경하는 경우 침해될 수 있습니다. 이 전략은 악성 버전 (`libBaseIA.dylib`)으로 동적 로더 (dyld)를 대체하는 것을 포함합니다. 이 대체로 인해 설치 프로그램이 시작될 때 공격자의 코드가 실행됩니다.
|
||||
해커가 부팅하기 전에 업그레이드 이미지(`InstallESD.dmg`)를 변경하면 이 프로세스의 보안이 침해될 수 있습니다. 이 전략은 악성 버전(`libBaseIA.dylib`)의 동적 로더(dyld)로 동적 로더(dyld)를 대체하는 것을 포함합니다. 이 교체로 인해 설치 프로그램이 시작될 때 공격자의 코드가 실행됩니다.
|
||||
|
||||
공격자의 코드는 업그레이드 프로세스 중에 제어를 얻으며, 설치 프로그램에 대한 시스템의 신뢰를 악용합니다. 공격은 `InstallESD.dmg` 이미지를 메소드 스위즐링을 통해 변경함으로써 진행됩니다. 특히 `extractBootBits` 메소드를 대상으로 합니다. 이를 통해 디스크 이미지가 사용되기 전에 악성 코드를 주입할 수 있습니다.
|
||||
|
||||
또한, `InstallESD.dmg` 내에는 업그레이드 코드의 루트 파일 시스템으로 작동하는 `BaseSystem.dmg`가 있습니다. 이에 동적 라이브러리를 주입함으로써 악성 코드가 OS 수준 파일을 변경할 수 있는 프로세스 내에서 작동할 수 있습니다. 이는 시스템 침해 가능성을 크게 증가시킵니다.
|
||||
공격자의 코드는 업그레이드 프로세스 중에 제어를 얻으며, 시스템이 설치 프로그램을 신뢰하는 것을 악용합니다. 공격은 `InstallESD.dmg` 이미지를 메소드 스위즐링을 통해 변경하여 진행되며, 특히 `extractBootBits` 메소드를 대상으로 합니다. 이를 통해 디스크 이미지가 사용되기 전에 악성 코드를 삽입할 수 있습니다.
|
||||
|
||||
또한 `InstallESD.dmg` 내에는 업그레이드 코드의 루트 파일 시스템으로 작동하는 `BaseSystem.dmg`가 있습니다. 이에 동적 라이브러리를 삽입하면 악성 코드가 OS 수준 파일을 변경할 수 있는 프로세스 내에서 작동할 수 있어 시스템 침해 가능성이 크게 증가합니다.
|
||||
|
||||
#### [systemmigrationd (2023)](https://www.youtube.com/watch?v=zxZesAN-TEk)
|
||||
|
||||
[**DEF CON 31**](https://www.youtube.com/watch?v=zxZesAN-TEk)에서 이야기하는 것처럼 **`systemmigrationd`** (SIP 우회 가능)가 **bash**와 **perl** 스크립트를 실행하는 것을 보여줍니다. 이는 env 변수 **`BASH_ENV`**와 **`PERL5OPT`**를 통해 악용될 수 있습니다.
|
||||
[**DEF CON 31**](https://www.youtube.com/watch?v=zxZesAN-TEk)에서 이루어진 이 발표에서는 SIP를 우회할 수 있는 **`systemmigrationd`**가 **bash** 및 **perl** 스크립트를 실행하는 것을 보여줍니다. 이는 환경 변수 **`BASH_ENV`** 및 **`PERL5OPT`**를 통해 악용될 수 있습니다.
|
||||
|
||||
### **com.apple.rootless.install**
|
||||
|
||||
{% hint style="danger" %}
|
||||
**`com.apple.rootless.install`** 권한은 SIP 우회를 허용합니다.
|
||||
**`com.apple.rootless.install`** 권한은 SIP를 우회할 수 있게 합니다.
|
||||
{% endhint %}
|
||||
|
||||
`com.apple.rootless.install` 권한은 macOS에서 System Integrity Protection (SIP) 우회를 허용하는 것으로 알려져 있습니다. 이는 특히 [**CVE-2022-26712**](https://jhftss.github.io/CVE-2022-26712-The-POC-For-SIP-Bypass-Is-Even-Tweetable/)와 관련하여 언급되었습니다.
|
||||
`com.apple.rootless.install` 권한은 macOS에서 시스템 무결성 보호(SIP)를 우회하는 데 사용됩니다. 이는 특히 [**CVE-2022-26712**](https://jhftss.github.io/CVE-2022-26712-The-POC-For-SIP-Bypass-Is-Even-Tweetable/)와 관련하여 주목받았습니다.
|
||||
|
||||
특정한 경우에는 `/System/Library/PrivateFrameworks/ShoveService.framework/Versions/A/XPCServices/SystemShoveService.xpc`에 위치한 시스템 XPC 서비스가 이 권한을 가지고 있습니다. 이로 인해 관련 프로세스는 SIP 제약을 우회할 수 있습니다. 또한, 이 서비스는 보안 조치를 강제하지 않고 파일을 이동할 수 있는 메소드를 제공합니다.
|
||||
특정 경우에는 `/System/Library/PrivateFrameworks/ShoveService.framework/Versions/A/XPCServices/SystemShoveService.xpc`에 위치한 시스템 XPC 서비스가 이 권한을 가지고 있습니다. 이로 인해 관련 프로세스가 SIP 제약을 우회할 수 있습니다. 또한 이 서비스는 보안 조치를 적용하지 않고 파일을 이동할 수 있는 방법을 제공합니다.
|
||||
|
||||
## 봉인된 시스템 스냅샷
|
||||
|
||||
## Sealed System Snapshots
|
||||
봉인된 시스템 스냅샷은 **macOS Big Sur (macOS 11)**에서 Apple에 의해 도입된 기능으로, **시스템 무결성 보호 (SIP)** 메커니즘의 일부로 추가적인 보안 및 시스템 안정성 계층을 제공합니다. 이는 본질적으로 시스템 볼륨의 읽기 전용 버전입니다.
|
||||
|
||||
Sealed System Snapshots는 Apple이 **macOS Big Sur (macOS 11)**에서 도입한 기능으로, **System Integrity Protection (SIP)** 메커니즘의 일부로 추가적인 보안 및 시스템 안정성을 제공합니다. 이는 사실상 시스템 볼륨의 읽기 전용 버전입니다.
|
||||
다음은 더 자세한 내용입니다:
|
||||
|
||||
자세한 내용은 다음과 같습니다:
|
||||
1. **불변 시스템**: 봉인된 시스템 스냅샷은 macOS 시스템 볼륨을 "불변"하게 만들어 시스템을 수정할 수 없게 합니다. 이는 보안이나 시스템 안정성을 저해할 수 있는 무단 또는 우연한 변경을 방지합니다.
|
||||
2. **시스템 소프트웨어 업데이트**: macOS 업데이트나 업그레이드를 설치할 때 macOS는 새로운 시스템 스냅샷을 생성합니다. macOS 시작 볼륨은 이 새로운 스냅샷으로 전환하기 위해 **APFS (Apple File System)**를 사용합니다. 업데이트 적용 프로세스 전체가 이전 스냅샷으로 되돌릴 수 있기 때문에 업데이트 과정이 더 안전하고 신뢰할 수 있어집니다.
|
||||
3. **데이터 분리**: macOS Catalina에서 소개된 데이터 및 시스템 볼륨 분리 개념과 함께, 봉인된 시스템 스냅샷 기능은 모든 데이터와 설정이 별도의 "**데이터**" 볼륨에 저장되도록 합니다. 이 분리로 인해 데이터가 시스템과 독립되어 시스템 업데이트 프로세스가 간소화되고 시스템 보안이 강화됩니다.
|
||||
|
||||
1. **불변 시스템**: Sealed System Snapshots는 macOS 시스템 볼륨을 "불변"하게 만들어 변경할 수 없도록 합니다. 이는 보안이나 시스템 안정성을 저해할 수 있는 무단 또는 우발적인 시스템 변경을 방지합니다.
|
||||
2. **시스템 소프트웨어 업데이트**: macOS 업데이트 또는 업그레이드를 설치할 때마다 macOS는 새로운 시스템 스냅샷을 생성합니다. macOS 시작 볼륨은 이 새로운 스냅샷으로 전환하기 위해 **APFS (Apple File System)**를 사용합니다. 업데이트 적용 프로세스 전체가 이전 스냅샷으로 롤백할 수 있기 때문에 업데이트 과정이 더 안전하고 신뢰할 수 있습니다.
|
||||
3. **데이터 분리**: macOS Catalina에서 도입된 데이터 및 시스템 볼륨 분리 개념과 함께 Sealed System Snapshot 기능은 모든 데이터와 설정이 별도의 "**Data**" 볼륨에 저장되도록 보장합니다. 이 분리는 데이터를 시스템으로부터 독립시키므로 시스템 업데이트 프로세스를 간소화하고 시스템 보안을 강화합니다.
|
||||
|
||||
이러한 스냅샷은 macOS에서 자동으로 관리되며 APFS의 공간 공유 기능 덕분에 디스크에 추가 공간을 차지하지 않습니다. 또한, 이러한 스냅샷은 전체 시스템의 사용자 접근 가능한 백업인 **Time Machine 스냅샷**과는 다릅니다.
|
||||
이러한 스냅샷은 macOS에 의해 자동으로 관리되며 APFS의 공간 공유 기능 덕분에 디스크에 추가 공간을 차지하지 않습니다. 또한 이러한 스냅샷은 전체 시스템의 사용자 접근 가능한 백업인 **타임 머신 스냅샷**과는 다릅니다.
|
||||
|
||||
### 스냅샷 확인
|
||||
|
||||
|
@ -224,30 +233,42 @@ Sealed System Snapshots는 Apple이 **macOS Big Sur (macOS 11)**에서 도입한
|
|||
| FileVault: Yes (Unlocked)
|
||||
</code></pre>
|
||||
|
||||
이전 출력에서는 **사용자 접근 가능한 위치**가 `/System/Volumes/Data` 아래에 마운트되어 있는 것을 볼 수 있습니다.
|
||||
이전 출력에서 **사용자 접근 가능 위치**가 `/System/Volumes/Data` 아래에 마운트되어 있는 것을 볼 수 있습니다.
|
||||
|
||||
또한, **macOS 시스템 볼륨 스냅샷**은 `/`에 마운트되어 있으며 **봉인**되어 있습니다 (OS에 의해 암호화 서명됨). 따라서 SIP가 우회되고 수정되면 **OS가 더 이상 부팅되지 않습니다**.
|
||||
또한, **macOS 시스템 볼륨 스냅샷**은 `/`에 마운트되어 있으며 **봉인**되어 있습니다(OS에 의해 암호화 서명됨). 따라서 SIP가 우회되고 수정되면 **OS가 더 이상 부팅되지 않습니다**.
|
||||
|
||||
봉인이 활성화되었는지 확인하려면 다음을 실행하면 됩니다:
|
||||
봉인이 활성화되어 있는지 **확인**하려면 다음을 실행할 수 있습니다:
|
||||
```bash
|
||||
csrutil authenticated-root status
|
||||
Authenticated Root status: enabled
|
||||
```
|
||||
또한, 스냅샷 디스크는 **읽기 전용**으로 마운트됩니다:
|
||||
```
|
||||
게다가, 스냅샷 디스크는 **읽기 전용**으로도 마운트됩니다:
|
||||
```bash
|
||||
mount
|
||||
/dev/disk3s1s1 on / (apfs, sealed, local, read-only, journaled)
|
||||
```
|
||||
### [WhiteIntel](https://whiteintel.io)
|
||||
|
||||
<figure><img src="/.gitbook/assets/image (1224).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
[**WhiteIntel**](https://whiteintel.io)은 **다크 웹**을 활용한 검색 엔진으로, 회사나 그 고객이 **스틸러 악성 소프트웨어**에 의해 **침해**당했는지 확인하는 **무료** 기능을 제공합니다.
|
||||
|
||||
WhiteIntel의 주요 목표는 정보를 도난당한 악성 소프트웨어로 인한 계정 탈취와 랜섬웨어 공격을 막는 것입니다.
|
||||
|
||||
그들의 웹사이트를 방문하여 **무료**로 엔진을 시도해 볼 수 있습니다:
|
||||
|
||||
{% embed url="https://whiteintel.io" %}
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 AWS 해킹을 처음부터 전문가까지 배워보세요<strong>!</strong></summary>
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 제로부터 AWS 해킹을 전문가로 배우세요!</summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드**하려면 [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스웨그**](https://peass.creator-spring.com)를 얻으세요.
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요. 독점적인 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션입니다.
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)을 **팔로우**하세요.
|
||||
* **Hacking 트릭을 공유하려면** [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소에 PR을 제출하세요.
|
||||
* **HackTricks에 귀사를 광고하거나 HackTricks를 PDF로 다운로드**하려면 [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 구입하세요
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 저희의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
|
||||
* 💬 [**디스코드 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**를 팔로우**하세요.
|
||||
* **HackTricks** 및 **HackTricks Cloud** 깃허브 저장소에 PR을 제출하여 **해킹 트릭을 공유**하세요.
|
||||
|
||||
</details>
|
||||
|
|
|
@ -1,63 +1,65 @@
|
|||
# SOME - 동일 출처 메서드 실행
|
||||
# SOME - Same Origin Method Execution
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 AWS 해킹을 처음부터 전문가까지 배워보세요<strong>!</strong></summary>
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team 전문가)로부터 AWS 해킹을 처음부터 전문가까지 배우세요</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
* **사이버 보안 회사**에서 일하시나요? **회사를 HackTricks에서 광고**하거나 **PEASS의 최신 버전에 액세스**하거나 **HackTricks를 PDF로 다운로드**하고 싶으신가요? [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)를 확인해보세요!
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견해보세요. 독점적인 [**NFT**](https://opensea.io/collection/the-peass-family) 컬렉션입니다.
|
||||
* [**공식 PEASS & HackTricks 스웨그**](https://peass.creator-spring.com)를 얻으세요.
|
||||
* [**💬**](https://emojipedia.org/speech-balloon/) [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter**에서 저를 **팔로우**하세요 🐦[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
* **해킹 트릭을 공유하려면** [**hacktricks repo**](https://github.com/carlospolop/hacktricks) **및** [**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud)에 PR을 제출하세요.
|
||||
* **사이버 보안 회사**에서 일하시나요? **회사가 HackTricks에 광고**되길 원하시나요? 또는 **PEASS의 최신 버전에 액세스**하거나 HackTricks를 **PDF로 다운로드**하고 싶으신가요? [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인해보세요!
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견해보세요, 저희의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
|
||||
* [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 얻으세요
|
||||
* **💬** [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **가입**하거나 **트위터**에서 **팔로우**하세요 🐦[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
* **해킹 트릭을 공유하고 싶으시다면** [**hacktricks repo**](https://github.com/carlospolop/hacktricks) **및** [**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud)에 PR을 제출하세요.
|
||||
|
||||
</details>
|
||||
|
||||
## 동일 출처 메서드 실행
|
||||
### [WhiteIntel](https://whiteintel.io)
|
||||
|
||||
일부 페이지에서는 제한된 자바스크립트를 실행할 수 있는 경우가 있습니다. 예를 들어, **실행될 콜백 값을 제어**할 수 있는 경우입니다(./#javascript-function).
|
||||
<figure><img src="/.gitbook/assets/image (1224).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
이러한 경우에는 **DOM에 액세스하여** 해당 위치에서 찾을 수 있는 **민감한 동작**(예: 버튼 클릭)을 호출하는 것이 가장 좋습니다. 그러나 일반적으로 이러한 취약점은 **DOM에 흥미로운 내용이 없는 작은 엔드포인트에서 발견**됩니다.
|
||||
[**WhiteIntel**](https://whiteintel.io)은 **다크 웹**을 통해 제공되는 검색 엔진으로, 회사나 고객이 **스틸러 악성 코드**에 의해 **침해**당했는지 무료로 확인할 수 있는 기능을 제공합니다.
|
||||
|
||||
이러한 시나리오에서는 이 공격이 매우 유용할 것입니다. 왜냐하면 이 공격의 목표는 **동일 도메인의 다른 페이지에서 DOM 내에서 제한된 JS 실행을 악용**하는 것입니다.
|
||||
WhiteIntel의 주요 목표는 정보 도난 악성 코드로 인한 계정 탈취 및 랜섬웨어 공격을 막는 것입니다.
|
||||
|
||||
그들의 웹사이트를 확인하고 무료로 엔진을 시험해볼 수 있습니다:
|
||||
|
||||
{% embed url="https://whiteintel.io" %}
|
||||
|
||||
---
|
||||
|
||||
## Same Origin Method Execution
|
||||
|
||||
가끔 페이지에서 일부 제한된 자바스크립트를 실행할 수 있는 경우가 있습니다. 예를 들어, **실행될 콜백 값을 제어할 수 있는 경우**입니다.
|
||||
|
||||
이러한 경우에는 **DOM에 액세스하여** 거기에서 발견할 수 있는 민감한 작업(예: 버튼 클릭)을 호출하는 것이 가장 좋은 일 중 하나입니다. 그러나 보통 **DOM에 흥미로운 것이 없는 작은 엔드포인트**에서 이 취약점을 찾을 수 있습니다.
|
||||
|
||||
이러한 시나리오에서는 이 공격이 매우 유용할 것입니다. 왜냐하면 이 공격의 목표는 **동일한 도메인의 다른 페이지에서 DOM 내의 제한된 JS 실행을 악용**하여 매우 흥미로운 작업을 수행할 수 있도록 하는 것입니다.
|
||||
|
||||
기본적으로 공격 흐름은 다음과 같습니다:
|
||||
|
||||
* **악용할 수 있는 콜백을 찾습니다**(잠재적으로 \[\w\\.\_]로 제한됨).
|
||||
* 제한이 없고 임의의 JS를 실행할 수 있는 경우 일반적인 XSS로 이를 악용할 수 있습니다.
|
||||
* **피해자가 공격자가 제어하는 페이지를 엽니다**.
|
||||
* **페이지는 새 창에서 자체를 엽니다**(새 창에는 초기 페이지를 참조하는 **`opener`** 객체가 있습니다).
|
||||
* **초기 페이지**는 **DOM이 위치한 페이지**를 로드합니다.
|
||||
* **두 번째 페이지**는 **콜백을 악용하는 취약한 페이지를 로드**하고 **`opener`** 객체를 사용하여 **초기 페이지에서 일부 동작에 액세스하고 실행**합니다(이제 흥미로운 DOM이 포함된 상태입니다).
|
||||
* **악용할 수 있는 콜백을 찾으세요** (잠재적으로 \[\w\\.\_]로 제한될 수 있음).
|
||||
* 제한이 없고 어떤 JS든 실행할 수 있는 경우, 이를 일반적인 XSS로 악용할 수 있습니다.
|
||||
* **피해자에게** **공격자가 제어하는 페이지를 열도록** 하세요
|
||||
* **페이지는** **다른 창**에서 **자체를 열게** 됩니다(새 창은 초기 창을 참조하는 **`opener`** 객체를 가집니다).
|
||||
* **초기 페이지**는 **흥미로운 DOM이 있는 페이지**를 로드합니다.
|
||||
* **두 번째 페이지**는 **콜백을 악용**하고 **`opener`** 객체를 사용하여 **초기 페이지에서 어떤 작업을 액세스하고 실행**합니다(이제 흥미로운 DOM이 포함된 초기 페이지).
|
||||
|
||||
{% hint style="danger" %}
|
||||
초기 페이지가 두 번째 페이지를 생성한 후에 새 URL에 액세스하더라도 **두 번째 페이지의 `opener` 객체는 새 DOM에서 첫 번째 페이지를 유효한 참조로 유지**됩니다.
|
||||
두 번째 페이지가 두 번째 페이지를 생성한 후에 새 URL에 액세스하더라도, **두 번째 페이지의 `opener` 객체는 새 DOM에서 첫 번째 페이지를 여전히 유효한 참조로 유지**합니다.
|
||||
|
||||
또한 두 번째 페이지가 opener 객체를 사용할 수 있도록 하려면 **두 페이지 모두 동일 출처에 있어야 합니다**. 이러한 취약점을 악용하려면 동일 출처에서 **XSS 유형**을 찾아야 합니다.
|
||||
또한 두 번째 페이지가 opener 객체를 사용할 수 있도록 하려면 **두 페이지가 동일한 출처에 있어야**합니다. 이것이 이 취약점을 악용하기 위해 **동일 출처의 XSS를 찾아야 하는 이유**입니다.
|
||||
{% endhint %}
|
||||
|
||||
### Exploitation
|
||||
|
||||
* 이 양식을 사용하여 이러한 유형의 취약점을 악용하는 **PoC를 생성**할 수 있습니다: [https://www.someattack.com/Playground/SOMEGenerator](https://www.someattack.com/Playground/SOMEGenerator)
|
||||
* 클릭을 사용하여 HTML 요소에 대한 DOM 경로를 찾으려면 이 브라우저 확장 프로그램을 사용할 수 있습니다: [https://www.someattack.com/Playground/targeting\_tool](https://www.someattack.com/Playground/targeting\_tool)
|
||||
* 이 양식을 사용하여 이 유형의 취약점을 악용하는 **PoC를 생성**할 수 있습니다: [https://www.someattack.com/Playground/SOMEGenerator](https://www.someattack.com/Playground/SOMEGenerator)
|
||||
* 클릭으로 HTML 요소에 대한 DOM 경로를 찾기 위해 이 브라우저 확장 프로그램을 사용할 수 있습니다: [https://www.someattack.com/Playground/targeting\_tool](https://www.someattack.com/Playground/targeting\_tool)
|
||||
|
||||
### 예제
|
||||
### Example
|
||||
|
||||
* 취약한 예제를 [https://www.someattack.com/Playground/](https://www.someattack.com/Playground/)에서 찾을 수 있습니다.
|
||||
* 이 예제에서 서버는 **콜백 매개변수의 내용**을 기반으로 **자바스크립트 코드를 생성**하고 **HTML에 추가**합니다: `<script>opener.{callbacl_content}</script>`. 이 예제에서는 명시적으로 `opener`의 사용을 표시할 필요가 없습니다.
|
||||
* [https://www.someattack.com/Playground/](https://www.someattack.com/Playground/)에서 취약한 예제를 찾을 수 있습니다.
|
||||
* 이 예제에서 서버는 **콜백 매개변수의 내용에 따라 javascript 코드를 생성**하고 **HTML에 추가**합니다: `<script>opener.{callbacl_content}</script>` . 이 예에서는 명시적으로 `opener`의 사용을 표시할 필요가 없습니다.
|
||||
* 또한 이 CTF writeup을 확인하세요: [https://ctftime.org/writeup/36068](https://ctftime.org/writeup/36068)
|
||||
|
||||
## 참고 자료
|
||||
## References
|
||||
|
||||
* [https://conference.hitb.org/hitbsecconf2017ams/sessions/everybody-wants-some-advance-same-origin-method-execution/](https://conference.hitb.org/hitbsecconf2017ams/sessions/everybody-wants-some-advance-same-origin-method-execution/)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 AWS 해킹을 처음부터 전문가까지 배워보세요<strong>!</strong></summary>
|
||||
|
||||
* **사이버 보안 회사**에서 일하시나요? **회사를 HackTricks에서 광고**하거나 **PEASS의 최신 버전에 액세스**하거나 **HackTricks를 PDF로 다운로드**하고 싶으신가요? [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)를 확인해보세요!
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견해보세요. 독점적인 [**NFT**](https://opensea.io/collection/the-peass-family) 컬렉션입니다.
|
||||
* [**공식 PEASS & HackTricks 스웨그**](https://peass.creator-spring.com)를 얻으세요.
|
||||
* [**💬**](https://emojipedia.org/speech-balloon/) [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter**에서 저를 **팔로우**하세요 🐦[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
* **해킹 트릭을 공유하려면** [**hacktricks repo**](https://github.com/carlospolop/hacktricks) **및** [**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud)에 PR을 제출하세요.
|
||||
|
||||
</details>
|
||||
|
|
|
@ -1,43 +1,58 @@
|
|||
# 무결성 수준
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 AWS 해킹을 처음부터 전문가까지 배워보세요<strong>!</strong></summary>
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 **제로부터 영웅까지 AWS 해킹 배우기**!</summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드**하려면 [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스웨그**](https://peass.creator-spring.com)를 얻으세요.
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요. 독점적인 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션입니다.
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**를** **팔로우**하세요.
|
||||
* **Hacking 트릭을 공유하려면** [**HackTricks**](https://github.com/carlospolop/hacktricks) **및** [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) **github 저장소에 PR을 제출**하세요.
|
||||
- **회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드**하고 싶다면 [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
- [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 구매하세요
|
||||
- [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
|
||||
- **💬 [Discord 그룹](https://discord.gg/hRep4RUj7f)** 또는 [텔레그램 그룹](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)를 **팔로우**하세요.
|
||||
- **HackTricks** 및 **HackTricks Cloud** github 저장소에 PR을 제출하여 **해킹 트릭을 공유**하세요.
|
||||
|
||||
</details>
|
||||
|
||||
### [WhiteIntel](https://whiteintel.io)
|
||||
|
||||
# 무결성 수준
|
||||
<figure><img src="/.gitbook/assets/image (1224).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Windows Vista 및 이후 버전에서 모든 보호된 항목은 **무결성 수준** 태그와 함께 제공됩니다. 이 설정은 대부분 파일 및 레지스트리 키에 "중간" 무결성 수준을 할당합니다. 단, Internet Explorer 7이 낮은 무결성 수준에서 쓸 수 있는 특정 폴더 및 파일을 제외하고는 말입니다. 기본 동작은 표준 사용자에 의해 시작된 프로세스가 중간 무결성 수준을 갖도록 하는 것이고, 서비스는 일반적으로 시스템 무결성 수준에서 작동합니다. 루트 디렉토리는 높은 무결성 레이블로 보호됩니다.
|
||||
[**WhiteIntel**](https://whiteintel.io)은 **다크 웹**을 활용한 검색 엔진으로, **무료** 기능을 제공하여 회사나 고객이 **스틸러 악성 코드**에 의해 **침해**당했는지 확인할 수 있습니다.
|
||||
|
||||
중요한 규칙 중 하나는 객체를 해당 객체의 수준보다 낮은 무결성 수준을 가진 프로세스가 수정할 수 없다는 것입니다. 무결성 수준은 다음과 같습니다:
|
||||
WhiteIntel의 주요 목표는 정보 도난 악성 코드로 인한 계정 탈취 및 랜섬웨어 공격을 막는 것입니다.
|
||||
|
||||
- **Untrusted**: 이 수준은 익명 로그인을 가진 프로세스를 위한 것입니다. %%%예시: Chrome%%%
|
||||
- **Low**: 주로 인터넷 상호 작용에 사용되며, 특히 Internet Explorer의 보호 모드에서 관련 파일 및 프로세스, 그리고 **임시 인터넷 폴더**와 같은 특정 폴더에 영향을 줍니다. 낮은 무결성 프로세스는 레지스트리 쓰기 액세스 및 제한된 사용자 프로필 쓰기 액세스를 포함한 중요한 제한 사항을 겪습니다.
|
||||
- **Medium**: 대부분의 활동에 대한 기본 수준으로, 표준 사용자와 특정 무결성 수준이 없는 객체에 할당됩니다. 관리자 그룹의 구성원도 기본적으로 이 수준에서 작동합니다.
|
||||
- **High**: 관리자를 위해 예약된 수준으로, 높은 수준 자체를 포함하여 낮은 무결성 수준의 객체를 수정할 수 있게 합니다.
|
||||
- **System**: Windows 커널 및 핵심 서비스를 위한 가장 높은 작동 수준으로, 심지어 관리자도 접근할 수 없어 중요한 시스템 기능을 보호합니다.
|
||||
- **Installer**: 다른 모든 객체를 제거할 수 있도록 하는 독특한 수준입니다.
|
||||
그들의 웹사이트를 방문하여 엔진을 **무료로** 사용해 볼 수 있습니다:
|
||||
|
||||
{% embed url="https://whiteintel.io" %}
|
||||
|
||||
---
|
||||
|
||||
## 무결성 수준
|
||||
|
||||
Windows Vista 이상 버전에서 모든 보호된 항목에는 **무결성 수준** 태그가 있습니다. 이 설정은 대부분 파일과 레지스트리 키에 "중간" 무결성 수준을 할당하며, 특정 폴더 및 파일을 제외하고 Internet Explorer 7이 낮은 무결성 수준에서 쓸 수 있는 파일이나 레지스트리 키에 대해 낮은 무결성 수준을 할당합니다. 기본 동작은 일반 사용자에 의해 시작된 프로세스가 중간 무결성 수준을 갖도록 하는 것이며, 서비스는 일반적으로 시스템 무결성 수준에서 작동합니다. 고 무결성 레이블은 루트 디렉토리를 보호합니다.
|
||||
|
||||
중요한 규칙은 객체가 해당 객체의 수준보다 낮은 무결성 수준을 갖는 프로세스에 의해 수정될 수 없다는 것입니다. 무결성 수준은 다음과 같습니다:
|
||||
|
||||
- **신뢰되지 않는**: 익명 로그인을 사용하는 프로세스를 위한 수준입니다. %%%예시: Chrome%%%
|
||||
- **낮음**: 주로 인터넷 상호작용을 위한 것으로, 특히 Internet Explorer의 보호 모드에서 관련 파일 및 프로세스에 영향을 미치며, **임시 인터넷 폴더**와 같은 특정 폴더에 영향을 줍니다. 낮은 무결성 프로세스는 레지스트리 쓰기 액세스가 없고 사용자 프로필 쓰기 액세스가 제한되는 등 중요한 제한을 받습니다.
|
||||
- **중간**: 대부분의 활동에 대한 기본 수준으로, 특정 무결성 수준이 없는 일반 사용자 및 객체에 할당됩니다. 관리자 그룹의 구성원조차 기본적으로 이 수준에서 작동합니다.
|
||||
- **높음**: 관리자를 위해 예약되어 있으며, 높은 수준 자체를 포함하여 낮은 무결성 수준의 객체를 수정할 수 있게 합니다.
|
||||
- **시스템**: Windows 커널 및 핵심 서비스를 위한 최고 운영 수준으로, 심지어 관리자도 접근할 수 없어 중요한 시스템 기능을 보호합니다.
|
||||
- **설치 프로그램**: 다른 모든 수준보다 높은 고유한 수준으로, 이 수준의 객체는 다른 모든 객체를 제거할 수 있게 합니다.
|
||||
|
||||
프로세스의 무결성 수준은 **Sysinternals**의 **Process Explorer**를 사용하여 프로세스의 **속성**에 액세스하고 "**보안**" 탭을 확인하여 얻을 수 있습니다:
|
||||
|
||||
![](<../../.gitbook/assets/image (318).png>)
|
||||
![](<../../.gitbook/assets/image (821).png>)
|
||||
|
||||
`whoami /groups`를 사용하여 **현재 무결성 수준**을 확인할 수도 있습니다.
|
||||
또한 `whoami /groups`를 사용하여 **현재 무결성 수준**을 확인할 수 있습니다.
|
||||
|
||||
![](<../../.gitbook/assets/image (319).png>)
|
||||
![](<../../.gitbook/assets/image (322).png>)
|
||||
|
||||
## 파일 시스템의 무결성 수준
|
||||
### 파일 시스템의 무결성 수준
|
||||
|
||||
파일 시스템 내부의 객체는 **최소 무결성 수준 요구 사항**을 필요로 할 수 있으며, 프로세스가 이 무결성 프로세스를 갖지 않으면 해당 객체와 상호 작용할 수 없습니다.\
|
||||
예를 들어, 일반 사용자 콘솔에서 **일반 파일을 생성하고 권한을 확인**해 보겠습니다:
|
||||
파일 시스템 내의 객체는 **최소 무결성 수준 요구 사항**이 있을 수 있으며, 프로세스가 이 무결성 프로세스를 갖지 않으면 상호 작용할 수 없습니다.\
|
||||
예를 들어, **일반 사용자 콘솔에서 일반 파일을 만들고 권한을 확인**해 봅시다:
|
||||
```
|
||||
echo asd >asd.txt
|
||||
icacls asd.txt
|
||||
|
@ -48,7 +63,7 @@ NT AUTHORITY\INTERACTIVE:(I)(M,DC)
|
|||
NT AUTHORITY\SERVICE:(I)(M,DC)
|
||||
NT AUTHORITY\BATCH:(I)(M,DC)
|
||||
```
|
||||
이제 파일에 최소 **높은** 무결성 수준을 할당해 보겠습니다. 이 작업은 **관리자 권한으로 실행되는 콘솔**에서 수행되어야 합니다. 일반 콘솔은 중간 무결성 수준에서 실행되므로 객체에 높은 무결성 수준을 할당할 수 없습니다.
|
||||
이제 파일에 **높은** 최소 무결성 수준을 할당합시다. 이 작업은 **관리자 권한으로 실행되는 콘솔**에서 수행되어야 합니다. 일반 콘솔은 중간 무결성 수준에서 실행되므로 객체에 **높은** 무결성 수준을 할당할 수 없습니다:
|
||||
```
|
||||
icacls asd.txt /setintegritylevel(oi)(ci) High
|
||||
processed file: asd.txt
|
||||
|
@ -63,7 +78,7 @@ NT AUTHORITY\SERVICE:(I)(M,DC)
|
|||
NT AUTHORITY\BATCH:(I)(M,DC)
|
||||
Mandatory Label\High Mandatory Level:(NW)
|
||||
```
|
||||
여기서 흥미로운 점이 나타납니다. 사용자 `DESKTOP-IDJHTKP\user`가 파일에 대해 **전체 권한**을 가지고 있음을 알 수 있습니다 (실제로 이 파일을 생성한 사용자입니다). 그러나 최소 무결성 수준이 구현되어 있기 때문에 그는 더 이상 파일을 수정할 수 없습니다. 단, 높은 무결성 수준에서 실행 중인 경우에만 파일을 읽을 수 있습니다.
|
||||
이곳에서 흥미로운 점이 나타납니다. 사용자 `DESKTOP-IDJHTKP\user`가 파일에 대해 **전체 권한**을 가지고 있음을 알 수 있습니다 (실제로 이 사용자가 파일을 생성한 사용자였습니다). 그러나 최소 무결성 수준이 구현되어 있기 때문에 더 이상 파일을 수정할 수 없을 것입니다. 높은 무결성 수준에서 실행 중이 아닌 한 (참고로 파일을 읽을 수는 있습니다):
|
||||
```
|
||||
echo 1234 > asd.txt
|
||||
Access is denied.
|
||||
|
@ -73,12 +88,12 @@ C:\Users\Public\asd.txt
|
|||
Access is denied.
|
||||
```
|
||||
{% hint style="info" %}
|
||||
**따라서 파일이 최소 무결성 수준을 가질 때 해당 파일을 수정하려면 해당 무결성 수준 이상으로 실행해야 합니다.**
|
||||
**따라서 파일이 최소 무결성 수준을 갖고 있을 때 해당 파일을 수정하려면 적어도 해당 무결성 수준에서 실행 중이어야 합니다.**
|
||||
{% endhint %}
|
||||
|
||||
## 이진 파일의 무결성 수준
|
||||
### 이진 파일의 무결성 수준
|
||||
|
||||
나는 `cmd.exe`를 `C:\Windows\System32\cmd-low.exe`로 복사하고 **관리자 콘솔에서 낮은 무결성 수준으로 설정했습니다:**
|
||||
나는 `cmd.exe`의 사본을 `C:\Windows\System32\cmd-low.exe`로 만들었고 **관리자 콘솔에서 낮은 무결성 수준으로 설정했습니다:**
|
||||
```
|
||||
icacls C:\Windows\System32\cmd-low.exe
|
||||
C:\Windows\System32\cmd-low.exe NT AUTHORITY\SYSTEM:(I)(F)
|
||||
|
@ -88,29 +103,42 @@ APPLICATION PACKAGE AUTHORITY\ALL APPLICATION PACKAGES:(I)(RX)
|
|||
APPLICATION PACKAGE AUTHORITY\ALL RESTRICTED APP PACKAGES:(I)(RX)
|
||||
Mandatory Label\Low Mandatory Level:(NW)
|
||||
```
|
||||
이제 `cmd-low.exe`를 실행하면 **중간 수준 대신 낮은 무결성 수준에서 실행**됩니다:
|
||||
이제 `cmd-low.exe`를 실행하면 **낮은 무결성 수준**에서 실행됩니다. 대신에 중간 수준에서:
|
||||
|
||||
![](<../../.gitbook/assets/image (320).png>)
|
||||
![](<../../.gitbook/assets/image (310).png>)
|
||||
|
||||
궁금한 사람들을 위해, 이진 파일에 높은 무결성 수준을 할당하면 (`icacls C:\Windows\System32\cmd-high.exe /setintegritylevel high`), 자동으로 높은 무결성 수준에서 실행되지 않습니다 (기본적으로 중간 무결성 수준에서 호출하는 경우 중간 무결성 수준에서 실행됩니다).
|
||||
궁금한 사람들을 위해, 이진 파일에 높은 무결성 수준을 할당하면 (`icacls C:\Windows\System32\cmd-high.exe /setintegritylevel high`), 자동으로 높은 무결성 수준에서 실행되지 않습니다 (기본적으로 중간 무결성 수준에서 호출하면 중간 무결성 수준에서 실행됩니다).
|
||||
|
||||
## 프로세스의 무결성 수준
|
||||
### 프로세스의 무결성 수준
|
||||
|
||||
모든 파일과 폴더가 최소한의 무결성 수준을 갖지는 않지만, **모든 프로세스는 무결성 수준에서 실행**됩니다. 파일 시스템에서 발생한 것과 유사하게, **프로세스가 다른 프로세스 내부에 쓰기를 하려면 적어도 동일한 무결성 수준을 가져야 합니다**. 즉, 낮은 무결성 수준을 갖는 프로세스는 중간 무결성 수준을 갖는 프로세스에 대한 전체 액세스를 가진 핸들을 열 수 없습니다.
|
||||
모든 파일과 폴더가 최소 무결성 수준을 갖지는 않지만, **모든 프로세스는 무결성 수준 하에서 실행됩니다**. 파일 시스템에서 발생한 것과 유사하게, **프로세스가 다른 프로세스 내부에 쓰기를 원할 때는 적어도 동일한 무결성 수준을 가져야 합니다**. 이는 낮은 무결성 수준을 갖는 프로세스가 중간 무결성 수준을 갖는 프로세스에 대한 전체 액세스 핸들을 열 수 없음을 의미합니다.
|
||||
|
||||
이와 이전 섹션에서 언급한 제한 사항으로 인해, 보안적인 측면에서는 항상 **가능한 한 낮은 무결성 수준에서 프로세스를 실행하는 것이 권장**됩니다.
|
||||
이와 이전 섹션에서 언급된 제한 사항으로 인해, 보안적인 측면에서 항상 **가능한 한 낮은 무결성 수준에서 프로세스를 실행하는 것이 권장됩니다**.
|
||||
|
||||
|
||||
### [WhiteIntel](https://whiteintel.io)
|
||||
|
||||
<figure><img src="/.gitbook/assets/image (1224).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
[**WhiteIntel**](https://whiteintel.io)은 **다크 웹**을 기반으로 한 검색 엔진으로, 회사나 그 고객이 **스틸러 악성 코드**에 의해 **침해**당했는지 무료 기능을 제공합니다.
|
||||
|
||||
WhiteIntel의 주요 목표는 정보 탈취 악성 코드로 인한 계정 탈취 및 랜섬웨어 공격을 막는 것입니다.
|
||||
|
||||
그들의 웹사이트를 방문하여 무료로 엔진을 시도해 볼 수 있습니다:
|
||||
|
||||
{% embed url="https://whiteintel.io" %}
|
||||
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 AWS 해킹을 처음부터 전문가까지 배워보세요<strong>!</strong></summary>
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 **제로부터 영웅까지 AWS 해킹 배우기**!</summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드**하려면 [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스웨그**](https://peass.creator-spring.com)를 얻으세요.
|
||||
* 독점적인 [**NFTs**](https://opensea.io/collection/the-peass-family)인 [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요.
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**를** 팔로우하세요.
|
||||
* **HackTricks**와 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소에 PR을 제출하여 여러분의 해킹 기술을 공유하세요.
|
||||
* **회사를 HackTricks에 광고하거나 HackTricks를 PDF로 다운로드**하려면 [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 구입하세요
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
|
||||
* **💬 [디스코드 그룹](https://discord.gg/hRep4RUj7f)** 또는 [텔레그램 그룹](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**를 팔로우**하세요.
|
||||
* **HackTricks 및 HackTricks Cloud** 깃허브 저장소에 PR을 제출하여 **해킹 트릭을 공유**하세요.
|
||||
|
||||
</details>
|
||||
|
|
Loading…
Reference in a new issue