NFQUEUE抓包

nfqueue

和C的libipq比起来,支持python的nfqueue会显得强大很多,特别是和scapy结合起来用的时候。

首先需要说明的是在iptables中的target除了之前提到的五项(ACCEPT,DROP,RETURN,QUEUE,other_chain)之外,还有一个叫NFQUEUE,它是QUEUE的扩展。相比于QUEUE,它可以由用户指定不同的queue number。

在使用nfqueue之前,需要安装如下的包:

$ sudo aptitude install libnetfilter-queue-dev
$ sudo aptitude install nfqueue-bindings-python
$ sudo aptitude install python-scapy

之后就可以采用python对NFQUEUE进行操作了。

假设我们将封包从主机A(192.168.1.1)传输到主机B(192.168.1.2)时,需要对封包进行分析,如果是TCP协议的包,并且其flags为 ACK|PSH 的话,则将其payload进行修改(比如替换成“hack”):

首先,需要先在主机A中对iptables进行操作:

$ sudo iptables -A OUTPUT -d 192.168.1.2 -p tcp -j NFQUEUE

然后利用下面的代码:

<span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
<span class="line-number">13</span>
<span class="line-number">14</span>
<span class="line-number">15</span>
<span class="line-number">16</span>
<span class="line-number">17</span>
<span class="line-number">18</span>
<span class="line-number">19</span>
<span class="line-number">20</span>
<span class="line-number">21</span>
<span class="line-number">22</span>
<span class="line-number">23</span>
<span class="line-number">24</span>
<span class="line-number">25</span>
<span class="line-number">26</span>
<span class="line-number">27</span>
<span class="line-number">28</span>
<span class="line-number">29</span>
<span class="line-number">30</span>
<span class="line-number">31</span>
<span class="line-number">32</span>
<span class="line-number">33</span>
<span class="line-number">34</span>
<span class="line-number">35</span>
<span class="line-number">36</span>
<span class="line-number">37</span>
import os,sys,nfqueue,socket
from scapy.all import *

def ch_payload_and_send(pkt):
  pkt[TCP].payload == "hack"
  send(pkt, verbose=0)

def process(i, payload):
  data = payload.get_data()
  pkt = IP(data)

  # Check if TCP flags is ACK|PSH
  if pkt[TCP].flags == 24:
      # Dropping the packet
      payload.set_verdict(nfqueue.NF_DROP)
      ch_payload_and_send(pkt)
  else:
      # Accepting the packet
      payload.set_verdict(nfqueue.NF_ACCEPT)
  
def main():
  q = nfqueue.queue()
  q.open()
  q.unbind(socket.AF_INET)
  q.bind(socket.AF_INET)
  q.set_callback(process)
  q.create_queue(0)

  try:
      q.try_run()
  except KeyboardInterrupt:
      print "Exiting..."
      q.unbind(socket.AF_INET)
      q.close()
      sys.exit(1)

main()

这里用到了scapy这个非常牛逼的模块,它可以直接通过如IP()TCP()等直接对包进行解释和操作,非常方便,具体的可以参看它的文档。这里只是说明下它的安装方式:

$ wget scapy.net
$ mv index.html scapy-latest.zip
$ chmod +x scapy-latest.zip
$ mv scapy-latest.zip /usr/local/bin/scapy

然后就可以运行:

$ sudo scapy

直接开启scapy的交互模式了。

转载自:http://blog.csdn.net/langeldep/article/details/8788360
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是一个基于Python的NFQUEUE的发包示例: ```python import socket from struct import pack # 构造IP头部 def make_ip_header(src_ip, dst_ip): ip_ver = 4 ip_ihl = 5 ip_tos = 0 ip_tot_len = 40 ip_id = 54321 ip_frag_off = 0 ip_ttl = 255 ip_proto = socket.IPPROTO_TCP ip_check = 0 ip_saddr = socket.inet_aton(src_ip) ip_daddr = socket.inet_aton(dst_ip) ip_ihl_ver = (ip_ver << 4) + ip_ihl ip_header = pack('!BBHHHBBH4s4s', ip_ihl_ver, ip_tos, ip_tot_len, ip_id, ip_frag_off, ip_ttl, ip_proto, ip_check, ip_saddr, ip_daddr) return ip_header # 构造TCP头部 def make_tcp_header(src_port, dst_port): tcp_seq = 0 tcp_ack_seq = 0 tcp_doff = 5 tcp_flags = 0x02 tcp_window = socket.htons(5840) tcp_check = 0 tcp_urg_ptr = 0 tcp_offset_res = (tcp_doff << 4) + 0 tcp_header = pack('!HHLLBBHHH', src_port, dst_port, tcp_seq, tcp_ack_seq, tcp_offset_res, tcp_flags, tcp_window, tcp_check, tcp_urg_ptr) return tcp_header # 构造TCP数据 def make_tcp_data(): data = b'Hello, World!' return data # 发送数据包 def send_packet(src_ip, dst_ip, src_port, dst_port): # 构造IP头部 ip_header = make_ip_header(src_ip, dst_ip) # 构造TCP头部 tcp_header = make_tcp_header(src_port, dst_port) # 构造TCP数据 tcp_data = make_tcp_data() # 计算TCP校验和 pseudo_header = pack('!4s4sBBH', socket.inet_aton(src_ip), socket.inet_aton(dst_ip), 0, socket.IPPROTO_TCP, len(tcp_header) + len(tcp_data)) pseudo_header = pseudo_header + tcp_header + tcp_data tcp_check = checksum(pseudo_header) # 构造TCP头部(包含校验和) tcp_header = pack('!HHLLBBH', src_port, dst_port, 0, 0, (5 << 4) + 0x02, tcp_check, tcp_header[6]) # 构造TCP数据包 packet = ip_header + tcp_header + tcp_data # 创建一个原始套接字 s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_RAW) # 发送数据包 s.sendto(packet, (dst_ip, 0)) # 计算校验和 def checksum(data): if len(data) % 2: data = data + b'\x00' words = [int.from_bytes(data[i:i + 2], 'big') for i in range(0, len(data), 2)] chksum = sum(words) while chksum >> 16: chksum = (chksum >> 16) + (chksum & 0xffff) chksum = ~chksum & 0xffff return chksum # 发送数据包 send_packet('192.168.1.100', '192.168.1.1', 8888, 80) ``` 该示例可以构造一个TCP数据包并发送到目标IP地址和端口号。您可以根据需要修改源IP地址、目标IP地址、源端口号和目标端口号。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值