十行代码实现网络的全端口监听

看到题目,很多人都会想,不就是端口监听么。开启一个socket,监听不就行了?
注意,注意,如果我们要的是指定端口的监听,比如,80端口,23端口,443端口,那我们创建几个线程,分别监听各个端口就可以了。
但如果我们的需求是全端口监听呢,也就是我们想监听从1到65535任意一个端口的数据呢。有人会说,对,我创建65535个线程不就好了?显然这并不是完美的解决方案。
我原计划是想实现一个网络层的驱动,对底层的网络层操作进行hook,并实现自己的tcp协议栈,越想越复杂。
后来想到了之前用过的神器scapy, 于是,十几行代码解决了我的这个问题。
核心代码如下:

#如果我们接收到一个SYN包,则我们构造一个SYN ACK包返回去。
if x['TCP'].flags == 0x02:
    ipp = IP(dst=x['IP'].src,src=x['IP'].dst)  
    tcpp = TCP(sport=x['TCP'].dport,dport=x['TCP'].sport)
    tcpp.flags = 0x012 # syn ack flag
    tcpp.ack = x['TCP'].seq + 1
    send(ipp/tcpp)
#如果我们接收到一个FIN ACK包,我们则返回一个ACK包。否则他会重传。
elif x['TCP'].flags == 0x011:
    #if we recv a FIN ACK, we need to back a ACK
    ipp = IP(dst=x['IP'].src,src=x['IP'].dst)
    tcpp = TCP(sport=x['TCP'].dport,dport=x['TCP'].sport)
    tcpp.seq = x['TCP'].ack
    tcpp.ack = x['TCP'].seq + 1
    res_packet = ipp/tcpp
    send(res_packet)
elif x['TCP'].flags == 0x018:
    if x.haslayer("Raw") == 1:
        print "%s:%d ------%s:%d"%( x['IP'].src, x['IP'].sport, x['IP'].dst, x['IP'].dport)
        hexdump(x.load)

当然这时候这个代码还没法运行,因为相应端口的请求的包,如果该端口没有开启,系统会提前发送RST包,结束该会话。
所以最后,我们用iptable, 将出去的RST包过滤掉。就可以了实现全端口监听了。
是不是很cool:)

咦?还没有评论,抢沙发!

发表评论

带 * 的是必填项目,电子邮件地址不会被公开。
文字的交流也是情感的交流,技能的交流也是学术的交流。

Are you human? Click the Apple...