37777f961127bd164d6c3afff7b16a357e26c00f
Hanno Böck Enforce python 3, remove py...

Hanno Böck authored 5 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 remove year so we don't hav...

Hanno Böck authored 5 years ago

7) # Written 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 5 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 re
Hanno Böck argparse instead of depreca...

Hanno Böck authored 5 years ago

31) import argparse
Hanno Böck format syntax according to...

Hanno Böck authored 7 years ago

32) import sys
Bernd Wurst Add XML string escaping

Bernd Wurst authored 16 years ago

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

Hanno Böck authored 17 years ago

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

Hanno Böck authored 7 years ago

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

Hanno Böck authored 16 years ago

36) def versioncompare(safe_version, find_version):
37)     if safe_version == [""]:
38)         return True
39)     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

40)         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

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

Hanno Böck authored 7 years ago

42)         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

43)             return False
Hanno implement some recommendati...

Hanno authored 6 years ago

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

Hanno Böck authored 7 years ago

45) 
Hanno Böck initial commit

Hanno Böck authored 17 years ago

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

Hanno Böck authored 7 years ago

47) def vulnprint(appname, version, safeversion, vuln, vfilename, subdir,
Hanno Böck argparse instead of depreca...

Hanno Böck authored 5 years ago

48)               xml):
Hanno Böck pycodestyle fixes

Hanno Böck authored 7 years ago

49)     appdir = '/'.join(os.path.abspath(vfilename).split('/')[:-1 - subdir])
Hanno Böck argparse instead of depreca...

Hanno Böck authored 5 years ago

50)     if not xml:
Hanno Böck missing space

Hanno Böck authored 7 years ago

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

Hanno Böck authored 7 years ago

52)               "%(appdir)s" % vars())
Hanno Böck argparse instead of depreca...

Hanno Böck authored 5 years ago

53)     else:
Bernd Wurst add XML output format

Bernd Wurst authored 16 years ago

54)         state = 'vulnerable'
55)         if safeversion == 'ok':
56)             state = 'ok'
Hanno Böck format syntax according to...

Hanno Böck authored 7 years ago

57)         print('  <app state="%s">' % state)
58)         print('    <appname>%s</appname>' % escape(appname))
59)         print('    <version>%s</version>' % escape(version))
60)         print('    <directory>%s</directory>' % escape(appdir))
Bernd Wurst add XML output format

Bernd Wurst authored 16 years ago

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

Hanno Böck authored 7 years ago

62)             print('    <safeversion>%s</safeversion>' % escape(safeversion))
63)             print('    <vulninfo>%s</vulninfo>' % escape(vuln))
64)         print('  </app>')
Bernd Wurst add XML output format

Bernd Wurst authored 16 years ago

65) 
Hanno Böck initial commit

Hanno Böck authored 17 years ago

66) 
67) # Command-line options
Hanno Böck argparse instead of depreca...

Hanno Böck authored 5 years ago

68) parser = argparse.ArgumentParser()
69) parser.add_argument("dirs", nargs="*",
70)                     help="Directories to scan")
71) parser.add_argument("-a", "--all", action="store_true",
72)                     help="Show all webapps found, not just vulnerable")
73) parser.add_argument("-x", "--xml", action="store_true",
74)                     help="Output results as XML")
75) parser.add_argument("-3", "--thirdparty", action="store_true",
76)                     help="Scan for third-party components like jquery")
77) opts = parser.parse_args()
Hanno Böck initial commit

Hanno Böck authored 17 years ago

78) 
79) # Parse vulnerability database
Hanno Böck make code compatible with p...

Hanno Böck authored 10 years ago

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

Hanno Böck authored 7 years ago

81) try:
82)     config.read(glob.glob('/usr/share/freewvs/*.freewvs'))
83)     config.read(glob.glob('/usr/local/share/freewvs/*.freewvs'))
Hanno Böck codingstyle: avoid long lin...

Hanno Böck authored 5 years ago

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

Hanno Böck authored 7 years ago

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

Hanno Böck authored 7 years ago

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

Hanno Böck authored 17 years ago

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

Hanno Böck authored 16 years ago

91)     item = {}
92) 
Hanno Böck codingstyle: avoid long lin...

Hanno Böck authored 5 years ago

93)     if (config.getboolean(sect, 'thirdparty', fallback=False)
Hanno Böck argparse instead of depreca...

Hanno Böck authored 5 years ago

94)        and not opts.thirdparty):
Hanno Böck Add possibility to scan for...

Hanno Böck authored 5 years ago

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

Hanno Böck authored 16 years ago

97)     # base options
98)     item['name'] = sect
99)     item['safe'] = config.get(sect, 'safe')
100)     item['file'] = config.get(sect, 'file')
101)     item['vuln'] = config.get(sect, 'vuln')
102)     item['subdir'] = int(config.get(sect, 'subdir'))
103) 
104)     # match magic
Hanno Böck simplify loop logic by usin...

Hanno Böck authored 5 years ago

105)     item['variable'] = re.compile(re.escape(config.get(sect, 'variable'))
Hanno Böck codingstyle

Hanno Böck authored 5 years ago

106)                                   + 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

107) 
108)     # optional options
Hanno Böck format syntax according to...

Hanno Böck authored 7 years ago

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

Hanno Böck authored 16 years ago

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

Hanno Böck authored 7 years ago

113)     if config.has_option(sect, 'extra_nomatch'):
114)         item['extra_nomatch'] = config.get(sect, 'extra_nomatch')
115)     else:
116)         item['extra_nomatch'] = False
Hanno Böck add path_match feature, all...

Hanno Böck authored 5 years ago

117)     if config.has_option(sect, 'path_match'):
118)         item['path_match'] = config.get(sect, 'path_match')
119)     else:
120)         item['path_match'] = False
Hanno Böck format syntax according to...

Hanno Böck authored 7 years ago

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

Hanno Böck authored 16 years ago

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

Hanno Böck authored 7 years ago

125)     if config.has_option(sect, 'old_safe'):
126)         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

127)     else:
128)         item['old_safe'] = []
129) 
130)     vdb.append(item)
Hanno Böck initial commit

Hanno Böck authored 17 years ago

131) 
Hanno Böck argparse instead of depreca...

Hanno Böck authored 5 years ago

132) if opts.xml:
Hanno Böck format syntax according to...

Hanno Böck authored 7 years ago

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

Hanno Böck authored 17 years ago

135) 
136) # start the search
137) 
Hanno Böck argparse instead of depreca...

Hanno Böck authored 5 years ago

138) for fdir in opts.dirs:
Hanno Böck fix lot's of pylint issues...

Hanno Böck authored 16 years ago

139)     for root, NULL, files in os.walk(fdir):
140)         for filename in files:
141)             for item in vdb:
142)                 if filename == item['file']:
143)                     mfile = os.path.join(root, filename)
Bernd Wurst error handling when opening...

Bernd Wurst authored 12 years ago

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

Hanno Böck authored 5 years ago

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

Hanno Böck authored 7 years ago

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

Hanno Böck authored 7 years ago

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

Hanno Böck authored 16 years ago

148)                     filestr = file.read()
149)                     file.close()
150) 
Hanno Böck simplify loop logic by usin...

Hanno Böck authored 5 years ago

151)                     if ((item['extra_match']
152)                        and item['extra_match'] not in filestr)
153)                        or (item['extra_nomatch']
Hanno Böck fix nomatch logic

Hanno Böck authored 5 years ago

154)                        and item['extra_nomatch'] in filestr)
Hanno Böck simplify loop logic by usin...

Hanno Böck authored 5 years ago

155)                        or (item['path_match']
156)                        and not root.endswith(item['path_match']))):
Hanno Böck add path_match feature, all...

Hanno Böck authored 5 years ago

157)                         continue
158) 
Hanno Böck simplify loop logic by usin...

Hanno Böck authored 5 years ago

159)                     findversion = item['variable'].search(filestr)
160)                     if not findversion:
161)                         continue
Hanno Böck codingstyle

Hanno Böck authored 5 years ago

162)                     findversion = findversion.group(1)
Hanno Böck fix lot's of pylint issues...

Hanno Böck authored 16 years ago

163) 
Hanno Böck simplify loop logic by usin...

Hanno Böck authored 5 years ago

164)                     # Very ugly phpbb workaround
165)                     if item['add_minor']:
166)                         findversion = findversion.split('.')
167)                         findversion[-1] = str(int(findversion[-1])
168)                                               + int(item['add_minor']))
Hanno Böck fix lot's of pylint issues...

Hanno Böck authored 16 years ago

169)                         findversion = '.'.join(findversion)
170) 
Hanno Böck simplify loop logic by usin...

Hanno Böck authored 5 years ago

171)                     if not (versioncompare(item['safe'].split('.'),
172)                             findversion.split('.'))) or \
173)                             item['old_safe'].count(findversion) > 0:
Hanno Böck argparse instead of depreca...

Hanno Böck authored 5 years ago

174)                         if opts.all:
Hanno Böck format syntax according to...

Hanno Böck authored 7 years ago

175)                             vulnprint(item['name'], findversion,
Hanno Böck simplify loop logic by usin...

Hanno Böck authored 5 years ago

176)                                       "ok", "", mfile, item['subdir'],
Hanno Böck argparse instead of depreca...

Hanno Böck authored 5 years ago

177)                                       opts.xml)
Hanno Böck fix lot's of pylint issues...

Hanno Böck authored 16 years ago

178)                     else:
Hanno Böck simplify loop logic by usin...

Hanno Böck authored 5 years ago

179)                         safev = "9999"
180)                         for ver in item['old_safe']:
181)                             if(versioncompare(ver.split('.'),
182)                                findversion.split('.'))
183)                                and not versioncompare(ver.split('.'),
184)                                safev.split('.'))):
185)                                 safev = ver
186)                         if safev == "9999":
187)                             safev = item['safe']
188) 
189)                         vulnprint(item['name'], findversion,
190)                                   safev, item['vuln'],
Hanno Böck argparse instead of depreca...

Hanno Böck authored 5 years ago

191)                                   mfile, item['subdir'], opts.xml)
Bernd Wurst add XML output format

Bernd Wurst authored 16 years ago

192) 
Hanno Böck argparse instead of depreca...

Hanno Böck authored 5 years ago

193) if opts.xml: