可见在syn-received状态下,没有明确的“收fin”动作(只有应用程序调用close然后发fin的动作),虽然这涉及到TCP的细节,但是还
是可以利用的。大多数的实现中,没有规定的行为就是简单的“将包丢弃”。但是要真的想让服务器丢掉这个fin包,还必须使其不包含ack,这是因为RFC
的TCP状态机说了,只要收到ack,那么服务器就会进入establish状态,而这会引起西厢计划第二阶段的失败(第二阶段是引发服务器发送
reset,而在establish状态下,这种reset实在不易引发)。因此我们只需要在客户端发完syn且收到服务器的syn-ack后,再发送一
个不含ack的fin报文即可,该报文过墙时,墙会认为这是个客户端到服务器方向的终止包,直接放过。 三.从RFC理解西厢计划第二阶段既
然已经通过自行构造的fin在客户端到服务器方向骗过了防火墙,那么下一步就是第二阶段的任务了,在服务器到客户端的方向欺骗防火墙。期望服务器采用正常
且优雅的fin方式是不可行的,因为那样连接真的就断了,因此就要采用异常的方式,那就是引发服务器发送一个reset报文,而RFC中规定了多种引发
reset的方式,西厢计划明显采用了下面的方式(要知道为何发送一个reset不会导致自己这边的连接释放,请接着往下看): RFC 793 [Page 35] Reset Generation
2. If the connection is in any non-synchronized state (LISTEN,
SYN-SENT, SYN-RECEIVED), and the incoming segment acknowledges something
not yet sent (the segment carries an unacceptable ACK), or if an
incoming segment has a security level or compartment which does not
exactly match the level and compartment requested for the connection, a
reset is sent.