这篇文章主要介绍了Python原始套接字编程实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
在实验中需要自己构造单独的HTTP数据报文,而使用SOCK_STREAM进行发送数据包,需要进行完整的TCP交互。
因此想使用原始套接字进行编程,直接构造数据包,并在IP层进行发送,即采用SOCK_RAW进行数据发送。
使用SOCK_RAW的优势是,可以对数据包进行完整的修改,可以处理IP层上的所有数据包,对各字段进行修改,而不受UDP和TCP的限制。
下面开始构造HTTP数据包,
IP层和TCP层使用python的Impacket库,http内容自行填写。
# !/usr/bin/env python #------------------------------------------------------------------------------- #名称:raw_http.py #目标:构建一个原始http get包 # #作者:Yangjun # #创建:08/02/2014 #版权:2014 (c) Yangjun 你licence> #执照:& lt;; #------------------------------------------------------------------------------- 导入系统 进口套接字 从进口ImpactDecoder impacket ImpactPacket def main (): 如果len (sys.argv) & lt;3: 打印”使用:% s & lt; src ip>& lt; dst ip>“% sys.argv [0] 打印”使用:% s & lt; src ip>& lt; dst ip>& lt; cnt>“% sys.argv [0] sys.exit (1) elif len (sys.argv)==3: src=https://www.yisu.com/zixun/sys.argv [1] dst=sys.argv [2] 问=1 elif len (sys.argv)==4: src=sys.argv [1] dst=sys.argv [2] 问=sys.argv [3] 其他: 打印“输入错误!” sys.exit (1) #打印src, dst ip=ImpactPacket.IP () ip.set_ip_src (src) ip.set_ip_dst (dst) #创建一个新的ICMP数据包类型的回声。 icmp=ImpactPacket.ICMP () tcp=ImpactPacket.TCP () tcp.set_th_sport (55968) tcp.set_th_dport (80) tcp.set_th_seq (1) tcp.set_th_ack (1) tcp.set_th_flags (0 x18) tcp.set_th_win (64) tcp。包含(ImpactPacket。数据(“HTTP/1.1/丙氨酸/DIYLife/41264/528 \ r \ nHost: 192.168.111.1 \ r \ nAccept-Encoding:身份\ r \ n \ r \ n”)) ip.contains (tcp) #打开原始套接字。通常需要特殊的权限。 s=socket.socket(套接字。AF_INET,插座。SOCK_RAW socket.IPPROTO_TCP) s.setsockopt(套接字。IPPROTO_IP,插座。IP_HDRINCL, 1) seq_id=0 问比;=1: #计算校验和。 seq_id=seq_id + 1 tcp.set_th_seq (seq_id) tcp.calculate_checksum () #将其发送到目标主机。 s.sendto (ip.get_packet (), (dst, 80)) 问=问1 if __name__==癬_main__”: main ()
运行后抓包如下:
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。