python爬取常见设备默认账号和密码信息 - T00ls.Net

adminsb 2月前 109

最新回复 (1)
  • adminsb 2月前
    0 引用 2
    #/bin/python
    # -*- coding: utf-8 -*-
    import requests
    import bs4

    class DeviceInfo():
        def __init__(self, manufacturer, model, revision, protocol, username, password, level, doc, notes):
            self.Manufacturer = manufacturer
            self.Model = model
            self.Revision = revision
            self.Protocol = protocol
            self.UserName = username
            self.Password = password
            self.Access_Level = level
            self.Doc = doc
            self.Notes = notes
        def __unicode__(self):
            return self.Manufacturer + u'\t' + \
            self.Model + u'\t' + \
            self.Revision + u'\t' + \
            self.Protocol + u'\t' + \
            self.UserName + u'\t' + \
            self.Password + '\t' + \
            self.Access_Level + u'\t' + \
            self.Doc + u'\t' + self.Notes

    def GetContent(method, url, data = None):
        if method == '' or method == None or (method == 'GET' and (data != None and data != '')):
            return None
        req = requests.request(method, url)
        if req.status_code != 200:
            print req.content
            return None
        return req.content

    def ParseVendors(url, text, vendors):
        soup = bs4.BeautifulSoup(text, 'html.parser')
        trs = soup.find_all('tr')
        for tr in trs:
            tds = tr.find_all('td')
            for td in tds:
                href = td.find('a')
                if href == None:
                    continue
                href = url + href['href']
                vendors[td.get_text()] = href

    def ParseField(manufacturer, text):
        soup = bs4.BeautifulSoup(text, 'html.parser')
        trs = soup.find_all('tr')
        lsInfos = []
        model = ''
        revision = ''
        protocol = ''
        username = ''
        password = ''
        level = ''
        doc = ''
        notes = ''
        for tr in trs:
            tds = tr.find_all('td')
            if len(tds) == 2:
                if tds[0].get_text() == 'Version':
                    revision = tds[1].get_text()
                elif tds[0].get_text() == 'Method':
                    protocol = tds[1].get_text()
                elif tds[0].get_text() == 'User ID':
                    username = tds[1].get_text()
                elif tds[0].get_text() == 'Password':
                    password = tds[1].get_text()
                elif tds[0].get_text() == 'Level':
                    level = tds[1].get_text()
                elif tds[0].get_text() == 'Doc':
                    doc = tds[1].get_text()
                elif tds[0].get_text() == 'Notes':
                    notes = tds[1].get_text().replace('\r\n', '\t')
                else:
                    print '[Unkown]: unkown field ' + tds[0].get_text() + '\t' + tds[1].get_text()
            elif len(tds) == 1 and tds[0].find('h3'):
                if model != '':
                    lsInfos.append(DeviceInfo(manufacturer, model, revision, protocol, username, password, level, doc, notes))
                    revision = ''
                    protocol = ''
                    username = ''
                    password = ''
                    level = ''
                    doc = ''
                    notes = ''
                model = tds[0].find('i').get_text()
            else:
                print '[Unkown]: unkown field ' + tds[0].get_text()
        lsInfos.append(DeviceInfo(manufacturer, model, revision, protocol, username, password, level, doc, notes))
        return lsInfos

    def main():
        url = 'https://cirt.net/passwords'
        text = GetContent('GET', url)
        vendors = dict()
        if text != None:
            ParseVendors(url, text, vendors)
            for key, value in vendors.items():
                text = GetContent('GET', value)
                deviceInfos = ParseField(key, text)
                for deviceInfo in deviceInfos:
                    print(u'%s' % (deviceInfo))
            print text
        else:
            print '[ERROR]:craw url content error'

    if __name__ == '__main__':
        main()
返回