cyrus-and/fracker
GitHub: cyrus-and/fracker
Fracker 是一套用于在 PHP 应用程序手动安全评估期间追踪和分析函数调用链的工具,由 PHP 扩展和本地监听器应用组成。
Stars: 243 | Forks: 20
# Fracker
[](https://github.com/cyrus-and/fracker/actions?query=workflow:CI)
Fracker 是一套工具,允许轻松地追踪和分析 PHP 函数调用,其目标是在对 PHP 应用程序进行手动安全评估期间为研究人员提供协助。
它包括:
- 一个 [PHP 扩展](#php-extension),需要安装在目标 Web 应用程序的环境中,用于将追踪信息发送到监听器应用程序;
- 一个 [监听器应用程序](#listener-application),在本地运行,负责接收来自 PHP 扩展的追踪信息并进行一些分析,以便向用户展示有意义的数据。

## 设置
通过使用[部署脚本](#deploy-script)或[手动](#manual-setup)来安装 PHP 扩展,然后在[本地](#installation)安装监听器应用程序。
如果仅想进行快速测试,请直接跳转到[演示](#demo)。
## 演示
1. 安装[监听器应用程序](#installation)。
2. 启动一个提供 PHP 演示应用程序的 Docker 容器:
docker run -d -p 80:80 -v "$PWD/demo/:/var/www/html/" --name hello-fracker php:8.2-apache
3. 检查演示 PHP 应用程序是否按预期工作:
curl http://localhost/?expression=7*7
结果是:49
4. 使用[部署脚本](#deploy-script)将 Fracker 部署到容器中:
./scripts/deploy.sh hello-fracker
5. 在另一个终端中启动 Fracker,然后重复上述 `curl` 命令:
fracker
+++ │ Listening on 0.0.0.0:6666
+++ │
001 │ GET localhost/?expression=7*7
001 │ {main}() /var/www/html/index.php +0
001 │ » is_safe(expression="7*7") /var/www/html/index.php +16
001 │ » » preg_match(pattern="/^[0-9+.\\-*\\/() ]+/", subject="7*7") /var/www/html/index.php +12
001 │ » calculate(expression="7*7") /var/www/html/index.php +17
001 │ » » eval("return 7*7;") /var/www/html/index.php +5
+++ │
+++ │ Shutting down...
6. 按 Ctrl-C 退出 Fracker,然后再次使用 `--help` 运行它,也可以尝试其他选项,例如,传递 `-v` 选项以显示返回值!
7. 最后停止并移除容器:
docker rm -f hello-fracker
## 架构
每个 PHP 请求或命令行调用都会触发与监听器的 TCP 连接。该协议仅仅是一个从 PHP 扩展到监听器的以换行符结尾的 JSON 对象流,这些对象包含有关当前请求、执行的调用以及返回值的信息。
这种解耦允许用户实现自己的工具。例如,可以通过将流内容转储到标准输出(假设使用默认的[设置](#settings))来检查原始 JSON 对象:
```
socat tcp-listen:6666,fork,reuseaddr - | jq
```
## PHP 扩展
PHP 扩展是对 [Xdebug](https://github.com/xdebug/xdebug) 的修改,因此安装过程基本相同,故障排除也是如此。
使用 Fracker 最方便的方法可能是使用提供的[部署脚本](#deploy-script)将其部署到 Web 服务器所在的 Docker 容器中,如果需要更通用的解决方案,请使用[手动设置](#manual-setup)。
### 部署脚本
该脚本应该在运行 Apache 的类 Debian 发行版上开箱即用:
```
./scripts/deploy.sh [ []]
```
它配置 PHP 模块连接到指定主机的指定端口(默认为运行 Docker 的主机和[默认](#settings)端口)。
### 手动设置
安装 PHP 开发文件和其他依赖项。例如,在类 Debian 发行版上:
```
apt-get install php8.2-dev libjson-c-dev pkg-config
```
然后进入 `./ext/` 目录,只需运行 `make` 即可获取 Xdebug、应用补丁并构建 Fracker。
要检查一切是否正常,启动[监听器应用程序](#listener-application)然后像这样运行 PHP:
```
php -d "zend_extension=$PWD/xdebug/modules/xdebug.so" -r 'var_dump("Hello Fracker!");'
```
最后,以通常的方式安装 PHP 扩展。简要步骤如下:
1. 将 `./ext/xdebug/modules/xdebug.so` 复制到 PHP 扩展目录(例如 `php-config --extension-dir`);
2. 将 `zend_extension=xdebug` 以及任何其他可选的自定义[设置](#settings)放在应用程序使用的目标环境(SAPI)中由 PHP 解析的某个 INI 文件中;
3. 如有需要,重新加载 Web 服务器。
至此,不再需要源码仓库了。
### 设置
默认的 INI 设置在大多数情况下应该都能正常工作,以下方面可以配置。
#### 监听器应用程序的地址
默认情况下,PHP 扩展将尝试连接到端口 `6666` 上的 `127.0.0.1`。这可以通过以下方式更改:
```
xdebug.trace_fracker_host = 10.10.10.10
xdebug.trace_fracker_port = 1234
```
#### 仅追踪特定请求
默认情况下,每个请求都会被追踪。可以通过以下方式切换到按需行为:
```
xdebug.start_with_request = trigger
xdebug.trigger_value = FRACKER
```
这样,Fracker 将仅追踪在其 GET、POST 或 cookie 参数中包含 `XDEBUG_TRACE=FRACKER` 的请求。
## 监听器应用程序
提供的监听器应用程序是一个 [Node.js](https://nodejs.org/en) 包,通常安装在本地,但只要 PHP 扩展可以访问到它,它就可以驻留在任何地方。
### 安装
使用以下命令安装依赖项:
```
npm install -C ./app/
```
然后使用 `./app/bin/fracker.js` 在本地运行 Fracker。
或者,通过创建指向此文件夹的符号链接来全局安装可执行文件:
```
npm install -g ./app/
```
之后,`fracker` 命令将全局可用。
卸载请使用:
```
rm -fr ./app/node_modules/
npm uninstall -g fracker
```
### 使用和配置
运行 `fracker --help` 获取完整的用法。
为方便起见,随此仓库提供了一些[配置文件](app/configs/),其中列出了几类*有趣的* PHP 函数。像这样使用它们:
```
fracker ./app/configs/file-* # ...
```
## 许可证
本产品依赖于 [Xdebug](https://xdebug.org/),除非另有明确说明,对于 PHP 扩展本身,版权由原作者保留。
相反,监听器应用程序在[不同](app/LICENSE)的许可证下发布。
标签:MITM代理, OpenVAS, PHP, 函数追踪, 自定义脚本, 请求拦截