spq/pkappa2

GitHub: spq/pkappa2

一款面向攻防 CTF 竞赛的网络流量流分析工具,通过 Web 界面提供结构化查询、协议解码和团队协作能力。

Stars: 121 | Forks: 20

# Pkappa2 [![Go Coverage](https://static.pigsec.cn/wp-content/uploads/repos/2026/03/2620006f84063816.svg)](https://raw.githack.com/wiki/spq/pkappa2/coverage.html) Pkappa2 是一款专为攻防(Attack & Defense)CTF 竞赛设计的流量流分析工具。 它通过 HTTP 上传接收 pcap 文件,这些文件通常由 tcpdump-complete 脚本发送,或者通过将 .pcap 文件移动到受监控的文件夹,亦或是使用 PCAP-over-IP 方式接收。 接收到的 pcap 文件经过处理后,用户可以通过 Web 界面对流量流运行查询。 匹配查询条件的流量流将被显示,其内容可以以多种格式查看。 ![搜索结果列表](https://static.pigsec.cn/wp-content/uploads/repos/2026/03/42123d521c063819.jpg) ![流量流视图](https://static.pigsec.cn/wp-content/uploads/repos/2026/03/129f94b2ce063821.png) ![转换器选择](https://static.pigsec.cn/wp-content/uploads/repos/2026/03/6ca4b2fe56063823.png) 通过向 `/upload/filename.pcap` 发送 POST 请求来添加 pcap 文件。请确保文件名是唯一的。 ``` curl --data-binary @some-file.pcap http://localhost:8080/upload/some-file.pcap ``` ## 功能特性 - 对 TCP/UDP 流量流进行结构化搜索 - 支持对流量流数据及元数据进行匹配 - 首次使用时的设置向导 - 通过 PCAP-over-IP、将 .pcap 文件移入受监控文件夹或 HTTP POST 请求接入流量 - 支持 IPv4 和 IPv6 - 将查询保存为服务或标签以便快速检索 - 可编写脚本的流量流[数据转换器](./converters/pkappa2lib/README.md) - 在标签匹配时自动运行转换器并搜索其输出 - 通过 Websocket 实现实时更新的响应式 UI - 为团队成员标记感兴趣的流量流 - 使用 Docker 或单一二进制文件轻松部署 ### 搜索流量流 Pkappa2 使用一种自定义的查询语言,允许你精确找到感兴趣的流量流。 查询格式支持使用 `[AND]|OR|THEN` 连接的筛选器列表。筛选器遵循 `key:value` 或 `key:"value"` 的格式。支持多种键,包括流量流的数据以及元数据(如主机和端口、时间、传输字节数等)。请查看前端界面的帮助页面以获取更多详情。 你可以使用 `[cs]data` 筛选器查找包含正则表达式的流量流: ``` data:"something interesting" ``` 匹配项将在流量流数据中高亮显示。 若要仅在流量流的 `c`lient(客户端)或 `s`erver(服务端)一侧进行搜索,可以分别在筛选器键前加上 `c` 或 `s` 前缀: ``` cdata:flag\{[0-9a-zA-Z\_]\} ``` 这将匹配所有客户端发送了符合该正则表达式的 flag 的流量流。 你可以使用 `THEN` 运算符来查找流量流中发送数据之间的时序关系。 ``` cdata:"GET /\?q=users" then sdata:"

[0-9]+<" ``` 这将显示所有首先由客户端向特定端点发送 GET 请求,然后由服务器回复一些数据的流量流。 在将查询保存为服务或标签后,你可以在查询中包含该服务,以便仅查找特定类型的流量流。 ``` service:MouseAndScreen cdata:websocket ``` 这将匹配所有符合 `MouseAndScreen` 查询且客户端数据中包含 `websocket` 一词的流量流。 ### 将查询保存为服务或标签 你可以将查询保存为不同类型的命名标签。`service` 标签用于区分 CTF 中各任务的流量。它们通常是涉及服务器端口的查询,如 `sport:8080`,但也可以考虑服务器 IP 等其他因素,如 `sport:8008 shost:10.1.7.1`。 要将当前查询保存为服务,请从右上角的菜单中选择 `Save as Service`: ![将查询保存为服务](https://static.pigsec.cn/wp-content/uploads/repos/2026/03/fc2f9a1177063825.png) 其他查询可以以同样的方式保存为常规 `tags`(标签)。最常见的标签是 `flag_in` 和 `flag_out`,它们分别用于在 `cdata` 和 `sdata` 中查找 flag 格式。 当首次访问 pkappa2 且尚未保存任何标签时,也可以通过 `Setup wizard`(设置向导)来创建服务和 `flag_in`、`flag_out` 标签。 ### 标记感兴趣的流量流 每当发现某个流量流比较突出,且不想丢失它时,你可以对其进行标记,以便所有人都能快速找到它。你可以在结果列表中通过复选框进行操作,也可以直接在流量流视图中进行。标记将显示在侧边栏中。 ![添加流量流标记](https://static.pigsec.cn/wp-content/uploads/repos/2026/03/e4f2350a82063827.png) ### 使用流量流数据转换器 每个流量流都可以由在流量流视图中选定的外部脚本进行处理。内置多个转换器用于解码众所周知的协议,如 HTTP、HTTP/2、Websockets、DNS、gRPC、TLS 等。你可以针对某个题目编写自己的转换器,从而快速解密或以其他方式增强输出。关于转换器程序如何与 pkappa2 通信的详细信息,请参阅 [converters folder](./converters/pkappa2lib/README.md)。 `./converters` 文件夹中的所有文件必须是遵循所述 JSON 行协议(通过 stdin/stdout 通信)的可执行脚本。你可以将自己的脚本添加到该文件夹中,并立即在 UI 中选择它进行测试。 #### 将转换器附加到标签 / 可搜索的转换器输出 你可以通过点击侧边栏中标签名称旁菜单中的 `Attach converter` 选项,指定每当流量流匹配某个标签或服务时运行转换器。所有现有和未来的匹配项都将通过转换器运行,并将其输出保存到磁盘。**这也允许你搜索转换器的输出内容。** 每当查看匹配该标签的流量流时,附加的转换器视图会被自动预选。 ![未选择转换器](https://static.pigsec.cn/wp-content/uploads/repos/2026/03/adc3fc8c1b063829.png) ![已选择 Websocket 转换器](https://static.pigsec.cn/wp-content/uploads/repos/2026/03/560d7ea1b6063831.png) ## 安装说明 启动 pkappa2 实例非常简单。你可以直接运行或使用 Docker 容器。 ### Docker ``` $ git clone https://github.com/spq/pkappa2 $ cd pkappa2 $ cp .env.example .env # 修改 .env 文件中的设置。指定 HTTP basic auth 密码等。 $ docker compose up -d ``` 打开 http://localhost:8080/ 访问 Web 界面。 `converters` 文件夹已映射到容器中,方便你进行调整。 你可以修改 `docker-compose.yml` 文件,取消注释 `./pcaps_incoming` 卷绑定挂载,以便通过将文件移入挂载目录来导入 pcap。 所有命令行选项都可以通过环境变量指定。 ### 手动安装 - 需要安装 [go](https://go.dev/dl/) 1.24+ - 安装所需依赖 - libpcap (例如 `apt install libpcap-dev`) - 构建前端:在 `/web` 目录下执行 `yarn && yarn build` - 可选,安装内置转换器的 Python 依赖:`pip install -r converters/pkappa2lib/requirements.txt` - 仅在使用转换器视图时需要 - 在 `/` 目录下运行 `go run cmd/pkappa2/main.go` - 在浏览器中访问 http://localhost:8080/ 你可能需要为 `go run` 命令添加一些参数,请查看 `-help` ### 反向代理 你可以在 pkappa2 前面添加反向代理以增加 TLS 加密或其他选项。以下是一个包含 `/ws` Websocket 端点的 nginx 配置。如果使用反向代理,你可以在 docker-compose.yml 中将端口绑定到 127.0.0.1,以免暴露内部服务器。 ``` server { listen 80; listen [::]:80; server_name pkappa2.your.team; client_max_body_size 100M; location / { proxy_http_version 1.1; proxy_set_header Host $http_host; proxy_set_header Connection $http_connection; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_pass http://127.0.0.1:8080/; } location /ws { proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $http_connection; proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_pass http://127.0.0.1:8080/ws; } } ``` ### 添加网络流量 有多种方式可以将你希望搜索的网络流量告知 pkappa2: 1. 向 `/upload/[filename.pcap]` 端点发送 POST 请求 - `curl --data-binary @some-file.pcap http://localhost:8080/upload/some-file.pcap` 2. 监控文件夹中新的 `.pcap*` 文件,并在其出现时自动导入 - 通过设置 `-watch_dir /some/path` 命令行选项或 `PKAPPA2_WATCH_DIR` 环境变量 3. 使用 PCAP-over-IP 通过 TCP 流式传输数据包 - 例如使用 [foxit-it/pcap-broker](https://github.com/fox-it/pcap-broker) 并在 pkappa2 UI 中添加端点 ### 在 vulnbox 上收集流量 将 pcap 导入 pkappa2 的标准方法是使用 `tcpdump` 的 `-z` 完成脚本。以下脚本可根据你的需求进行调整。重要的是要排除上传 pcap 到 pkappa2 时产生的任何流量,否则 pcap 文件大小会呈指数级增长。将捕获限制在比赛 VPN 接口并将 pcap 上传到外部 IP 是一种隔离方法。请根据你的环境编辑 tcpdump 过滤器。 pkappa2 支持两种不同的 HTTP basic auth 密码。一种用于访问用户界面,另一种仅用于向 `/upload/[filename]` 端点上传 pcap。请务必在此处使用正确的 pcap 密码。 将这些脚本添加到你的 vulnbox 并以 root 身份运行 `tcpdump.sh`。确保 `tcpdump_complete.sh` 脚本具有可执行权限,并且 `pcaps` 文件夹仅对 root 可读。 😉 **tcpdump.sh**: ``` #!/bin/bash set -e cd "$(dirname "$0")" INTERVAL=30 PCAP_DIR="`pwd`/pcaps" IFACE="game" tcpdump -n -i $IFACE "(tcp or udp) and not (port 22)" -Z root -G $INTERVAL -w "${PCAP_DIR}/$IFACE_%Y%m%d_%H%M%S.pcap" -z "`pwd`/tcpdump_complete.sh" ``` **tcpdump_complete.sh**: ``` #!/bin/bash PKAPPA2_IP=127.0.0.1 PKAPPA2_PORT=80 PKAPPA2_USER="admin" PKAPPA2_PASSWD="your_pcap_password" echo "FINISHED $1" curl --data-binary "@$1" http://"${PKAPPA2_USER}":${PKAPPA2_PASSWD}@${PKAPPA2_IP}:${PKAPPA2_PORT}/upload/`basename $1` rm "$1" ``` #### PCAP-over-IP 或者,Pkappa2 支持连接到 PCAP-over-IP 服务器并实时抓取数据包。[foxit-it/pcap-broker](https://github.com/fox-it/pcap-broker) 就是这样的服务器,可以在你的 pkappa2 实例旁启动。 一种便捷的设置方法是[使用 ssh 隧道](https://github.com/fox-it/pcap-broker?tab=readme-ov-file#acquiring-pcap-data-over-ssh)从 pkappa2 主机连接到 vulnbox,在 vulnbox 上运行 `tcpdump` 并将输出通过隧道传输给 pkappa2。只需 vulnbox 上有 tcpdump 和 ssh 即可实现此功能。你需要将私钥添加到 vulnbox 上 root 用户的 `~/.ssh/authorized_keys` 文件中,以允许 pcap-broker 用户进行连接。 在 pkappa2 的 `Manage PCAP-over-IP` 页面(可通过侧边栏的 `More` 选项访问)添加 `localhost:4200` 端点。如果你将其添加到 pkappa2 的 docker-compose.yml 以使用容器间的内部 docker 网络,请相应调整端口。 ## UI 开发 - 构建一次前端(`yarn build`)以便能够运行 pkappa2 - 在 `/web` 中运行 `yarn dev` - 在 `/` 中运行 `go run cmd/pkappa2/main.go -address :8081` - 在浏览器中访问 http://localhost:8080/ - 享受支持热重载变更的前端开发 - 在提交更改前使用 `yarn lint && yarn type-check && yarn format` 你可以使用以下命令导入当前文件夹中的多个 .pcap 文件: `for f in *.pcap; do curl --data-binary "@$f" "http://localhost:8081/upload/$f"; done` ### 生成类型守卫 我们使用类型守卫来验证与后端的 JSON 通信。为了生成所有的类型守卫,请进入 `web/` 并调用 ``` yarn auto-guard ``` 当收到关于类型不匹配的 api-responses 时,你可以通过以下方式调试类型守卫 ``` yarn auto-guard-debug ```

标签:Beacon Object File, CTF工具, DLL注入, EVTX分析, Go语言, IP 地址批量处理, PCAP分析, PKappa2, Prompt Injection, TCP流重组, UDP流分析, Web界面, 抓包分析, 数据可视化, 数据转换器, 日志审计, 流量审计, 漏洞搜索, 程序破解, 端口流量, 网络安全, 请求拦截, 逆向工具, 隐私保护