关于tomcat弱口令扫描问题,应当注意两点。第一是版本问题。
在tomcat6及6之前,是可以直接暴力破解的。
抓一下tomcat登陆管理界面的数据包,可以看出,其认证方式是在http的请求header中添加一个字段为 Authorization,这个字段的值是 “Basic base64(username:password)”,因此在暴力破解时,只需要在请求包中添加该字段即可。
在tomcat6以后,默认是做了暴力破解的限制的。查看官方文档,对 LockOut Realm - org.apache.catalina.realm.LockOutRealm 类有说明,其中有一个参数为 “failureCount”,文档中对该参数的说明为” The number of times in a row a user has to fail authentication to be locked out. Defaults to 5.”,默认尝试5次失败后,账号被锁定。该参数在配置文件server.xml中默认无配置,在无配置的情况下,默认是5次错误机会。可以显式配置在<Realm>中(该Realm的className必须是org.apache.catalina.realm.LockOutRealm),如下:
failureCount=”3” lockOutTime=”3000”
当尝试5次错误密码后,账号被锁定,即使输入正确密码,也返回401错误,且这个错误和密码输入错误的返回结果是一样的,如下:
因此在编写弱口令扫描插件时,要注意如果尝试次数过多,即使字典中有正确密码,会提示401错误,而且和密码错误的返回结果相同,很容易误认为是脚本的问题。这点要注意。解决办法就是在测试时,将server.xml中添加 failureCount=”999999” lockOutTime=”0”。
第二个要注意的是,密码正确时,不一定返回200,返回403也是密码正确的情况。
从 tomcat的配置文件 tomcat-user.xml 中可以看出,认证所需要的信息有“roles”,”usernmae”,”password”,即,返回200的条件是用户a的用户名、密码正确且有权限访问该功能。role称为角色,如果一个用户是某个角色,则代表它能够访问该角色定义的功能。
在tomcat中,角色一共有manager-gui,manager-script,manager-jmx,manager-status四种,具体解释如下。
当用户真实存在但没有相应角色时,访问对应权限会提示403错误。如下:
因此在编写测试脚本时,要考虑这种情况,返回403错误,也属于密码正确。
第三个要注意的是,在tomcat6及以后的版本,已经取消了默认用户。在tomcat6之前,是存在默认用户的,用户名是admin,密码是空。因此这种情况也要考虑进去。虽然现在使用tomcat5的已经比较少了。如下。由于我的tomcat是docker安装的,这个tomcat5版本官方没有,是下载的别人封装的。因此密码是否为空无法证实。从网上查得为空。如下为默认配置。
代码核心逻辑如下:
headers = {'Authorization': 'Basic %s==' % (base64.b64encode(username + ':' + password))}
try:
r = requests.get(url, headers=headers, timeout=3)
print r.status_code
if r.status_code == 200:
print 'weakpass'
elif r.status_code == 403:
print 'weakpass'
elif r.status_code == 401:
continue
except:
pass