Last active
December 27, 2017 12:07
-
-
Save User65k/0a17b7cb31971387cd99856c26fbaf1b to your computer and use it in GitHub Desktop.
Share a Directory via FTP, HTTP and SMB
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/python | |
# | |
# Share a Directory via FTP, HTTP and SMB | |
# | |
# uses pyftpdlib and impacket | |
# | |
# Usage: | |
# python FileServer.py -d <folder> <listen ip> | |
# | |
# Issues: | |
# smbserver does not exit nicely (but waits for all connections to close) | |
# | |
# | |
# Warning: | |
# This script comes as-is with no promise of functionality or accuracy. I have no plans to maintain updates, | |
# I did not write it to be efficient and in some cases you may find the functions may not produce the desired | |
# results. | |
# | |
# Do NOT use this for productive or important Stuff! | |
# | |
from pyftpdlib.authorizers import DummyAuthorizer | |
from pyftpdlib.handlers import FTPHandler | |
from pyftpdlib.servers import FTPServer | |
from pyftpdlib.log import logger | |
from BaseHTTPServer import HTTPServer | |
from SimpleHTTPServer import SimpleHTTPRequestHandler | |
from impacket import smbserver | |
#from thread import start_new_thread | |
from threading import Thread | |
from time import sleep | |
from os import listdir, pardir, curdir | |
from os.path import isfile, join, abspath, splitdrive, split | |
from urllib import unquote | |
import argparse | |
FORMAT_STRS = ( "wget http://{ip}:{http}/{file}", | |
"smb://{ip}:{smb}/SHARE/{file}", | |
"(new-object System.Net.WebClient).DownloadFile('http://{ip}:{http}/{file}','{file}')", | |
"echo open {ip} {ftp}>ftp_commands.txt&echo anonymous>>ftp_commands.txt&echo password>>ftp_commands.txt&echo binary>>ftp_commands.txt&echo get {file}>>ftp_commands.txt&echo bye>>ftp_commands.txt&ftp -s:ftp_commands.txt") | |
class HTTPHandler(SimpleHTTPRequestHandler): | |
def log_message(self, format, *args): | |
#Use pyftpdlib Logger for everything | |
logger.info("%s - %s" % | |
(self.address_string(), | |
format%args)) | |
def translate_path(self, path): | |
#allow docroot different than cwd | |
path = path.split('?',1)[0] | |
path = path.split('#',1)[0] | |
path = unquote(path) | |
words = path.split('/') | |
words = filter(None, words) | |
path = self._wd | |
for word in words: | |
drive, word = splitdrive(word) | |
head, word = split(word) | |
if word in (curdir, pardir): continue | |
path = join(path, word) | |
return path | |
class SMBHandler(smbserver.SimpleSMBServer): | |
def stop(self): | |
#self._SimpleSMBServer__server.socket.close() | |
#self._SimpleSMBServer__server.server_close() | |
pass | |
parser = argparse.ArgumentParser(description="Share Files") | |
parser.add_argument('ip', help='''IP to listen on.''') | |
parser.add_argument('-d', '--dir', dest="folder", help='''Folder to serve''', default='.') | |
parser.add_argument('-pf', '--ftp', type=int, default=21, help='''Port for FTP Server.''') | |
parser.add_argument('-ph', '--http', type=int, default=80, help='''Port for HTTP Server.''') | |
parser.add_argument('-ps', '--smb', type=int, default=445, help='''Port for SMB Server.''') | |
args = parser.parse_args() | |
#FTP | |
authorizer = DummyAuthorizer() | |
authorizer.add_anonymous(args.folder) | |
handler = FTPHandler | |
handler.authorizer = authorizer | |
ftp_server = FTPServer((args.ip, args.ftp), handler) | |
#start_new_thread(ftp_server.serve_forever,(None,)) | |
t = Thread(target=ftp_server.serve_forever, args=()) | |
t.daemon = True | |
t.start() | |
#HTTP | |
httph = HTTPHandler | |
httph._wd = abspath(args.folder) | |
httpd = HTTPServer((args.ip, args.http), httph) | |
sa = httpd.socket.getsockname() | |
logger.info(">>> starting HTTP server on %s:%s <<<" % (sa[0], sa[1])) | |
#start_new_thread(httpd.serve_forever,(None,)) | |
t = Thread(target=httpd.serve_forever, args=()) | |
t.daemon = True | |
t.start() | |
#SMB | |
smb = SMBHandler(listenAddress = args.ip, listenPort=args.smb) | |
smb.addShare("SHARE", args.folder, "") | |
smb.setSMB2Support(True) | |
logger.info(">>> starting SMB server on %s:%s <<<" % (args.ip, args.smb)) | |
#start_new_thread(smb.start,()) | |
t = Thread(target=smb.start, args=()) | |
t.daemon = True | |
t.start() | |
#DL String Builder | |
root = abspath(args.folder) | |
wdir = root | |
try: | |
cmd = "" | |
while True: | |
cmd = raw_input('> ') | |
if cmd=="exit": | |
break | |
elif cmd=="pwd": | |
print abspath(wdir) | |
elif cmd[:2]=="ls": | |
cdir = wdir | |
if 2 < len(cmd): | |
cdir = join(wdir,cmd[3:]) | |
try: | |
for f in listdir(cdir): | |
print f | |
except OSError: | |
print "Error Reading '"+cdir+"'" | |
elif cmd[:2]=="cd": | |
if 2 < len(cmd): | |
tmp = join(wdir,cmd[3:]) | |
fp = abspath(tmp) | |
if fp.startswith(root): | |
wdir = tmp | |
else: | |
print "Directory '"+tmp+"' not in path" | |
else: | |
wdir = root | |
else: | |
cfile = join(wdir,cmd) | |
if isfile(cfile): | |
fp = abspath(cfile) | |
if fp.startswith(root+'/'): | |
fp = fp[len(root)+1:] | |
#filename | |
data = {'ip': args.ip, 'http': args.http, 'ftp': args.ftp, 'smb': args.smb, 'file': fp} | |
for out in FORMAT_STRS: | |
print out.format(**data) | |
else: | |
print "No File" | |
print "Try: pwd, ls, cd, exit or a file name" | |
except KeyboardInterrupt: | |
#Ctrl+C | |
pass | |
except EOFError: | |
#Ctrl+D | |
pass | |
ftp_server.close_all() | |
logger.info(">>> FTP stopped <<<") | |
#httpd.shutdown() | |
httpd.socket.close() | |
logger.info(">>> HTTP stopped <<<") | |
smb.stop() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment