33import argparse
44import logging
55import urllib3
6+ from pathlib import Path
7+ import os
68
79def 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+
4746if __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