Striker 是一个简单的命令与控制(C2)程序。


本项目正在积极开发中。大多数功能尚处于实验阶段,后续还将增加更多功能。预计会有破坏性变更。
A) 代理
B) 后端 / 团队服务器
C) 用户界面
克隆仓库:
$ git clone https://github.com/4g3nt47/Striker.git
$ cd Striker
代码库分为四个独立部分:
此部分处理操作员和代理的所有服务器端逻辑。它是一个 NodeJS 应用程序,使用了:
express — 用于 REST API。socket.io — 用于 Web Socket 通信。mongoose — 用于连接 MongoDB。multer — 用于处理文件上传。bcrypt — 用于对用户密码进行哈希处理。源代码位于 backend/ 目录中。设置服务器:
Striker 使用 MongoDB 作为后端数据库来存储所有重要数据。你可以在本地机器上安装 MongoDB,参考这篇指南(适用于基于 Debian 的发行版),或者使用 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=<用于签名会话 Cookie 和加密会话数据的随机字符串>
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
这是操作员使用的 Web UI。它是一个用 Svelte 编写的单页 Web 应用程序,源代码位于 frontend/ 目录中。
设置前端:
$ cd frontend
$ npm install
.env 文件,并将变量 VITE_STRIKER_API 设置为上述 C2 服务器的完整 URL;VITE_STRIKER_API=https://c2.striker.local
$ npm run build
上述步骤会将所有内容编译到 dist/ 目录中的静态 Web 应用程序。你可以将所有文件移动到 Web 服务器的 web 根目录,或者使用像 Python 那样的基本 HTTP 服务器来托管它;
$ cd dist
$ python3 -m http.server 8000
Register 按钮。backend/.env 中的 REGISTRATION_KEY)。这将创建一个标准用户账户。你需要一个管理员账户才能访问某些功能。
你的第一个管理员账户必须手动创建,之后可以在 Web UI 的 Users 选项卡中升级和降级其他账户。
创建第一个管理员账户:
users 集合,将目标用户的 admin 字段设置为 true;有几种不同的方法可以实现这一点。如果你的 CLI 中有 mongo,可以使用以下命令:
$ mongo <你的 MongoDB 连接 URL>
> db.users.updateOne({username: "<你的用户名>"}, {$set: {admin: true}})
如果成功,你会收到以下响应:
{ "acknowledged" : true, "matchedCount" : 1, "modifiedCount" : 1 }
现在你可以登录了 :)
A) 管道重定向
redirector/redirector.py 中提供了一个为 Striker 编写的管道重定向器。显然,这仅适用于纯 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 时使用的身份验证密钥。你可以在 Web 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 的主机。
此目录中有两个文件:
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 应该已经可以使用了。请仔细阅读使用指南。祝您愉快,快乐黑客!
如果您喜欢这个项目,请考虑帮助我把咖啡变成代码!