Raw sockets 方式

raw socket 可通过参数  IPV6_HDRINCL 或 IP_HDRINCL 自定义IP头——伪造UDP报文源IP就全靠它了。

限制:从xp sp2之后的所有非服务器版本的windows,都不能发送TCP,并且也不能伪造UDP的源地址。

这里使用 dpkt 做 UDP/IP 包的组装:

class SyslogSenderRawScoket:
def __init__(self, dst, dport, src, sport = 10000):
self.dst = socket.gethostbyname(dst)
self.dport = dport
self.src = src
self.sport = sport self.sock = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_UDP)
self.sock.setsockopt(socket.IPPROTO_IP, socket.IP_HDRINCL, 1)
self.sock.connect((self.dst, 1)) def Send(self, ip_packet):
self.sock.sendall(str(ip_packet)) def Process(self, msg):
u = dpkt.udp.UDP()
u.sport = self.sport
u.dport = self.dport
u.data = msg
u.ulen = len(u) # IP 的 str 会触发 IP 的校验和计算,也会触发 TCP UDP 的校验和计算
# TCP/UDP的校验和是: 源IP,目的IP,协议,TCP或UDP包(头+内容)
#u.sum = ? i = dpkt.ip.IP(data = u)
#i.off = dpkt.ip.IP_DF # frag off
i.p = dpkt.ip.IP_PROTO_UDP
i.src = socket.inet_aton(self.src) # xp sp2之后 禁止发送非本机IP地址的数据包;linux, server无限制
i.dst = socket.inet_aton(self.dst)
i.len = len(i) self.Send(i)

Winpcap 方式

对比 raw sockets 方式编程更复杂,但可以自己构造链路层的包。

class SyslogSenderWinPcap:
'''
原理:先产生一个ping包,以获取本机、网关的MAC地址,然后通过WinPcap发包
限制:目前不能发送给本机,但可以实现;仅支持数据链路层为以太网的情况
''' def __init__(self, dst, dport, src = None, sport = 10000): self.dst = dst
self.dport = dport
self.src = src
self.sport = sport self.errbuf= ctypes.create_string_buffer(winpcapy.PCAP_ERRBUF_SIZE) interface = self.ChooseDevice() self.fp = winpcapy.pcap_open_live(interface, 65536, winpcapy.PCAP_OPENFLAG_PROMISCUOUS, 1000, self.errbuf) if not self.fp:
print 'Fatal error: open interface %s failed' % interface
exit(-1) if winpcapy.pcap_datalink(self.fp) != winpcapy.pcap_datalink_name_to_val('EN10MB'):
print 'Fatal error: unsupported datalink layer'
exit(-1) self.GetEthernetHeader() def ChooseDevice(self):
interface = ctypes.POINTER(winpcapy.pcap_if_t)()
if -1 == winpcapy.pcap_findalldevs(ctypes.byref(interface), self.errbuf):
print 'Fatal error: no device'
exit(-1) alldevs = []
while interface:
alldevs.append((interface.contents.name, interface.contents.description)) interface = interface.contents.next while True:
index = 0
for dev in alldevs:
index += 1
print '%d.' % index,
print '%s %s' % (dev) selected = raw_input('Enter the interface number (1-%d):' % index) try:
index = int(selected)
except TypeError:
print 'Integer expect'
continue if index < 1 or index > len(alldevs):
print 'Too big or too small'
continue return alldevs[index - 1][0] # 发送IP包
def Send(self, ip_packet):
e = dpkt.ethernet.Ethernet(
data = ip_packet,
dst = self.dst_mac,
src = self.src_mac) to_send = str(e) buf = (ctypes.c_ubyte * len(to_send))(*map(ord, to_send))
winpcapy.pcap_sendpacket(self.fp, buf, len(buf)) def GetEthernetHeader(self):
# 抓包过滤
bpf = ctypes.pointer(winpcapy.bpf_program())
winpcapy.pcap_compile(self.fp, bpf, 'icmp and host %s' % self.dst, 1, 0)
winpcapy.pcap_setfilter(self.fp, bpf) # 抓包回调
def _packet_handler(param, header, pkt_data):
s= ''.join([chr(b) for b in pkt_data[:header.contents.len]])
e = dpkt.ethernet.Ethernet(s) # 获取本机MAC和网关MAC
self.dst_mac = e.dst
self.src_mac = e.src packet_handler = winpcapy.pcap_handler(_packet_handler) # 产生一个ping包
def ToGenPing():
self.GenPing(self.dst) t = threading.Timer(0.5, ToGenPing)
t.start() # 输出ping包,以便获得以太网包头 winpcapy.pcap_loop(self.fp, 1, packet_handler, None) def GenPing(self, dst):
import random
try:
sock = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_ICMP) icmp = dpkt.icmp.ICMP(
type=8, data=dpkt.icmp.ICMP.Echo(id=random.randint(0, 0xffff),
seq=1, data='Hello'))
#sock.connect((ip, 1))
#sock.sendall(str(icmp)) sock.sendto(str(icmp), (dst, 1))
except socket.error, e:
print 'Fatal error: (%d) %s' % (e.errno, e.message)
exit(-1)
finally:
sock.close() def MacAddress(self, s):
return struct.pack('BBBBBB', *[int(i, 16) for i in s.split('-')]) def Process(self, msg):
u = dpkt.udp.UDP()
u.sport = self.sport
u.dport = self.dport
u.data = msg
u.ulen = len(u) #print u.sum i = dpkt.ip.IP(data = u)
#i.off = dpkt.ip.IP_DF # frag off
i.p = dpkt.ip.IP_PROTO_UDP
i.src = socket.inet_aton(self.src)
i.dst = socket.inet_aton(self.dst)
i.len = len(i) self.Send(i)

测试代码:

#!/usr/bin/env python
# -*- coding: utf-8 -*- import socket
import time
import threading
import ctypes
import struct import dpkt
import winpcapy if __name__ == '__main__':
#sender = SyslogSenderRawScoket('192.168.12.10', 514, '192.168.128.1')
sender = SyslogSenderWinPcap('192.168.12.17', 514, '192.168.12.1') start = time.time() # 只能达到 1000条/秒
for i in xrange(5000):
sender.Process('some udp content with ip header') print time.time() - start

伪造 UDP 包源 IP 地址的更多相关文章

  1. DNS反射放大攻击分析——DNS反射放大攻击主要是利用DNS回复包比请求包大的特点,放大流量,伪造请求包的源IP地址为受害者IP,将应答包的流量引入受害的服务器

    DNS反射放大攻击分析 摘自:http://www.shaojike.com/2016/08/19/DNS%E6%94%BE%E5%A4%A7%E6%94%BB%E5%87%BB%E7%AE%80%E ...

  2. DNS服务器安全---通过ipset对DNS异常解析流量的源IP地址进行管控

    ipset介绍 ipset是iptables的扩展,它允许你创建 匹配整个地址集合的规则.而不像普通的iptables链只能单IP匹配, ip集合存储在带索引的数据结构中,这种结构即时集合比较大也可以 ...

  3. 渗透测试-奇技淫巧(一)--源IP地址隐藏

    切记,切记.本文只作为技术交流,提醒各位注意网络安全,请勿用于其它用途,否则后果自付. 在很多时候,某某不希望不愿意有人溯源他的地址.他们是如何隐藏IP的? 今天来浅析下,如何隐藏源地址. 用到的工具 ...

  4. 多IP指定出口IP地址 如何指定云服务器源IP?

    如果一个主机绑定有多个IP地址,那么在被动响应和主动发起连接两种方式中,源IP地址的选择机制肯定是有所差异的.主机在接收外部数据包,并发送响应数据包时,响应源地址显然就是客户端请求的地址,这是非常容易 ...

  5. linux ip别名和辅助ip地址

    转:https://blog.csdn.net/xiewen99/article/details/54729112?utm_source=itdadao&utm_medium=referral ...

  6. linux使用iptables屏蔽ip地址

    一.iptables命令介绍: netfilter/iptables(简称为iptables)组成Linux平台下的包过滤防火墙,与大多数的Linux软件一样,这个包过滤防火墙是免费的,在安装系统的时 ...

  7. LinuxC下获取UDP包中的路由目的IP地址和头标识目的地址

    在接受到UDP包后,有时候我们需要根据所接收到得UDP包,获取它的路由目的IP地址和头标识目的地址. (一)主要的步骤: 在setsockopt中设置IP_PKTINFO,然后通过recvmsg来获取 ...

  8. 转:数据包经由路由转发时源、目的IP地址及MAC地址变化情况

    数据包经由路由转发时源.目的IP地址及MAC地址变化情况.  IP数据包经由路由转发的时候源ip,目的ip,源MAC,目的mac是否发生改变,如何改变?   A—–(B1-B2)—–(C1-C2)—— ...

  9. 以太网数据包、IP包、TCP/UDP 包的结构(转)

    源:以太网数据包.IP包.TCP/UDP 包的结构 版本号(Version):长度4比特.标识目前采用的IP协议的版本号.一般的值为0100(IPv4),0110(IPv6). IP包头长度(Head ...

随机推荐

  1. Delphi线程同步(临界区、互斥、信号量,包括详细代码)

    当有多个线程的时候,经常需要去同步这些线程以访问同一个数据或资源. 例如,假设有一个程序,其中一个线程用于把文件读到内存,而另一个线程用于统计文件的字符数.当然,在整个文件调入内存之前,统计它的计数是 ...

  2. GET POST方法长度限制

    GET POST方法长度限制   1.    Get方法长度限制 Http Get方法提交的数据大小长度并没有限制,HTTP协议规范没有对URL长度进行限制.这个限制是特定的浏览器及服务器对它的限制. ...

  3. 【转】Android C程序也可自己手动用交叉编译器编译 (

    原文网址:http://blog.sina.com.cn/s/blog_533074eb0101ez5q.html Android 编译环境 本身比较复杂,且不像普通的编译环境:只有顶层目录下才有 M ...

  4. ## GridView 布局:item设置的高度和宽度不起作用、自动适配列数、添加Header和Footer ##

    一.item设置的高度和宽度不起作用 转自:http://www.cnblogs.com/0616--ataozhijia/p/6031875.html [Android Pro] listView和 ...

  5. Word Amalgamation

    Problem Description In millions of newspapers across the United States there is a word game called J ...

  6. android ANR 案例分析

    案例1:关键词:ContentResolver in AsyncTask onPostExecute, high iowait Process:com.android.email Activity:c ...

  7. C++ 採集音频流(PCM裸流)实现录音功能

    与上一篇的"C++ 播放音频流(PCM裸流)" 点击打开链接 相相应,本篇是关于用C++实现录音功能的.相同是直接建一个win32控制台程序然后将代码拷过去改个文件名称就能够用,也 ...

  8. Android studio教程:[3]修改背景主题

    android studio开发环境的背景主题是可以更改的,现在都流行黑色背景,这样让软件显得更高端大气的,更加赏心悦目,但最主要的还是看起来更舒适更顺眼.下面就教大家如何更改背景主题. 工具/原料 ...

  9. PHP学习笔记十一【数组】

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/h ...

  10. 2014年1月24日 Oracle 事务导读

    形象举例:  从 A 账户向 B 账户转账 10000 元 步骤: 1. A - 10000 2. B + 10000 事务的作用就是确保这两步无误执行后提交,若有一个执行不成功则失败. 结束事务的5 ...