Skip to content

Commit 5eb7c78

Browse files
authored
Merge pull request #55 from Ne0re0/master
add --logfile tag and dynamic directory switching to call ssrfmap.py from anywhere
2 parents 36eb5a3 + de71014 commit 5eb7c78

File tree

2 files changed

+42
-18
lines changed

2 files changed

+42
-18
lines changed

core/ssrf.py

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
import os
55
import time
66
import logging
7+
from pathlib import Path
8+
79

810
class SSRF(object):
911
modules = set()
@@ -12,9 +14,12 @@ class SSRF(object):
1214

1315
def __init__(self, args):
1416

17+
# Set working dir to access all libraries
18+
self.change_current_dir()
19+
1520
# Load modules in memory
1621
self.load_modules()
17-
22+
1823
# Start a reverse shell handler
1924
if args.handler and args.lport and args.handler == "1":
2025
handler = Handler(args.lport)
@@ -70,3 +75,10 @@ def load_handler(self, name):
7075
except Exception as e:
7176
logging.error(f"Invalid no such handler: {name}")
7277
exit(1)
78+
79+
def change_current_dir(self):
80+
try:
81+
os.chdir(str(Path(__file__).resolve().parent.parent))
82+
except PermissionError:
83+
print(logging.error(f"Error : Access to directory {new_directory} denied. Please verify that you have execute access."))
84+

ssrfmap.py

100644100755
Lines changed: 29 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
import argparse
44
import logging
55
import urllib3
6+
from pathlib import Path
7+
import os
68

79
def display_banner():
810
print(r" _____ _________________ ")
@@ -23,8 +25,8 @@ def parse_args():
2325
python ssrfmap.py -r examples/request.txt -p url -m readfiles --rfiles
2426
'''
2527
parser = argparse.ArgumentParser(epilog=example_text, formatter_class=argparse.RawDescriptionHelpFormatter)
26-
parser.add_argument('-r', action ='store', dest='reqfile', help="SSRF Request file")
27-
parser.add_argument('-p', action ='store', dest='param', help="SSRF Parameter to target")
28+
parser.add_argument('-r', action ='store', dest='reqfile', help="SSRF Request file", required=True)
29+
parser.add_argument('-p', action ='store', dest='param', help="SSRF Parameter to target", required=True)
2830
parser.add_argument('-m', action ='store', dest='modules', help="SSRF Modules to enable")
2931
parser.add_argument('-l', action ='store', dest='handler', help="Start an handler for a reverse shell", nargs='?', const='1')
3032
parser.add_argument('-v', action ='store_true', dest='verbose', help="Enable verbosity")
@@ -36,34 +38,44 @@ def parse_args():
3638
parser.add_argument('--ssl', action ='store', dest='ssl', help="Use HTTPS without verification", nargs='?', const=True)
3739
parser.add_argument('--proxy', action ='store', dest='proxy', help="Use HTTP(s) proxy (ex: http://localhost:8080)")
3840
parser.add_argument('--level', action ='store', dest='level', help="Level of test to perform (1-5, default: 1)", nargs='?', const=1, default=1, type=int)
41+
parser.add_argument('--logfile', action ='store', dest='logfile', help="SSRFmap Log file")
3942
results = parser.parse_args()
40-
41-
if results.reqfile == None:
42-
parser.print_help()
43-
exit()
44-
4543
return results
4644

45+
4746
if __name__ == "__main__":
4847
# disable ssl warning for self signed certificate
4948
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
49+
display_banner()
5050

51+
args = parse_args()
52+
args.reqfile = os.path.abspath(args.reqfile)
53+
54+
# set logfile default location to SSRFmap.log next to ssrfmap.py
55+
if args.logfile is None :
56+
log_file_path = str(Path(__file__).resolve().parent) + "/SSRFmap.log"
57+
else :
58+
log_file_path = args.logfile
59+
60+
print(f"[INFO] Log file '{log_file_path}'")
5161
# enable custom logging
52-
logging.basicConfig(
53-
level=logging.INFO,
54-
format="[%(levelname)s]:%(message)s",
55-
handlers=[
56-
logging.FileHandler("SSRFmap.log", mode='w'),
57-
logging.StreamHandler()
58-
]
59-
)
62+
try :
63+
logging.basicConfig(
64+
level=logging.INFO,
65+
format="[%(levelname)s]:%(message)s",
66+
handlers=[
67+
logging.FileHandler(log_file_path, mode='w'),
68+
logging.StreamHandler()
69+
]
70+
)
71+
# handle permission denied on logfile
72+
except Exception as e:
73+
print(f'{e}')
6074

6175
logging.addLevelName(logging.WARNING, "\033[1;31m%s\033[1;0m" % logging.getLevelName(logging.WARNING))
6276
logging.addLevelName(logging.ERROR, "\033[1;41m%s\033[1;0m" % logging.getLevelName(logging.ERROR))
63-
display_banner()
6477

6578
# handle verbosity
66-
args = parse_args()
6779
if args.verbose is True:
6880
logging.getLogger().setLevel(logging.DEBUG)
6981
logging.debug("Verbose output is enabled")

0 commit comments

Comments
 (0)