Beispiel #1
0
    def save_ip(self, data):
        '''保存ip资产相关的结果
        '''
        ip_app = Ip()
        port_app = Port()
        port_attr_app = PortAttr()
        result = {'ip': len(data), 'port': 0}

        for ip in data:
            # 保存IP
            if 'ip' not in ip:
                continue
            if self.org_id:
                ip['org_id'] = self.org_id
            ip_id = ip_app.save_and_update(ip)
            if ip_id > 0:
                result['port'] += len(ip['port'])
                # 保存每个端口数据
                if 'port' not in ip:
                    continue
                for port in ip['port']:
                    port['ip_id'] = ip_id
                    port_id = port_app.save_and_update(port)
                    if port_id > 0:
                        # 保存端口的属性
                        for attr_key in self.result_attr_keys:
                            if attr_key in port and port[attr_key]:
                                data_port_attr = {
                                    'r_id': port_id, 'source': self.source, 'tag': attr_key, 'content': port[attr_key]}
                                port_attr_app.save_and_update(data_port_attr)

        return result
Beispiel #2
0
def test_port_attr():
    from nemo.core.database.attr import PortAttr
    pa = PortAttr()
    # row_id = pa.add(data={'r_id':2,'source':'scan','tag':'service','content':'nginx'})
    # print(row_id)
    # obj = pa.get(row_id)
    # print(obj)
    print(pa.get(1))
    print(pa.gets(query={'r_id': 2}))
    print(pa.gets(query={'r_id': 2}, fields=('tag', 'content')))
Beispiel #3
0
    def save_ip(self, data):
        '''保存ip资产相关的结果
        '''
        ip_app = Ip()
        port_app = Port()
        port_attr_app = PortAttr()
        result = {'ip': len(data), 'port': 0}

        for ip in data:
            # 保存IP
            if 'ip' not in ip:
                continue
            if self.org_id:
                ip['org_id'] = self.org_id
            ip_id = ip_app.save_and_update(ip)
            if ip_id > 0:
                # 保存每个端口数据
                if 'port' not in ip:
                    continue
                result['port'] += len(ip['port'])
                for port in ip['port']:
                    port['ip_id'] = ip_id
                    try:
                        port_id = port_app.save_and_update(port)
                        if port_id > 0:
                            # 保存端口的属性
                            for attr_key in self.result_attr_keys:
                                if attr_key in port and port[attr_key]:
                                    data_port_attr = {
                                        'r_id': port_id, 'source': self.source, 'tag': attr_key,
                                        'content': port[attr_key][:800]}
                                    try:
                                        port_attr_app.save_and_update(data_port_attr)
                                    except Exception as e:
                                        logger.error(traceback.format_exc())
                                        logger.error('save port port attr:{}-{}-{}-{}'.format(ip['port'], port['port'],
                                                                                            data_port_attr['tag'],
                                                                                            data_port_attr['content']))
                    except Exception as ex:
                        logger.error(traceback.format_exc())
                        logger.error('save ip port:{}-{}'.format(ip['port'], port['port']))
        return result
Beispiel #4
0
    def get_ip_port_info(self, ip, ip_id):
        '''获取IP端口属性,并生成port、title、banner聚合信息
        '''
        port_list = []  # 端口列表
        port_status_dict = {}  # 端口对应的状态字典
        title_set = set()  # 标题聚合
        banner_set = set()  # banner聚合
        ports_attr_info = []  # 每一个端口的详细属性

        ports_obj = Port().gets(query={'ip_id': ip_id})
        for port_obj in ports_obj:
            port_list.append(port_obj['port'])
            if port_obj['status']:
                port_status_dict[str(port_obj['port'])] = port_obj['status']
            # 获取端口属性
            port_attrs_obj = PortAttr().gets(query={'r_id': port_obj['id']})
            FIRST_ROW = True
            # 每个端口的一个属性生成一行记录
            # 第一行记录显示IP和PORT,其它行保持为空(方便查看)
            for port_attr_obj in port_attrs_obj:
                pai = {}
                if FIRST_ROW:
                    pai.update(ip=ip, port=port_obj['port'])
                    FIRST_ROW = False
                else:
                    pai.update(ip='', port='')
                pai.update(
                    id=port_attr_obj['id'],
                    tag=port_attr_obj['tag'],
                    content=port_attr_obj['content'],
                    source=port_attr_obj['source'],
                    update_datetime=port_attr_obj['update_datetime'].strftime(
                        '%Y-%m-%d %H:%M'))
                # 更新集合
                if port_attr_obj['tag'] == 'title':
                    title_set.add(port_attr_obj['content'])
                elif port_attr_obj['tag'] in ('banner', 'tag', 'server'):
                    if port_attr_obj['content'] and port_attr_obj[
                            'content'] != 'unknown':
                        banner_set.add(port_attr_obj['content'])

                ports_attr_info.append(pai)

        return port_list, title_set, banner_set, ports_attr_info, port_status_dict
Beispiel #5
0
def delete_port_attr_view(port_attr_id):
    '''删除一个端口的属性记录
    '''
    rows = PortAttr().delete(port_attr_id)

    return jsonify({'status': 'success', 'msg': rows})