
EDR(엔드포인트 탐지 및 대응)의 사각지대에서 운영을 돕는 도구
피라미드는 다음으로 구성됩니다:
피라미드는 사후 침투 작업을 회피적으로 수행하는 데 유용하며, 서명된 바이너리(예: python.exe)에서 의존성을 메모리로 임포트하여 공격 도구를 실행합니다. 이는 다음 이유로 가능합니다:
자세한 내용은 DEFCON30 - Adversary village 발표 "Python vs Modern Defenses" 슬라이드 데크 및 내 블로그 게시물을 확인하세요.
이 도구는 EDR의 일부 사각지대 가정에 기반한 우회 전략을 시연하기 위해 제작되었습니다. 이는 이미 존재하는 기술과 도구를 (제가 아는 한) 새로운 방식으로 결합하여 방어를 회피하는 데 도움이 될 수 있습니다. 이 도구의 유일한 의도는 커뮤니티가 이러한 사용에 대한 인식을 높이고 해결을 가속화하는 데 기여하는 것입니다. 이는 제로데이가 아니며, 완전한 기능을 갖춘 화려한 C2도 아닙니다. 피라미드는 EDR의 잠재적 사각지대를 악용하며, 이에 대한 조명을 비추기 위해 공개되었습니다. 방어에 관한 문단이 포함되어 있으며, 경험 많은 블루팀원들이 기여하고 피라미드가 강조하는 문제에 대한 더 나은 해결 방안을 제시할 수 있기를 바랍니다. 모든 정보는 교육 목적으로만 제공됩니다. 지침에 따르는 것은 본인의 책임입니다. 저자와 그의 고용주는 어떠한 개인이나 조직이 입은 직접적 또는 결과적 손해나 손실에 대해 책임을 지지 않습니다.
피라미드의 메모리 내 로딩은 초기에 xorrior의 Empyre - Finder 클래스에서 영감을 받아 확장되었습니다.
snovvcrash가 mod-DonPAPI.py - mod-LaZagne.py - mod-clr.py 모듈을 구축했습니다.
피라미드 모듈 기능은 Python 인터프리터에서 직접 실행할 수 있으며 현재:
Pyramid HTTP 서버 주요 기능:
크래들 주요 기능:
피라미드는 대상 머신에 이미 존재하는 Python 인터프리터와 함께 사용하거나, 공식 임베더블 Python 패키지를 압축 해제한 후 python.exe를 실행하여 Python 다운로드 크래들을 실행할 수 있습니다. 이는 일반적이지 않은 프로세스 트리 패턴을 생성하지 않고 정상적인 Python 애플리케이션 사용처럼 보이게 하는 간단한 방법입니다.
피라미드에서는 다운로드 크래들을 사용하여 HTTP/S를 통해 피라미드 서버에 접속해 모듈과 의존성을 가져옵니다.
모듈은 사용하려는 기능에 따라 특화되어 있으며 다음을 포함합니다:
Python 의존성은 이미 수정되어 메모리에서 충돌 없이 임포트될 수 있도록 고정되었습니다.
현재 사용 가능한 8개의 피라미드 모듈:
git clone https://github.com/naksyn/Pyramid
HTTP 서버용 SSL 인증서 생성:
openssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days 365
자체 서명된 SSL 인증서를 사용하려면 다음을 준수하세요:
예를 들어 PythonMemoryModule을 피라미드와 함께 사용하려면, 페이로드를 Delivery_files 폴더에 넣은 후 pythonmemorymodule.py를 열고 스크립트 상단에서 필요한 매개변수(페이로드 파일 이름 및 PE가 로드된 후 호출할 프로시저 등)를 구성하세요.
피라미드 서버가 실행 중이고 Base 스크립트가 준비되면 Agent/cradle.py 파일에서 pyramid_module 변수를 설정하고 대상에서 실행합니다.
크래들은 Python 표준 라이브러리로 실행되도록 설계되었습니다.
SSL 인증서를 사용하고 기본 인증을 제공하며, 전달 파일을 ChaCha로 암호화하고 서버 구성을 모듈에 자동 생성하며 pythonmemorymodule용 붙여넣기 가능한 크래들을 출력하는 피라미드 HTTP 서버 실행 예시:
python3 pyramid.py -p 443 -ssl -u testuser -pass Sup3rP4ss! -enc "chacha20" -passenc "TestPass1" -server "192.168.1.2" -generate -setcradle pythonmemorymodule.py
시작 시 pyramid.py는 자체 폴더 구조를 파싱하여 key.pem, cert.pem을 찾고 Server 폴더에서 파일을 전달합니다.
https://github.com/naksyn/Pyramid/assets/59816245/4fbc997e-af2d-4ead-881b-ee108c91d195
보이는 python.exe 프롬프트를 띄우지 않고 피라미드를 실행하려면 pythonw.exe를 활용할 수 있습니다. pythonw.exe는 실행 시 콘솔 창을 열지 않으며, 동일한 Windows Embeddable 패키지에 포함되어 있습니다. 다음 그림은 원격 머신에서 pythonw.exe를 사용하여 base-tunnel-socks5.py를 python.exe 콘솔 창 없이 실행하는 예시를 보여줍니다.

Python 모듈을 동적으로 로딩할 때 기본적으로 *.pyd 파일(본질적으로 dll)의 임포트를 지원하지 않습니다. 제가 아는 한 이 문제를 해결하는 유일한 공개 솔루션은 CPython 인터프리터를 재설계한 Scythe *(in-memory-execution)에서 제공합니다. 디지털 서명을 유지하기 위해, 기본 Python 임베더블 패키지를 사용할 수 있는 한 가지 해결책은 필요한 pyd 파일이나 휠을 디스크에 저장하는 것입니다. 대부분의 경우 이는 심각한 OPSEC 영향을 미치지 않아야 하지만, 다음 pyd 파일을 포함하는 휠이 동적 로딩을 완료하기 위해 디스크에 저장된다는 점을 명심하세요: *. Cryptodome – Bloodhound-Python, Impacket, DonPAPI, LaZagne에 필요 *. bcrypt, cryptography, nacl, cffi – paramiko에 필요
python.exe는 좋은 평판을 가진 서명된 바이너리이며 Python 동적 코드에 대한 가시성을 제공하지 않습니다. 피라미드는 이러한 회피 속성을 악용하여 동일한 python.exe 프로세스 내에서 공격 작업을 수행합니다.
따라서 가장 효율적인 해결책 중 하나는 Python Foundation이 서명한 바이너리와 dll을 기본적으로 차단하고, 실제로 Python 바이너리를 사용해야 하는 사용자에 대해서만 예외를 생성하는 것입니다.
임베더블 패키지 다운로드에 대한 알림도 설정할 수 있습니다.
PEP-578을 배포하는 것도 가능하지만 복잡합니다. 이것은 샘플 구현입니다. 그러나 표준 python 바이너리 사용을 차단하지 않고 PEP-578을 배포하면 이 대책이 무용지물이 될 수 있습니다.