
이것은 IDE와 Sublime을 대상으로 git의 clean 필터를 악용하기 위한 작업 증명(proof-of-work)입니다.
이는 문서화된 (알려진) 문제이지만, 제 연구 중에 발견했으며 RT/PT에 상당히 유용합니다.
요약: .git/config의 filter.<name>.clean 지시어는 스크립트를 가리키고, .gitattributes는 해당 필터를 추적된 파일에 바인딩합니다. Git이 해당 파일의 실제 git diff를 렌더링할 때마다 먼저 워크트리 콘텐츠를 clean 명령어로 실행하므로, git은 우리가 지정한 경로를 무작정 실행합니다.
이제 재미있는 부분입니다. 편집기들은 변경된 파일을 클릭하는 순간 자동으로 git diff를 실행하여 SCM(소스 제어 관리) 패널과 거터 주석을 채웁니다. 폴더만 여는 것으로는 충분하지 않지만, 변경 사항을 보는 것은 가능하며, 이는 저장소에 들어갔을 때 매우 자연스러운 동작입니다.
이것은 core.fsmonitor와 동일한 아이디어지만 다른 지시어에 적용된 것이며, fsmonitor가 아니므로 이를 모니터링하는 사람은 이를 볼 수 없습니다. 이러한 트레이드크래프트는 RT 작업 및 침해 가정 시나리오에서 모든 C2 또는 당사의 XRayC2와 함께 사용되어 기존 네트워크 방어를 우회하는 콜백을 얻는 데 적합합니다. (물론 피싱 이메일로 최종 사용자를 속여야 하지만, IDE에서 폴더를 열고 파일을 클릭하는 것은 공정한 작업으로 보입니다.)
작동 증명. git clone은 .git/config를 가져오지 않으므로 .git/이 온전한 상태로 폴더를 전달하세요. .git/config의 설정:
[filter "poc"]
clean = ./icons/clean.sh
smudge = cat
.gitattributes:
sample.txt filter=poc
sample.txt는 커밋되었지만 워킹 트리에서 수정된 상태로 전달됩니다. git이 diff를 실행하는 순간 clean 필터가 작동합니다. clean.sh는 계산기를 띄우고 콘텐츠를 변경 없이 통과시키므로 워킹 트리가 손상되지 않습니다:
#!/bin/sh
pgrep -x Calculator >/dev/null 2>&1 || open -a Calculator 2>/dev/null
exec cat
편집기에서 폴더를 열고 sample.txt를 클릭하여 변경 사항을 보면 계산기가 나타납니다. (계산기를 종료하면 다시 실행됩니다.) 이 POC는 macOS 전용이며, 환경에 맞게 수정하세요.
Cursor (git CLI) 및 Sublime Text (libgit2)에서 테스트 완료.
clean 필터는 전체 git diff에서만 실행되며 git status에서는 실행되지 않으므로, 폴더를 열 때가 아니라 편집기가 변경 사항을 렌더링할 때 작동합니다. 흥미롭게도 Sublime은 libgit2를 통해 인-프로세스로 이를 트리거하며, 페이로드의 부모는 sublime_text 자체이고 체인에 git 바이너리가 없으므로, 이는 git으로 셸 아웃하는 도구에 국한되지 않습니다.
https://github.com/user-attachments/assets/31ea495f-1ed8-44f8-bef3-8c6366a0eece
fsmonitor와 마찬가지로 편집기의 "이 폴더를 신뢰하시겠습니까?" 프롬프트에 의해 제어됩니다. 대부분의 개발자는 ~/Downloads 및 유사한 최상위 폴더를 신뢰된 상태로 유지하며, Cursor는 기본적으로 워크스페이스 신뢰를 끈 상태로 제공되므로 PoC가 자동으로 실행됩니다. 저장소가 해당 신뢰된 경로 외부에 있으면 IDE는 .git/config를 읽기 전에 "이 게시자를 신뢰하시겠습니까?"라고 묻습니다.
Git 문서: core.fsmonitor 및 filter.*는 https://git-scm.com/docs/gitattributes 에서 확인할 수 있습니다.