From 07f69db677f701e5452917cf1ffa3340abe89e26 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tosi=20=C3=89meric?= Date: Thu, 16 Feb 2017 16:23:14 +0100 Subject: [PATCH 1/4] Update servefiles.py making parameter count verification strict adding file extension verification when a file is given as parameter adding output error to stderr adding hostPort choice (for the HTTP server) rename 'directory' into 'target_path' rename 'payload' into 'file_list_payload' adding comments some small cleanups (indent, print(), ...) --- servefiles/servefiles.py | 109 ++++++++++++++++++++------------------- 1 file changed, 55 insertions(+), 54 deletions(-) diff --git a/servefiles/servefiles.py b/servefiles/servefiles.py index 2a3ac00..5d0e56c 100644 --- a/servefiles/servefiles.py +++ b/servefiles/servefiles.py @@ -1,4 +1,6 @@ #!/usr/bin/env python +# coding: utf-8 -*- + import os import socket import struct @@ -8,79 +10,78 @@ import time import urllib try: - from SimpleHTTPServer import SimpleHTTPRequestHandler - from SocketServer import TCPServer - from urlparse import urljoin - from urllib import pathname2url, quote + from SimpleHTTPServer import SimpleHTTPRequestHandler + from SocketServer import TCPServer + from urlparse import urljoin + from urllib import pathname2url, quote except ImportError: - from http.server import SimpleHTTPRequestHandler - from socketserver import TCPServer - from urllib.parse import urljoin, quote - from urllib.request import pathname2url + from http.server import SimpleHTTPRequestHandler + from socketserver import TCPServer + from urllib.parse import urljoin, quote + from urllib.request import pathname2url -if len(sys.argv) < 3: - print("Usage: " + sys.argv[0] + " [host ip]") - sys.exit(1) +if len(sys.argv) < 3 or len(sys.argv) > 5: + print('Usage:', sys.argv[0], ' [host ip] [host port]') + sys.exit(1) -ip = sys.argv[1] -directory = sys.argv[2] +accepted_extension = ('.cia', '.tik') +target_ip = sys.argv[1] +target_path = sys.argv[2] +hostPort = 8080 # default value -if not os.path.exists(directory): - print(directory + ": No such file or directory.") - sys.exit(1) +if not os.path.exists(target_path): + print(target_path, ': No such file or directory.', file=sys.stderr) + sys.exit(1) if len(sys.argv) >= 4: - hostIp = sys.argv[3] + hostIp = sys.argv[3] + if len(sys.argv) == 5: + hostPort = int(sys.argv[4]) else: - hostIp = [(s.connect(('8.8.8.8', 53)), s.getsockname()[0], s.close()) for s in [socket.socket(socket.AF_INET, socket.SOCK_DGRAM)]][0][1] + print('Finding host ip ...') # loop over network address to find one + hostIp = [(s.connect(('8.8.8.8', 53)), s.getsockname()[0], s.close()) for s in [socket.socket(socket.AF_INET, socket.SOCK_DGRAM)]][0][1] -print("Preparing data...") +print('Preparing data ...') +baseUrl = hostIp + ':' + str(hostPort) + '/' -baseUrl = hostIp + ":8080/" -payload = "" - -if os.path.isfile(directory): - payload += baseUrl + quote(os.path.basename(directory)) - directory = os.path.dirname(directory) +if os.path.isfile(target_path) and target_path.endswith(accepted_extension): + file_list_payload = baseUrl + quote(os.path.basename(target_path)) + directory = os.path.dirname(target_path) # get file directory else: - for file in [ file for file in next(os.walk(directory))[2] if file.endswith(('.cia', '.tik')) ]: - payload += baseUrl + quote(file) + "\n" + directory = target_path # it's a directory + file_list_payload = '' # init the payload before adding lines + for file in [file for file in next(os.walk(target_path))[2] if file.endswith(accepted_extension)]: + file_list_payload += baseUrl + quote(file) + '\n' -if len(payload) == 0: - print("No files to serve.") - sys.exit(1) +if len(file_list_payload) == 0: + print('No files to serve.', file=sys.stderr) + sys.exit(1) -payloadBytes = payload.encode("ascii") +file_list_payloadBytes = file_list_payload.encode('ascii') -if not directory == "": - os.chdir(directory) +if directory and directory != '.': # doesn't need to move if it's already the current working directory + os.chdir(directory) # set working directory to the right folder to be able to serve files -print("") -print("URLS:") -print(payload) -print("") +print('\nURLS (payload send) :') +print(file_list_payload, '\n') -print("Opening HTTP server on port 8080...") - -server = TCPServer(("", 8080), SimpleHTTPRequestHandler) +print('Opening HTTP server on port :', hostPort) +server = TCPServer(('', hostPort), SimpleHTTPRequestHandler) thread = threading.Thread(target=server.serve_forever) thread.start() try: - print("Sending URL(s) to " + ip + ":5000...") - - sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - sock.connect((ip, 5000)) - sock.sendall(struct.pack('!L', len(payloadBytes)) + payloadBytes) - while len(sock.recv(1)) < 1: - time.sleep(0.05) - - sock.close() + print('Sending URL(s) to', target_ip, 'on port 5000 ...') + sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + sock.connect((target_ip, 5000)) + sock.sendall(struct.pack('!L', len(file_list_payloadBytes)) + file_list_payloadBytes) + while len(sock.recv(1)) < 1: + time.sleep(0.05) + sock.close() except Exception as e: - print("Error: " + str(e)) - server.shutdown() - sys.exit(1) - -print("Shutting down HTTP server...") + print('An Error occurred :', str(e), file=sys.stderr) + server.shutdown() + sys.exit(1) +print('Shutting down HTTP server ...') server.shutdown() From f40d0038f24cb3b37a299f99a5fa2c693b9cf046 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tosi=20=C3=89meric?= Date: Thu, 16 Feb 2017 16:32:53 +0100 Subject: [PATCH 2/4] Update servefiles.py change file verification when a file is given as parameter --- servefiles/servefiles.py | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/servefiles/servefiles.py b/servefiles/servefiles.py index 5d0e56c..ef379cf 100644 --- a/servefiles/servefiles.py +++ b/servefiles/servefiles.py @@ -44,9 +44,14 @@ else: print('Preparing data ...') baseUrl = hostIp + ':' + str(hostPort) + '/' -if os.path.isfile(target_path) and target_path.endswith(accepted_extension): - file_list_payload = baseUrl + quote(os.path.basename(target_path)) - directory = os.path.dirname(target_path) # get file directory +if os.path.isfile(target_path): + if target_path.endswith(accepted_extension): + file_list_payload = baseUrl + quote(os.path.basename(target_path)) + directory = os.path.dirname(target_path) # get file directory + else: + print('This file has no extension like :', accepted_extension, file=sys.stderr) + sys.exit(1) + else: directory = target_path # it's a directory file_list_payload = '' # init the payload before adding lines @@ -62,7 +67,7 @@ file_list_payloadBytes = file_list_payload.encode('ascii') if directory and directory != '.': # doesn't need to move if it's already the current working directory os.chdir(directory) # set working directory to the right folder to be able to serve files -print('\nURLS (payload send) :') +print('\nURLS (data) :') print(file_list_payload, '\n') print('Opening HTTP server on port :', hostPort) From 2d8d5db210a8bf9e55440a1e5d8c1a38d5f6c737 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tosi=20=C3=89meric?= Date: Thu, 16 Feb 2017 16:43:48 +0100 Subject: [PATCH 3/4] Create drop cias or folder here.sh equivalent of the *.bat script but for *nix OS --- servefiles/drop cias or folder here.sh | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 servefiles/drop cias or folder here.sh diff --git a/servefiles/drop cias or folder here.sh b/servefiles/drop cias or folder here.sh new file mode 100644 index 0000000..8414f07 --- /dev/null +++ b/servefiles/drop cias or folder here.sh @@ -0,0 +1,4 @@ +#!/bin/bash + +read -p "Type the IP address of your 3DS: " -e input +python servefiles.py $input . From ca3b6a3f85eca216150efac203959d5a23490e3f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tosi=20=C3=89meric?= Date: Thu, 16 Feb 2017 16:50:26 +0100 Subject: [PATCH 4/4] Update README.md --- servefiles/README.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/servefiles/README.md b/servefiles/README.md index 1b8f202..f865e8f 100644 --- a/servefiles/README.md +++ b/servefiles/README.md @@ -2,4 +2,7 @@ Simple Python script for serving local files to FBI's remote installer. Requires [Python](https://www.python.org/downloads/). -**Usage**: python servefiles.py (ip) (file/directory) \[host ip\] +**Usage**: python servefiles.py (3ds ip) (file / directory) \[host ip\] \[host port\] + + - the file can be *.cia or *.tik + - the directory have to contain *.cia or *.tik files