d589de01c571b9ef97b90d92aeff863b0eb571dd
Hanno Böck Enforce python 3, remove py...

Hanno Böck authored 4 years ago

1) #!/usr/bin/python3 -O
Hanno Böck initial commit

Hanno Böck authored 17 years ago

2) 
3) # freewvs 0.1 - the free web vulnerability scanner
4) #
Hanno Böck convert all http URLs to https

Hanno Böck authored 7 years ago

5) # https://source.schokokeks.org/freewvs/
Hanno Böck initial commit

Hanno Böck authored 17 years ago

6) #
Hanno Böck convert all http URLs to https

Hanno Böck authored 7 years ago

7) # Written 2007-2012 by schokokeks.org Hosting, https://schokokeks.org
Hanno Böck initial commit

Hanno Böck authored 17 years ago

8) #
9) # Contributions by
Hanno Böck convert all http URLs to https

Hanno Böck authored 7 years ago

10) # Hanno Boeck, https://hboeck.de/
11) # Fabian Fingerle, https://fabian-fingerle.de/
12) # Bernd Wurst, https://bwurst.org/
Hanno Böck initial commit

Hanno Böck authored 17 years ago

13) #
Hanno Böck License change to cc0

Hanno Böck authored 12 years ago

14) # To the extent possible under law, the author(s) have dedicated all copyright
15) # and related and neighboring rights to this software to the public domain
16) # worldwide. This software is distributed without any warranty.
Hanno Böck initial commit

Hanno Böck authored 17 years ago

17) #
Hanno Böck License change to cc0

Hanno Böck authored 12 years ago

18) # You should have received a copy of the CC0 Public Domain Dedication along
Hanno Böck format syntax according to...

Hanno Böck authored 7 years ago

19) # with this software. If not, see
Hanno Böck convert all http URLs to https

Hanno Böck authored 7 years ago

20) # https://creativecommons.org/publicdomain/zero/1.0/
Hanno Böck License change to cc0

Hanno Böck authored 12 years ago

21) # Nevertheless, in case you use a significant part of this code, we ask (but
22) # not require, see the license) that you keep the authors' names in place and
23) # return your changes to the public. We would be especially happy if you tell
24) # us what you're going to do with this code.
Hanno Böck initial commit

Hanno Böck authored 17 years ago

25) 
Hanno Böck Enforce python 3, remove py...

Hanno Böck authored 4 years ago

26) import configparser
Hanno Böck format syntax according to...

Hanno Böck authored 7 years ago

27) 
28) import os
29) import glob
30) import pprint
31) import re
32) import optparse
33) import sys
34) import gettext
Bernd Wurst Add XML string escaping

Bernd Wurst authored 15 years ago

35) from xml.sax.saxutils import escape
Hanno Böck initial commit

Hanno Böck authored 17 years ago

36) 
Hanno Böck add fancy output

Hanno Böck authored 16 years ago

37) gettext.textdomain('freewvs')
38) _ = gettext.gettext
Hanno Böck initial commit

Hanno Böck authored 17 years ago

39) 
Hanno Böck format syntax according to...

Hanno Böck authored 7 years ago

40) 
Hanno Böck fix lot's of pylint issues...

Hanno Böck authored 16 years ago

41) def versioncompare(safe_version, find_version):
42)     if safe_version == [""]:
43)         return True
44)     for i in range(min(len(find_version), len(safe_version))):
Hanno Böck format syntax according to...

Hanno Böck authored 7 years ago

45)         if int(find_version[i]) < int(safe_version[i]):
Hanno Böck fix lot's of pylint issues...

Hanno Böck authored 16 years ago

46)             return True
Hanno Böck format syntax according to...

Hanno Böck authored 7 years ago

47)         if int(find_version[i]) > int(safe_version[i]):
Hanno Böck fix lot's of pylint issues...

Hanno Böck authored 16 years ago

48)             return False
Hanno implement some recommendati...

Hanno authored 6 years ago

49)     return len(find_version) < len(safe_version)
Hanno Böck format syntax according to...

Hanno Böck authored 7 years ago

50) 
Hanno Böck initial commit

Hanno Böck authored 17 years ago

51) 
Hanno Böck format syntax according to...

Hanno Böck authored 7 years ago

52) def vulnprint(appname, version, safeversion, vuln, vfilename, subdir,
53)               style=None):
Hanno Böck pycodestyle fixes

Hanno Böck authored 7 years ago

54)     appdir = '/'.join(os.path.abspath(vfilename).split('/')[:-1 - subdir])
Bernd Wurst add XML output format

Bernd Wurst authored 15 years ago

55)     if not style:
Hanno Böck missing space

Hanno Böck authored 7 years ago

56)         print("%(appname)s %(version)s (%(safeversion)s) %(vuln)s "
Hanno Böck format syntax according to...

Hanno Böck authored 7 years ago

57)               "%(appdir)s" % vars())
58)     elif style == 'fancy':
59)         print(_("Directory: %(appdir)s") % vars())
60)         if safeversion != "ok":
61)             if safeversion != "":
62)                 print(_("Vulnerable %(appname)s %(version)s found, please "
63)                         "update to %(safeversion)s or above.") % vars())
Hanno Böck add support for unfixed apps

Hanno Böck authored 16 years ago

64)             else:
Hanno Böck format syntax according to...

Hanno Böck authored 7 years ago

65)                 print(_("Vulnerable %(appname)s %(version)s found, no fixed "
66)                         "version available.") % vars())
Hanno Böck some i18n fixes

Hanno Böck authored 16 years ago

67)             if vuln[:3] == "CVE":
Hanno Böck convert all http URLs to https

Hanno Böck authored 7 years ago

68)                 print(_("https://cve.mitre.org/cgi-bin/cvename.cgi?name="
Hanno Böck format syntax according to...

Hanno Böck authored 7 years ago

69)                         "%(vuln)s") % vars())
Hanno Böck some i18n fixes

Hanno Böck authored 16 years ago

70)             else:
Hanno Böck format syntax according to...

Hanno Böck authored 7 years ago

71)                 print(vuln)
Hanno Böck add fancy output

Hanno Böck authored 16 years ago

72)         else:
Hanno Böck format syntax according to...

Hanno Böck authored 7 years ago

73)             print(_("%(appname)s %(version)s found.") % vars())
74)         print("")
75)     elif style == 'xml':
Bernd Wurst add XML output format

Bernd Wurst authored 15 years ago

76)         state = 'vulnerable'
77)         if safeversion == 'ok':
78)             state = 'ok'
Hanno Böck format syntax according to...

Hanno Böck authored 7 years ago

79)         print('  <app state="%s">' % state)
80)         print('    <appname>%s</appname>' % escape(appname))
81)         print('    <version>%s</version>' % escape(version))
82)         print('    <directory>%s</directory>' % escape(appdir))
Bernd Wurst add XML output format

Bernd Wurst authored 15 years ago

83)         if state == 'vulnerable':
Hanno Böck format syntax according to...

Hanno Böck authored 7 years ago

84)             print('    <safeversion>%s</safeversion>' % escape(safeversion))
85)             print('    <vulninfo>%s</vulninfo>' % escape(vuln))
86)         print('  </app>')
Bernd Wurst add XML output format

Bernd Wurst authored 15 years ago

87) 
Hanno Böck initial commit

Hanno Böck authored 17 years ago

88) 
89) pp = pprint.PrettyPrinter(indent=4)
90) 
91) # Command-line options
Hanno Böck format syntax according to...

Hanno Böck authored 7 years ago

92) parser = optparse.OptionParser(usage="usage: %prog [options] <path>"
93)                                "[<path2> ...]")
Hanno Böck initial commit

Hanno Böck authored 17 years ago

94) parser.add_option("-a", "--all", action="store_true", dest="ALL",
95)                   help="Show all webapps found, not just vulnerable")
96) parser.add_option("-d", "--debug", action="store_true", dest="DEBUG",
Hanno Böck format syntax according to...

Hanno Böck authored 7 years ago

97)                   help="Show lots of debugging output, mainly useful"
Hanno Böck fix lot's of pylint issues...

Hanno Böck authored 16 years ago

98)                   "for development")
Hanno Böck format syntax according to...

Hanno Böck authored 7 years ago

99) parser.add_option("-f", "--fancy", action="store_const", dest="OUTPUT",
100)                   const="fancy", help="Show more fancy output")
101) parser.add_option("-x", "--xml", action="store_const", dest="OUTPUT",
102)                   const="xml", help="Output results as XML")
Hanno Böck Add possibility to scan for...

Hanno Böck authored 4 years ago

103) parser.add_option("-3", "--thirdparty", action="store_true", dest="THIRDPARTY",
104)                   help="Scan for third-party components like jquery")
Hanno Böck initial commit

Hanno Böck authored 17 years ago

105) opts, args = parser.parse_args()
106) 
107) # Parse vulnerability database
Hanno Böck make code compatible with p...

Hanno Böck authored 10 years ago

108) config = configparser.ConfigParser()
Hanno Böck catch error message on pars...

Hanno Böck authored 7 years ago

109) try:
110)     config.read(glob.glob('/usr/share/freewvs/*.freewvs'))
111)     config.read(glob.glob('/usr/local/share/freewvs/*.freewvs'))
Hanno Böck codingstyle: avoid long lin...

Hanno Böck authored 4 years ago

112)     config.read(glob.glob(os.path.dirname(sys.argv[0])
113)                           + '/freewvsdb/*.freewvs'))
Hanno Böck catch error message on pars...

Hanno Böck authored 7 years ago

114) except configparser.MissingSectionHeaderError as err:
Hanno Böck format syntax according to...

Hanno Böck authored 7 years ago

115)     print("Error parsing config files: %s" % err)
Hanno Böck initial commit

Hanno Böck authored 17 years ago

116) 
117) vdb = []
118) for sect in config.sections():
Hanno Böck fix lot's of pylint issues...

Hanno Böck authored 16 years ago

119)     item = {}
120) 
Hanno Böck codingstyle: avoid long lin...

Hanno Böck authored 4 years ago

121)     if (config.getboolean(sect, 'thirdparty', fallback=False)
122)        and not opts.THIRDPARTY):
Hanno Böck Add possibility to scan for...

Hanno Böck authored 4 years ago

123)         continue
124) 
Hanno Böck fix lot's of pylint issues...

Hanno Böck authored 16 years ago

125)     # base options
126)     item['name'] = sect
127)     item['safe'] = config.get(sect, 'safe')
128)     item['file'] = config.get(sect, 'file')
129)     item['vuln'] = config.get(sect, 'vuln')
130)     item['subdir'] = int(config.get(sect, 'subdir'))
131) 
132)     # match magic
133)     item['variable'] = []
Hanno Böck format syntax according to...

Hanno Böck authored 7 years ago

134)     for var in config.get(sect, 'variable').split(","):
Hanno Böck codingstyle: avoid long lin...

Hanno Böck authored 4 years ago

135)         item['variable'].append(re.compile(re.escape(var)
136)                                 + r"[^0-9\n\r]*[.]*([0-9.]*[0-9])[^0-9.]"))
Hanno Böck fix lot's of pylint issues...

Hanno Böck authored 16 years ago

137) 
138)     # optional options
Hanno Böck format syntax according to...

Hanno Böck authored 7 years ago

139)     if config.has_option(sect, 'extra_match'):
140)         item['extra_match'] = config.get(sect, 'extra_match')
Hanno Böck fix lot's of pylint issues...

Hanno Böck authored 16 years ago

141)     else:
142)         item['extra_match'] = False
Hanno Böck a bit better detection for...

Hanno Böck authored 7 years ago

143)     if config.has_option(sect, 'extra_nomatch'):
144)         item['extra_nomatch'] = config.get(sect, 'extra_nomatch')
145)     else:
146)         item['extra_nomatch'] = False
Hanno Böck format syntax according to...

Hanno Böck authored 7 years ago

147)     if config.has_option(sect, 'add_minor'):
148)         item['add_minor'] = config.get(sect, 'add_minor')
Hanno Böck fix lot's of pylint issues...

Hanno Böck authored 16 years ago

149)     else:
150)         item['add_minor'] = False
Hanno Böck format syntax according to...

Hanno Böck authored 7 years ago

151)     if config.has_option(sect, 'old_safe'):
152)         item['old_safe'] = config.get(sect, 'old_safe').split(",")
Hanno Böck fix lot's of pylint issues...

Hanno Böck authored 16 years ago

153)     else:
154)         item['old_safe'] = []
155) 
156)     vdb.append(item)
157) if opts.DEBUG:
158)     pp.pprint(vdb)
Hanno Böck initial commit

Hanno Böck authored 17 years ago

159) 
Bernd Wurst add XML output format

Bernd Wurst authored 15 years ago

160) if opts.OUTPUT == 'xml':
Hanno Böck format syntax according to...

Hanno Böck authored 7 years ago

161)     print('<?xml version="1.0" ?>')
162)     print('<freewvs>')
Hanno Böck initial commit

Hanno Böck authored 17 years ago

163) 
164) # start the search
165) 
Hanno Böck fix lot's of pylint issues...

Hanno Böck authored 16 years ago

166) for fdir in args:
167)     for root, NULL, files in os.walk(fdir):
168)         for filename in files:
169)             for item in vdb:
170)                 if filename == item['file']:
171)                     mfile = os.path.join(root, filename)
Bernd Wurst error handling when opening...

Bernd Wurst authored 12 years ago

172)                     try:
Hanno Böck Don't stop on decoding errors

Hanno Böck authored 4 years ago

173)                         file = open(mfile, errors='replace')
Hanno Böck pycodestyle fixes

Hanno Böck authored 7 years ago

174)                     except Exception:
Hanno Böck format syntax according to...

Hanno Böck authored 7 years ago

175)                         continue
Hanno Böck fix lot's of pylint issues...

Hanno Böck authored 16 years ago

176)                     filestr = file.read()
177)                     file.close()
178) 
179)                     if item['extra_match']:
Hanno implement some recommendati...

Hanno authored 6 years ago

180)                         ematch = filestr.find(item['extra_match']) != -1
Hanno Böck a bit better detection for...

Hanno Böck authored 7 years ago

181)                     elif item['extra_nomatch']:
Hanno implement some recommendati...

Hanno authored 6 years ago

182)                         ematch = not filestr.find(item['extra_nomatch']) != -1
Hanno Böck fix lot's of pylint issues...

Hanno Böck authored 16 years ago

183)                     else:
184)                         ematch = True
185) 
186)                     findversion = []
187)                     for var in item['variable']:
188)                         var = var.search(filestr)
189)                         if not var:
190)                             findversion = False
191)                             break
192)                         else:
193)                             findversion.append(var.group(1))
194) 
195)                     if findversion and ematch:
196)                         findversion = '.'.join(findversion)
197) 
198)                         # Very ugly phpbb workaround
199)                         if item['add_minor']:
200)                             findversion = findversion.split('.')
Hanno Böck codingstyle: avoid long lin...

Hanno Böck authored 4 years ago

201)                             findversion[-1] = str(int(findversion[-1])
202)                                                   + int(item['add_minor']))
Hanno Böck fix lot's of pylint issues...

Hanno Böck authored 16 years ago

203)                             findversion = '.'.join(findversion)
204) 
Hanno Böck format syntax according to...

Hanno Böck authored 7 years ago

205)                         if not (versioncompare(item['safe'].split('.'),
Hanno Böck fix lot's of pylint issues...

Hanno Böck authored 16 years ago

206)                                 findversion.split('.'))) or \
Hanno Böck format syntax according to...

Hanno Böck authored 7 years ago

207)                                 item['old_safe'].count(findversion) > 0:
Hanno Böck fix lot's of pylint issues...

Hanno Böck authored 16 years ago

208)                             if opts.ALL:
209)                                 if opts.DEBUG:
Hanno Böck pycodestyle fixes

Hanno Böck authored 7 years ago

210)                                     print("File " + mfile)
Hanno Böck format syntax according to...

Hanno Böck authored 7 years ago

211)                                 vulnprint(item['name'], findversion,
212)                                           "ok", "", mfile, item['subdir'],
Bernd Wurst add XML output format

Bernd Wurst authored 15 years ago

213)                                           opts.OUTPUT)
Hanno Böck fix lot's of pylint issues...

Hanno Böck authored 16 years ago

214)                         else:
215)                             if opts.DEBUG:
Hanno Böck format syntax according to...

Hanno Böck authored 7 years ago

216)                                 print("File " + mfile)
217)                             safev = "9999"
Hanno Böck print more intelligent warn...

Hanno Böck authored 16 years ago

218)                             for ver in item['old_safe']:
Hanno Böck format syntax according to...

Hanno Böck authored 7 years ago

219)                                 if(versioncompare(ver.split('.'),
Hanno Böck codingstyle: avoid long lin...

Hanno Böck authored 4 years ago

220)                                    findversion.split('.'))
221)                                    and not versioncompare(ver.split('.'),
Hanno Böck format syntax according to...

Hanno Böck authored 7 years ago

222)                                    safev.split('.'))):
223)                                     safev = ver
224)                             if safev == "9999":
225)                                 safev = item['safe']
226) 
227)                             vulnprint(item['name'], findversion,
228)                                       safev, item['vuln'],
229)                                       mfile, item['subdir'], opts.OUTPUT)
Hanno Böck fix lot's of pylint issues...

Hanno Böck authored 16 years ago

230) 
231)                     else:
232)                         if opts.DEBUG:
Hanno Böck codingstyle: avoid long lin...

Hanno Böck authored 4 years ago

233)                             print("regexp failed for "
234)                                   + item['name'] + " on " + mfile)
Bernd Wurst add XML output format

Bernd Wurst authored 15 years ago

235) 
236) if opts.OUTPUT == 'xml':