3-track_hacker Writeup by AI1. 题目描述项目内容题目名称track_hacker题目来源BugKu题目类型Crypto / Traffic Analysis / WebShell 流量分析附件文件shell.pcap (15.0KB)题目背景本题提供了一个网络抓包文件shell.pcap要求分析黑客攻击痕迹从流量中提取 Flag。攻击者通过 WebShell 进行命令执行并使用编码隐藏响应数据。2. 考点分析考点分值权重技能要求PCAP 文件分析20%使用 scapy/Wireshark 分析网络抓包数据HTTP 协议理解25%识别 HTTP 请求/响应结构提取关键字段WebShell 特征识别25%识别 POST 请求中的命令执行模式编码解码技术20%Base64 zlib 双重压缩的识别与解码攻击链还原能力10%从离散数据包中还原完整攻击流程核心知识点WebShell 通信特征: POST 请求包含k密码c命令的参数结构数据隐藏技术: 服务器响应使用Base64(zlib(数据))双重编码Linux 文件隐藏: 通过在文件名前加点.来隐藏文件流量分析工具: Python scapy 库或 Wireshark 的使用3. 解题思路3.1 整体思路文件检查 → 协议分析 → HTTP 请求提取 → WebShell 识别 → 编码解码 → Flag 提取3.2 技术路线步骤目标方法预期结果1了解文件基本信息file命令、scapy读取确认 PCAP 格式2统计协议分布遍历数据包计数发现主要为 HTTP 流量3提取 HTTP 请求解析 TCP 负载找到 5 个关键 POST 请求4识别攻击行为分析 URL 和参数发现 WebShell 攻击链5解码响应数据Base64zlib 解码获取命令执行结果6提取 Flag匹配 flag{} 模式得到最终答案3.3 关键突破口异常短的响应体: HTTP 响应长度为 10-100 字节疑似压缩数据重复的 Base64 字符串:eJwrLy/XTUksSQQADqgDLQ多次出现POST 参数模式:kcometohackmec命令符合 WebShell 特征4. 详细步骤步骤 1: 文件基本信息检查# 检查文件类型fileshell.pcap# 输出pcap capture file, microsecond ts (little-endian) - version 2.4分析: 确认为标准 PCAP 网络抓包文件可使用 scapy 或 Wireshark 分析。步骤 2: 读取并统计协议分布fromscapy.allimport*packetsrdpcap(shell.pcap)print(f总数据包数量{len(packets)})# 输出109# 协议分布统计protocol_count{}forpktinpackets:protopkt.summary().split()[0]protocol_count[proto]protocol_count.get(proto,0)1# 输出Loopback: 109 (100%)分析: 所有 109 个数据包均为 Loopback本地回环流量说明是本地抓包或虚拟机内部流量。步骤 3: 提取 HTTP 请求详情http_requests[]fori,pktinenumerate(packets):ifTCPinpktandRawinpkt:datapkt[Raw].load.decode(utf-8,errorsignore)ifdata.startswith(POST )ordata.startswith(GET ):linesdata.split(\r\n)method_pathlines[0]# 提取关键信息hostcontent_typepost_dataforlineinlines[1:]:ifline.startswith(Host:):hostline.split(:,1)[1].strip()elifline.startswith(Content-Type:):content_typeline.split(:,1)[1].strip()if\r\n\r\nindata:bodydata.split(\r\n\r\n)[1]post_databody[:100]http_requests.append({packet_id:i,method_path:method_path,host:host,content_type:content_type,post_data:post_data})发现的关键请求:包 ID请求方法路径Content-TypePOST 数据4POST/upload.phptext/phpmultipart/form-data…14POST/config.phpapplication/x-www-form-urlencodedkcometohackmecwhoami59POST/config.phpapplication/x-www-form-urlencodedkcometohackmecmv config.php .config.php79POST/.config.phpapplication/x-www-form-urlencodedkcometohackmecwhoami99POST/.config.phpapplication/x-www-form-urlencodedkcometohackmeccat /flag.txt步骤 4: 识别 WebShell 攻击特征WebShell 典型特征:POST /path/to/shell.php Content-Type: application/x-www-form-urlencoded passwordyour_passwordexeccommand_to_execute本题中的模式:POST /config.php (或 .config.php) Content-Type: application/x-www-form-urlencoded kcometohackmeccommand ↑ ↑ 连接密码 执行的命令判断: 这是典型的 PHP WebShell 使用方式攻击者通过 POST 请求传递命令并执行。步骤 5: 提取并解码 HTTP 响应importbase64importzlib http_responses[]fori,pktinenumerate(packets):ifTCPinpktandRawinpkt:datapkt[Raw].load.decode(utf-8,errorsignore)ifHTTP/1.1 200 OKindata:if\r\n\r\nindata:bodydata.split(\r\n\r\n)[1].strip()# 只处理短文本可能是压缩的命令输出iflen(body)100andlen(body)10:try:# Base64 解码decoded_b64base64.b64decode(body)# zlib 解压decompressedzlib.decompress(decoded_b64)resultdecompressed.decode(utf-8,errorsignore)print(f包{i}:{body}-{result})except:pass解码结果对照表:包 ID原始 Base64Base64 解码 (Hex)zlib 解压结果对应命令16eJwrLy/XTUksSQQADqgDLQ789c2b2f2fd74d492c4904000ea8032dwww-datawhoami61eJwDAAAAAAE789c030000000001(空)mv 命令81eJwrLy/XTUksSQQADqgDLQ789c2b2f2fd74d492c4904000ea8032dwww-datawhoami101eJxLy0lMrw6NTzPMS4n3TVWsBQAz4wXi789c4bcb494caf0e8d4f33cc4b89f74d55ac050033e305e2flag{U_f1nd_Me!}cat /flag.txt步骤 6: 还原完整攻击链根据时间线整理攻击过程时间戳: 1531106404 - 1531106442 (约 38 秒的攻击过程) ┌─────────────────────────────────────────────────────────────┐ │ 阶段 1: 上传 WebShell │ ├─────────────────────────────────────────────────────────────┤ │ • 包 ID: 4 │ │ • 请求POST /upload.php │ │ • Content-Type: multipart/form-data │ │ • 行为上传了名为 config.php 的 WebShell 文件 │ │ • 目的获取服务器控制权 │ └─────────────────────────────────────────────────────────────┘ ↓ ┌─────────────────────────────────────────────────────────────┐ │ 阶段 2: 测试权限 │ ├─────────────────────────────────────────────────────────────┤ │ • 包 ID: 14 │ │ • 请求POST /config.php │ │ • 参数kcometohackmecwhoami │ │ • 响应www-data │ │ • 目的确认 WebShell 可用当前用户为 www-data │ └─────────────────────────────────────────────────────────────┘ ↓ ┌─────────────────────────────────────────────────────────────┐ │ 阶段 3: 隐藏痕迹 │ ├─────────────────────────────────────────────────────────────┤ │ • 包 ID: 59 │ │ • 请求POST /config.php │ │ • 参数kcometohackmecmv config.php .config.php │ │ • 响应(空) 成功 │ │ • 目的将 WebShell 重命名为隐藏文件以.开头 │ └─────────────────────────────────────────────────────────────┘ ↓ ┌─────────────────────────────────────────────────────────────┐ │ 阶段 4: 验证隐藏后访问 │ ├─────────────────────────────────────────────────────────────┤ │ • 包 ID: 79 │ │ • 请求POST /.config.php │ │ • 参数kcometohackmecwhoami │ │ • 响应www-data │ │ • 目的确认隐藏后的 WebShell 仍可正常访问 │ └─────────────────────────────────────────────────────────────┘ ↓ ┌─────────────────────────────────────────────────────────────┐ │ 阶段 5: 窃取 Flag │ ├─────────────────────────────────────────────────────────────┤ │ • 包 ID: 99 │ │ • 请求POST /.config.php │ │ • 参数kcometohackmeccat /flag.txt │ │ • 响应flag{U_f1nd_Me!} │ │ • 目的读取根目录下的 flag 文件 │ └─────────────────────────────────────────────────────────────┘5. 完整代码5.1 自动化分析脚本#!/usr/bin/env python3# -*- coding: utf-8 -*- BugKu Crypto 6-3-track_hacker - 自动化分析脚本 功能PCAP 流量分析、WebShell 识别、Base64zlib 解码、Flag 提取 fromscapy.allimport*importbase64importzlibfromcollectionsimportdefaultdictdefanalyze_pcap(filename):主分析函数packetsrdpcap(filename)# 基础统计print(f总数据包{len(packets)})# 协议分布protocol_countdefaultdict(int)forpktinpackets:protopkt.summary().split()[0]protocol_count[proto]1# 提取 HTTP 请求http_requestsextract_http_requests(packets)print(f\n发现{len(http_requests)}个 HTTP 请求)# 提取 HTTP 响应并解码decoded_resultsdecode_responses(packets)# 提取 Flagextract_flag(decoded_results)returndecoded_resultsdefextract_http_requests(packets):提取 HTTP 请求requests[]fori,pktinenumerate(packets):ifTCPinpktandRawinpkt:datapkt[Raw].load.decode(utf-8,errorsignore)ifdata.startswith(POST )ordata.startswith(GET ):# 解析请求头和数据linesdata.split(\r\n)requests.append({id:i,request:lines[0],data:data.split(\r\n\r\n)[1][:100]if\r\n\r\nindataelse})returnrequestsdefdecode_responses(packets):解码 HTTP 响应Base64zlibresults[]fori,pktinenumerate(packets):ifTCPinpktandRawinpkt:datapkt[Raw].load.decode(utf-8,errorsignore)ifHTTP/1.1 200 OKindataand\r\n\r\nindata:bodydata.split(\r\n\r\n)[1].strip()if10len(body)100:try:decodedbase64.b64decode(body)decompressedzlib.decompress(decoded)resultdecompressed.decode(utf-8,errorsignore)results.append({id:i,data:result})print(f包{i}:{result})except:passreturnresultsdefextract_flag(results):从解码结果中提取 Flagforresultinresults:ifflag{inresult[data].lower():print(f\n Flag found:{result[data]})returnresult[data]print(\n❌ Flag not found)returnNoneif__name____main__:analyze_pcap(shell.pcap)5.2 手动解码验证# 手动解码最后一个响应importbase64importzlib encodedeJxLy0lMrw6NTzPMS4n3TVWsBQAz4wXi# 步骤 1: Base64 解码decoded_b64base64.b64decode(encoded)print(fBase64 解码后 (Hex):{decoded_b64.hex()})# 输出789c4bcb494caf0e8d4f33cc4b89f74d55ac050033e305e2# 步骤 2: zlib 解压decompressedzlib.decompress(decoded_b64)print(fzlib 解压后{decompressed})# 输出bflag{U_f1nd_Me!}# 步骤 3: 转换为字符串flagdecompressed.decode(utf-8)print(fFlag:{flag})# 输出flag{U_f1nd_Me!}6. 总结6.1 技术要点回顾技术点说明应用场景PCAP 分析使用 scapy 读取和分析网络抓包CTF 流量分析题、安全事件调查WebShell 识别POST 请求中passwordcommand模式Web 安全、入侵检测Base64 编码将二进制数据编码为 ASCII 字符串数据传输、简单混淆zlib 压缩DEFLATE 算法压缩数据减少数据体积、隐藏内容Linux 隐藏文件以点开头的文件名文件隐藏、持久化后门原始问题请阅读目录下的文件解出这道CTF题目。