
Golang go get 명령에서 원격 명령 실행을 위한 익스플로잇.
Golang go get 명령에서의 원격 명령 실행 익스플로잇.
Go 패키지를 go get으로 가져올 때, Go는 패키지의 어떤 코드도 실행하지 않고 빌드 및 설치하도록 설계되어 있습니다. 의도는 패키지를 전혀 신뢰하지 않고도 안전하게 get, 빌드, 설치할 수 있다는 것입니다. 이론적으로는 Go 툴체인에게 쉬운 작업처럼 보이지만, 실제로는 상당한 도전 과제입니다. go get은 내부적으로 많은 작업을 수행하며, 패키지 설정에 크게 영향을 받는 방식으로 git 및 clang과 같은 서드파티 도구를 호출합니다. 이러한 호출이 안전하도록 보장하는 것은 Go가 아직 완전히 해결하지 못한 어려운 싸움입니다.
cgo가 활성화되면, “go get” 중 빌드 단계에서 호스트 C 컴파일러(gcc 또는 clang)를 호출하며, Go 소스 파일에 지정된 컴파일러 플래그를 추가합니다. gcc와 clang 모두 컴파일러 플래그에 따라 공유 라이브러리 플러그인이 컴파일러에 로드되는 플러그인 메커니즘을 지원합니다. 이는 Go 패키지 저장소가 (예를 들어) // #cgo CFLAGS: -fplugin=exploit.so와 같은 Go 소스 파일과 함께 exploit.so 파일을 포함할 수 있음을 의미하며, 이로 인해 공격 플러그인이 빌드 중 호스트 C 컴파일러에 로드됩니다. gcc 및 clang 플러그인은 호스트 시스템에 대한 접근에 완전히 제한이 없습니다.
Go 1.8.7 이전, Go 1.9.x 1.9.4 이전, Go 1.10rc2 이전의 Go 1.10 프리릴리스는 gcc 또는 clang 플러그인 기능을 악용하여 소스 코드 빌드 중 go get 원격 명령 실행을 허용합니다. -fplugin= 및 -plugin= 인수가 차단되지 않았기 때문입니다.
익스플로잇을 위해 악성 패키지를 호스팅해야 합니다. TLS와 유효한 인증서 체인이 있는 웹사이트가 필요합니다. 쉬운 방법은 github을 사용하는 것입니다.
그런 다음 악성 플러그인/.so 파일이 필요합니다. exploit.c의 코드가 도움이 될 것입니다.
참고: exploit.c의 다음 코드를 자신의 명령으로 변경하세요
void exploit() {
system("<Your CMD>");
}
참고: 이 파일을 피해자의 시스템/PC 아키텍처에 맞게 컴파일하세요
다음 명령을 사용하여 exploit.sp를 빌드할 수 있습니다:
gcc -shared -o exploit.so -fPIC exploit.c
전체 페이로드를 Github에 호스팅하면 피해자에게 패키지 링크를 전달할 수 있습니다.