Skip to content

Instantly share code, notes, and snippets.

@User65k
Last active December 27, 2017 12:07
Show Gist options
  • Save User65k/0a17b7cb31971387cd99856c26fbaf1b to your computer and use it in GitHub Desktop.
Save User65k/0a17b7cb31971387cd99856c26fbaf1b to your computer and use it in GitHub Desktop.
Share a Directory via FTP, HTTP and SMB
#!/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