Пример #1
0
    def _test_connectivity(self, param):

        config = self.get_config()

        ip = config['ip']
        port = int(param.get('port', 137))
        timeout = int(param.get('timeout', 30))

        action_result = ActionResult(dict(param))
        self.add_action_result(action_result)

        self.save_progress("Looking up IP : {0} to test connectivity".format(ip))
        nb = NetBIOS()
        hosts = nb.queryIPForName(ip, port, timeout)
        if hosts is None:
            self.save_progress("Request timed out")
            self.save_progress("Test Connectivity Failed")
            return action_result.set_status(phantom.APP_ERROR)

        if hosts:
            self.save_progress("Got {0} hosts".format(len(hosts)))
            self.save_progress("Test Connectivity Passed")
            return action_result.set_status(phantom.APP_SUCCESS)

        self.save_progress("Lookup did not return any results, but connectivity passed")

        return action_result.set_status(phantom.APP_SUCCESS)
Пример #2
0
    def performTest(self):
        if(not self.smb):
            randomUser = ''.join(random.choice(string.ascii_lowercase) for _ in range(12))
            randomPass = ''.join(random.choice(string.ascii_lowercase) for _ in range(12))
            print("%sPerforming test request to benchmark failed attempt...%s" % (Y,W))

            if(not self.ntlm):
                self.test_response = self.performRequest(randomUser, randomPass)
            else:
                self.test_response = self.performNTLMRequest(randomUser, randomPass)

            self.test_hexDigest = self.getHashFromResponse(self.test_response)

            if(self.test_response.status_code == 400):
                print("%sTest request returned status code " % (R) + str(self.test_response.status_code) + "%s" % (W))
                if(input("Are you sure you want to continue? (y/N) ") != 'y'):
                    sys.exit("Unsatisfactory HTTP response code.")
            else:
                print("%sTest request did not return 400, moving on.%s\n" % (G,W))
        else:
            print("%sAttempting to reach machine for SMB login...%s" % (Y,W))
            n = NetBIOS()
            ip = n.queryIPForName(self.ip)
            s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            try:
                s.connect((self.ip, 445))
                s.shutdown(2)
                print("%sMachine is available on port 445, moving on.%s\n" % (G,W))
            except:
                print("%sCan't reach machine on port 445" % (R) + str(self.test_response.status_code) + "%s" % (W))
                if(input("Are you sure you want to continue? (y/N) ") != 'y'):
                    sys.exit("Double check IP and port 445 open.")
                return False
Пример #3
0
    def discover_smb_shares(self):
        """
            scan the local network for active smb shares
        """
        # do some host discovery

        nm = NmapProcess(settings.LOCAL_NET, options="-sT -p 139 -n")
        net_bios = NetBIOS(broadcast=True)

        # might get a problem on windows... but tool is supposed to run under linux =) so its fine
        if nm.sudo_run() == 0:
            # get the scan report
            print(nm.stdout)
            report = NmapParser.parse(nm.stdout)
            interesting_hosts = []
            # find the hosts that are online and have an open port that indicates smb
            for host in report.hosts:
                if host.status == "up":
                    if len(host.get_open_ports()) != 0:
                        # check whether it is a host we might access with smb
                        hostname = net_bios.queryIPForName(host.address)[0]
                        if hostname is None:
                            continue
                        interesting_hosts.append({
                            "address": host.address,
                            "hostname": hostname})
        else:
            raise NoInterestingHostsFound

        return interesting_hosts
Пример #4
0
def get_connection(location):
    """
    Get a SMB connnection using the location and verify the remote
    location.

    Get the formatted location name, otherwise throw a
    RemoteNameException. Create the SMB connection, otherwise throw a
    SMBConnectionException.
    """
    location_name = smb_share_format.format(location.server_ip,
                                            location.share_name,
                                            location.path)
    netbios = NetBIOS()
    remote_name = netbios.queryIPForName(location.server_ip)
    if not remote_name:
        raise RemoteNameException("Unable to get remote name for {0}!".
                                  format(location.server_ip))
    if not location.username:
        location.username=""
    if not location.password:
        location.password=""
    connection = SMBConnection(location.username, location.password, 'ONYX',
        remote_name[0])
    if not connection.connect(location.server_ip):
        riemann.send({"host": config.HOST,
                      "service": "shareutil.get_connection",
                      "state": "start"})
        raise SMBConnectionException("Unable to connect to {0}".
                                     format(location_name))
    return connection
Пример #5
0
def dowload_latest_image(sysConf):
    serverIP = sysConf.imgServer['IP']
    netbios = NetBIOS()
    serverName = netbios.queryIPForName(serverIP)
    conn = SMBConnection(sysConf.imgServer['USER'],
                         sysConf.imgServer['PASSWORD'],
                         my_name="BMC_Tester",
                         remote_name=serverName[0],
                         domain="COMPAL")
    if (False == conn.connect(serverIP)):
        return None
    platformImage = "BMC/Daily_Build/" + sysConf.platform
    path = conn.listPath(sysConf.imgServer['ROOT'], platformImage)
    sortedFile = sorted(path, key=attrgetter('create_time'))
    lastFile = sortedFile[len(sortedFile) - 1]
    imagePath = os.getcwd() + "/download"

    if not os.path.exists(imagePath):
        os.mkdir(imagePath)

    image = open(imagePath + "/" + lastFile.filename, "wb")
    print("\tDownloading %s to %s ....." %
          (lastFile.filename, imagePath + "/" + lastFile.filename))
    conn.retrieveFile(sysConf.imgServer['ROOT'],
                      platformImage + "/" + lastFile.filename, image)
    image.close()
    return lastFile.filename
Пример #6
0
    def connect(self):
        inventory = Inventory()
        address = self.hostname
        if inventory.has_option(self.hostname, 'address'):
            address = inventory.get(self.hostname, 'address')

        ip = None
        nb_name = None
        try:
            socket.inet_aton(address)
            ip = address
        except OSError as e:
            nb_name = address

        nb = NetBIOS()
        if ip is not None and nb_name is None:
            # need to look up the hostname
            logger.debug('Looking up NetBIOS name from IP ' + ip)
            nb_names = nb.queryIPForName(ip)
            if nb_names is None or len(nb_names) < 1:
                raise RuntimeError('Cannot connect to host ' + self.hostname +
                                   '; looking up NetBIOS name failed')
            nb_name = nb_names[0]
        elif ip is None and nb_name is not None:
            # not a IPv4 address, need to look up the ip
            nb_name = address
            logger.debug('Looking up NetBIOS IP from name ' + nb_name)
            ips = nb.queryName(nb_name)
            if ips is None or len(ips) < 1:
                raise RuntimeError('Cannot connect to host ' + self.hostname +
                                   '; looking up NetBIOS IP failed')
            ip = ips[0]
        nb.close()

        if inventory.has_option(self.hostname,
                                'username') and inventory.has_option(
                                    self.hostname, 'password'):
            username = inventory.get(self.hostname, 'username')
            password = inventory.get(self.hostname, 'password')
            client_machine_name = ''.join(
                random.choice(string.ascii_letters + string.digits)
                for _ in range(15))
            logger.debug('Using client name of ' + client_machine_name)
            logger.info('Connecting to ' + nb_name + ' as ' + username +
                        ' for host ' + self.hostname)
            self.connection = SMBHost(username,
                                      password,
                                      client_machine_name,
                                      nb_name,
                                      use_ntlm_v2=True,
                                      sign_options=SMBHost.SIGN_WHEN_SUPPORTED
                                      )  #, is_direct_tcp=True)
            if not self.connection.connect(ip):
                raise RuntimeError('Cannot connect to host ' + self.hostname +
                                   '; connecting via SMB failed')
        else:
            raise RuntimeError('No method of authenticating with host ' +
                               self.hostname + ' found')

        print(str(self.connection.listPath('ADMIN$', '\\')))
Пример #7
0
 def run(self):
     print "Starting thread for " + self.ip
     net = NetBIOS()
     net_name = str(net.queryIPForName(self.ip)).strip("['").strip("']")
     net.close()
     conn = SMBConnection(self.user,
                          self.pwd,
                          'cobwebs',
                          net_name,
                          domain=self.domain,
                          use_ntlm_v2=False)
     if conn.connect(self.ip, port=139, timeout=10):
         print(
             "Connecting to %s was successful! How about a nice game of spidering %s%s?"
             % (self.ip, self.share, self.subfolder))
     else:
         print("Connection error: %s" % (self.ip))
     if self.recursive > 0:
         recurse(conn, self.ip, self.share, self.subfolder, self.pattern,
                 int(self.recursive))
     else:
         filelist = conn.listPath(self.share, self.subfolder)
         dir_list(filelist, self.ip, self.subfolder, self.pattern)
     conn.close()
     print "Exiting thread for " + self.ip
Пример #8
0
def getServerName(IP):
    try:
        server = NetBIOS()
        servername = server.queryIPForName(IP)
        return servername[0]
    except:
        print(Fore.RED+"You need to porvide the remote computer or server name")
        exit(0)
Пример #9
0
def get_netbios_name(remote_addr):
    nb = NetBIOS()
    names = nb.queryIPForName(remote_addr)
    nb.close()
    if len(names) == 0:
        raise NameError('No NetBIOS name found for {}'.format(remote_addr))
    elif len(names) > 1:
        logging.warn('More than one NetBIOS name for {}'.format(remote_addr))
    return names[0]
Пример #10
0
def getBIOSName(remote_smb_ip, timeout=30):
	try:
		bios = NetBIOS()
		srv_name = bios.queryIPForName(remote_smb_ip, timeout=timeout)
	except:
		print >> sys.stderr, "Looking up timeout, check remote_smb_ip again!!"
	finally:
		bios.close()
		return srv_name
Пример #11
0
def getBIOSName(timeout=30):
    try:
        bios = NetBIOS()
        srv_name = bios.queryIPForName('172.25.73.100', timeout=timeout)
    except:
        print("Looking up timeout, check remote_smb_ip again!!", sys.stderr)
    finally:
        bios.close()
        return srv_name
Пример #12
0
def ip2hostname(ip):
    nb = NetBIOS(broadcast=True, listen_port=0)
    try:
        hostname = nb.queryIPForName(str(ip), port=137, timeout=10)
        hostname = hostname[0]
    except:
        print 'hostname get fail please use -n'
        exit(0)
    return str(hostname)
Пример #13
0
def get_netbios_name(remote_addr, timeout=DEFAULT_TIMEOUT):
    nb = NetBIOS()
    names = nb.queryIPForName(remote_addr, timeout=timeout)
    nb.close()
    if names is None or len(names) == 0:
        raise NameError('No NetBIOS name found for {}'.format(remote_addr))
    elif len(names) > 1:
        logging.warn('More than one NetBIOS name for {}'.format(remote_addr))
    return names[0]
Пример #14
0
def getBIOSName(remote_smb_ip, timeout=30):
    try:
        bios = NetBIOS()
        srv_name = bios.queryIPForName(remote_smb_ip, timeout=timeout)
    except:
        print(sys.stderr, "Looking up timeout, check remote_smb_ip again!!")
    finally:
        bios.close()
        return srv_name
Пример #15
0
def getBIOSName(remote_smb_ip, timeout=5):
    try:
        bios = NetBIOS()
        srv_name = bios.queryIPForName(remote_smb_ip, timeout=timeout)
    except:
        print 'getBIOSName: timeout too short?'
    finally:
        bios.close()
        #print 'bios name = ' + srv_name[0]
        return srv_name[0]
Пример #16
0
 def getServerName(self, remote_smb_ip, timeout=30):
     bios = NetBIOS()
     srv_name = None
     try:
         srv_name = bios.queryIPForName(remote_smb_ip, timeout=timeout)
     except:
         log.err("Couldn't find SMB server name, check remote_smb_ip again!!")
     finally:
         bios.close()
         return srv_name
Пример #17
0
def reverse_host(host, timeout=1, save=True):
    n = NetBIOS()
    try:
        host.hostname = n.queryIPForName(host.ip_address, timeout=timeout)[0]
    except:
        pass
    n.close()
    host.reverse_latest_time = timezone.datetime.now()
    if save:
        host.save()
    return host
Пример #18
0
def reverse_host(host, timeout=1, save=True):
    n = NetBIOS()
    try:
        host.hostname = n.queryIPForName(host.ip_address, timeout=timeout)[0]
    except:
        pass
    n.close()
    host.reverse_latest_time = timezone.datetime.now()
    if save:
        host.save()
    return host
Пример #19
0
 def getServerName(self, remote_smb_ip, timeout=30):
     bios = NetBIOS()
     srv_name = None
     try:
         srv_name = bios.queryIPForName(remote_smb_ip, timeout=timeout)
     except:
         log.err(
             "Couldn't find SMB server name, check remote_smb_ip again!!")
     finally:
         bios.close()
         return srv_name
Пример #20
0
    def get_BIOSName(self, host, timeout=30):
        try:
            bios = NetBIOS()
            srv_name = bios.queryIPForName(host, timeout=timeout)

        except Exception as e:
            logger.error("Looking up timeout, check remote_smb_ip again. %s" %
                         str(e))

        finally:
            bios.close()
            return srv_name
Пример #21
0
def get_netbios_name(hostname):
    if hostname in ["127.0.0.1", "localhost"]:
        return "localhost"
    n = NetBIOS()
    resp = n.queryIPForName(hostname)
    if resp:
        return resp[0]
    else:
        # Default to first part of hostname
        # eg: smbsrv01.example.com -> smbsrv01
        dns_name = socket.gethostbyaddr(hostname)[0]  # "nslookup"
        return dns_name.split(".")[0]
Пример #22
0
def getBIOSName(remote_smb_ip, timeout=30):
    # 通过IP地址,查找smb服务器的名称
    srv_name = None

    bios = NetBIOS()
    try:
        srv_name = bios.queryIPForName(remote_smb_ip, timeout=timeout)
    except:
        print "查找samba服务器的名称时超时。"
    finally:
        bios.close()

    return srv_name
Пример #23
0
	def getBIOSName(self, remote_smb_ip, timeout=5):			# unused if dynamic IP
		# ip -> smb name
		try:
			self.error = None
			bios = NetBIOS()
			srv_name = bios.queryIPForName(remote_smb_ip, timeout=timeout)
			return srv_name[0]
		except Exception as e:
			if self.print_errors:
				print('Error on line {}'.format(sys.exc_info()[-1].tb_lineno), type(e).__name__, e)
			else:
				self.error = 'Error on line {}'.format(sys.exc_info()[-1].tb_lineno) + str(type(e).__name__) + str(e)
			return None
Пример #24
0
def clean_up(ip, share, subfolder, user, pwd, domain):
	net = NetBIOS()
	net_name = str(net.queryIPForName(ip)).strip("['").strip("']")
	net.close()
	conn = SMBConnection(user, pwd, 'cobwebs', net_name, domain=domain, use_ntlm_v2=True, is_direct_tcp=True)
	if conn.connect(ip, port=445, timeout=10):
		print(Fore.GREEN+"[+] Connection to %s Successful! Cleaning up SCF's Now!" % ip + Style.RESET_ALL)
	else:
		print(Fore.RED+"[!] Connection to %s Failed!" % ip + Style.RESET_ALL)

	delete_file(conn, ip, subfolder, share)

	conn.close()
Пример #25
0
def getBIOSName(remote_smb_ip, timeout=5):
    # Devuelvo el nombre NetBios de una máquina remota
    from nmb.NetBIOS import NetBIOS
    Aux = 'ERROR'
    try:
        bios = NetBIOS()
        srv_name = bios.queryIPForName(remote_smb_ip, timeout=timeout)
        Aux = srv_name[0]
    except:
        print 'No es posible conocer el nombre NETBIOS del servidor ' + remote_smb_ip + ' en el tiempo ' + str(
            timeout)
    finally:
        bios.close()
    return Aux
Пример #26
0
 def getBIOSName(self, remote_smb_ip, timeout=5):  # unused if dynamic IP
     # ip -> smb name
     try:
         self.error = None
         bios = NetBIOS()
         srv_name = bios.queryIPForName(remote_smb_ip, timeout=timeout)
         return srv_name[0]
     except Exception as e:
         if self.print_errors:
             print('Error on line {}'.format(sys.exc_info()[-1].tb_lineno),
                   type(e).__name__, e)
         else:
             self.error = 'Error on line {}'.format(
                 sys.exc_info()[-1].tb_lineno) + str(
                     type(e).__name__) + str(e)
         return None
Пример #27
0
 def run(self):
    print "Starting thread for " + self.ip
    net = NetBIOS()
    net_name = str(net.queryIPForName(self.ip)).strip("['").strip("']")
    net.close()
    conn = SMBConnection(self.user, self.pwd, 'cobwebs', net_name, domain=self.domain, use_ntlm_v2 = False)
    if conn.connect(self.ip, port=139, timeout=10):
       print ("Connecting to %s was successful! How about a nice game of spidering %s%s?" % (self.ip, self.share, self.subfolder))
    else:
       print ("Connection error: %s" % (self.ip))
    if self.recursive > 0:
       recurse(conn,self.ip,self.share,self.subfolder,self.pattern,int(self.recursive))    
    else:
       filelist = conn.listPath(self.share, self.subfolder)
       dir_list(filelist,self.ip,self.subfolder,self.pattern)
    conn.close()
    print "Exiting thread for " + self.ip
Пример #28
0
def get_name(target, timeout=5):
    logger.blue('Getting NetBIOS Name for {}'.format(logger.BLUE(target)))
    logger.verbose('Timeout for NetBIOS resolution: '+str(timeout))
    bios = NetBIOS()
    try:
        tmpnetbios_name = bios.queryIPForName(target, timeout=timeout)
        netbios_name = str(tmpnetbios_name[0])
    except:
        netbios_name = None
    bios.close()
    if netbios_name == None:
        logger.red_indent('Failed to get NetBIOS Name')
        return None
    else:
        logger.green_indent('Got NetBIOS Name: {}'.format(
            logger.GREEN(netbios_name)))
        return str(netbios_name)
Пример #29
0
def run(options):
    ip = options['ip']
    port = options['port']
    username = options['username']
    password = options['password']

    test = random.choice(config.SMB_FILES)
    expected = test['checksum']

    try:
        n = NetBIOS()
        hostname = n.queryIPForName(ip)[0]
        n.close()

        conn = SMBConnection(username, password, '', hostname, config.DOMAIN)
        conn.connect(ip, port)
        t = tempfile.TemporaryFile()
        conn.retrieveFile(test['sharename'], test['path'], t)
    except (SMBTimeout, socket.timeout):
        logger.debug('Timeout')
        return False
    except NotReadyError:
        logger.debug(ERROR_STRINGS['NotReadyError'] % (username, password))
        return False
    except (NotConnectedError, UnsupportedFeature, ProtocolError, OperationFailure) as e:
        name = e.__class__.__name__
        if name in ERROR_STRINGS:
            logger.debug(ERROR_STRINGS[name] % e)
        else:
            logger.debug('%s: %s' % (name, e))
        return False

    sha1 = hashlib.sha1()
    t.seek(0)
    sha1.update(t.read())
    t.close()
    checksum = sha1.hexdigest()

    if checksum == expected:
        return True
    else:
        logger.debug('Check failed: output: %s | expected: %s' % (checksum, expected))
        return False
Пример #30
0
def get_name(target, timeout=2):
    logger.live_info('[{}]:\tATTEMPTING NETBIOS NAME'.format(logger.BLUE(target)))

    # logger.verbose('Timeout for NetBIOS resolution: '+str(timeout))
    logger.verbose('[{}]:\tNETBIOS TIMEOUT: {}'.format(logger.YELLOW(target),logger.YELLOW(str(timeout))))
    bios = NetBIOS()
    try:
        tmpnetbios_name = bios.queryIPForName(target, timeout=timeout)
        netbios_name = str(tmpnetbios_name[0])
    except:
        netbios_name = None

    bios.close()
    if netbios_name == None:
        logger.live_bad('[{}]:\tNETBIOS NAME: {}'.format(logger.RED(target),logger.RED('FAILED')))
        return None
    else:
        logger.green('[{}]:\tNETBIOS NAME: {}'.format(logger.GREEN(target),logger.GREEN(netbios_name)))
        return str(netbios_name)
Пример #31
0
    def connect(self, ip, port = 139, sock_family = socket.AF_INET, timeout = 60):
        """
        Establish the SMB connection to the remote SMB/CIFS server.

        You must call this method before attempting any of the file operations with the remote server.
        This method will block until the SMB connection has attempted at least one authentication.

        :return: A boolean value indicating the result of the authentication atttempt: True if authentication is successful; False, if otherwise.
        """

        # Was an IP address provided?

        try:
            if socket.inet_pton(socket.AF_INET, ip):
                # IP address provided
                n = NetBIOS()
                names = n.queryIPForName(ip)
                if names:
                    self.remote_name = names[0]
        except:
            # Hostname provided
            self.remote_name = ip
        
        if self.sock:
            self.sock.close()
        self.auth_result = None
        self.sock = socket.socket(sock_family)
        self.sock.settimeout(timeout)
        self.sock.connect(( ip, port ))

        self.is_busy = True
        try:
            if not self.is_direct_tcp:
                self.requestNMBSession()
            else:
                self.onNMBSessionOK()
            while self.auth_result is None:
                self._pollForNetBIOSPacket(timeout)
        finally:
            self.is_busy = False

        return self.auth_result
Пример #32
0
 def __init__( self, url, subrepo ):
     super(SMBTransport,self).__init__()
     d = parse_unc( url, subrepo )
     n = NetBIOS();  #r = n.queryName( d['host'] ); print r
     smb_name = n.queryIPForName( gethostbyname(d['host']) ); 
     #print "NAMES: ", smb_name
     if True:
         self.conn = mySMBConnection( d['user'], d['pass'], gethostname(), 
                                      smb_name[0], domain=d['domain'], 
                                      use_ntlm_v2 = False, 
                                      sign_options = smb.SMBConnection.SMBConnection.SIGN_WHEN_SUPPORTED,
                                      is_direct_tcp = False)
         r = self.conn.connect( gethostbyname(d['host']), 139 )
        #self.conn.close()
     else:
         self.conn = mySMBConnection( d['user'], d['pass'], gethostname(), 
                                      smb_name[0], domain=d['domain'], 
                                      use_ntlm_v2 = False, 
                                      sign_options = smb.SMBConnection.SMBConnection.SIGN_WHEN_SUPPORTED,
                                      is_direct_tcp = True)
         r = self.conn.connect( gethostbyname(d['host']), 445 )
     self.cdata = d
Пример #33
0
 def connect_smb(self, host, username, password):
     try:
         #remote_machine_name = str(getfqdn(host))
         nbs = NetBIOS(broadcast=True, listen_port=0)
         remote_machine_name = str(nbs.queryIPForName(host, timeout=10)[0])
         nbs.close()
         if not remote_machine_name:
             print("Noname")
             return 0
         conn = SMBConnection.SMBConnection(str(username),
                                            str(password),
                                            'Samurai',
                                            remote_machine_name,
                                            use_ntlm_v2=True)
         if conn.connect(
                 host, 139, timeout=10
         ) == True:  #assert conn.connect(host,139,timeout=10)
             conn.close()
             return 1
         else:
             return 0
     except Exception as e:
         return 0
Пример #34
0
    def _lookup_ip(self, param):

        action_result = ActionResult(dict(param))
        self.add_action_result(action_result)

        ip = param.get('ip')
        port = int(param.get('port', 137))
        timeout = int(param.get('timeout', 30))

        if not ip:
            return action_result.set_status(phantom.APP_ERROR, "IP must be provided.")

        nb = NetBIOS()
        hosts = nb.queryIPForName(ip, port, timeout)
        if hosts is None:
            return action_result.set_status(phantom.APP_ERROR, "Request timed out.")

        if hosts:
            action_result.set_summary({"hosts": len(hosts)})
            action_result.add_data({"hostnames": hosts})
            return action_result.set_status(phantom.APP_SUCCESS)
        else:
            return action_result.set_status(phantom.APP_ERROR, "Lookup failed.")
Пример #35
0
	def run(self):
		if self.ip is None:
			print(Fore.YELLOW+Style.DIM+"[*] No IP to go after, moving to next target..."+Style.RESET_ALL)
		else:
			print(Fore.YELLOW+"[+] Starting thread for " + self.ip+Style.RESET_ALL)
			net = NetBIOS()
			net_name = str(net.queryIPForName(self.ip)).strip("['").strip("']")
			net.close()
			conn = SMBConnection(self.user, self.pwd, 'cobwebs', net_name, domain=self.domain, use_ntlm_v2 = True, is_direct_tcp=True)
			if conn.connect(self.ip, port=445, timeout=10):
				print(Fore.GREEN+"[+] Connection to %s Successful! Time to Spider!" % self.ip+Style.RESET_ALL)
			else:
				print(Fore.RED+"[!] Connection Failed to %s!" % self.ip+Style.RESET_ALL)

			shares = conn.listShares()
			for share in shares:
				if not share.isSpecial and share.name not in ['NETLOGON', 'SYSVOL']:
					x = True
					while x == True:
						x = recurse(conn,self.ip,share,"/")
						if x == False:
							break
			conn.close()
Пример #36
0
 def run(self):
     print("Starting thread for " + self.ip)
     net = NetBIOS()
     net_name = str(net.queryIPForName(self.ip)).strip("['").strip("']")
     net.close()
     conn = SMBConnection(self.user,
                          self.pwd,
                          'cobwebs',
                          net_name,
                          domain=self.domain,
                          use_ntlm_v2=False)
     if conn.connect(self.ip, port=139, timeout=10):
         print(("Successfully connected to %s! Spidering %s%s?" %
                (self.ip, self.share, self.subfolder)))
     else:
         print("Failed to connect to: %s" % (self.ip))
     if int(self.recursive) > 0:
         recurse(conn, self.ip, self.share, self.subfolder, self.pattern,
                 int(self.recursive))
     else:
         file_list = conn.listPath(self.share, self.subfolder)
         dir_list(file_list, self.ip, self.subfolder, self.pattern)
     conn.close()
     print("Exiting thread for " + self.ip)
Пример #37
0
        print('Target is not DNS resolvable, assuming NB name')
        target_nb_name = target

nb = NetBIOS()

if target_ip is None:
    print('Looking up IP from target NetBIOS name ' + target_nb_name)
    ips = nb.queryName(target_nb_name)
    print('Got IPs:' + str(ips))
    if ips is None or len(ips) < 1:
        raise RuntimeError('Cannot connect to host ' + target + '; looking up NetBIOS IP failed')
    target_ip = ips[0]

if target_nb_name is None:
    print('Looking up NetBIOS name from target IP: ' + target_ip)
    nb_names = nb.queryIPForName(target_ip)
    print('Got NB names: ' + str(nb_names))
    if nb_names is None or len(nb_names) < 1:
        raise RuntimeError('Cannot connect to host ' + target + '; looking up NetBIOS name failed')
    target_nb_name = nb_names[0]

nb.close()

client_machine_name = socket.gethostbyaddr(socket.gethostname())[0]
# client_machine_name = ''.join(random.choice(string.ascii_letters + string.digits) for _ in range(15))
# print('Generated client machine name: ' + client_machine_name + '\n')

domain = input('Enter domain [none]: ')
username = input('Enter username: '******'Enter password: ')
Пример #38
0
def queryNam():
        n = NetBIOS(broadcast=True, listen_port=0)
        ip = n.queryIPForName("192.168.40.26", port=137, timeout=1)
        return ip
Пример #39
0
    def smb_open(self, req):
        global USE_NTLM, MACHINE_NAME

        host = req.get_host()
        if not host:
            raise urllib.error.URLError('SMB error: no host given')
        host, port = splitport(host)
        if port is None:
            port = 139
        else:
            port = int(port)

        # username/password handling
        user, host = splituser(host)
        if user:
            user, passwd = splitpasswd(user)
        else:
            passwd = None
        host = unquote(host)
        user = user or ''
        passwd = passwd or ''
        myname = MACHINE_NAME or self.generateClientMachineName()

        n = NetBIOS()
        names = n.queryIPForName(host)
        if names:
            server_name = names[0]
        else:
            raise urllib.error.URLError('SMB error: Hostname does not reply back with its machine name')

        path, attrs = splitattr(req.get_selector())
        if path.startswith('/'):
            path = path[1:]
        dirs = path.split('/')
        dirs = list(map(unquote, dirs))
        service, path = dirs[0], '/'.join(dirs[1:])

        try:
            conn = SMBConnection(user, passwd, myname, server_name, use_ntlm_v2 = USE_NTLM)
            conn.connect(host, port)

            headers = email.message.Message()
            if req.has_data():
                data_fp = req.get_data()
                filelen = conn.storeFile(service, path, data_fp)

                headers.add_header('Content-length', '0')
                fp = BytesIO(b"")
            else:
                fp = self.createTempFile()
                file_attrs, retrlen = conn.retrieveFile(service, path, fp)
                fp.seek(0)

                mtype = mimetypes.guess_type(req.get_full_url())[0]
                if mtype:
                    headers.add_header('Content-type', mtype)
                if retrlen is not None and retrlen >= 0:
                    headers.add_header('Content-length', '%d' % retrlen)

            return addinfourl(fp, headers, req.get_full_url())
        except Exception as ex:
            raise urllib.error.URLError('smb error: %s' % ex).with_traceback(sys.exc_info()[2])
Пример #40
0
 def performSMBRequest(self, domain, username, password, ip):
     n = NetBIOS()
     machineName = n.queryIPForName(ip)[0]
     randomClientName = ''.join(random.choice(string.ascii_lowercase) for _ in range(12))
     conn = SMBConnection(username, password, randomClientName, machineName, domain)
     return conn.connect(ip)
Пример #41
0
class NetworkBrowser(Screen):
	skin = """
		<screen name="NetworkBrowser" position="center,120" size="820,520" title="Network Neighbourhood">
		<ePixmap pixmap="skin_default/buttons/red.png" position="10,5" size="200,40" alphatest="on"/>
		<ePixmap pixmap="skin_default/buttons/green.png" position="210,5" size="200,40" alphatest="on"/>
		<ePixmap pixmap="skin_default/buttons/yellow.png" position="410,5" size="200,40" alphatest="on"/>
		<ePixmap pixmap="skin_default/buttons/blue.png" position="610,5" size="200,40" alphatest="on"/>
		<widget source="key_red" render="Label" position="10,5" size="200,40" zPosition="1" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" shadowColor="black" shadowOffset="-2,-2"/>
		<widget source="key_green" render="Label" position="210,5" size="200,40" zPosition="1" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" shadowColor="black" shadowOffset="-2,-2"/>
		<widget source="key_yellow" render="Label" position="410,5" size="200,40" zPosition="1" font="Regular;20" halign="center" valign="center" backgroundColor="#a08500" transparent="1" shadowColor="black" shadowOffset="-2,-2"/>
		<widget source="key_blue" render="Label" position="610,5" size="200,40" zPosition="1" font="Regular;20" halign="center" valign="center" backgroundColor="#18188b" transparent="1" shadowColor="black" shadowOffset="-2,-2"/>
		<eLabel	position="10,50" size="800,1" backgroundColor="grey"/>
		<widget source="infotext" render="Label" position="10,55" size="800,420" zPosition="1" font="Regular;22" halign="center" valign="center"/>
		<widget source="list" render="Listbox" position="10,55" size="800,420" zPosition="2" enableWrapAround="1" scrollbarMode="showOnDemand">
			<convert type="TemplatedMultiContent">
				{"template": [
				MultiContentEntryPixmapAlphaTest(pos = (10,5),size = (50,50),png = 1),# index 1 is the expandable/expanded/verticalline icon
				MultiContentEntryText(pos = (70,4),size = (700,26),font=2,flags = RT_HALIGN_LEFT,text = 2),# index 2 is the Hostname
				MultiContentEntryText(pos = (180,5),size = (610,25),font=0,flags = RT_HALIGN_LEFT,text = 3),# index 3 is the sharename
				MultiContentEntryText(pos = (180,26),size = (610,18),font=1,flags = RT_HALIGN_LEFT,text = 4),# index 4 is the sharedescription
				MultiContentEntryPixmapAlphaTest(pos = (65,5),size = (50,50),png = 5),# index 5 is the nfs/cifs icon
				MultiContentEntryPixmapAlphaTest(pos = (125,5),size = (50,50),png = 6),# index 6 is the isMounted icon
				],
				"fonts": [gFont("Regular",22),gFont("Regular",18),gFont("Regular",24)],
				"itemHeight": 60
				}
			</convert>
		</widget>
	</screen>"""

	def __init__(self, session, iface,plugin_path):
		Screen.__init__(self, session)
		self.skin_path = plugin_path
		self.session = session
		self.iface = iface or 'eth0'
		for service in eNetworkManager.getInstance().getServices():
			key = self.getServiceIF(service)
			if key:
				self.iface = key
				break
		self.networklist = []
		self.expanded = []
		self.cache_ttl = 604800 #Seconds cache is considered valid, 7 Days should be ok
		self.cache_file = eEnv.resolve("${sysconfdir}/enigma2/networkbrowser.cache") #Path to cache directory
		self._nrthreads = 0
		self._netbios = NetBIOS(broadcast=False)
		self._ipv4 = iNetworkInfo.getConfiguredInterfaces()[self.iface].ipv4
		self._myhostname = self._lookupHostname(self._ipv4.address, local=True)

		self["key_red"] = StaticText(_("Close"))
		self["key_green"] = StaticText(_("Mounts"))
		self["key_yellow"] = StaticText(_("Rescan"))
		self["key_blue"] = StaticText(_("Expert"))
		self["infotext"] = StaticText(_("Press OK to mount!"))
		
		self["shortcuts"] = ActionMap(["ShortcutActions", "WizardActions"],
		{
			"ok": self.go,
			"back": self.close,
			"red": self.close,
			"green": self.keyGreen,
			"yellow": self.keyYellow,
			"blue": self.keyBlue,
		})

		self.list = []
		self.statuslist = []
		self.listindex = 0
		self["list"] = List(self.list)
		self["list"].onSelectionChanged.append(self._onSelectionChanged)

		self.onLayoutFinish.append(self.startRun)
		self.onShown.append(self.setWindowTitle)
		self.onClose.append(self.cleanup)
		self.Timer = eTimer()
		self.Timer_conn = self.Timer.timeout.connect(self.TimerFire)

	def getServiceIF(self, service):
		key = None
		if service.state() == eNetworkManager.STATE_ONLINE:
			iface = NetworkInterface(service)
			key = iface.ethernet.interface
		return key

	def cleanup(self):
		del self.Timer

	def startRun(self):
		self.expanded = []
		self.setStatus('update')
		self["infotext"].setText("")
		self.vc = valid_cache(self.cache_file, self.cache_ttl)
		if self.cache_ttl > 0 and self.vc != 0:
			self.process_NetworkIPs()
		else:
			self.Timer.start(3000)

	def TimerFire(self):
		self.Timer.stop()
		self.process_NetworkIPs()

	def setWindowTitle(self):
		self.setTitle(_("Browse network neighbourhood"))

	def keyGreen(self):
		self.session.open(AutoMountManager, None, self.skin_path)

	def keyYellow(self):
		if (os_path.exists(self.cache_file) == True):
			remove(self.cache_file)
		self.startRun()

	def keyBlue(self):
		self.session.openWithCallback(self.scanIPclosed,ScanIP)

	def scanIPclosed(self,result):
		if result[0]:
			# scan subnet outside ipv4.address/24
			if result[1] == "address":
				print "[Networkbrowser] got IP:",result[0]
				self.setStatus('update')
				net = IPNetwork('%s/24' % result[0])
				localnet = IPNetwork('%s/%s' % (self._ipv4.address, self._ipv4.netmask))
				if localnet.__contains__(net):
					self._startScan(self.iface, net.cidr)
				else:
					for host in net.iter_hosts():
						self._nrthreads += 1
						reactor.callInThread(self.getNetworkIPs, str(host))
			# add offline host
			elif result[1] == "nfs":
				self.networklist.append(NetworkItemHost(result[0], result[0], ['nfs']))
				write_cache(self.cache_file, self.networklist)
				self.updateNetworkList()

	def setStatus(self,status = None):
		if status:
			self.statuslist = []
			if status == 'update':
				statuspng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_PLUGINS, "SystemPlugins/NetworkBrowser/icons/update.png"))
				self.statuslist.append(( ['info'], statuspng, _("Searching your network. Please wait..."), None, None, None, None ))
				self['list'].setList(self.statuslist)
			elif status == 'error':
				#TODO nicer pixmap
				statuspng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_PLUGINS, "SystemPlugins/NetworkBrowser/icons/error.png"))
				self.statuslist.append(( ['info'], statuspng, _("No network devices found!"), None, None, None, None ))
				self['list'].setList(self.statuslist)

	def process_NetworkIPs(self):
		self.inv_cache = 0
		self.vc = valid_cache(self.cache_file, self.cache_ttl)
		if self.cache_ttl > 0 and self.vc != 0:
			Log.i('Loading network cache from %s' %(self.cache_file))
			try:
				self.networklist = load_cache(self.cache_file)
				if len(self.networklist) > 0:
					self.updateNetworkList()
				else:
					self.setStatus('error')
			except:
				self.inv_cache = 1
		if self.cache_ttl == 0 or self.inv_cache == 1 or self.vc == 0:
			Log.i('Getting fresh network list')

			net = IPNetwork('%s/%s' % (self._ipv4.address, self._ipv4.netmask))
			if net.prefixlen < 24:
				net.prefixlen = 24

			self.networklist = []
			self._startScan(self.iface, net.cidr)

	def _startScan(self, iface, cidr):
			cmd = "arp-scan -gqNx --retry=1 --interface=%s %s" % (iface, cidr)
			Log.i("Command: %s" % cmd)
			self._arpscan_container = eConsoleAppContainer()
			self._arpscan_appClosed_conn = self._arpscan_container.appClosed.connect(self._onArpScanClosed)
			self._arpscan_dataAvail_conn = self._arpscan_container.dataAvail.connect(self._onArpScanData)

			self._arpscan_hosts = []
			self._arpscan_container.execute(cmd)

	def _onArpScanData(self, data):
		for line in data.splitlines():
			try:
				(address, mac) = line.split()
			except:
				Log.w('Unexpected line: %s' % line)
			else:
				self._arpscan_hosts.append(address)

	def _onArpScanClosed(self, retval):
		Log.i("arp-scan closed, retval=%d" % retval)
		for host in self._arpscan_hosts:
			self._nrthreads += 1
			reactor.callInThread(self.getNetworkIPs, host)

	def _probeTcpPort(self, host, port):
		sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
		sock.settimeout(1)
		try:
			sock.connect((host, port))
		except:
			Log.w("Connection to %s:%d failed" % (host, port))
			found = False
		else:
			Log.i("Detected service on %s:%d" % (host, port))
			found = True
		sock.close()
		return found

	def getNetworkIPs(self, host):
		Log.i("Detecting availablility of NFS or SMB services on host %s" % host)
		item = None
		services = []

		if self._probeTcpPort(host, 445) or self._probeTcpPort(host, 139):
			Log.i("Found SMB server on %s" % host)
			services.append("smb")

		if rpcinfo.progping('udp', host, 'nfs') or rpcinfo.progping('tcp', host, 'nfs'):
			Log.i("Found NFS server on %s" % host)
			services.append("nfs")

		if services:
			hostname = self._lookupHostname(host)
			item = NetworkItemHost(hostname, host, services)

		Log.i(item)
		reactor.callFromThread(self._onNetworkIPsReady, item)

	def _onNetworkIPsReady(self, item):
		self._nrthreads -= 1
		Log.i("Waiting for %d more threads" % self._nrthreads)
		if item:
			self.networklist.append(item)
		self._updateUI(self._nrthreads == 0)

	def _updateUI(self, finished=True):
		write_cache(self.cache_file, self.networklist)
		if len(self.networklist) > 0:
			self.updateNetworkList()
		elif finished:
			self.setStatus('error')

	def _onError(self, *args, **kwargs):
		Log.w()

	def _lookupHostname(self, addr, local=False):
		names = self._netbios.queryIPForName(addr, timeout=1)
		if names:
			return sorted(names)[0]

		try:
			fqdn = socket.getnameinfo((addr, 0), socket.NI_NAMEREQD)[0]
		except:
			pass
		else:
			hostname = fqdn.split('.', 1)[0]
			if hostname:
				return hostname

		if local:
			hostname = socket.gethostname()
			if hostname:
				return hostname

		return addr

	def getNetworkShares(self, hostip, hostname):
		sharelist = []
		self.sharecache_file = None
		self.sharecache_file = eEnv.resolve("${sysconfdir}/enigma2/") + hostname.strip() + '.cache' #Path to cache directory

		username = "******"
		password = ""
		if os_path.exists(self.sharecache_file):
			print '[Networkbrowser] Loading userinfo from ',self.sharecache_file
			try:
				self.hostdata = load_cache(self.sharecache_file)
				username = self.hostdata['username']
				password = self.hostdata['password']
			except:
				pass

		for port in (445, 139):
			try:
				smbconn = SMBConnection(username, password, self._myhostname, hostname, is_direct_tcp=(port == 445))
				if smbconn.connect(hostip, port=port, timeout=1):
					print '[Networkbrowser] established SMB connection to %s:%d' % (hostip, port)
					for share in smbconn.listShares(timeout=1):
						if share.type == SharedDevice.DISK_TREE and not share.isSpecial:
							sharelist.append( NetworkItemSmb(hostname, hostip, share.name.encode('utf-8'), 'Disk', comment=share.comments.encode('utf-8')) )
					smbconn.close()
					break
			except Exception as e:
				Log.w('[Networkbrowser] SMBConnection: ' + str(e))
		try:
			exports = showmount(hostip)
		except IOError as e:
			Log.w('[Networkbrowser] showmount: ' + str(e))
		else:
			for ex in exports:
				sharelist.append( NetworkItemNfs(os_path.basename(ex['dir']), hostip, ex['dir'], ','.join(ex['groups'])) )
		return sharelist

	def updateNetworkList(self):
		self.list = []
		network = {}
		for item in self.networklist:
			network[item.host] = item
		Log.i(network)
		for ip in sorted(network.keys()):
			host = network[ip]
			self.list.append(self._buildNetworkHostEntry(host))
			if ip in self.expanded:
				shares = self.getNetworkShares(ip, host.name.strip())
				#close empty to avoid permanent reloading
				if not shares:
					self.expanded.remove(ip)
				for share in shares:
					self.list.append(self._buildNetworkShareEntry(share))

		self["list"].setList(self.list)
		self["list"].setIndex(self.listindex)

	def _buildNetworkHostEntry(self, item):
		name = item.host
		if item.name != item.host:
			name = "%s (%s)" %(name, item.name)
		icon = LoadPixmap(cached=True, path=resolveFilename(SCOPE_PLUGINS, "SystemPlugins/NetworkBrowser/icons/host.png"))
		return (item, icon, name, None, None, None, None)

	def _buildNetworkShareEntry(self, share):
		verticallineIcon = LoadPixmap(cached=True, path=resolveFilename(SCOPE_PLUGINS, "SystemPlugins/NetworkBrowser/icons/verticalLine.png"))
		if share.type == NetworkItem.TYPE_NFS:
			newpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_PLUGINS, "SystemPlugins/NetworkBrowser/icons/i-nfs.png"))
		else:
			newpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_PLUGINS, "SystemPlugins/NetworkBrowser/icons/i-smb.png"))

		isMounted = False
		mounts = iAutoMount.getMounts()
		for sharename, sharedata in mounts.items():
			if sharedata['ip'] == share.host:
				if share.type == NetworkItem.TYPE_NFS and sharedata['mounttype'] == 'nfs':
					if share.path == sharedata['sharedir'] and sharedata["isMounted"]:
						isMounted = True
				elif share.type == NetworkItem.TYPE_SMB and sharedata['mounttype'] == 'cifs':
					if share.path == sharedata['sharedir'] and sharedata["isMounted"]:
						isMounted = True
		if isMounted:
			isMountedpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_PLUGINS, "SystemPlugins/NetworkBrowser/icons/ok.png"))
		else:
			isMountedpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_PLUGINS, "SystemPlugins/NetworkBrowser/icons/cancel.png"))

		return (share, verticallineIcon, None, share.path, share.comment, newpng, isMountedpng)

	def _onSelectionChanged(self):
		current = self["list"].getCurrent()
		self.listindex = self["list"].getIndex()
		if current:
			current = current[0]
			if not isinstance(current, NetworkItem):
				return
			if current.type == NetworkItem.TYPE_HOST:
				if current.host in self.expanded:
					self["infotext"].setText(_("Press OK to collapse this host"))
				else:
					self["infotext"].setText(_("Press OK to expand this host"))
			else:
				self["infotext"].setText(_("Press OK to mount this share!"))

	def go(self):
		item = self["list"].getCurrent()[0]
		if item is None or not isinstance(item, NetworkItem):
			return
		self.hostcache_file = "%s%s.cache" %(eEnv.resolve("${sysconfdir}/enigma2/"), item.name) #Path to cache directory
		if item.type == NetworkItem.TYPE_HOST: # host entry selected
			if item.host in self.expanded:
				self.expanded.remove(item.host)
				self.updateNetworkList()
				return
			else:
				if os_path.exists(self.hostcache_file):
					print '[Networkbrowser] Loading userinfo cache from ',self.hostcache_file
					try:
						self.hostdata = load_cache(self.hostcache_file)
						self.passwordQuestion(False)
						return
					except:
						Log.w("error loading host cache!")
			if "smb" in item.services:
				self.session.openWithCallback(self.passwordQuestion, MessageBox, text=_("Do you want to enter a username and password for this host?\n"), default=False )
			else:
				self.passwordQuestion(False)
		else:
			self.openMountEdit(item)

	def passwordQuestion(self, ret = False):
		item = self["list"].getCurrent()[0]
		if ret:
			self.session.openWithCallback(self.UserDialogClosed, UserDialog, self.skin_path, item.name)
			return
		if item.type == NetworkItem.TYPE_HOST: # host entry selected
			if item.host in self.expanded:
				self.expanded.remove(item.host)
			else:
				self.expanded.append(item.host)
			self.updateNetworkList()
		else:
			self.openMountEdit(item)

	def UserDialogClosed(self, *ret):
		if ret is not None and len(ret):
			self.go()

	def openMountEdit(self, item):
		if item and item.type != NetworkItem.TYPE_HOST:
			mounts = iAutoMount.getMounts()
			self.sharecache_file = None
			if item.type == NetworkItem.TYPE_NFS: # share entry selected
				data = iAutoMount.DEFAULT_OPTIONS_NFS
			if item.type == NetworkItem.TYPE_SMB: # share entry selected
				data = iAutoMount.DEFAULT_OPTIONS_CIFS
				self.sharecache_file = eEnv.resolve("${sysconfdir}/enigma2/") + item.name.strip() + '.cache' #Path to cache directory
				if os_path.exists(self.sharecache_file):
					print '[Networkbrowser] Loading userinfo from ',self.sharecache_file
					try:
						self.hostdata = load_cache(self.sharecache_file)
						data['username'] = self.hostdata['username']
						data['password'] = self.hostdata['password']
					except:
						pass
			data['active'] = True
			data['ip'] = item.host
			data['sharename'] = item.name
			data['sharedir'] = item.path
			for sharename, sharedata in mounts.items():
				if sharedata['ip'] == item.host and sharedata['sharedir'] == item.path:
					data = sharedata
					break
			Log.i(data)
			self.session.openWithCallback(self.MountEditClosed,AutoMountEdit, self.skin_path, data)

	def MountEditClosed(self, returnValue = None):
		if returnValue == None:
			self.updateNetworkList()
Пример #42
0
    def smb_open(self, req):
        global USE_NTLM, MACHINE_NAME

        host = req.get_host()
        if not host:
            raise urllib2.URLError('SMB error: no host given')
        host, port = splitport(host)
        if port is None:
            port = 139
        else:
            port = int(port)

        # username/password handling
        user, host = splituser(host)
        if user:
            user, passwd = splitpasswd(user)
        else:
            passwd = None
        host = unquote(host)
        user = user or ''

        domain = ''
        if ';' in user:
            domain, user = user.split(';', 1)

        passwd = passwd or ''
        myname = MACHINE_NAME or self.generateClientMachineName()

        n = NetBIOS()
        names = n.queryIPForName(host)
        if names:
            server_name = names[0]
        else:
            raise urllib2.URLError('SMB error: Hostname does not reply back with its machine name')

        path, attrs = splitattr(req.get_selector())
        if path.startswith('/'):
            path = path[1:]
        dirs = path.split('/')
        dirs = map(unquote, dirs)
        service, path = dirs[0], '/'.join(dirs[1:])

        try:
            conn = SMBConnection(user, passwd, myname, server_name, domain=domain, use_ntlm_v2 = USE_NTLM)
            conn.connect(host, port)

            if req.has_data():
                data_fp = req.get_data()
                filelen = conn.storeFile(service, path, data_fp)

                headers = "Content-length: 0\n"
                fp = StringIO("")
            else:
                fp = self.createTempFile()
                file_attrs, retrlen = conn.retrieveFile(service, path, fp)
                fp.seek(0)

                headers = ""
                mtype = mimetypes.guess_type(req.get_full_url())[0]
                if mtype:
                    headers += "Content-type: %s\n" % mtype
                if retrlen is not None and retrlen >= 0:
                    headers += "Content-length: %d\n" % retrlen

            sf = StringIO(headers)
            headers = mimetools.Message(sf)

            return addinfourl(fp, headers, req.get_full_url())
        except Exception, ex:
            raise urllib2.URLError, ('smb error: %s' % ex), sys.exc_info()[2]