渗透测试过程中各类报文含义
扫到一台开了8080端口的渗透机器,返回包里HTTP头写着“Server: Apache-Coyote/1.1”。测试这玩意儿太熟了,过程Tomcat。中各但直接访问根路径是类报403,连个默认页都不给。文含渗透测试最烦这种——端口开着,渗透服务活着,测试就是过程不知道入口在哪。接下来就是中各看报文的时候了。
先说最基础的类报,TCP三次握手报文。文含SYN过去,渗透SYN+ACK回来,测试ACK再过去。过程nmap默认扫描就靠这个判断端口状态。但很多人忽略的是,如果目标回了RST而不是SYN+ACK,说明端口关着;如果啥都不回,可能是防火墙drop了。我有次扫内网一台数据库,全端口filtered,换用ACK扫描才发现防火墙只拦了SYN,ACK包能穿过去。这种细节,看抓包比看扫描器输出靠谱得多。
HTTP响应报文里的信息量更大。前面那个403,我习惯先看响应头有没有X-Powered-By,有时候会漏出PHP版本或者Servlet容器版本。那次没有,但Allow头暴露了支持的HTTP方法:GET、POST、PUT、DELETE。PUT开着,这就值得试了。直接发一个PUT请求上传jsp,返回201 Created。报文里Location头指向了上传后的路径。整个过程没用到任何漏洞扫描器,就是看报文、改报文、重放。
再说DNS。渗透里DNS报文常被忽略,但内网渗透时它比HTTP还关键。有回拿下一台Linux跳板机,/etc/resolv.conf指向内网DNS服务器。我构造了一个DNS查询报文,查一个不存在的域名,比如nonexist.internal.corp。DNS服务器回了NXDOMAIN,但响应包里带着SOA记录,里面写了主DNS和序列号。顺藤摸瓜,序列号格式暴露了域控的命名规则。后来用DNS区域传送(AXFR)直接拉了一份内网主机列表出来。AXFR的响应报文是一连串的DNS资源记录,每一条都是一台机器。那感觉,比扫C段快多了。
ICMP报文在渗透里有个经典用法:隧道。目标不出网,只允许ICMP。把TCP数据塞进ICMP的data字段,两头各跑一个隧道程序。抓包看,就是一堆type 8(echo request)和type 0(echo reply),payload里全是加密流量。防火墙一般不管ICMP,因为禁了ICMP很多网络诊断就废了。我见过最狠的一次,通过ICMP隧道传了200MB的数据库备份出来,花了三个小时,但没触发任何告警。
ARP报文在内网横向移动时是双刃剑。用arpspoof做中间人,目标机器的ARP缓存里网关的MAC被改成攻击机的。抓包看,目标发往网关的包全到了攻击机网卡上。但ARP报文本身没有认证,交换机也不管。有次我在客户内网做测试,刚发了几百个ARP响应包,网络管理员电话就打过来了——他们的ARP监控工具报警了。所以看报文也得看环境,生产网里ARP异常比端口扫描还敏感。
最后提一个容易翻车的:TLS握手报文。现在很多服务强制HTTPS,但SNI字段会暴露域名。有次扫一个IP,443端口开着,证书是自签的,CN写的是*.dev.example.com。但SNI里客户端发的域名是admin.dev.example.com。直接改hosts访问,后台登录页就出来了。TLS握手里的ClientHello报文,SNI是明文的,哪怕后面流量全加密,这个字段也藏不住。
报文这东西,工具能解析,但看懂字段之间的逻辑关系得靠人。扫描器告诉你“端口开放”,报文告诉你“为什么开放、开了什么、能不能进去”。渗透测试到最后,拼的就是谁更懂报文。
(责任编辑:休闲)














